fix(schema): adapt legacy catalog responses
This commit is contained in:
parent
5436b55a7e
commit
8efd8783d0
4 changed files with 51 additions and 3 deletions
|
|
@ -78,6 +78,34 @@ export const Info = Schema.Struct({
|
||||||
|
|
||||||
export type MutableInfo = Omit<DeepMutable<Info>, "api"> & { api: ProviderV2.MutableApi<Api> }
|
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 } {
|
export function parse(input: string): { providerID: ProviderV2.ID; modelID: ID } {
|
||||||
const [providerID, ...modelID] = input.split("/")
|
const [providerID, ...modelID] = input.split("/")
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -59,3 +59,19 @@ export type MutableApi<T extends Api = Api> = T extends Api
|
||||||
: never
|
: never
|
||||||
|
|
||||||
export type MutableInfo = Omit<DeepMutable<Info>, "api"> & { api: MutableApi }
|
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,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { Effect } from "effect"
|
||||||
import { HttpApiBuilder } from "effect/unstable/httpapi"
|
import { HttpApiBuilder } from "effect/unstable/httpapi"
|
||||||
import { Api } from "../api"
|
import { Api } from "../api"
|
||||||
import { response } from "../location"
|
import { response } from "../location"
|
||||||
|
import { ModelV2 } from "@opencode-ai/core/model"
|
||||||
|
|
||||||
export const ModelHandler = HttpApiBuilder.group(Api, "server.model", (handlers) =>
|
export const ModelHandler = HttpApiBuilder.group(Api, "server.model", (handlers) =>
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
|
|
@ -10,7 +11,7 @@ export const ModelHandler = HttpApiBuilder.group(Api, "server.model", (handlers)
|
||||||
"model.list",
|
"model.list",
|
||||||
Effect.fn(function* () {
|
Effect.fn(function* () {
|
||||||
const catalog = yield* Catalog.Service
|
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))))
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { Effect } from "effect"
|
||||||
import { HttpApiBuilder } from "effect/unstable/httpapi"
|
import { HttpApiBuilder } from "effect/unstable/httpapi"
|
||||||
import { Api } from "../api"
|
import { Api } from "../api"
|
||||||
import { ProviderNotFoundError } from "@opencode-ai/protocol/errors"
|
import { ProviderNotFoundError } from "@opencode-ai/protocol/errors"
|
||||||
|
import { ProviderV2 } from "@opencode-ai/core/provider"
|
||||||
import { response } from "../location"
|
import { response } from "../location"
|
||||||
|
|
||||||
export const ProviderHandler = HttpApiBuilder.group(Api, "server.provider", (handlers) =>
|
export const ProviderHandler = HttpApiBuilder.group(Api, "server.provider", (handlers) =>
|
||||||
|
|
@ -12,7 +13,9 @@ export const ProviderHandler = HttpApiBuilder.group(Api, "server.provider", (han
|
||||||
"provider.list",
|
"provider.list",
|
||||||
Effect.fn(function* () {
|
Effect.fn(function* () {
|
||||||
const catalog = yield* Catalog.Service
|
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(
|
.handle(
|
||||||
|
|
@ -25,7 +28,7 @@ export const ProviderHandler = HttpApiBuilder.group(Api, "server.provider", (han
|
||||||
providerID: ctx.params.providerID,
|
providerID: ctx.params.providerID,
|
||||||
message: `Provider not found: ${ctx.params.providerID}`,
|
message: `Provider not found: ${ctx.params.providerID}`,
|
||||||
})
|
})
|
||||||
return yield* response(Effect.succeed(provider))
|
return yield* response(Effect.succeed(ProviderV2.flatten(provider)))
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue