|
|
@@ -15,6 +15,7 @@ import { Env } from "../../src/env"
|
|
|
import { Effect } from "effect"
|
|
|
import { AppRuntime } from "../../src/effect/app-runtime"
|
|
|
import { makeRuntime } from "../../src/effect/run-service"
|
|
|
+import { testEffect } from "../lib/effect"
|
|
|
|
|
|
const env = makeRuntime(Env.Service, Env.defaultLayer)
|
|
|
const set = (k: string, v: string) => env.runSync((svc) => svc.set(k, v))
|
|
|
@@ -70,6 +71,8 @@ function paid(providers: Awaited<ReturnType<typeof list>>) {
|
|
|
return Object.values(item.models).filter((model) => model.cost.input > 0).length
|
|
|
}
|
|
|
|
|
|
+const it = testEffect(Provider.defaultLayer)
|
|
|
+
|
|
|
test("provider loaded from env variable", async () => {
|
|
|
await using tmp = await tmpdir({
|
|
|
init: async (dir) => {
|
|
|
@@ -515,85 +518,69 @@ test("defaultModel respects config model setting", async () => {
|
|
|
})
|
|
|
})
|
|
|
|
|
|
-test("provider with baseURL from config", async () => {
|
|
|
- await using tmp = await tmpdir({
|
|
|
- init: async (dir) => {
|
|
|
- await Bun.write(
|
|
|
- path.join(dir, "opencode.json"),
|
|
|
- JSON.stringify({
|
|
|
- $schema: "https://opencode.ai/config.json",
|
|
|
- provider: {
|
|
|
- "custom-openai": {
|
|
|
- name: "Custom OpenAI",
|
|
|
- npm: "@ai-sdk/openai-compatible",
|
|
|
- env: [],
|
|
|
- models: {
|
|
|
- "gpt-4": {
|
|
|
- name: "GPT-4",
|
|
|
- tool_call: true,
|
|
|
- limit: { context: 128000, output: 4096 },
|
|
|
- },
|
|
|
- },
|
|
|
- options: {
|
|
|
- apiKey: "test-key",
|
|
|
- baseURL: "https://custom.openai.com/v1",
|
|
|
- },
|
|
|
+it.instance(
|
|
|
+ "provider with baseURL from config",
|
|
|
+ Effect.gen(function* () {
|
|
|
+ const providers = yield* Provider.Service.use((provider) => provider.list())
|
|
|
+ expect(providers[ProviderID.make("custom-openai")]).toBeDefined()
|
|
|
+ expect(providers[ProviderID.make("custom-openai")].options.baseURL).toBe("https://custom.openai.com/v1")
|
|
|
+ }),
|
|
|
+ {
|
|
|
+ config: {
|
|
|
+ provider: {
|
|
|
+ "custom-openai": {
|
|
|
+ name: "Custom OpenAI",
|
|
|
+ npm: "@ai-sdk/openai-compatible",
|
|
|
+ env: [],
|
|
|
+ models: {
|
|
|
+ "gpt-4": {
|
|
|
+ name: "GPT-4",
|
|
|
+ tool_call: true,
|
|
|
+ limit: { context: 128000, output: 4096 },
|
|
|
},
|
|
|
},
|
|
|
- }),
|
|
|
- )
|
|
|
- },
|
|
|
- })
|
|
|
- await WithInstance.provide({
|
|
|
- directory: tmp.path,
|
|
|
- fn: async () => {
|
|
|
- const providers = await list()
|
|
|
- expect(providers[ProviderID.make("custom-openai")]).toBeDefined()
|
|
|
- expect(providers[ProviderID.make("custom-openai")].options.baseURL).toBe("https://custom.openai.com/v1")
|
|
|
+ options: {
|
|
|
+ apiKey: "test-key",
|
|
|
+ baseURL: "https://custom.openai.com/v1",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
- })
|
|
|
-})
|
|
|
-
|
|
|
-test("model cost defaults to zero when not specified", async () => {
|
|
|
- await using tmp = await tmpdir({
|
|
|
- init: async (dir) => {
|
|
|
- await Bun.write(
|
|
|
- path.join(dir, "opencode.json"),
|
|
|
- JSON.stringify({
|
|
|
- $schema: "https://opencode.ai/config.json",
|
|
|
- provider: {
|
|
|
- "test-provider": {
|
|
|
- name: "Test Provider",
|
|
|
- npm: "@ai-sdk/openai-compatible",
|
|
|
- env: [],
|
|
|
- models: {
|
|
|
- "test-model": {
|
|
|
- name: "Test Model",
|
|
|
- tool_call: true,
|
|
|
- limit: { context: 128000, output: 4096 },
|
|
|
- },
|
|
|
- },
|
|
|
- options: {
|
|
|
- apiKey: "test-key",
|
|
|
- },
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+it.instance(
|
|
|
+ "model cost defaults to zero when not specified",
|
|
|
+ Effect.gen(function* () {
|
|
|
+ const providers = yield* Provider.Service.use((provider) => provider.list())
|
|
|
+ const model = providers[ProviderID.make("test-provider")].models["test-model"]
|
|
|
+ expect(model.cost.input).toBe(0)
|
|
|
+ expect(model.cost.output).toBe(0)
|
|
|
+ expect(model.cost.cache.read).toBe(0)
|
|
|
+ expect(model.cost.cache.write).toBe(0)
|
|
|
+ }),
|
|
|
+ {
|
|
|
+ config: {
|
|
|
+ provider: {
|
|
|
+ "test-provider": {
|
|
|
+ name: "Test Provider",
|
|
|
+ npm: "@ai-sdk/openai-compatible",
|
|
|
+ env: [],
|
|
|
+ models: {
|
|
|
+ "test-model": {
|
|
|
+ name: "Test Model",
|
|
|
+ tool_call: true,
|
|
|
+ limit: { context: 128000, output: 4096 },
|
|
|
},
|
|
|
},
|
|
|
- }),
|
|
|
- )
|
|
|
- },
|
|
|
- })
|
|
|
- await WithInstance.provide({
|
|
|
- directory: tmp.path,
|
|
|
- fn: async () => {
|
|
|
- const providers = await list()
|
|
|
- const model = providers[ProviderID.make("test-provider")].models["test-model"]
|
|
|
- expect(model.cost.input).toBe(0)
|
|
|
- expect(model.cost.output).toBe(0)
|
|
|
- expect(model.cost.cache.read).toBe(0)
|
|
|
- expect(model.cost.cache.write).toBe(0)
|
|
|
+ options: {
|
|
|
+ apiKey: "test-key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
- })
|
|
|
-})
|
|
|
+ },
|
|
|
+)
|
|
|
|
|
|
test("model options are merged from existing model", async () => {
|
|
|
await using tmp = await tmpdir({
|