使用说明
AI Chatbot
React + Vite + Supabase Auth + Multi‑LLM Streaming (OpenAI, Anthropic, Google Gemini, DeepSeek)
Modern, secure, streaming AI chat interface with an animated glassmorphic login and pluggable assistant architecture.
1.概述
该项目是一个专注于前端的多提供商AI聊天客户端。它通过Supabase电子邮件/密码对用户进行身份验证,并逐令牌流式传输模型响应(服务器发送事件,SSE),以实现响应式用户体验。提供者被封装在轻量级的Assistant类后面(src/assistants/*)因此,您可以轻松地交换或扩展模型。
为什么是这个堆栈?
- React+Vite:快速开发服务器,现代构建,易于处理环境变量。
- Supabase Auth:插入托管的Postgres+Auth,具有JWT会话持久性。
- SSE流媒体:每令牌UI更新,以减少感知延迟。
- 模块化助理:每个供应商都是独立的;在不接触核心聊天UI的情况下添加新内容。
2.特点
- 电子邮件/密码验证(会话持久性和自动刷新)
- 带有基本验证的动画、可访问的登录表单
- 多LLM提供商支持:OpenAI、Anthropic Claude、Google Gemini、DeepSeek
- 增量响应流(异步生成器模式)
- 简单的提供者切换(实例化不同的Assistant类)
- 通过配置环境变量
import.meta.env - 为敏感密钥提供安全的服务器/代理端点(推荐的生产模式)
- 内置项目代码工具(
list_project_files,read_project_file,summarize_project)无需外部文件系统服务器即可读取和汇总源代码 - 聊天中每个工具的结果卡分开,以获得更清晰的输出(展开/折叠单个工具输出)
- 每回合工具执行分组:每个用户提示后面都紧接着该回合工具活动的面板(运行执行+完成结果),保留了按时间顺序排列的上下文
3.项目结构(要点)
src/
App.jsx # High-level composition & chat orchestration
supabaseClient.js # Supabase initialization using env vars
context/AuthContext.jsx# Auth state provider
components/ # UI modules (Login, Chat, Controls, Loader)
assistants/ # Provider adapters (openai, anthropic, googleai, deepseekai, sseParser)
MCP/ # Worker / server integration (tool registration, streaming endpoints)
4.先决条件
| 要求 | 注意事项 |
|---|---|
| Node.js>=18 | 用于本机获取和流 |
| Supabase帐户 | 在suabase.com上创建项目 |
| API密钥(可选开发) | OpenAI/Anthopic/Google/DeepSeek |
| Wrangler(如果使用Cloudflare Worker) | 用于机密+部署 |
5.环境变量
创建本地文件 ./.env.local (Vite自动加载)至少:
VITE_SUPABASE_URL=https://YOUR_PROJECT_ID.supabase.co
VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_PUBLIC_KEY
可选(仅限开发/测试–避免在生产捆绑包中公开):
VITE_OPENAI_API_KEY=sk-... # If you bypass proxy (not recommended)
VITE_ANTHROPIC_API_KEY=sk-ant-... # Dev only, prefer server proxy
VITE_GOGGLE_AI_API_KEY=AIza... # Google Generative AI key (typo kept for compatibility if present)
VITE_DEEPSEEK_AI_API_KEY=sk-... # DeepSeek key if direct calling
生产最佳实践:将提供者密钥保存在服务器/CCloudflare Worker上(请参阅机密部分),并仅向浏览器公开您自己的代理端点。
6.安装和运行
git clone https://github.com/arasmodirpolimi/AI-CHATBOT.git
cd AI-CHATBOT
npm install
npm run dev
打开http://localhost:5173并使用Supabase测试用户登录。
在聊天中阅读项目代码
您可以要求助手使用内置的代码工具。示例提示:
List project files.→ 调用list_project_filesRead the file src/components/Chat/Chat.jsx→ 调用read_project_fileSummarize the project codebase→ 调用summarize_project
现在,每个工具执行都直接在触发它的用户消息下呈现。当前回合的运行执行出现在实时活动面板中;完成的执行显示为具有关闭控件的独立可扩展/可折叠卡。前几轮将保留其完成的工具结果窗口,这样您就可以按时间顺序滚动工具使用情况,而不会丢失上下文。
7.Supabase权限设置
- 在Supabase仪表板中:身份验证→ 提供商→ 启用电子邮件。
- (可选)禁用电子邮件确认以加快本地迭代。
- 在身份验证下手动创建用户→ 用户(或在实施后使用注册流程)。
- 将项目URL和匿名密钥添加到
.env.local如上所示。
验证流内部
AuthContext电话supabase.auth.getSession()在山上。- 添加一个监听器,以在令牌刷新或注销时保持React状态的一致性。
signInWithEmail包裹supabase.auth.signInWithPassword.signOut电话supabase.auth.signOut并清除记住的电子邮件。- “记住我”仅将电子邮件字符串存储在
localStorage(无代币)。
8.切换模型提供者
每个提供商导出 Assistant 具有一致的界面:
const assistant = new OpenAI.Assistant("gpt-4o-mini");
const response = await assistant.chat("Hello");
for await (const chunk of assistant.chatStream("Explain SSE")) {
// append chunk to UI
}
要切换:
import { Assistant as AnthropicAssistant } from './assistants/anthropic';
const assistant = new AnthropicAssistant();
提供商备注
| 提供者 | 文件 | 密钥处理 | 流式传输方法 |
|---|---|---|---|
| OpenAI | assistants/openai.js |
使用服务器代理 /openai/chat |
SSE通过 parseSSEReadable |
| 人类学 | assistants/anthropic.js |
代理端点 /anthropic/chat & /anthropic/ai/* |
映射到三角洲的SSE事件 |
| 谷歌双子座 | assistants/googleai.js |
直接SDK(env中的键) | SDK流迭代器 |
| DeepSeek | assistants/deepseekai.js |
OpenAI兼容的baseURL和密钥 | 继承OpenAI流媒体 |
9.流媒体架构
- 用户在聊天UI中提交提示。
assistant.chatStream(prompt)返回异步生成器。- UI使用生成器并将令牌/块附加到活动消息中。
- SSE解析(
sseParser.js)转换原始data:行转换为JSON对象,直到[DONE].
流媒体的好处
- 更快的感知响应时间。
- 实时取消或注入工具事件的可能性。
- 高级功能的基础(部分推理跟踪、工具调用进度)。
10.Anthropic与OpenAI(快速比较)
| 标准 | 克劳德3.5 Sonnet | GPT‑4o/Mini |
|---|---|---|
| 上下文长度 | ~200K个标记 | 较小(但多模式) |
| 优势 | 长文档分析、安全性 | 生态系统、多模式和工具 |
| 成本 | 在长时间环境下具有竞争力 | 在短时间提示下价格低廉 |
| 流媒体增量类型 | content_block_delta |
choices[0].delta.content |
| 选择时间 | 需要长时间、仔细的推理 | 需要广度和整合 |
11.Cloudflare Worker/Secrets(可选)
如果通过Cloudflare Worker部署SSE代理:
wrangler secret put OPENAI_API_KEY
wrangler secret put ANTHROPIC_API_KEY
然后将Worker路线映射到 /openai/chat, /anthropic/chat 所以浏览器永远看不到原始密钥。
12.安全准则
- 切勿提交服务角色或管理员密钥。
- 对于提供者调用,首选服务器/工作代理;避免在客户端暴露密钥。
- 在存储用户聊天历史记录之前启用行级安全(RLS)。
- 考虑在代理端点上进行速率限制和日志记录。
- 在生产中使用HTTPS;注意流媒体中的混合内容。
13.与新供应商合作
- 创建
src/assistants/myprovider.js. - 实施
chat(prompt, history?)和async *chatStream(...). - 将SSE或流式SDK输出解析为纯文本增量(
yield string). - 通过实例化插入UI
new Assistant()在组件或上下文中。
最小模板:
import { parseSSEReadable } from './sseParser';
export class Assistant {
constructor(model = 'my-model') { this.model = model; }
async chat(content) { /* fetch -> return full text */ }
async *chatStream(content) {
const res = await fetch('/myprovider/chat', { /* ... */ });
for await (const evt of parseSSEReadable(res.body)) {
const delta = evt.delta || evt.text; if (delta) yield delta;
}
}
}
14.测试与调试
| 测试 | 寻找什么 |
|---|---|
| 无效登录 | 带有来自Supabase消息的错误横幅 |
| 网络离线 | 优雅的错误而不是崩溃 |
| SSE终止 | 流停止在 [DONE] 不挂 |
| 提供者切换 | 交换助手后响应仍在流式传输 |
调试提示:
- 添加
console.log(payload)里面parseSSEReadable以检查提供程序事件形状。 - 日志
session在...之内AuthContext用于令牌刷新问题。 - 使用浏览器DevTools→ 网络观看
/openai/chat(流媒体播放时应保持待定状态)。
15.常见问题
| 症状 | 原因 | 修复 |
|---|---|---|
| 警告:缺少Supabase变体 | .env.local 未加载 |
重新启动开发服务器;确保前缀 VITE_ |
| 401提供程序上未经授权 | 服务器端缺少密钥 | 向Worker/server环境添加密钥 |
| 流媒体提前停止 | 提供商发送完成事件 | 验证循环句柄 [DONE] 正确 |
| CORS错误 | 直接获取到提供程序域 | 使用服务器代理终结点 |
16.路线图/未来的改进
- 注册和密码重置流程
- OAuth(谷歌/GitHub)通过
supabase.auth.signInWithOAuth - 保留每个用户的聊天历史记录(Postgres表+RLS策略)
- 工具调用可视化(UI中的函数执行跟踪)
- 提示模板和系统消息编辑
- 限速和使用计量仪表板
- 主题切换和可访问性对比度改进
- 流媒体取消按钮
- 用于富文件操作的外部文件系统MCP服务器(通过npx生成)
文件系统MCP服务器支持
添加一个提供文件系统工具(读/写/列表/搜索等)的外部MCP服务器。通过POSTing创建 /api/mcp/servers 与类型 filesystem:
{
"name": "fs",
"type": "filesystem",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."]
}
服务器以id进行响应;通过以下方式获取工具 /api/mcp/servers/<id>/tools.
工具发现现在通过MCP JSON-RPC完全动态(initialize + tools/list).没有捆绑静态回退列表。
安全注意事项:
- 不要在没有沙盒的情况下公开文件系统MCP服务器。
- 在受限的工作目录或容器中运行它。
- 在可能的情况下,首选只读或经过审核的工具;在上游添加允许/拒绝路径过滤器。
17.贡献
- 分叉与分支:
git checkout -b feat/your-feature. - 保持变化最小化和集中;如果行为发生变化,请更新文档。
- 跑
npm run build(可选)以确保没有生产错误。 - 提交描述动机的公关+截图(如果UI发生变化)。
18.许可证
麻省理工学院(见 LICENSE 如果添加)。替换或增强专有部署。
19.快速入门片段
// Inside a React component after auth:
import { Assistant as OpenAIAssistant } from './assistants/openai';
const assistant = new OpenAIAssistant();
async function ask(q) {
let text = '';
for await (const delta of assistant.chatStream(q)) {
text += delta;
// setState(text) to update UI progressively
}
return text;
}
20.致谢
使用Vite React模板构建;适用于多提供商AI实验。感谢流式API的开放模型提供商。
享受在这个AI+身份验证启动器之上构建。欢迎投稿!
21.部署指南
GitHub页面(仅前端)
在静态主机上附加环境变量
GitHub Pages(和其他静态主机)在构建时烘焙环境变量。您必须提供:
VITE_SUPABASE_URL=https://YOUR_PROJECT_ID.supabase.co
VITE_SUPABASE_ANON_KEY=YOUR_PUBLIC_ANON_KEY
这些是公开的(非密钥),但仍然通过RLS策略保护数据。如果它们缺失,构建工作流现在会注入占位符,应用程序应显示警告(登录操作将失败)。在“设置”>“秘密”>“操作”下设置真实秘密以启用身份验证。
GitHub Pages仅提供静态文件。您可以部署内置的Vite应用程序,但不能部署Express/MCP服务器。提供的工作流程 .github/workflows/deploy-pages.yml 自动:
- 安装依赖项
- 跑
npm run build - 发布
dist/文件夹到页面
首次成功运行后,检查操作日志或设置>页面中的URL。如果资产404位于子路径下,请设置 base 在 vite.config.js:
import { defineConfig } from 'vite';
export default defineConfig({ base: '/REPO_NAME/' });
后端托管(MCP和代理需要)
选择任何免费的节点/边缘平台运行 src/MCP/server.js:
| 平台 | 优点 | 注意事项 |
|---|---|---|
| 渲染 | 持久进程(映射会话正常) | 使用 PORT env;添加机密 |
| 铁路 | 类似于渲染的易用性 | 免费层限制了运行时间 |
| Cloudflare Workers | 全球领先,廉价/免费 | 必须重构Express→ 工人;将会话外部化 |
| Fly.io | 类似虚拟机;良好的控制 | 需要Dockerfile |
| Vercel函数 | 与前端统一 | 无状态;需要外部会话存储(Redis) |
设置机密(OPENAI_API_KEY、ANTHROPIC_API_KEY、ALLOWED_ORIGIN)。切勿将提供者密钥暴露给浏览器。
已添加环境变量
PORT 和 ALLOWED_ORIGIN 现在支持 server.js.在部署时调整原点以防止CORS问题。
将前端链接到后端
使用环境变量(例如。 VITE_API_BASE)将fetch调用指向已部署的后端源:
const API_BASE = import.meta.env.VITE_API_BASE || 'http://localhost:3100';
fetch(`${API_BASE}/openai/chat`, { /* ... */ });
添加 VITE_API_BASE 如果需要,在GitHub Pages构建环境中(Pages build只注入静态值,没有秘密)。
代码空间
在云开发环境的GitHub Codespace中运行所有内容:
export OPENAI_MOCK=1
export ANTHROPIC_MOCK=1
npm ci
npm run dev
转发端口(3100个后端,5173个前端)和测试流端点。
部署故障排除
| 症状 | 原因 | 修复 |
|---|---|---|
| CORS错误 | 前端源不匹配 | 设置 ALLOWED_ORIGIN 后端环境变量 |
| SSE断开连接 | 主机缓冲/空闲 | 选择支持长期响应的平台(渲染器/工作器) |
404上 /mcp |
后端未部署/基数错误 | 验证后端URL;会话标头可选 |
| 页面上的资产404 | 缺失 base |
设置 base 到回购路径 |
405不允许 /anthropic/ai/chat-stream |
静态主机(Pages)看到POST到不存在的路径 | 设置 VITE_API_BASE 到后端原点;回退将使用非流端点 |
| 529过载(克劳德) | 人为临时容量问题 | 现在应用了自动退避重试(1s、2s、3s);如果仍然失败,只需重新询问 |
| 404找不到模型 | 请求的模型已弃用或拼写错误 | 自动回退到候选列表;更新配置模型 |
Cloudflare Worker集成(后端代理)
部署Cloudflare Worker可以让您在边缘托管最小的代理端点。步骤:
- 添加机密(从不提交提供程序密钥):
wrangler secret put OPENAI_API_KEY wrangler secret put ANTHROPIC_API_KEY wrangler secret put ALLOWED_ORIGIN # e.g. https://<user>.github.io/AI-CHATBOT - 部署:
wrangler deploy - 设置页面构建环境
VITE_API_BASE到您的Worker URL,例如:VITE_API_BASE=https://ai-chatbot-mcp-alt.<your-subdomain>.workers.dev # Use latest Worker hostname (avoid old Access-protected domain)
确保每个端点返回CORS标头:
Access-Control-Allow-Origin: <frontend origin>
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: GET, POST, OPTIONS
缺少飞行前或来源不匹配通常会产生通用浏览器 TypeError: Failed to fetch.
按键旋转和泄漏响应
人为错误处理改进
服务器现在对常见的Anthropic上游故障执行有限的自动恢复:
-
过载(HTTP 529/
overloaded_error)- 在放弃之前,最多可尝试3次增量回退(1s、2s、3s)。
- 返回JSON错误负载
classification: "overloaded"对于基本流端点,或者在工具感知模式下发出重试事件。 - 建议:等待几秒钟,然后重试;过载是暂时的。
-
未找到模型(HTTP 404/
not_found_error)- 在候选人列表中自动回退(
claude-3-5-sonnet(-latest),haiku,opus). - 如果所有回退都失败,则返回错误
classification: "not_found". - 措施:验证
ANTHROPIC_MODELenv或更新到当前可用的模型。
- 在候选人列表中自动回退(
-
一般性错误
- 其他非OK状态显示为
classification: "error". - 上游响应体的前400个字符用于上下文。
- 其他非OK状态显示为
工具感知流媒体(/anthropic/ai/chat-stream)现在发射结构化 error 消息字符串中包含分类标记的事件。客户端将这些标记映射到更友好的系统消息。
如果您在重试后仍看到重复的过载错误,请考虑降低并发性,使用较轻的模型(俳句),或添加一个断路器,在故障爆发后将新请求延迟约15秒。 如果提供者密钥被暴露:
- 立即生成新密钥(提供者仪表板)。
- 更新Worker/server机密并重新部署。
- 使旧密钥无效(删除/撤销)。
- 如果密钥已提交,则清除存储库历史记录(使用
git filter-repo). - 添加轻量级速率限制+日志记录,以检测滥用尖峰。
为了便于本地开发,您仍然可以使用 VITE_OPENAI_API_KEY 或 VITE_ANTHROPIC_API_KEY;把它们放在里面 .env.local (已经被忽视了)。生产构建应该省略这些,只依赖于由服务器端机密保护的代理端点。
安全检查列表
- 将所有提供程序API密钥排除在公共构建之外。
- 如果公开,则添加基本利率限制。
- 日志工具使用情况(
/logs/tools)并轮换原木。 - 考虑将会话状态移动到Redis/持久对象以进行水平扩展。
22.MCP服务器部署(当前方法)
该项目现在以使用JSON-RPC的Worker或外部MCP服务器为目标。之前的Express特定部署说明和静态工具回退已被删除。使用下面的Worker部署指南,或通过UI插入外部MCP服务器。
23.Cloudflare工作后端和动态外部MCP服务器(当前实施)
该项目已迁移,因此后端现在在Cloudflare Worker上运行(src/MCP/worker.ts)而不是Express服务器。工人提供:
| 功能 | 端点 | 注释 |
|---|---|---|
| OpenAI代理 | (已删除) | 端点已弃用,取而代之的是Anthropic+MCP工具 |
| 人类代理 | /anthropic/chat |
基本非流消息端点代理 |
| 人为天气演示 | /anthropic/ai/chat |
使用内部天气助手进行单次迭代工具调用 |
| 动态MCP服务器CRUD | /api/mcp/servers |
添加/列出/删除外部MCP服务器 |
| 列出服务器工具 | /api/mcp/servers/:id/tools |
执行MCP初始化+ tools/list 握手 |
| 调用工具 | /api/mcp/servers/:id/tool-call |
执行MCP tools/call 具有自动会话刷新功能 |
为什么会有这种变化?
最初的要求是:“用户必须能够连接MCP服务器”。用户界面现在允许任何用户添加任意外部MCP服务器(这些服务器在 <baseUrl>/mcp).Worker充当了一个轻量级的代理/握手协助器,因此浏览器不需要直接管理多个会话头(如果远程服务器缺乏许可源,则可以避免CORS问题)。
添加服务器(UI流)
- 打开应用程序(本地或已部署)-左侧边栏显示MCP服务器管理器。
- 输入外部MCP服务器的名称(标签)和基本URL(例如。
https://example-tools.workers.dev).不包括/mcp(Worker会自动附加它)。 - Worker存储服务器(如果配置了KV;否则在内存中回退)并尝试MCP
initialize握手以缓存asessionId. - 工具调用器面板自动获取
tools/list并为每个工具渲染按钮。
调用工具
- 单击工具名称——将从工具的输入模式或参数对象生成动态表单。
- 填写参数并单击“调用工具”。
- 工人呼唤
tools/call在外部服务器上,如果会话过期,则自动重新初始化会话,并返回结果。 - 结果作为附件附加到主聊天中
tool消息。
持久性
如果KV命名空间绑定 MCP_SERVERS 配置在 wrangler.toml,服务器定义在部署中保持不变。没有KV,服务器仅存储在内存中(在Worker冷重启时丢失)。添加到 wrangler.toml:
kv_namespaces = [
{ binding = "MCP_SERVERS", id = "<production_namespace_id>", preview_id = "<preview_namespace_id>" }
]
创建方式:
wrangler kv namespace create MCP_SERVERS
wrangler kv namespace create MCP_SERVERS --preview
然后将返回的ID复制到配置中。
安全和CORS
集 ALLOWED_ORIGIN 前端来源的秘密(逗号分隔的倍数列表)。强化CORS现在用403拒绝不允许的起源,而不是倒退:
wrangler secret put ALLOWED_ORIGIN
来自其他来源的请求将被拒绝,除非 * 明确包括在内。
员工开发和部署
已添加脚本:
npm run worker:dev # local dev (wrangler dev)
npm run worker:deploy # deploy to Cloudflare
部署前添加机密:
wrangler secret put ANTHROPIC_API_KEY
wrangler secret put ALLOWED_ORIGIN
外部MCP服务器要求
您的外部服务器必须在以下位置实现Streamable HTTP传输 /mcp 支持JSON-RPC方法:
initializetools/listtools/call
Worker会自动发送:
{
"jsonrpc": "2.0",
"id": "init-<timestamp>",
"method": "initialize",
"params": {
"clientInfo": { "name": "dynamic-client", "version": "1.0.0" },
"capabilities": { "tools": {} }
}
}
它缓存了 mcp-session-id 头球一旦失败,它就会重新运行 initialize.
局限性和未来工作
| 区域 | 当前 | 计划改进 |
|---|---|---|
| 流媒体工具响应 | 未实现(单次JSON-RPC往返) | 流媒体MCP服务器的SSE传递 |
| 对外部服务器进行身份验证 | 假设公共端点 | 允许每台服务器的身份验证标头/令牌 |
| 模式呈现 | 简单的文本输入 | 丰富的形式(类型、枚举、验证) |
| 会话持久性 | KV可选 | 持久对象,用于更强大的会话管理 |
| 聊天集成 | 工具输出作为单独的消息附加 | 内联工具调用推理链和多工具编排 |
从Express迁移
以前的Express服务器已被Worker取代。您可以删除任何部署引用 src/MCP/server.js 一旦对工人的行为感到满意:
npm run worker:deploy
# Update any VITE_API_BASE to Worker URL
故障排除
| 症状 | 可能原因 | 修复 |
|---|---|---|
| 添加服务器时“初始化失败” | 基URL错误(不应包括/mcp) | 提供没有尾随斜线的基;工人在内部附加/mcp |
| 工具列表为空 | 服务器未返回工具或握手失败 | 检查服务器日志;确认它是否实现 tools/list |
| 502工具调用 | 会话已过期&重新初始化也失败 | 重新添加服务器;检查远程MCP服务器运行状况 |
| CORS错误 | 缺少ALLOWED_ORIGIN机密或不匹配 | 设置正确的源并重新部署Worker |
这种动态MCP架构使用户能够插入任何兼容的工具服务器(类似于Claude Desktop自定义MCP服务器),而无需修改应用程序代码。仍受Cloudflare Access保护的旧Worker主机名必须替换为新的 ai-chatbot-mcp-alt 主机名(GitHub Pages工作流已更新)。
24.仅限工作人员模式(Express已弃用)
你要求运行这个项目 不使用Node.js/Express——仅使用Cloudflare Worker存储库现在与这一目标保持一致:
当前状态
src/MCP/worker.ts实现所有必需的后端功能。- 添加了OpenAI流媒体代理端点:
POST /openai/chat上海证券交易所 - 已存在人为终点:
/anthropic/chat,/anthropic/ai/chat,/anthropic/ai/chat-stream - 动态MCP服务器CRUD+工具调用:
/api/mcp/servers,/api/mcp/servers/:id/tools,/api/mcp/servers/:id/tool-call,加上启用/分配端点。 - 全球工具注册:
/admin/tools(发布/获取/删除) - CORS通过以下方式硬化
ALLOWED_ORIGIN秘密。 npm start现在运行Worker(wrangler dev).旧的Express脚本已弃用。
所需机密(部署前设置)
wrangler secret put ALLOWED_ORIGIN # e.g. https://<your-gh-username>.github.io/AI-CHATBOT
wrangler secret put ANTHROPIC_API_KEY # if you need Anthropic
wrangler secret put OPENAI_API_KEY # if you use OpenAI assistant
可选:
wrangler secret put ALLOWED_FETCH_DOMAINS # comma list for http_get (e.g. en.wikipedia.org,api.example.com)
wrangler secret put MAX_FETCH_BYTES # e.g. 30000
地方发展(仅限工人)
npm install
npm run worker:dev
# In another terminal
npm run dev # Vite frontend, ensure VITE_API_BASE points to worker (see below)
添加到 .env.local (或Pages构建环境):
VITE_API_BASE=http://127.0.0.1:8787
部署时,设置 VITE_API_BASE 到 *.workers.dev URL。
能力矩阵(工人)
| 特征 | 端点 | 注释 |
|---|---|---|
| OpenAI流媒体 | /openai/chat |
苏格兰和南方能源公司排放 { assistant_text } + done |
| 人为非流 | /anthropic/chat |
基本消息代理 |
| 拟人工具(单) | /anthropic/ai/chat |
一个工具周期+跟进 |
| 拟人工具流 | /anthropic/ai/chat-stream |
事件:模型使用、工具使用、工具结果、助手文本、完成 |
| MCP服务器CRUD | /api/mcp/servers |
KV持久性(如有限制) |
| 列出工具 | /api/mcp/servers/:id/tools |
自动(重新)初始化会话 |
| 调用工具 | /api/mcp/servers/:id/tool-call |
会话失败时重试一次 |
| 切换工具 | /api/mcp/servers/:id/enabled |
持久启用过滤器 |
| 每台服务器分配列表 | /api/mcp/servers/:id/allowlist |
域过滤与全局环境合并 |
| 注册全局工具 | /admin/tools (POST) |
提供invokeUrl;作为Anthropic编排工具出现 |
| 调试动态工具 | /anthropic/debug/tools |
检查组装好的工具方案 |
删除Express(可选清理)
您可以删除 src/MCP/server.js 以及任何未使用的依赖项(express、cors、dotenv)——它们已经没有列出在 package.json。如果您之前部署了Node后端,则可以将其关闭;只要确保 VITE_API_BASE 指向工人。
前端更新检查表
- 集
VITE_API_BASE=<worker_url>. - 确保浏览器请求转到
https://<worker>.workers.dev/.... - 确认网络面板显示200+SSE
/anthropic/ai/chat-stream和/openai/chat. - 对于URL摘要,请确保
ALLOWED_FETCH_DOMAINS包括目标域(例如。en.wikipedia.org).
验证仅限工作人员模式
| 测试 | 预期 |
|---|---|
| 提示“你好” | 来自的流式辅助文本事件 /anthropic/ai/chat-stream |
| 提示引用天气 | 工具使用+工具结果事件,然后进行摘要 |
| 提示维基百科URL | http_get工具调用,然后总结段落(没有原始HTML) |
| OpenAI助手(如果使用) | 通过流媒体 /openai/chat |
| 添加MCP服务器 | 出现在列表中;工具显示启用状态 |
普通工人的陷阱
| 症状 | 修复 |
|---|---|
501从 /openai/chat |
添加 OPENAI_API_KEY 秘密 |
| 501来自Anthropic端点 | 添加 ANTHROPIC_API_KEY 秘密 |
| CORS错误 | 设置 ALLOWED_ORIGIN 正确(无尾随斜线) |
| 工具调用502 | 远程MCP服务器关闭/基本URL无效 |
| 返回原始HTML | 将域添加到 ALLOWED_FETCH_DOMAINS;确保提示明确要求总结 |
下一步硬化步骤
- 通过耐用对象或KV计数器添加速率限制(每个IP)。
- 添加日志样本计数(避免完全提示保留)以实现可观察性。
- 为长时间运行的远程MCP工具调用实现流式传递。
- 引入取消(在客户端中止时关闭SSE流)。
您现在已与Node完全解耦;Worker是单个后端表面。