|
|
@@ -136,123 +136,126 @@ describe("ConfigProviderPlugin.Plugin", () => {
|
|
|
)
|
|
|
|
|
|
it.effect("loads configured providers and applies later model overrides", () =>
|
|
|
- withEnv({ CUSTOM_API_KEY: "secret" }, () => Effect.gen(function* () {
|
|
|
- const catalog = yield* Catalog.Service
|
|
|
- const integrations = yield* Integration.Service
|
|
|
- const plugin = yield* PluginV2.Service
|
|
|
- const providerID = ProviderV2.ID.make("custom")
|
|
|
- const modelID = ModelV2.ID.make("chat")
|
|
|
- const config = Config.Service.of({
|
|
|
- entries: () =>
|
|
|
- Effect.succeed([
|
|
|
- new Config.Document({
|
|
|
- type: "document",
|
|
|
- info: decode({
|
|
|
- model: "custom/first",
|
|
|
- providers: {
|
|
|
- custom: {
|
|
|
- name: "Configured",
|
|
|
- env: ["CUSTOM_API_KEY"],
|
|
|
- api: { type: "native", settings: {} },
|
|
|
- request: request({ first: "first", shared: "first" }),
|
|
|
- models: {
|
|
|
- chat: {
|
|
|
- name: "First",
|
|
|
- capabilities: { tools: true, input: ["text"], output: ["text"] },
|
|
|
- disabled: true,
|
|
|
- limit: { context: 100, output: 50 },
|
|
|
- cost: { input: 1, output: 2 },
|
|
|
- request: request({ first: "first", shared: "first" }, "retained"),
|
|
|
- variants: [
|
|
|
- {
|
|
|
- id: "fast",
|
|
|
- headers: { first: "first", shared: "first" },
|
|
|
- },
|
|
|
- ],
|
|
|
+ withEnv({ CUSTOM_API_KEY: "secret" }, () =>
|
|
|
+ Effect.gen(function* () {
|
|
|
+ const catalog = yield* Catalog.Service
|
|
|
+ const integrations = yield* Integration.Service
|
|
|
+ const plugin = yield* PluginV2.Service
|
|
|
+ const providerID = ProviderV2.ID.make("custom")
|
|
|
+ const modelID = ModelV2.ID.make("chat")
|
|
|
+ const config = Config.Service.of({
|
|
|
+ entries: () =>
|
|
|
+ Effect.succeed([
|
|
|
+ new Config.Document({
|
|
|
+ type: "document",
|
|
|
+ info: decode({
|
|
|
+ model: "custom/first",
|
|
|
+ providers: {
|
|
|
+ custom: {
|
|
|
+ name: "Configured",
|
|
|
+ env: ["CUSTOM_API_KEY"],
|
|
|
+ api: { type: "native", settings: {} },
|
|
|
+ request: request({ first: "first", shared: "first" }),
|
|
|
+ models: {
|
|
|
+ chat: {
|
|
|
+ name: "First",
|
|
|
+ capabilities: { tools: true, input: ["text"], output: ["text"] },
|
|
|
+ disabled: true,
|
|
|
+ limit: { context: 100, output: 50 },
|
|
|
+ cost: { input: 1, output: 2 },
|
|
|
+ request: request({ first: "first", shared: "first" }, "retained"),
|
|
|
+ variants: [
|
|
|
+ {
|
|
|
+ id: "fast",
|
|
|
+ headers: { first: "first", shared: "first" },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- },
|
|
|
+ }),
|
|
|
}),
|
|
|
- }),
|
|
|
- new Config.Document({
|
|
|
- type: "document",
|
|
|
- info: decode({
|
|
|
- model: "custom/default",
|
|
|
- providers: {
|
|
|
- custom: {
|
|
|
- api: { type: "aisdk", package: "custom-sdk", url: "https://example.test" },
|
|
|
- request: request({ last: "last", shared: "last" }),
|
|
|
- models: {
|
|
|
- default: {
|
|
|
- name: "Default",
|
|
|
- },
|
|
|
- chat: {
|
|
|
- api: { id: "api-chat" },
|
|
|
- name: "Last",
|
|
|
- limit: { output: 75 },
|
|
|
- request: request({ last: "last", shared: "last" }),
|
|
|
- variants: [
|
|
|
- {
|
|
|
- id: "fast",
|
|
|
- headers: { last: "last", shared: "last" },
|
|
|
- },
|
|
|
- {
|
|
|
- id: "slow",
|
|
|
- headers: { slow: "slow" },
|
|
|
- },
|
|
|
- ],
|
|
|
+ new Config.Document({
|
|
|
+ type: "document",
|
|
|
+ info: decode({
|
|
|
+ model: "custom/default",
|
|
|
+ providers: {
|
|
|
+ custom: {
|
|
|
+ api: { type: "aisdk", package: "custom-sdk", url: "https://example.test" },
|
|
|
+ request: request({ last: "last", shared: "last" }),
|
|
|
+ models: {
|
|
|
+ default: {
|
|
|
+ name: "Default",
|
|
|
+ },
|
|
|
+ chat: {
|
|
|
+ api: { id: "api-chat" },
|
|
|
+ name: "Last",
|
|
|
+ limit: { output: 75 },
|
|
|
+ request: request({ last: "last", shared: "last" }),
|
|
|
+ variants: [
|
|
|
+ {
|
|
|
+ id: "fast",
|
|
|
+ headers: { last: "last", shared: "last" },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: "slow",
|
|
|
+ headers: { slow: "slow" },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- },
|
|
|
+ }),
|
|
|
}),
|
|
|
- }),
|
|
|
- new Config.Document({
|
|
|
- type: "document",
|
|
|
- info: decode({
|
|
|
- providers: {
|
|
|
- custom: { name: "Renamed" },
|
|
|
- },
|
|
|
+ new Config.Document({
|
|
|
+ type: "document",
|
|
|
+ info: decode({
|
|
|
+ providers: {
|
|
|
+ custom: { name: "Renamed" },
|
|
|
+ },
|
|
|
+ }),
|
|
|
}),
|
|
|
- }),
|
|
|
- ]),
|
|
|
- })
|
|
|
+ ]),
|
|
|
+ })
|
|
|
|
|
|
- yield* plugin.add({
|
|
|
- ...ConfigProviderPlugin.Plugin,
|
|
|
- effect: ConfigProviderPlugin.Plugin.effect.pipe(
|
|
|
- Effect.provideService(Config.Service, config),
|
|
|
- Effect.provideService(Catalog.Service, catalog),
|
|
|
- Effect.provideService(Integration.Service, integrations),
|
|
|
- ),
|
|
|
- })
|
|
|
+ yield* plugin.add({
|
|
|
+ ...ConfigProviderPlugin.Plugin,
|
|
|
+ effect: ConfigProviderPlugin.Plugin.effect.pipe(
|
|
|
+ Effect.provideService(Config.Service, config),
|
|
|
+ Effect.provideService(Catalog.Service, catalog),
|
|
|
+ Effect.provideService(Integration.Service, integrations),
|
|
|
+ ),
|
|
|
+ })
|
|
|
|
|
|
- const provider = yield* catalog.provider.get(providerID)
|
|
|
- const model = yield* catalog.model.get(providerID, modelID)
|
|
|
- expect(Option.getOrUndefined(yield* catalog.model.default())?.id).toBe(ModelV2.ID.make("default"))
|
|
|
- expect(provider.name).toBe("Renamed")
|
|
|
- expect((yield* integrations.get(Integration.ID.make("custom")))?.methods).toContainEqual(
|
|
|
- { type: "env", names: ["CUSTOM_API_KEY"] },
|
|
|
- )
|
|
|
- expect((yield* integrations.get(Integration.ID.make("custom")))?.name).toBe("Renamed")
|
|
|
- expect(provider.disabled).toBeUndefined()
|
|
|
- expect(provider.api).toEqual({ type: "aisdk", package: "custom-sdk", url: "https://example.test" })
|
|
|
- expect(provider.request.headers).toEqual({ first: "first", shared: "last", last: "last" })
|
|
|
- expect(model.api.id).toBe(ModelV2.ID.make("api-chat"))
|
|
|
- expect(model.name).toBe("Last")
|
|
|
- expect(model.capabilities).toEqual({ tools: true, input: ["text"], output: ["text"] })
|
|
|
- expect(model.enabled).toBe(false)
|
|
|
- expect(model.limit).toEqual({ context: 100, output: 75 })
|
|
|
- expect(model.cost).toEqual([{ input: 1, output: 2, cache: { read: 0, write: 0 }, tier: undefined }])
|
|
|
- expect(model.request.headers).toEqual({ first: "first", shared: "last", last: "last" })
|
|
|
- expect(model.request.variant).toBe("retained")
|
|
|
- expect(model.variants.map((variant) => variant.id)).toEqual([
|
|
|
- ModelV2.VariantID.make("fast"),
|
|
|
- ModelV2.VariantID.make("slow"),
|
|
|
- ])
|
|
|
- expect(model.variants[0]?.headers).toEqual({ first: "first", shared: "last", last: "last" })
|
|
|
- expect(model.variants[1]?.headers).toEqual({ slow: "slow" })
|
|
|
- })),
|
|
|
+ const provider = yield* catalog.provider.get(providerID)
|
|
|
+ const model = yield* catalog.model.get(providerID, modelID)
|
|
|
+ expect(Option.getOrUndefined(yield* catalog.model.default())?.id).toBe(ModelV2.ID.make("default"))
|
|
|
+ expect(provider.name).toBe("Renamed")
|
|
|
+ expect((yield* integrations.get(Integration.ID.make("custom")))?.methods).toContainEqual({
|
|
|
+ type: "env",
|
|
|
+ names: ["CUSTOM_API_KEY"],
|
|
|
+ })
|
|
|
+ expect((yield* integrations.get(Integration.ID.make("custom")))?.name).toBe("Renamed")
|
|
|
+ expect(provider.disabled).toBeUndefined()
|
|
|
+ expect(provider.api).toEqual({ type: "aisdk", package: "custom-sdk", url: "https://example.test" })
|
|
|
+ expect(provider.request.headers).toEqual({ first: "first", shared: "last", last: "last" })
|
|
|
+ expect(model.api.id).toBe(ModelV2.ID.make("api-chat"))
|
|
|
+ expect(model.name).toBe("Last")
|
|
|
+ expect(model.capabilities).toEqual({ tools: true, input: ["text"], output: ["text"] })
|
|
|
+ expect(model.enabled).toBe(false)
|
|
|
+ expect(model.limit).toEqual({ context: 100, output: 75 })
|
|
|
+ expect(model.cost).toEqual([{ input: 1, output: 2, cache: { read: 0, write: 0 }, tier: undefined }])
|
|
|
+ expect(model.request.headers).toEqual({ first: "first", shared: "last", last: "last" })
|
|
|
+ expect(model.request.variant).toBe("retained")
|
|
|
+ expect(model.variants.map((variant) => variant.id)).toEqual([
|
|
|
+ ModelV2.VariantID.make("fast"),
|
|
|
+ ModelV2.VariantID.make("slow"),
|
|
|
+ ])
|
|
|
+ expect(model.variants[0]?.headers).toEqual({ first: "first", shared: "last", last: "last" })
|
|
|
+ expect(model.variants[1]?.headers).toEqual({ slow: "slow" })
|
|
|
+ }),
|
|
|
+ ),
|
|
|
)
|
|
|
})
|