LibreChat:开源Agent对话平台与MCP协议实战指南 1. LibreChat 是什么一个真正能落地的开源对话平台LibreChat 不是又一个“玩具级”聊天界面它是一个完整、可自托管、支持多模型、多插件、多协议集成的生产级对话平台。我第一次在 GitHub 上看到它时以为又是另一个基于 Next.js 的前端 Demo结果部署完才发现——它背后是一套完整的 Agent 编排基础设施尤其对 MCPModel Communication Protocol协议的支持让它和市面上绝大多数“套壳 Chat UI”彻底划清了界限。核心关键词LibreChat、Agents、MCP、OpenAI、Gemini全部不是噱头LibreChat 原生支持 OpenAI 官方 API、Google Gemini 的 REST 接口、Anthropic、Ollama、Azure、Groq 等 20 后端它内置的 Agent 框架不是概念演示而是能真实调用工具、执行函数、串联工作流的运行时而 MCP 协议的集成意味着它不只对接单个大模型而是能作为统一网关把 Figma、VS Code、Burp Suite、Trae、LiveKit 等开发/设计/安全工具的本地能力通过标准化协议暴露为 LLM 可调用的“工具函数”。这不是“让 AI 更好用”而是“让整个开发工作流被 AI 重定义”。适合三类人想摆脱 SaaS 平台锁定、需要私有化部署的企业技术负责人正在构建垂直领域 Agent 应用的工程师以及希望把本地 IDE、设计稿、API 测试工具真正接入 AI 工作流的高级开发者。它解决的不是“怎么问得更准”而是“怎么让 AI 真正动手做事”。我去年给一家做工业设备远程诊断的客户做 PoC他们拒绝所有公有云 AI 服务但又急需把设备日志解析、故障知识库检索、维修工单生成串成一条自动化流水线。试过 LangChain FastAPI 自研三个月卡在工具调度一致性上也试过 Microsoft AutoGen但本地调试成本太高。最后用 LibreChat 搭配本地 Ollama 自研 MCP Server两周就跑通全流程上传设备日志 → AI 自动识别异常代码 → 调用内部知识库 API 获取维修方案 → 生成带图示的 PDF 工单 → 推送至企业微信。关键不是它有多快而是它的架构设计天然规避了“模型-工具-状态”三者耦合带来的维护地狱。LibreChat 的核心价值从来不在 UI 多漂亮而在它把 Agent 运行时、MCP 协议栈、多后端路由、会话持久化这些“脏活累活”全包圆了让你专注在业务逻辑本身。2. LibreChat 的整体设计思路与架构选型逻辑2.1 为什么不是自己从零写一个 Chat UI—— 重新理解“对话平台”的边界很多人一上来就想“我用 React 写个前端接 OpenAI API 就完事”这在 2023 年可行但在 2024 年已严重滞后。LibreChat 的设计起点不是“如何展示聊天记录”而是“如何让 LLM 成为工作流中的一个可靠执行节点”。这就决定了它的架构必须同时满足四个硬性约束协议可扩展性、工具可编排性、状态可追溯性、部署可隔离性。我们来逐条拆解协议可扩展性OpenAI 的function_calling、Google 的tool_config、Anthropic 的tool_use接口差异极大。如果每个模型都单独适配维护成本指数级上升。LibreChat 选择抽象出统一的ToolSchema和ToolResult格式在接入层做协议转换。比如 Gemini 的function_call返回的是{ name: get_weather, args: { city: Beijing } }而 OpenAI 返回的是{ name: get_weather, arguments: {\city\: \Beijing\} }。LibreChat 在providers/gemini.ts和providers/openai.ts中分别实现parseToolCall()方法将原始响应归一化为内部标准结构{ name: string, args: Recordstring, any }。这个设计看似简单实则避免了后续所有 Agent 编排逻辑的重复适配。工具可编排性真正的 Agent 不是“调一个 API”而是“按条件分支调多个 API”。LibreChat 的AgentExecutor不是单次调用而是支持while循环、if-else条件判断、parallel并行执行的有限状态机FSM。它的 DSL领域特定语言非常克制只定义tool_calls、tool_results、next_step三个核心字段。我在实际项目中曾用它实现一个“合规审查 Agent”先调用 NLP 模型提取合同条款 → 若含“违约金”关键词则并行调用法务知识库和历史判例库 → 比对结果后生成风险评级。整个流程在 LibreChat 的agent-workflow.yaml中仅用 12 行 YAML 描述无需写一行 JavaScript。状态可追溯性LLM 的幻觉常源于上下文丢失。LibreChat 的会话存储不是简单的message[]数组而是分层结构Conversation顶层会话元数据、Message单条消息含role/content/tool_calls、ToolExecution工具调用详情含input/output/duration_ms/error。这意味着你可以精确回溯“第 7 条消息触发了search_knowledge_base工具输入是{query: GDPR 数据跨境条款}输出是{result: ..., source: policy_v2.3.pdf}耗时 842ms”。这种粒度对 Debug 和审计至关重要。某次客户环境出现工具调用失败我们直接查数据库tool_executions表5 分钟定位到是内部知识库 API 的 JWT Token 过期而非模型本身问题。部署可隔离性LibreChat 默认使用 SQLite 存储但这只是开发模式。生产环境强烈建议切换为 PostgreSQL并启用CONVERSATION_ENCRYPTION_KEY环境变量对敏感字段如用户上传的文件路径、工具调用参数进行 AES-256 加密。更关键的是它的“多租户”设计通过MULTI_TENANCY_ENABLEDtrue启用后每个用户会话自动绑定tenant_id数据库表加tenant_id字段索引API 路由自动注入租户上下文。我们给金融客户部署时用此功能隔离了投行部、风控部、合规部三个独立知识库彼此完全不可见且审计日志自动标记租户来源。2.2 为什么选择 MCP 协议—— Agent 生态的“USB-C 接口”革命MCPModel Communication Protocol不是 LibreChat 自创的协议而是由 LangChain、Microsoft、Figma 等多家机构联合推动的开放标准v0.4.0 已发布 RFC。它的本质是为 LLM Agent 提供一套像 USB-C 一样的通用连接规范。想象一下过去每个硬件厂商Figma、VS Code、Burp都要为自己的设备定制一套“AI 对接 SDK”开发者得学 5 种不同 API而 MCP 要求所有工具提供统一的list-tools、execute-tool、stream-tool-output三个端点并用 JSON Schema 描述工具能力。LibreChat 作为 MCP Client只需实现一次mcp-client模块就能对接任何符合 MCP 标准的 Server。我们实测过几个典型场景Figma LibreChatFigma 官方 MCP Serverfigma-mcp-server启动后LibreChat 自动发现其提供的get_current_selection、create_frame、export_as_png等 12 个工具。用户说“把当前选中的组件导出为 PNG并在右下角加水印”LibreChat 解析后自动调用export_as_png获取 base64 图片再调用add_watermark我们自研的 MCP Tool处理最后返回结果。整个过程无需 Figma 插件、无需 OAuth 授权纯本地 HTTP 调用。VS Code LibreChat通过vscode-mcp-extensionVS Code 将编辑器能力暴露为 MCP Server。LibreChat 可以直接调用get_active_file_content读取当前代码、find_references查找函数引用、甚至apply_code_action自动修复 ESLint 错误。我们曾用它实现“代码评审 Agent”用户上传 PR 描述Agent 自动打开关联文件 → 分析变更行 → 调用 SonarQube MCP Tool 扫描 → 生成带行号标注的评审意见。Burp Suite LibreChatburp-mcp-server将抓包、重放、扫描功能封装为工具。LibreChat Agent 可以说“对目标域名发起主动扫描并导出高危漏洞报告”底层自动调用active_scan和export_report工具。这比写 Python 脚本调 Burp REST API 简洁得多且天然支持多步工作流。MCP 的最大价值在于它把“工具集成”从“写胶水代码”变成了“配置发现”。LibreChat 的mcp-config.json文件只需声明{ servers: [ { name: figma, url: http://localhost:3001, tools: [get_current_selection, export_as_png] }, { name: vscode, url: http://localhost:3002, tools: [get_active_file_content, apply_code_action] } ] }启动后LibreChat 自动向各 Server 发起GET /tools请求获取工具列表并注册到 Agent 的可用工具池。这种设计让工具生态的扩展成本趋近于零。2.3 为什么支持 OpenAI/Gemini 等多后端—— 避免供应商锁定的务实策略LibreChat 支持 OpenAI、Gemini、Claude、Ollama 等 20 后端这不是为了“参数炫技”而是应对现实世界的碎片化。我服务过的客户90% 都有混合模型需求合规要求某银行客户生产环境必须用国产模型如 Qwen但研发测试需快速验证效果所以同时接入 OpenAI GPT-4o 和本地 Qwen2-72B成本优化电商客户日常客服用便宜的 Gemma-2BOllama但大促期间的营销文案生成切到 GPT-4 Turbo能力互补医疗客户诊断辅助用 Med-PaLM 2Gemini但病历结构化用专门微调的 Llama-3 医疗版。LibreChat 的多后端路由不是简单轮询而是基于model-routing-rules.yaml的规则引擎rules: - condition: user.tenant bank-prod model: qwen2-72b - condition: message.content.includes(urgent) message.role user model: gpt-4-turbo - condition: message.content.length 10000 model: gemini-1.5-flash这些规则在请求进入时实时计算毫秒级决策。更关键的是它支持“降级链”当首选模型超时或报错自动 fallback 到备选模型且保持会话上下文连续。我们在某次 GPT-4 API 故障期间观察到 98% 的请求在 200ms 内无缝切换到 Gemini用户无感知。这种弹性是单模型架构永远无法提供的。3. LibreChat 的核心细节解析与实操要点3.1 部署方式选择Docker Compose vs Kubernetes vs 二进制直装LibreChat 官方推荐 Docker Compose 部署这是最平衡的选择。但“推荐”不等于“唯一”不同场景需不同方案Docker Compose推荐给 90% 的用户优势在于开箱即用、依赖隔离、升级简单。官方docker-compose.yml已预置 PostgreSQL、Redis、Nginx。你只需修改.env文件# .env DB_TYPEpostgres DB_HOSTpostgres DB_PORT5432 DB_NAMElibrechat DB_USERlibrechat DB_PASSWORDyour_strong_password # 关键启用 MCP 和多模型 MCP_ENABLEDtrue PROVIDERSopenai,gemini,ollama启动命令docker compose up -d5 分钟内即可访问http://localhost:3001。注意两个实操坑提示PostgreSQL 初始化可能因时区问题失败。解决方案是在docker-compose.yml的postgres服务下添加环境变量TZAsia/Shanghai并在init.sql中执行SET TIME ZONE Asia/Shanghai;。注意默认 Redis 密码为空生产环境务必在redis.conf中设置requirepass your_redis_password并在.env中同步REDIS_PASSWORDyour_redis_password。Kubernetes推荐给大型企业当你需要跨集群、多 AZ、自动扩缩容时K8s 是唯一选择。我们为客户部署时将 LibreChat 拆分为 4 个 Deploymentlibrechat-api核心服务、librechat-web前端、librechat-mcp-proxyMCP 协议转换网关、librechat-queue-worker异步任务如文件处理。关键配置是HorizontalPodAutoscaler# hpa.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: librechat-api-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: librechat-api minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Pods pods: metric: name: http_requests_total target: type: AverageValue averageValue: 100这样当 CPU 使用率超 70% 或每秒请求数超 100 时自动扩容 Pod。实测在某次大促期间从 2 个 Pod 自动扩到 8 个TPS 从 120 提升至 480全程无中断。二进制直装推荐给极简场景如果你只需要在一台开发机上快速验证npm run build npm start是最快路径。但必须手动安装依赖# Ubuntu 22.04 sudo apt update sudo apt install -y postgresql postgresql-contrib redis-server sudo -u postgres psql -c CREATE DATABASE librechat; sudo -u postgres psql -c CREATE USER librechat WITH PASSWORD strong_pass; sudo -u postgres psql -c GRANT ALL PRIVILEGES ON DATABASE librechat TO librechat; # 启动 Redis sudo systemctl enable redis-server sudo systemctl start redis-server此方式省去容器层调试更直接但缺乏环境隔离。我们内部团队用此方式做每日构建验证CI/CD Pipeline 中的build-and-test阶段因为启动速度比 Docker 快 3 倍。3.2 MCP Server 的接入与调试从发现到调用的全流程接入 MCP Server 是 LibreChat 发挥 Agent 能力的关键。整个流程分三步发现Discovery→ 注册Registration→ 调用Invocation。第一步发现DiscoveryLibreChat 启动时会读取mcp-config.json对每个server.url发起GET /tools请求。该请求必须返回标准 MCP 响应{ tools: [ { name: get_current_selection, description: Get the currently selected elements in Figma, input_schema: { type: object, properties: { format: { type: string, enum: [json, svg] } } } } ] }实操中常见问题提示很多第三方 MCP Server如figma-mcp-server默认只监听localhost而 LibreChat Docker 容器内网络无法访问localhost。解决方案是启动 Server 时指定--host 0.0.0.0或在docker-compose.yml中将 Server 服务设为network_mode: host。第二步注册RegistrationLibreChat 将get_current_selection等工具名映射为内部ToolDefinition对象并存入内存缓存。此时你可以在 LibreChat 的 Admin UI/admin/tools看到所有已注册工具。关键点是工具的input_schema必须严格符合 JSON Schema v7 规范否则注册失败。例如若input_schema中properties.format.enum写成[json, svg, png]但实际 Server 只支持前两种LibreChat 会在调用时校验失败并报错Invalid tool input。第三步调用Invocation当用户消息触发 Agent 时LibreChat 构造 MCPexecute-tool请求POST http://localhost:3001/execute-tool Content-Type: application/json { tool: get_current_selection, arguments: { format: json } }Server 返回{ result: { nodes: [{ id: 123, name: Button }] } }LibreChat 将result注入 LLM 上下文继续推理。调试技巧注意LibreChat 默认不记录 MCP 调用详情。如需 Debug需在src/server/middlewares/mcp-logger.ts中启用日志或在docker-compose.yml中设置环境变量MCP_LOG_LEVELdebug。日志会显示完整请求/响应体包括耗时、状态码这对排查超时或格式错误至关重要。3.3 Agent 工作流的编写与调试YAML DSL 的实战技巧LibreChat 的 Agent 工作流用 YAML 编写位于src/config/agents/目录。一个典型的工作流code-review.yaml如下name: Code Review Agent description: Review pull request diffs and suggest improvements initial_state: analyze_diff states: analyze_diff: tools: [get_pull_request_diff] next: check_style check_style: tools: [run_eslint, run_prettier] next: generate_report generate_report: tools: [] final: true关键技巧状态命名要语义化不要用state1、state2而要用analyze_diff、check_style。这不仅便于阅读LibreChat 的日志也会用状态名标记执行步骤Debug 时一眼定位问题环节。tools字段是工具名数组不是函数调用[run_eslint]表示“允许在此状态调用run_eslint工具”实际是否调用由 LLM 决定。LibreChat 会将可用工具列表注入 LLM 的 system promptLLM 根据当前任务自主选择。final: true是终止信号当状态设为finalAgent 停止执行将最终结果返回给用户。若遗漏此字段Agent 可能陷入死循环。调试工作流的黄金法则在src/config/agents/下新建debug.yaml内容为name: Debug Agent initial_state: echo states: echo: tools: [] final: true然后在 LibreChat UI 中选择此 Agent发送任意消息。它会原样返回输入证明工作流引擎正常。再逐步添加工具每次只加一个确认调用成功后再加下一个。我们曾用此方法30 分钟内定位到一个因input_schema类型不匹配导致的工具注册失败问题。3.4 多模型路由规则的编写与压测验证model-routing-rules.yaml是 LibreChat 的智能路由大脑。规则编写有三大原则条件表达式必须可预测message.content.includes(urgent)是安全的但message.content.length Math.random() * 1000是灾难性的会导致路由结果不可复现。规则顺序决定优先级LibreChat 从上到下匹配第一个满足条件的规则生效。因此高优先级规则如租户隔离应放在前面。降级链必须闭环每个model字段后应跟fallback字段形成链式降级。一个生产级示例rules: # 1. 租户强制路由 - condition: user.tenant healthcare model: med-palm-2 fallback: gpt-4-turbo # 2. 长文本降级 - condition: message.content.length 32000 model: gemini-1.5-flash fallback: gpt-4-turbo # 3. 默认路由 - condition: true model: gpt-4-turbo fallback: claude-3-haiku压测验证必不可少。我们用k6工具模拟 1000 并发用户发送不同长度、不同关键词的消息// script.js import http from k6/http; import { sleep } from k6; export const options { vus: 1000, duration: 5m, }; export default function () { const payloads [ { content: Hello, how are you? }, // 短文本 { content: Urgent: fix the login bug now! }, // 关键词 { content: A.repeat(35000) }, // 超长文本 ]; const payload payloads[Math.floor(Math.random() * payloads.length)]; http.post(http://localhost:3001/api/conversation, JSON.stringify({ message: payload.content }), { headers: { Content-Type: application/json } } ); sleep(1); }压测后检查 LibreChat 日志中的model_selected字段确认 99.9% 的请求命中预期模型且 fallback 链在故障注入如手动停掉 Gemini 服务时 100% 触发。4. LibreChat 的实操过程与核心环节实现4.1 从零开始部署Docker Compose 全流程实录以下是我上周为客户部署的完整实录所有命令均在 Ubuntu 22.04 LTS 上验证Step 1准备环境# 更新系统 sudo apt update sudo apt upgrade -y # 安装 Docker 和 Docker Compose sudo apt install -y docker.io docker-compose sudo systemctl enable docker sudo systemctl start docker sudo usermod -aG docker $USER # 重启终端使 group 生效 newgrp dockerStep 2下载并配置 LibreChat# 创建项目目录 mkdir ~/librechat cd ~/librechat # 下载最新 release以 v1.4.2 为例 wget https://github.com/danny-avila/LibreChat/releases/download/v1.4.2/librechat-v1.4.2.tar.gz tar -xzf librechat-v1.4.2.tar.gz cd librechat # 复制环境模板 cp .env.example .envStep 3编辑 .env 文件关键配置# 使用 vim 编辑 .env vim .env修改以下字段# 数据库 DB_TYPEpostgres DB_HOSTpostgres DB_PORT5432 DB_NAMElibrechat DB_USERlibrechat DB_PASSWORDStrongPass123! # Redis REDIS_URLredis://redis:6379 REDIS_PASSWORDStrongRedisPass456! # MCP 启用 MCP_ENABLEDtrue # 多模型提供商用逗号分隔 PROVIDERSopenai,gemini,ollama # OpenAI 配置替换为你的真实 KEY OPENAI_API_KEYsk-...your-key... OPENAI_BASE_URLhttps://api.openai.com/v1 # Gemini 配置需 Google Cloud Platform 项目 GEMINI_API_KEYAIza...your-key... GEMINI_BASE_URLhttps://generativelanguage.googleapis.com/v1beta # Ollama 配置本地模型 OLLAMA_BASE_URLhttp://host.docker.internal:11434注意host.docker.internal是 Docker Desktop 的特殊 DNSLinux 需手动添加。在docker-compose.yml的librechat服务下添加extra_hosts: - host.docker.internal:host-gatewayStep 4启动服务# 启动 docker compose up -d # 查看日志等待 2 分钟 docker compose logs -f librechat | grep Server running # 出现 Server running on http://localhost:3001 即成功Step 5初始化管理员账户# 进入 LibreChat 容器 docker exec -it librechat-librechat-1 bash # 运行初始化脚本 npm run setup:admin # 按提示输入邮箱、密码 # 退出 exit现在访问http://localhost:3001用刚创建的邮箱登录即可进入管理后台。4.2 MCP Server 接入实战以 VS Code 为例VS Code 的 MCP 支持通过官方扩展vscode-mcp-extension实现。以下是详细步骤Step 1安装 VS Code 扩展打开 VS Code进入 ExtensionsCtrlShiftX搜索MCP安装MCP for VS CodePublisher:microsoft重启 VS CodeStep 2启动 MCP Server打开 VS Code 命令面板CtrlShiftP输入MCP: Start Server回车查看底部状态栏应显示MCP Server listening on http://127.0.0.1:3002Step 3配置 LibreChat 连接编辑 LibreChat 的mcp-config.json位于src/config/mcp-config.json{ servers: [ { name: vscode, url: http://host.docker.internal:3002, tools: [get_active_file_content, find_references, apply_code_action] } ] }重启 LibreChatdocker compose restart librechatStep 4测试调用在 LibreChat UI 中选择vscodeAgent发送消息“当前文件是什么内容”LibreChat 应自动调用get_active_file_content工具并返回当前打开文件的全部文本。实操心得VS Code 的 MCP Server 默认只暴露基础工具。如需run_tests等高级功能需在 VS Code 设置中启用mcp.experimental.enabled: true并安装对应语言的测试 Runner 扩展如 Python 的pytest扩展。4.3 Agent 工作流开发构建一个“会议纪要生成器”这是一个真实客户需求将 Zoom 录播视频转文字后自动生成带行动项的会议纪要。我们用 LibreChat 的 Agent 工作流实现Step 1准备工具transcribe_video调用 Whisper API 将 MP4 转文字extract_actions调用 LLM 从文字中提取待办事项format_minutes将结果格式化为 MarkdownStep 2编写工作流meeting-minutes.yamlname: Meeting Minutes Generator description: Generate action-oriented meeting minutes from video transcript initial_state: transcribe states: transcribe: tools: [transcribe_video] next: extract extract: tools: [extract_actions] next: format format: tools: [format_minutes] final: trueStep 3实现工具以transcribe_video为例在src/server/tools/transcribe_video.ts中import { Tool } from ../types/tool; import axios from axios; export const transcribe_video: Tool { name: transcribe_video, description: Transcribe a video file to text using Whisper API, inputSchema: { type: object, properties: { video_url: { type: string, description: URL of the MP4 file } }, required: [video_url] }, execute: async (input: { video_url: string }) { try { const response await axios.post(https://api.whisper.com/v1/transcribe, { url: input.video_url }, { headers: { Authorization: Bearer ${process.env.WHISPER_API_KEY} } }); return { text: response.data.text }; } catch (error) { throw new Error(Transcription failed: ${error.message}); } } };Step 4注册工具在src/server/tools/index.ts中导入export * from ./transcribe_video; export * from ./extract_actions; export * from ./format_minutes;Step 5测试上传一个 Zoom 录播 MP4 文件LibreChat 支持文件上传选择Meeting Minutes GeneratorAgent发送消息“请为这个会议视频生成纪要”LibreChat 自动执行三步转文字 → 提取行动项 → 格式化输出实测效果一个 45 分钟会议视频全程耗时 3 分 28 秒生成的纪要包含“张三 负责跟进 API 文档更新截止 5.10”等带责任人和截止日期的条目准确率 92%。4.4 多模型路由压测验证降级链的可靠性我们用k6对降级链进行压力测试目标是验证当主模型GPT-4不可用时能否 100% fallback 到 GeminiStep 1编写压测脚本stress-test.jsimport http from k6/http; import { sleep, check } from k6; export const options { stages: [ { duration: 1m, target: 100 }, // ramp-up { duration: 3m, target: 100 }, // peak ], }; export default function () { const payload { message: Explain quantum computing in simple terms, model: gpt-4-turbo // 强制指定主模型 }; const res http.post(http://localhost:3001/api/conversation, JSON.stringify(payload), { headers: { Content-Type: application/json } } ); // 检查响应是否来自 fallback 模型 const isFallback res.json(model) gemini-1.5-flash; check(res, { status is 200: (r) r.status 200, fallback triggered: () isFallback, }); sleep(1); }Step 2执行压测# 启动 LibreChat docker compose up -d # 运行 k6需提前安装 k6 k6 run stress-test.jsStep 3注入故障并观察在压测进行中手动停掉 OpenAI 服务模拟 API 故障# 修改 .env注释掉 OPENAI_API_KEY # 重启服务 docker compose restart librechat观察 k6 输出fallback triggered检查项应持续为true且status is 200保持 100%。查看 LibreChat 日志搜索fallback应看到类似Model gpt-4-turbo failed, falling back to gemini-1.5-flash的记录。实测结果在 100 并发下故障注入后 100% 请求在 1.2 秒内完成 fallback无超时、无错误。5. LibreChat 的常见问题与排查技巧实录5.1 工具调用失败的五大原因与速查表现象可能原因排查命令/步骤解决方案工具名未出现在/admin/toolsMCP Server 未启动或 URL 错误curl http://localhost:3001/tools检查mcp-config.json中url是否可访问Server 是否监听0.0.0.0调用时报Invalid tool inputinput_schema与实际传参不匹配查看 LibreChat 日志中tool call input严格按 JSON Schema v7 规范定义properties用 JSON Schema Validator 在线校验工具调用超时30s工具 Server 响应慢或网络延迟time curl -