agents 0.28.1 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-routing-BMvWTFEp.d.ts → agent-routing-CDbpVjYq.d.ts} +7 -8
- package/dist/agent-routing.d.ts +1 -1
- package/dist/agent-tool-types.d.ts +1 -1
- package/dist/{agent-tools-ohoewW-B.d.ts → agent-tools-C8DH8Yii.d.ts} +2 -2
- package/dist/agent-tools.d.ts +1 -1
- package/dist/{ai-ahruGw7e.d.ts → ai-iXw0uOGj.d.ts} +3 -3
- package/dist/{ai-sdk-C2iTAwUd.js → ai-sdk-DRPh2rRa.js} +185 -125
- package/dist/ai-sdk-DRPh2rRa.js.map +1 -0
- package/dist/browser/ai.d.ts +1 -1
- package/dist/browser/ai.js +2 -2
- package/dist/browser/index.d.ts +8 -8
- package/dist/browser/index.js +3 -3
- package/dist/browser/tools/ai-sdk.d.ts +2 -2
- package/dist/browser/tools/ai-sdk.js +1 -1
- package/dist/browser/tools/pi.d.ts +7 -3
- package/dist/browser/tools/pi.js +9 -5
- package/dist/browser/tools/pi.js.map +1 -1
- package/dist/browser/tools/tanstack-ai.d.ts +2 -2
- package/dist/browser/tools/tanstack-ai.js +1 -1
- package/dist/{browser-CEdNlsaD.js → browser-DccPw_wW.js} +130 -79
- package/dist/browser-DccPw_wW.js.map +1 -0
- package/dist/{browser-D30VlpcA.d.ts → browser-DlXhSAdf.d.ts} +41 -37
- package/dist/{browser-tool-4iomavs_.js → browser-tool-B1mhifin.js} +3 -3
- package/dist/{browser-tool-4iomavs_.js.map → browser-tool-B1mhifin.js.map} +1 -1
- package/dist/{browser-tool-vtrPOV8e.d.ts → browser-tool-Cxjk5sgG.d.ts} +2 -2
- package/dist/chat/index.d.ts +143 -71
- package/dist/chat/index.js +269 -110
- package/dist/chat/index.js.map +1 -1
- package/dist/chat-sdk/index.d.ts +1 -1
- package/dist/chat-sdk/index.js +1 -1
- package/dist/cli.js +53 -52
- package/dist/{client-Bp-JwL3p.d.ts → client-C27CtRZr.d.ts} +2 -2
- package/dist/client.d.ts +1 -1
- package/dist/{connector-DEXzVoaY.d.ts → connector-20DJ6p4k.d.ts} +2 -2
- package/dist/{connector-CtZylXdk.js → connector-DAXBOIIi.js} +2 -2
- package/dist/{connector-CtZylXdk.js.map → connector-DAXBOIIi.js.map} +1 -1
- package/dist/experimental/channels/web/index.js +1 -1
- package/dist/harness/container/index.js +1 -1
- package/dist/harness/container/index.js.map +1 -1
- package/dist/harness/opencode/index.js +1 -1
- package/dist/harness/pi/index.d.ts +70 -40
- package/dist/harness/pi/index.js +266 -330
- package/dist/harness/pi/index.js.map +1 -1
- package/dist/{images-C4hiIexM.js → images-xaDv2Fqe.js} +636 -168
- package/dist/images-xaDv2Fqe.js.map +1 -0
- package/dist/index-DCxk3OSJ.d.ts +378 -0
- package/dist/{index-kbSUIer3.d.ts → index-iv9FTXX9.d.ts} +80 -112
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{input-schema-xBofjBKC.js → input-schema-B0Etuo-o.js} +2 -2
- package/dist/{input-schema-xBofjBKC.js.map → input-schema-B0Etuo-o.js.map} +1 -1
- package/dist/lifecycle/index.js +1 -1
- package/dist/{lifecycle-DGorpAmA.js → lifecycle-v1rKHV2C.js} +67 -19
- package/dist/lifecycle-v1rKHV2C.js.map +1 -0
- package/dist/mcp/client/index.d.ts +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/models/ai-sdk/index.d.ts +29 -352
- package/dist/models/ai-sdk/index.js +1 -1
- package/dist/models/opencode/index.d.ts +25 -13
- package/dist/models/opencode/index.js +16 -11
- package/dist/models/opencode/index.js.map +1 -1
- package/dist/models/pi-ai/index.d.ts +13 -14
- package/dist/models/pi-ai/index.js +87 -34
- package/dist/models/pi-ai/index.js.map +1 -1
- package/dist/react.d.ts +2 -2
- package/dist/routing/index.d.ts +1 -1
- package/dist/serializable.d.ts +1 -1
- package/dist/{session-store-DoPY12xM.d.ts → session-store-_IK6dV-w.d.ts} +14 -2
- package/dist/{session-store-Do4xkDcf.js → session-store-yvwq1f9x.js} +55 -2
- package/dist/session-store-yvwq1f9x.js.map +1 -0
- package/dist/{settings-BjAiPd6Z.js → settings-Dk2il2Hf.js} +4 -1
- package/dist/settings-Dk2il2Hf.js.map +1 -0
- package/dist/skills/index.d.ts +22 -28
- package/dist/skills/index.js +183 -143
- package/dist/skills/index.js.map +1 -1
- package/dist/{src-CQxJFv4l.js → src-DfLzdwlK.js} +3 -3
- package/dist/src-DfLzdwlK.js.map +1 -0
- package/dist/sub-routing.d.ts +1 -1
- package/dist/{tool-VF0qiO7q.js → tool-DkT_DJBm.js} +2 -2
- package/dist/tool-DkT_DJBm.js.map +1 -0
- package/dist/transport-CPh7YGiw.d.ts +623 -0
- package/dist/voice/index.d.ts +1 -1
- package/dist/web/fetch/tools/pi.d.ts +10 -6
- package/dist/web/fetch/tools/pi.js +12 -8
- package/dist/web/fetch/tools/pi.js.map +1 -1
- package/dist/web/search/index.js +1 -1
- package/dist/web/search/tools/ai-sdk.js +2 -2
- package/dist/web/search/tools/pi.d.ts +10 -6
- package/dist/web/search/tools/pi.js +13 -9
- package/dist/web/search/tools/pi.js.map +1 -1
- package/dist/web/search/tools/tanstack-ai.js +2 -2
- package/dist/websockets/index.js +1 -1
- package/dist/{websockets-C3zy8YR0.js → websockets-CyoeosdO.js} +2 -2
- package/dist/{websockets-C3zy8YR0.js.map → websockets-CyoeosdO.js.map} +1 -1
- package/dist/workflow-types.d.ts +1 -1
- package/dist/workflows.d.ts +1 -1
- package/dist/workflows.js +1 -1
- package/docs/browse-the-web.md +1 -1
- package/docs/chat-agents.md +19 -18
- package/docs/harnesses/pi.md +101 -38
- package/docs/lifecycle.md +7 -1
- package/docs/models-pi-ai.md +66 -20
- package/docs/models.md +197 -172
- package/package.json +12 -7
- package/dist/ai-sdk-C2iTAwUd.js.map +0 -1
- package/dist/browser-CEdNlsaD.js.map +0 -1
- package/dist/images-C4hiIexM.js.map +0 -1
- package/dist/lifecycle-DGorpAmA.js.map +0 -1
- package/dist/session-store-Do4xkDcf.js.map +0 -1
- package/dist/settings-BjAiPd6Z.js.map +0 -1
- package/dist/settings-DnD__xuE.d.ts +0 -349
- package/dist/src-CQxJFv4l.js.map +0 -1
- package/dist/tool-VF0qiO7q.js.map +0 -1
- package/dist/transport-DCyarnwm.d.ts +0 -200
|
@@ -1,366 +1,44 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
o as CloudflareEmbeddingModelId,
|
|
10
|
-
p as KnownSpeechModelId,
|
|
11
|
-
r as ModelOptions$1,
|
|
12
|
-
s as CloudflareImageModelId,
|
|
13
|
-
t as AISettings,
|
|
14
|
-
u as CloudflareTranscriptionModelId
|
|
15
|
-
} from "../../settings-DnD__xuE.js";
|
|
16
|
-
import {
|
|
17
|
-
a as CloudflareAIError$1,
|
|
2
|
+
_ as DynamicRouteId,
|
|
3
|
+
b as WorkersAIModelId,
|
|
4
|
+
c as GatewayOptions,
|
|
5
|
+
d as CatalogModelId,
|
|
6
|
+
f as CloudflareEmbeddingModelId,
|
|
7
|
+
g as CloudflareTranscriptionModelId,
|
|
8
|
+
h as CloudflareSpeechModelId,
|
|
18
9
|
i as CloudflareAIAttempt,
|
|
10
|
+
m as CloudflareRerankingModelId,
|
|
19
11
|
o as CloudflareAIErrorCode,
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
p as CloudflareImageModelId,
|
|
13
|
+
s as AISettings,
|
|
14
|
+
u as ProviderGatewaySettings,
|
|
15
|
+
v as KnownImageModelId,
|
|
16
|
+
y as KnownSpeechModelId
|
|
17
|
+
} from "../../transport-CPh7YGiw.js";
|
|
22
18
|
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* One leg of a fallback chain: a Workers AI id, an AI Gateway dynamic route,
|
|
38
|
-
* or any AI SDK language model — including one this provider has already
|
|
39
|
-
* wrapped for the gateway.
|
|
40
|
-
*
|
|
41
|
-
* @experimental This surface is experimental and may change.
|
|
42
|
-
*/
|
|
43
|
-
type FallbackLeg = WorkersAIModelId | DynamicRouteId | LanguageModelV4;
|
|
44
|
-
/**
|
|
45
|
-
* Per-model and per-call options.
|
|
46
|
-
*
|
|
47
|
-
* The framework-neutral options, with the fallback leg type this module
|
|
48
|
-
* accepts: a leg may be a model object as well as a Workers AI id, because a
|
|
49
|
-
* third-party model is never an id here — it is a model its own provider
|
|
50
|
-
* package built.
|
|
51
|
-
*
|
|
52
|
-
* @experimental This surface is experimental and may change.
|
|
53
|
-
*/
|
|
54
|
-
type ModelOptions = ModelOptions$1<FallbackLeg>;
|
|
55
|
-
/**
|
|
56
|
-
* Which key authenticates a vendor model routed through AI Gateway.
|
|
57
|
-
*
|
|
58
|
-
* @experimental This surface is experimental and may change.
|
|
59
|
-
*/
|
|
60
|
-
interface VendorKeyOptions {
|
|
61
|
-
/**
|
|
62
|
-
* `"gateway"` (the default) strips the key the vendor's provider put on the
|
|
63
|
-
* request, so the gateway supplies one: unified billing, or a BYOK key
|
|
64
|
-
* stored on the gateway. `"request"` forwards that key to the vendor, for a
|
|
65
|
-
* key you hold yourself, e.g. `createAnthropic({ apiKey: env.ANTHROPIC_KEY })`.
|
|
66
|
-
*
|
|
67
|
-
* It belongs to the model it is set on, so a fallback leg keeps its own.
|
|
68
|
-
*/
|
|
69
|
-
vendorKey?: "gateway" | "request";
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* The options accepted next to a model object — `ai(anthropic("…"), { … })`.
|
|
73
|
-
* {@link ModelOptions} plus {@link VendorKeyOptions.vendorKey}; the
|
|
74
|
-
* Workers-AI-only knobs (`reasoningEffort`, `chatTemplateKwargs`) are ignored
|
|
75
|
-
* with a warning.
|
|
76
|
-
*
|
|
77
|
-
* @experimental This surface is experimental and may change.
|
|
78
|
-
*/
|
|
79
|
-
type GatewayModelOptions = ModelOptions & VendorKeyOptions;
|
|
80
|
-
/**
|
|
81
|
-
* The options `ai.routed()` takes: the gateway options, `headers`,
|
|
82
|
-
* `sessionAffinity` and `vendorKey`.
|
|
83
|
-
*
|
|
84
|
-
* A routed embedding, image, speech or transcription model is the vendor's
|
|
85
|
-
* own, and only its transport is ours — there is no chain to fall back through
|
|
86
|
-
* (a leg for one of those modalities would have to be another vendor's model,
|
|
87
|
-
* which this module cannot build) and no Workers AI reasoning knob to apply.
|
|
88
|
-
* They are absent from the type rather than dropped at runtime, so the mistake
|
|
89
|
-
* is a compile error naming the option.
|
|
90
|
-
*
|
|
91
|
-
* @experimental This surface is experimental and may change.
|
|
92
|
-
*/
|
|
93
|
-
type RoutedModelOptions = Omit<
|
|
94
|
-
ModelOptions,
|
|
95
|
-
"fallback" | "reasoningEffort" | "chatTemplateKwargs"
|
|
96
|
-
> &
|
|
97
|
-
VendorKeyOptions;
|
|
98
|
-
/**
|
|
99
|
-
* The options the Workers-AI-only methods take — `ai.embedding`, `ai.image`,
|
|
100
|
-
* `ai.speech`, `ai.transcription`, `ai.reranking`.
|
|
101
|
-
*
|
|
102
|
-
* Their fallback legs are ids: those models run through the Workers AI run
|
|
103
|
-
* path, which resolves a leg by id, so a model object would type-check and
|
|
104
|
-
* then be silently dropped.
|
|
105
|
-
*
|
|
106
|
-
* @experimental This surface is experimental and may change.
|
|
107
|
-
*/
|
|
108
|
-
type ModalityOptions = ModelOptions$1<WorkersAIModelId>;
|
|
109
|
-
//#endregion
|
|
110
|
-
//#region src/models/ai-sdk/errors.d.ts
|
|
111
|
-
/**
|
|
112
|
-
* Error thrown for every failed Cloudflare AI call, whether it came back as a
|
|
113
|
-
* non-2xx `Response` or as a thrown Workers AI binding error.
|
|
114
|
-
*
|
|
115
|
-
* Extends the AI SDK's `APICallError` so `ai`'s built-in retry loop honours
|
|
116
|
-
* {@link CloudflareAIError.isRetryable} without any extra wiring.
|
|
117
|
-
*
|
|
118
|
-
* @experimental This surface is experimental and may change.
|
|
119
|
-
*/
|
|
120
|
-
declare class CloudflareAIError extends APICallError {
|
|
121
|
-
/** HTTP status, when the failure carried one. */
|
|
122
|
-
readonly status: number | undefined;
|
|
123
|
-
/** Coarse classification used for routing and fallback decisions. */
|
|
124
|
-
readonly code: CloudflareAIErrorCode;
|
|
125
|
-
/** `cf-aig-log-id` of the failed request, when the response carried one. */
|
|
126
|
-
readonly logId: string | undefined;
|
|
127
|
-
/** The model id that produced this error. */
|
|
128
|
-
readonly model: string;
|
|
129
|
-
/** Every leg tried, when this error ends a fallback chain. */
|
|
130
|
-
readonly attempts: CloudflareAIAttempt[] | undefined;
|
|
131
|
-
constructor(options: {
|
|
132
|
-
message: string;
|
|
133
|
-
model: string;
|
|
134
|
-
url: string;
|
|
135
|
-
requestBodyValues: unknown;
|
|
136
|
-
status?: number;
|
|
137
|
-
code: CloudflareAIErrorCode;
|
|
138
|
-
logId?: string;
|
|
139
|
-
responseHeaders?: Record<string, string>;
|
|
140
|
-
responseBody?: string;
|
|
141
|
-
isRetryable?: boolean;
|
|
142
|
-
data?: unknown;
|
|
143
|
-
cause?: unknown;
|
|
144
|
-
attempts?: CloudflareAIAttempt[];
|
|
145
|
-
});
|
|
146
|
-
/** Lifts the framework-neutral core error into the AI SDK error type. */
|
|
147
|
-
static fromCore(error: CloudflareAIError$1): CloudflareAIError;
|
|
148
|
-
}
|
|
149
|
-
//#endregion
|
|
150
|
-
//#region src/models/ai-sdk/models/language.d.ts
|
|
151
|
-
/**
|
|
152
|
-
* Typed observability attached to every result under
|
|
153
|
-
* `providerMetadata.cloudflare`, so consumers never have to walk response
|
|
154
|
-
* objects looking for a gateway log id.
|
|
155
|
-
*
|
|
156
|
-
* @experimental This surface is experimental and may change.
|
|
157
|
-
*/
|
|
158
|
-
interface CloudflareMetadata {
|
|
159
|
-
/** The model that actually answered — the fallback leg, when one was used. */
|
|
160
|
-
model: string;
|
|
161
|
-
/** The gateway id the request went through. */
|
|
162
|
-
gateway: string;
|
|
163
|
-
/**
|
|
164
|
-
* The gateway provider slug the request was routed to, for a model reached
|
|
165
|
-
* through the universal gateway path. Absent for Workers AI.
|
|
166
|
-
*/
|
|
167
|
-
provider?: string;
|
|
168
|
-
/** `cf-aig-log-id`, or the binding's last log id. */
|
|
169
|
-
logId?: string;
|
|
170
|
-
/** `cf-aig-event-id` — correlates the requests of one gateway event. */
|
|
171
|
-
eventId?: string;
|
|
172
|
-
/** `cf-aig-request-id` — the gateway's id for this request. */
|
|
173
|
-
requestId?: string;
|
|
174
|
-
/** `cf-aig-trace-id` — the trace this request belongs to. */
|
|
175
|
-
traceId?: string;
|
|
176
|
-
/** `cf-aig-run-id`, when the gateway sends one. */
|
|
177
|
-
runId?: string;
|
|
178
|
-
/** `cf-aig-cache-status`, e.g. `HIT` or `MISS`. */
|
|
179
|
-
cacheStatus?: string;
|
|
180
|
-
/** `cf-aig-step` — which step of a gateway route answered. */
|
|
181
|
-
step?: number;
|
|
182
|
-
}
|
|
183
|
-
/** Everything a language model needs from the provider that created it. */
|
|
184
|
-
interface LanguageModelConfig {
|
|
185
|
-
transport: Transport;
|
|
186
|
-
/**
|
|
187
|
-
* The provider-wide gateway defaults, in any of the spellings `createAI`
|
|
188
|
-
* takes: a bare id, a `gateway` object, or the whole settings object with
|
|
189
|
-
* the flat gateway keys on it.
|
|
190
|
-
*/
|
|
191
|
-
providerGateway: string | ProviderGatewaySettings | undefined;
|
|
192
|
-
}
|
|
193
|
-
//#endregion
|
|
194
|
-
//#region src/models/ai-sdk/models/gateway.d.ts
|
|
195
|
-
/**
|
|
196
|
-
* A `LanguageModelV4` that is the user's own vendor model, routed through AI
|
|
197
|
-
* Gateway. Generation, parsing, tool handling and error shapes stay the
|
|
198
|
-
* vendor's; only the transport is Cloudflare's.
|
|
199
|
-
*
|
|
200
|
-
* @experimental This surface is experimental and may change.
|
|
201
|
-
*/
|
|
202
|
-
declare class GatewayLanguageModel implements LanguageModelV4 {
|
|
203
|
-
#private;
|
|
204
|
-
readonly specificationVersion: "v4";
|
|
205
|
-
constructor(
|
|
206
|
-
model: LanguageModelV4,
|
|
207
|
-
options: GatewayModelOptions | undefined,
|
|
208
|
-
config: LanguageModelConfig
|
|
209
|
-
);
|
|
210
|
-
/** The vendor's own provider name — `anthropic.messages`, `openai.responses`. */
|
|
211
|
-
get provider(): string;
|
|
212
|
-
/** The vendor's own id spelling, which the gateway requires verbatim. */
|
|
213
|
-
get modelId(): string;
|
|
214
|
-
get supportedUrls(): LanguageModelV4["supportedUrls"];
|
|
215
|
-
/** The model this wraps, for callers that need the vendor object back. */
|
|
216
|
-
get model(): LanguageModelV4;
|
|
217
|
-
doGenerate(
|
|
218
|
-
options: LanguageModelV4CallOptions
|
|
219
|
-
): Promise<LanguageModelV4GenerateResult>;
|
|
220
|
-
doStream(
|
|
221
|
-
options: LanguageModelV4CallOptions
|
|
222
|
-
): Promise<LanguageModelV4StreamResult>;
|
|
223
|
-
}
|
|
224
|
-
//#endregion
|
|
225
|
-
//#region src/models/ai-sdk/index.d.ts
|
|
226
|
-
/**
|
|
227
|
-
* The provider `createAI` returns. Call it with a Workers AI id or with a
|
|
228
|
-
* model another provider built.
|
|
229
|
-
*
|
|
230
|
-
* It satisfies `ProviderV4`, so it drops into
|
|
231
|
-
* `createProviderRegistry({ cloudflare: ai })` and into
|
|
232
|
-
* `globalThis.AI_SDK_DEFAULT_PROVIDER`, where the AI SDK resolves a bare
|
|
233
|
-
* `model: "@cf/…"` string through it. That is why the named methods also
|
|
234
|
-
* accept a plain `string`: a registry has only the string, and an id that is
|
|
235
|
-
* not a Workers AI one throws there exactly as it does here.
|
|
236
|
-
*
|
|
237
|
-
* @experimental This surface is experimental and may change.
|
|
238
|
-
*/
|
|
239
|
-
interface AI {
|
|
240
|
-
/** A Workers AI model. Third-party ids are not ids here — pass the model. */
|
|
241
|
-
(modelId: WorkersAIModelId, options?: ModelOptions): LanguageModelV4;
|
|
242
|
-
/**
|
|
243
|
-
* An AI Gateway dynamic route, `dynamic/<route>`: the route configured on
|
|
244
|
-
* the gateway picks the model, and it answers like a chat model.
|
|
245
|
-
*/
|
|
246
|
-
(route: DynamicRouteId, options?: ModelOptions): LanguageModelV4;
|
|
247
|
-
/** Any AI SDK v4 language model, routed through AI Gateway. */
|
|
248
|
-
(model: LanguageModelV4, options?: GatewayModelOptions): LanguageModelV4;
|
|
249
|
-
/** The AI SDK provider specification this implements. */
|
|
250
|
-
readonly specificationVersion: "v4";
|
|
251
|
-
/** Same as calling the provider directly. */
|
|
252
|
-
languageModel(
|
|
253
|
-
modelId: WorkersAIModelId,
|
|
254
|
-
options?: ModelOptions
|
|
255
|
-
): LanguageModelV4;
|
|
256
|
-
languageModel(route: DynamicRouteId, options?: ModelOptions): LanguageModelV4;
|
|
257
|
-
languageModel(
|
|
258
|
-
model: LanguageModelV4,
|
|
259
|
-
options?: GatewayModelOptions
|
|
260
|
-
): LanguageModelV4;
|
|
261
|
-
/** The `ProviderV4` shape: a registry resolves models by string alone. */
|
|
262
|
-
languageModel(modelId: string, options?: ModelOptions): LanguageModelV4;
|
|
263
|
-
/**
|
|
264
|
-
* Any other v4 model a vendor built — embedding, image, speech,
|
|
265
|
-
* transcription — routed through AI Gateway with its own code intact.
|
|
266
|
-
*
|
|
267
|
-
* The options are the gateway ones: a routed model has no chain to fall back
|
|
268
|
-
* through and no Workers AI reasoning knob to apply, so
|
|
269
|
-
* {@link RoutedModelOptions} leaves those out rather than dropping them.
|
|
270
|
-
*/
|
|
271
|
-
routed<T extends object>(model: T, options?: RoutedModelOptions): T;
|
|
272
|
-
/** A text-embedding model from the Workers AI catalog. */
|
|
273
|
-
embedding(
|
|
274
|
-
modelId: CloudflareEmbeddingModelId,
|
|
275
|
-
options?: ModalityOptions
|
|
276
|
-
): EmbeddingModelV4;
|
|
277
|
-
/** Alias of {@link AI.embedding}, the `ProviderV4` method name. */
|
|
278
|
-
embeddingModel(
|
|
279
|
-
modelId: CloudflareEmbeddingModelId,
|
|
280
|
-
options?: ModalityOptions
|
|
281
|
-
): EmbeddingModelV4;
|
|
282
|
-
/**
|
|
283
|
-
* Alias of {@link AI.embedding}.
|
|
284
|
-
*
|
|
285
|
-
* @deprecated `embeddingModel` is the `ProviderV4` name; this is the older
|
|
286
|
-
* `ProviderV2`/`ProviderV3` spelling, kept for one release.
|
|
287
|
-
*/
|
|
288
|
-
textEmbeddingModel(
|
|
289
|
-
modelId: CloudflareEmbeddingModelId,
|
|
290
|
-
options?: ModalityOptions
|
|
291
|
-
): EmbeddingModelV4;
|
|
292
|
-
/** A text-to-image model from the Workers AI catalog. */
|
|
293
|
-
image(
|
|
294
|
-
modelId: CloudflareImageModelId,
|
|
295
|
-
options?: ModalityOptions
|
|
296
|
-
): ImageModelV4;
|
|
297
|
-
/** Alias of {@link AI.image}, the `ProviderV4` method name. */
|
|
298
|
-
imageModel(
|
|
299
|
-
modelId: CloudflareImageModelId,
|
|
300
|
-
options?: ModalityOptions
|
|
301
|
-
): ImageModelV4;
|
|
302
|
-
/** A speech-recognition model from the Workers AI catalog. */
|
|
303
|
-
transcription(
|
|
304
|
-
modelId: CloudflareTranscriptionModelId,
|
|
305
|
-
options?: ModalityOptions
|
|
306
|
-
): TranscriptionModelV4;
|
|
307
|
-
/** Alias of {@link AI.transcription}, the `ProviderV4` method name. */
|
|
308
|
-
transcriptionModel(
|
|
309
|
-
modelId: CloudflareTranscriptionModelId,
|
|
310
|
-
options?: ModalityOptions
|
|
311
|
-
): TranscriptionModelV4;
|
|
312
|
-
/** A text-to-speech model from the Workers AI catalog. */
|
|
313
|
-
speech(
|
|
314
|
-
modelId: CloudflareSpeechModelId,
|
|
315
|
-
options?: ModalityOptions
|
|
316
|
-
): SpeechModelV4;
|
|
317
|
-
/** Alias of {@link AI.speech}, the `ProviderV4` method name. */
|
|
318
|
-
speechModel(
|
|
319
|
-
modelId: CloudflareSpeechModelId,
|
|
320
|
-
options?: ModalityOptions
|
|
321
|
-
): SpeechModelV4;
|
|
322
|
-
/** A reranking model from the Workers AI catalog. */
|
|
323
|
-
reranking(
|
|
324
|
-
modelId: CloudflareRerankingModelId,
|
|
325
|
-
options?: ModalityOptions
|
|
326
|
-
): RerankingModelV4;
|
|
327
|
-
/** Alias of {@link AI.reranking}, the `ProviderV4` method name. */
|
|
328
|
-
rerankingModel(
|
|
329
|
-
modelId: CloudflareRerankingModelId,
|
|
330
|
-
options?: ModalityOptions
|
|
331
|
-
): RerankingModelV4;
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Creates a provider over Workers AI, and over every vendor AI Gateway can
|
|
335
|
-
* reach.
|
|
336
|
-
*
|
|
337
|
-
* The Workers AI binding is the only way in — Workers AI models go through
|
|
338
|
-
* `env.AI.run`, vendor models through `env.AI.gateway(id).run`, and there is
|
|
339
|
-
* no HTTP transport and no API token. Gateway options are flat (`id`,
|
|
340
|
-
* `cacheTtl`, …) or nested under `gateway`; per-model options and per-call
|
|
341
|
-
* `providerOptions.cloudflare` override them in that order.
|
|
342
|
-
*
|
|
343
|
-
* ```ts
|
|
344
|
-
* const ai = createAI({ binding: env.AI, id: "prod", cacheTtl: 60 });
|
|
345
|
-
* const anthropic = createAnthropic({ apiKey: "cloudflare" });
|
|
346
|
-
*
|
|
347
|
-
* ai("@cf/zai-org/glm-4.7-flash");
|
|
348
|
-
* ai(anthropic("claude-opus-4-8"), { fallback: [ai("@cf/zai-org/glm-4.7-flash")] });
|
|
349
|
-
* ai.embedding("@cf/baai/bge-base-en-v1.5");
|
|
350
|
-
* ```
|
|
351
|
-
*
|
|
352
|
-
* @experimental This surface is experimental and may change.
|
|
353
|
-
*/
|
|
354
|
-
declare function createAI(settings: AISettings): AI;
|
|
355
|
-
//#endregion
|
|
19
|
+
a as CloudflareAIError,
|
|
20
|
+
c as GatewayModelOptions,
|
|
21
|
+
d as RoutedModelOptions,
|
|
22
|
+
f as VendorKeyOptions,
|
|
23
|
+
i as CloudflareMetadata,
|
|
24
|
+
l as ModalityOptions,
|
|
25
|
+
n as createAI,
|
|
26
|
+
o as CloudflareLanguageModelId,
|
|
27
|
+
r as GatewayLanguageModel,
|
|
28
|
+
s as FallbackLeg,
|
|
29
|
+
t as AI,
|
|
30
|
+
u as ModelOptions
|
|
31
|
+
} from "../../index-DCxk3OSJ.js";
|
|
356
32
|
export {
|
|
357
33
|
AI,
|
|
358
34
|
type AISettings,
|
|
35
|
+
type CatalogModelId,
|
|
359
36
|
type CloudflareAIAttempt,
|
|
360
37
|
CloudflareAIError,
|
|
361
38
|
type CloudflareAIErrorCode,
|
|
362
39
|
type CloudflareEmbeddingModelId,
|
|
363
40
|
type CloudflareImageModelId,
|
|
41
|
+
type CloudflareLanguageModelId,
|
|
364
42
|
type CloudflareMetadata,
|
|
365
43
|
type CloudflareRerankingModelId,
|
|
366
44
|
type CloudflareSpeechModelId,
|
|
@@ -380,4 +58,3 @@ export {
|
|
|
380
58
|
type WorkersAIModelId,
|
|
381
59
|
createAI
|
|
382
60
|
};
|
|
383
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as GatewayLanguageModel, r as CloudflareAIError, t as createAI } from "../../ai-sdk-
|
|
1
|
+
import { n as GatewayLanguageModel, r as CloudflareAIError, t as createAI } from "../../ai-sdk-DRPh2rRa.js";
|
|
2
2
|
export { CloudflareAIError, GatewayLanguageModel, createAI };
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
_ as DynamicRouteId,
|
|
3
|
+
b as WorkersAIModelId,
|
|
4
|
+
c as GatewayOptions,
|
|
5
|
+
d as CatalogModelId,
|
|
6
|
+
s as AISettings
|
|
7
|
+
} from "../../transport-CPh7YGiw.js";
|
|
8
|
+
import {
|
|
9
|
+
o as CloudflareLanguageModelId,
|
|
10
|
+
u as ModelOptions
|
|
11
|
+
} from "../../index-DCxk3OSJ.js";
|
|
7
12
|
import { Plugin } from "@opencode/plugin";
|
|
8
13
|
|
|
9
14
|
//#region src/models/opencode/index.d.ts
|
|
@@ -27,25 +32,29 @@ type OpenCodeModelOptions = ModelOptions & {
|
|
|
27
32
|
readonly limit?: OpenCodeModelLimit;
|
|
28
33
|
};
|
|
29
34
|
/**
|
|
30
|
-
* The provider `createAI` returns. Call it with a Workers AI id
|
|
31
|
-
*
|
|
35
|
+
* The provider `createAI` returns. Call it with a model id — a Workers AI id,
|
|
36
|
+
* an AI Gateway catalog id, or a dynamic route — to register the model with
|
|
37
|
+
* the plugin and get OpenCode's reference to it.
|
|
32
38
|
*/
|
|
33
39
|
interface AI {
|
|
34
|
-
/** A
|
|
35
|
-
(
|
|
40
|
+
/** A model, registered with the plugin. */
|
|
41
|
+
(
|
|
42
|
+
modelId: CloudflareLanguageModelId,
|
|
43
|
+
options?: OpenCodeModelOptions
|
|
44
|
+
): OpenCodeModel;
|
|
36
45
|
/** Same as calling the provider directly. */
|
|
37
46
|
model(
|
|
38
|
-
modelId:
|
|
47
|
+
modelId: CloudflareLanguageModelId,
|
|
39
48
|
options?: OpenCodeModelOptions
|
|
40
49
|
): OpenCodeModel;
|
|
41
50
|
/** The OpenCode plugin. Pass it in `OpenCodeWorkerd.create({ plugins })`. */
|
|
42
51
|
readonly plugin: Plugin.Plugin;
|
|
43
52
|
}
|
|
44
53
|
/**
|
|
45
|
-
* Create
|
|
54
|
+
* Create Cloudflare's model provider for OpenCode.
|
|
46
55
|
*
|
|
47
|
-
* @param settings - The `AI` binding and
|
|
48
|
-
* `agents/models/ai-sdk`.
|
|
56
|
+
* @param settings - The `AI` binding, or an account id and API token, and
|
|
57
|
+
* gateway defaults, as for `agents/models/ai-sdk`.
|
|
49
58
|
* @returns The provider: call it with model ids; register `plugin`.
|
|
50
59
|
*/
|
|
51
60
|
declare function createAI(settings: AISettings): AI;
|
|
@@ -54,6 +63,9 @@ export {
|
|
|
54
63
|
AI,
|
|
55
64
|
type AISettings,
|
|
56
65
|
CLOUDFLARE_PROVIDER_ID,
|
|
66
|
+
type CatalogModelId,
|
|
67
|
+
type CloudflareLanguageModelId,
|
|
68
|
+
type DynamicRouteId,
|
|
57
69
|
type GatewayOptions,
|
|
58
70
|
type ModelOptions,
|
|
59
71
|
OpenCodeModel,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as createAI$1 } from "../../ai-sdk-
|
|
1
|
+
import { t as createAI$1 } from "../../ai-sdk-DRPh2rRa.js";
|
|
2
2
|
import { Model, Provider } from "@opencode/plugin";
|
|
3
3
|
//#region src/models/opencode/language-v3.ts
|
|
4
4
|
/**
|
|
@@ -171,8 +171,8 @@ function generatedFile(part) {
|
|
|
171
171
|
//#endregion
|
|
172
172
|
//#region src/models/opencode/index.ts
|
|
173
173
|
/**
|
|
174
|
-
* `agents/models/opencode` —
|
|
175
|
-
* same shape as `agents/models/ai-sdk` and `agents/models/pi-ai`.
|
|
174
|
+
* `agents/models/opencode` — Cloudflare's models as an OpenCode provider, with
|
|
175
|
+
* the same shape as `agents/models/ai-sdk` and `agents/models/pi-ai`.
|
|
176
176
|
*
|
|
177
177
|
* ```ts
|
|
178
178
|
* import { createAI } from "agents/models/opencode";
|
|
@@ -181,14 +181,18 @@ function generatedFile(part) {
|
|
|
181
181
|
* const ai = createAI({ binding: env.AI });
|
|
182
182
|
*
|
|
183
183
|
* const model = ai("@cf/moonshotai/kimi-k2.7-code"); // { providerID, id }
|
|
184
|
+
* ai("anthropic/claude-opus-4.8"); // an AI Gateway catalog model
|
|
184
185
|
* await OpenCodeWorkerd.create({ storage, plugins: [ai.plugin] });
|
|
185
186
|
* ```
|
|
186
187
|
*
|
|
187
188
|
* `ai.plugin` is an OpenCode plugin. It adds a `cloudflare` provider whose
|
|
188
|
-
* models are the ids you have called `ai(id)` with
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
189
|
+
* models are the ids you have called `ai(id)` with — Workers AI ids, AI
|
|
190
|
+
* Gateway catalog ids and dynamic routes — and answers OpenCode's AI SDK hook
|
|
191
|
+
* with `agents/models/ai-sdk`'s models, so requests go the way that
|
|
192
|
+
* provider sends them: through the `AI` binding, or over HTTP with an account
|
|
193
|
+
* id and API token. Nothing is patched globally. Catalog streams through the
|
|
194
|
+
* binding resume after a dropped connection, as they do in
|
|
195
|
+
* `agents/models/ai-sdk`.
|
|
192
196
|
*
|
|
193
197
|
* @experimental The surface may change in any release.
|
|
194
198
|
*
|
|
@@ -213,10 +217,10 @@ const DEFAULT_LIMIT = {
|
|
|
213
217
|
output: 8192
|
|
214
218
|
};
|
|
215
219
|
/**
|
|
216
|
-
* Create
|
|
220
|
+
* Create Cloudflare's model provider for OpenCode.
|
|
217
221
|
*
|
|
218
|
-
* @param settings - The `AI` binding and
|
|
219
|
-
* `agents/models/ai-sdk`.
|
|
222
|
+
* @param settings - The `AI` binding, or an account id and API token, and
|
|
223
|
+
* gateway defaults, as for `agents/models/ai-sdk`.
|
|
220
224
|
* @returns The provider: call it with model ids; register `plugin`.
|
|
221
225
|
*/
|
|
222
226
|
function createAI(settings) {
|
|
@@ -239,7 +243,7 @@ function createAI(settings) {
|
|
|
239
243
|
editor.add({
|
|
240
244
|
info: {
|
|
241
245
|
id: providerID,
|
|
242
|
-
name: "Cloudflare
|
|
246
|
+
name: "Cloudflare",
|
|
243
247
|
activation: "enabled",
|
|
244
248
|
package: CARRIER_PACKAGE,
|
|
245
249
|
settings: {
|
|
@@ -264,6 +268,7 @@ function createAI(settings) {
|
|
|
264
268
|
}
|
|
265
269
|
};
|
|
266
270
|
const model = (modelId, options) => {
|
|
271
|
+
aiSdk.languageModel(modelId, options);
|
|
267
272
|
const changed = !models.has(modelId) || JSON.stringify(models.get(modelId)?.limit) !== JSON.stringify(options?.limit);
|
|
268
273
|
models.set(modelId, options);
|
|
269
274
|
if (changed) for (const reload of reloads) reload().catch((error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["createAISDK"],"sources":["../../../src/models/opencode/language-v3.ts","../../../src/models/opencode/index.ts"],"sourcesContent":["import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FilePart,\n LanguageModelV3Message,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolResultOutput,\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FilePart,\n LanguageModelV4Message,\n LanguageModelV4StreamPart,\n LanguageModelV4ToolResultOutput,\n SharedV3Warning,\n SharedV4FileData,\n SharedV4Warning\n} from \"@ai-sdk/provider\";\n\n/**\n * OpenCode loads AI SDK models through the `LanguageModelV3` contract;\n * `agents/models/ai-sdk` implements `LanguageModelV4`. The two differ only in\n * how files are carried (V4 wraps file data in a tagged union and folds the\n * image variants into one `file` part) and in the parts V4 added (`custom`,\n * `reasoning-file`), which V3 has no slot for and are dropped. Text,\n * reasoning, tool calls, usage and finish reasons are the same shape.\n */\nexport function asLanguageModelV3(model: LanguageModelV4): LanguageModelV3 {\n return {\n specificationVersion: \"v3\",\n provider: model.provider,\n modelId: model.modelId,\n supportedUrls: model.supportedUrls,\n async doGenerate(options) {\n const result = await model.doGenerate(callOptions(options));\n return {\n ...result,\n warnings: result.warnings.map(warning),\n content: result.content.flatMap((part) => {\n const converted = content(part);\n return converted === undefined ? [] : [converted];\n })\n };\n },\n async doStream(options) {\n const result = await model.doStream(callOptions(options));\n return {\n ...result,\n stream: result.stream.pipeThrough(\n new TransformStream<\n LanguageModelV4StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(part, controller) {\n const converted = streamPart(part);\n if (converted !== undefined) controller.enqueue(converted);\n }\n })\n )\n };\n }\n };\n}\n\nfunction callOptions(\n options: LanguageModelV3CallOptions\n): LanguageModelV4CallOptions {\n return { ...options, prompt: options.prompt.map(message) };\n}\n\nfunction message(input: LanguageModelV3Message): LanguageModelV4Message {\n switch (input.role) {\n case \"system\":\n return input;\n case \"user\":\n return {\n ...input,\n content: input.content.map((part) =>\n part.type === \"file\" ? filePart(part) : part\n )\n };\n case \"assistant\":\n return {\n ...input,\n content: input.content.map((part) => {\n if (part.type === \"file\") return filePart(part);\n if (part.type === \"tool-result\") {\n return { ...part, output: toolOutput(part.output) };\n }\n return part;\n })\n };\n case \"tool\":\n return {\n ...input,\n content: input.content.map((part) =>\n part.type === \"tool-result\"\n ? { ...part, output: toolOutput(part.output) }\n : part\n )\n };\n }\n}\n\nfunction filePart(part: LanguageModelV3FilePart): LanguageModelV4FilePart {\n return { ...part, data: fileData(part.data) };\n}\n\nfunction fileData(data: LanguageModelV3FilePart[\"data\"]): SharedV4FileData {\n return data instanceof URL\n ? { type: \"url\", url: data }\n : { type: \"data\", data };\n}\n\nfunction toolOutput(\n output: LanguageModelV3ToolResultOutput\n): LanguageModelV4ToolResultOutput {\n if (output.type !== \"content\") return output;\n return {\n ...output,\n value: output.value.map((item) => {\n switch (item.type) {\n case \"text\":\n return item;\n case \"file-data\":\n case \"image-data\":\n return {\n type: \"file\" as const,\n data: { type: \"data\" as const, data: item.data },\n mediaType: item.mediaType,\n ...(\"filename\" in item && item.filename !== undefined\n ? { filename: item.filename }\n : {}),\n providerOptions: item.providerOptions\n };\n case \"file-url\":\n case \"image-url\":\n return {\n type: \"file\" as const,\n data: { type: \"url\" as const, url: new URL(item.url) },\n mediaType:\n item.type === \"image-url\"\n ? \"image/*\"\n : \"application/octet-stream\",\n providerOptions: item.providerOptions\n };\n case \"file-id\":\n case \"image-file-id\":\n return {\n type: \"file\" as const,\n data: {\n type: \"reference\" as const,\n reference:\n typeof item.fileId === \"string\"\n ? { id: item.fileId }\n : item.fileId\n },\n mediaType:\n item.type === \"image-file-id\"\n ? \"image/*\"\n : \"application/octet-stream\",\n providerOptions: item.providerOptions\n };\n case \"custom\":\n return {\n type: \"custom\" as const,\n providerOptions: item.providerOptions\n };\n }\n })\n };\n}\n\nfunction content(\n part: LanguageModelV4Content\n): LanguageModelV3Content | undefined {\n switch (part.type) {\n case \"custom\":\n case \"reasoning-file\":\n return undefined;\n case \"file\":\n return generatedFile(part);\n default:\n return part;\n }\n}\n\nfunction streamPart(\n part: LanguageModelV4StreamPart\n): LanguageModelV3StreamPart | undefined {\n switch (part.type) {\n case \"custom\":\n case \"reasoning-file\":\n return undefined;\n case \"file\":\n return generatedFile(part);\n case \"stream-start\":\n return { ...part, warnings: part.warnings.map(warning) };\n default:\n return part;\n }\n}\n\n/** V4 added `deprecated` warnings; V3 reports them as `other`. */\nfunction warning(input: SharedV4Warning): SharedV3Warning {\n return input.type === \"deprecated\"\n ? { type: \"other\", message: `${input.setting}: ${input.message}` }\n : input;\n}\n\nfunction generatedFile(\n part: Extract<LanguageModelV4Content, { type: \"file\" }>\n): Extract<LanguageModelV3Content, { type: \"file\" }> | undefined {\n // V3 carries generated files inline only; a URL file has no V3 form.\n if (part.data.type !== \"data\") return undefined;\n return {\n type: \"file\",\n mediaType: part.mediaType,\n data: part.data.data,\n ...(part.providerMetadata === undefined\n ? {}\n : { providerMetadata: part.providerMetadata })\n };\n}\n","/**\n * `agents/models/opencode` — Workers AI as an OpenCode provider, with the\n * same shape as `agents/models/ai-sdk` and `agents/models/pi-ai`.\n *\n * ```ts\n * import { createAI } from \"agents/models/opencode\";\n * import { OpenCodeWorkerd } from \"@opencode/sdk/workerd\";\n *\n * const ai = createAI({ binding: env.AI });\n *\n * const model = ai(\"@cf/moonshotai/kimi-k2.7-code\"); // { providerID, id }\n * await OpenCodeWorkerd.create({ storage, plugins: [ai.plugin] });\n * ```\n *\n * `ai.plugin` is an OpenCode plugin. It adds a `cloudflare` provider whose\n * models are the ids you have called `ai(id)` with, and answers OpenCode's\n * AI SDK hook with `agents/models/ai-sdk`'s models, so requests go through\n * the `AI` binding: no account id, API token, or HTTP route to Workers AI in\n * your Worker, and nothing patched globally.\n *\n * @experimental The surface may change in any release.\n *\n * @module\n */\n\nimport { Model, Provider, type Plugin } from \"@opencode/plugin\";\nimport type { WorkersAIModelId } from \"../core/catalog\";\nimport type { AISettings, ModelOptions } from \"../core/settings\";\nimport { createAI as createAISDK } from \"../ai-sdk\";\nimport { asLanguageModelV3 } from \"./language-v3\";\n\nexport type { WorkersAIModelId } from \"../core/catalog\";\nexport type {\n AISettings,\n GatewayOptions,\n ModelOptions\n} from \"../core/settings\";\n\n/** The OpenCode provider id `createAI`'s plugin registers. */\nexport const CLOUDFLARE_PROVIDER_ID = \"cloudflare\";\n\n/**\n * The AI SDK package OpenCode is told the provider uses. OpenCode builds an\n * AI SDK model in two hook steps: `sdk` (load the package) and `language`\n * (make the model). Its `sdk` step can only load packages it bundles; any\n * other is handed to an npm installer that cannot run in workerd, and an\n * external plugin's `sdk` hook runs after that installer. So the provider\n * names `@ai-sdk/vercel`, which OpenCode bundles and loads in-process, and\n * this plugin's `language` hook replaces the model it would make. The\n * Vercel client is built but never called: its base URL does not resolve.\n */\nconst CARRIER_PACKAGE = \"aisdk:@ai-sdk/vercel\";\nconst UNREACHABLE_BASE_URL = \"https://workers-ai.binding.invalid/v1\";\n\n/**\n * A model as OpenCode references one: pass it to `OpenCodeHarness`'s\n * `defaults.model`, `session.setModel`, or OpenCode's `sessions.switchModel`.\n */\nexport type OpenCodeModel = {\n readonly providerID: string;\n readonly id: string;\n};\n\n/** How OpenCode budgets a model's context. */\nexport type OpenCodeModelLimit = {\n /** Context window, in tokens. Default 128_000. */\n readonly context: number;\n /** Most tokens OpenCode asks the model to generate. Default 8_192. */\n readonly output: number;\n};\n\n/** Options for one model: `agents/models/ai-sdk`'s, plus OpenCode's limit. */\nexport type OpenCodeModelOptions = ModelOptions & {\n readonly limit?: OpenCodeModelLimit;\n};\n\nconst DEFAULT_LIMIT: OpenCodeModelLimit = { context: 128_000, output: 8_192 };\n\n/**\n * The provider `createAI` returns. Call it with a Workers AI id to register\n * the model with the plugin and get OpenCode's reference to it.\n */\nexport interface AI {\n /** A Workers AI model, registered with the plugin. */\n (modelId: WorkersAIModelId, options?: OpenCodeModelOptions): OpenCodeModel;\n /** Same as calling the provider directly. */\n model(\n modelId: WorkersAIModelId,\n options?: OpenCodeModelOptions\n ): OpenCodeModel;\n /** The OpenCode plugin. Pass it in `OpenCodeWorkerd.create({ plugins })`. */\n readonly plugin: Plugin.Plugin;\n}\n\n/**\n * Create the Workers AI provider for OpenCode.\n *\n * @param settings - The `AI` binding and gateway defaults, as for\n * `agents/models/ai-sdk`.\n * @returns The provider: call it with model ids; register `plugin`.\n */\nexport function createAI(settings: AISettings): AI {\n const aiSdk = createAISDK(settings);\n const models = new Map<string, OpenCodeModelOptions | undefined>();\n /** One reload per OpenCode instance the plugin is set up in. */\n const reloads = new Set<() => Promise<void>>();\n const providerID = Provider.ID.make(CLOUDFLARE_PROVIDER_ID);\n\n const info = (id: string, options: OpenCodeModelOptions | undefined) => {\n const defaults = Model.Info.default(providerID, Model.ID.make(id));\n return {\n ...defaults,\n package: CARRIER_PACKAGE,\n limit: options?.limit ?? DEFAULT_LIMIT\n };\n };\n\n const plugin: Plugin.Plugin = {\n id: \"agents.models.opencode\",\n async setup(ctx) {\n const transform = await ctx.provider.transform((editor) => {\n editor.add({\n info: {\n id: providerID,\n name: \"Cloudflare Workers AI\",\n activation: \"enabled\",\n package: CARRIER_PACKAGE,\n settings: { baseURL: UNREACHABLE_BASE_URL, apiKey: \"binding\" }\n },\n models: [...models].map(([id, options]) => info(id, options))\n });\n });\n const hook = await ctx.aisdk.hook(\n \"language\",\n (event) => {\n const id = event.model.modelID ?? event.model.id;\n event.language = asLanguageModelV3(\n aiSdk.languageModel(id, models.get(id))\n );\n },\n { providerID }\n );\n const reload = () => ctx.provider.reload();\n reloads.add(reload);\n return async () => {\n reloads.delete(reload);\n await hook.dispose();\n await transform.dispose();\n };\n }\n };\n\n const model = (\n modelId: WorkersAIModelId,\n options?: OpenCodeModelOptions\n ): OpenCodeModel => {\n const changed =\n !models.has(modelId) ||\n JSON.stringify(models.get(modelId)?.limit) !==\n JSON.stringify(options?.limit);\n models.set(modelId, options);\n // A model named, or its limit changed, after OpenCode started: rebuild\n // the provider's model list.\n if (changed) {\n for (const reload of reloads) {\n reload().catch((error: unknown) => {\n console.warn(\"agents/models/opencode: provider reload failed\", error);\n });\n }\n }\n return { providerID: CLOUDFLARE_PROVIDER_ID, id: modelId };\n };\n\n return Object.assign(model, { model, plugin });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["createAISDK"],"sources":["../../../src/models/opencode/language-v3.ts","../../../src/models/opencode/index.ts"],"sourcesContent":["import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FilePart,\n LanguageModelV3Message,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolResultOutput,\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FilePart,\n LanguageModelV4Message,\n LanguageModelV4StreamPart,\n LanguageModelV4ToolResultOutput,\n SharedV3Warning,\n SharedV4FileData,\n SharedV4Warning\n} from \"@ai-sdk/provider\";\n\n/**\n * OpenCode loads AI SDK models through the `LanguageModelV3` contract;\n * `agents/models/ai-sdk` implements `LanguageModelV4`. The two differ only in\n * how files are carried (V4 wraps file data in a tagged union and folds the\n * image variants into one `file` part) and in the parts V4 added (`custom`,\n * `reasoning-file`), which V3 has no slot for and are dropped. Text,\n * reasoning, tool calls, usage and finish reasons are the same shape.\n */\nexport function asLanguageModelV3(model: LanguageModelV4): LanguageModelV3 {\n return {\n specificationVersion: \"v3\",\n provider: model.provider,\n modelId: model.modelId,\n supportedUrls: model.supportedUrls,\n async doGenerate(options) {\n const result = await model.doGenerate(callOptions(options));\n return {\n ...result,\n warnings: result.warnings.map(warning),\n content: result.content.flatMap((part) => {\n const converted = content(part);\n return converted === undefined ? [] : [converted];\n })\n };\n },\n async doStream(options) {\n const result = await model.doStream(callOptions(options));\n return {\n ...result,\n stream: result.stream.pipeThrough(\n new TransformStream<\n LanguageModelV4StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(part, controller) {\n const converted = streamPart(part);\n if (converted !== undefined) controller.enqueue(converted);\n }\n })\n )\n };\n }\n };\n}\n\nfunction callOptions(\n options: LanguageModelV3CallOptions\n): LanguageModelV4CallOptions {\n return { ...options, prompt: options.prompt.map(message) };\n}\n\nfunction message(input: LanguageModelV3Message): LanguageModelV4Message {\n switch (input.role) {\n case \"system\":\n return input;\n case \"user\":\n return {\n ...input,\n content: input.content.map((part) =>\n part.type === \"file\" ? filePart(part) : part\n )\n };\n case \"assistant\":\n return {\n ...input,\n content: input.content.map((part) => {\n if (part.type === \"file\") return filePart(part);\n if (part.type === \"tool-result\") {\n return { ...part, output: toolOutput(part.output) };\n }\n return part;\n })\n };\n case \"tool\":\n return {\n ...input,\n content: input.content.map((part) =>\n part.type === \"tool-result\"\n ? { ...part, output: toolOutput(part.output) }\n : part\n )\n };\n }\n}\n\nfunction filePart(part: LanguageModelV3FilePart): LanguageModelV4FilePart {\n return { ...part, data: fileData(part.data) };\n}\n\nfunction fileData(data: LanguageModelV3FilePart[\"data\"]): SharedV4FileData {\n return data instanceof URL\n ? { type: \"url\", url: data }\n : { type: \"data\", data };\n}\n\nfunction toolOutput(\n output: LanguageModelV3ToolResultOutput\n): LanguageModelV4ToolResultOutput {\n if (output.type !== \"content\") return output;\n return {\n ...output,\n value: output.value.map((item) => {\n switch (item.type) {\n case \"text\":\n return item;\n case \"file-data\":\n case \"image-data\":\n return {\n type: \"file\" as const,\n data: { type: \"data\" as const, data: item.data },\n mediaType: item.mediaType,\n ...(\"filename\" in item && item.filename !== undefined\n ? { filename: item.filename }\n : {}),\n providerOptions: item.providerOptions\n };\n case \"file-url\":\n case \"image-url\":\n return {\n type: \"file\" as const,\n data: { type: \"url\" as const, url: new URL(item.url) },\n mediaType:\n item.type === \"image-url\"\n ? \"image/*\"\n : \"application/octet-stream\",\n providerOptions: item.providerOptions\n };\n case \"file-id\":\n case \"image-file-id\":\n return {\n type: \"file\" as const,\n data: {\n type: \"reference\" as const,\n reference:\n typeof item.fileId === \"string\"\n ? { id: item.fileId }\n : item.fileId\n },\n mediaType:\n item.type === \"image-file-id\"\n ? \"image/*\"\n : \"application/octet-stream\",\n providerOptions: item.providerOptions\n };\n case \"custom\":\n return {\n type: \"custom\" as const,\n providerOptions: item.providerOptions\n };\n }\n })\n };\n}\n\nfunction content(\n part: LanguageModelV4Content\n): LanguageModelV3Content | undefined {\n switch (part.type) {\n case \"custom\":\n case \"reasoning-file\":\n return undefined;\n case \"file\":\n return generatedFile(part);\n default:\n return part;\n }\n}\n\nfunction streamPart(\n part: LanguageModelV4StreamPart\n): LanguageModelV3StreamPart | undefined {\n switch (part.type) {\n case \"custom\":\n case \"reasoning-file\":\n return undefined;\n case \"file\":\n return generatedFile(part);\n case \"stream-start\":\n return { ...part, warnings: part.warnings.map(warning) };\n default:\n return part;\n }\n}\n\n/** V4 added `deprecated` warnings; V3 reports them as `other`. */\nfunction warning(input: SharedV4Warning): SharedV3Warning {\n return input.type === \"deprecated\"\n ? { type: \"other\", message: `${input.setting}: ${input.message}` }\n : input;\n}\n\nfunction generatedFile(\n part: Extract<LanguageModelV4Content, { type: \"file\" }>\n): Extract<LanguageModelV3Content, { type: \"file\" }> | undefined {\n // V3 carries generated files inline only; a URL file has no V3 form.\n if (part.data.type !== \"data\") return undefined;\n return {\n type: \"file\",\n mediaType: part.mediaType,\n data: part.data.data,\n ...(part.providerMetadata === undefined\n ? {}\n : { providerMetadata: part.providerMetadata })\n };\n}\n","/**\n * `agents/models/opencode` — Cloudflare's models as an OpenCode provider, with\n * the same shape as `agents/models/ai-sdk` and `agents/models/pi-ai`.\n *\n * ```ts\n * import { createAI } from \"agents/models/opencode\";\n * import { OpenCodeWorkerd } from \"@opencode/sdk/workerd\";\n *\n * const ai = createAI({ binding: env.AI });\n *\n * const model = ai(\"@cf/moonshotai/kimi-k2.7-code\"); // { providerID, id }\n * ai(\"anthropic/claude-opus-4.8\"); // an AI Gateway catalog model\n * await OpenCodeWorkerd.create({ storage, plugins: [ai.plugin] });\n * ```\n *\n * `ai.plugin` is an OpenCode plugin. It adds a `cloudflare` provider whose\n * models are the ids you have called `ai(id)` with — Workers AI ids, AI\n * Gateway catalog ids and dynamic routes — and answers OpenCode's AI SDK hook\n * with `agents/models/ai-sdk`'s models, so requests go the way that\n * provider sends them: through the `AI` binding, or over HTTP with an account\n * id and API token. Nothing is patched globally. Catalog streams through the\n * binding resume after a dropped connection, as they do in\n * `agents/models/ai-sdk`.\n *\n * @experimental The surface may change in any release.\n *\n * @module\n */\n\nimport { Model, Provider, type Plugin } from \"@opencode/plugin\";\nimport type { AISettings } from \"../core/settings\";\nimport {\n createAI as createAISDK,\n type CloudflareLanguageModelId,\n type ModelOptions\n} from \"../ai-sdk\";\nimport { asLanguageModelV3 } from \"./language-v3\";\n\nexport type {\n CatalogModelId,\n DynamicRouteId,\n WorkersAIModelId\n} from \"../core/catalog\";\nexport type { AISettings, GatewayOptions } from \"../core/settings\";\nexport type { CloudflareLanguageModelId, ModelOptions } from \"../ai-sdk\";\n\n/** The OpenCode provider id `createAI`'s plugin registers. */\nexport const CLOUDFLARE_PROVIDER_ID = \"cloudflare\";\n\n/**\n * The AI SDK package OpenCode is told the provider uses. OpenCode builds an\n * AI SDK model in two hook steps: `sdk` (load the package) and `language`\n * (make the model). Its `sdk` step can only load packages it bundles; any\n * other is handed to an npm installer that cannot run in workerd, and an\n * external plugin's `sdk` hook runs after that installer. So the provider\n * names `@ai-sdk/vercel`, which OpenCode bundles and loads in-process, and\n * this plugin's `language` hook replaces the model it would make. The\n * Vercel client is built but never called: its base URL does not resolve.\n */\nconst CARRIER_PACKAGE = \"aisdk:@ai-sdk/vercel\";\nconst UNREACHABLE_BASE_URL = \"https://workers-ai.binding.invalid/v1\";\n\n/**\n * A model as OpenCode references one: pass it to `OpenCodeHarness`'s\n * `defaults.model`, `session.setModel`, or OpenCode's `sessions.switchModel`.\n */\nexport type OpenCodeModel = {\n readonly providerID: string;\n readonly id: string;\n};\n\n/** How OpenCode budgets a model's context. */\nexport type OpenCodeModelLimit = {\n /** Context window, in tokens. Default 128_000. */\n readonly context: number;\n /** Most tokens OpenCode asks the model to generate. Default 8_192. */\n readonly output: number;\n};\n\n/** Options for one model: `agents/models/ai-sdk`'s, plus OpenCode's limit. */\nexport type OpenCodeModelOptions = ModelOptions & {\n readonly limit?: OpenCodeModelLimit;\n};\n\nconst DEFAULT_LIMIT: OpenCodeModelLimit = { context: 128_000, output: 8_192 };\n\n/**\n * The provider `createAI` returns. Call it with a model id — a Workers AI id,\n * an AI Gateway catalog id, or a dynamic route — to register the model with\n * the plugin and get OpenCode's reference to it.\n */\nexport interface AI {\n /** A model, registered with the plugin. */\n (\n modelId: CloudflareLanguageModelId,\n options?: OpenCodeModelOptions\n ): OpenCodeModel;\n /** Same as calling the provider directly. */\n model(\n modelId: CloudflareLanguageModelId,\n options?: OpenCodeModelOptions\n ): OpenCodeModel;\n /** The OpenCode plugin. Pass it in `OpenCodeWorkerd.create({ plugins })`. */\n readonly plugin: Plugin.Plugin;\n}\n\n/**\n * Create Cloudflare's model provider for OpenCode.\n *\n * @param settings - The `AI` binding, or an account id and API token, and\n * gateway defaults, as for `agents/models/ai-sdk`.\n * @returns The provider: call it with model ids; register `plugin`.\n */\nexport function createAI(settings: AISettings): AI {\n const aiSdk = createAISDK(settings);\n const models = new Map<string, OpenCodeModelOptions | undefined>();\n /** One reload per OpenCode instance the plugin is set up in. */\n const reloads = new Set<() => Promise<void>>();\n const providerID = Provider.ID.make(CLOUDFLARE_PROVIDER_ID);\n\n const info = (id: string, options: OpenCodeModelOptions | undefined) => {\n const defaults = Model.Info.default(providerID, Model.ID.make(id));\n return {\n ...defaults,\n package: CARRIER_PACKAGE,\n limit: options?.limit ?? DEFAULT_LIMIT\n };\n };\n\n const plugin: Plugin.Plugin = {\n id: \"agents.models.opencode\",\n async setup(ctx) {\n const transform = await ctx.provider.transform((editor) => {\n editor.add({\n info: {\n id: providerID,\n name: \"Cloudflare\",\n activation: \"enabled\",\n package: CARRIER_PACKAGE,\n settings: { baseURL: UNREACHABLE_BASE_URL, apiKey: \"binding\" }\n },\n models: [...models].map(([id, options]) => info(id, options))\n });\n });\n const hook = await ctx.aisdk.hook(\n \"language\",\n (event) => {\n const id = event.model.modelID ?? event.model.id;\n event.language = asLanguageModelV3(\n aiSdk.languageModel(id, models.get(id))\n );\n },\n { providerID }\n );\n const reload = () => ctx.provider.reload();\n reloads.add(reload);\n return async () => {\n reloads.delete(reload);\n await hook.dispose();\n await transform.dispose();\n };\n }\n };\n\n const model = (\n modelId: CloudflareLanguageModelId,\n options?: OpenCodeModelOptions\n ): OpenCodeModel => {\n // The same gate `agents/models/ai-sdk` applies, at the line that named the\n // model rather than at OpenCode's first request.\n aiSdk.languageModel(modelId, options);\n const changed =\n !models.has(modelId) ||\n JSON.stringify(models.get(modelId)?.limit) !==\n JSON.stringify(options?.limit);\n models.set(modelId, options);\n // A model named, or its limit changed, after OpenCode started: rebuild\n // the provider's model list.\n if (changed) {\n for (const reload of reloads) {\n reload().catch((error: unknown) => {\n console.warn(\"agents/models/opencode: provider reload failed\", error);\n });\n }\n }\n return { providerID: CLOUDFLARE_PROVIDER_ID, id: modelId };\n };\n\n return Object.assign(model, { model, plugin });\n}\n"],"mappings":"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"}
|