agents 0.25.0 → 0.27.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/README.md +8 -9
- package/dist/{agent-routing-0DR0Tk2v.d.ts → agent-routing-Bhdbvf7s.d.ts} +13 -8
- package/dist/agent-routing.d.ts +1 -1
- package/dist/agent-tool-types.d.ts +1 -1
- package/dist/{agent-tools-YrATZJu2.d.ts → agent-tools-bJZwBMfq.d.ts} +2 -2
- package/dist/agent-tools.d.ts +1 -1
- package/dist/ai-sdk-OoGkFy3s.js +2444 -0
- package/dist/ai-sdk-OoGkFy3s.js.map +1 -0
- package/dist/apply-chunks-1FheRb9W.js +99 -0
- package/dist/apply-chunks-1FheRb9W.js.map +1 -0
- package/dist/broadcast-state-CEyI4uAK.js +69 -0
- package/dist/broadcast-state-CEyI4uAK.js.map +1 -0
- package/dist/browser/ai-sdk.d.ts +1 -1
- package/dist/browser/ai-sdk.js +2 -2
- package/dist/browser/ai-sdk.js.map +1 -1
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/tanstack-ai.d.ts +1 -1
- package/dist/browser/tanstack-ai.js +1 -1
- package/dist/{browser-DE3d-RLk.d.ts → browser-tmkcAAI3.d.ts} +2 -2
- package/dist/{browser-tool-DuNdlwZ9.d.ts → browser-tool-Bn-nzJQI.d.ts} +3 -3
- package/dist/{browser-tool-CQ10e6Kj.js → browser-tool-CBqs6hqa.js} +58 -18
- package/dist/browser-tool-CBqs6hqa.js.map +1 -0
- package/dist/capability-B4WbF81e.js.map +1 -1
- package/dist/{capability-runner-DBAnGr6L.d.ts → capability-runner-O5VbQzqg.d.ts} +9 -1
- package/dist/channel-Bak_6zDP.d.ts +333 -0
- package/dist/chat/index.d.ts +11 -9
- package/dist/chat/index.js +5 -194
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/react.d.ts +2 -4
- package/dist/chat/react.js +3 -1
- package/dist/chat/react.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 +144 -0
- package/dist/{client-fyQrLGkD.js → client-1tEQ1Oqz.js} +27 -2
- package/dist/{client-fyQrLGkD.js.map → client-1tEQ1Oqz.js.map} +1 -1
- package/dist/{client-je3koD9Z.d.ts → client-DS3Dz9l0.d.ts} +2 -2
- package/dist/client-tools-aIBO0Fk7.d.ts +53 -0
- package/dist/client.d.ts +1 -1
- package/dist/conversations-DH0ut_8n.d.ts +192 -0
- package/dist/{current-agent-vAk_5JMt.d.ts → current-agent-C07C5o5Y.d.ts} +3 -3
- package/dist/daemon-core-Buubj-y1.js +481 -0
- package/dist/daemon-core-Buubj-y1.js.map +1 -0
- package/dist/daemon-core-CbohVPAu.d.ts +132 -0
- package/dist/{do-oauth-client-provider-Tmf1vgKz.d.ts → do-oauth-client-provider-DfsUcpc3.d.ts} +7 -1
- package/dist/{durable-object-lifecycle-HhgOMWq9.d.ts → durable-object-lifecycle-DRqp475_.d.ts} +2 -2
- package/dist/{channels/email.d.ts → experimental/channels/email/index.d.ts} +25 -12
- package/dist/{channels/email.js → experimental/channels/email/index.js} +13 -35
- package/dist/experimental/channels/email/index.js.map +1 -0
- package/dist/experimental/channels/index.d.ts +270 -0
- package/dist/experimental/channels/index.js +1186 -0
- package/dist/experimental/channels/index.js.map +1 -0
- package/dist/{channels/slack.d.ts → experimental/channels/slack/index.d.ts} +19 -9
- package/dist/experimental/channels/slack/index.js +267 -0
- package/dist/experimental/channels/slack/index.js.map +1 -0
- package/dist/{channels/telegram.d.ts → experimental/channels/telegram/index.d.ts} +19 -9
- package/dist/experimental/channels/telegram/index.js +198 -0
- package/dist/experimental/channels/telegram/index.js.map +1 -0
- package/dist/experimental/channels/web/ai-sdk.d.ts +55 -0
- package/dist/experimental/channels/web/ai-sdk.js +266 -0
- package/dist/experimental/channels/web/ai-sdk.js.map +1 -0
- package/dist/experimental/channels/web/client.d.ts +97 -0
- package/dist/experimental/channels/web/client.js +349 -0
- package/dist/experimental/channels/web/client.js.map +1 -0
- package/dist/experimental/channels/web/index.d.ts +189 -0
- package/dist/experimental/channels/web/index.js +332 -0
- package/dist/experimental/channels/web/index.js.map +1 -0
- package/dist/gateway-BDC07gYO.d.ts +100 -0
- package/dist/handle-zAzh0UW2.d.ts +460 -0
- package/dist/harness/ai-sdk/index.d.ts +175 -0
- package/dist/harness/ai-sdk/index.js +605 -0
- package/dist/harness/ai-sdk/index.js.map +1 -0
- package/dist/harness/container/daemon/index.d.ts +76 -0
- package/dist/harness/container/daemon/index.js +3 -0
- package/dist/harness/container/index.d.ts +740 -0
- package/dist/harness/container/index.js +2152 -0
- package/dist/harness/container/index.js.map +1 -0
- package/dist/harness/container/runtime/index.d.ts +144 -0
- package/dist/harness/container/runtime/index.js +1082 -0
- package/dist/harness/container/runtime/index.js.map +1 -0
- package/dist/harness/opencode/index.d.ts +369 -0
- package/dist/harness/opencode/index.js +1072 -0
- package/dist/harness/opencode/index.js.map +1 -0
- package/dist/{harnesses → harness}/pi/index.d.ts +85 -88
- package/dist/{harnesses → harness}/pi/index.js +196 -77
- package/dist/harness/pi/index.js.map +1 -0
- package/dist/harness/store/index.d.ts +24 -0
- package/dist/harness/store/index.js +2 -0
- package/dist/harness/think/index.d.ts +821 -0
- package/dist/harness/think/index.js +2529 -0
- package/dist/harness/think/index.js.map +1 -0
- package/dist/harness-B6B9S3rb.d.ts +203 -0
- package/dist/{images-iiTDSyRu.js → images-Ce9SCu3X.js} +2 -248
- package/dist/images-Ce9SCu3X.js.map +1 -0
- package/dist/{index-BreL0YrQ.d.ts → index-D0A5tbWu.d.ts} +2 -2
- package/dist/index-Ib_4dwOo.d.ts +200 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +2 -2
- package/dist/ingress-EFbrS547.js +9 -0
- package/dist/ingress-EFbrS547.js.map +1 -0
- package/dist/input-schema-DNrpTu49.js +23 -0
- package/dist/input-schema-DNrpTu49.js.map +1 -0
- package/dist/internal-kmw70xwR.js +46 -0
- package/dist/internal-kmw70xwR.js.map +1 -0
- package/dist/internal_context.d.ts +1 -1
- package/dist/lifecycle/index.d.ts +3 -3
- package/dist/mcp/client/do-oauth-client-provider.d.ts +1 -1
- package/dist/mcp/client/do-oauth-client-provider.js +9 -0
- package/dist/mcp/client/do-oauth-client-provider.js.map +1 -1
- package/dist/mcp/client/index.d.ts +1 -1
- package/dist/mcp/client/index.js +1 -1
- package/dist/mcp/client/x402.d.ts +35 -4
- package/dist/mcp/client/x402.js +24 -3
- package/dist/mcp/client/x402.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/models/ai-sdk/index.d.ts +16 -14
- package/dist/models/ai-sdk/index.js +1 -2442
- package/dist/models/opencode/index.d.ts +65 -0
- package/dist/models/opencode/index.js +285 -0
- package/dist/models/opencode/index.js.map +1 -0
- package/dist/models/pi-ai/index.d.ts +23 -21
- package/dist/models/pi-ai/index.js +7 -6
- package/dist/models/pi-ai/index.js.map +1 -1
- package/dist/options-pwTNq9z6.d.ts +134 -0
- package/dist/protocol-BEgrJYC5.d.ts +331 -0
- package/dist/protocol-CukuI73M.d.ts +386 -0
- package/dist/protocol-cOklVBBD.js +227 -0
- package/dist/protocol-cOklVBBD.js.map +1 -0
- package/dist/{protocol-kHsr-f0X.js → protocol-eXeJxhgu.js} +2 -67
- package/dist/protocol-eXeJxhgu.js.map +1 -0
- package/dist/protocol-y2sSY584.js +148 -0
- package/dist/protocol-y2sSY584.js.map +1 -0
- package/dist/queue/index.d.ts +1 -1
- package/dist/react.d.ts +2 -2
- package/dist/routing/index.d.ts +2 -2
- package/dist/{scheduler-RdACNXDP.d.ts → scheduler-CrFCnv_J.d.ts} +2 -2
- package/dist/schedules/index.d.ts +1 -1
- package/dist/serializable.d.ts +1 -1
- package/dist/sessions/index.d.ts +11 -434
- package/dist/sessions/index.js +1 -2271
- package/dist/sessions-B9pNuxdT.js +2272 -0
- package/dist/sessions-B9pNuxdT.js.map +1 -0
- package/dist/settings-C45hDliX.js +253 -0
- package/dist/settings-C45hDliX.js.map +1 -0
- package/dist/{transport-PfFnt-Ld.d.ts → settings-NgGwF7Qt.d.ts} +14 -208
- package/dist/{src-BZeu-SCD.js → src-DgCbZtIR.js} +4 -4
- package/dist/{src-BZeu-SCD.js.map → src-DgCbZtIR.js.map} +1 -1
- package/dist/stall-watchdog-BpRF2uwG.js +195 -0
- package/dist/stall-watchdog-BpRF2uwG.js.map +1 -0
- package/dist/state/index.d.ts +1 -1
- package/dist/store-DLeqKuj3.d.ts +310 -0
- package/dist/store-vgcPYo8K.js +432 -0
- package/dist/store-vgcPYo8K.js.map +1 -0
- package/dist/streams/index.d.ts +1 -1
- package/dist/streams/index.js +1 -1
- package/dist/{streams-DW-UCOUc.js → streams-CITClVer.js} +16 -3
- package/dist/streams-CITClVer.js.map +1 -0
- package/dist/{streams-Cmkj9QfW.d.ts → streams-fbG61qM8.d.ts} +2 -2
- package/dist/sub-routing.d.ts +1 -1
- package/dist/tasks/index.d.ts +1 -1
- package/dist/tasks/index.js +1 -1
- package/dist/{tasks-68DESxf0.js → tasks-CkTZNaV1.js} +2 -1
- package/dist/tasks-CkTZNaV1.js.map +1 -0
- package/dist/{tasks-9YxYtByh.d.ts → tasks-PtlB4Uyn.d.ts} +2 -2
- package/dist/tool-3PA8xjB_.js +421 -0
- package/dist/tool-3PA8xjB_.js.map +1 -0
- package/dist/tool-BPJEbwaX.d.ts +278 -0
- package/dist/transport-k2mFrtL8.d.ts +200 -0
- package/dist/turns-DCV3ycDl.js +317 -0
- package/dist/turns-DCV3ycDl.js.map +1 -0
- package/dist/voice/client.js +1 -1
- package/dist/voice/index.d.ts +2 -2
- package/dist/voice/index.js +1 -1
- package/dist/websearch/index.d.ts +58 -0
- package/dist/websearch/index.js +2 -0
- package/dist/websearch/tools/ai-sdk.d.ts +77 -0
- package/dist/websearch/tools/ai-sdk.js +46 -0
- package/dist/websearch/tools/ai-sdk.js.map +1 -0
- package/dist/websearch/tools/pi.d.ts +82 -0
- package/dist/websearch/tools/pi.js +89 -0
- package/dist/websearch/tools/pi.js.map +1 -0
- package/dist/websearch/tools/tanstack-ai.d.ts +71 -0
- package/dist/websearch/tools/tanstack-ai.js +46 -0
- package/dist/websearch/tools/tanstack-ai.js.map +1 -0
- package/dist/websockets/index.d.ts +12 -296
- package/dist/websockets/index.js +1 -1
- package/dist/{websockets-Ci-LZFHH.js → websockets-CmENGb-Z.js} +18 -4
- package/dist/websockets-CmENGb-Z.js.map +1 -0
- package/dist/{wire-types-CrjKvDyi.d.ts → wire-types-Cv0iwjk5.d.ts} +3 -51
- 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 +3 -0
- package/docs/harnesses/pi.md +114 -32
- package/docs/harnesses/think.md +215 -0
- package/docs/index.md +4 -3
- package/docs/lifecycle.md +40 -0
- package/docs/models-pi-ai.md +5 -5
- package/docs/search-the-web.md +133 -0
- package/package.json +126 -47
- package/dist/browser-tool-CQ10e6Kj.js.map +0 -1
- package/dist/channel-Bnm4S7T2.d.ts +0 -491
- package/dist/channels/ai-sdk.d.ts +0 -46
- package/dist/channels/ai-sdk.js +0 -120
- package/dist/channels/ai-sdk.js.map +0 -1
- package/dist/channels/email.js.map +0 -1
- package/dist/channels/index.d.ts +0 -233
- package/dist/channels/index.js +0 -608
- package/dist/channels/index.js.map +0 -1
- package/dist/channels/slack.js +0 -614
- package/dist/channels/slack.js.map +0 -1
- package/dist/channels/tanstack-ai.d.ts +0 -39
- package/dist/channels/tanstack-ai.js +0 -17
- package/dist/channels/tanstack-ai.js.map +0 -1
- package/dist/channels/telegram.js +0 -427
- package/dist/channels/telegram.js.map +0 -1
- package/dist/channels/voice.d.ts +0 -45
- package/dist/channels/voice.js +0 -122
- package/dist/channels/voice.js.map +0 -1
- package/dist/harnesses/pi/index.js.map +0 -1
- package/dist/images-iiTDSyRu.js.map +0 -1
- package/dist/index-BB0kqhIz.d.ts +0 -101
- package/dist/ingress-BfetZbMO.js +0 -83
- package/dist/ingress-BfetZbMO.js.map +0 -1
- package/dist/internal-CYlgHl1l.js +0 -59
- package/dist/internal-CYlgHl1l.js.map +0 -1
- package/dist/models/ai-sdk/index.js.map +0 -1
- package/dist/protocol-kHsr-f0X.js.map +0 -1
- package/dist/sessions/index.js.map +0 -1
- package/dist/streams-DW-UCOUc.js.map +0 -1
- package/dist/surface-bZZJqBka.js +0 -17
- package/dist/surface-bZZJqBka.js.map +0 -1
- package/dist/tasks-68DESxf0.js.map +0 -1
- package/dist/tool-schema-CBjGPrsQ.js +0 -31
- package/dist/tool-schema-CBjGPrsQ.js.map +0 -1
- package/dist/websockets-Ci-LZFHH.js.map +0 -1
- package/docs/channels.md +0 -323
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
n as GatewayOptions,
|
|
3
|
+
p as WorkersAIModelId,
|
|
4
|
+
r as ModelOptions,
|
|
5
|
+
t as AISettings
|
|
6
|
+
} from "../../settings-NgGwF7Qt.js";
|
|
7
|
+
import { Plugin } from "@opencode/plugin";
|
|
8
|
+
|
|
9
|
+
//#region src/models/opencode/index.d.ts
|
|
10
|
+
/** The OpenCode provider id `createAI`'s plugin registers. */
|
|
11
|
+
declare const CLOUDFLARE_PROVIDER_ID = "cloudflare";
|
|
12
|
+
/**
|
|
13
|
+
* A model as OpenCode references one: pass it to `OpenCodeHarness`'s
|
|
14
|
+
* `defaults.model`, `session.setModel`, or OpenCode's `sessions.switchModel`.
|
|
15
|
+
*/
|
|
16
|
+
type OpenCodeModel = {
|
|
17
|
+
readonly providerID: string;
|
|
18
|
+
readonly id: string;
|
|
19
|
+
};
|
|
20
|
+
/** How OpenCode budgets a model's context. */
|
|
21
|
+
type OpenCodeModelLimit = {
|
|
22
|
+
/** Context window, in tokens. Default 128_000. */ readonly context: number /** Most tokens OpenCode asks the model to generate. Default 8_192. */;
|
|
23
|
+
readonly output: number;
|
|
24
|
+
};
|
|
25
|
+
/** Options for one model: `agents/models/ai-sdk`'s, plus OpenCode's limit. */
|
|
26
|
+
type OpenCodeModelOptions = ModelOptions & {
|
|
27
|
+
readonly limit?: OpenCodeModelLimit;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The provider `createAI` returns. Call it with a Workers AI id to register
|
|
31
|
+
* the model with the plugin and get OpenCode's reference to it.
|
|
32
|
+
*/
|
|
33
|
+
interface AI {
|
|
34
|
+
/** A Workers AI model, registered with the plugin. */
|
|
35
|
+
(modelId: WorkersAIModelId, options?: OpenCodeModelOptions): OpenCodeModel;
|
|
36
|
+
/** Same as calling the provider directly. */
|
|
37
|
+
model(
|
|
38
|
+
modelId: WorkersAIModelId,
|
|
39
|
+
options?: OpenCodeModelOptions
|
|
40
|
+
): OpenCodeModel;
|
|
41
|
+
/** The OpenCode plugin. Pass it in `OpenCodeWorkerd.create({ plugins })`. */
|
|
42
|
+
readonly plugin: Plugin.Plugin;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create the Workers AI provider for OpenCode.
|
|
46
|
+
*
|
|
47
|
+
* @param settings - The `AI` binding and gateway defaults, as for
|
|
48
|
+
* `agents/models/ai-sdk`.
|
|
49
|
+
* @returns The provider: call it with model ids; register `plugin`.
|
|
50
|
+
*/
|
|
51
|
+
declare function createAI(settings: AISettings): AI;
|
|
52
|
+
//#endregion
|
|
53
|
+
export {
|
|
54
|
+
AI,
|
|
55
|
+
type AISettings,
|
|
56
|
+
CLOUDFLARE_PROVIDER_ID,
|
|
57
|
+
type GatewayOptions,
|
|
58
|
+
type ModelOptions,
|
|
59
|
+
OpenCodeModel,
|
|
60
|
+
OpenCodeModelLimit,
|
|
61
|
+
OpenCodeModelOptions,
|
|
62
|
+
type WorkersAIModelId,
|
|
63
|
+
createAI
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { t as createAI$1 } from "../../ai-sdk-OoGkFy3s.js";
|
|
2
|
+
import { Model, Provider } from "@opencode/plugin";
|
|
3
|
+
//#region src/models/opencode/language-v3.ts
|
|
4
|
+
/**
|
|
5
|
+
* OpenCode loads AI SDK models through the `LanguageModelV3` contract;
|
|
6
|
+
* `agents/models/ai-sdk` implements `LanguageModelV4`. The two differ only in
|
|
7
|
+
* how files are carried (V4 wraps file data in a tagged union and folds the
|
|
8
|
+
* image variants into one `file` part) and in the parts V4 added (`custom`,
|
|
9
|
+
* `reasoning-file`), which V3 has no slot for and are dropped. Text,
|
|
10
|
+
* reasoning, tool calls, usage and finish reasons are the same shape.
|
|
11
|
+
*/
|
|
12
|
+
function asLanguageModelV3(model) {
|
|
13
|
+
return {
|
|
14
|
+
specificationVersion: "v3",
|
|
15
|
+
provider: model.provider,
|
|
16
|
+
modelId: model.modelId,
|
|
17
|
+
supportedUrls: model.supportedUrls,
|
|
18
|
+
async doGenerate(options) {
|
|
19
|
+
const result = await model.doGenerate(callOptions(options));
|
|
20
|
+
return {
|
|
21
|
+
...result,
|
|
22
|
+
warnings: result.warnings.map(warning),
|
|
23
|
+
content: result.content.flatMap((part) => {
|
|
24
|
+
const converted = content(part);
|
|
25
|
+
return converted === void 0 ? [] : [converted];
|
|
26
|
+
})
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
async doStream(options) {
|
|
30
|
+
const result = await model.doStream(callOptions(options));
|
|
31
|
+
return {
|
|
32
|
+
...result,
|
|
33
|
+
stream: result.stream.pipeThrough(new TransformStream({ transform(part, controller) {
|
|
34
|
+
const converted = streamPart(part);
|
|
35
|
+
if (converted !== void 0) controller.enqueue(converted);
|
|
36
|
+
} }))
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function callOptions(options) {
|
|
42
|
+
return {
|
|
43
|
+
...options,
|
|
44
|
+
prompt: options.prompt.map(message)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function message(input) {
|
|
48
|
+
switch (input.role) {
|
|
49
|
+
case "system": return input;
|
|
50
|
+
case "user": return {
|
|
51
|
+
...input,
|
|
52
|
+
content: input.content.map((part) => part.type === "file" ? filePart(part) : part)
|
|
53
|
+
};
|
|
54
|
+
case "assistant": return {
|
|
55
|
+
...input,
|
|
56
|
+
content: input.content.map((part) => {
|
|
57
|
+
if (part.type === "file") return filePart(part);
|
|
58
|
+
if (part.type === "tool-result") return {
|
|
59
|
+
...part,
|
|
60
|
+
output: toolOutput(part.output)
|
|
61
|
+
};
|
|
62
|
+
return part;
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
case "tool": return {
|
|
66
|
+
...input,
|
|
67
|
+
content: input.content.map((part) => part.type === "tool-result" ? {
|
|
68
|
+
...part,
|
|
69
|
+
output: toolOutput(part.output)
|
|
70
|
+
} : part)
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function filePart(part) {
|
|
75
|
+
return {
|
|
76
|
+
...part,
|
|
77
|
+
data: fileData(part.data)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function fileData(data) {
|
|
81
|
+
return data instanceof URL ? {
|
|
82
|
+
type: "url",
|
|
83
|
+
url: data
|
|
84
|
+
} : {
|
|
85
|
+
type: "data",
|
|
86
|
+
data
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function toolOutput(output) {
|
|
90
|
+
if (output.type !== "content") return output;
|
|
91
|
+
return {
|
|
92
|
+
...output,
|
|
93
|
+
value: output.value.map((item) => {
|
|
94
|
+
switch (item.type) {
|
|
95
|
+
case "text": return item;
|
|
96
|
+
case "file-data":
|
|
97
|
+
case "image-data": return {
|
|
98
|
+
type: "file",
|
|
99
|
+
data: {
|
|
100
|
+
type: "data",
|
|
101
|
+
data: item.data
|
|
102
|
+
},
|
|
103
|
+
mediaType: item.mediaType,
|
|
104
|
+
..."filename" in item && item.filename !== void 0 ? { filename: item.filename } : {},
|
|
105
|
+
providerOptions: item.providerOptions
|
|
106
|
+
};
|
|
107
|
+
case "file-url":
|
|
108
|
+
case "image-url": return {
|
|
109
|
+
type: "file",
|
|
110
|
+
data: {
|
|
111
|
+
type: "url",
|
|
112
|
+
url: new URL(item.url)
|
|
113
|
+
},
|
|
114
|
+
mediaType: item.type === "image-url" ? "image/*" : "application/octet-stream",
|
|
115
|
+
providerOptions: item.providerOptions
|
|
116
|
+
};
|
|
117
|
+
case "file-id":
|
|
118
|
+
case "image-file-id": return {
|
|
119
|
+
type: "file",
|
|
120
|
+
data: {
|
|
121
|
+
type: "reference",
|
|
122
|
+
reference: typeof item.fileId === "string" ? { id: item.fileId } : item.fileId
|
|
123
|
+
},
|
|
124
|
+
mediaType: item.type === "image-file-id" ? "image/*" : "application/octet-stream",
|
|
125
|
+
providerOptions: item.providerOptions
|
|
126
|
+
};
|
|
127
|
+
case "custom": return {
|
|
128
|
+
type: "custom",
|
|
129
|
+
providerOptions: item.providerOptions
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
})
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function content(part) {
|
|
136
|
+
switch (part.type) {
|
|
137
|
+
case "custom":
|
|
138
|
+
case "reasoning-file": return;
|
|
139
|
+
case "file": return generatedFile(part);
|
|
140
|
+
default: return part;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function streamPart(part) {
|
|
144
|
+
switch (part.type) {
|
|
145
|
+
case "custom":
|
|
146
|
+
case "reasoning-file": return;
|
|
147
|
+
case "file": return generatedFile(part);
|
|
148
|
+
case "stream-start": return {
|
|
149
|
+
...part,
|
|
150
|
+
warnings: part.warnings.map(warning)
|
|
151
|
+
};
|
|
152
|
+
default: return part;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** V4 added `deprecated` warnings; V3 reports them as `other`. */
|
|
156
|
+
function warning(input) {
|
|
157
|
+
return input.type === "deprecated" ? {
|
|
158
|
+
type: "other",
|
|
159
|
+
message: `${input.setting}: ${input.message}`
|
|
160
|
+
} : input;
|
|
161
|
+
}
|
|
162
|
+
function generatedFile(part) {
|
|
163
|
+
if (part.data.type !== "data") return void 0;
|
|
164
|
+
return {
|
|
165
|
+
type: "file",
|
|
166
|
+
mediaType: part.mediaType,
|
|
167
|
+
data: part.data.data,
|
|
168
|
+
...part.providerMetadata === void 0 ? {} : { providerMetadata: part.providerMetadata }
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//#endregion
|
|
172
|
+
//#region src/models/opencode/index.ts
|
|
173
|
+
/**
|
|
174
|
+
* `agents/models/opencode` — Workers AI as an OpenCode provider, with the
|
|
175
|
+
* same shape as `agents/models/ai-sdk` and `agents/models/pi-ai`.
|
|
176
|
+
*
|
|
177
|
+
* ```ts
|
|
178
|
+
* import { createAI } from "agents/models/opencode";
|
|
179
|
+
* import { OpenCodeWorkerd } from "@opencode/sdk/workerd";
|
|
180
|
+
*
|
|
181
|
+
* const ai = createAI({ binding: env.AI });
|
|
182
|
+
*
|
|
183
|
+
* const model = ai("@cf/moonshotai/kimi-k2.7-code"); // { providerID, id }
|
|
184
|
+
* await OpenCodeWorkerd.create({ storage, plugins: [ai.plugin] });
|
|
185
|
+
* ```
|
|
186
|
+
*
|
|
187
|
+
* `ai.plugin` is an OpenCode plugin. It adds a `cloudflare` provider whose
|
|
188
|
+
* models are the ids you have called `ai(id)` with, and answers OpenCode's
|
|
189
|
+
* AI SDK hook with `agents/models/ai-sdk`'s models, so requests go through
|
|
190
|
+
* the `AI` binding: no account id, API token, or HTTP route to Workers AI in
|
|
191
|
+
* your Worker, and nothing patched globally.
|
|
192
|
+
*
|
|
193
|
+
* @experimental The surface may change in any release.
|
|
194
|
+
*
|
|
195
|
+
* @module
|
|
196
|
+
*/
|
|
197
|
+
/** The OpenCode provider id `createAI`'s plugin registers. */
|
|
198
|
+
const CLOUDFLARE_PROVIDER_ID = "cloudflare";
|
|
199
|
+
/**
|
|
200
|
+
* The AI SDK package OpenCode is told the provider uses. OpenCode builds an
|
|
201
|
+
* AI SDK model in two hook steps: `sdk` (load the package) and `language`
|
|
202
|
+
* (make the model). Its `sdk` step can only load packages it bundles; any
|
|
203
|
+
* other is handed to an npm installer that cannot run in workerd, and an
|
|
204
|
+
* external plugin's `sdk` hook runs after that installer. So the provider
|
|
205
|
+
* names `@ai-sdk/vercel`, which OpenCode bundles and loads in-process, and
|
|
206
|
+
* this plugin's `language` hook replaces the model it would make. The
|
|
207
|
+
* Vercel client is built but never called: its base URL does not resolve.
|
|
208
|
+
*/
|
|
209
|
+
const CARRIER_PACKAGE = "aisdk:@ai-sdk/vercel";
|
|
210
|
+
const UNREACHABLE_BASE_URL = "https://workers-ai.binding.invalid/v1";
|
|
211
|
+
const DEFAULT_LIMIT = {
|
|
212
|
+
context: 128e3,
|
|
213
|
+
output: 8192
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* Create the Workers AI provider for OpenCode.
|
|
217
|
+
*
|
|
218
|
+
* @param settings - The `AI` binding and gateway defaults, as for
|
|
219
|
+
* `agents/models/ai-sdk`.
|
|
220
|
+
* @returns The provider: call it with model ids; register `plugin`.
|
|
221
|
+
*/
|
|
222
|
+
function createAI(settings) {
|
|
223
|
+
const aiSdk = createAI$1(settings);
|
|
224
|
+
const models = /* @__PURE__ */ new Map();
|
|
225
|
+
/** One reload per OpenCode instance the plugin is set up in. */
|
|
226
|
+
const reloads = /* @__PURE__ */ new Set();
|
|
227
|
+
const providerID = Provider.ID.make(CLOUDFLARE_PROVIDER_ID);
|
|
228
|
+
const info = (id, options) => {
|
|
229
|
+
return {
|
|
230
|
+
...Model.Info.default(providerID, Model.ID.make(id)),
|
|
231
|
+
package: CARRIER_PACKAGE,
|
|
232
|
+
limit: options?.limit ?? DEFAULT_LIMIT
|
|
233
|
+
};
|
|
234
|
+
};
|
|
235
|
+
const plugin = {
|
|
236
|
+
id: "agents.models.opencode",
|
|
237
|
+
async setup(ctx) {
|
|
238
|
+
const transform = await ctx.provider.transform((editor) => {
|
|
239
|
+
editor.add({
|
|
240
|
+
info: {
|
|
241
|
+
id: providerID,
|
|
242
|
+
name: "Cloudflare Workers AI",
|
|
243
|
+
activation: "enabled",
|
|
244
|
+
package: CARRIER_PACKAGE,
|
|
245
|
+
settings: {
|
|
246
|
+
baseURL: UNREACHABLE_BASE_URL,
|
|
247
|
+
apiKey: "binding"
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
models: [...models].map(([id, options]) => info(id, options))
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
const hook = await ctx.aisdk.hook("language", (event) => {
|
|
254
|
+
const id = event.model.modelID ?? event.model.id;
|
|
255
|
+
event.language = asLanguageModelV3(aiSdk.languageModel(id, models.get(id)));
|
|
256
|
+
}, { providerID });
|
|
257
|
+
const reload = () => ctx.provider.reload();
|
|
258
|
+
reloads.add(reload);
|
|
259
|
+
return async () => {
|
|
260
|
+
reloads.delete(reload);
|
|
261
|
+
await hook.dispose();
|
|
262
|
+
await transform.dispose();
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const model = (modelId, options) => {
|
|
267
|
+
const changed = !models.has(modelId) || JSON.stringify(models.get(modelId)?.limit) !== JSON.stringify(options?.limit);
|
|
268
|
+
models.set(modelId, options);
|
|
269
|
+
if (changed) for (const reload of reloads) reload().catch((error) => {
|
|
270
|
+
console.warn("agents/models/opencode: provider reload failed", error);
|
|
271
|
+
});
|
|
272
|
+
return {
|
|
273
|
+
providerID: CLOUDFLARE_PROVIDER_ID,
|
|
274
|
+
id: modelId
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
return Object.assign(model, {
|
|
278
|
+
model,
|
|
279
|
+
plugin
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
//#endregion
|
|
283
|
+
export { CLOUDFLARE_PROVIDER_ID, createAI };
|
|
284
|
+
|
|
285
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,15 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
n as GatewayOptions,
|
|
3
|
+
o as CloudflareEmbeddingModelId,
|
|
4
|
+
p as WorkersAIModelId,
|
|
5
|
+
r as ModelOptions,
|
|
6
|
+
t as AISettings
|
|
7
|
+
} from "../../settings-NgGwF7Qt.js";
|
|
1
8
|
import {
|
|
2
9
|
a as CloudflareAIError,
|
|
3
|
-
c as GatewayOptions,
|
|
4
|
-
d as CloudflareEmbeddingModelId,
|
|
5
10
|
i as CloudflareAIAttempt,
|
|
6
|
-
l as ModelOptions,
|
|
7
11
|
n as GATEWAY_PROVIDER_NAMES,
|
|
8
12
|
o as CloudflareAIErrorCode,
|
|
9
|
-
r as GatewayProviderName
|
|
10
|
-
|
|
11
|
-
v as WorkersAIModelId
|
|
12
|
-
} from "../../transport-PfFnt-Ld.js";
|
|
13
|
+
r as GatewayProviderName
|
|
14
|
+
} from "../../transport-k2mFrtL8.js";
|
|
13
15
|
import {
|
|
14
16
|
Api,
|
|
15
17
|
AssistantImages,
|
|
@@ -43,17 +45,17 @@ interface CompatWarning {
|
|
|
43
45
|
/**
|
|
44
46
|
* The `api` marker on image models from this provider.
|
|
45
47
|
*
|
|
46
|
-
* @
|
|
48
|
+
* @beta This surface is in beta and may change.
|
|
47
49
|
*/
|
|
48
50
|
declare const CLOUDFLARE_AI_IMAGES_API = "cloudflare-ai-images";
|
|
49
|
-
/** @
|
|
51
|
+
/** @beta This surface is in beta and may change. */
|
|
50
52
|
type CloudflareImagesModel = ImageModel<typeof CLOUDFLARE_AI_IMAGES_API>;
|
|
51
53
|
/**
|
|
52
54
|
* Per-model options for image models: gateway options plus the generation
|
|
53
55
|
* knobs Workers AI understands. Anything given here is the default for every
|
|
54
56
|
* call; `generateImages` options override it.
|
|
55
57
|
*
|
|
56
|
-
* @
|
|
58
|
+
* @beta This surface is in beta and may change.
|
|
57
59
|
*/
|
|
58
60
|
interface PiImagesModelOptions extends ModelOptions {
|
|
59
61
|
name?: string;
|
|
@@ -80,7 +82,7 @@ interface PiImagesCallOptions extends ImagesOptions {
|
|
|
80
82
|
* drops is reported the way the language wires report theirs: as a diagnostic
|
|
81
83
|
* of type {@link COMPAT_DIAGNOSTIC}.
|
|
82
84
|
*
|
|
83
|
-
* @
|
|
85
|
+
* @beta This surface is in beta and may change.
|
|
84
86
|
*/
|
|
85
87
|
interface CloudflareAssistantImages extends AssistantImages {
|
|
86
88
|
diagnostics?: {
|
|
@@ -98,32 +100,32 @@ interface CloudflareAssistantImages extends AssistantImages {
|
|
|
98
100
|
* wire format: Workers AI runs on `env.AI.run`, and the compat layer maps that
|
|
99
101
|
* onto strict OpenAI chat completions.
|
|
100
102
|
*
|
|
101
|
-
* @
|
|
103
|
+
* @beta This surface is in beta and may change.
|
|
102
104
|
*/
|
|
103
105
|
declare const CLOUDFLARE_AI_API = "cloudflare-ai";
|
|
104
|
-
/** @
|
|
106
|
+
/** @beta This surface is in beta and may change. */
|
|
105
107
|
type CloudflareAIApi = typeof CLOUDFLARE_AI_API;
|
|
106
108
|
/**
|
|
107
109
|
* The pi-ai provider id. A `Models` registry resolves specifiers as
|
|
108
110
|
* `cloudflare/<id>`, e.g. `cloudflare/anthropic/claude-opus-4-8`.
|
|
109
111
|
*
|
|
110
|
-
* @
|
|
112
|
+
* @beta This surface is in beta and may change.
|
|
111
113
|
*/
|
|
112
114
|
declare const CLOUDFLARE_PROVIDER_ID = "cloudflare";
|
|
113
115
|
/**
|
|
114
116
|
* A Workers AI model produced by this provider. `id` is the `@cf/` id exactly
|
|
115
117
|
* as given; `api` is {@link CLOUDFLARE_AI_API}.
|
|
116
118
|
*
|
|
117
|
-
* @
|
|
119
|
+
* @beta This surface is in beta and may change.
|
|
118
120
|
*/
|
|
119
121
|
type CloudflareModel = Model<CloudflareAIApi>;
|
|
120
|
-
/** @
|
|
122
|
+
/** @beta This surface is in beta and may change. */
|
|
121
123
|
type ModelCost = Model<Api>["cost"];
|
|
122
124
|
/**
|
|
123
125
|
* A model this provider routes: a Workers AI model or any pi-ai model the
|
|
124
126
|
* caller handed to `ai(model)`.
|
|
125
127
|
*
|
|
126
|
-
* @
|
|
128
|
+
* @beta This surface is in beta and may change.
|
|
127
129
|
*/
|
|
128
130
|
type RoutedModel = Model<Api>;
|
|
129
131
|
/**
|
|
@@ -132,7 +134,7 @@ type RoutedModel = Model<Api>;
|
|
|
132
134
|
* deadline. Metadata overrides only apply to the `@cf/` form — a model object
|
|
133
135
|
* brings its own metadata, and this module never second-guesses it.
|
|
134
136
|
*
|
|
135
|
-
* @
|
|
137
|
+
* @beta This surface is in beta and may change.
|
|
136
138
|
*/
|
|
137
139
|
/**
|
|
138
140
|
* A fallback leg: a Workers AI id, a `<slug>/<id>` pi-ai's gateway registry
|
|
@@ -181,7 +183,7 @@ declare const CLOUDFLARE_DIAGNOSTIC = "cloudflare";
|
|
|
181
183
|
/**
|
|
182
184
|
* pi-agent-core's `streamFn` shape: what `Agent` calls to run a turn.
|
|
183
185
|
*
|
|
184
|
-
* @
|
|
186
|
+
* @beta This surface is in beta and may change.
|
|
185
187
|
*/
|
|
186
188
|
type StreamFn = (
|
|
187
189
|
model: Model<string>,
|
|
@@ -194,7 +196,7 @@ type StreamFn = (
|
|
|
194
196
|
* run it, `streamFn` with pi-agent-core's `Agent`, and `provider` with a pi-ai
|
|
195
197
|
* `Models` registry.
|
|
196
198
|
*
|
|
197
|
-
* @
|
|
199
|
+
* @beta This surface is in beta and may change.
|
|
198
200
|
*/
|
|
199
201
|
interface AI {
|
|
200
202
|
/** A Workers AI model: Cloudflare's own catalog, on the run path. */
|
|
@@ -275,7 +277,7 @@ interface AI {
|
|
|
275
277
|
* new Agent({ streamFn: ai.streamFn, initialState: { model: ai(openaiModel) } });
|
|
276
278
|
* ```
|
|
277
279
|
*
|
|
278
|
-
* @
|
|
280
|
+
* @beta This surface is in beta and may change.
|
|
279
281
|
*/
|
|
280
282
|
declare function createAI(settings: AISettings): AI;
|
|
281
283
|
//#endregion
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as mergeModelOptions, o as resolveOptions, r as gatewayLayerOf } from "../../settings-C45hDliX.js";
|
|
2
|
+
import { _ as isGatewayErrorEnvelope, a as normalizeChatCompletion, c as gatewaySlugForBaseUrl, d as resolveGatewayProvider, f as createTransport, g as headersToObject, h as errorFromResponse, i as normalizeChatCompletionsStream, l as isGatewayShapedUrl, m as errorFromGatewayEnvelope, n as imageMediaTypeOf, o as prepareChatCompletionsRequest, r as sseDataStream, s as GATEWAY_PROVIDER_NAMES, t as buildImageInput, v as unwrapEnvelope, x as isAbortError, y as CloudflareAIError } from "../../images-Ce9SCu3X.js";
|
|
2
3
|
import { calculateCost, clampThinkingLevel, createAssistantMessageEventStream, createProvider, getCurrentTools, normalizeContext, parseStreamingJson } from "@earendil-works/pi-ai";
|
|
3
4
|
import { CLOUDFLARE_AI_GATEWAY_MODELS } from "@earendil-works/pi-ai/providers/cloudflare-ai-gateway.models";
|
|
4
5
|
import { CLOUDFLARE_WORKERS_AI_MODELS } from "@earendil-works/pi-ai/providers/cloudflare-workers-ai.models";
|
|
@@ -13,14 +14,14 @@ import { clampOpenAIPromptCacheKey } from "@earendil-works/pi-ai/api/openai-prom
|
|
|
13
14
|
* wire format: Workers AI runs on `env.AI.run`, and the compat layer maps that
|
|
14
15
|
* onto strict OpenAI chat completions.
|
|
15
16
|
*
|
|
16
|
-
* @
|
|
17
|
+
* @beta This surface is in beta and may change.
|
|
17
18
|
*/
|
|
18
19
|
const CLOUDFLARE_AI_API = "cloudflare-ai";
|
|
19
20
|
/**
|
|
20
21
|
* The pi-ai provider id. A `Models` registry resolves specifiers as
|
|
21
22
|
* `cloudflare/<id>`, e.g. `cloudflare/anthropic/claude-opus-4-8`.
|
|
22
23
|
*
|
|
23
|
-
* @
|
|
24
|
+
* @beta This surface is in beta and may change.
|
|
24
25
|
*/
|
|
25
26
|
const CLOUDFLARE_PROVIDER_ID = "cloudflare";
|
|
26
27
|
const MODEL_OPTIONS = Symbol.for("agents.models.pi-ai.options");
|
|
@@ -1029,7 +1030,7 @@ function streamCompletions(request, transport) {
|
|
|
1029
1030
|
/**
|
|
1030
1031
|
* The `api` marker on image models from this provider.
|
|
1031
1032
|
*
|
|
1032
|
-
* @
|
|
1033
|
+
* @beta This surface is in beta and may change.
|
|
1033
1034
|
*/
|
|
1034
1035
|
const CLOUDFLARE_AI_IMAGES_API = "cloudflare-ai-images";
|
|
1035
1036
|
const IMAGE_OPTIONS = Symbol.for("agents.models.pi-ai.image-options");
|
|
@@ -1705,7 +1706,7 @@ function createStreams(config) {
|
|
|
1705
1706
|
* metadata (`api`, `compat`, `thinkingLevelMap`, cost, limits) is whatever its
|
|
1706
1707
|
* own registry says, and pi-ai's converters and stream processors do the rest.
|
|
1707
1708
|
*
|
|
1708
|
-
* @
|
|
1709
|
+
* @beta Everything exported here is in beta: the surface may
|
|
1709
1710
|
* change in a minor release while the design settles.
|
|
1710
1711
|
*
|
|
1711
1712
|
* @module
|
|
@@ -1753,7 +1754,7 @@ function buildModel(target, options) {
|
|
|
1753
1754
|
* new Agent({ streamFn: ai.streamFn, initialState: { model: ai(openaiModel) } });
|
|
1754
1755
|
* ```
|
|
1755
1756
|
*
|
|
1756
|
-
* @
|
|
1757
|
+
* @beta This surface is in beta and may change.
|
|
1757
1758
|
*/
|
|
1758
1759
|
function createAI(settings) {
|
|
1759
1760
|
const transport = createTransport(settings);
|