Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions packages/opencode/src/cli/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,9 @@ export function FormatError(input: unknown) {
}

// ProviderInitError: { providerID: string }
if (NamedError.hasName(input, "ProviderInitError")) {
return `Failed to initialize provider "${(input as ErrorLike).data?.providerID}". Check credentials and configuration.`
const providerInit = configData(input, "ProviderInitError")
if (providerInit) {
return `Failed to initialize provider "${stringField(providerInit, "providerID")}". Check credentials and configuration.`
}

// ConfigJsonError: { path: string, message?: string }
Expand Down
18 changes: 11 additions & 7 deletions packages/opencode/src/provider/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { Auth } from "../auth"
import { Env } from "../env"
import { InstallationVersion } from "@opencode-ai/core/installation/version"
import { Flag } from "@opencode-ai/core/flag/flag"
import { NamedError } from "@opencode-ai/core/util/error"
import { iife } from "@/util/iife"
import { Global } from "@opencode-ai/core/global"
import path from "path"
Expand Down Expand Up @@ -975,7 +974,16 @@ export class ModelNotFoundError extends Schema.TaggedErrorClass<ModelNotFoundErr
}
}

export type Error = ModelNotFoundError
export class InitError extends Schema.TaggedErrorClass<InitError>()("ProviderInitError", {
providerID: ProviderID,
cause: Schema.optional(Schema.Defect),
}) {
static isInstance(input: unknown): input is InitError {
return input instanceof InitError
}
}

export type Error = ModelNotFoundError | InitError

export interface Interface {
readonly list: () => Effect.Effect<Record<ProviderID, Info>>
Expand Down Expand Up @@ -1634,7 +1642,7 @@ const layer = Layer.effect(
s.sdk.set(key, loaded)
return loaded as SDK
} catch (e) {
throw new InitError({ providerID: model.providerID }, { cause: e })
throw new InitError({ providerID: model.providerID, cause: e })
}
}

Expand Down Expand Up @@ -1827,8 +1835,4 @@ export function parseModel(model: string) {
}
}

export const InitError = NamedError.create("ProviderInitError", {
providerID: ProviderID,
})

export * as Provider from "./provider"
8 changes: 8 additions & 0 deletions packages/opencode/test/cli/error.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,14 @@ describe("cli.error", () => {
expect(FormatError({ _tag: "ProviderModelNotFoundError", ...data })).toBe(expected)
})

test("formats legacy and tagged provider init errors the same way", () => {
const data = { providerID: "anthropic" }
const expected = 'Failed to initialize provider "anthropic". Check credentials and configuration.'

expect(FormatError({ name: "ProviderInitError", data })).toBe(expected)
expect(FormatError({ _tag: "ProviderInitError", ...data })).toBe(expected)
})

test("formats cancelled UI errors as empty output", () => {
expect(FormatError(new UI.CancelledError())).toBe("")
})
Expand Down
Loading