Просмотр исходного кода

refactor(ai): rename llm package

Dax Raad 1 месяц назад
Родитель
Сommit
bb15b16499
100 измененных файлов с 61 добавлено и 62 удалено
  1. 8 8
      bun.lock
  2. 5 5
      packages/ai/AGENTS.md
  3. 2 3
      packages/ai/DESIGN.md
  4. 14 14
      packages/ai/README.md
  5. 15 15
      packages/ai/STATUS.md
  6. 4 4
      packages/ai/example/call-sites.md
  7. 4 4
      packages/ai/example/tutorial.ts
  8. 1 1
      packages/ai/package.json
  9. 0 0
      packages/ai/script/recording-cost-report.ts
  10. 0 0
      packages/ai/script/setup-recording-env.ts
  11. 0 0
      packages/ai/src/cache-policy.ts
  12. 0 0
      packages/ai/src/index.ts
  13. 0 0
      packages/ai/src/llm.ts
  14. 0 0
      packages/ai/src/protocols/anthropic-messages.ts
  15. 0 0
      packages/ai/src/protocols/bedrock-converse.ts
  16. 0 0
      packages/ai/src/protocols/bedrock-event-stream.ts
  17. 0 0
      packages/ai/src/protocols/gemini.ts
  18. 0 0
      packages/ai/src/protocols/google-vertex-anthropic.ts
  19. 0 0
      packages/ai/src/protocols/google-vertex-gemini.ts
  20. 0 0
      packages/ai/src/protocols/index.ts
  21. 0 0
      packages/ai/src/protocols/openai-chat.ts
  22. 0 0
      packages/ai/src/protocols/openai-compatible-chat.ts
  23. 0 0
      packages/ai/src/protocols/openai-compatible-responses.ts
  24. 0 0
      packages/ai/src/protocols/openai-responses.ts
  25. 0 0
      packages/ai/src/protocols/shared.ts
  26. 0 0
      packages/ai/src/protocols/utils/bedrock-auth.ts
  27. 0 0
      packages/ai/src/protocols/utils/bedrock-cache.ts
  28. 0 0
      packages/ai/src/protocols/utils/bedrock-media.ts
  29. 0 0
      packages/ai/src/protocols/utils/cache.ts
  30. 0 0
      packages/ai/src/protocols/utils/gemini-tool-schema.ts
  31. 0 0
      packages/ai/src/protocols/utils/lifecycle.ts
  32. 0 0
      packages/ai/src/protocols/utils/openai-options.ts
  33. 0 0
      packages/ai/src/protocols/utils/tool-schema.ts
  34. 0 0
      packages/ai/src/protocols/utils/tool-stream.ts
  35. 0 0
      packages/ai/src/provider-error.ts
  36. 0 0
      packages/ai/src/provider-package.ts
  37. 0 0
      packages/ai/src/provider.ts
  38. 0 0
      packages/ai/src/providers/amazon-bedrock.ts
  39. 0 0
      packages/ai/src/providers/anthropic-compatible.ts
  40. 0 0
      packages/ai/src/providers/anthropic.ts
  41. 0 0
      packages/ai/src/providers/azure.ts
  42. 0 0
      packages/ai/src/providers/azure/chat.ts
  43. 0 0
      packages/ai/src/providers/azure/responses.ts
  44. 0 0
      packages/ai/src/providers/cloudflare.ts
  45. 0 0
      packages/ai/src/providers/github-copilot.ts
  46. 0 0
      packages/ai/src/providers/google-vertex-anthropic.ts
  47. 0 0
      packages/ai/src/providers/google-vertex-shared.ts
  48. 0 0
      packages/ai/src/providers/google-vertex.ts
  49. 0 0
      packages/ai/src/providers/google-vertex/anthropic.ts
  50. 0 0
      packages/ai/src/providers/google.ts
  51. 0 0
      packages/ai/src/providers/index.ts
  52. 0 0
      packages/ai/src/providers/openai-compatible-profile.ts
  53. 0 0
      packages/ai/src/providers/openai-compatible-responses.ts
  54. 0 0
      packages/ai/src/providers/openai-compatible.ts
  55. 0 0
      packages/ai/src/providers/openai-options.ts
  56. 0 0
      packages/ai/src/providers/openai.ts
  57. 0 0
      packages/ai/src/providers/openai/chat.ts
  58. 0 0
      packages/ai/src/providers/openai/responses.ts
  59. 0 0
      packages/ai/src/providers/openrouter.ts
  60. 0 0
      packages/ai/src/providers/xai.ts
  61. 0 0
      packages/ai/src/route/auth-options.ts
  62. 0 0
      packages/ai/src/route/auth.ts
  63. 0 0
      packages/ai/src/route/client.ts
  64. 0 0
      packages/ai/src/route/endpoint.ts
  65. 0 0
      packages/ai/src/route/executor.ts
  66. 0 0
      packages/ai/src/route/framing.ts
  67. 0 0
      packages/ai/src/route/index.ts
  68. 0 0
      packages/ai/src/route/protocol.ts
  69. 0 0
      packages/ai/src/route/transport/http.ts
  70. 0 0
      packages/ai/src/route/transport/index.ts
  71. 0 0
      packages/ai/src/route/transport/websocket.ts
  72. 0 0
      packages/ai/src/schema/errors.ts
  73. 0 0
      packages/ai/src/schema/events.ts
  74. 0 0
      packages/ai/src/schema/ids.ts
  75. 0 0
      packages/ai/src/schema/index.ts
  76. 0 0
      packages/ai/src/schema/messages.ts
  77. 0 0
      packages/ai/src/schema/options.ts
  78. 0 0
      packages/ai/src/tool-runtime.ts
  79. 0 0
      packages/ai/src/tool.ts
  80. 0 0
      packages/ai/src/utils/record.ts
  81. 0 0
      packages/ai/sst-env.d.ts
  82. 0 0
      packages/ai/test/adapter.test.ts
  83. 0 0
      packages/ai/test/auth-options.types.ts
  84. 0 0
      packages/ai/test/auth.test.ts
  85. 0 0
      packages/ai/test/cache-policy.test.ts
  86. 0 0
      packages/ai/test/continuation-scenarios.ts
  87. 0 0
      packages/ai/test/endpoint.test.ts
  88. 0 0
      packages/ai/test/executor.test.ts
  89. 8 8
      packages/ai/test/exports.test.ts
  90. 0 0
      packages/ai/test/fixtures/media/restroom.png
  91. 0 0
      packages/ai/test/fixtures/recordings/anthropic-messages-cache/writes-then-reads-cache-control-on-identical-second-call.json
  92. 0 0
      packages/ai/test/fixtures/recordings/anthropic-messages/accepts-malformed-assistant-tool-order-with-default-patch.json
  93. 0 0
      packages/ai/test/fixtures/recordings/anthropic-messages/anthropic-opus-4-7-image-tool-result.json
  94. 0 0
      packages/ai/test/fixtures/recordings/anthropic-messages/claude-opus-4-7-drives-a-tool-loop.json
  95. 0 0
      packages/ai/test/fixtures/recordings/anthropic-messages/rejects-malformed-assistant-tool-order-without-patch.json
  96. 0 0
      packages/ai/test/fixtures/recordings/anthropic-messages/streams-text.json
  97. 0 0
      packages/ai/test/fixtures/recordings/anthropic-messages/streams-tool-call.json
  98. 0 0
      packages/ai/test/fixtures/recordings/bedrock-converse/drives-a-tool-loop.json
  99. 0 0
      packages/ai/test/fixtures/recordings/bedrock-converse/streams-a-tool-call.json
  100. 0 0
      packages/ai/test/fixtures/recordings/bedrock-converse/streams-text.json

+ 8 - 8
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=="],
 

+ 5 - 5
packages/llm/AGENTS.md → 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

+ 2 - 3
packages/llm/DESIGN.md → 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                  |

+ 14 - 14
packages/llm/README.md → 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" })
 ```

+ 15 - 15
packages/llm/STATUS.md → 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
 

+ 4 - 4
packages/llm/example/call-sites.md → 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" })
 ```

+ 4 - 4
packages/llm/example/tutorial.ts → 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
  *

+ 1 - 1
packages/llm/package.json → 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,

+ 0 - 0
packages/llm/script/recording-cost-report.ts → packages/ai/script/recording-cost-report.ts


+ 0 - 0
packages/llm/script/setup-recording-env.ts → packages/ai/script/setup-recording-env.ts


+ 0 - 0
packages/llm/src/cache-policy.ts → packages/ai/src/cache-policy.ts


+ 0 - 0
packages/llm/src/index.ts → packages/ai/src/index.ts


+ 0 - 0
packages/llm/src/llm.ts → packages/ai/src/llm.ts


+ 0 - 0
packages/llm/src/protocols/anthropic-messages.ts → packages/ai/src/protocols/anthropic-messages.ts


+ 0 - 0
packages/llm/src/protocols/bedrock-converse.ts → packages/ai/src/protocols/bedrock-converse.ts


+ 0 - 0
packages/llm/src/protocols/bedrock-event-stream.ts → packages/ai/src/protocols/bedrock-event-stream.ts


+ 0 - 0
packages/llm/src/protocols/gemini.ts → packages/ai/src/protocols/gemini.ts


+ 0 - 0
packages/llm/src/protocols/google-vertex-anthropic.ts → packages/ai/src/protocols/google-vertex-anthropic.ts


+ 0 - 0
packages/llm/src/protocols/google-vertex-gemini.ts → packages/ai/src/protocols/google-vertex-gemini.ts


+ 0 - 0
packages/llm/src/protocols/index.ts → packages/ai/src/protocols/index.ts


+ 0 - 0
packages/llm/src/protocols/openai-chat.ts → packages/ai/src/protocols/openai-chat.ts


+ 0 - 0
packages/llm/src/protocols/openai-compatible-chat.ts → packages/ai/src/protocols/openai-compatible-chat.ts


+ 0 - 0
packages/llm/src/protocols/openai-compatible-responses.ts → packages/ai/src/protocols/openai-compatible-responses.ts


+ 0 - 0
packages/llm/src/protocols/openai-responses.ts → packages/ai/src/protocols/openai-responses.ts


+ 0 - 0
packages/llm/src/protocols/shared.ts → packages/ai/src/protocols/shared.ts


+ 0 - 0
packages/llm/src/protocols/utils/bedrock-auth.ts → packages/ai/src/protocols/utils/bedrock-auth.ts


+ 0 - 0
packages/llm/src/protocols/utils/bedrock-cache.ts → packages/ai/src/protocols/utils/bedrock-cache.ts


+ 0 - 0
packages/llm/src/protocols/utils/bedrock-media.ts → packages/ai/src/protocols/utils/bedrock-media.ts


+ 0 - 0
packages/llm/src/protocols/utils/cache.ts → packages/ai/src/protocols/utils/cache.ts


+ 0 - 0
packages/llm/src/protocols/utils/gemini-tool-schema.ts → packages/ai/src/protocols/utils/gemini-tool-schema.ts


+ 0 - 0
packages/llm/src/protocols/utils/lifecycle.ts → packages/ai/src/protocols/utils/lifecycle.ts


+ 0 - 0
packages/llm/src/protocols/utils/openai-options.ts → packages/ai/src/protocols/utils/openai-options.ts


+ 0 - 0
packages/llm/src/protocols/utils/tool-schema.ts → packages/ai/src/protocols/utils/tool-schema.ts


+ 0 - 0
packages/llm/src/protocols/utils/tool-stream.ts → packages/ai/src/protocols/utils/tool-stream.ts


+ 0 - 0
packages/llm/src/provider-error.ts → packages/ai/src/provider-error.ts


+ 0 - 0
packages/llm/src/provider-package.ts → packages/ai/src/provider-package.ts


+ 0 - 0
packages/llm/src/provider.ts → packages/ai/src/provider.ts


+ 0 - 0
packages/llm/src/providers/amazon-bedrock.ts → packages/ai/src/providers/amazon-bedrock.ts


+ 0 - 0
packages/llm/src/providers/anthropic-compatible.ts → packages/ai/src/providers/anthropic-compatible.ts


+ 0 - 0
packages/llm/src/providers/anthropic.ts → packages/ai/src/providers/anthropic.ts


+ 0 - 0
packages/llm/src/providers/azure.ts → packages/ai/src/providers/azure.ts


+ 0 - 0
packages/llm/src/providers/azure/chat.ts → packages/ai/src/providers/azure/chat.ts


+ 0 - 0
packages/llm/src/providers/azure/responses.ts → packages/ai/src/providers/azure/responses.ts


+ 0 - 0
packages/llm/src/providers/cloudflare.ts → packages/ai/src/providers/cloudflare.ts


+ 0 - 0
packages/llm/src/providers/github-copilot.ts → packages/ai/src/providers/github-copilot.ts


+ 0 - 0
packages/llm/src/providers/google-vertex-anthropic.ts → packages/ai/src/providers/google-vertex-anthropic.ts


+ 0 - 0
packages/llm/src/providers/google-vertex-shared.ts → packages/ai/src/providers/google-vertex-shared.ts


+ 0 - 0
packages/llm/src/providers/google-vertex.ts → packages/ai/src/providers/google-vertex.ts


+ 0 - 0
packages/llm/src/providers/google-vertex/anthropic.ts → packages/ai/src/providers/google-vertex/anthropic.ts


+ 0 - 0
packages/llm/src/providers/google.ts → packages/ai/src/providers/google.ts


+ 0 - 0
packages/llm/src/providers/index.ts → packages/ai/src/providers/index.ts


+ 0 - 0
packages/llm/src/providers/openai-compatible-profile.ts → packages/ai/src/providers/openai-compatible-profile.ts


+ 0 - 0
packages/llm/src/providers/openai-compatible-responses.ts → packages/ai/src/providers/openai-compatible-responses.ts


+ 0 - 0
packages/llm/src/providers/openai-compatible.ts → packages/ai/src/providers/openai-compatible.ts


+ 0 - 0
packages/llm/src/providers/openai-options.ts → packages/ai/src/providers/openai-options.ts


+ 0 - 0
packages/llm/src/providers/openai.ts → packages/ai/src/providers/openai.ts


+ 0 - 0
packages/llm/src/providers/openai/chat.ts → packages/ai/src/providers/openai/chat.ts


+ 0 - 0
packages/llm/src/providers/openai/responses.ts → packages/ai/src/providers/openai/responses.ts


+ 0 - 0
packages/llm/src/providers/openrouter.ts → packages/ai/src/providers/openrouter.ts


+ 0 - 0
packages/llm/src/providers/xai.ts → packages/ai/src/providers/xai.ts


+ 0 - 0
packages/llm/src/route/auth-options.ts → packages/ai/src/route/auth-options.ts


+ 0 - 0
packages/llm/src/route/auth.ts → packages/ai/src/route/auth.ts


+ 0 - 0
packages/llm/src/route/client.ts → packages/ai/src/route/client.ts


+ 0 - 0
packages/llm/src/route/endpoint.ts → packages/ai/src/route/endpoint.ts


+ 0 - 0
packages/llm/src/route/executor.ts → packages/ai/src/route/executor.ts


+ 0 - 0
packages/llm/src/route/framing.ts → packages/ai/src/route/framing.ts


+ 0 - 0
packages/llm/src/route/index.ts → packages/ai/src/route/index.ts


+ 0 - 0
packages/llm/src/route/protocol.ts → packages/ai/src/route/protocol.ts


+ 0 - 0
packages/llm/src/route/transport/http.ts → packages/ai/src/route/transport/http.ts


+ 0 - 0
packages/llm/src/route/transport/index.ts → packages/ai/src/route/transport/index.ts


+ 0 - 0
packages/llm/src/route/transport/websocket.ts → packages/ai/src/route/transport/websocket.ts


+ 0 - 0
packages/llm/src/schema/errors.ts → packages/ai/src/schema/errors.ts


+ 0 - 0
packages/llm/src/schema/events.ts → packages/ai/src/schema/events.ts


+ 0 - 0
packages/llm/src/schema/ids.ts → packages/ai/src/schema/ids.ts


+ 0 - 0
packages/llm/src/schema/index.ts → packages/ai/src/schema/index.ts


+ 0 - 0
packages/llm/src/schema/messages.ts → packages/ai/src/schema/messages.ts


+ 0 - 0
packages/llm/src/schema/options.ts → packages/ai/src/schema/options.ts


+ 0 - 0
packages/llm/src/tool-runtime.ts → packages/ai/src/tool-runtime.ts


+ 0 - 0
packages/llm/src/tool.ts → packages/ai/src/tool.ts


+ 0 - 0
packages/llm/src/utils/record.ts → packages/ai/src/utils/record.ts


+ 0 - 0
packages/llm/sst-env.d.ts → packages/ai/sst-env.d.ts


+ 0 - 0
packages/llm/test/adapter.test.ts → packages/ai/test/adapter.test.ts


+ 0 - 0
packages/llm/test/auth-options.types.ts → packages/ai/test/auth-options.types.ts


+ 0 - 0
packages/llm/test/auth.test.ts → packages/ai/test/auth.test.ts


+ 0 - 0
packages/llm/test/cache-policy.test.ts → packages/ai/test/cache-policy.test.ts


+ 0 - 0
packages/llm/test/continuation-scenarios.ts → packages/ai/test/continuation-scenarios.ts


+ 0 - 0
packages/llm/test/endpoint.test.ts → packages/ai/test/endpoint.test.ts


+ 0 - 0
packages/llm/test/executor.test.ts → packages/ai/test/executor.test.ts


+ 8 - 8
packages/llm/test/exports.test.ts → 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)

+ 0 - 0
packages/llm/test/fixtures/media/restroom.png → packages/ai/test/fixtures/media/restroom.png


+ 0 - 0
packages/llm/test/fixtures/recordings/anthropic-messages-cache/writes-then-reads-cache-control-on-identical-second-call.json → packages/ai/test/fixtures/recordings/anthropic-messages-cache/writes-then-reads-cache-control-on-identical-second-call.json


+ 0 - 0
packages/llm/test/fixtures/recordings/anthropic-messages/accepts-malformed-assistant-tool-order-with-default-patch.json → packages/ai/test/fixtures/recordings/anthropic-messages/accepts-malformed-assistant-tool-order-with-default-patch.json


+ 0 - 0
packages/llm/test/fixtures/recordings/anthropic-messages/anthropic-opus-4-7-image-tool-result.json → packages/ai/test/fixtures/recordings/anthropic-messages/anthropic-opus-4-7-image-tool-result.json


+ 0 - 0
packages/llm/test/fixtures/recordings/anthropic-messages/claude-opus-4-7-drives-a-tool-loop.json → packages/ai/test/fixtures/recordings/anthropic-messages/claude-opus-4-7-drives-a-tool-loop.json


+ 0 - 0
packages/llm/test/fixtures/recordings/anthropic-messages/rejects-malformed-assistant-tool-order-without-patch.json → packages/ai/test/fixtures/recordings/anthropic-messages/rejects-malformed-assistant-tool-order-without-patch.json


+ 0 - 0
packages/llm/test/fixtures/recordings/anthropic-messages/streams-text.json → packages/ai/test/fixtures/recordings/anthropic-messages/streams-text.json


+ 0 - 0
packages/llm/test/fixtures/recordings/anthropic-messages/streams-tool-call.json → packages/ai/test/fixtures/recordings/anthropic-messages/streams-tool-call.json


+ 0 - 0
packages/llm/test/fixtures/recordings/bedrock-converse/drives-a-tool-loop.json → packages/ai/test/fixtures/recordings/bedrock-converse/drives-a-tool-loop.json


+ 0 - 0
packages/llm/test/fixtures/recordings/bedrock-converse/streams-a-tool-call.json → packages/ai/test/fixtures/recordings/bedrock-converse/streams-a-tool-call.json


+ 0 - 0
packages/llm/test/fixtures/recordings/bedrock-converse/streams-text.json → packages/ai/test/fixtures/recordings/bedrock-converse/streams-text.json


Некоторые файлы не были показаны из-за большого количества измененных файлов