diff --git a/bun.lock b/bun.lock index bc975f1444..1351ffe83d 100644 --- a/bun.lock +++ b/bun.lock @@ -338,7 +338,7 @@ "@opencode-ai/codemode": "workspace:*", "@opencode-ai/effect-drizzle-sqlite": "workspace:*", "@opencode-ai/effect-sqlite-node": "workspace:*", - "@opencode-ai/llm": "workspace:*", + "@opencode-ai/ai": "workspace:*", "@opencode-ai/plugin": "workspace:*", "@opencode-ai/schema": "workspace:*", "@openrouter/ai-sdk-provider": "2.9.0", @@ -561,8 +561,8 @@ "@typescript/native-preview": "catalog:", }, }, - "packages/llm": { - "name": "@opencode-ai/llm", + "packages/ai": { + "name": "@opencode-ai/ai", "version": "1.17.20", "dependencies": { "@opencode-ai/schema": "workspace:*", @@ -623,7 +623,7 @@ "@opencode-ai/cli": "workspace:*", "@opencode-ai/client": "workspace:*", "@opencode-ai/codemode": "workspace:*", - "@opencode-ai/llm": "workspace:*", + "@opencode-ai/ai": "workspace:*", "@opencode-ai/plugin": "workspace:*", "@opencode-ai/protocol": "workspace:*", "@opencode-ai/schema": "workspace:*", @@ -884,7 +884,7 @@ "@fontsource/commit-mono": "5.2.5", "@napi-rs/canvas": "1.0.2", "@opencode-ai/core": "workspace:*", - "@opencode-ai/llm": "workspace:*", + "@opencode-ai/ai": "workspace:*", "@opentui/core": "catalog:", "effect": "catalog:", }, @@ -2204,7 +2204,7 @@ "@opencode-ai/httpapi-codegen": ["@opencode-ai/httpapi-codegen@workspace:packages/httpapi-codegen"], - "@opencode-ai/llm": ["@opencode-ai/llm@workspace:packages/llm"], + "@opencode-ai/ai": ["@opencode-ai/ai@workspace:packages/ai"], "@opencode-ai/plugin": ["@opencode-ai/plugin@workspace:packages/plugin"], @@ -6862,9 +6862,9 @@ "@opencode-ai/desktop/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], - "@opencode-ai/llm/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.14", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw=="], + "@opencode-ai/ai/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.14", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw=="], - "@opencode-ai/llm/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="], + "@opencode-ai/ai/@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="], "@opencode-ai/script/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], diff --git a/packages/llm/AGENTS.md b/packages/ai/AGENTS.md similarity index 98% rename from packages/llm/AGENTS.md rename to packages/ai/AGENTS.md index 1d920258df..997615ce0d 100644 --- a/packages/llm/AGENTS.md +++ b/packages/ai/AGENTS.md @@ -1,4 +1,4 @@ -# LLM Package Guide +# AI Package Guide ## Effect @@ -115,10 +115,10 @@ Keep provider facades small and explicit: ### Provider Package Entrypoints -Catalog-selected native providers use package-like export paths from `@opencode-ai/llm`. They are internal entrypoints in one npm package, not separately published provider packages. Every entrypoint implements `ProviderPackage.Definition` and exposes `model(modelID, settings)`, where settings are serializable provider configuration plus common `headers`, `body`, and `limits` overlays. +Catalog-selected native providers use package-like export paths from `@opencode-ai/ai`. They are internal entrypoints in one npm package, not separately published provider packages. Every entrypoint implements `ProviderPackage.Definition` and exposes `model(modelID, settings)`, where settings are serializable provider configuration plus common `headers`, `body`, and `limits` overlays. ```ts -import { model } from "@opencode-ai/llm/providers/openai/responses" +import { model } from "@opencode-ai/ai/providers/openai/responses" const selected = model("gpt-5", { apiKey, @@ -133,7 +133,7 @@ Do not expose `Route` in provider package settings. Route composition stays an i ### Folder layout ``` -packages/llm/src/ +packages/ai/src/ schema/ canonical Schema model, split by concern ids.ts branded IDs, literal types, ProviderMetadata options.ts Generation/Provider/Http options, Limits, Model, cache policy @@ -143,7 +143,7 @@ packages/llm/src/ index.ts barrel llm.ts request constructors and convenience helpers route/ - index.ts @opencode-ai/llm/route advanced barrel + index.ts @opencode-ai/ai/route advanced barrel client.ts Route.make + LLMClient.prepare/stream/generate executor.ts RequestExecutor service + transport error mapping protocol.ts Protocol type + Protocol.make diff --git a/packages/llm/DESIGN.md b/packages/ai/DESIGN.md similarity index 99% rename from packages/llm/DESIGN.md rename to packages/ai/DESIGN.md index 22e76969a4..2e73360300 100644 --- a/packages/llm/DESIGN.md +++ b/packages/ai/DESIGN.md @@ -1,7 +1,7 @@ # AI Library Design -> Discussion draft. This document describes the intended replacement for the -> current private `@opencode-ai/llm` API. Names and exact TypeScript signatures +> Discussion draft. This document describes an intended clean-break redesign of +> the current private `@opencode-ai/ai` API. Names and exact TypeScript signatures > are illustrative until implementation, but the domain boundaries and defaults > are deliberate. @@ -1074,7 +1074,6 @@ The redesign intentionally removes or changes these current concepts: | Current | Proposed | | --------------------------------------- | ----------------------------------------------------------- | -| `@opencode-ai/llm` | `@opencode-ai/ai` | | Mandatory `LLM.request({ model, ... })` | Inline calls or model-free portable requests | | `LLM.generate` means one turn | `LLM.generate` means complete run | | `LLMClient.generate/stream` | `LLM.generateTurn/streamTurn` for one turn | diff --git a/packages/llm/README.md b/packages/ai/README.md similarity index 90% rename from packages/llm/README.md rename to packages/ai/README.md index a2ec852a5a..e88213e342 100644 --- a/packages/llm/README.md +++ b/packages/ai/README.md @@ -1,11 +1,11 @@ -# @opencode-ai/llm +# @opencode-ai/ai Schema-first LLM core for opencode. One typed request, response, event, and tool language; provider quirks live in adapters, not in calling code. ```ts import { Effect } from "effect" -import { LLM, LLMClient } from "@opencode-ai/llm" -import { OpenAI } from "@opencode-ai/llm/providers" +import { LLM, LLMClient } from "@opencode-ai/ai" +import { OpenAI } from "@opencode-ai/ai/providers" const model = OpenAI.configure({ apiKey: process.env.OPENAI_API_KEY }).responses("gpt-4o-mini") @@ -95,7 +95,7 @@ Normalized cache usage is read back into `response.usage.cacheReadInputTokens` a Provider facades configure endpoint/auth/deployment details first, then expose model selectors that take only a model or deployment id. The selected model carries the executable route value used at runtime. ```ts -import { OpenAI, CloudflareAIGateway } from "@opencode-ai/llm/providers" +import { OpenAI, CloudflareAIGateway } from "@opencode-ai/ai/providers" const openai = OpenAI.configure({ apiKey: process.env.OPENAI_API_KEY }).responses("gpt-4o-mini") const gateway = CloudflareAIGateway.configure({ @@ -108,10 +108,10 @@ Included providers: OpenAI, Anthropic, Google (Gemini), Google Vertex Gemini and ### Package-like entrypoints -Native catalog integrations load provider behavior through package-like entrypoints. These are export paths from the same `@opencode-ai/llm` npm package, not independently published packages. Each entrypoint exports the same `model(modelID, settings)` contract, and `settings` contains serializable provider configuration plus common `headers`, `body`, and `limits` overlays. +Native catalog integrations load provider behavior through package-like entrypoints. These are export paths from the same `@opencode-ai/ai` npm package, not independently published packages. Each entrypoint exports the same `model(modelID, settings)` contract, and `settings` contains serializable provider configuration plus common `headers`, `body`, and `limits` overlays. ```ts -import { model } from "@opencode-ai/llm/providers/openai/responses" +import { model } from "@opencode-ai/ai/providers/openai/responses" const selected = model("gpt-5", { apiKey: process.env.OPENAI_API_KEY, @@ -123,12 +123,12 @@ const selected = model("gpt-5", { OpenAI Chat and OpenAI Responses are separate semantic entrypoints: -- `@opencode-ai/llm/providers/openai/chat` -- `@opencode-ai/llm/providers/openai/responses` -- `@opencode-ai/llm/providers/openai-compatible/responses` -- `@opencode-ai/llm/providers/anthropic-compatible` -- `@opencode-ai/llm/providers/google-vertex` -- `@opencode-ai/llm/providers/google-vertex/anthropic` +- `@opencode-ai/ai/providers/openai/chat` +- `@opencode-ai/ai/providers/openai/responses` +- `@opencode-ai/ai/providers/openai-compatible/responses` +- `@opencode-ai/ai/providers/anthropic-compatible` +- `@opencode-ai/ai/providers/google-vertex` +- `@opencode-ai/ai/providers/google-vertex/anthropic` Responses HTTP versus WebSocket is a scoped `transport` setting on the OpenAI Responses entrypoint, not another entrypoint. Azure follows the same Chat/Responses split at `providers/azure/chat` and `providers/azure/responses`. Generic OpenAI-compatible Chat remains at `providers/openai-compatible`; compatible Responses is separate at `providers/openai-compatible/responses`. Generic Anthropic Messages-compatible providers use `providers/anthropic-compatible`, which the named Anthropic provider composes. Google Gemini and Amazon Bedrock expose their single native API through their existing provider paths. @@ -137,13 +137,13 @@ Vertex Gemini and Vertex Anthropic are separate products with separate entrypoin Tuned Vertex Gemini deployments use model ids shaped like `endpoints/1234567890` and require OAuth or ADC; Vertex express-mode API keys support publisher models only. ```ts -import { model } from "@opencode-ai/llm/providers/google-vertex" +import { model } from "@opencode-ai/ai/providers/google-vertex" model("gemini-3.5-flash", { project: "my-project", location: "global" }) ``` ```ts -import { model } from "@opencode-ai/llm/providers/google-vertex/anthropic" +import { model } from "@opencode-ai/ai/providers/google-vertex/anthropic" model("claude-sonnet-4-6", { project: "my-project", location: "global" }) ``` diff --git a/packages/llm/STATUS.md b/packages/ai/STATUS.md similarity index 88% rename from packages/llm/STATUS.md rename to packages/ai/STATUS.md index 5ffdc3f6eb..f3a95c1a7b 100644 --- a/packages/llm/STATUS.md +++ b/packages/ai/STATUS.md @@ -2,14 +2,14 @@ Last reviewed: 2026-07-15 -This file tracks the gap between the native `@opencode-ai/llm` package and the AI SDK provider packages that opencode still depends on for many catalog/runtime paths. +This file tracks the gap between the native `@opencode-ai/ai` package and the AI SDK provider packages that opencode still depends on for many catalog/runtime paths. ## Existing Status Sources | File | What it tracks | Limitation | | ------------------------------------ | -------------------------------------------------------------------------------- | ------------------------------------------------------- | -| `packages/llm/DESIGN.md` | Future clean-break API proposal, currently named `@opencode-ai/ai` in the draft. | Not a provider parity tracker. | -| `packages/llm/example/call-sites.md` | Route/value/provider-facade migration checklist and call-site sketches. | Architecture migration only; not AI SDK package parity. | +| `packages/ai/DESIGN.md` | Future clean-break API proposal for `@opencode-ai/ai`. | Not a provider parity tracker. | +| `packages/ai/example/call-sites.md` | Route/value/provider-facade migration checklist and call-site sketches. | Architecture migration only; not AI SDK package parity. | ## Current Implementation Snapshot @@ -78,21 +78,21 @@ These are implementation/API slices, not separate npm packages. | API slice | Package-like entrypoint | Purpose | | ----------------------------- | -------------------------------------------------------- | ---------------------------------------------------------------------------- | -| OpenAI Chat | `@opencode-ai/llm/providers/openai/chat` | OpenAI `/chat/completions` semantics. | -| OpenAI Responses | `@opencode-ai/llm/providers/openai/responses` | OpenAI `/responses` semantics with HTTP/WebSocket selected through settings. | -| OpenAI-compatible Chat | `@opencode-ai/llm/providers/openai-compatible` | Generic OpenAI-compatible `/chat/completions`. | -| OpenAI-compatible Responses | `@opencode-ai/llm/providers/openai-compatible/responses` | Generic OpenAI-compatible `/responses`. | -| Anthropic-compatible Messages | `@opencode-ai/llm/providers/anthropic-compatible` | Generic Anthropic-compatible `/messages`. | -| Anthropic Messages | `@opencode-ai/llm/providers/anthropic` | Anthropic Messages API. | -| Gemini Developer API | `@opencode-ai/llm/providers/google` | Google AI Studio Gemini API. | -| Vertex Gemini | `@opencode-ai/llm/providers/google-vertex` | Vertex Gemini API. | -| Vertex Anthropic Messages | `@opencode-ai/llm/providers/google-vertex/anthropic` | Vertex-hosted Anthropic Messages API. | +| OpenAI Chat | `@opencode-ai/ai/providers/openai/chat` | OpenAI `/chat/completions` semantics. | +| OpenAI Responses | `@opencode-ai/ai/providers/openai/responses` | OpenAI `/responses` semantics with HTTP/WebSocket selected through settings. | +| OpenAI-compatible Chat | `@opencode-ai/ai/providers/openai-compatible` | Generic OpenAI-compatible `/chat/completions`. | +| OpenAI-compatible Responses | `@opencode-ai/ai/providers/openai-compatible/responses` | Generic OpenAI-compatible `/responses`. | +| Anthropic-compatible Messages | `@opencode-ai/ai/providers/anthropic-compatible` | Generic Anthropic-compatible `/messages`. | +| Anthropic Messages | `@opencode-ai/ai/providers/anthropic` | Anthropic Messages API. | +| Gemini Developer API | `@opencode-ai/ai/providers/google` | Google AI Studio Gemini API. | +| Vertex Gemini | `@opencode-ai/ai/providers/google-vertex` | Vertex Gemini API. | +| Vertex Anthropic Messages | `@opencode-ai/ai/providers/google-vertex/anthropic` | Vertex-hosted Anthropic Messages API. | | Vertex MaaS | Missing | Vertex OpenAI-compatible MaaS APIs. | | Vertex xAI | Missing | Vertex-hosted xAI APIs. | -| Bedrock Converse | `@opencode-ai/llm/providers/amazon-bedrock` | AWS Bedrock Converse API. | +| Bedrock Converse | `@opencode-ai/ai/providers/amazon-bedrock` | AWS Bedrock Converse API. | | Bedrock Mantle | Missing | AWS Bedrock Mantle OpenAI-compatible APIs. | -| Azure OpenAI Chat | `@opencode-ai/llm/providers/azure/chat` | Azure specialization of OpenAI Chat. | -| Azure OpenAI Responses | `@opencode-ai/llm/providers/azure/responses` | Azure specialization of OpenAI Responses. | +| Azure OpenAI Chat | `@opencode-ai/ai/providers/azure/chat` | Azure specialization of OpenAI Chat. | +| Azure OpenAI Responses | `@opencode-ai/ai/providers/azure/responses` | Azure specialization of OpenAI Responses. | ## Suggested Next Work Slices diff --git a/packages/llm/example/call-sites.md b/packages/ai/example/call-sites.md similarity index 98% rename from packages/llm/example/call-sites.md rename to packages/ai/example/call-sites.md index 52d002c77a..84a9a9e4be 100644 --- a/packages/llm/example/call-sites.md +++ b/packages/ai/example/call-sites.md @@ -7,7 +7,7 @@ values directly. ## Conversation Summary Kit and Aidan want provider-specific LLM behavior to move out of opencode's AI -SDK transform path and into `packages/llm` where possible. The goal is not a big +SDK transform path and into `packages/ai` where possible. The goal is not a big generic transform layer; the goal is small composable route definitions backed by recorded golden tests. @@ -355,7 +355,7 @@ The package-like OpenAI Responses entrypoint instead keeps transport scoped to Responses settings while preserving the same `model(...)` contract: ```ts -import { model } from "@opencode-ai/llm/providers/openai/responses" +import { model } from "@opencode-ai/ai/providers/openai/responses" model("gpt-4o", { apiKey, transport: "websocket" }) ``` @@ -364,13 +364,13 @@ Vertex keeps Gemini and Anthropic Messages as separate package-like entrypoints, while sharing project/location resolution and ADC authentication internally: ```ts -import { model } from "@opencode-ai/llm/providers/google-vertex" +import { model } from "@opencode-ai/ai/providers/google-vertex" model("gemini-3.5-flash", { project, location: "global" }) ``` ```ts -import { model } from "@opencode-ai/llm/providers/google-vertex/anthropic" +import { model } from "@opencode-ai/ai/providers/google-vertex/anthropic" model("claude-sonnet-4-6", { project, location: "global" }) ``` diff --git a/packages/llm/example/tutorial.ts b/packages/ai/example/tutorial.ts similarity index 97% rename from packages/llm/example/tutorial.ts rename to packages/ai/example/tutorial.ts index fddc345966..b109ef6230 100644 --- a/packages/llm/example/tutorial.ts +++ b/packages/ai/example/tutorial.ts @@ -1,12 +1,12 @@ import { Config, Effect, Formatter, Layer, Schema, Stream } from "effect" -import { LLM, LLMClient, Message, ProviderID, Tool, ToolRuntime } from "@opencode-ai/llm" -import { Route, Auth, Endpoint, Framing, Protocol, RequestExecutor, WebSocketExecutor } from "@opencode-ai/llm/route" -import { OpenAI } from "@opencode-ai/llm/providers" +import { LLM, LLMClient, Message, ProviderID, Tool, ToolRuntime } from "@opencode-ai/ai" +import { Route, Auth, Endpoint, Framing, Protocol, RequestExecutor, WebSocketExecutor } from "@opencode-ai/ai/route" +import { OpenAI } from "@opencode-ai/ai/providers" /** * A runnable walkthrough of the LLM package use-site API. * - * Run from `packages/llm` with an OpenAI key in the environment: + * Run from `packages/ai` with an OpenAI key in the environment: * * OPENAI_API_KEY=... bun example/tutorial.ts * diff --git a/packages/llm/package.json b/packages/ai/package.json similarity index 99% rename from packages/llm/package.json rename to packages/ai/package.json index 97aadfdfb0..51a46be066 100644 --- a/packages/llm/package.json +++ b/packages/ai/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "version": "1.17.20", - "name": "@opencode-ai/llm", + "name": "@opencode-ai/ai", "type": "module", "license": "MIT", "private": true, diff --git a/packages/llm/script/recording-cost-report.ts b/packages/ai/script/recording-cost-report.ts similarity index 100% rename from packages/llm/script/recording-cost-report.ts rename to packages/ai/script/recording-cost-report.ts diff --git a/packages/llm/script/setup-recording-env.ts b/packages/ai/script/setup-recording-env.ts similarity index 100% rename from packages/llm/script/setup-recording-env.ts rename to packages/ai/script/setup-recording-env.ts diff --git a/packages/llm/src/cache-policy.ts b/packages/ai/src/cache-policy.ts similarity index 100% rename from packages/llm/src/cache-policy.ts rename to packages/ai/src/cache-policy.ts diff --git a/packages/llm/src/index.ts b/packages/ai/src/index.ts similarity index 100% rename from packages/llm/src/index.ts rename to packages/ai/src/index.ts diff --git a/packages/llm/src/llm.ts b/packages/ai/src/llm.ts similarity index 100% rename from packages/llm/src/llm.ts rename to packages/ai/src/llm.ts diff --git a/packages/llm/src/protocols/anthropic-messages.ts b/packages/ai/src/protocols/anthropic-messages.ts similarity index 100% rename from packages/llm/src/protocols/anthropic-messages.ts rename to packages/ai/src/protocols/anthropic-messages.ts diff --git a/packages/llm/src/protocols/bedrock-converse.ts b/packages/ai/src/protocols/bedrock-converse.ts similarity index 100% rename from packages/llm/src/protocols/bedrock-converse.ts rename to packages/ai/src/protocols/bedrock-converse.ts diff --git a/packages/llm/src/protocols/bedrock-event-stream.ts b/packages/ai/src/protocols/bedrock-event-stream.ts similarity index 100% rename from packages/llm/src/protocols/bedrock-event-stream.ts rename to packages/ai/src/protocols/bedrock-event-stream.ts diff --git a/packages/llm/src/protocols/gemini.ts b/packages/ai/src/protocols/gemini.ts similarity index 100% rename from packages/llm/src/protocols/gemini.ts rename to packages/ai/src/protocols/gemini.ts diff --git a/packages/llm/src/protocols/google-vertex-anthropic.ts b/packages/ai/src/protocols/google-vertex-anthropic.ts similarity index 100% rename from packages/llm/src/protocols/google-vertex-anthropic.ts rename to packages/ai/src/protocols/google-vertex-anthropic.ts diff --git a/packages/llm/src/protocols/google-vertex-gemini.ts b/packages/ai/src/protocols/google-vertex-gemini.ts similarity index 100% rename from packages/llm/src/protocols/google-vertex-gemini.ts rename to packages/ai/src/protocols/google-vertex-gemini.ts diff --git a/packages/llm/src/protocols/index.ts b/packages/ai/src/protocols/index.ts similarity index 100% rename from packages/llm/src/protocols/index.ts rename to packages/ai/src/protocols/index.ts diff --git a/packages/llm/src/protocols/openai-chat.ts b/packages/ai/src/protocols/openai-chat.ts similarity index 100% rename from packages/llm/src/protocols/openai-chat.ts rename to packages/ai/src/protocols/openai-chat.ts diff --git a/packages/llm/src/protocols/openai-compatible-chat.ts b/packages/ai/src/protocols/openai-compatible-chat.ts similarity index 100% rename from packages/llm/src/protocols/openai-compatible-chat.ts rename to packages/ai/src/protocols/openai-compatible-chat.ts diff --git a/packages/llm/src/protocols/openai-compatible-responses.ts b/packages/ai/src/protocols/openai-compatible-responses.ts similarity index 100% rename from packages/llm/src/protocols/openai-compatible-responses.ts rename to packages/ai/src/protocols/openai-compatible-responses.ts diff --git a/packages/llm/src/protocols/openai-responses.ts b/packages/ai/src/protocols/openai-responses.ts similarity index 100% rename from packages/llm/src/protocols/openai-responses.ts rename to packages/ai/src/protocols/openai-responses.ts diff --git a/packages/llm/src/protocols/shared.ts b/packages/ai/src/protocols/shared.ts similarity index 100% rename from packages/llm/src/protocols/shared.ts rename to packages/ai/src/protocols/shared.ts diff --git a/packages/llm/src/protocols/utils/bedrock-auth.ts b/packages/ai/src/protocols/utils/bedrock-auth.ts similarity index 100% rename from packages/llm/src/protocols/utils/bedrock-auth.ts rename to packages/ai/src/protocols/utils/bedrock-auth.ts diff --git a/packages/llm/src/protocols/utils/bedrock-cache.ts b/packages/ai/src/protocols/utils/bedrock-cache.ts similarity index 100% rename from packages/llm/src/protocols/utils/bedrock-cache.ts rename to packages/ai/src/protocols/utils/bedrock-cache.ts diff --git a/packages/llm/src/protocols/utils/bedrock-media.ts b/packages/ai/src/protocols/utils/bedrock-media.ts similarity index 100% rename from packages/llm/src/protocols/utils/bedrock-media.ts rename to packages/ai/src/protocols/utils/bedrock-media.ts diff --git a/packages/llm/src/protocols/utils/cache.ts b/packages/ai/src/protocols/utils/cache.ts similarity index 100% rename from packages/llm/src/protocols/utils/cache.ts rename to packages/ai/src/protocols/utils/cache.ts diff --git a/packages/llm/src/protocols/utils/gemini-tool-schema.ts b/packages/ai/src/protocols/utils/gemini-tool-schema.ts similarity index 100% rename from packages/llm/src/protocols/utils/gemini-tool-schema.ts rename to packages/ai/src/protocols/utils/gemini-tool-schema.ts diff --git a/packages/llm/src/protocols/utils/lifecycle.ts b/packages/ai/src/protocols/utils/lifecycle.ts similarity index 100% rename from packages/llm/src/protocols/utils/lifecycle.ts rename to packages/ai/src/protocols/utils/lifecycle.ts diff --git a/packages/llm/src/protocols/utils/openai-options.ts b/packages/ai/src/protocols/utils/openai-options.ts similarity index 100% rename from packages/llm/src/protocols/utils/openai-options.ts rename to packages/ai/src/protocols/utils/openai-options.ts diff --git a/packages/llm/src/protocols/utils/tool-schema.ts b/packages/ai/src/protocols/utils/tool-schema.ts similarity index 100% rename from packages/llm/src/protocols/utils/tool-schema.ts rename to packages/ai/src/protocols/utils/tool-schema.ts diff --git a/packages/llm/src/protocols/utils/tool-stream.ts b/packages/ai/src/protocols/utils/tool-stream.ts similarity index 100% rename from packages/llm/src/protocols/utils/tool-stream.ts rename to packages/ai/src/protocols/utils/tool-stream.ts diff --git a/packages/llm/src/provider-error.ts b/packages/ai/src/provider-error.ts similarity index 100% rename from packages/llm/src/provider-error.ts rename to packages/ai/src/provider-error.ts diff --git a/packages/llm/src/provider-package.ts b/packages/ai/src/provider-package.ts similarity index 100% rename from packages/llm/src/provider-package.ts rename to packages/ai/src/provider-package.ts diff --git a/packages/llm/src/provider.ts b/packages/ai/src/provider.ts similarity index 100% rename from packages/llm/src/provider.ts rename to packages/ai/src/provider.ts diff --git a/packages/llm/src/providers/amazon-bedrock.ts b/packages/ai/src/providers/amazon-bedrock.ts similarity index 100% rename from packages/llm/src/providers/amazon-bedrock.ts rename to packages/ai/src/providers/amazon-bedrock.ts diff --git a/packages/llm/src/providers/anthropic-compatible.ts b/packages/ai/src/providers/anthropic-compatible.ts similarity index 100% rename from packages/llm/src/providers/anthropic-compatible.ts rename to packages/ai/src/providers/anthropic-compatible.ts diff --git a/packages/llm/src/providers/anthropic.ts b/packages/ai/src/providers/anthropic.ts similarity index 100% rename from packages/llm/src/providers/anthropic.ts rename to packages/ai/src/providers/anthropic.ts diff --git a/packages/llm/src/providers/azure.ts b/packages/ai/src/providers/azure.ts similarity index 100% rename from packages/llm/src/providers/azure.ts rename to packages/ai/src/providers/azure.ts diff --git a/packages/llm/src/providers/azure/chat.ts b/packages/ai/src/providers/azure/chat.ts similarity index 100% rename from packages/llm/src/providers/azure/chat.ts rename to packages/ai/src/providers/azure/chat.ts diff --git a/packages/llm/src/providers/azure/responses.ts b/packages/ai/src/providers/azure/responses.ts similarity index 100% rename from packages/llm/src/providers/azure/responses.ts rename to packages/ai/src/providers/azure/responses.ts diff --git a/packages/llm/src/providers/cloudflare.ts b/packages/ai/src/providers/cloudflare.ts similarity index 100% rename from packages/llm/src/providers/cloudflare.ts rename to packages/ai/src/providers/cloudflare.ts diff --git a/packages/llm/src/providers/github-copilot.ts b/packages/ai/src/providers/github-copilot.ts similarity index 100% rename from packages/llm/src/providers/github-copilot.ts rename to packages/ai/src/providers/github-copilot.ts diff --git a/packages/llm/src/providers/google-vertex-anthropic.ts b/packages/ai/src/providers/google-vertex-anthropic.ts similarity index 100% rename from packages/llm/src/providers/google-vertex-anthropic.ts rename to packages/ai/src/providers/google-vertex-anthropic.ts diff --git a/packages/llm/src/providers/google-vertex-shared.ts b/packages/ai/src/providers/google-vertex-shared.ts similarity index 100% rename from packages/llm/src/providers/google-vertex-shared.ts rename to packages/ai/src/providers/google-vertex-shared.ts diff --git a/packages/llm/src/providers/google-vertex.ts b/packages/ai/src/providers/google-vertex.ts similarity index 100% rename from packages/llm/src/providers/google-vertex.ts rename to packages/ai/src/providers/google-vertex.ts diff --git a/packages/llm/src/providers/google-vertex/anthropic.ts b/packages/ai/src/providers/google-vertex/anthropic.ts similarity index 100% rename from packages/llm/src/providers/google-vertex/anthropic.ts rename to packages/ai/src/providers/google-vertex/anthropic.ts diff --git a/packages/llm/src/providers/google.ts b/packages/ai/src/providers/google.ts similarity index 100% rename from packages/llm/src/providers/google.ts rename to packages/ai/src/providers/google.ts diff --git a/packages/llm/src/providers/index.ts b/packages/ai/src/providers/index.ts similarity index 100% rename from packages/llm/src/providers/index.ts rename to packages/ai/src/providers/index.ts diff --git a/packages/llm/src/providers/openai-compatible-profile.ts b/packages/ai/src/providers/openai-compatible-profile.ts similarity index 100% rename from packages/llm/src/providers/openai-compatible-profile.ts rename to packages/ai/src/providers/openai-compatible-profile.ts diff --git a/packages/llm/src/providers/openai-compatible-responses.ts b/packages/ai/src/providers/openai-compatible-responses.ts similarity index 100% rename from packages/llm/src/providers/openai-compatible-responses.ts rename to packages/ai/src/providers/openai-compatible-responses.ts diff --git a/packages/llm/src/providers/openai-compatible.ts b/packages/ai/src/providers/openai-compatible.ts similarity index 100% rename from packages/llm/src/providers/openai-compatible.ts rename to packages/ai/src/providers/openai-compatible.ts diff --git a/packages/llm/src/providers/openai-options.ts b/packages/ai/src/providers/openai-options.ts similarity index 100% rename from packages/llm/src/providers/openai-options.ts rename to packages/ai/src/providers/openai-options.ts diff --git a/packages/llm/src/providers/openai.ts b/packages/ai/src/providers/openai.ts similarity index 100% rename from packages/llm/src/providers/openai.ts rename to packages/ai/src/providers/openai.ts diff --git a/packages/llm/src/providers/openai/chat.ts b/packages/ai/src/providers/openai/chat.ts similarity index 100% rename from packages/llm/src/providers/openai/chat.ts rename to packages/ai/src/providers/openai/chat.ts diff --git a/packages/llm/src/providers/openai/responses.ts b/packages/ai/src/providers/openai/responses.ts similarity index 100% rename from packages/llm/src/providers/openai/responses.ts rename to packages/ai/src/providers/openai/responses.ts diff --git a/packages/llm/src/providers/openrouter.ts b/packages/ai/src/providers/openrouter.ts similarity index 100% rename from packages/llm/src/providers/openrouter.ts rename to packages/ai/src/providers/openrouter.ts diff --git a/packages/llm/src/providers/xai.ts b/packages/ai/src/providers/xai.ts similarity index 100% rename from packages/llm/src/providers/xai.ts rename to packages/ai/src/providers/xai.ts diff --git a/packages/llm/src/route/auth-options.ts b/packages/ai/src/route/auth-options.ts similarity index 100% rename from packages/llm/src/route/auth-options.ts rename to packages/ai/src/route/auth-options.ts diff --git a/packages/llm/src/route/auth.ts b/packages/ai/src/route/auth.ts similarity index 100% rename from packages/llm/src/route/auth.ts rename to packages/ai/src/route/auth.ts diff --git a/packages/llm/src/route/client.ts b/packages/ai/src/route/client.ts similarity index 100% rename from packages/llm/src/route/client.ts rename to packages/ai/src/route/client.ts diff --git a/packages/llm/src/route/endpoint.ts b/packages/ai/src/route/endpoint.ts similarity index 100% rename from packages/llm/src/route/endpoint.ts rename to packages/ai/src/route/endpoint.ts diff --git a/packages/llm/src/route/executor.ts b/packages/ai/src/route/executor.ts similarity index 100% rename from packages/llm/src/route/executor.ts rename to packages/ai/src/route/executor.ts diff --git a/packages/llm/src/route/framing.ts b/packages/ai/src/route/framing.ts similarity index 100% rename from packages/llm/src/route/framing.ts rename to packages/ai/src/route/framing.ts diff --git a/packages/llm/src/route/index.ts b/packages/ai/src/route/index.ts similarity index 100% rename from packages/llm/src/route/index.ts rename to packages/ai/src/route/index.ts diff --git a/packages/llm/src/route/protocol.ts b/packages/ai/src/route/protocol.ts similarity index 100% rename from packages/llm/src/route/protocol.ts rename to packages/ai/src/route/protocol.ts diff --git a/packages/llm/src/route/transport/http.ts b/packages/ai/src/route/transport/http.ts similarity index 100% rename from packages/llm/src/route/transport/http.ts rename to packages/ai/src/route/transport/http.ts diff --git a/packages/llm/src/route/transport/index.ts b/packages/ai/src/route/transport/index.ts similarity index 100% rename from packages/llm/src/route/transport/index.ts rename to packages/ai/src/route/transport/index.ts diff --git a/packages/llm/src/route/transport/websocket.ts b/packages/ai/src/route/transport/websocket.ts similarity index 100% rename from packages/llm/src/route/transport/websocket.ts rename to packages/ai/src/route/transport/websocket.ts diff --git a/packages/llm/src/schema/errors.ts b/packages/ai/src/schema/errors.ts similarity index 100% rename from packages/llm/src/schema/errors.ts rename to packages/ai/src/schema/errors.ts diff --git a/packages/llm/src/schema/events.ts b/packages/ai/src/schema/events.ts similarity index 100% rename from packages/llm/src/schema/events.ts rename to packages/ai/src/schema/events.ts diff --git a/packages/llm/src/schema/ids.ts b/packages/ai/src/schema/ids.ts similarity index 100% rename from packages/llm/src/schema/ids.ts rename to packages/ai/src/schema/ids.ts diff --git a/packages/llm/src/schema/index.ts b/packages/ai/src/schema/index.ts similarity index 100% rename from packages/llm/src/schema/index.ts rename to packages/ai/src/schema/index.ts diff --git a/packages/llm/src/schema/messages.ts b/packages/ai/src/schema/messages.ts similarity index 100% rename from packages/llm/src/schema/messages.ts rename to packages/ai/src/schema/messages.ts diff --git a/packages/llm/src/schema/options.ts b/packages/ai/src/schema/options.ts similarity index 100% rename from packages/llm/src/schema/options.ts rename to packages/ai/src/schema/options.ts diff --git a/packages/llm/src/tool-runtime.ts b/packages/ai/src/tool-runtime.ts similarity index 100% rename from packages/llm/src/tool-runtime.ts rename to packages/ai/src/tool-runtime.ts diff --git a/packages/llm/src/tool.ts b/packages/ai/src/tool.ts similarity index 100% rename from packages/llm/src/tool.ts rename to packages/ai/src/tool.ts diff --git a/packages/llm/src/utils/record.ts b/packages/ai/src/utils/record.ts similarity index 100% rename from packages/llm/src/utils/record.ts rename to packages/ai/src/utils/record.ts diff --git a/packages/llm/sst-env.d.ts b/packages/ai/sst-env.d.ts similarity index 100% rename from packages/llm/sst-env.d.ts rename to packages/ai/sst-env.d.ts diff --git a/packages/llm/test/adapter.test.ts b/packages/ai/test/adapter.test.ts similarity index 100% rename from packages/llm/test/adapter.test.ts rename to packages/ai/test/adapter.test.ts diff --git a/packages/llm/test/auth-options.types.ts b/packages/ai/test/auth-options.types.ts similarity index 100% rename from packages/llm/test/auth-options.types.ts rename to packages/ai/test/auth-options.types.ts diff --git a/packages/llm/test/auth.test.ts b/packages/ai/test/auth.test.ts similarity index 100% rename from packages/llm/test/auth.test.ts rename to packages/ai/test/auth.test.ts diff --git a/packages/llm/test/cache-policy.test.ts b/packages/ai/test/cache-policy.test.ts similarity index 100% rename from packages/llm/test/cache-policy.test.ts rename to packages/ai/test/cache-policy.test.ts diff --git a/packages/llm/test/continuation-scenarios.ts b/packages/ai/test/continuation-scenarios.ts similarity index 100% rename from packages/llm/test/continuation-scenarios.ts rename to packages/ai/test/continuation-scenarios.ts diff --git a/packages/llm/test/endpoint.test.ts b/packages/ai/test/endpoint.test.ts similarity index 100% rename from packages/llm/test/endpoint.test.ts rename to packages/ai/test/endpoint.test.ts diff --git a/packages/llm/test/executor.test.ts b/packages/ai/test/executor.test.ts similarity index 100% rename from packages/llm/test/executor.test.ts rename to packages/ai/test/executor.test.ts diff --git a/packages/llm/test/exports.test.ts b/packages/ai/test/exports.test.ts similarity index 88% rename from packages/llm/test/exports.test.ts rename to packages/ai/test/exports.test.ts index 0ac6eb9bf2..c4e32d6601 100644 --- a/packages/llm/test/exports.test.ts +++ b/packages/ai/test/exports.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" -import { LLM, LLMClient, Provider } from "@opencode-ai/llm" -import { Route, Protocol } from "@opencode-ai/llm/route" -import { Provider as ProviderSubpath } from "@opencode-ai/llm/provider" +import { LLM, LLMClient, Provider } from "@opencode-ai/ai" +import { Route, Protocol } from "@opencode-ai/ai/route" +import { Provider as ProviderSubpath } from "@opencode-ai/ai/provider" import { CloudflareAIGateway, CloudflareWorkersAI, @@ -9,15 +9,15 @@ import { OpenAICompatible, OpenRouter, XAI, -} from "@opencode-ai/llm/providers" -import * as GitHubCopilot from "@opencode-ai/llm/providers/github-copilot" +} from "@opencode-ai/ai/providers" +import * as GitHubCopilot from "@opencode-ai/ai/providers/github-copilot" import { OpenAIChat, OpenAICompatibleChat, OpenAICompatibleResponses, OpenAIResponses, -} from "@opencode-ai/llm/protocols" -import * as AnthropicMessages from "@opencode-ai/llm/protocols/anthropic-messages" +} from "@opencode-ai/ai/protocols" +import * as AnthropicMessages from "@opencode-ai/ai/protocols/anthropic-messages" describe("public exports", () => { test("root exposes app-facing runtime APIs", () => { @@ -34,7 +34,7 @@ describe("public exports", () => { }) test("provider barrels expose user-facing facades", async () => { - const { OpenAICompatibleResponses } = await import("@opencode-ai/llm/providers") + const { OpenAICompatibleResponses } = await import("@opencode-ai/ai/providers") expect(OpenAI.model).toBeFunction() expect(OpenAI.provider.responses).toBe(OpenAI.responses) diff --git a/packages/llm/test/fixtures/media/restroom.png b/packages/ai/test/fixtures/media/restroom.png similarity index 100% rename from packages/llm/test/fixtures/media/restroom.png rename to packages/ai/test/fixtures/media/restroom.png diff --git a/packages/llm/test/fixtures/recordings/anthropic-messages-cache/writes-then-reads-cache-control-on-identical-second-call.json b/packages/ai/test/fixtures/recordings/anthropic-messages-cache/writes-then-reads-cache-control-on-identical-second-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/anthropic-messages-cache/writes-then-reads-cache-control-on-identical-second-call.json rename to packages/ai/test/fixtures/recordings/anthropic-messages-cache/writes-then-reads-cache-control-on-identical-second-call.json diff --git a/packages/llm/test/fixtures/recordings/anthropic-messages/accepts-malformed-assistant-tool-order-with-default-patch.json b/packages/ai/test/fixtures/recordings/anthropic-messages/accepts-malformed-assistant-tool-order-with-default-patch.json similarity index 100% rename from packages/llm/test/fixtures/recordings/anthropic-messages/accepts-malformed-assistant-tool-order-with-default-patch.json rename to packages/ai/test/fixtures/recordings/anthropic-messages/accepts-malformed-assistant-tool-order-with-default-patch.json diff --git a/packages/llm/test/fixtures/recordings/anthropic-messages/anthropic-opus-4-7-image-tool-result.json b/packages/ai/test/fixtures/recordings/anthropic-messages/anthropic-opus-4-7-image-tool-result.json similarity index 100% rename from packages/llm/test/fixtures/recordings/anthropic-messages/anthropic-opus-4-7-image-tool-result.json rename to packages/ai/test/fixtures/recordings/anthropic-messages/anthropic-opus-4-7-image-tool-result.json diff --git a/packages/llm/test/fixtures/recordings/anthropic-messages/claude-opus-4-7-drives-a-tool-loop.json b/packages/ai/test/fixtures/recordings/anthropic-messages/claude-opus-4-7-drives-a-tool-loop.json similarity index 100% rename from packages/llm/test/fixtures/recordings/anthropic-messages/claude-opus-4-7-drives-a-tool-loop.json rename to packages/ai/test/fixtures/recordings/anthropic-messages/claude-opus-4-7-drives-a-tool-loop.json diff --git a/packages/llm/test/fixtures/recordings/anthropic-messages/rejects-malformed-assistant-tool-order-without-patch.json b/packages/ai/test/fixtures/recordings/anthropic-messages/rejects-malformed-assistant-tool-order-without-patch.json similarity index 100% rename from packages/llm/test/fixtures/recordings/anthropic-messages/rejects-malformed-assistant-tool-order-without-patch.json rename to packages/ai/test/fixtures/recordings/anthropic-messages/rejects-malformed-assistant-tool-order-without-patch.json diff --git a/packages/llm/test/fixtures/recordings/anthropic-messages/streams-text.json b/packages/ai/test/fixtures/recordings/anthropic-messages/streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/anthropic-messages/streams-text.json rename to packages/ai/test/fixtures/recordings/anthropic-messages/streams-text.json diff --git a/packages/llm/test/fixtures/recordings/anthropic-messages/streams-tool-call.json b/packages/ai/test/fixtures/recordings/anthropic-messages/streams-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/anthropic-messages/streams-tool-call.json rename to packages/ai/test/fixtures/recordings/anthropic-messages/streams-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/bedrock-converse/drives-a-tool-loop.json b/packages/ai/test/fixtures/recordings/bedrock-converse/drives-a-tool-loop.json similarity index 100% rename from packages/llm/test/fixtures/recordings/bedrock-converse/drives-a-tool-loop.json rename to packages/ai/test/fixtures/recordings/bedrock-converse/drives-a-tool-loop.json diff --git a/packages/llm/test/fixtures/recordings/bedrock-converse/streams-a-tool-call.json b/packages/ai/test/fixtures/recordings/bedrock-converse/streams-a-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/bedrock-converse/streams-a-tool-call.json rename to packages/ai/test/fixtures/recordings/bedrock-converse/streams-a-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/bedrock-converse/streams-text.json b/packages/ai/test/fixtures/recordings/bedrock-converse/streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/bedrock-converse/streams-text.json rename to packages/ai/test/fixtures/recordings/bedrock-converse/streams-text.json diff --git a/packages/llm/test/fixtures/recordings/cloudflare-ai-gateway/cloudflare-ai-gateway-workers-ai-gpt-oss-20b-tools-tool-call.json b/packages/ai/test/fixtures/recordings/cloudflare-ai-gateway/cloudflare-ai-gateway-workers-ai-gpt-oss-20b-tools-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/cloudflare-ai-gateway/cloudflare-ai-gateway-workers-ai-gpt-oss-20b-tools-tool-call.json rename to packages/ai/test/fixtures/recordings/cloudflare-ai-gateway/cloudflare-ai-gateway-workers-ai-gpt-oss-20b-tools-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/cloudflare-ai-gateway/cloudflare-ai-gateway-workers-ai-llama-3-1-8b-text.json b/packages/ai/test/fixtures/recordings/cloudflare-ai-gateway/cloudflare-ai-gateway-workers-ai-llama-3-1-8b-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/cloudflare-ai-gateway/cloudflare-ai-gateway-workers-ai-llama-3-1-8b-text.json rename to packages/ai/test/fixtures/recordings/cloudflare-ai-gateway/cloudflare-ai-gateway-workers-ai-llama-3-1-8b-text.json diff --git a/packages/llm/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-gpt-oss-20b-tools-tool-call.json b/packages/ai/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-gpt-oss-20b-tools-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-gpt-oss-20b-tools-tool-call.json rename to packages/ai/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-gpt-oss-20b-tools-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-llama-3-1-8b-text.json b/packages/ai/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-llama-3-1-8b-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-llama-3-1-8b-text.json rename to packages/ai/test/fixtures/recordings/cloudflare-workers-ai/cloudflare-workers-ai-llama-3-1-8b-text.json diff --git a/packages/llm/test/fixtures/recordings/gemini-cache/reports-cachedcontenttokencount-on-identical-second-call.json b/packages/ai/test/fixtures/recordings/gemini-cache/reports-cachedcontenttokencount-on-identical-second-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/gemini-cache/reports-cachedcontenttokencount-on-identical-second-call.json rename to packages/ai/test/fixtures/recordings/gemini-cache/reports-cachedcontenttokencount-on-identical-second-call.json diff --git a/packages/llm/test/fixtures/recordings/gemini/gemini-2-5-flash-image.json b/packages/ai/test/fixtures/recordings/gemini/gemini-2-5-flash-image.json similarity index 100% rename from packages/llm/test/fixtures/recordings/gemini/gemini-2-5-flash-image.json rename to packages/ai/test/fixtures/recordings/gemini/gemini-2-5-flash-image.json diff --git a/packages/llm/test/fixtures/recordings/gemini/streams-text.json b/packages/ai/test/fixtures/recordings/gemini/streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/gemini/streams-text.json rename to packages/ai/test/fixtures/recordings/gemini/streams-text.json diff --git a/packages/llm/test/fixtures/recordings/gemini/streams-tool-call.json b/packages/ai/test/fixtures/recordings/gemini/streams-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/gemini/streams-tool-call.json rename to packages/ai/test/fixtures/recordings/gemini/streams-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/openai-chat/continues-after-tool-result.json b/packages/ai/test/fixtures/recordings/openai-chat/continues-after-tool-result.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-chat/continues-after-tool-result.json rename to packages/ai/test/fixtures/recordings/openai-chat/continues-after-tool-result.json diff --git a/packages/llm/test/fixtures/recordings/openai-chat/drives-a-tool-loop-end-to-end.json b/packages/ai/test/fixtures/recordings/openai-chat/drives-a-tool-loop-end-to-end.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-chat/drives-a-tool-loop-end-to-end.json rename to packages/ai/test/fixtures/recordings/openai-chat/drives-a-tool-loop-end-to-end.json diff --git a/packages/llm/test/fixtures/recordings/openai-chat/streams-text.json b/packages/ai/test/fixtures/recordings/openai-chat/streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-chat/streams-text.json rename to packages/ai/test/fixtures/recordings/openai-chat/streams-text.json diff --git a/packages/llm/test/fixtures/recordings/openai-chat/streams-tool-call.json b/packages/ai/test/fixtures/recordings/openai-chat/streams-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-chat/streams-tool-call.json rename to packages/ai/test/fixtures/recordings/openai-chat/streams-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/deepseek-streams-text.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/deepseek-streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/deepseek-streams-text.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/deepseek-streams-text.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/groq-llama-3-3-70b-drives-a-tool-loop.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/groq-llama-3-3-70b-drives-a-tool-loop.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/groq-llama-3-3-70b-drives-a-tool-loop.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/groq-llama-3-3-70b-drives-a-tool-loop.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/groq-streams-text.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/groq-streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/groq-streams-text.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/groq-streams-text.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/groq-streams-tool-call.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/groq-streams-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/groq-streams-tool-call.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/groq-streams-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-claude-opus-4-7-drives-a-tool-loop.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-claude-opus-4-7-drives-a-tool-loop.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-claude-opus-4-7-drives-a-tool-loop.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-claude-opus-4-7-drives-a-tool-loop.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-gpt-4o-mini-drives-a-tool-loop.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-gpt-4o-mini-drives-a-tool-loop.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-gpt-4o-mini-drives-a-tool-loop.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-gpt-4o-mini-drives-a-tool-loop.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-gpt-5-5-drives-a-tool-loop.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-gpt-5-5-drives-a-tool-loop.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-gpt-5-5-drives-a-tool-loop.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-gpt-5-5-drives-a-tool-loop.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-streams-text.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-streams-text.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-streams-text.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-streams-tool-call.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-streams-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/openrouter-streams-tool-call.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/openrouter-streams-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/togetherai-streams-text.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/togetherai-streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/togetherai-streams-text.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/togetherai-streams-text.json diff --git a/packages/llm/test/fixtures/recordings/openai-compatible-chat/togetherai-streams-tool-call.json b/packages/ai/test/fixtures/recordings/openai-compatible-chat/togetherai-streams-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-compatible-chat/togetherai-streams-tool-call.json rename to packages/ai/test/fixtures/recordings/openai-compatible-chat/togetherai-streams-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/openai-responses-cache/reports-cached-tokens-on-identical-second-call.json b/packages/ai/test/fixtures/recordings/openai-responses-cache/reports-cached-tokens-on-identical-second-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-responses-cache/reports-cached-tokens-on-identical-second-call.json rename to packages/ai/test/fixtures/recordings/openai-responses-cache/reports-cached-tokens-on-identical-second-call.json diff --git a/packages/llm/test/fixtures/recordings/openai-responses/gpt-5-5-drives-a-tool-loop.json b/packages/ai/test/fixtures/recordings/openai-responses/gpt-5-5-drives-a-tool-loop.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-responses/gpt-5-5-drives-a-tool-loop.json rename to packages/ai/test/fixtures/recordings/openai-responses/gpt-5-5-drives-a-tool-loop.json diff --git a/packages/llm/test/fixtures/recordings/openai-responses/gpt-5-5-streams-text.json b/packages/ai/test/fixtures/recordings/openai-responses/gpt-5-5-streams-text.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-responses/gpt-5-5-streams-text.json rename to packages/ai/test/fixtures/recordings/openai-responses/gpt-5-5-streams-text.json diff --git a/packages/llm/test/fixtures/recordings/openai-responses/gpt-5-5-streams-tool-call.json b/packages/ai/test/fixtures/recordings/openai-responses/gpt-5-5-streams-tool-call.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-responses/gpt-5-5-streams-tool-call.json rename to packages/ai/test/fixtures/recordings/openai-responses/gpt-5-5-streams-tool-call.json diff --git a/packages/llm/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-image-tool-result.json b/packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-image-tool-result.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-image-tool-result.json rename to packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-image-tool-result.json diff --git a/packages/llm/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-reasoning-continuation.json b/packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-reasoning-continuation.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-reasoning-continuation.json rename to packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-reasoning-continuation.json diff --git a/packages/llm/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-reasoning.json b/packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-reasoning.json similarity index 100% rename from packages/llm/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-reasoning.json rename to packages/ai/test/fixtures/recordings/openai-responses/openai-responses-gpt-5-5-reasoning.json diff --git a/packages/llm/test/generate-object.test.ts b/packages/ai/test/generate-object.test.ts similarity index 100% rename from packages/llm/test/generate-object.test.ts rename to packages/ai/test/generate-object.test.ts diff --git a/packages/llm/test/lib/effect.ts b/packages/ai/test/lib/effect.ts similarity index 100% rename from packages/llm/test/lib/effect.ts rename to packages/ai/test/lib/effect.ts diff --git a/packages/llm/test/lib/http.ts b/packages/ai/test/lib/http.ts similarity index 100% rename from packages/llm/test/lib/http.ts rename to packages/ai/test/lib/http.ts diff --git a/packages/llm/test/lib/openai-chunks.ts b/packages/ai/test/lib/openai-chunks.ts similarity index 100% rename from packages/llm/test/lib/openai-chunks.ts rename to packages/ai/test/lib/openai-chunks.ts diff --git a/packages/llm/test/lib/sse.ts b/packages/ai/test/lib/sse.ts similarity index 100% rename from packages/llm/test/lib/sse.ts rename to packages/ai/test/lib/sse.ts diff --git a/packages/llm/test/lib/tool-runtime.ts b/packages/ai/test/lib/tool-runtime.ts similarity index 100% rename from packages/llm/test/lib/tool-runtime.ts rename to packages/ai/test/lib/tool-runtime.ts diff --git a/packages/llm/test/llm.test.ts b/packages/ai/test/llm.test.ts similarity index 100% rename from packages/llm/test/llm.test.ts rename to packages/ai/test/llm.test.ts diff --git a/packages/llm/test/prepare.test.ts b/packages/ai/test/prepare.test.ts similarity index 100% rename from packages/llm/test/prepare.test.ts rename to packages/ai/test/prepare.test.ts diff --git a/packages/llm/test/provider-error.test.ts b/packages/ai/test/provider-error.test.ts similarity index 100% rename from packages/llm/test/provider-error.test.ts rename to packages/ai/test/provider-error.test.ts diff --git a/packages/llm/test/provider-package.test.ts b/packages/ai/test/provider-package.test.ts similarity index 82% rename from packages/llm/test/provider-package.test.ts rename to packages/ai/test/provider-package.test.ts index cd44f3eb32..2ddcb5e0d1 100644 --- a/packages/llm/test/provider-package.test.ts +++ b/packages/ai/test/provider-package.test.ts @@ -1,23 +1,23 @@ import { describe, expect, test } from "bun:test" -import { model } from "@opencode-ai/llm/providers/openai" +import { model } from "@opencode-ai/ai/providers/openai" describe("provider package entrypoints", () => { test("semantic API aliases expose the same contract", async () => { const modules = await Promise.all([ - import("@opencode-ai/llm/providers/openai"), - import("@opencode-ai/llm/providers/openai/responses"), - import("@opencode-ai/llm/providers/openai/chat"), - import("@opencode-ai/llm/providers/anthropic"), - import("@opencode-ai/llm/providers/anthropic-compatible"), - import("@opencode-ai/llm/providers/openai-compatible"), - import("@opencode-ai/llm/providers/openai-compatible/responses"), - import("@opencode-ai/llm/providers/amazon-bedrock"), - import("@opencode-ai/llm/providers/azure"), - import("@opencode-ai/llm/providers/azure/responses"), - import("@opencode-ai/llm/providers/azure/chat"), - import("@opencode-ai/llm/providers/google"), - import("@opencode-ai/llm/providers/google-vertex"), - import("@opencode-ai/llm/providers/google-vertex/anthropic"), + import("@opencode-ai/ai/providers/openai"), + import("@opencode-ai/ai/providers/openai/responses"), + import("@opencode-ai/ai/providers/openai/chat"), + import("@opencode-ai/ai/providers/anthropic"), + import("@opencode-ai/ai/providers/anthropic-compatible"), + import("@opencode-ai/ai/providers/openai-compatible"), + import("@opencode-ai/ai/providers/openai-compatible/responses"), + import("@opencode-ai/ai/providers/amazon-bedrock"), + import("@opencode-ai/ai/providers/azure"), + import("@opencode-ai/ai/providers/azure/responses"), + import("@opencode-ai/ai/providers/azure/chat"), + import("@opencode-ai/ai/providers/google"), + import("@opencode-ai/ai/providers/google-vertex"), + import("@opencode-ai/ai/providers/google-vertex/anthropic"), ]) for (const module of modules) expect(module.model).toBeFunction() @@ -47,7 +47,7 @@ describe("provider package entrypoints", () => { }) test("maps OpenAI-compatible Responses settings onto the executable model", async () => { - const OpenAICompatibleResponses = await import("@opencode-ai/llm/providers/openai-compatible/responses") + const OpenAICompatibleResponses = await import("@opencode-ai/ai/providers/openai-compatible/responses") const selected = OpenAICompatibleResponses.model("custom-model", { apiKey: "fixture", baseURL: "https://responses.example.test/v1", @@ -73,7 +73,7 @@ describe("provider package entrypoints", () => { }) test("maps Anthropic-compatible settings onto the executable model", async () => { - const AnthropicCompatible = await import("@opencode-ai/llm/providers/anthropic-compatible") + const AnthropicCompatible = await import("@opencode-ai/ai/providers/anthropic-compatible") const selected = AnthropicCompatible.model("compatible-model", { apiKey: "fixture", baseURL: "https://messages.example.test/v1", @@ -95,15 +95,15 @@ describe("provider package entrypoints", () => { }) test("requires an Anthropic-compatible base URL at runtime", async () => { - const AnthropicCompatible = await import("@opencode-ai/llm/providers/anthropic-compatible") + const AnthropicCompatible = await import("@opencode-ai/ai/providers/anthropic-compatible") expect(() => Reflect.apply(AnthropicCompatible.model, undefined, ["compatible-model", { apiKey: "fixture" }]), ).toThrow("Anthropic-compatible providers require a baseURL") }) test("rejects conflicting Anthropic-compatible auth settings at runtime", async () => { - const Anthropic = await import("@opencode-ai/llm/providers/anthropic") - const AnthropicCompatible = await import("@opencode-ai/llm/providers/anthropic-compatible") + const Anthropic = await import("@opencode-ai/ai/providers/anthropic") + const AnthropicCompatible = await import("@opencode-ai/ai/providers/anthropic-compatible") expect(() => Reflect.apply(AnthropicCompatible.model, undefined, [ "compatible-model", @@ -133,9 +133,9 @@ describe("provider package entrypoints", () => { }) test("selects Azure API entrypoints with the same model contract", async () => { - const Azure = await import("@opencode-ai/llm/providers/azure") - const AzureChat = await import("@opencode-ai/llm/providers/azure/chat") - const AzureResponses = await import("@opencode-ai/llm/providers/azure/responses") + const Azure = await import("@opencode-ai/ai/providers/azure") + const AzureChat = await import("@opencode-ai/ai/providers/azure/chat") + const AzureResponses = await import("@opencode-ai/ai/providers/azure/responses") const settings = { apiKey: "fixture", resourceName: "opencode-test", @@ -157,7 +157,7 @@ describe("provider package entrypoints", () => { }) test("maps Google package settings onto the Gemini model", async () => { - const Google = await import("@opencode-ai/llm/providers/google") + const Google = await import("@opencode-ai/ai/providers/google") const selected = Google.model("gemini-2.5-flash", { apiKey: "fixture", baseURL: "https://generativelanguage.test/v1beta", @@ -178,8 +178,8 @@ describe("provider package entrypoints", () => { }) test("selects Vertex entrypoints with the same model contract", async () => { - const GoogleVertex = await import("@opencode-ai/llm/providers/google-vertex") - const GoogleVertexAnthropic = await import("@opencode-ai/llm/providers/google-vertex/anthropic") + const GoogleVertex = await import("@opencode-ai/ai/providers/google-vertex") + const GoogleVertexAnthropic = await import("@opencode-ai/ai/providers/google-vertex/anthropic") const gemini = GoogleVertex.model("gemini-3.5-flash", { apiKey: "fixture", headers: { "x-application": "opencode" }, @@ -211,9 +211,9 @@ describe("provider package entrypoints", () => { }) test("rejects conflicting Vertex auth settings at runtime", async () => { - const GoogleVertex = await import("@opencode-ai/llm/providers/google-vertex") - const GoogleVertexAnthropic = await import("@opencode-ai/llm/providers/google-vertex/anthropic") - const Providers = await import("@opencode-ai/llm/providers") + const GoogleVertex = await import("@opencode-ai/ai/providers/google-vertex") + const GoogleVertexAnthropic = await import("@opencode-ai/ai/providers/google-vertex/anthropic") + const Providers = await import("@opencode-ai/ai/providers") expect(() => Reflect.apply(GoogleVertex.model, undefined, [ "gemini-3.5-flash", diff --git a/packages/llm/test/provider.types.ts b/packages/ai/test/provider.types.ts similarity index 100% rename from packages/llm/test/provider.types.ts rename to packages/ai/test/provider.types.ts diff --git a/packages/llm/test/provider/anthropic-messages-cache.recorded.test.ts b/packages/ai/test/provider/anthropic-messages-cache.recorded.test.ts similarity index 100% rename from packages/llm/test/provider/anthropic-messages-cache.recorded.test.ts rename to packages/ai/test/provider/anthropic-messages-cache.recorded.test.ts diff --git a/packages/llm/test/provider/anthropic-messages.recorded.test.ts b/packages/ai/test/provider/anthropic-messages.recorded.test.ts similarity index 100% rename from packages/llm/test/provider/anthropic-messages.recorded.test.ts rename to packages/ai/test/provider/anthropic-messages.recorded.test.ts diff --git a/packages/llm/test/provider/anthropic-messages.test.ts b/packages/ai/test/provider/anthropic-messages.test.ts similarity index 100% rename from packages/llm/test/provider/anthropic-messages.test.ts rename to packages/ai/test/provider/anthropic-messages.test.ts diff --git a/packages/llm/test/provider/bedrock-converse-cache.recorded.test.ts b/packages/ai/test/provider/bedrock-converse-cache.recorded.test.ts similarity index 100% rename from packages/llm/test/provider/bedrock-converse-cache.recorded.test.ts rename to packages/ai/test/provider/bedrock-converse-cache.recorded.test.ts diff --git a/packages/llm/test/provider/bedrock-converse.test.ts b/packages/ai/test/provider/bedrock-converse.test.ts similarity index 100% rename from packages/llm/test/provider/bedrock-converse.test.ts rename to packages/ai/test/provider/bedrock-converse.test.ts diff --git a/packages/llm/test/provider/cloudflare.test.ts b/packages/ai/test/provider/cloudflare.test.ts similarity index 100% rename from packages/llm/test/provider/cloudflare.test.ts rename to packages/ai/test/provider/cloudflare.test.ts diff --git a/packages/llm/test/provider/gemini-cache.recorded.test.ts b/packages/ai/test/provider/gemini-cache.recorded.test.ts similarity index 100% rename from packages/llm/test/provider/gemini-cache.recorded.test.ts rename to packages/ai/test/provider/gemini-cache.recorded.test.ts diff --git a/packages/llm/test/provider/gemini.test.ts b/packages/ai/test/provider/gemini.test.ts similarity index 100% rename from packages/llm/test/provider/gemini.test.ts rename to packages/ai/test/provider/gemini.test.ts diff --git a/packages/llm/test/provider/golden.recorded.test.ts b/packages/ai/test/provider/golden.recorded.test.ts similarity index 100% rename from packages/llm/test/provider/golden.recorded.test.ts rename to packages/ai/test/provider/golden.recorded.test.ts diff --git a/packages/llm/test/provider/google-vertex.test.ts b/packages/ai/test/provider/google-vertex.test.ts similarity index 100% rename from packages/llm/test/provider/google-vertex.test.ts rename to packages/ai/test/provider/google-vertex.test.ts diff --git a/packages/llm/test/provider/openai-chat.test.ts b/packages/ai/test/provider/openai-chat.test.ts similarity index 100% rename from packages/llm/test/provider/openai-chat.test.ts rename to packages/ai/test/provider/openai-chat.test.ts diff --git a/packages/llm/test/provider/openai-compatible-chat.test.ts b/packages/ai/test/provider/openai-compatible-chat.test.ts similarity index 100% rename from packages/llm/test/provider/openai-compatible-chat.test.ts rename to packages/ai/test/provider/openai-compatible-chat.test.ts diff --git a/packages/llm/test/provider/openai-compatible-responses.test.ts b/packages/ai/test/provider/openai-compatible-responses.test.ts similarity index 100% rename from packages/llm/test/provider/openai-compatible-responses.test.ts rename to packages/ai/test/provider/openai-compatible-responses.test.ts diff --git a/packages/llm/test/provider/openai-responses-cache.recorded.test.ts b/packages/ai/test/provider/openai-responses-cache.recorded.test.ts similarity index 100% rename from packages/llm/test/provider/openai-responses-cache.recorded.test.ts rename to packages/ai/test/provider/openai-responses-cache.recorded.test.ts diff --git a/packages/llm/test/provider/openai-responses.test.ts b/packages/ai/test/provider/openai-responses.test.ts similarity index 100% rename from packages/llm/test/provider/openai-responses.test.ts rename to packages/ai/test/provider/openai-responses.test.ts diff --git a/packages/llm/test/provider/openrouter.test.ts b/packages/ai/test/provider/openrouter.test.ts similarity index 100% rename from packages/llm/test/provider/openrouter.test.ts rename to packages/ai/test/provider/openrouter.test.ts diff --git a/packages/llm/test/recorded-golden.ts b/packages/ai/test/recorded-golden.ts similarity index 100% rename from packages/llm/test/recorded-golden.ts rename to packages/ai/test/recorded-golden.ts diff --git a/packages/llm/test/recorded-runner.ts b/packages/ai/test/recorded-runner.ts similarity index 100% rename from packages/llm/test/recorded-runner.ts rename to packages/ai/test/recorded-runner.ts diff --git a/packages/llm/test/recorded-scenarios.ts b/packages/ai/test/recorded-scenarios.ts similarity index 100% rename from packages/llm/test/recorded-scenarios.ts rename to packages/ai/test/recorded-scenarios.ts diff --git a/packages/llm/test/recorded-test.ts b/packages/ai/test/recorded-test.ts similarity index 100% rename from packages/llm/test/recorded-test.ts rename to packages/ai/test/recorded-test.ts diff --git a/packages/llm/test/recorded-utils.ts b/packages/ai/test/recorded-utils.ts similarity index 100% rename from packages/llm/test/recorded-utils.ts rename to packages/ai/test/recorded-utils.ts diff --git a/packages/llm/test/response.test.ts b/packages/ai/test/response.test.ts similarity index 100% rename from packages/llm/test/response.test.ts rename to packages/ai/test/response.test.ts diff --git a/packages/llm/test/route.test.ts b/packages/ai/test/route.test.ts similarity index 100% rename from packages/llm/test/route.test.ts rename to packages/ai/test/route.test.ts diff --git a/packages/llm/test/schema.test.ts b/packages/ai/test/schema.test.ts similarity index 100% rename from packages/llm/test/schema.test.ts rename to packages/ai/test/schema.test.ts diff --git a/packages/llm/test/tool-runtime.test.ts b/packages/ai/test/tool-runtime.test.ts similarity index 100% rename from packages/llm/test/tool-runtime.test.ts rename to packages/ai/test/tool-runtime.test.ts diff --git a/packages/llm/test/tool-schema-projection.test.ts b/packages/ai/test/tool-schema-projection.test.ts similarity index 100% rename from packages/llm/test/tool-schema-projection.test.ts rename to packages/ai/test/tool-schema-projection.test.ts diff --git a/packages/llm/test/tool-stream.test.ts b/packages/ai/test/tool-stream.test.ts similarity index 100% rename from packages/llm/test/tool-stream.test.ts rename to packages/ai/test/tool-stream.test.ts diff --git a/packages/llm/test/tool.types.ts b/packages/ai/test/tool.types.ts similarity index 100% rename from packages/llm/test/tool.types.ts rename to packages/ai/test/tool.types.ts diff --git a/packages/llm/tsconfig.json b/packages/ai/tsconfig.json similarity index 100% rename from packages/llm/tsconfig.json rename to packages/ai/tsconfig.json diff --git a/packages/core/package.json b/packages/core/package.json index 374eb40f4d..cf6a25774d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -93,7 +93,7 @@ "@opencode-ai/codemode": "workspace:*", "@opencode-ai/effect-drizzle-sqlite": "workspace:*", "@opencode-ai/effect-sqlite-node": "workspace:*", - "@opencode-ai/llm": "workspace:*", + "@opencode-ai/ai": "workspace:*", "@opencode-ai/schema": "workspace:*", "@opencode-ai/plugin": "workspace:*", "@opentelemetry/api": "1.9.0", diff --git a/packages/core/src/aisdk.ts b/packages/core/src/aisdk.ts index b512b6d12f..4ecda81b9e 100644 --- a/packages/core/src/aisdk.ts +++ b/packages/core/src/aisdk.ts @@ -28,8 +28,8 @@ import { type LLMRequest, type ToolDefinition, type UsageInput, -} from "@opencode-ai/llm" -import { Auth, Endpoint, type AnyRoute } from "@opencode-ai/llm/route" +} from "@opencode-ai/ai" +import { Auth, Endpoint, type AnyRoute } from "@opencode-ai/ai/route" import { Cause, Context, Effect, Layer, Option, Schema, Scope, Stream } from "effect" import { ModelV2 } from "./model" import { ProviderV2 } from "./provider" diff --git a/packages/core/src/effect/app-node-platform.ts b/packages/core/src/effect/app-node-platform.ts index adba0eb9cc..23b221d178 100644 --- a/packages/core/src/effect/app-node-platform.ts +++ b/packages/core/src/effect/app-node-platform.ts @@ -1,5 +1,5 @@ import { NodeFileSystem, NodePath } from "@effect/platform-node" -import { LLMClient, RequestExecutor } from "@opencode-ai/llm/route" +import { LLMClient, RequestExecutor } from "@opencode-ai/ai/route" import { FileSystem, Path } from "effect" import { FetchHttpClient } from "effect/unstable/http" import { HttpClient } from "effect/unstable/http" diff --git a/packages/core/src/generate.ts b/packages/core/src/generate.ts index 81c2a0f495..3dbc86dc62 100644 --- a/packages/core/src/generate.ts +++ b/packages/core/src/generate.ts @@ -1,6 +1,6 @@ export * as Generate from "./generate" -import { LLM, LLMClient, LLMError } from "@opencode-ai/llm" +import { LLM, LLMClient, LLMError } from "@opencode-ai/ai" import { Context, Effect, Layer, Schema } from "effect" import { Catalog } from "./catalog" import { makeLocationNode } from "./effect/app-node" diff --git a/packages/core/src/provider.ts b/packages/core/src/provider.ts index 44285d1119..4e43963d19 100644 --- a/packages/core/src/provider.ts +++ b/packages/core/src/provider.ts @@ -3,7 +3,7 @@ export * as ProviderV2 from "./provider" import { Effect, Schema } from "effect" import { pathToFileURL } from "url" import { Provider } from "@opencode-ai/schema/provider" -import type { ProviderPackageDefinition } from "@opencode-ai/llm" +import type { ProviderPackageDefinition } from "@opencode-ai/ai" import { Npm } from "./npm" import type { DeepMutable } from "./schema" @@ -35,7 +35,7 @@ const packages = new Map>() export const loadPackage = Effect.fn("ProviderV2.loadPackage")(function* (specifier: string, npm?: Npm.Interface) { const resolved = yield* Effect.sync(() => { - if (specifier.startsWith("file://") || specifier.startsWith("@opencode-ai/llm/")) return specifier + if (specifier.startsWith("file://") || specifier.startsWith("@opencode-ai/ai/")) return specifier try { return import.meta.resolve(specifier) } catch { diff --git a/packages/core/src/session/compaction.ts b/packages/core/src/session/compaction.ts index 7596621af4..c15919f60b 100644 --- a/packages/core/src/session/compaction.ts +++ b/packages/core/src/session/compaction.ts @@ -1,6 +1,6 @@ export * as SessionCompaction from "./compaction" -import { LLM, LLMClient, LLMError, LLMEvent, Message, type LLMRequest, type Model } from "@opencode-ai/llm" +import { LLM, LLMClient, LLMError, LLMEvent, Message, type LLMRequest, type Model } from "@opencode-ai/ai" import { SessionError } from "@opencode-ai/schema/session-error" import { Context, Effect, Layer, Stream } from "effect" import { Config } from "../config" diff --git a/packages/core/src/session/runner/index.ts b/packages/core/src/session/runner/index.ts index 910b05e745..ee33da093f 100644 --- a/packages/core/src/session/runner/index.ts +++ b/packages/core/src/session/runner/index.ts @@ -1,6 +1,6 @@ export * as SessionRunner from "./index" -import type { LLMError } from "@opencode-ai/llm" +import type { LLMError } from "@opencode-ai/ai" import { Context, Effect } from "effect" import { SessionSchema } from "../schema" import type { AgentNotFoundError, MessageDecodeError, StepFailedError, UserInterruptedError } from "../error" diff --git a/packages/core/src/session/runner/llm.ts b/packages/core/src/session/runner/llm.ts index 9c8cf4d8d4..6801559fa8 100644 --- a/packages/core/src/session/runner/llm.ts +++ b/packages/core/src/session/runner/llm.ts @@ -9,7 +9,7 @@ import { SystemPart, isContextOverflowFailure, type ProviderErrorEvent, -} from "@opencode-ai/llm" +} from "@opencode-ai/ai" import { SessionError } from "@opencode-ai/schema/session-error" import { Money } from "@opencode-ai/schema/money" import { Cause, Effect, Exit, Fiber, FiberSet, Layer, Option, Semaphore, Stream } from "effect" diff --git a/packages/core/src/session/runner/model.ts b/packages/core/src/session/runner/model.ts index 9a31dadd17..4749e6f72d 100644 --- a/packages/core/src/session/runner/model.ts +++ b/packages/core/src/session/runner/model.ts @@ -1,14 +1,14 @@ export * as SessionRunnerModel from "./model" import { makeLocationNode } from "../../effect/app-node" -import { Model } from "@opencode-ai/llm" +import { Model } from "@opencode-ai/ai" // ast-grep-ignore: no-star-import -import * as AnthropicMessages from "@opencode-ai/llm/protocols/anthropic-messages" +import * as AnthropicMessages from "@opencode-ai/ai/protocols/anthropic-messages" // ast-grep-ignore: no-star-import -import * as OpenAICompatibleChat from "@opencode-ai/llm/protocols/openai-compatible-chat" +import * as OpenAICompatibleChat from "@opencode-ai/ai/protocols/openai-compatible-chat" // ast-grep-ignore: no-star-import -import * as OpenAIResponses from "@opencode-ai/llm/protocols/openai-responses" -import { Auth, type AnyRoute } from "@opencode-ai/llm/route" +import * as OpenAIResponses from "@opencode-ai/ai/protocols/openai-responses" +import { Auth, type AnyRoute } from "@opencode-ai/ai/route" import { Context, Effect, Layer, Schema } from "effect" import { produce } from "immer" import { AISDK } from "../../aisdk" @@ -256,20 +256,20 @@ export const fromCatalogModel = ( } const isNativeOpenAI = (packageName: string | undefined) => - packageName === "@opencode-ai/llm/providers/openai" || - packageName?.startsWith("@opencode-ai/llm/providers/openai/") === true + packageName === "@opencode-ai/ai/providers/openai" || + packageName?.startsWith("@opencode-ai/ai/providers/openai/") === true const nativeCredentialSettings = (specifier: string, credential: Credential.Value | undefined) => { if (!credential) return {} if (credential.type === "key") return { apiKey: credential.key } if ( - specifier === "@opencode-ai/llm/providers/anthropic" || - specifier === "@opencode-ai/llm/providers/anthropic-compatible" + specifier === "@opencode-ai/ai/providers/anthropic" || + specifier === "@opencode-ai/ai/providers/anthropic-compatible" ) return { authToken: credential.access } if ( - specifier === "@opencode-ai/llm/providers/google-vertex" || - specifier.startsWith("@opencode-ai/llm/providers/google-vertex/") + specifier === "@opencode-ai/ai/providers/google-vertex" || + specifier.startsWith("@opencode-ai/ai/providers/google-vertex/") ) return { accessToken: credential.access } return { apiKey: credential.access } diff --git a/packages/core/src/session/runner/publish-llm-event.ts b/packages/core/src/session/runner/publish-llm-event.ts index 643228e49d..35d80d7329 100644 --- a/packages/core/src/session/runner/publish-llm-event.ts +++ b/packages/core/src/session/runner/publish-llm-event.ts @@ -1,4 +1,4 @@ -import { ToolOutput, type LLMEvent, type ProviderMetadata, type ToolResultValue, type Usage } from "@opencode-ai/llm" +import { ToolOutput, type LLMEvent, type ProviderMetadata, type ToolResultValue, type Usage } from "@opencode-ai/ai" import { Effect } from "effect" import { EventV2 } from "../../event" import { ModelV2 } from "../../model" diff --git a/packages/core/src/session/runner/retry.ts b/packages/core/src/session/runner/retry.ts index 3ada83b4e4..44029e1b6a 100644 --- a/packages/core/src/session/runner/retry.ts +++ b/packages/core/src/session/runner/retry.ts @@ -1,6 +1,6 @@ export * as SessionRunnerRetry from "./retry" -import { LLMError } from "@opencode-ai/llm" +import { LLMError } from "@opencode-ai/ai" import { SessionError } from "@opencode-ai/schema/session-error" import { Data, Duration, Effect, Schedule } from "effect" import { EventV2 } from "../../event" diff --git a/packages/core/src/session/runner/system-prompt.ts b/packages/core/src/session/runner/system-prompt.ts index e4d442699c..e8b97d83d0 100644 --- a/packages/core/src/session/runner/system-prompt.ts +++ b/packages/core/src/session/runner/system-prompt.ts @@ -1,6 +1,6 @@ export * as SessionRunnerSystemPrompt from "./system-prompt" -import type { Model } from "@opencode-ai/llm" +import type { Model } from "@opencode-ai/ai" import PROMPT_ANTHROPIC from "./prompt/anthropic.txt" import PROMPT_BEAST from "./prompt/beast.txt" diff --git a/packages/core/src/session/runner/to-llm-message.ts b/packages/core/src/session/runner/to-llm-message.ts index 7aa379ab27..db3ce25fe1 100644 --- a/packages/core/src/session/runner/to-llm-message.ts +++ b/packages/core/src/session/runner/to-llm-message.ts @@ -5,7 +5,7 @@ import { ToolResultPart, type ContentPart, type ProviderMetadata, -} from "@opencode-ai/llm" +} from "@opencode-ai/ai" import { Option, Schema } from "effect" import type { ModelV2 } from "../../model" import { SessionMessage } from "../message" @@ -235,7 +235,7 @@ ${message.recent} } } -/** Translate projected V2 Session history into canonical @opencode-ai/llm context. */ +/** Translate projected V2 Session history into canonical @opencode-ai/ai context. */ export const toLLMMessages = ( messages: readonly SessionMessage.Info[], model: ModelV2.Ref, diff --git a/packages/core/src/session/title.ts b/packages/core/src/session/title.ts index cb19a07771..ac7b7c27e1 100644 --- a/packages/core/src/session/title.ts +++ b/packages/core/src/session/title.ts @@ -1,6 +1,6 @@ export * as SessionTitle from "./title" -import { LLM, LLMClient, LLMError, LLMEvent, Message, type LLMRequest } from "@opencode-ai/llm" +import { LLM, LLMClient, LLMError, LLMEvent, Message, type LLMRequest } from "@opencode-ai/ai" import { Context, DateTime, Effect, Layer, Stream } from "effect" import { AgentV2 } from "../agent" import { Database } from "../database/database" diff --git a/packages/core/src/session/to-session-error.ts b/packages/core/src/session/to-session-error.ts index 6d3d521fb7..e3ad94fd10 100644 --- a/packages/core/src/session/to-session-error.ts +++ b/packages/core/src/session/to-session-error.ts @@ -1,4 +1,4 @@ -import { LLMError, ToolFailure } from "@opencode-ai/llm" +import { LLMError, ToolFailure } from "@opencode-ai/ai" import { Tool } from "@opencode-ai/plugin/v2/effect/tool" import { SessionError } from "@opencode-ai/schema/session-error" import { PermissionV2 } from "../permission" diff --git a/packages/core/src/tool-output-store.ts b/packages/core/src/tool-output-store.ts index 690f2cc85b..057c6b4c68 100644 --- a/packages/core/src/tool-output-store.ts +++ b/packages/core/src/tool-output-store.ts @@ -8,7 +8,7 @@ import { Global } from "./global" import { makeGlobalNode, makeLocationNode } from "./effect/app-node" import { SessionSchema } from "./session/schema" import { Identifier } from "./util/identifier" -import type { ToolOutput } from "@opencode-ai/llm" +import type { ToolOutput } from "@opencode-ai/ai" export const MAX_LINES = 2_000 export const MAX_BYTES = 50 * 1024 diff --git a/packages/core/src/tool/edit.ts b/packages/core/src/tool/edit.ts index 1d79459550..2319d4baf2 100644 --- a/packages/core/src/tool/edit.ts +++ b/packages/core/src/tool/edit.ts @@ -7,7 +7,7 @@ export * as EditTool from "./edit" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { FileDiff } from "@opencode-ai/schema/file-diff" import { createTwoFilesPatch, diffLines } from "diff" import { Effect, Schema } from "effect" diff --git a/packages/core/src/tool/execute.ts b/packages/core/src/tool/execute.ts index 701b5ff2bb..0a62223770 100644 --- a/packages/core/src/tool/execute.ts +++ b/packages/core/src/tool/execute.ts @@ -1,7 +1,7 @@ export * as ExecuteTool from "./execute" import { CodeMode, Tool, toolError } from "@opencode-ai/codemode" -import { ToolOutput } from "@opencode-ai/llm" +import { ToolOutput } from "@opencode-ai/ai" import { Effect, Ref, Schema } from "effect" import { definition, make, settle, type AnyTool } from "./tool" diff --git a/packages/core/src/tool/glob.ts b/packages/core/src/tool/glob.ts index 6af5560048..35dc58d6cf 100644 --- a/packages/core/src/tool/glob.ts +++ b/packages/core/src/tool/glob.ts @@ -1,6 +1,6 @@ export * as GlobTool from "./glob" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" import { Effect, Schema } from "effect" import path from "path" diff --git a/packages/core/src/tool/grep.ts b/packages/core/src/tool/grep.ts index 6e784dc876..ef7c76c745 100644 --- a/packages/core/src/tool/grep.ts +++ b/packages/core/src/tool/grep.ts @@ -1,7 +1,7 @@ export * as GrepTool from "./grep" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { Effect, Schema } from "effect" import path from "path" import { FileSystem } from "../filesystem" diff --git a/packages/core/src/tool/hooks.ts b/packages/core/src/tool/hooks.ts index abe829aa1b..b6dba58ffb 100644 --- a/packages/core/src/tool/hooks.ts +++ b/packages/core/src/tool/hooks.ts @@ -6,7 +6,7 @@ import { Session } from "@opencode-ai/schema/session" import { SessionMessage } from "../session/message" import { State } from "../state" import { Context, Effect, Layer, Scope } from "effect" -import type { ToolOutput, ToolResultValue } from "@opencode-ai/llm" +import type { ToolOutput, ToolResultValue } from "@opencode-ai/ai" export interface BeforeEvent { readonly tool: string diff --git a/packages/core/src/tool/mcp.ts b/packages/core/src/tool/mcp.ts index 0a15ba2350..a636671f60 100644 --- a/packages/core/src/tool/mcp.ts +++ b/packages/core/src/tool/mcp.ts @@ -1,6 +1,6 @@ export * as McpTool from "./mcp" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { McpEvent } from "@opencode-ai/schema/mcp-event" import { Effect, Exit, type JsonSchema, Layer, Scope, Semaphore, Stream } from "effect" import { makeLocationNode } from "../effect/app-node" diff --git a/packages/core/src/tool/patch.ts b/packages/core/src/tool/patch.ts index 8d986790ce..fba773b735 100644 --- a/packages/core/src/tool/patch.ts +++ b/packages/core/src/tool/patch.ts @@ -1,7 +1,7 @@ export * as PatchTool from "./patch" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { FileDiff } from "@opencode-ai/schema/file-diff" import { createTwoFilesPatch, diffLines } from "diff" import { Effect, Schema } from "effect" diff --git a/packages/core/src/tool/question.ts b/packages/core/src/tool/question.ts index 6b179fe9b8..aa343c9652 100644 --- a/packages/core/src/tool/question.ts +++ b/packages/core/src/tool/question.ts @@ -1,7 +1,7 @@ export * as QuestionTool from "./question" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { Effect, Schema } from "effect" import { Form } from "../form" import { PermissionV2 } from "../permission" diff --git a/packages/core/src/tool/read.ts b/packages/core/src/tool/read.ts index 646e09daf6..899e464929 100644 --- a/packages/core/src/tool/read.ts +++ b/packages/core/src/tool/read.ts @@ -2,7 +2,7 @@ export * as ReadTool from "./read" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" import { dirname } from "path" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { Effect, Schema } from "effect" import { FileSystem } from "../filesystem" import { FSUtil } from "../fs-util" diff --git a/packages/core/src/tool/registry.ts b/packages/core/src/tool/registry.ts index 6e1910ae56..98120fc2d9 100644 --- a/packages/core/src/tool/registry.ts +++ b/packages/core/src/tool/registry.ts @@ -1,6 +1,6 @@ export * as ToolRegistry from "./registry" -import { ToolOutput, type ToolCall, type ToolDefinition, type ToolResultValue } from "@opencode-ai/llm" +import { ToolOutput, type ToolCall, type ToolDefinition, type ToolResultValue } from "@opencode-ai/ai" import { Context, Effect, Layer, Scope } from "effect" import type { AgentV2 } from "../agent" import { PermissionV2 } from "../permission" diff --git a/packages/core/src/tool/shell.ts b/packages/core/src/tool/shell.ts index c1dc95c904..300acf8cd5 100644 --- a/packages/core/src/tool/shell.ts +++ b/packages/core/src/tool/shell.ts @@ -1,7 +1,7 @@ export * as ShellTool from "./shell" import path from "path" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" import { Effect, Fiber, Schedule, Schema, Scope } from "effect" import { FSUtil } from "../fs-util" diff --git a/packages/core/src/tool/skill.ts b/packages/core/src/tool/skill.ts index 07d935a127..bf2ac0540d 100644 --- a/packages/core/src/tool/skill.ts +++ b/packages/core/src/tool/skill.ts @@ -2,7 +2,7 @@ export * as SkillTool from "./skill" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" import path from "path" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { Effect, Schema } from "effect" import { FSUtil } from "../fs-util" import { SkillV2 } from "../skill" diff --git a/packages/core/src/tool/subagent.ts b/packages/core/src/tool/subagent.ts index ea4dc87d5e..7e08a3a273 100644 --- a/packages/core/src/tool/subagent.ts +++ b/packages/core/src/tool/subagent.ts @@ -1,6 +1,6 @@ export * as SubagentTool from "./subagent" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" import { Effect, Schema, Scope } from "effect" import { AgentV2 } from "../agent" diff --git a/packages/core/src/tool/webfetch.ts b/packages/core/src/tool/webfetch.ts index 6a5910c057..e7a372e4b4 100644 --- a/packages/core/src/tool/webfetch.ts +++ b/packages/core/src/tool/webfetch.ts @@ -1,7 +1,7 @@ export * as WebFetchTool from "./webfetch" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { Duration, Effect, Schema } from "effect" import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import { Parser } from "htmlparser2" diff --git a/packages/core/src/tool/websearch.ts b/packages/core/src/tool/websearch.ts index 0e23fc8a32..a92ce5f8ef 100644 --- a/packages/core/src/tool/websearch.ts +++ b/packages/core/src/tool/websearch.ts @@ -1,7 +1,7 @@ export * as WebSearchTool from "./websearch" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { Context, Duration, Effect, Layer, Schema } from "effect" import { HttpClient, HttpClientRequest } from "effect/unstable/http" import { makeLocationNode } from "../effect/app-node" diff --git a/packages/core/src/tool/write.ts b/packages/core/src/tool/write.ts index e634411e01..6c8041ff42 100644 --- a/packages/core/src/tool/write.ts +++ b/packages/core/src/tool/write.ts @@ -7,7 +7,7 @@ export * as WriteTool from "./write" import type { Context as PluginContext } from "@opencode-ai/plugin/v2/effect/plugin" -import { ToolFailure } from "@opencode-ai/llm" +import { ToolFailure } from "@opencode-ai/ai" import { Effect, Schema } from "effect" import { FileMutation } from "../file-mutation" import { LocationMutation } from "../location-mutation" diff --git a/packages/core/test/aisdk.test.ts b/packages/core/test/aisdk.test.ts index dcfae24674..59c8f8e8d3 100644 --- a/packages/core/test/aisdk.test.ts +++ b/packages/core/test/aisdk.test.ts @@ -2,8 +2,8 @@ import type { LanguageModelV3CallOptions } from "@ai-sdk/provider" import { AISDK } from "@opencode-ai/core/aisdk" import { ModelV2 } from "@opencode-ai/core/model" import { ProviderV2 } from "@opencode-ai/core/provider" -import { LLM, Message } from "@opencode-ai/llm" -import { LLMClient } from "@opencode-ai/llm/route" +import { LLM, Message } from "@opencode-ai/ai" +import { LLMClient } from "@opencode-ai/ai/route" import { expect } from "bun:test" import { Effect } from "effect" import { testEffect } from "./lib/effect" diff --git a/packages/core/test/session-compact.test.ts b/packages/core/test/session-compact.test.ts index f0e4049cc4..da90068ea4 100644 --- a/packages/core/test/session-compact.test.ts +++ b/packages/core/test/session-compact.test.ts @@ -1,6 +1,6 @@ import { describe, expect } from "bun:test" -import { LLMClient, LLMEvent, Model, type LLMRequest } from "@opencode-ai/llm" -import { OpenAIChat } from "@opencode-ai/llm/protocols" +import { LLMClient, LLMEvent, Model, type LLMRequest } from "@opencode-ai/ai" +import { OpenAIChat } from "@opencode-ai/ai/protocols" import { Config } from "@opencode-ai/core/config" import { Database } from "@opencode-ai/core/database/database" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" diff --git a/packages/core/test/session-compaction.test.ts b/packages/core/test/session-compaction.test.ts index c0a22c1837..f9cf2e4c69 100644 --- a/packages/core/test/session-compaction.test.ts +++ b/packages/core/test/session-compaction.test.ts @@ -1,6 +1,6 @@ import { expect, test } from "bun:test" -import { LLMClient, LLMEvent, Model, type LLMRequest } from "@opencode-ai/llm" -import { OpenAIChat } from "@opencode-ai/llm/protocols" +import { LLMClient, LLMEvent, Model, type LLMRequest } from "@opencode-ai/ai" +import { OpenAIChat } from "@opencode-ai/ai/protocols" import { Config } from "@opencode-ai/core/config" import { Database } from "@opencode-ai/core/database/database" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" diff --git a/packages/core/test/session-error.test.ts b/packages/core/test/session-error.test.ts index 46bdb09e70..825910f7a4 100644 --- a/packages/core/test/session-error.test.ts +++ b/packages/core/test/session-error.test.ts @@ -14,7 +14,7 @@ import { TransportReason, UnknownProviderReason, ToolFailure, -} from "@opencode-ai/llm" +} from "@opencode-ai/ai" import { PermissionV2 } from "@opencode-ai/core/permission" import { Tool } from "@opencode-ai/plugin/v2/effect/tool" import { toSessionError } from "@opencode-ai/core/session/to-session-error" diff --git a/packages/core/test/session-execution.test.ts b/packages/core/test/session-execution.test.ts index 2775df3564..0e25881a62 100644 --- a/packages/core/test/session-execution.test.ts +++ b/packages/core/test/session-execution.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import { LLMError, TransportReason } from "@opencode-ai/llm" +import { LLMError, TransportReason } from "@opencode-ai/ai" import { Database } from "@opencode-ai/core/database/database" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/core/effect/layer-node" diff --git a/packages/core/test/session-instructions.test.ts b/packages/core/test/session-instructions.test.ts index 1591dc4ed4..64f667541e 100644 --- a/packages/core/test/session-instructions.test.ts +++ b/packages/core/test/session-instructions.test.ts @@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test" import fs from "fs/promises" import path from "path" import { DateTime, Effect, Layer } from "effect" -import { Message } from "@opencode-ai/llm" +import { Message } from "@opencode-ai/ai" import { AgentV2 } from "@opencode-ai/core/agent" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/core/effect/layer-node" diff --git a/packages/core/test/session-runner-message.test.ts b/packages/core/test/session-runner-message.test.ts index 396b833a6d..8ddec2fae8 100644 --- a/packages/core/test/session-runner-message.test.ts +++ b/packages/core/test/session-runner-message.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import { Message } from "@opencode-ai/llm" +import { Message } from "@opencode-ai/ai" import { ModelV2 } from "@opencode-ai/core/model" import { ProviderV2 } from "@opencode-ai/core/provider" import { SessionMessage } from "@opencode-ai/core/session/message" diff --git a/packages/core/test/session-runner-model.test.ts b/packages/core/test/session-runner-model.test.ts index 05d2a040f0..19f7d1999f 100644 --- a/packages/core/test/session-runner-model.test.ts +++ b/packages/core/test/session-runner-model.test.ts @@ -1,6 +1,6 @@ import { describe, expect } from "bun:test" -import { LLM, Model } from "@opencode-ai/llm" -import { LLMClient } from "@opencode-ai/llm/route" +import { LLM, Model } from "@opencode-ai/ai" +import { LLMClient } from "@opencode-ai/ai/route" import { DateTime, Effect } from "effect" import { Money } from "@opencode-ai/schema/money" import { Headers } from "effect/unstable/http" @@ -378,7 +378,7 @@ describe("SessionRunnerModel", () => { it.effect("routes native OpenAI provider packages with ChatGPT credentials to the codex backend", () => Effect.gen(function* () { const resolved = yield* SessionRunnerModel.fromCatalogModel( - model("@opencode-ai/llm/providers/openai", { + model("@opencode-ai/ai/providers/openai", { settings: { baseURL: "https://openai.example/v1" }, }), Credential.OAuth.make({ @@ -407,7 +407,7 @@ describe("SessionRunnerModel", () => { it.effect("does not route native OpenAI-compatible packages to the codex backend", () => Effect.gen(function* () { const resolved = yield* SessionRunnerModel.fromCatalogModel( - model("@opencode-ai/llm/providers/openai-compatible", { + model("@opencode-ai/ai/providers/openai-compatible", { settings: { baseURL: "https://compatible.example/v1" }, }), Credential.OAuth.make({ @@ -511,7 +511,7 @@ describe("SessionRunnerModel", () => { }), ) const resolved = yield* SessionRunnerModel.fromCatalogModel( - model("@opencode-ai/llm/providers/custom", { + model("@opencode-ai/ai/providers/custom", { settings: { region: "test" }, headers: { "x-package": "header" }, body: { custom: true }, @@ -519,7 +519,7 @@ describe("SessionRunnerModel", () => { undefined, { loadPackage: (specifier) => { - expect(specifier).toBe("@opencode-ai/llm/providers/custom") + expect(specifier).toBe("@opencode-ai/ai/providers/custom") return Effect.succeed({ model: (modelID, settings) => { expect(modelID).toBe("api-test-model") @@ -555,10 +555,10 @@ describe("SessionRunnerModel", () => { expires: Date.now() + 60_000, }) const packages = [ - ["@opencode-ai/llm/providers/google-vertex", "accessToken"], - ["@opencode-ai/llm/providers/google-vertex/anthropic", "accessToken"], - ["@opencode-ai/llm/providers/anthropic", "authToken"], - ["@opencode-ai/llm/providers/anthropic-compatible", "authToken"], + ["@opencode-ai/ai/providers/google-vertex", "accessToken"], + ["@opencode-ai/ai/providers/google-vertex/anthropic", "accessToken"], + ["@opencode-ai/ai/providers/anthropic", "authToken"], + ["@opencode-ai/ai/providers/anthropic-compatible", "authToken"], ] as const yield* Effect.forEach(packages, ([specifier, key]) => @@ -637,7 +637,7 @@ describe("SessionRunnerModel", () => { it.effect("reports whether a catalog model declares a provider package", () => Effect.sync(() => { expect(SessionRunnerModel.supported(model(ProviderV2.aisdk("@ai-sdk/openai")))).toBe(true) - expect(SessionRunnerModel.supported(model("@opencode-ai/llm/providers/custom"))).toBe(true) + expect(SessionRunnerModel.supported(model("@opencode-ai/ai/providers/custom"))).toBe(true) expect(SessionRunnerModel.supported(model(undefined))).toBe(false) }), ) diff --git a/packages/core/test/session-runner-recorded.test.ts b/packages/core/test/session-runner-recorded.test.ts index d4fb21fbe3..58893bbb0f 100644 --- a/packages/core/test/session-runner-recorded.test.ts +++ b/packages/core/test/session-runner-recorded.test.ts @@ -1,6 +1,6 @@ import { HttpRecorder } from "@opencode-ai/http-recorder" -import * as OpenAIChat from "@opencode-ai/llm/protocols/openai-chat" -import { Auth, LLMClient, RequestExecutor } from "@opencode-ai/llm/route" +import * as OpenAIChat from "@opencode-ai/ai/protocols/openai-chat" +import { Auth, LLMClient, RequestExecutor } from "@opencode-ai/ai/route" import { Database } from "@opencode-ai/core/database/database" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNodePlatform } from "@opencode-ai/core/effect/app-node-platform" diff --git a/packages/core/test/session-runner-system-prompt.test.ts b/packages/core/test/session-runner-system-prompt.test.ts index c1e4b86eec..a367d913e5 100644 --- a/packages/core/test/session-runner-system-prompt.test.ts +++ b/packages/core/test/session-runner-system-prompt.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test" -import { Model } from "@opencode-ai/llm" -import * as OpenAIChat from "@opencode-ai/llm/protocols/openai-chat" +import { Model } from "@opencode-ai/ai" +import * as OpenAIChat from "@opencode-ai/ai/protocols/openai-chat" import { SessionRunnerSystemPrompt } from "@opencode-ai/core/session/runner/system-prompt" const prompt = (id: string) => diff --git a/packages/core/test/session-runner-tool-events.test.ts b/packages/core/test/session-runner-tool-events.test.ts index 1cdc71788a..93600c3058 100644 --- a/packages/core/test/session-runner-tool-events.test.ts +++ b/packages/core/test/session-runner-tool-events.test.ts @@ -1,6 +1,6 @@ import { expect, test } from "bun:test" import { Effect, Schema } from "effect" -import { LLMEvent } from "@opencode-ai/llm" +import { LLMEvent } from "@opencode-ai/ai" import { Money } from "@opencode-ai/schema/money" import { EventV2 } from "@opencode-ai/core/event" import { AgentV2 } from "@opencode-ai/core/agent" diff --git a/packages/core/test/session-runner.test.ts b/packages/core/test/session-runner.test.ts index 66d557eea7..fc72e17e25 100644 --- a/packages/core/test/session-runner.test.ts +++ b/packages/core/test/session-runner.test.ts @@ -11,8 +11,8 @@ import { RateLimitReason, type LLMClientShape, type LLMRequest, -} from "@opencode-ai/llm" -import * as OpenAIChat from "@opencode-ai/llm/protocols/openai-chat" +} from "@opencode-ai/ai" +import * as OpenAIChat from "@opencode-ai/ai/protocols/openai-chat" import { Database } from "@opencode-ai/core/database/database" import { makeLocationNode } from "@opencode-ai/core/effect/app-node" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" diff --git a/packages/core/test/session-title.test.ts b/packages/core/test/session-title.test.ts index 4ba33b5457..dccfaf63df 100644 --- a/packages/core/test/session-title.test.ts +++ b/packages/core/test/session-title.test.ts @@ -1,6 +1,6 @@ import { expect } from "bun:test" -import { LLMClient, LLMEvent, Model, type LLMRequest } from "@opencode-ai/llm" -import { OpenAIChat } from "@opencode-ai/llm/protocols" +import { LLMClient, LLMEvent, Model, type LLMRequest } from "@opencode-ai/ai" +import { OpenAIChat } from "@opencode-ai/ai/protocols" import { AgentV2 } from "@opencode-ai/core/agent" import { Database } from "@opencode-ai/core/database/database" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" diff --git a/packages/core/test/shared-schema.test.ts b/packages/core/test/shared-schema.test.ts index b4ee1ed494..37b67c63a8 100644 --- a/packages/core/test/shared-schema.test.ts +++ b/packages/core/test/shared-schema.test.ts @@ -56,7 +56,7 @@ test("Core reuses the canonical shared schemas", async () => { import("@opencode-ai/core/filesystem"), import("@opencode-ai/core/integration"), import("@opencode-ai/core/location"), - import("@opencode-ai/llm"), + import("@opencode-ai/ai"), import("@opencode-ai/core/permission"), import("@opencode-ai/core/v1/permission"), import("@opencode-ai/core/project/copy"), diff --git a/packages/docs/providers.mdx b/packages/docs/providers.mdx index 46e6c3f93c..a88eca912c 100644 --- a/packages/docs/providers.mdx +++ b/packages/docs/providers.mdx @@ -140,7 +140,7 @@ provider has no Models.dev catalog entries: "acme": { "name": "Acme Gateway", "env": ["ACME_API_KEY"], - "package": "@opencode-ai/llm/providers/openai-compatible", + "package": "@opencode-ai/ai/providers/openai-compatible", "settings": { "baseURL": "https://llm.acme.example/v1" }, @@ -170,7 +170,7 @@ The `package` field supports two runtime contracts: | Form | Contract | | --- | --- | -| `"@opencode-ai/llm/providers/openai-compatible"` | A V2 native package exporting `model(modelID, settings)`. An npm specifier or absolute `file://` URL may use the same contract. | +| `"@opencode-ai/ai/providers/openai-compatible"` | A V2 native package exporting `model(modelID, settings)`. An npm specifier or absolute `file://` URL may use the same contract. | | `"aisdk:@ai-sdk/openai-compatible"` | An AI SDK provider package. The `aisdk:` prefix is required. | Native packages receive the merged `settings` plus the resolved `apiKey`, `headers`, `body`, and `limits`. AI SDK diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 0f4c85d246..a65144ef82 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -87,7 +87,7 @@ "@opencode-ai/client": "workspace:*", "@opencode-ai/cli": "workspace:*", "@opencode-ai/codemode": "workspace:*", - "@opencode-ai/llm": "workspace:*", + "@opencode-ai/ai": "workspace:*", "@opencode-ai/plugin": "workspace:*", "@opencode-ai/protocol": "workspace:*", "@opencode-ai/schema": "workspace:*", diff --git a/packages/opencode/src/provider/error.ts b/packages/opencode/src/provider/error.ts index 21149a2cf3..ab85b6d1ab 100644 --- a/packages/opencode/src/provider/error.ts +++ b/packages/opencode/src/provider/error.ts @@ -2,7 +2,7 @@ import { APICallError } from "ai" import { STATUS_CODES } from "http" import { iife } from "@/util/iife" import type { ProviderV2 } from "@opencode-ai/core/provider" -import { isContextOverflow } from "@opencode-ai/llm" +import { isContextOverflow } from "@opencode-ai/ai" export class HeaderTimeoutError extends Error { public override readonly name = "ProviderHeaderTimeoutError" diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/project-copy.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/project-copy.ts index 84a0a71652..efa4e51c1e 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/project-copy.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/project-copy.ts @@ -3,7 +3,7 @@ import { Provider } from "@/provider/provider" import { LLM } from "@/session/llm" import { MessageID, SessionID } from "@/session/schema" import { Slug } from "@opencode-ai/core/util/slug" -import { LLMEvent } from "@opencode-ai/llm" +import { LLMEvent } from "@opencode-ai/ai" import { Effect, Stream } from "effect" import { HttpApiBuilder } from "effect/unstable/httpapi" import { InstanceHttpApi } from "../api" diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts index a99f8acff2..9d652f8aab 100644 --- a/packages/opencode/src/session/llm.ts +++ b/packages/opencode/src/session/llm.ts @@ -7,9 +7,9 @@ import { serviceUse } from "@opencode-ai/core/effect/service-use" import { Context, Effect, Layer } from "effect" import * as Stream from "effect/Stream" import { streamText, wrapLanguageModel, type ModelMessage, type Tool } from "ai" -import type { LLMEvent } from "@opencode-ai/llm" -import { LLMClient } from "@opencode-ai/llm/route" -import type { LLMClientService } from "@opencode-ai/llm/route" +import type { LLMEvent } from "@opencode-ai/ai" +import { LLMClient } from "@opencode-ai/ai/route" +import type { LLMClientService } from "@opencode-ai/ai/route" import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider" import { ProviderTransform } from "@/provider/transform" import { Config } from "@/config/config" @@ -221,7 +221,7 @@ const live: Layer.Layer< }) : undefined - // Runtime seam: native is an opt-in adapter over @opencode-ai/llm. It + // Runtime seam: native is an opt-in adapter over @opencode-ai/ai. It // either returns a ready LLMEvent stream or a concrete fallback reason. if (flags.experimentalNativeLlm) { const native = LLMNativeRuntime.stream({ diff --git a/packages/opencode/src/session/llm/AGENTS.md b/packages/opencode/src/session/llm/AGENTS.md index cfb6a89cef..03f7eeff47 100644 --- a/packages/opencode/src/session/llm/AGENTS.md +++ b/packages/opencode/src/session/llm/AGENTS.md @@ -4,8 +4,8 @@ This folder contains adapters behind that service boundary: -- `ai-sdk.ts` converts AI SDK `fullStream` parts into `@opencode-ai/llm` `LLMEvent`s. This is the default runtime path. -- `native-request.ts` converts opencode's normalized session input into a native `@opencode-ai/llm` `LLMRequest`. It does not execute requests. +- `ai-sdk.ts` converts AI SDK `fullStream` parts into `@opencode-ai/ai` `LLMEvent`s. This is the default runtime path. +- `native-request.ts` converts opencode's normalized session input into a native `@opencode-ai/ai` `LLMRequest`. It does not execute requests. - `native-runtime.ts` is the opt-in native runtime adapter. It decides whether a selected model is supported, builds the native request, bridges opencode tools into native executable tools, and delegates transport to `LLMClient` / `RequestExecutor`. ## File Structure @@ -15,19 +15,19 @@ src/session/ llm.ts session-owned orchestration and runtime selection llm/ AGENTS.md boundary notes for the adapter layer - ai-sdk.ts AI SDK fullStream -> @opencode-ai/llm LLMEvent adapter - native-request.ts opencode/AI SDK-shaped input -> @opencode-ai/llm LLMRequest + ai-sdk.ts AI SDK fullStream -> @opencode-ai/ai LLMEvent adapter + native-request.ts opencode/AI SDK-shaped input -> @opencode-ai/ai LLMRequest native-runtime.ts native runtime gate, tool bridge, and LLMClient handoff ``` Integration points: -- `../llm.ts` imports `LLMClient` from `@opencode-ai/llm/route`; native execution is the only path that calls it directly. +- `../llm.ts` imports `LLMClient` from `@opencode-ai/ai/route`; native execution is the only path that calls it directly. - `../llm.ts` imports `LLMAISDK` from `./llm/ai-sdk`; the AI SDK path still calls `streamText(...)` locally, then adapts `result.fullStream` into shared `LLMEvent`s. - `../llm.ts` imports `LLMNativeRuntime` from `./llm/native-runtime`; this is the runtime-selection seam. Unsupported native requests return a reason and fall back to AI SDK. - `native-runtime.ts` imports `LLMNative` from `./native-request`; this keeps request lowering separate from transport and tool execution. -- `native-request.ts` is the only adapter file that should construct `LLM.request(...)`, `LLM.model(...)`, `Message.*`, `SystemPart`, `ToolCallPart`, `ToolResultPart`, or `ToolDefinition` values from `@opencode-ai/llm`. -- `ai-sdk.ts` and `native-runtime.ts` both emit `@opencode-ai/llm` `LLMEvent`s so downstream session processing does not care which runtime handled the request. +- `native-request.ts` is the only adapter file that should construct `LLM.request(...)`, `LLM.model(...)`, `Message.*`, `SystemPart`, `ToolCallPart`, `ToolResultPart`, or `ToolDefinition` values from `@opencode-ai/ai`. +- `ai-sdk.ts` and `native-runtime.ts` both emit `@opencode-ai/ai` `LLMEvent`s so downstream session processing does not care which runtime handled the request. Keep new integration code on one of these seams. Avoid importing session services into `native-request.ts`; pass normalized data through `RequestInput` instead. @@ -80,7 +80,7 @@ Both runtimes converge on the same `LLMEvent` stream consumed by the session pro ╰─────────────────╯ ╰─────────────────────────────╯ ``` -`native-runtime.ts` evaluates the gate and either bridges into `@opencode-ai/llm` or returns control so `llm.ts` can take the AI SDK path. Tool execution stays opencode-owned in both branches; only request lowering and transport differ. +`native-runtime.ts` evaluates the gate and either bridges into `@opencode-ai/ai` or returns control so `llm.ts` can take the AI SDK path. Tool execution stays opencode-owned in both branches; only request lowering and transport differ. Safety boundary: diff --git a/packages/opencode/src/session/llm/ai-sdk.ts b/packages/opencode/src/session/llm/ai-sdk.ts index 8db8985d7b..f51d681121 100644 --- a/packages/opencode/src/session/llm/ai-sdk.ts +++ b/packages/opencode/src/session/llm/ai-sdk.ts @@ -1,4 +1,4 @@ -import { FinishReason, LLMEvent, ProviderMetadata, ToolResultValue } from "@opencode-ai/llm" +import { FinishReason, LLMEvent, ProviderMetadata, ToolResultValue } from "@opencode-ai/ai" import { Effect, Schema } from "effect" import { type streamText } from "ai" import { errorMessage } from "@/util/error" @@ -28,7 +28,7 @@ function providerMetadata(value: unknown): ProviderMetadata | undefined { } // Temporary AI SDK bridge: Copilot billing survives only in raw provider chunks here. -// Move this extraction into @opencode-ai/llm when Copilot is handled by the native runtime. +// Move this extraction into @opencode-ai/ai when Copilot is handled by the native runtime. function copilotTotalNanoAiu(value: unknown) { if (!value || typeof value !== "object") return const raw = value as Record diff --git a/packages/opencode/src/session/llm/native-request.ts b/packages/opencode/src/session/llm/native-request.ts index b7f30e24c3..19927ffc2a 100644 --- a/packages/opencode/src/session/llm/native-request.ts +++ b/packages/opencode/src/session/llm/native-request.ts @@ -1,5 +1,5 @@ -import type { JsonSchema, LLMRequest, ProviderMetadata } from "@opencode-ai/llm" -import { LLM, Message, SystemPart, ToolCallPart, ToolDefinition, ToolResultPart } from "@opencode-ai/llm" +import type { JsonSchema, LLMRequest, ProviderMetadata } from "@opencode-ai/ai" +import { LLM, Message, SystemPart, ToolCallPart, ToolDefinition, ToolResultPart } from "@opencode-ai/ai" import { AmazonBedrock, Anthropic, @@ -8,7 +8,7 @@ import { OpenAI, OpenAICompatible, OpenRouter, -} from "@opencode-ai/llm/providers" +} from "@opencode-ai/ai/providers" import type { ModelMessage } from "ai" import type { Provider } from "@/provider/provider" import { isRecord } from "@/util/record" @@ -181,7 +181,7 @@ export const model = (input: Provider.Model | RequestInput, headers?: Record { const converted = messages(input.messages) // This is the only native adapter boundary that should construct canonical - // @opencode-ai/llm request objects from opencode's session/AI SDK-shaped data. + // @opencode-ai/ai request objects from opencode's session/AI SDK-shaped data. return LLM.request({ model: model(input, input.headers), system: [...(input.system ?? []).map(SystemPart.make), ...converted.system], diff --git a/packages/opencode/src/session/llm/native-runtime.ts b/packages/opencode/src/session/llm/native-runtime.ts index bac385c591..2d7b270c47 100644 --- a/packages/opencode/src/session/llm/native-runtime.ts +++ b/packages/opencode/src/session/llm/native-runtime.ts @@ -15,8 +15,8 @@ import { toDefinitions, type JsonSchema, type LLMEvent, -} from "@opencode-ai/llm" -import type { LLMClientShape } from "@opencode-ai/llm/route" +} from "@opencode-ai/ai" +import type { LLMClientShape } from "@opencode-ai/ai/route" import { LLMNative } from "./native-request" export type RuntimeStatus = @@ -76,7 +76,7 @@ export function stream(input: StreamInput): StreamResult { const current = statusWithFetch(input, fetch) if (current.type === "unsupported") return current - // Integration point with @opencode-ai/llm: native-request lowers session data + // Integration point with @opencode-ai/ai: native-request lowers session data // into an LLMRequest, then LLMClient handles route selection and transport. // // ProviderTransform.providerOptions builds AI-SDK-shaped options for the @@ -171,7 +171,7 @@ export function nativeTools(tools: Record, input: Pick [ name, // Tool execution remains opencode-owned. The native runtime only adapts - // the @opencode-ai/llm tool call back into the AI SDK Tool.execute shape. + // the @opencode-ai/ai tool call back into the AI SDK Tool.execute shape. NativeTool.make({ description: item.description ?? "", jsonSchema: nativeSchema(item.inputSchema), diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts index 20aa8a8404..cd13346617 100644 --- a/packages/opencode/src/session/processor.ts +++ b/packages/opencode/src/session/processor.ts @@ -24,7 +24,7 @@ import { errorMessage } from "@/util/error" import { isRecord } from "@/util/record" import { EventV2Bridge } from "@/event-v2-bridge" import { Database } from "@opencode-ai/core/database/database" -import { Usage, type LLMEvent } from "@opencode-ai/llm" +import { Usage, type LLMEvent } from "@opencode-ai/ai" const DOOM_LOOP_THRESHOLD = 3 export type Result = "compact" | "stop" | "continue" diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 2a6d002c61..8b025cc2f0 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -55,7 +55,7 @@ import { eq } from "drizzle-orm" import { SessionTable } from "@opencode-ai/core/session/sql" import { SessionReminders } from "./reminders" import { SessionTools } from "./tools" -import { LLMEvent } from "@opencode-ai/llm" +import { LLMEvent } from "@opencode-ai/ai" // @ts-ignore globalThis.AI_SDK_LOG_WARNINGS = false diff --git a/packages/opencode/src/session/session.ts b/packages/opencode/src/session/session.ts index 2ce86abe43..d9f27ddaef 100644 --- a/packages/opencode/src/session/session.ts +++ b/packages/opencode/src/session/session.ts @@ -9,7 +9,7 @@ import { serviceUse } from "@opencode-ai/core/effect/service-use" import path from "path" import { Job } from "@/job" import { Decimal } from "decimal.js" -import type { ProviderMetadata, Usage } from "@opencode-ai/llm" +import type { ProviderMetadata, Usage } from "@opencode-ai/ai" import { InstallationVersion } from "@opencode-ai/core/installation/version" import { Database } from "@opencode-ai/core/database/database" import { EventV2Bridge } from "@/event-v2-bridge" diff --git a/packages/opencode/test/session/compaction.test.ts b/packages/opencode/test/session/compaction.test.ts index 4a4210cf08..44a0da29b1 100644 --- a/packages/opencode/test/session/compaction.test.ts +++ b/packages/opencode/test/session/compaction.test.ts @@ -28,7 +28,7 @@ import { testEffect } from "../lib/effect" import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner" import { TestConfig } from "../fixture/config" import { RuntimeFlags } from "@/effect/runtime-flags" -import { LLMEvent, Usage } from "@opencode-ai/llm" +import { LLMEvent, Usage } from "@opencode-ai/ai" import { ProviderV2 } from "@opencode-ai/core/provider" import { ModelV2 } from "@opencode-ai/core/model" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" diff --git a/packages/opencode/test/session/llm-native-recorded.test.ts b/packages/opencode/test/session/llm-native-recorded.test.ts index b4864d14ac..2fe945ea49 100644 --- a/packages/opencode/test/session/llm-native-recorded.test.ts +++ b/packages/opencode/test/session/llm-native-recorded.test.ts @@ -11,8 +11,8 @@ import { Auth } from "@/auth" import { Provider } from "@/provider/provider" import { Filesystem } from "@/util/filesystem" -import { LLMEvent, LLMResponse } from "@opencode-ai/llm" -import { RequestExecutor } from "@opencode-ai/llm/route" +import { LLMEvent, LLMResponse } from "@opencode-ai/ai" +import { RequestExecutor } from "@opencode-ai/ai/route" import { RuntimeFlags } from "@/effect/runtime-flags" import type { Agent } from "../../src/agent/agent" import { LLM } from "../../src/session/llm" diff --git a/packages/opencode/test/session/llm-native.test.ts b/packages/opencode/test/session/llm-native.test.ts index dd4d9cc174..77f042fe4c 100644 --- a/packages/opencode/test/session/llm-native.test.ts +++ b/packages/opencode/test/session/llm-native.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test" -import { LLMEvent, ToolFailure } from "@opencode-ai/llm" -import { LLMClient, RequestExecutor, WebSocketExecutor, type LLMClientShape } from "@opencode-ai/llm/route" +import { LLMEvent, ToolFailure } from "@opencode-ai/ai" +import { LLMClient, RequestExecutor, WebSocketExecutor, type LLMClientShape } from "@opencode-ai/ai/route" import { jsonSchema, tool, type ModelMessage, type Tool } from "ai" import { Effect, Fiber, Layer, Stream } from "effect" import { FetchHttpClient } from "effect/unstable/http" diff --git a/packages/opencode/test/session/llm.test.ts b/packages/opencode/test/session/llm.test.ts index 33c2957372..4e431ecaeb 100644 --- a/packages/opencode/test/session/llm.test.ts +++ b/packages/opencode/test/session/llm.test.ts @@ -9,7 +9,7 @@ import { InstanceRef } from "../../src/effect/instance-ref" import { HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import z from "zod" import { LLM } from "../../src/session/llm" -import { LLMClient, RequestExecutor } from "@opencode-ai/llm/route" +import { LLMClient, RequestExecutor } from "@opencode-ai/ai/route" import { Provider } from "@/provider/provider" import { ProviderTransform } from "@/provider/transform" import { ModelsDev } from "@opencode-ai/core/models-dev" diff --git a/packages/opencode/test/session/processor-effect.test.ts b/packages/opencode/test/session/processor-effect.test.ts index 5287605436..a599ad78b7 100644 --- a/packages/opencode/test/session/processor-effect.test.ts +++ b/packages/opencode/test/session/processor-effect.test.ts @@ -25,7 +25,7 @@ import { RuntimeFlags } from "@/effect/runtime-flags" import { ProviderV2 } from "@opencode-ai/core/provider" import { ModelV2 } from "@opencode-ai/core/model" import { SessionProjector } from "@opencode-ai/core/session/projector" -import { LLMEvent } from "@opencode-ai/llm" +import { LLMEvent } from "@opencode-ai/ai" const summary = Layer.succeed( SessionSummary.Service, diff --git a/packages/simulation/package.json b/packages/simulation/package.json index 1902a7a14a..c3baba77e9 100644 --- a/packages/simulation/package.json +++ b/packages/simulation/package.json @@ -20,7 +20,7 @@ "@fontsource/commit-mono": "5.2.5", "@napi-rs/canvas": "1.0.2", "@opencode-ai/core": "workspace:*", - "@opencode-ai/llm": "workspace:*", + "@opencode-ai/ai": "workspace:*", "@opentui/core": "catalog:", "effect": "catalog:" }, diff --git a/packages/simulation/src/backend/openai.ts b/packages/simulation/src/backend/openai.ts index b1a524547c..248866e1a1 100644 --- a/packages/simulation/src/backend/openai.ts +++ b/packages/simulation/src/backend/openai.ts @@ -1,7 +1,7 @@ import { Effect, Schema, Stream } from "effect" import { HttpClientResponse } from "effect/unstable/http" import { HttpClientError, TransportError } from "effect/unstable/http/HttpClientError" -import { OpenAIChatEvent, DEFAULT_BASE_URL, PATH } from "@opencode-ai/llm/protocols/openai-chat" +import { OpenAIChatEvent, DEFAULT_BASE_URL, PATH } from "@opencode-ai/ai/protocols/openai-chat" import { SimulationNetwork } from "./network" import { SimulatedProvider } from "./simulated-provider" diff --git a/packages/simulation/test/openai.test.ts b/packages/simulation/test/openai.test.ts index 3632bdb70b..069b4feed4 100644 --- a/packages/simulation/test/openai.test.ts +++ b/packages/simulation/test/openai.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "bun:test" -import { DEFAULT_BASE_URL, PATH } from "@opencode-ai/llm/protocols/openai-chat" +import { DEFAULT_BASE_URL, PATH } from "@opencode-ai/ai/protocols/openai-chat" import { Effect, Stream } from "effect" import { HttpClientRequest } from "effect/unstable/http" import { HttpClientError } from "effect/unstable/http/HttpClientError" diff --git a/packages/www/content/docs/(docs)/providers.mdx b/packages/www/content/docs/(docs)/providers.mdx index c9b7000698..7e711f9dfd 100644 --- a/packages/www/content/docs/(docs)/providers.mdx +++ b/packages/www/content/docs/(docs)/providers.mdx @@ -140,7 +140,7 @@ provider has no Models.dev catalog entries: "acme": { "name": "Acme Gateway", "env": ["ACME_API_KEY"], - "package": "@opencode-ai/llm/providers/openai-compatible", + "package": "@opencode-ai/ai/providers/openai-compatible", "settings": { "baseURL": "https://llm.acme.example/v1" }, @@ -170,7 +170,7 @@ The `package` field supports two runtime contracts: | Form | Contract | | --- | --- | -| `"@opencode-ai/llm/providers/openai-compatible"` | A V2 native package exporting `model(modelID, settings)`. An npm specifier or absolute `file://` URL may use the same contract. | +| `"@opencode-ai/ai/providers/openai-compatible"` | A V2 native package exporting `model(modelID, settings)`. An npm specifier or absolute `file://` URL may use the same contract. | | `"aisdk:@ai-sdk/openai-compatible"` | An AI SDK provider package. The `aisdk:` prefix is required. | Native packages receive the merged `settings` plus the resolved `apiKey`, `headers`, `body`, and `limits`. AI SDK diff --git a/specs/v2/schema-changelog.md b/specs/v2/schema-changelog.md index 4aae4391bd..e5ed230d51 100644 --- a/specs/v2/schema-changelog.md +++ b/specs/v2/schema-changelog.md @@ -287,7 +287,7 @@ Affected schema: - Core-owned typed tool registry contract. - Canonical tool output content and structured settlement schemas. -- Canonical tagged tool file sources in `@opencode-ai/llm`. +- Canonical tagged tool file sources in `@opencode-ai/ai`. - Durable tool called, progress, success, and failure events and projected assistant-tool states. Change: