Răsfoiți Sursa

fix(core): default custom model capabilities (#38449)

Co-authored-by: Aiden Cline <rekram1-node@users.noreply.github.com>
opencode-agent[bot] 3 săptămâni în urmă
părinte
comite
b6f85c2250
32 a modificat fișierele cu 235 adăugiri și 153 ștergeri
  1. 1 1
      packages/core/src/catalog.ts
  2. 1 1
      packages/core/src/github-copilot/models.ts
  3. 1 1
      packages/core/test/aisdk.test.ts
  4. 80 0
      packages/core/test/config/provider.test.ts
  5. 1 1
      packages/core/test/generate.test.ts
  6. 2 2
      packages/core/test/github-copilot/models.test.ts
  7. 21 21
      packages/core/test/plugin/provider-amazon-bedrock.test.ts
  8. 2 2
      packages/core/test/plugin/provider-anthropic.test.ts
  9. 6 6
      packages/core/test/plugin/provider-azure-cognitive-services.test.ts
  10. 9 9
      packages/core/test/plugin/provider-azure.test.ts
  11. 3 3
      packages/core/test/plugin/provider-cerebras.test.ts
  12. 11 11
      packages/core/test/plugin/provider-cloudflare-ai-gateway.test.ts
  13. 6 6
      packages/core/test/plugin/provider-cloudflare-workers-ai.test.ts
  14. 8 8
      packages/core/test/plugin/provider-dynamic.test.ts
  15. 1 1
      packages/core/test/plugin/provider-factory.test.ts
  16. 15 15
      packages/core/test/plugin/provider-github-copilot.test.ts
  17. 8 8
      packages/core/test/plugin/provider-gitlab.test.ts
  18. 8 8
      packages/core/test/plugin/provider-google-vertex-anthropic.test.ts
  19. 4 4
      packages/core/test/plugin/provider-google-vertex.test.ts
  20. 4 4
      packages/core/test/plugin/provider-google.test.ts
  21. 5 5
      packages/core/test/plugin/provider-openai-compatible.test.ts
  22. 4 4
      packages/core/test/plugin/provider-openai.test.ts
  23. 7 7
      packages/core/test/plugin/provider-opencode.test.ts
  24. 2 2
      packages/core/test/plugin/provider-openrouter.test.ts
  25. 1 1
      packages/core/test/plugin/provider-sap-ai-core.test.ts
  26. 6 6
      packages/core/test/plugin/provider-snowflake-cortex.test.ts
  27. 1 1
      packages/core/test/plugin/provider-vercel.test.ts
  28. 5 5
      packages/core/test/plugin/provider-xai.test.ts
  29. 2 2
      packages/core/test/shared-schema.test.ts
  30. 7 5
      packages/docs/models.mdx
  31. 2 2
      packages/schema/src/model.ts
  32. 1 1
      packages/schema/test/contract-hygiene.test.ts

+ 1 - 1
packages/core/src/catalog.ts

@@ -116,7 +116,7 @@ const layer = Layer.effect(
                 draft.providers.set(providerID, record)
               }
               const model =
-                record.models.get(modelID) ?? (ModelV2.Info.empty(providerID, modelID) as ModelV2.MutableInfo)
+                record.models.get(modelID) ?? (ModelV2.Info.default(providerID, modelID) as ModelV2.MutableInfo)
               if (!record.models.has(modelID)) record.models.set(modelID, model)
               fn(model)
               model.id = modelID

+ 1 - 1
packages/core/src/github-copilot/models.ts

@@ -135,7 +135,7 @@ function build(id: ModelV2.ID, remote: UsableModel, baseURL: string, previous?:
   const released = previous?.time.released || Date.parse(version)
 
   return ModelV2.Info.make({
-    ...ModelV2.Info.empty(ProviderV2.ID.githubCopilot, id),
+    ...ModelV2.Info.default(ProviderV2.ID.githubCopilot, id),
     id,
     modelID: ModelV2.ID.make(remote.id),
     providerID: ProviderV2.ID.githubCopilot,

+ 1 - 1
packages/core/test/aisdk.test.ts

@@ -12,7 +12,7 @@ const it = testEffect(AISDK.locationLayer)
 
 const model = (packageName: string, settings: Record<string, unknown> = {}) =>
   ModelV2.Info.make({
-    ...ModelV2.Info.empty(ProviderV2.ID.make("test-provider"), ModelV2.ID.make("catalog-model")),
+    ...ModelV2.Info.default(ProviderV2.ID.make("test-provider"), ModelV2.ID.make("catalog-model")),
     modelID: ModelV2.ID.make("api-model"),
     package: ProviderV2.aisdk(packageName),
     settings,

+ 80 - 0
packages/core/test/config/provider.test.ts

@@ -49,6 +49,86 @@ function withEnv<A, E, R>(vars: Record<string, string | undefined>, effect: () =
 const decode = Schema.decodeUnknownSync(Config.Info)
 
 describe("ConfigProviderPlugin.Plugin", () => {
+  it.effect("defaults custom models to agent capabilities", () =>
+    Effect.gen(function* () {
+      const catalog = yield* Catalog.Service
+      const providerID = ProviderV2.ID.make("custom")
+      const modelID = ModelV2.ID.make("chat")
+      const config = Config.Service.of({
+        entries: () =>
+          Effect.succeed([
+            new Config.Document({
+              type: "document",
+              info: decode({
+                providers: {
+                  custom: {
+                    package: "aisdk:@ai-sdk/openai-compatible",
+                    models: { chat: {} },
+                  },
+                },
+              }),
+            }),
+          ]),
+      })
+
+      yield* addPlugin(config)
+
+      const model = required(yield* catalog.model.get(providerID, modelID))
+      expect(model.capabilities).toEqual({ tools: true, input: ["text", "image"], output: ["text"] })
+    }),
+  )
+
+  it.effect("preserves catalog capabilities unless config overrides them", () =>
+    Effect.gen(function* () {
+      const catalog = yield* Catalog.Service
+      const providerID = ProviderV2.ID.make("custom")
+      const inheritedID = ModelV2.ID.make("inherited")
+      const overriddenID = ModelV2.ID.make("overridden")
+      yield* catalog.transform((draft) => {
+        draft.model.update(providerID, inheritedID, (model) => {
+          model.capabilities = { tools: false, input: ["text"], output: ["text"] }
+        })
+        draft.model.update(providerID, overriddenID, (model) => {
+          model.capabilities = { tools: false, input: ["text"], output: ["text"] }
+        })
+      })
+      const config = Config.Service.of({
+        entries: () =>
+          Effect.succeed([
+            new Config.Document({
+              type: "document",
+              info: decode({
+                providers: {
+                  custom: {
+                    package: "aisdk:@ai-sdk/openai-compatible",
+                    models: {
+                      inherited: { name: "Inherited" },
+                      overridden: {
+                        capabilities: { tools: true, input: ["text", "image"], output: ["text"] },
+                      },
+                    },
+                  },
+                },
+              }),
+            }),
+          ]),
+      })
+
+      yield* addPlugin(config)
+
+      expect((yield* catalog.model.get(providerID, inheritedID))?.capabilities).toEqual({
+        tools: false,
+        input: ["text"],
+        output: ["text"],
+      })
+      expect((yield* catalog.model.get(providerID, overriddenID))?.capabilities).toEqual({
+        tools: true,
+        input: ["text", "image"],
+        output: ["text"],
+      })
+    }),
+  )
+
   it.effect("keeps configured model variant bodies unchanged", () =>
     Effect.gen(function* () {
       const catalog = yield* Catalog.Service

+ 1 - 1
packages/core/test/generate.test.ts

@@ -13,7 +13,7 @@ import { Effect, Layer, Stream } from "effect"
 import { testEffect } from "./lib/effect"
 
 const selected = ModelV2.Info.make({
-  ...ModelV2.Info.empty(ProviderV2.ID.make("test-provider"), ModelV2.ID.make("gemini")),
+  ...ModelV2.Info.default(ProviderV2.ID.make("test-provider"), ModelV2.ID.make("gemini")),
   package: ProviderV2.aisdk("@ai-sdk/google"),
 })
 const runtime = Model.make({ id: "gemini", provider: "test-provider", route: OpenAIChat.route })

+ 2 - 2
packages/core/test/github-copilot/models.test.ts

@@ -49,12 +49,12 @@ test("defensively syncs advertised Copilot models", async () => {
 
   try {
     const existing = ModelV2.Info.make({
-      ...ModelV2.Info.empty(ProviderV2.ID.githubCopilot, ModelV2.ID.make("gpt-5")),
+      ...ModelV2.Info.default(ProviderV2.ID.githubCopilot, ModelV2.ID.make("gpt-5")),
       modelID: ModelV2.ID.make("gpt-5"),
       name: "GPT-5 local",
     })
     const stale = ModelV2.Info.make({
-      ...ModelV2.Info.empty(ProviderV2.ID.githubCopilot, ModelV2.ID.make("stale")),
+      ...ModelV2.Info.default(ProviderV2.ID.githubCopilot, ModelV2.ID.make("stale")),
       modelID: ModelV2.ID.make("stale"),
     })
     const models = await CopilotModels.get(server.url.origin, {}, [existing, stale])

+ 21 - 21
packages/core/test/plugin/provider-amazon-bedrock.test.ts

@@ -108,7 +108,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
             modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -134,7 +134,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
             modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -169,7 +169,7 @@ describe("AmazonBedrockPlugin", () => {
           yield* addPlugin()
           const result = yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+              ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
               modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
               package: ProviderV2.aisdk("test-provider"),
             }),
@@ -190,7 +190,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
             modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -210,7 +210,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
             modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -230,7 +230,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
             modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -251,7 +251,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
             modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -281,7 +281,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
             modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -310,7 +310,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("openai.gpt-5.5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("openai.gpt-5.5")),
             modelID: ModelV2.ID.make("openai.gpt-5.5"),
             package: ProviderV2.aisdk("@ai-sdk/amazon-bedrock/mantle"),
           }),
@@ -338,7 +338,7 @@ describe("AmazonBedrockPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("openai.gpt-5.5")),
+          ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("openai.gpt-5.5")),
           modelID: ModelV2.ID.make("openai.gpt-5.5"),
           package: ProviderV2.aisdk("@ai-sdk/amazon-bedrock/mantle"),
         }),
@@ -347,7 +347,7 @@ describe("AmazonBedrockPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("openai.gpt-oss-safeguard-120b")),
+          ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("openai.gpt-oss-safeguard-120b")),
           modelID: ModelV2.ID.make("openai.gpt-oss-safeguard-120b"),
           package: ProviderV2.aisdk("@ai-sdk/amazon-bedrock/mantle"),
         }),
@@ -365,7 +365,7 @@ describe("AmazonBedrockPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
           package: ProviderV2.aisdk("@ai-sdk/amazon-bedrock/anthropic"),
         }),
@@ -393,7 +393,7 @@ describe("AmazonBedrockPlugin", () => {
           yield* addPlugin()
           const result = yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+              ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
               modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
               package: ProviderV2.aisdk("test-provider"),
             }),
@@ -425,7 +425,7 @@ describe("AmazonBedrockPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -434,7 +434,7 @@ describe("AmazonBedrockPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -443,7 +443,7 @@ describe("AmazonBedrockPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("global.anthropic.claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("global.anthropic.claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("global.anthropic.claude-sonnet-4-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -452,7 +452,7 @@ describe("AmazonBedrockPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -461,7 +461,7 @@ describe("AmazonBedrockPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -487,7 +487,7 @@ describe("AmazonBedrockPlugin", () => {
         yield* addPlugin()
         yield* aisdk.runLanguage({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
             modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -574,7 +574,7 @@ describe("AmazonBedrockPlugin", () => {
       for (const item of cases) {
         yield* aisdk.runLanguage({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.amazonBedrock, ModelV2.ID.make(item.modelID)),
+            ...ModelV2.Info.default(ProviderV2.ID.amazonBedrock, ModelV2.ID.make(item.modelID)),
             modelID: ModelV2.ID.make(item.modelID),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -594,7 +594,7 @@ describe("AmazonBedrockPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.openai, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.openai, ModelV2.ID.make("anthropic.claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("anthropic.claude-sonnet-4-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),

+ 2 - 2
packages/core/test/plugin/provider-anthropic.test.ts

@@ -63,7 +63,7 @@ describe("AnthropicPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-anthropic"), ModelV2.ID.make("claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-anthropic"), ModelV2.ID.make("claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("claude-sonnet-4-5"),
           package: ProviderV2.aisdk("@ai-sdk/anthropic"),
         }),
@@ -81,7 +81,7 @@ describe("AnthropicPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.anthropic, ModelV2.ID.make("claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.anthropic, ModelV2.ID.make("claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("claude-sonnet-4-5"),
           package: ProviderV2.aisdk("@ai-sdk/anthropic"),
         }),

+ 6 - 6
packages/core/test/plugin/provider-azure-cognitive-services.test.ts

@@ -121,7 +121,7 @@ describe("AzureCognitiveServicesPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("deployment")),
           modelID: ModelV2.ID.make("deployment"),
           package: "aisdk:test-provider",
         }),
@@ -140,7 +140,7 @@ describe("AzureCognitiveServicesPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("deployment")),
           modelID: ModelV2.ID.make("deployment"),
           package: "aisdk:test-provider",
         }),
@@ -149,7 +149,7 @@ describe("AzureCognitiveServicesPlugin", () => {
       })
       const ignored = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.openai, ModelV2.ID.make("deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.openai, ModelV2.ID.make("deployment")),
           modelID: ModelV2.ID.make("deployment"),
           package: "aisdk:test-provider",
         }),
@@ -170,7 +170,7 @@ describe("AzureCognitiveServicesPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("messages-deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("messages-deployment")),
           modelID: ModelV2.ID.make("messages-deployment"),
           package: "aisdk:test-provider",
         }),
@@ -179,7 +179,7 @@ describe("AzureCognitiveServicesPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("chat-deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("chat-deployment")),
           modelID: ModelV2.ID.make("chat-deployment"),
           package: "aisdk:test-provider",
         }),
@@ -188,7 +188,7 @@ describe("AzureCognitiveServicesPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("language-deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("azure-cognitive-services"), ModelV2.ID.make("language-deployment")),
           modelID: ModelV2.ID.make("language-deployment"),
           package: "aisdk:test-provider",
         }),

+ 9 - 9
packages/core/test/plugin/provider-azure.test.ts

@@ -148,7 +148,7 @@ describe("AzurePlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
+            ...ModelV2.Info.default(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
             modelID: ModelV2.ID.make("deployment"),
             package: ProviderV2.aisdk("test-provider"),
           }),
@@ -168,7 +168,7 @@ describe("AzurePlugin", () => {
         const exit = yield* aisdk
           .runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
+              ...ModelV2.Info.default(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
               modelID: ModelV2.ID.make("deployment"),
               package: ProviderV2.aisdk("test-provider"),
             }),
@@ -189,7 +189,7 @@ describe("AzurePlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
           modelID: ModelV2.ID.make("deployment"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -208,7 +208,7 @@ describe("AzurePlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
           modelID: ModelV2.ID.make("deployment"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -227,7 +227,7 @@ describe("AzurePlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
           modelID: ModelV2.ID.make("deployment"),
           package: ProviderV2.aisdk("test-provider"),
           body: { useCompletionUrls: true },
@@ -247,7 +247,7 @@ describe("AzurePlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.azure, ModelV2.ID.make("deployment")),
           modelID: ModelV2.ID.make("deployment"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -256,7 +256,7 @@ describe("AzurePlugin", () => {
       })
       const ignored = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.openai, ModelV2.ID.make("deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.openai, ModelV2.ID.make("deployment")),
           modelID: ModelV2.ID.make("deployment"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -280,7 +280,7 @@ describe("AzurePlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.azure, ModelV2.ID.make("messages-deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.azure, ModelV2.ID.make("messages-deployment")),
           modelID: ModelV2.ID.make("messages-deployment"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -289,7 +289,7 @@ describe("AzurePlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.azure, ModelV2.ID.make("language-deployment")),
+          ...ModelV2.Info.default(ProviderV2.ID.azure, ModelV2.ID.make("language-deployment")),
           modelID: ModelV2.ID.make("language-deployment"),
           package: ProviderV2.aisdk("test-provider"),
         }),

+ 3 - 3
packages/core/test/plugin/provider-cerebras.test.ts

@@ -65,7 +65,7 @@ describe("CerebrasPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(
+          ...ModelV2.Info.default(
             ProviderV2.ID.make("custom-cerebras"),
             ModelV2.ID.make("llama-4-scout-17b-16e-instruct"),
           ),
@@ -88,7 +88,7 @@ describe("CerebrasPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(
+          ...ModelV2.Info.default(
             ProviderV2.ID.make("custom-cerebras"),
             ModelV2.ID.make("llama-4-scout-17b-16e-instruct"),
           ),
@@ -110,7 +110,7 @@ describe("CerebrasPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(
+          ...ModelV2.Info.default(
             ProviderV2.ID.make("custom-cerebras"),
             ModelV2.ID.make("llama-4-scout-17b-16e-instruct"),
           ),

+ 11 - 11
packages/core/test/plugin/provider-cloudflare-ai-gateway.test.ts

@@ -117,7 +117,7 @@ describe("CloudflareAIGatewayPlugin", () => {
           yield* addPlugin()
           const result = yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
               modelID: ModelV2.ID.make("openai/gpt-5"),
               package: "aisdk:test-provider",
             }),
@@ -139,7 +139,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
         yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
             modelID: ModelV2.ID.make("openai/gpt-5"),
             package: "aisdk:test-provider",
           }),
@@ -184,7 +184,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
         yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
             modelID: ModelV2.ID.make("openai/gpt-5"),
             package: "aisdk:test-provider",
           }),
@@ -214,7 +214,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
         yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
             modelID: ModelV2.ID.make("openai/gpt-5"),
             package: "aisdk:test-provider",
           }),
@@ -252,7 +252,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
           yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
               modelID: ModelV2.ID.make("openai/gpt-5"),
               package: "aisdk:test-provider",
             }),
@@ -284,7 +284,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
         yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
             modelID: ModelV2.ID.make("openai/gpt-5"),
             package: "aisdk:test-provider",
           }),
@@ -307,7 +307,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
             modelID: ModelV2.ID.make("openai/gpt-5"),
             package: "aisdk:test-provider",
           }),
@@ -331,7 +331,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
             modelID: ModelV2.ID.make("openai/gpt-5"),
             package: "aisdk:test-provider",
           }),
@@ -361,7 +361,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
           const result = yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
               modelID: ModelV2.ID.make("openai/gpt-5"),
               package: "aisdk:test-provider",
             }),
@@ -385,7 +385,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(
+            ...ModelV2.Info.default(
               ProviderV2.ID.make("cloudflare-ai-gateway"),
               ModelV2.ID.make("anthropic/claude-sonnet-4-5"),
             ),
@@ -417,7 +417,7 @@ describe("CloudflareAIGatewayPlugin", () => {
 
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-ai-gateway"), ModelV2.ID.make("openai/gpt-5")),
             modelID: ModelV2.ID.make("openai/gpt-5"),
             package: "aisdk:test-provider",
           }),

+ 6 - 6
packages/core/test/plugin/provider-cloudflare-workers-ai.test.ts

@@ -94,7 +94,7 @@ describe("CloudflareWorkersAIPlugin", () => {
         const provider = required(yield* catalog.provider.get(ProviderV2.ID.make("cloudflare-workers-ai")))
         const sdk = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
             modelID: ModelV2.ID.make("@cf/model"),
             package: provider.package,
             settings: provider.settings,
@@ -138,7 +138,7 @@ describe("CloudflareWorkersAIPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
             modelID: ModelV2.ID.make("@cf/model"),
             package: "aisdk:@ai-sdk/openai-compatible",
             settings: { baseURL: "https://proxy.example/v1" },
@@ -178,7 +178,7 @@ describe("CloudflareWorkersAIPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
             modelID: ModelV2.ID.make("@cf/model"),
             package: "aisdk:@ai-sdk/openai-compatible",
             settings: { baseURL: "https://proxy.example/v1" },
@@ -207,7 +207,7 @@ describe("CloudflareWorkersAIPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
             modelID: ModelV2.ID.make("@cf/model"),
             package: "aisdk:@ai-sdk/openai-compatible",
             settings: { baseURL: "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1" },
@@ -233,7 +233,7 @@ describe("CloudflareWorkersAIPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("alias")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("alias")),
           modelID: ModelV2.ID.make("@cf/api-model"),
           package: "aisdk:test-provider",
         }),
@@ -253,7 +253,7 @@ describe("CloudflareWorkersAIPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("@cf/model")),
             modelID: ModelV2.ID.make("@cf/model"),
             package: "aisdk:@ai-sdk/anthropic",
             settings: { baseURL: "https://proxy.example/v1" },

+ 8 - 8
packages/core/test/plugin/provider-dynamic.test.ts

@@ -53,7 +53,7 @@ describe("DynamicProviderPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("test-model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom"), ModelV2.ID.make("test-model")),
           modelID: ModelV2.ID.make("test-model"),
           package: ProviderV2.aisdk(fixtureProvider),
         }),
@@ -72,7 +72,7 @@ describe("DynamicProviderPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("test-model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom"), ModelV2.ID.make("test-model")),
           modelID: ModelV2.ID.make("test-model"),
           package: ProviderV2.aisdk(fixtureProvider),
         }),
@@ -90,7 +90,7 @@ describe("DynamicProviderPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-provider"), ModelV2.ID.make("test-model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-provider"), ModelV2.ID.make("test-model")),
           modelID: ModelV2.ID.make("test-model"),
           package: ProviderV2.aisdk(fixtureProvider),
         }),
@@ -107,7 +107,7 @@ describe("DynamicProviderPlugin", () => {
       yield* addPlugin(npmEntrypoint(fixtureProviderPath))
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("npm-provider"), ModelV2.ID.make("test-model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("npm-provider"), ModelV2.ID.make("test-model")),
           modelID: ModelV2.ID.make("test-model"),
           package: "aisdk:fixture-provider",
         }),
@@ -125,7 +125,7 @@ describe("DynamicProviderPlugin", () => {
       const exit = yield* aisdk
         .language(
           ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("missing-entrypoint"), ModelV2.ID.make("alias")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("missing-entrypoint"), ModelV2.ID.make("alias")),
             modelID: ModelV2.ID.make("alias"),
             package: "aisdk:fixture-provider",
           }),
@@ -143,7 +143,7 @@ describe("DynamicProviderPlugin", () => {
       const exit = yield* aisdk
         .language(
           ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("bad-import"), ModelV2.ID.make("alias")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("bad-import"), ModelV2.ID.make("alias")),
             modelID: ModelV2.ID.make("alias"),
             package: "aisdk:file:///missing/provider-factory.js",
           }),
@@ -163,7 +163,7 @@ describe("DynamicProviderPlugin", () => {
       const exit = yield* aisdk
         .language(
           ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("missing-factory"), ModelV2.ID.make("alias")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("missing-factory"), ModelV2.ID.make("alias")),
             modelID: ModelV2.ID.make("alias"),
             package: "aisdk:fixture-provider",
           }),
@@ -181,7 +181,7 @@ describe("DynamicProviderPlugin", () => {
       yield* addPlugin()
       const language = yield* aisdk.language(
         ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("alias")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom"), ModelV2.ID.make("alias")),
           modelID: ModelV2.ID.make("test-model-api"),
           package: ProviderV2.aisdk(fixtureProvider),
         }),

+ 1 - 1
packages/core/test/plugin/provider-factory.test.ts

@@ -41,7 +41,7 @@ providers.forEach((item) =>
       const host = yield* PluginHost.make(plugin)
       yield* item.plugin.effect(host)
       const model = ModelV2.Info.make({
-        ...ModelV2.Info.empty(ProviderV2.ID.make(item.id), modelID),
+        ...ModelV2.Info.default(ProviderV2.ID.make(item.id), modelID),
         modelID,
         package: ProviderV2.aisdk(item.package),
       })

+ 15 - 15
packages/core/test/plugin/provider-github-copilot.test.ts

@@ -99,7 +99,7 @@ describe("GithubCopilotPlugin", () => {
       yield* addPlugin()
       const ignored = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: "aisdk:test-provider",
         }),
@@ -108,7 +108,7 @@ describe("GithubCopilotPlugin", () => {
       })
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: "aisdk:test-provider",
         }),
@@ -128,7 +128,7 @@ describe("GithubCopilotPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("claude-sonnet-4")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("claude-sonnet-4")),
           modelID: ModelV2.ID.make("claude-sonnet-4"),
           package: "aisdk:test-provider",
         }),
@@ -147,7 +147,7 @@ describe("GithubCopilotPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("alias")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("alias")),
           modelID: ModelV2.ID.make("claude-sonnet-4"),
           package: "aisdk:test-provider",
         }),
@@ -166,7 +166,7 @@ describe("GithubCopilotPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: "aisdk:test-provider",
         }),
@@ -175,7 +175,7 @@ describe("GithubCopilotPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5.1-codex")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5.1-codex")),
           modelID: ModelV2.ID.make("gpt-5.1-codex"),
           package: "aisdk:test-provider",
         }),
@@ -184,7 +184,7 @@ describe("GithubCopilotPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-4o")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-4o")),
           modelID: ModelV2.ID.make("gpt-4o"),
           package: "aisdk:test-provider",
         }),
@@ -193,7 +193,7 @@ describe("GithubCopilotPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5-mini")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5-mini")),
           modelID: ModelV2.ID.make("gpt-5-mini"),
           package: "aisdk:test-provider",
         }),
@@ -202,7 +202,7 @@ describe("GithubCopilotPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5-mini-2025-08-07")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5-mini-2025-08-07")),
           modelID: ModelV2.ID.make("gpt-5-mini-2025-08-07"),
           package: "aisdk:test-provider",
         }),
@@ -227,7 +227,7 @@ describe("GithubCopilotPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("mai-code-1-flash-picker")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("mai-code-1-flash-picker")),
           modelID: ModelV2.ID.make("mai-code-1-flash-picker"),
           package: "aisdk:test-provider",
           settings: { endpoint: "responses" },
@@ -237,7 +237,7 @@ describe("GithubCopilotPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("gpt-5")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: "aisdk:test-provider",
           settings: { endpoint: "chat" },
@@ -257,7 +257,7 @@ describe("GithubCopilotPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("default")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("default")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: "aisdk:test-provider",
         }),
@@ -266,7 +266,7 @@ describe("GithubCopilotPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("small")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("small")),
           modelID: ModelV2.ID.make("gpt-5-mini"),
           package: "aisdk:test-provider",
         }),
@@ -275,7 +275,7 @@ describe("GithubCopilotPlugin", () => {
       })
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("sonnet")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("github-copilot"), ModelV2.ID.make("sonnet")),
           modelID: ModelV2.ID.make("claude-sonnet-4"),
           package: "aisdk:test-provider",
         }),
@@ -324,7 +324,7 @@ describe("GithubCopilotPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("openai"), ModelV2.ID.make("gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("openai"), ModelV2.ID.make("gpt-5")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: "aisdk:test-provider",
         }),

+ 8 - 8
packages/core/test/plugin/provider-gitlab.test.ts

@@ -69,7 +69,7 @@ describe("GitLabPlugin", () => {
           yield* addPlugin()
           yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
               modelID: ModelV2.ID.make("claude"),
               package: "aisdk:test-provider",
             }),
@@ -107,7 +107,7 @@ describe("GitLabPlugin", () => {
           yield* addPlugin()
           yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
               modelID: ModelV2.ID.make("claude"),
               package: "aisdk:test-provider",
             }),
@@ -133,7 +133,7 @@ describe("GitLabPlugin", () => {
           yield* addPlugin()
           yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
               modelID: ModelV2.ID.make("claude"),
               package: "aisdk:test-provider",
             }),
@@ -175,7 +175,7 @@ describe("GitLabPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
           modelID: ModelV2.ID.make("claude"),
           package: "aisdk:test-provider",
         }),
@@ -195,7 +195,7 @@ describe("GitLabPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("duo-workflow-custom")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("duo-workflow-custom")),
           modelID: ModelV2.ID.make("duo-workflow-custom"),
           package: "aisdk:test-provider",
           headers: {},
@@ -229,7 +229,7 @@ describe("GitLabPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("duo-workflow-exact")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("duo-workflow-exact")),
           modelID: ModelV2.ID.make("duo-workflow-exact"),
           package: "aisdk:test-provider",
         }),
@@ -257,7 +257,7 @@ describe("GitLabPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("duo-workflow-custom")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("duo-workflow-custom")),
           modelID: ModelV2.ID.make("duo-workflow-custom"),
           package: "aisdk:test-provider",
           headers: {},
@@ -284,7 +284,7 @@ describe("GitLabPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("gitlab"), ModelV2.ID.make("claude")),
           modelID: ModelV2.ID.make("claude"),
           package: "aisdk:test-provider",
           headers: { h: "v" },

+ 8 - 8
packages/core/test/plugin/provider-google-vertex-anthropic.test.ts

@@ -116,7 +116,7 @@ describe("GoogleVertexAnthropicPlugin", () => {
           yield* addPlugin(GoogleVertexAnthropicPlugin)
           const result = yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(
+              ...ModelV2.Info.default(
                 ProviderV2.ID.make("google-vertex-anthropic"),
                 ModelV2.ID.make("claude-sonnet-4-5"),
               ),
@@ -143,7 +143,7 @@ describe("GoogleVertexAnthropicPlugin", () => {
           yield* addPlugin(GoogleVertexAnthropicPlugin)
           const result = yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(
+              ...ModelV2.Info.default(
                 ProviderV2.ID.make("google-vertex-anthropic"),
                 ModelV2.ID.make("claude-sonnet-4-5"),
               ),
@@ -167,7 +167,7 @@ describe("GoogleVertexAnthropicPlugin", () => {
       yield* addPlugin(GoogleVertexAnthropicPlugin)
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("claude-sonnet-4-5"),
           package: "aisdk:test-provider",
         }),
@@ -187,7 +187,7 @@ describe("GoogleVertexAnthropicPlugin", () => {
       yield* addPlugin(GoogleVertexAnthropicPlugin)
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("claude-sonnet-4-5"),
           package: "aisdk:test-provider",
         }),
@@ -206,7 +206,7 @@ describe("GoogleVertexAnthropicPlugin", () => {
       yield* addPlugin(GoogleVertexAnthropicPlugin)
       const sdkResult = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make(" claude-sonnet-4-5 ")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make(" claude-sonnet-4-5 ")),
           modelID: ModelV2.ID.make(" claude-sonnet-4-5 "),
           package: "aisdk:test-provider",
         }),
@@ -215,7 +215,7 @@ describe("GoogleVertexAnthropicPlugin", () => {
       })
       const languageResult = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make(" claude-sonnet-4-5 ")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make(" claude-sonnet-4-5 ")),
           modelID: ModelV2.ID.make(" claude-sonnet-4-5 "),
           package: "aisdk:test-provider",
         }),
@@ -238,7 +238,7 @@ describe("GoogleVertexAnthropicPlugin", () => {
       yield* addPlugin(GoogleVertexAnthropicPlugin)
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex-anthropic"), ModelV2.ID.make(" claude-sonnet-4-5 ")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex-anthropic"), ModelV2.ID.make(" claude-sonnet-4-5 ")),
           modelID: ModelV2.ID.make(" claude-sonnet-4-5 "),
           package: "aisdk:test-provider",
         }),
@@ -257,7 +257,7 @@ describe("GoogleVertexAnthropicPlugin", () => {
       yield* addPlugin(GoogleVertexAnthropicPlugin)
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("claude-sonnet-4-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("claude-sonnet-4-5")),
           modelID: ModelV2.ID.make("claude-sonnet-4-5"),
           package: "aisdk:test-provider",
         }),

+ 4 - 4
packages/core/test/plugin/provider-google-vertex.test.ts

@@ -172,7 +172,7 @@ describe("GoogleVertexPlugin", () => {
           const provider = required(yield* catalog.provider.get(ProviderV2.ID.make("google-vertex")))
           yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("gemini")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("gemini")),
               modelID: ModelV2.ID.make("gemini"),
               package: "aisdk:@ai-sdk/google-vertex",
             }),
@@ -294,7 +294,7 @@ describe("GoogleVertexPlugin", () => {
           yield* addPlugin()
           yield* aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("gemini")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("gemini")),
               modelID: ModelV2.ID.make("gemini"),
               package: "aisdk:@ai-sdk/google-vertex",
             }),
@@ -339,7 +339,7 @@ describe("GoogleVertexPlugin", () => {
         () =>
           aisdk.runSDK({
             model: ModelV2.Info.make({
-              ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("gemini")),
+              ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make("gemini")),
               modelID: ModelV2.ID.make("gemini"),
               package: "aisdk:@ai-sdk/openai-compatible",
             }),
@@ -367,7 +367,7 @@ describe("GoogleVertexPlugin", () => {
       yield* addPlugin()
       yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make(" gemini-2.5-pro ")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("google-vertex"), ModelV2.ID.make(" gemini-2.5-pro ")),
           modelID: ModelV2.ID.make(" gemini-2.5-pro "),
           package: "aisdk:test-provider",
         }),

+ 4 - 4
packages/core/test/plugin/provider-google.test.ts

@@ -26,7 +26,7 @@ describe("GooglePlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-google"), ModelV2.ID.make("gemini")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-google"), ModelV2.ID.make("gemini")),
           modelID: ModelV2.ID.make("gemini"),
           package: "aisdk:@ai-sdk/google",
         }),
