Skip to content

TypeScript SDK: Use generated types for model info and remove duplicates#1564

Draft
sergiou87 wants to merge 1 commit into
github:mainfrom
sergiou87:ts-use-generated-model-info
Draft

TypeScript SDK: Use generated types for model info and remove duplicates#1564
sergiou87 wants to merge 1 commit into
github:mainfrom
sergiou87:ts-use-generated-model-info

Conversation

@sergiou87
Copy link
Copy Markdown
Member

@sergiou87 sergiou87 commented Jun 3, 2026

Replace local duplicate model info types (which need to be manually updated) with types from generated files.

I tried this approach since I see the same pattern used for SessionEvent and RemoteSessionMode:

import type {
ReasoningSummary,
SessionEvent as GeneratedSessionEvent,
} from "./generated/session-events.js";
import type { CopilotSession } from "./session.js";
import type { RemoteSessionMode } from "./generated/rpc.js";
import type { OpenCanvasInstance } from "./generated/rpc.js";
import type { ToolSet } from "./toolSet.js";
export type { RemoteSessionMode } from "./generated/rpc.js";
export type SessionEvent = GeneratedSessionEvent;

According to Copilot, these are the effective changes in the API if we decided to go ahead with this approach:

Main breaking changes: generated ModelCapabilities makes supports, limits, and several nested fields optional; generated ModelPolicy makes terms optional; generated Model widens reasoning effort fields from ReasoningEffort to string.

ModelInfo

Now exported as generated Model aliased to ModelInfo.

Attribute name Before After Comment
Type declaration interface ModelInfo Model re-exported as ModelInfo Structural API preserved, but symbol kind/name changed. Potentially breaking for declaration merging or tools expecting an interface literally named ModelInfo.
id string string No change.
name string string No change.
capabilities ModelCapabilities ModelCapabilities Same top-level name, but nested shape changed. See ModelCapabilities.
policy ModelPolicy | undefined ModelPolicy | undefined Same optional field, but ModelPolicy.terms changed.
billing ModelBilling | undefined ModelBilling | undefined Same optional field, but ModelBilling now has optional tokenPrices.
supportedReasoningEfforts ReasoningEffort[] | undefined string[] | undefined Breaking/type precision loss for consumers reading this as ReasoningEffort[]; now must validate or narrow strings manually.
defaultReasoningEffort ReasoningEffort | undefined string | undefined Breaking/type precision loss for consumers assigning directly to ReasoningEffort.
modelPickerCategory Not present ModelPickerCategory | undefined Additive optional generated field.
modelPickerPriceCategory Not present ModelPickerPriceCategory | undefined Additive optional generated field.

ModelCapabilities

Attribute name Before After Comment
supports { vision: boolean; reasoningEffort: boolean } ModelCapabilitiesSupports | undefined Breaking for readers: capabilities.supports can now be absent. More permissive for providers.
supports.vision boolean boolean | undefined Breaking for readers: guard/default needed.
supports.reasoningEffort boolean boolean | undefined Breaking for readers: guard/default needed.
limits { max_prompt_tokens?: number; max_context_window_tokens: number; vision?: ... } ModelCapabilitiesLimits | undefined Breaking for readers: capabilities.limits can now be absent.
limits.max_prompt_tokens number | undefined number | undefined Same field optionality, ignoring optional parent.
limits.max_context_window_tokens number number | undefined Breaking for readers: previously guaranteed.
limits.max_output_tokens Not present number | undefined Additive optional generated field.
limits.vision Vision limits object or undefined ModelCapabilitiesLimitsVision | undefined Same optional field, now named generated type.
limits.vision.supported_media_types string[] string[] No change once vision exists.
limits.vision.max_prompt_images number number No change once vision exists.
limits.vision.max_prompt_image_size number number No change once vision exists.

ModelPolicy

Attribute name Before After Comment
state "enabled" | "disabled" | "unconfigured" ModelPolicyState Same union values, now named generated alias.
terms string string | undefined Breaking for readers: callers can no longer assume terms exists. More permissive for model providers.

ModelBilling

Attribute name Before After Comment
multiplier number | undefined number | undefined No change.
tokenPrices Not present ModelBillingTokenPrices | undefined Additive optional generated field. Previously excess property for object literals typed as ModelBilling; now accepted.

ModelBillingTokenPrices

New generated nested type reachable through ModelBilling.tokenPrices.

Attribute name Before After Comment
inputPrice Not present number | undefined Additive optional field.
outputPrice Not present number | undefined Additive optional field.
cachePrice Not present number | undefined Additive optional field.
batchSize Not present number | undefined Additive optional field.
contextMax Not present number | undefined Additive optional field.
longContext Not present ModelBillingTokenPricesLongContext | undefined Additive optional nested field.

ModelBillingTokenPricesLongContext

New generated nested type reachable through ModelBilling.tokenPrices.longContext.

Attribute name Before After Comment
inputPrice Not present number | undefined Additive optional field.
outputPrice Not present number | undefined Additive optional field.
cachePrice Not present number | undefined Additive optional field.
contextMax Not present number | undefined Additive optional field.

ModelCapabilitiesOverride

Not removed, but its expansion changes because it is still DeepPartial<ModelCapabilities> and ModelCapabilities now comes from generated RPC types.

Attribute name Before After Comment
supports.vision boolean | undefined boolean | undefined No effective change.
supports.reasoningEffort boolean | undefined boolean | undefined No effective change.
limits.max_prompt_tokens number | undefined number | undefined No effective change.
limits.max_context_window_tokens number | undefined number | undefined No effective change because old type was already deep-partial.
limits.max_output_tokens Not present number | undefined Additive optional override.
limits.vision.supported_media_types string[] | undefined string[] | undefined No effective change.
limits.vision.max_prompt_images number | undefined number | undefined No effective change.
limits.vision.max_prompt_image_size number | undefined number | undefined No effective change.

Replace local duplicate model/session types with imports/exported types from generated files. Reorder imports, re-export model, remote session and session-fs related types, and export SessionEvent. Remove redundant local interfaces (ModelCapabilities, ModelInfo, ModelPolicy, ModelBilling) to centralize type definitions in generated/rpc and generated/session-events.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant