fix(schema): adapt legacy catalog responses

This commit is contained in:
Shoubhit Dash
2026-06-25 20:36:02 +05:30
parent 5436b55a7e
commit 8efd8783d0
4 changed files with 51 additions and 3 deletions
+28
View File
@@ -78,6 +78,34 @@ export const Info = Schema.Struct({
export type MutableInfo = Omit<DeepMutable<Info>, "api"> & { api: ProviderV2.MutableApi<Api> }
export function flatten(info: Info): Model.Info {
return Model.Info.make({
id: info.id,
modelID: info.api.id === info.id ? undefined : info.api.id,
providerID: info.providerID,
family: info.family,
name: info.name,
package: info.api.type === "aisdk" ? `aisdk:${info.api.package}` : undefined,
settings: {
...info.api.settings,
...(info.api.url === undefined ? {} : { baseURL: info.api.url }),
},
headers: info.request.headers,
body: info.request.body,
capabilities: info.capabilities,
variants: info.variants.map((variant) => ({
id: variant.id,
headers: variant.headers,
body: variant.body,
})),
time: info.time,
cost: info.cost,
status: info.status,
enabled: info.enabled,
limit: info.limit,
})
}
export function parse(input: string): { providerID: ProviderV2.ID; modelID: ID } {
const [providerID, ...modelID] = input.split("/")
return {
+16
View File
@@ -59,3 +59,19 @@ export type MutableApi<T extends Api = Api> = T extends Api
: never
export type MutableInfo = Omit<DeepMutable<Info>, "api"> & { api: MutableApi }
export function flatten(info: Info): Provider.Info {
return Provider.Info.make({
id: info.id,
integrationID: info.integrationID,
name: info.name,
disabled: info.disabled,
package: info.api.type === "aisdk" ? `aisdk:${info.api.package}` : "",
settings: {
...info.api.settings,
...(info.api.url === undefined ? {} : { baseURL: info.api.url }),
},
headers: info.request.headers,
body: info.request.body,
})
}
+2 -1
View File
@@ -3,6 +3,7 @@ import { Effect } from "effect"
import { HttpApiBuilder } from "effect/unstable/httpapi"
import { Api } from "../api"
import { response } from "../location"
import { ModelV2 } from "@opencode-ai/core/model"
export const ModelHandler = HttpApiBuilder.group(Api, "server.model", (handlers) =>
Effect.gen(function* () {
@@ -10,7 +11,7 @@ export const ModelHandler = HttpApiBuilder.group(Api, "server.model", (handlers)
"model.list",
Effect.fn(function* () {
const catalog = yield* Catalog.Service
return yield* response(catalog.model.available())
return yield* response(catalog.model.available().pipe(Effect.map((models) => models.map(ModelV2.flatten))))
}),
)
}),
+5 -2
View File
@@ -3,6 +3,7 @@ import { Effect } from "effect"
import { HttpApiBuilder } from "effect/unstable/httpapi"
import { Api } from "../api"
import { ProviderNotFoundError } from "@opencode-ai/protocol/errors"
import { ProviderV2 } from "@opencode-ai/core/provider"
import { response } from "../location"
export const ProviderHandler = HttpApiBuilder.group(Api, "server.provider", (handlers) =>
@@ -12,7 +13,9 @@ export const ProviderHandler = HttpApiBuilder.group(Api, "server.provider", (han
"provider.list",
Effect.fn(function* () {
const catalog = yield* Catalog.Service
return yield* response(catalog.provider.available())
return yield* response(
catalog.provider.available().pipe(Effect.map((providers) => providers.map(ProviderV2.flatten))),
)
}),
)
.handle(
@@ -25,7 +28,7 @@ export const ProviderHandler = HttpApiBuilder.group(Api, "server.provider", (han
providerID: ctx.params.providerID,
message: `Provider not found: ${ctx.params.providerID}`,
})
return yield* response(Effect.succeed(provider))
return yield* response(Effect.succeed(ProviderV2.flatten(provider)))
}),
)
}),