@@ -45,7 +45,7 @@ describe("GooglePlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("google"), ModelV2.ID.make("gemini")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("google"), ModelV2.ID.make("gemini")),
           modelID: ModelV2.ID.make("gemini"),
           package: "aisdk:@ai-sdk/google",
         }),
@@ -63,7 +63,7 @@ describe("GooglePlugin", () => {
       yield* addPlugin()
       const sdkEvent = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-google"), ModelV2.ID.make("alias")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-google"), ModelV2.ID.make("alias")),
           modelID: ModelV2.ID.make("gemini-api"),
           package: "aisdk:@ai-sdk/google",
         }),
@@ -88,7 +88,7 @@ describe("GooglePlugin", () => {
 
       const resolved = yield* aisdk.model(
         ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-google"), ModelV2.ID.make("alias")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-google"), ModelV2.ID.make("alias")),
           modelID: ModelV2.ID.make("gemini-api"),
           package: "aisdk:@ai-sdk/google",
           settings: { apiKey: "test" },

+ 5 - 5
packages/core/test/plugin/provider-openai-compatible.test.ts

@@ -26,7 +26,7 @@ describe("OpenAICompatiblePlugin", () => {
       yield* addPlugin()
       const defaulted = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom"), ModelV2.ID.make("model")),
           modelID: ModelV2.ID.make("model"),
           package: "aisdk:test-provider",
         }),
@@ -35,7 +35,7 @@ describe("OpenAICompatiblePlugin", () => {
       })
       const disabled = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom"), ModelV2.ID.make("model")),
           modelID: ModelV2.ID.make("model"),
           package: "aisdk:test-provider",
         }),
