@fabric-harness/cloudflare 0.16.1 → 0.17.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/shell.d.ts +73 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +258 -0
- package/dist/shell.js.map +1 -0
- package/dist/workers-ai.d.ts +26 -11
- package/dist/workers-ai.d.ts.map +1 -1
- package/dist/workers-ai.js +32 -0
- package/dist/workers-ai.js.map +1 -1
- package/package.json +14 -8
package/dist/shell.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Workspace } from "@cloudflare/shell";
|
|
2
|
+
import type { DynamicWorkerExecutorOptions, ResolvedProvider } from "@cloudflare/codemode";
|
|
3
|
+
import type { SandboxEnv } from "@fabric-harness/sdk";
|
|
4
|
+
import { type ToolDef } from "@fabric-harness/sdk";
|
|
5
|
+
import type { CloudflareR2BucketLike } from "./index.js";
|
|
6
|
+
export interface CloudflareWorkerLoaderLike {
|
|
7
|
+
get(id: string): unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface CloudflareShellContext {
|
|
10
|
+
env: Record<string, unknown>;
|
|
11
|
+
ctx?: unknown;
|
|
12
|
+
storage: {
|
|
13
|
+
sql: unknown;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function runWithCloudflareShellContext<T>(context: CloudflareShellContext, fn: () => T): T;
|
|
17
|
+
export declare function getCloudflareShellContext(): CloudflareShellContext;
|
|
18
|
+
export interface GetDefaultCloudflareWorkspaceOptions {
|
|
19
|
+
namespace?: string;
|
|
20
|
+
r2?: unknown;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Construct the default @cloudflare/shell Workspace for the current Durable
|
|
24
|
+
* Object request. The generated Cloudflare target wires the request context via
|
|
25
|
+
* runWithCloudflareShellContext().
|
|
26
|
+
*/
|
|
27
|
+
export declare function getDefaultCloudflareWorkspace(options?: GetDefaultCloudflareWorkspaceOptions): Promise<Workspace>;
|
|
28
|
+
export interface CloudflareShellWorkspaceSandboxOptions {
|
|
29
|
+
workspace: Workspace;
|
|
30
|
+
/** Worker Loader binding, usually `env.LOADER`. Required for the model-facing `code` tool. */
|
|
31
|
+
loader?: CloudflareWorkerLoaderLike;
|
|
32
|
+
cwd?: string;
|
|
33
|
+
/** Forwarded to @cloudflare/codemode's DynamicWorkerExecutor. */
|
|
34
|
+
executor?: Pick<DynamicWorkerExecutorOptions, "timeout" | "globalOutbound" | "modules">;
|
|
35
|
+
}
|
|
36
|
+
export interface CloudflareShellWorkspaceSandbox {
|
|
37
|
+
sandbox: SandboxEnv;
|
|
38
|
+
tools: ToolDef[];
|
|
39
|
+
}
|
|
40
|
+
export declare function getCloudflareShellWorkspaceSandbox(options: CloudflareShellWorkspaceSandboxOptions): Promise<CloudflareShellWorkspaceSandbox>;
|
|
41
|
+
export declare function createCloudflareShellWorkspaceSandboxEnv(workspace: Workspace, options?: {
|
|
42
|
+
cwd?: string;
|
|
43
|
+
}): Promise<SandboxEnv>;
|
|
44
|
+
export interface CloudflareShellCodeToolOptions {
|
|
45
|
+
workspace: Workspace;
|
|
46
|
+
loader: CloudflareWorkerLoaderLike;
|
|
47
|
+
/** Forwarded to @cloudflare/codemode's DynamicWorkerExecutor. */
|
|
48
|
+
executor?: Pick<DynamicWorkerExecutorOptions, "timeout" | "globalOutbound" | "modules">;
|
|
49
|
+
}
|
|
50
|
+
export interface CloudflareShellCodeInput {
|
|
51
|
+
code: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function createCloudflareShellCodeTool(options: CloudflareShellCodeToolOptions): Promise<ToolDef<CloudflareShellCodeInput, string>>;
|
|
54
|
+
export interface CloudflareShellCodeExecutorLike {
|
|
55
|
+
execute(code: string, providers: ResolvedProvider[]): Promise<{
|
|
56
|
+
result?: unknown;
|
|
57
|
+
error?: unknown;
|
|
58
|
+
logs?: string[];
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
export declare function createCloudflareShellCodeToolFromExecutor(executor: CloudflareShellCodeExecutorLike, stateProvider: ResolvedProvider, options?: {
|
|
62
|
+
stateTypes?: string;
|
|
63
|
+
}): ToolDef<CloudflareShellCodeInput, string>;
|
|
64
|
+
export interface HydrateCloudflareWorkspaceFromR2Options {
|
|
65
|
+
/** Only copy keys under this prefix. The prefix is stripped from Workspace paths. */
|
|
66
|
+
prefix?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Eagerly copy R2 objects into a @cloudflare/shell Workspace. This is not an
|
|
70
|
+
* R2 mount: raw bucket keys are invisible to Workspace until explicitly hydrated.
|
|
71
|
+
*/
|
|
72
|
+
export declare function hydrateCloudflareWorkspaceFromR2(workspace: Pick<Workspace, "writeFileBytes">, bucket: Pick<CloudflareR2BucketLike, "list" | "get">, options?: HydrateCloudflareWorkspaceFromR2Options): Promise<void>;
|
|
73
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"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"}
|
package/dist/shell.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { defineTool } from "@fabric-harness/sdk";
|
|
3
|
+
const cloudflareShellContext = new AsyncLocalStorage();
|
|
4
|
+
export function runWithCloudflareShellContext(context, fn) {
|
|
5
|
+
return cloudflareShellContext.run(context, fn);
|
|
6
|
+
}
|
|
7
|
+
export function getCloudflareShellContext() {
|
|
8
|
+
const context = cloudflareShellContext.getStore();
|
|
9
|
+
if (!context) {
|
|
10
|
+
throw new Error("Cloudflare Shell context is not available. Call this inside a Cloudflare Durable Object request, or wrap execution with runWithCloudflareShellContext().");
|
|
11
|
+
}
|
|
12
|
+
return context;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Construct the default @cloudflare/shell Workspace for the current Durable
|
|
16
|
+
* Object request. The generated Cloudflare target wires the request context via
|
|
17
|
+
* runWithCloudflareShellContext().
|
|
18
|
+
*/
|
|
19
|
+
export async function getDefaultCloudflareWorkspace(options = {}) {
|
|
20
|
+
const { storage } = getCloudflareShellContext();
|
|
21
|
+
const { Workspace } = await import("@cloudflare/shell");
|
|
22
|
+
const workspaceOptions = { sql: storage.sql };
|
|
23
|
+
if (options.namespace !== undefined)
|
|
24
|
+
workspaceOptions.namespace = options.namespace;
|
|
25
|
+
if (options.r2 !== undefined)
|
|
26
|
+
workspaceOptions.r2 = options.r2;
|
|
27
|
+
return new Workspace(workspaceOptions);
|
|
28
|
+
}
|
|
29
|
+
export async function getCloudflareShellWorkspaceSandbox(options) {
|
|
30
|
+
const envOptions = {};
|
|
31
|
+
if (options.cwd !== undefined)
|
|
32
|
+
envOptions.cwd = options.cwd;
|
|
33
|
+
const sandbox = await createCloudflareShellWorkspaceSandboxEnv(options.workspace, envOptions);
|
|
34
|
+
const toolOptions = options.loader
|
|
35
|
+
? {
|
|
36
|
+
workspace: options.workspace,
|
|
37
|
+
loader: options.loader,
|
|
38
|
+
...(options.executor !== undefined ? { executor: options.executor } : {}),
|
|
39
|
+
}
|
|
40
|
+
: undefined;
|
|
41
|
+
const tools = toolOptions ? [await createCloudflareShellCodeTool(toolOptions)] : [];
|
|
42
|
+
return { sandbox, tools };
|
|
43
|
+
}
|
|
44
|
+
export async function createCloudflareShellWorkspaceSandboxEnv(workspace, options = {}) {
|
|
45
|
+
const { WorkspaceFileSystem } = await import("@cloudflare/shell");
|
|
46
|
+
const fs = new WorkspaceFileSystem(workspace);
|
|
47
|
+
return new CloudflareShellWorkspaceSandboxEnv(workspace, fs, options.cwd ?? "/");
|
|
48
|
+
}
|
|
49
|
+
const CLOUDFLARE_SHELL_CAPABILITIES = {
|
|
50
|
+
exec: false,
|
|
51
|
+
filesystem: true,
|
|
52
|
+
binaryFiles: true,
|
|
53
|
+
snapshots: false,
|
|
54
|
+
restore: false,
|
|
55
|
+
network: "provider-managed",
|
|
56
|
+
persistence: "durable",
|
|
57
|
+
isolation: "provider",
|
|
58
|
+
};
|
|
59
|
+
class CloudflareShellWorkspaceSandboxEnv {
|
|
60
|
+
workspace;
|
|
61
|
+
fs;
|
|
62
|
+
cwd;
|
|
63
|
+
capabilities = CLOUDFLARE_SHELL_CAPABILITIES;
|
|
64
|
+
constructor(workspace, fs, cwd) {
|
|
65
|
+
this.workspace = workspace;
|
|
66
|
+
this.fs = fs;
|
|
67
|
+
this.cwd = normalizeWorkspacePath(cwd);
|
|
68
|
+
}
|
|
69
|
+
async exec(command, _options) {
|
|
70
|
+
return {
|
|
71
|
+
command,
|
|
72
|
+
exitCode: 127,
|
|
73
|
+
stdout: "",
|
|
74
|
+
stderr: "Cloudflare Shell Workspace does not support exec()/bash. Use the `code` tool for JavaScript over state.*, or use Cloudflare Sandbox/Containers for Linux shell commands.\n",
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
readFile(filePath) {
|
|
78
|
+
return this.fs.readFile(this.resolvePath(filePath));
|
|
79
|
+
}
|
|
80
|
+
async readFileBuffer(filePath) {
|
|
81
|
+
return this.fs.readFileBytes(this.resolvePath(filePath));
|
|
82
|
+
}
|
|
83
|
+
async writeFile(filePath, content) {
|
|
84
|
+
const resolved = this.resolvePath(filePath);
|
|
85
|
+
if (typeof content === "string")
|
|
86
|
+
await this.workspace.writeFile(resolved, content);
|
|
87
|
+
else
|
|
88
|
+
await this.workspace.writeFileBytes(resolved, content);
|
|
89
|
+
}
|
|
90
|
+
async stat(filePath) {
|
|
91
|
+
return adaptCloudflareShellStat(await this.fs.stat(this.resolvePath(filePath)));
|
|
92
|
+
}
|
|
93
|
+
readdir(dirPath) {
|
|
94
|
+
return this.fs.readdir(this.resolvePath(dirPath));
|
|
95
|
+
}
|
|
96
|
+
exists(filePath) {
|
|
97
|
+
return this.fs.exists(this.resolvePath(filePath));
|
|
98
|
+
}
|
|
99
|
+
mkdir(dirPath, options = {}) {
|
|
100
|
+
return this.fs.mkdir(this.resolvePath(dirPath), options);
|
|
101
|
+
}
|
|
102
|
+
rm(filePath, options = {}) {
|
|
103
|
+
return this.fs.rm(this.resolvePath(filePath), options);
|
|
104
|
+
}
|
|
105
|
+
resolvePath(filePath) {
|
|
106
|
+
if (filePath.startsWith("/"))
|
|
107
|
+
return normalizeWorkspacePath(filePath);
|
|
108
|
+
return normalizeWorkspacePath(`${this.cwd === "/" ? "" : this.cwd}/${filePath}`);
|
|
109
|
+
}
|
|
110
|
+
async cleanup() { }
|
|
111
|
+
}
|
|
112
|
+
function adaptCloudflareShellStat(stat) {
|
|
113
|
+
return {
|
|
114
|
+
type: stat.type === "file"
|
|
115
|
+
? "file"
|
|
116
|
+
: stat.type === "directory"
|
|
117
|
+
? "directory"
|
|
118
|
+
: stat.type === "symlink"
|
|
119
|
+
? "symlink"
|
|
120
|
+
: "other",
|
|
121
|
+
size: stat.size,
|
|
122
|
+
...(stat.mtime !== undefined
|
|
123
|
+
? { mtime: stat.mtime instanceof Date ? stat.mtime : new Date(stat.mtime) }
|
|
124
|
+
: {}),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export async function createCloudflareShellCodeTool(options) {
|
|
128
|
+
// @cloudflare/codemode and @cloudflare/shell/workers import Cloudflare-only
|
|
129
|
+
// virtual modules, so keep them lazy. This lets Node-based tests and package
|
|
130
|
+
// consumers import this subpath while only Worker code constructs the tool.
|
|
131
|
+
const [{ DynamicWorkerExecutor, resolveProvider }, { stateTools }, { STATE_TYPES }] = await Promise.all([
|
|
132
|
+
import("@cloudflare/codemode"),
|
|
133
|
+
import("@cloudflare/shell/workers"),
|
|
134
|
+
import("@cloudflare/shell"),
|
|
135
|
+
]);
|
|
136
|
+
const executor = new DynamicWorkerExecutor({
|
|
137
|
+
loader: options.loader,
|
|
138
|
+
...options.executor,
|
|
139
|
+
});
|
|
140
|
+
const stateProvider = resolveProvider(stateTools(options.workspace));
|
|
141
|
+
return createCloudflareShellCodeToolFromExecutor(executor, stateProvider, {
|
|
142
|
+
stateTypes: STATE_TYPES,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
export function createCloudflareShellCodeToolFromExecutor(executor, stateProvider, options = {}) {
|
|
146
|
+
return defineTool({
|
|
147
|
+
name: "code",
|
|
148
|
+
description: buildCloudflareShellCodeToolDescription(options.stateTypes),
|
|
149
|
+
inputSchema: {
|
|
150
|
+
type: "object",
|
|
151
|
+
additionalProperties: false,
|
|
152
|
+
properties: {
|
|
153
|
+
code: {
|
|
154
|
+
type: "string",
|
|
155
|
+
description: 'A single async JavaScript arrow function, for example: async () => { const text = await state.readFile("/notes.md"); return text; }',
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
required: ["code"],
|
|
159
|
+
},
|
|
160
|
+
metadata: { effect: "execute", backend: "cloudflare-shell-workspace" },
|
|
161
|
+
async execute(input) {
|
|
162
|
+
const { result, error, logs } = await executor.execute(input.code, [stateProvider]);
|
|
163
|
+
if (error) {
|
|
164
|
+
const logsTail = logs?.length ? `\n\nlogs:\n${logs.join("\n")}` : "";
|
|
165
|
+
throw new Error(`Cloudflare Shell code tool failed: ${String(error)}${logsTail}`);
|
|
166
|
+
}
|
|
167
|
+
const resultText = formatCodeToolResult(result);
|
|
168
|
+
const logsText = logs?.length ? `\n\n--- logs ---\n${logs.join("\n")}` : "";
|
|
169
|
+
return resultText + logsText;
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function formatCodeToolResult(result) {
|
|
174
|
+
if (result === undefined)
|
|
175
|
+
return "(no result)";
|
|
176
|
+
if (typeof result === "string")
|
|
177
|
+
return result;
|
|
178
|
+
try {
|
|
179
|
+
return JSON.stringify(result, null, 2);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return String(result);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function buildCloudflareShellCodeToolDescription(stateTypes = "See @cloudflare/shell STATE_TYPES for the full state API available inside Cloudflare Workers.") {
|
|
186
|
+
return [
|
|
187
|
+
"Run JavaScript inside an isolated Cloudflare Worker against a durable @cloudflare/shell Workspace.",
|
|
188
|
+
"The snippet must be a single async arrow function:",
|
|
189
|
+
"",
|
|
190
|
+
" async () => {",
|
|
191
|
+
' const text = await state.readFile("/notes.md");',
|
|
192
|
+
' await state.writeFile("/notes.md", text.toUpperCase());',
|
|
193
|
+
" return { bytes: text.length };",
|
|
194
|
+
" }",
|
|
195
|
+
"",
|
|
196
|
+
"Rules:",
|
|
197
|
+
"- Write JavaScript, not TypeScript — no type annotations.",
|
|
198
|
+
"- Do not use import statements. Everything you need is on state.",
|
|
199
|
+
"- Always return the value you want back.",
|
|
200
|
+
"- Network access is disabled unless the host explicitly enables it in executor options.",
|
|
201
|
+
"- Use Cloudflare Sandbox/Containers instead if you need bash, grep, language toolchains, or Linux packages.",
|
|
202
|
+
"",
|
|
203
|
+
"The state API TypeScript declaration:",
|
|
204
|
+
"",
|
|
205
|
+
"```typescript",
|
|
206
|
+
stateTypes,
|
|
207
|
+
"```",
|
|
208
|
+
].join("\n");
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Eagerly copy R2 objects into a @cloudflare/shell Workspace. This is not an
|
|
212
|
+
* R2 mount: raw bucket keys are invisible to Workspace until explicitly hydrated.
|
|
213
|
+
*/
|
|
214
|
+
export async function hydrateCloudflareWorkspaceFromR2(workspace, bucket, options = {}) {
|
|
215
|
+
if (!bucket.list)
|
|
216
|
+
throw new Error("hydrateCloudflareWorkspaceFromR2 requires an R2 bucket with list().");
|
|
217
|
+
let cursor;
|
|
218
|
+
do {
|
|
219
|
+
const page = await bucket.list({
|
|
220
|
+
...(options.prefix ? { prefix: options.prefix } : {}),
|
|
221
|
+
...(cursor ? { cursor } : {}),
|
|
222
|
+
});
|
|
223
|
+
for (const object of page.objects) {
|
|
224
|
+
const relativePath = stripHydrationPrefix(object.key, options.prefix);
|
|
225
|
+
if (!relativePath || relativePath.endsWith("/"))
|
|
226
|
+
continue;
|
|
227
|
+
const body = await bucket.get(object.key);
|
|
228
|
+
if (!body)
|
|
229
|
+
continue;
|
|
230
|
+
await workspace.writeFileBytes(absolutizeWorkspacePath(relativePath), new Uint8Array(await body.arrayBuffer()));
|
|
231
|
+
}
|
|
232
|
+
cursor = page.truncated ? page.cursor : undefined;
|
|
233
|
+
if (page.truncated && !cursor)
|
|
234
|
+
throw new Error("R2 listing was truncated but did not include a cursor.");
|
|
235
|
+
} while (cursor);
|
|
236
|
+
}
|
|
237
|
+
function stripHydrationPrefix(key, prefix) {
|
|
238
|
+
if (!prefix)
|
|
239
|
+
return key;
|
|
240
|
+
return key.startsWith(prefix) ? key.slice(prefix.length) : key;
|
|
241
|
+
}
|
|
242
|
+
function absolutizeWorkspacePath(path) {
|
|
243
|
+
return path.startsWith("/") ? normalizeWorkspacePath(path) : normalizeWorkspacePath(`/${path}`);
|
|
244
|
+
}
|
|
245
|
+
function normalizeWorkspacePath(input) {
|
|
246
|
+
const parts = [];
|
|
247
|
+
for (const part of input.split("/")) {
|
|
248
|
+
if (!part || part === ".")
|
|
249
|
+
continue;
|
|
250
|
+
if (part === "..") {
|
|
251
|
+
parts.pop();
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
parts.push(part);
|
|
255
|
+
}
|
|
256
|
+
return `/${parts.join("/")}`;
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"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"}
|
package/dist/workers-ai.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { type ModelProvider, type ModelRequest, type ModelResponse } from '@fabric-harness/sdk';
|
|
1
|
+
import { type ModelMetadata, type ModelProvider, type ModelRequest, type ModelResponse } from '@fabric-harness/sdk';
|
|
2
2
|
/**
|
|
3
3
|
* Reserved model-string prefix that routes through the Workers AI binding
|
|
4
4
|
* provider. `init({ model: 'cloudflare/@cf/meta/llama-3.1-8b-instruct' })`
|
|
5
5
|
* picks this provider when one is registered with the matching name.
|
|
6
6
|
*/
|
|
7
7
|
export declare const CLOUDFLARE_WORKERS_AI_MODEL_PREFIX = "cloudflare/";
|
|
8
|
+
export declare const BUILTIN_WORKERS_AI_MODEL_INFO: Record<string, CloudflareWorkersAIModelInfo>;
|
|
8
9
|
/**
|
|
9
10
|
* Structural shape of Cloudflare Workers' AI binding (`env.AI`).
|
|
10
11
|
*
|
|
@@ -21,13 +22,24 @@ export interface CloudflareWorkersAIBindingLike {
|
|
|
21
22
|
temperature?: number;
|
|
22
23
|
stream?: boolean;
|
|
23
24
|
}, options?: {
|
|
24
|
-
gateway?:
|
|
25
|
-
id: string;
|
|
26
|
-
skipCache?: boolean;
|
|
27
|
-
cacheTtl?: number;
|
|
28
|
-
};
|
|
25
|
+
gateway?: CloudflareWorkersAIGatewayOptions;
|
|
29
26
|
}): Promise<unknown>;
|
|
30
27
|
}
|
|
28
|
+
export interface CloudflareWorkersAIGatewayOptions {
|
|
29
|
+
id: string;
|
|
30
|
+
skipCache?: boolean;
|
|
31
|
+
cacheTtl?: number;
|
|
32
|
+
cacheKey?: string;
|
|
33
|
+
metadata?: Record<string, number | string | boolean | null | bigint>;
|
|
34
|
+
collectLog?: boolean;
|
|
35
|
+
eventId?: string;
|
|
36
|
+
requestTimeoutMs?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface CloudflareWorkersAIModelInfo {
|
|
39
|
+
contextWindowTokens?: number;
|
|
40
|
+
maxOutputTokens?: number;
|
|
41
|
+
supportsTools?: boolean;
|
|
42
|
+
}
|
|
31
43
|
export interface CloudflareWorkersAIModelProviderOptions {
|
|
32
44
|
/**
|
|
33
45
|
* The Workers AI binding object — typically `env.AI`. Accept the binding
|
|
@@ -42,11 +54,11 @@ export interface CloudflareWorkersAIModelProviderOptions {
|
|
|
42
54
|
* Optional Cloudflare AI Gateway routing. When set, every call is routed
|
|
43
55
|
* through the named Gateway for caching, logging, and rate-limiting.
|
|
44
56
|
*/
|
|
45
|
-
gateway?:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
gateway?: CloudflareWorkersAIGatewayOptions;
|
|
58
|
+
/** Default metadata applied when a model isn't listed in `models`. */
|
|
59
|
+
defaultModelInfo?: CloudflareWorkersAIModelInfo;
|
|
60
|
+
/** Per-model context-window/max-token metadata for compaction and UIs. */
|
|
61
|
+
models?: Record<string, CloudflareWorkersAIModelInfo>;
|
|
50
62
|
}
|
|
51
63
|
/**
|
|
52
64
|
* Model provider that dispatches to Cloudflare Workers AI via the platform
|
|
@@ -82,7 +94,10 @@ export declare class CloudflareWorkersAIModelProvider implements ModelProvider {
|
|
|
82
94
|
private readonly binding;
|
|
83
95
|
private readonly defaultModel?;
|
|
84
96
|
private readonly gateway?;
|
|
97
|
+
private readonly defaultModelInfo?;
|
|
98
|
+
private readonly models;
|
|
85
99
|
constructor(options: CloudflareWorkersAIModelProviderOptions);
|
|
100
|
+
getModelMetadata(model?: string): ModelMetadata | undefined;
|
|
86
101
|
generate(request: ModelRequest): Promise<ModelResponse>;
|
|
87
102
|
}
|
|
88
103
|
/**
|
package/dist/workers-ai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers-ai.d.ts","sourceRoot":"","sources":["../src/workers-ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,aAAa,EAGnB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,gBAAgB,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CACD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;QACL,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACvC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,EACD,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"workers-ai.d.ts","sourceRoot":"","sources":["../src/workers-ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,aAAa,EAGnB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,gBAAgB,CAAC;AAEhE,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAOtF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CACD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;QACL,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACvC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,EACD,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,iCAAiC,CAAA;KAAE,GACxD,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,uCAAuC;IACtD;;;OAGG;IACH,OAAO,EAAE,8BAA8B,CAAC;IACxC,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,iCAAiC,CAAC;IAC5C,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;IAChD,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;CACvD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,gCAAiC,YAAW,aAAa;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;gBAE1D,OAAO,EAAE,uCAAuC;IAS5D,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAoBrD,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAyB9D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI3D"}
|
package/dist/workers-ai.js
CHANGED
|
@@ -5,6 +5,14 @@ import { openAIChatCompletionToModelResponse, toOpenAIMessage, toOpenAITool, } f
|
|
|
5
5
|
* picks this provider when one is registered with the matching name.
|
|
6
6
|
*/
|
|
7
7
|
export const CLOUDFLARE_WORKERS_AI_MODEL_PREFIX = 'cloudflare/';
|
|
8
|
+
export const BUILTIN_WORKERS_AI_MODEL_INFO = {
|
|
9
|
+
'@cf/meta/llama-3.1-8b-instruct': { contextWindowTokens: 8192, maxOutputTokens: 2048, supportsTools: true },
|
|
10
|
+
'@cf/meta/llama-3.1-70b-instruct': { contextWindowTokens: 8192, maxOutputTokens: 2048, supportsTools: true },
|
|
11
|
+
'@cf/meta/llama-3.1-8b-instruct-fast': { contextWindowTokens: 8192, maxOutputTokens: 2048, supportsTools: true },
|
|
12
|
+
'@cf/meta/llama-3.2-1b-instruct': { contextWindowTokens: 8192, maxOutputTokens: 2048, supportsTools: false },
|
|
13
|
+
'@cf/meta/llama-3.2-3b-instruct': { contextWindowTokens: 8192, maxOutputTokens: 2048, supportsTools: false },
|
|
14
|
+
'@cf/mistral/mistral-7b-instruct-v0.2-lora': { contextWindowTokens: 32768, maxOutputTokens: 2048, supportsTools: false },
|
|
15
|
+
};
|
|
8
16
|
/**
|
|
9
17
|
* Model provider that dispatches to Cloudflare Workers AI via the platform
|
|
10
18
|
* binding (`env.AI.run()`) instead of HTTP. Use on a Cloudflare Workers
|
|
@@ -39,6 +47,8 @@ export class CloudflareWorkersAIModelProvider {
|
|
|
39
47
|
binding;
|
|
40
48
|
defaultModel;
|
|
41
49
|
gateway;
|
|
50
|
+
defaultModelInfo;
|
|
51
|
+
models;
|
|
42
52
|
constructor(options) {
|
|
43
53
|
this.name = options.name ?? 'workers-ai';
|
|
44
54
|
this.binding = options.binding;
|
|
@@ -46,6 +56,28 @@ export class CloudflareWorkersAIModelProvider {
|
|
|
46
56
|
this.defaultModel = options.defaultModel;
|
|
47
57
|
if (options.gateway !== undefined)
|
|
48
58
|
this.gateway = options.gateway;
|
|
59
|
+
if (options.defaultModelInfo !== undefined)
|
|
60
|
+
this.defaultModelInfo = options.defaultModelInfo;
|
|
61
|
+
this.models = { ...BUILTIN_WORKERS_AI_MODEL_INFO, ...(options.models ?? {}) };
|
|
62
|
+
}
|
|
63
|
+
getModelMetadata(model) {
|
|
64
|
+
const requested = model ?? this.defaultModel;
|
|
65
|
+
if (!requested) {
|
|
66
|
+
return {
|
|
67
|
+
provider: this.name,
|
|
68
|
+
...(this.gateway?.id ? { gateway: this.gateway.id } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const stripped = stripCloudflarePrefix(requested);
|
|
72
|
+
const info = this.models[stripped] ?? this.defaultModelInfo;
|
|
73
|
+
return {
|
|
74
|
+
provider: this.name,
|
|
75
|
+
model: stripped,
|
|
76
|
+
...(info?.contextWindowTokens !== undefined ? { contextWindowTokens: info.contextWindowTokens } : {}),
|
|
77
|
+
...(info?.maxOutputTokens !== undefined ? { maxOutputTokens: info.maxOutputTokens } : {}),
|
|
78
|
+
...(info?.supportsTools !== undefined ? { supportsTools: info.supportsTools } : {}),
|
|
79
|
+
...(this.gateway?.id ? { gateway: this.gateway.id } : {}),
|
|
80
|
+
};
|
|
49
81
|
}
|
|
50
82
|
async generate(request) {
|
|
51
83
|
const requested = request.model ?? this.defaultModel;
|
package/dist/workers-ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers-ai.js","sourceRoot":"","sources":["../src/workers-ai.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EACnC,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"workers-ai.js","sourceRoot":"","sources":["../src/workers-ai.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fabric-harness/cloudflare",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Cloudflare Workers and Sandbox adapter for Fabric Harness.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Fabric",
|
|
@@ -41,6 +41,10 @@
|
|
|
41
41
|
"./workers-ai": {
|
|
42
42
|
"types": "./dist/workers-ai.d.ts",
|
|
43
43
|
"import": "./dist/workers-ai.js"
|
|
44
|
+
},
|
|
45
|
+
"./shell": {
|
|
46
|
+
"types": "./dist/shell.d.ts",
|
|
47
|
+
"import": "./dist/shell.js"
|
|
44
48
|
}
|
|
45
49
|
},
|
|
46
50
|
"files": [
|
|
@@ -48,8 +52,15 @@
|
|
|
48
52
|
"README.md",
|
|
49
53
|
"LICENSE"
|
|
50
54
|
],
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsc -p tsconfig.json",
|
|
57
|
+
"check": "tsc -b tsconfig.json",
|
|
58
|
+
"test": "vitest run"
|
|
59
|
+
},
|
|
51
60
|
"dependencies": {
|
|
52
|
-
"@
|
|
61
|
+
"@cloudflare/codemode": "^0.3.6",
|
|
62
|
+
"@cloudflare/shell": "^0.3.7",
|
|
63
|
+
"@fabric-harness/sdk": "^1.13.0"
|
|
53
64
|
},
|
|
54
65
|
"peerDependencies": {
|
|
55
66
|
"@cloudflare/sandbox": "*"
|
|
@@ -62,10 +73,5 @@
|
|
|
62
73
|
"devDependencies": {
|
|
63
74
|
"typescript": "^5.8.3",
|
|
64
75
|
"vitest": "^4.1.5"
|
|
65
|
-
},
|
|
66
|
-
"scripts": {
|
|
67
|
-
"build": "tsc -p tsconfig.json",
|
|
68
|
-
"check": "tsc -b tsconfig.json",
|
|
69
|
-
"test": "vitest run"
|
|
70
76
|
}
|
|
71
|
-
}
|
|
77
|
+
}
|