{"_id":"@ag-ui/cloudflare-agents","name":"@ag-ui/cloudflare-agents","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"@ag-ui/cloudflare-agents","version":"0.0.1","description":"AG-UI integration for Cloudflare Agents - Run AI agents on Cloudflare Workers with Durable Objects","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","sideEffects":false,"keywords":["ag-ui","cloudflare","workers","durable-objects","agents","ai","edge"],"peerDependencies":{"@ag-ui/core":">=0.0.37","@ag-ui/client":">=0.0.40","ai":"^5.0.0","rxjs":"^7.0.0","@cloudflare/workers-types":">=4.0.0"},"devDependencies":{"ai":"^5.0.0","@cloudflare/workers-types":"^4.20251106.1","@types/node":"^20.11.19","@vitest/coverage-istanbul":"^4.0.18","publint":"^0.3.12","@arethetypeswrong/cli":"^0.17.4","rxjs":"7.8.1","vitest":"^4.0.18","tsdown":"^0.20.1","typescript":"^5.3.3","@ag-ui/client":"0.0.55","@ag-ui/core":"0.0.55"},"repository":{"type":"git","url":"git+https://github.com/ag-ui-protocol/ag-ui.git","directory":"integrations/community/cloudflare-agents/typescript"},"author":{"name":"Audrey Klammer","email":"contact@audreyklammer.com","url":"https://github.com/Klammertime"},"license":"MIT","private":false,"publishConfig":{"access":"public"},"exports":{".":{"require":"./dist/index.js","import":"./dist/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"tsdown","dev":"tsdown --watch","clean":"git clean -fdX --exclude=\"!.env\"","typecheck":"tsc --noEmit","test":"vitest run","test:coverage":"vitest run --coverage","test:watch":"vitest","test:exports":"publint --strict && attw --pack","link:global":"pnpm link --global","unlink:global":"pnpm unlink --global"},"gitHead":"d049e55a53af652059e031429f57ba72762503fe","_id":"@ag-ui/cloudflare-agents@0.0.1","bugs":{"url":"https://github.com/ag-ui-protocol/ag-ui/issues"},"homepage":"https://github.com/ag-ui-protocol/ag-ui#readme","_integrity":"sha512-w078zVFfI5+w0QI9b/6oQWOzGiIDoR2KjtKq1F56ylQ9YQDKfnyG08Y6mHZqfdc4WfgzIC8CXKUkOiq5kMr4kg==","_resolved":"/Users/jpr5/proj/cpk/ag-ui-enroll-cf/integrations/community/cloudflare-agents/typescript/ag-ui-cloudflare-agents-0.0.1.tgz","_from":"file:/Users/jpr5/proj/cpk/ag-ui-enroll-cf/integrations/community/cloudflare-agents/typescript/ag-ui-cloudflare-agents-0.0.1.tgz","_nodeVersion":"25.8.0","_npmVersion":"11.15.0","dist":{"integrity":"sha512-w078zVFfI5+w0QI9b/6oQWOzGiIDoR2KjtKq1F56ylQ9YQDKfnyG08Y6mHZqfdc4WfgzIC8CXKUkOiq5kMr4kg==","shasum":"5126ebc42a05b36cb7b57cfbabffff46f1cd920e","tarball":"https://registry.npmjs.org/@ag-ui/cloudflare-agents/-/cloudflare-agents-0.0.1.tgz","fileCount":11,"unpackedSize":105390,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDLkZxxjpvZiNk09TTLjPF6sNwqhtRRpEOJ7dnDKnN1tAiB1T8XYYXd2ONBWYm307CKRsV/gqA0hvZL/bX/IwUxTuQ=="}]},"_npmUser":{"name":"copilotkit","email":"devops@copilotkit.ai"},"directories":{},"maintainers":[{"name":"_mme","email":"markus.ecker@gmail.com"},{"name":"copilotkit","email":"devops@copilotkit.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cloudflare-agents_0.0.1_1780613532286_0.9797138469957771"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T22:52:12.132Z","0.0.1":"2026-06-04T22:52:12.425Z","modified":"2026-06-04T22:52:12.644Z"},"maintainers":[{"name":"_mme","email":"markus.ecker@gmail.com"},{"name":"copilotkit","email":"devops@copilotkit.ai"}],"description":"AG-UI integration for Cloudflare Agents - Run AI agents on Cloudflare Workers with Durable Objects","homepage":"https://github.com/ag-ui-protocol/ag-ui#readme","keywords":["ag-ui","cloudflare","workers","durable-objects","agents","ai","edge"],"repository":{"type":"git","url":"git+https://github.com/ag-ui-protocol/ag-ui.git","directory":"integrations/community/cloudflare-agents/typescript"},"author":{"name":"Audrey Klammer","email":"contact@audreyklammer.com","url":"https://github.com/Klammertime"},"bugs":{"url":"https://github.com/ag-ui-protocol/ag-ui/issues"},"license":"MIT","readme":"# @ag-ui/cloudflare-agents\n\nAG-UI community integration for Cloudflare Agents. Provides a WebSocket client for connecting to deployed Cloudflare Workers and a server-side adapter for converting Vercel AI SDK v5 streams into AG-UI protocol events.\n\n## Components\n\n- **CloudflareAgentsClient** -- WebSocket client that connects to deployed Cloudflare Workers and translates their events to AG-UI protocol events.\n- **AgentsToAGUIAdapter** -- Server-side adapter that converts Vercel AI SDK v5 `StreamTextResult` into AG-UI events.\n- **createSSEResponse / createNDJSONResponse** -- Helper functions to stream AG-UI events over HTTP as Server-Sent Events or newline-delimited JSON.\n\n## Installation\n\n```bash\nnpm install @ag-ui/cloudflare-agents\n# or\npnpm add @ag-ui/cloudflare-agents\n```\n\n### Peer Dependencies\n\n- `@ag-ui/client` (>=0.0.40)\n- `@ag-ui/core` (>=0.0.37)\n- `ai` (^5.0.0) -- Vercel AI SDK v5+\n- `@cloudflare/workers-types` (>=4.0.0)\n\n## Usage\n\n### Client: Connect to a Deployed Agent\n\n```typescript\nimport { CloudflareAgentsClient } from \"@ag-ui/cloudflare-agents\";\n\nconst agent = new CloudflareAgentsClient({\n  url: \"wss://your-agent.workers.dev\",\n});\n\nagent\n  .runAgent({\n    threadId: \"thread-123\",\n    runId: \"run-456\",\n    messages: [{ role: \"user\", content: \"What's the weather?\" }],\n  })\n  .subscribe({\n    next: (event) => {\n      switch (event.type) {\n        case \"TEXT_MESSAGE_CONTENT\":\n          process.stdout.write(event.delta);\n          break;\n        case \"STATE_SNAPSHOT\":\n          console.log(\"State:\", event.snapshot);\n          break;\n        case \"TOOL_CALL_START\":\n          console.log(\"Calling tool:\", event.toolCallName);\n          break;\n      }\n    },\n    complete: () => console.log(\"Done\"),\n  });\n```\n\n### Adapter: Build an Agent with SSE Streaming\n\n```typescript\nimport { AgentsToAGUIAdapter, createSSEResponse } from \"@ag-ui/cloudflare-agents\";\nimport { streamText } from \"ai\";\nimport { openai } from \"@ai-sdk/openai\";\nimport { from } from \"rxjs\";\n\nconst adapter = new AgentsToAGUIAdapter();\n\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const { messages, threadId, runId } = await request.json();\n\n    const stream = streamText({\n      model: openai(\"gpt-4\"),\n      messages,\n    });\n\n    const events$ = from(\n      adapter.adaptStreamToAGUI(stream, threadId, runId, messages)\n    );\n\n    return createSSEResponse(events$);\n  },\n};\n```\n\n### Adapter: WebSocket Agent with Tools\n\n```typescript\nimport { Agent } from \"agents\";\nimport { streamText } from \"ai\";\nimport { openai } from \"@ai-sdk/openai\";\nimport { AgentsToAGUIAdapter } from \"@ag-ui/cloudflare-agents\";\nimport { z } from \"zod\";\n\nexport class MyAgent extends Agent {\n  private adapter = new AgentsToAGUIAdapter();\n\n  async onMessage(ws: WebSocket, raw: string | ArrayBuffer) {\n    const data = typeof raw === \"string\" ? raw : new TextDecoder().decode(raw);\n    const { messages, threadId } = JSON.parse(data);\n\n    const stream = streamText({\n      model: openai(\"gpt-4\"),\n      messages,\n      tools: {\n        getWeather: {\n          description: \"Get current weather\",\n          parameters: z.object({ location: z.string() }),\n          execute: async ({ location }) => ({ temperature: 72, condition: \"sunny\" }),\n        },\n      },\n    });\n\n    for await (const event of this.adapter.adaptStreamToAGUI(\n      stream, threadId, crypto.randomUUID(), messages\n    )) {\n      ws.send(JSON.stringify(event));\n    }\n  }\n}\n```\n\n## Supported AG-UI Events\n\n| Event | Supported |\n|---|---|\n| RUN_STARTED / RUN_FINISHED / RUN_ERROR | Yes |\n| TEXT_MESSAGE_START / CONTENT / END | Yes |\n| TOOL_CALL_START / ARGS / END | Yes (includes streaming args via tool-input-*) |\n| TOOL_CALL_RESULT | Yes (including error results) |\n| REASONING_START / MESSAGE_START / MESSAGE_CONTENT / MESSAGE_END / END | Yes |\n| STATE_SNAPSHOT | Yes |\n| MESSAGES_SNAPSHOT | Yes (with tool calls and results) |\n| STEP_STARTED / STEP_FINISHED | Yes |\n| RAW | Yes (adapter: AI SDK raw parts; client: unknown CF event types) |\n| CUSTOM | Yes (adapter: source/file parts; client: CUSTOM CF events) |\n| STATE_DELTA | Not yet |\n| ACTIVITY_SNAPSHOT / ACTIVITY_DELTA | Not yet |\n| REASONING_ENCRYPTED_VALUE | Not yet |\n| Interrupt / Resume | Not yet |\n| Subgraph support | Not yet |\n\n## Not Yet Supported\n\n- **STATE_DELTA** -- Requires application-level state diffing (JSON Patch RFC 6902) against previous state; currently only full STATE_SNAPSHOT is emitted.\n- **ACTIVITY_SNAPSHOT / ACTIVITY_DELTA** -- Requires application-level activity tracking.\n- **REASONING_ENCRYPTED_VALUE** -- Depends on the provider exposing encrypted reasoning signatures.\n- **Interrupt/resume** -- Requires Cloudflare Agents SDK checkpointing support for pausing and resuming agent runs.\n- **Subgraph support** -- This is a LangGraph-specific concept and does not apply to the Cloudflare Agents architecture.\n\n## Requirements\n\n- Vercel AI SDK v5+ (uses the `fullStream` API)\n- Cloudflare Workers runtime (for deployment)\n- Node.js 18+ or modern browser (for the client)\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-50ba8d0ca2a1ae92a780b93b7473289b"}