@@ -54,7 +54,7 @@ describe("OpenAICompatiblePlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom"), ModelV2.ID.make("model")),
           modelID: ModelV2.ID.make("model"),
           package: "aisdk:test-provider",
         }),
@@ -78,7 +78,7 @@ describe("OpenAICompatiblePlugin", () => {
       )
       yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-provider"), ModelV2.ID.make("model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-provider"), ModelV2.ID.make("model")),
           modelID: ModelV2.ID.make("model"),
           package: "aisdk:test-provider",
         }),
@@ -99,7 +99,7 @@ describe("OpenAICompatiblePlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("model")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("model")),
           modelID: ModelV2.ID.make("model"),
           package: "aisdk:test-provider",
         }),

+ 4 - 4
packages/core/test/plugin/provider-openai.test.ts

@@ -68,7 +68,7 @@ describe("OpenAIPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-openai"), ModelV2.ID.make("gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-openai"), ModelV2.ID.make("gpt-5")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -86,7 +86,7 @@ describe("OpenAIPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.openai, ModelV2.ID.make("gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.openai, ModelV2.ID.make("gpt-5")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -105,7 +105,7 @@ describe("OpenAIPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.openai, ModelV2.ID.make("alias")),
+          ...ModelV2.Info.default(ProviderV2.ID.openai, ModelV2.ID.make("alias")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -125,7 +125,7 @@ describe("OpenAIPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.anthropic, ModelV2.ID.make("gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.anthropic, ModelV2.ID.make("gpt-5")),
           modelID: ModelV2.ID.make("gpt-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),

+ 7 - 7
packages/core/test/plugin/provider-opencode.test.ts

@@ -293,7 +293,7 @@ describe("OpencodePlugin", () => {
             package: ProviderV2.aisdk("test-provider"),
           })
           const model = ModelV2.Info.make({
-            ...ModelV2.Info.empty(provider.id, ModelV2.ID.make("paid")),
+            ...ModelV2.Info.default(provider.id, ModelV2.ID.make("paid")),
             modelID: ModelV2.ID.make("paid"),
             package: ProviderV2.aisdk("test-provider"),
             cost: cost(1),
@@ -320,7 +320,7 @@ describe("OpencodePlugin", () => {
             package: ProviderV2.aisdk("test-provider"),
           })
           const model = ModelV2.Info.make({
-            ...ModelV2.Info.empty(provider.id, ModelV2.ID.make("free")),
+            ...ModelV2.Info.default(provider.id, ModelV2.ID.make("free")),
             modelID: ModelV2.ID.make("free"),
             package: ProviderV2.aisdk("test-provider"),
             cost: cost(0),
@@ -347,7 +347,7 @@ describe("OpencodePlugin", () => {
             package: ProviderV2.aisdk("test-provider"),
           })
           const model = ModelV2.Info.make({
-            ...ModelV2.Info.empty(provider.id, ModelV2.ID.make("output-only")),
+            ...ModelV2.Info.default(provider.id, ModelV2.ID.make("output-only")),
             modelID: ModelV2.ID.make("output-only"),
             package: ProviderV2.aisdk("test-provider"),
             cost: cost(0, 1),
@@ -376,7 +376,7 @@ describe("OpencodePlugin", () => {
             package: ProviderV2.aisdk("test-provider"),
           })
           const model = ModelV2.Info.make({
-            ...ModelV2.Info.empty(provider.id, ModelV2.ID.make("paid")),
+            ...ModelV2.Info.default(provider.id, ModelV2.ID.make("paid")),
             modelID: ModelV2.ID.make("paid"),
             package: ProviderV2.aisdk("test-provider"),
             cost: cost(1),
@@ -410,7 +410,7 @@ describe("OpencodePlugin", () => {
             package: ProviderV2.aisdk("test-provider"),
           })
           const model = ModelV2.Info.make({
-            ...ModelV2.Info.empty(provider.id, ModelV2.ID.make("paid")),
+            ...ModelV2.Info.default(provider.id, ModelV2.ID.make("paid")),
             modelID: ModelV2.ID.make("paid"),
             package: ProviderV2.aisdk("test-provider"),
             cost: cost(1),
@@ -438,7 +438,7 @@ describe("OpencodePlugin", () => {
             settings: { apiKey: "configured" },
           })
           const model = ModelV2.Info.make({
-            ...ModelV2.Info.empty(provider.id, ModelV2.ID.make("paid")),
+            ...ModelV2.Info.default(provider.id, ModelV2.ID.make("paid")),
             modelID: ModelV2.ID.make("paid"),
             package: ProviderV2.aisdk("test-provider"),
             cost: cost(1),
@@ -468,7 +468,7 @@ describe("OpencodePlugin", () => {
             package: ProviderV2.aisdk("test-provider"),
           })
           const model = ModelV2.Info.make({
-            ...ModelV2.Info.empty(provider.id, ModelV2.ID.make("paid")),
+            ...ModelV2.Info.default(provider.id, ModelV2.ID.make("paid")),
             modelID: ModelV2.ID.make("paid"),
             package: ProviderV2.aisdk("test-provider"),
             cost: cost(1),

+ 2 - 2
packages/core/test/plugin/provider-openrouter.test.ts

@@ -54,7 +54,7 @@ describe("OpenRouterPlugin", () => {
 
       const ignored = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.openrouter, ModelV2.ID.make("openai/gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.openrouter, ModelV2.ID.make("openai/gpt-5")),
           modelID: ModelV2.ID.make("openai/gpt-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),
@@ -65,7 +65,7 @@ describe("OpenRouterPlugin", () => {
 
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("openai/gpt-5")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom"), ModelV2.ID.make("openai/gpt-5")),
           modelID: ModelV2.ID.make("openai/gpt-5"),
           package: ProviderV2.aisdk("test-provider"),
         }),

+ 1 - 1
packages/core/test/plugin/provider-sap-ai-core.test.ts

@@ -48,7 +48,7 @@ function withEnv<A, E, R>(vars: Record<string, string | undefined>, effect: () =
 
 function model(providerID: string) {
   return ModelV2.Info.make({
-    ...ModelV2.Info.empty(ProviderV2.ID.make(providerID), ModelV2.ID.make("sap-model")),
+    ...ModelV2.Info.default(ProviderV2.ID.make(providerID), ModelV2.ID.make("sap-model")),
     modelID: ModelV2.ID.make("sap-model"),
     package: ProviderV2.aisdk(fixtureProvider),
   })

+ 6 - 6
packages/core/test/plugin/provider-snowflake-cortex.test.ts

@@ -58,7 +58,7 @@ describe("SnowflakeCortexPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("openai"), ModelV2.ID.make("gpt-4")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("openai"), ModelV2.ID.make("gpt-4")),
           modelID: ModelV2.ID.make("gpt-4"),
           package: "aisdk:test-provider",
         }),
@@ -77,7 +77,7 @@ describe("SnowflakeCortexPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
             modelID: ModelV2.ID.make("claude-sonnet-4-6"),
             package: "aisdk:test-provider",
           }),
@@ -97,7 +97,7 @@ describe("SnowflakeCortexPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
             modelID: ModelV2.ID.make("claude-sonnet-4-6"),
             package: "aisdk:test-provider",
           }),
@@ -121,7 +121,7 @@ describe("SnowflakeCortexPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
             modelID: ModelV2.ID.make("claude-sonnet-4-6"),
             package: "aisdk:test-provider",
           }),
@@ -141,7 +141,7 @@ describe("SnowflakeCortexPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
             modelID: ModelV2.ID.make("claude-sonnet-4-6"),
             package: "aisdk:test-provider",
           }),
@@ -165,7 +165,7 @@ describe("SnowflakeCortexPlugin", () => {
         yield* addPlugin()
         const result = yield* aisdk.runSDK({
           model: ModelV2.Info.make({
-            ...ModelV2.Info.empty(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
+            ...ModelV2.Info.default(ProviderV2.ID.make("snowflake-cortex"), ModelV2.ID.make("claude-sonnet-4-6")),
             modelID: ModelV2.ID.make("claude-sonnet-4-6"),
             package: "aisdk:test-provider",
           }),

+ 1 - 1
packages/core/test/plugin/provider-vercel.test.ts

@@ -59,7 +59,7 @@ describe("VercelPlugin", () => {
       yield* addPlugin()
       const event = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-vercel"), ModelV2.ID.make("v0-1.0-md")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-vercel"), ModelV2.ID.make("v0-1.0-md")),
           modelID: ModelV2.ID.make("v0-1.0-md"),
           package: "aisdk:@ai-sdk/vercel",
         }),

+ 5 - 5
packages/core/test/plugin/provider-xai.test.ts

@@ -62,7 +62,7 @@ describe("XAIPlugin", () => {
 
       const ignored = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("xai"), ModelV2.ID.make("grok-4")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("xai"), ModelV2.ID.make("grok-4")),
           modelID: ModelV2.ID.make("grok-4"),
           package: "aisdk:@ai-sdk/xai",
         }),
@@ -72,7 +72,7 @@ describe("XAIPlugin", () => {
 
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("xai"), ModelV2.ID.make("grok-4")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("xai"), ModelV2.ID.make("grok-4")),
           modelID: ModelV2.ID.make("grok-4"),
           package: "aisdk:@ai-sdk/xai",
         }),
@@ -92,7 +92,7 @@ describe("XAIPlugin", () => {
 
       const result = yield* aisdk.runSDK({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("custom-xai"), ModelV2.ID.make("grok-4")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("custom-xai"), ModelV2.ID.make("grok-4")),
           modelID: ModelV2.ID.make("grok-4"),
           package: "aisdk:@ai-sdk/xai",
         }),
@@ -112,7 +112,7 @@ describe("XAIPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.make("xai"), ModelV2.ID.make("alias")),
+          ...ModelV2.Info.default(ProviderV2.ID.make("xai"), ModelV2.ID.make("alias")),
           modelID: ModelV2.ID.make("grok-4"),
           package: "aisdk:@ai-sdk/xai",
         }),
@@ -133,7 +133,7 @@ describe("XAIPlugin", () => {
       yield* addPlugin()
       const result = yield* aisdk.runLanguage({
         model: ModelV2.Info.make({
-          ...ModelV2.Info.empty(ProviderV2.ID.openai, ModelV2.ID.make("grok-4")),
+          ...ModelV2.Info.default(ProviderV2.ID.openai, ModelV2.ID.make("grok-4")),
           modelID: ModelV2.ID.make("grok-4"),
           package: "aisdk:@ai-sdk/xai",
         }),

+ 2 - 2
packages/core/test/shared-schema.test.ts

@@ -170,8 +170,8 @@ test("Core reuses the canonical shared schemas", async () => {
   for (const [core, shared] of schemas) expect(core).toBe(shared)
 
   expect(Agent.Info.empty(Agent.ID.make("test"))).toEqual(AgentV2.Info.empty(AgentV2.ID.make("test")))
-  expect(Model.Info.empty(Provider.ID.make("test"), Model.ID.make("model"))).toEqual(
-    ModelV2.Info.empty(ProviderV2.ID.make("test"), ModelV2.ID.make("model")),
+  expect(Model.Info.default(Provider.ID.make("test"), Model.ID.make("model"))).toEqual(
+    ModelV2.Info.default(ProviderV2.ID.make("test"), ModelV2.ID.make("model")),
   )
   expect(Provider.Info.empty(Provider.ID.make("test"))).toEqual(ProviderV2.Info.empty(ProviderV2.ID.make("test")))
   expect(Skill.Source.key(Skill.DirectorySource.make({ type: "directory", path: AbsolutePath.make("/tmp") }))).toBe(

+ 7 - 5
packages/docs/models.mdx

@@ -94,9 +94,10 @@ You can also map a friendly catalog ID to a different API model ID with `modelID
 }
 ```
 
-Here `openai/coding-default` is the selectable catalog reference, while `gpt-5.2` is sent to the provider. When adding a
-model that is not already in the catalog, set accurate `capabilities` and `limit` values so OpenCode can expose tools and
-enforce the correct context limits. Set `disabled: true` on a model entry to hide it from the available catalog.
+Here `openai/coding-default` is the selectable catalog reference, while `gpt-5.2` is sent to the provider. A model that is
+not already in the catalog defaults to tool support, text and image input, and text output. Set accurate `capabilities`
+and `limit` values when those defaults do not match the model or OpenCode needs to enforce its context limits. Set
+`disabled: true` on a model entry to hide it from the available catalog.
 
 OpenAI-compatible models that stream reasoning through a custom assistant-message field can set
 `compatibility.reasoningField`:
@@ -193,8 +194,9 @@ For an OpenAI-compatible server, define a provider package, endpoint, and at lea
 }
 ```
 
-Use the server's real model name, limits, modalities, and tool support. OpenCode cannot infer these for a model you add
-manually. If the endpoint requires a key, add `apiKey` to provider `settings` using an environment substitution such as
+Use the server's real model name, limits, modalities, and tool support. OpenCode applies the custom-model capability
+defaults described above but cannot infer the server's actual limits or whether those defaults are accurate. If the
+endpoint requires a key, add `apiKey` to provider `settings` using an environment substitution such as
 `"apiKey": "{env:LOCAL_API_KEY}"`; do not commit secrets.
 
 ### Model references

+ 2 - 2
packages/schema/src/model.ts

@@ -106,13 +106,13 @@ export const Info = Schema.Struct({
   .annotate({ identifier: "Model.Info" })
   .pipe(
     statics(() => ({
-      empty: (providerID: Provider.ID, id: ID) =>
+      default: (providerID: Provider.ID, id: ID) =>
         ({
           id,
           modelID: id,
           providerID,
           name: id,
-          capabilities: { tools: false, input: [], output: [] },
+          capabilities: { tools: true, input: ["text", "image"], output: ["text"] },
           variants: [],
           time: { released: 0 },
           cost: [],

+ 1 - 1
packages/schema/test/contract-hygiene.test.ts

@@ -83,7 +83,7 @@ describe("contract hygiene", () => {
 
   test("model defaults and provider overlays preserve public invariants", () => {
     const id = Model.ID.make("model")
-    expect(Model.Info.empty(Provider.ID.make("provider"), id)).toMatchObject({ modelID: id, variants: [] })
+    expect(Model.Info.default(Provider.ID.make("provider"), id)).toMatchObject({ modelID: id, variants: [] })
     expect(() =>
       Schema.decodeUnknownSync(Provider.Info)({
         id: "provider",