From e41e7e9064f1cb380f0905dd19c611756a577e79 Mon Sep 17 00:00:00 2001 From: Victor Navarro Date: Mon, 12 Oct 2026 16:35:49 +0200 Subject: [PATCH] refactor(ai): rename OpenCodeZen provider to OpenCode (#54767) --- packages/ai/README.md | 2 +- packages/ai/src/providers/index.ts | 2 +- .../ai/src/providers/{opencode-zen.ts => opencode.ts} | 4 ++-- packages/ai/test/evaluation.test.ts | 10 +++++----- packages/ai/test/evaluation.types.ts | 4 ++-- packages/ai/test/exports.test.ts | 4 ++-- .../evaluates-choice-score-and-boolean-questions.json | 6 +++--- packages/ai/test/provider/evaluation.recorded.test.ts | 10 +++++----- 8 files changed, 21 insertions(+), 21 deletions(-) rename packages/ai/src/providers/{opencode-zen.ts => opencode.ts} (91%) rename packages/ai/test/fixtures/recordings/{opencode-zen-evaluation => opencode-evaluation}/evaluates-choice-score-and-boolean-questions.json (90%) diff --git a/packages/ai/README.md b/packages/ai/README.md index 988d6011d4d..1e2ba9d0ce4 100644 --- a/packages/ai/README.md +++ b/packages/ai/README.md @@ -182,7 +182,7 @@ console.log(response.answers.department.choice) console.log(response.answers.refund.probability) ``` -`TypeSafeAI` reads `TYPESAFE_API_KEY`. `OpenCodeZen` exposes the same selector and reads +`TypeSafeAI` reads `TYPESAFE_API_KEY`. `OpenCode` exposes the same selector and reads `OPENCODE_API_KEY`. OpenRouter and Vercel AI Gateway use the same provider shape: ```ts diff --git a/packages/ai/src/providers/index.ts b/packages/ai/src/providers/index.ts index 35c829f705d..794abd08916 100644 --- a/packages/ai/src/providers/index.ts +++ b/packages/ai/src/providers/index.ts @@ -34,7 +34,7 @@ export * as Moonshot from "./moonshot.js" export * as OpenAI from "./openai.js" export * as OpenAICompatible from "./openai-compatible.js" export * as OpenAICompatibleResponses from "./openai-compatible-responses.js" -export * as OpenCodeZen from "./opencode-zen.js" +export * as OpenCode from "./opencode.js" export * as OpenRouter from "./openrouter.js" export * as Replicate from "./replicate.js" export * as Runway from "./runway.js" diff --git a/packages/ai/src/providers/opencode-zen.ts b/packages/ai/src/providers/opencode.ts similarity index 91% rename from packages/ai/src/providers/opencode-zen.ts rename to packages/ai/src/providers/opencode.ts index a0ab1c94671..84619320c1b 100644 --- a/packages/ai/src/providers/opencode-zen.ts +++ b/packages/ai/src/providers/opencode.ts @@ -3,7 +3,7 @@ import { AuthOptions, type ProviderAuthOption } from "../route/auth-options.js" import { SystemOne } from "../experimental/system-one.js" export const id = ProviderID.make("opencode") -const baseURL = "https://opencode.ai/zen/v1" +const baseURL = "https://opencode.ai/inference/v1" export type Options = ProviderAuthOption<"optional"> & { readonly baseURL?: string @@ -28,4 +28,4 @@ export const configure = (input: Options = {}) => { export const provider = configure() export const experimental = provider.experimental -export * as OpenCodeZen from "./opencode-zen.js" +export * as OpenCode from "./opencode.js" diff --git a/packages/ai/test/evaluation.test.ts b/packages/ai/test/evaluation.test.ts index d0f4245a8ce..4769d5fb5c5 100644 --- a/packages/ai/test/evaluation.test.ts +++ b/packages/ai/test/evaluation.test.ts @@ -2,7 +2,7 @@ import { describe, expect } from "bun:test" import { Effect, Layer } from "effect" import { HttpClientRequest } from "effect/http" import { Evaluation, EvaluationClient } from "../src/experimental.js" -import { OpenCodeZen, OpenRouter, TypeSafeAI, VercelAIGateway } from "../src/providers.js" +import { OpenCode, OpenRouter, TypeSafeAI, VercelAIGateway } from "../src/providers.js" import { it } from "./lib/effect.js" import { dynamicResponse } from "./lib/http.js" @@ -116,9 +116,9 @@ describe("experimental Evaluation", () => { ), ) - it.effect("configures the OpenCode Zen System One endpoint", () => + it.effect("configures the OpenCode System One endpoint", () => Evaluation.run({ - model: OpenCodeZen.configure({ apiKey: "zen-key", baseURL: "https://zen.test/v1" }).experimental.evaluation( + model: OpenCode.configure({ apiKey: "opencode-key", baseURL: "https://opencode.test/v1" }).experimental.evaluation( "jev-1.13", ), state: "hello", @@ -136,8 +136,8 @@ describe("experimental Evaluation", () => { EvaluationClient.layer.pipe( Layer.provide( dynamicResponse((input) => { - expect(input.request.url).toBe("https://zen.test/v1/systemone") - expect(input.request.headers.authorization).toBe("Bearer zen-key") + expect(input.request.url).toBe("https://opencode.test/v1/systemone") + expect(input.request.headers.authorization).toBe("Bearer opencode-key") return Effect.succeed( input.respond( JSON.stringify({ diff --git a/packages/ai/test/evaluation.types.ts b/packages/ai/test/evaluation.types.ts index bddecae693f..f749bb4f47f 100644 --- a/packages/ai/test/evaluation.types.ts +++ b/packages/ai/test/evaluation.types.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import { Evaluation, EvaluationClient, EvaluationModel, type EvaluationRoute } from "../src/experimental.js" import type { Service } from "../src/experimental/evaluation-client.js" -import { OpenCodeZen, OpenRouter, TypeSafeAI, VercelAIGateway } from "../src/providers.js" +import { OpenCode, OpenRouter, TypeSafeAI, VercelAIGateway } from "../src/providers.js" type Requirements = T extends Effect.Effect ? R : never type Success = T extends Effect.Effect ? A : never @@ -34,7 +34,7 @@ void (true satisfies ClientRequirements) Effect.gen(function* () { const response = yield* Evaluation.run({ - model: OpenCodeZen.experimental.evaluation("jev-1.13"), + model: OpenCode.experimental.evaluation("jev-1.13"), state: ["hello"], questions: { greeting: { type: "boolean", instructions: "Greeting?" } }, }) diff --git a/packages/ai/test/exports.test.ts b/packages/ai/test/exports.test.ts index 7dea93cac3a..371c7713426 100644 --- a/packages/ai/test/exports.test.ts +++ b/packages/ai/test/exports.test.ts @@ -34,7 +34,7 @@ import { Fireworks, Google, Meta, - OpenCodeZen, + OpenCode, OpenAI, OpenAICompatible, OpenRouter, @@ -149,7 +149,7 @@ describe("public exports", () => { expect(OpenRouter.model).toBeFunction() expect(OpenRouter.experimental.evaluation).toBeFunction() expect(TypeSafeAI.experimental.evaluation).toBeFunction() - expect(OpenCodeZen.experimental.evaluation).toBeFunction() + expect(OpenCode.experimental.evaluation).toBeFunction() expect(VercelAIGateway.experimental.evaluation).toBeFunction() expect(XAI.model).toBeFunction() expect(XAI.provider.responses).toBe(XAI.responses) diff --git a/packages/ai/test/fixtures/recordings/opencode-zen-evaluation/evaluates-choice-score-and-boolean-questions.json b/packages/ai/test/fixtures/recordings/opencode-evaluation/evaluates-choice-score-and-boolean-questions.json similarity index 90% rename from packages/ai/test/fixtures/recordings/opencode-zen-evaluation/evaluates-choice-score-and-boolean-questions.json rename to packages/ai/test/fixtures/recordings/opencode-evaluation/evaluates-choice-score-and-boolean-questions.json index 5451189f443..e9486ab24cc 100644 --- a/packages/ai/test/fixtures/recordings/opencode-zen-evaluation/evaluates-choice-score-and-boolean-questions.json +++ b/packages/ai/test/fixtures/recordings/opencode-evaluation/evaluates-choice-score-and-boolean-questions.json @@ -3,11 +3,11 @@ "metadata": { "model": "jev-1.13-free", "tags": [ - "prefix:opencode-zen-evaluation", + "prefix:opencode-evaluation", "provider:opencode", "protocol:system-one" ], - "name": "opencode-zen-evaluation/evaluates-choice-score-and-boolean-questions", + "name": "opencode-evaluation/evaluates-choice-score-and-boolean-questions", "recordedAt": "2026-09-22T03:44:57.511Z" }, "interactions": [ @@ -15,7 +15,7 @@ "transport": "http", "request": { "method": "POST", - "url": "https://opencode.ai/zen/v1/systemone", + "url": "https://opencode.ai/inference/v1/systemone", "headers": { "content-type": "application/json" }, diff --git a/packages/ai/test/provider/evaluation.recorded.test.ts b/packages/ai/test/provider/evaluation.recorded.test.ts index 971d328abda..24570c9759c 100644 --- a/packages/ai/test/provider/evaluation.recorded.test.ts +++ b/packages/ai/test/provider/evaluation.recorded.test.ts @@ -1,7 +1,7 @@ import { describe, expect } from "bun:test" import { Effect } from "effect" import { Evaluation, EvaluationModel, type EvaluationOptions } from "../../src/experimental.js" -import { OpenCodeZen, OpenRouter, TypeSafeAI } from "../../src/providers.js" +import { OpenCode, OpenRouter, TypeSafeAI } from "../../src/providers.js" import { recordedTests } from "../recorded-test.js" const questions = { @@ -32,8 +32,8 @@ const typesafe = recordedTests({ metadata: { model: "jev-latest" }, }) -const zen = recordedTests({ - prefix: "opencode-zen-evaluation", +const opencode = recordedTests({ + prefix: "opencode-evaluation", provider: "opencode", protocol: "system-one", requires: ["OPENCODE_API_KEY"], @@ -55,9 +55,9 @@ describe("experimental Evaluation recorded", () => { ), ) - zen.effect("evaluates choice score and boolean questions", () => + opencode.effect("evaluates choice score and boolean questions", () => assertEvaluation( - OpenCodeZen.configure({ apiKey: process.env.OPENCODE_API_KEY ?? "fixture" }).experimental.evaluation( + OpenCode.configure({ apiKey: process.env.OPENCODE_API_KEY ?? "fixture" }).experimental.evaluation( "jev-1.13-free", ), ),