From 2a6596b0c578b20ea803fa69a8427fc3e4c2e823 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Wed, 10 Jun 2026 15:16:00 +0000 Subject: [PATCH 1/2] fix(cli): indicate an empty model list Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- .changeset/clear-empty-models.md | 5 ++++ packages/opencode/src/cli/error.ts | 3 +- packages/opencode/src/provider/provider.ts | 7 +++-- packages/opencode/src/session/prompt.ts | 3 +- .../opencode/test/kilocode/cli/error.test.ts | 30 +++++++++++++++++++ 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 .changeset/clear-empty-models.md create mode 100644 packages/opencode/test/kilocode/cli/error.test.ts diff --git a/.changeset/clear-empty-models.md b/.changeset/clear-empty-models.md new file mode 100644 index 00000000000..80956ed8356 --- /dev/null +++ b/.changeset/clear-empty-models.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Indicate when no models are available in model-not-found errors. diff --git a/packages/opencode/src/cli/error.ts b/packages/opencode/src/cli/error.ts index c3bbc9968e1..5a52fb32e5c 100644 --- a/packages/opencode/src/cli/error.ts +++ b/packages/opencode/src/cli/error.ts @@ -57,7 +57,7 @@ export function FormatError(input: unknown) { return (input as ErrorLike).message ?? "" } - // ProviderModelNotFoundError: { providerID: string, modelID: string, suggestions?: string[] } + // ProviderModelNotFoundError: { providerID: string, modelID: string, suggestions?: string[], modelsEmpty?: boolean } // kilocode_change const providerModelNotFound = configData(input, "ProviderModelNotFoundError") if (providerModelNotFound) { const suggestions = Array.isArray(providerModelNotFound.suggestions) @@ -66,6 +66,7 @@ export function FormatError(input: unknown) { return [ `Model not found: ${providerModelNotFound.providerID}/${providerModelNotFound.modelID}`, ...(suggestions.length ? ["Did you mean: " + suggestions.join(", ")] : []), + ...(providerModelNotFound.modelsEmpty === true ? ["No models are currently available."] : []), // kilocode_change `Try: \`kilo models\` to list available models`, // kilocode_change `Or check your config (opencode.json) provider/model names`, ].join("\n") diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index f8aa658a047..c52a3363de6 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -998,6 +998,7 @@ export class ModelNotFoundError extends Schema.TaggedErrorClass m.target) - return yield* new ModelNotFoundError({ providerID, modelID, suggestions }) + const empty = Object.values(s.providers).every((item) => Object.keys(item.models).length === 0) // kilocode_change + return yield* new ModelNotFoundError({ providerID, modelID, suggestions, modelsEmpty: empty }) // kilocode_change } const info = provider.models[modelID] @@ -1734,7 +1736,8 @@ export const layer = Layer.effect( const suggestions = current.length ? current : modelSuggestions(s.catalog[providerID], modelID, runtimeFlags.enableExperimentalModels) - return yield* new ModelNotFoundError({ providerID, modelID, suggestions }) + const empty = Object.values(s.providers).every((item) => Object.keys(item.models).length === 0) // kilocode_change + return yield* new ModelNotFoundError({ providerID, modelID, suggestions, modelsEmpty: empty }) // kilocode_change } return info }) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 67e6abc7f05..170c1025894 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -1118,10 +1118,11 @@ NOTE: At any point in time through this workflow you should feel free to ask the const err = Cause.squash(exit.cause) if (Provider.ModelNotFoundError.isInstance(err)) { const hint = err.suggestions?.length ? ` Did you mean: ${err.suggestions.join(", ")}?` : "" + const empty = err.modelsEmpty ? " No models are currently available." : "" // kilocode_change yield* bus.publish(Session.Event.Error, { sessionID, error: new NamedError.Unknown({ - message: `Model not found: ${err.providerID}/${err.modelID}.${hint}`, + message: `Model not found: ${err.providerID}/${err.modelID}.${hint}${empty}`, // kilocode_change }).toObject(), }) } diff --git a/packages/opencode/test/kilocode/cli/error.test.ts b/packages/opencode/test/kilocode/cli/error.test.ts new file mode 100644 index 00000000000..b507888118a --- /dev/null +++ b/packages/opencode/test/kilocode/cli/error.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, test } from "bun:test" +import { FormatError } from "@/cli/error" + +describe("model not found errors", () => { + test("indicates when no models are available", () => { + const data = { + providerID: "anthropic", + modelID: "claude-sonnet-4", + modelsEmpty: true, + } + + expect(FormatError({ name: "ProviderModelNotFoundError", data })).toContain( + "No models are currently available.", + ) + expect(FormatError({ _tag: "ProviderModelNotFoundError", ...data })).toContain( + "No models are currently available.", + ) + }) + + test("omits the indication when models are available", () => { + const error = FormatError({ + _tag: "ProviderModelNotFoundError", + providerID: "anthropic", + modelID: "claude-sonnet-4", + modelsEmpty: false, + }) + + expect(error).not.toContain("No models are currently available.") + }) +}) From a367fa1e14d39ab3634eb112f2461ac5ac9185e0 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Wed, 10 Jun 2026 16:43:48 +0000 Subject: [PATCH 2/2] fix(cli): scope empty model warning to provider Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- packages/opencode/src/provider/provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index c52a3363de6..6b1e35fb93e 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -1726,7 +1726,7 @@ export const layer = Layer.effect( : fuzzysort .go(providerID, Object.keys({ ...s.catalog, ...s.providers }), { limit: 3, threshold: -10000 }) .map((m) => m.target) - const empty = Object.values(s.providers).every((item) => Object.keys(item.models).length === 0) // kilocode_change + const empty = false // kilocode_change return yield* new ModelNotFoundError({ providerID, modelID, suggestions, modelsEmpty: empty }) // kilocode_change } @@ -1736,7 +1736,7 @@ export const layer = Layer.effect( const suggestions = current.length ? current : modelSuggestions(s.catalog[providerID], modelID, runtimeFlags.enableExperimentalModels) - const empty = Object.values(s.providers).every((item) => Object.keys(item.models).length === 0) // kilocode_change + const empty = Object.keys(provider.models).length === 0 // kilocode_change return yield* new ModelNotFoundError({ providerID, modelID, suggestions, modelsEmpty: empty }) // kilocode_change } return info