diff --git a/packages/core/src/models-dev.ts b/packages/core/src/models-dev.ts index c2325cb57fda..660041e3cfbc 100644 --- a/packages/core/src/models-dev.ts +++ b/packages/core/src/models-dev.ts @@ -195,9 +195,9 @@ const layer = Layer.effect( const populate = Effect.gen(function* () { const fromDisk = yield* loadFromDisk if (fromDisk) return fromDisk + if (Flag.OPENCODE_DISABLE_MODELS_FETCH) return {} const snapshot = yield* loadSnapshot if (snapshot) return snapshot - if (Flag.OPENCODE_DISABLE_MODELS_FETCH) return {} // Flock is cross-process: concurrent opencode CLIs can race on this cache file. const text = yield* Effect.scoped( Effect.gen(function* () { diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index c979fc44659c..1e8b342d0fb6 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -1619,6 +1619,13 @@ const layer = Layer.effect( (v) => omit(v, ["disabled"]), ) } + + const configLimit = configProvider?.models?.[modelID]?.limit + if (configLimit) { + if (configLimit.context) model.limit.context = configLimit.context + if (configLimit.input) model.limit.input = configLimit.input + if (configLimit.output) model.limit.output = configLimit.output + } } if (Object.keys(provider.models).length === 0) { diff --git a/packages/opencode/test/provider/provider.test.ts b/packages/opencode/test/provider/provider.test.ts index 18ec8f9fbeeb..55793205d69b 100644 --- a/packages/opencode/test/provider/provider.test.ts +++ b/packages/opencode/test/provider/provider.test.ts @@ -1214,6 +1214,31 @@ it.instance( }, ) +it.instance( + "config provider model limit overrides individual fields", + Effect.gen(function* () { + const providers = yield* list + const model = providers[ProviderV2.ID.make("limit-override")].models[ModelV2.ID.make("model")] + expect(model.limit.context).toBe(100000) + expect(model.limit.input).toBe(80000) + expect(model.limit.output).toBe(16000) + }), + { + config: { + provider: { + "limit-override": { + name: "Limit Override Provider", + npm: "@ai-sdk/openai-compatible", + env: [], + models: { model: { name: "Model", tool_call: true, limit: { context: 100000, input: 80000, output: 16000 } } }, + options: { apiKey: "test" }, + }, + }, + }, + }, +) + + it.instance( "provider options are deeply merged", Effect.gen(function* () {