agent-kit
AgentKit 是一款基于 TypeScript 构建的开源框架,旨在帮助开发者轻松创建由多个智能体(Agent)协作组成的复杂网络。它主要解决了多智能体系统中路由逻辑难以控制、工具集成繁琐以及状态管理混乱等痛点,让智能体之间的协作更加确定且灵活。
这款工具特别适合熟悉 TypeScript 的 AI 应用开发者使用。其核心亮点在于引入了“确定性路由”机制,允许通过代码或大模型(如 ReAct 模式)精确控制智能体的流转逻辑;同时深度集成了 MCP(模型上下文协议),能够无缝连接丰富的外部工具和服务。此外,AgentKit 内置了完整的状态机和追踪系统,结合 Inngest 编排引擎,不仅支持本地调试,还能确保应用在云端部署时具备容错能力,大幅降低了构建高可靠性多智能体应用的门槛。
使用场景
某 SaaS 初创团队需要构建一个能自动查询 Neon 数据库并回答用户账单问题的智能客服系统。
没有 agent-kit 时
- 路由逻辑脆弱:开发者需手动编写复杂的
if-else代码来判断何时调用数据库、何时直接回复,一旦流程变动极易出错且难以维护。 - 工具集成繁琐:接入外部 MCP 服务(如数据库接口)需要重复造轮子编写底层通信协议,缺乏统一标准,调试困难。
- 状态管理混乱:多轮对话中的上下文和中间数据(如查询结果)依赖全局变量或临时存储,类型不安全,容易导致数据丢失或错乱。
- 故障恢复缺失:若云端部署时遇到网络波动或 API 超时,任务直接失败,缺乏内置的重试机制和持久化队列保障。
- 可观测性差:无法直观追踪 Agent 的决策路径和工具调用细节,排查问题如同“黑盒”操作,效率极低。
使用 agent-kit 后
- 确定性路由编排:利用 Typed State Machine 定义清晰的状态流转,代码即逻辑,确保 Agent 在“查询”与“回答”间精准切换,无需手写复杂判断。
- 原生 MCP 支持:通过简单配置即可接入 Smithery 上的 Neon 数据库 MCP 服务,像调用本地函数一样使用远程工具,开发效率倍增。
- 类型安全的状态共享:Network 层面的共享状态自动结合对话历史,全程 TypeScript 类型提示,彻底杜绝运行时数据错误。
- 云原生容错能力:结合 Inngest 引擎,自动处理重试、延迟执行和断点续传,即使部署在云端也能保证任务最终成功交付。
- 全链路可视化追踪:内置 Tracing 功能让开发者在本地或云端实时查看每一步推理和工具调用,快速定位并优化瓶颈。
agent-kit 将原本碎片化、易出错的代理开发流程,转变为类型安全、可观测且具备工业级可靠性的标准化网络构建体验。
运行环境要求
- 未说明
未说明
未说明

快速开始
AgentKit
通过 MCP 构建具有确定性路由和丰富工具链的多智能体网络。

AgentKit 提供更确定、更灵活的路由,兼容多家模型提供商,拥抱 MCP(以实现丰富的工具支持),并支持不断壮大、充满活力的 TypeScript AI 开发者社区。结合 Inngest 开发服务器,您可以在本地快速启动项目,并利用其编排引擎使您的智能体在部署到云端时具备容错能力。
核心概念
- 智能体:可与提示词、工具以及 MCP 结合使用的 LLM 调用。
- 网络:一种让智能体通过共享状态协作的简单方式,包括任务交接。
- 状态:将对话历史与完全类型化的状态机相结合,用于路由决策。
- 路由器:自主性的核心所在,从基于代码的编排到基于 LLM 的编排(例如 ReAct)。
- 追踪:借助内置追踪功能,在本地和云端调试与优化工作流。
快速入门
npm i @inngest/agent-kit inngest
注意:自 AgentKit v0.9.0 起,您需要将 inngest 作为独立依赖项与 @inngest/agent-kit 一同安装。这样做可以确保运行时兼容性,并避免多个包依赖不同版本的 Inngest 时产生冲突。
MCP 智能体示例
在 Smithery 上选择您喜爱的 MCP 服务器(或自行托管一个),即可使用 MCP 作为工具构建 AgentKit 智能体。以下是一个使用 Neon 数据库 MCP 服务器 的示例:
import {
anthropic,
createAgent,
createNetwork,
createTool,
} from "@inngest/agent-kit";
import { createServer } from "@inngest/agent-kit/server";
import { createSmitheryUrl } from "@smithery/sdk/config.js";
import { z } from "zod";
const neonServerUrl = createSmitheryUrl(
"https://server.smithery.ai/neon/mcp?profile=bored-catshark-da8hf&api_key=123123123"
);
const neonAgent = createAgent({
name: "neon-agent",
system: `你是一位帮助管理 Neon 账户的助手。
重要提示:问题解答完毕后,请调用 'done' 工具。
`,
tools: [
createTool({
name: "done",
description: "当任务完成后调用此工具。",
parameters: z.object({
answer: z.string().describe("用户问题的答案。"),
}),
handler: async ({ answer }, { network }) => {
network?.state.kv.set("answer", answer);
},
}),
],
mcpServers: [
{
name: "neon",
transport: {
type: "streamable-http",
url: neonServerUrl.toString(),
},
},
],
});
const neonAgentNetwork = createNetwork({
name: "neon-agent",
agents: [neonAgent],
defaultModel: anthropic({
model: "claude-3-5-sonnet-20240620",
defaultParameters: {
max_tokens: 1000,
},
}),
router: ({ network }) => {
if (!network?.state.kv.get("answer")) {
return neonAgent;
}
return;
},
});
// 创建并启动服务器
const server = createServer({
networks: [neonAgentNetwork],
});
server.listen(3010, () =>
console.log("Support Agent 示例服务器正在端口 3010 运行")
);
您可以通过以下链接在本地运行此示例:https://github.com/inngest/agent-kit/tree/main/examples/mcp-neon-agent#readme
更多示例请参见下文。
基于状态的确定性路由
AgentKit 提供了一种独特的基于状态的确定性路由方法,能够在全程可控的前提下实现从基于代码的路由到完全自主路由的过渡。
状态是同一网络中所有智能体之间存储和共享的关键值。
该状态可被路由器、智能体生命周期回调、智能体提示词以及智能体工具访问:
flowchart LR
subgraph 网络
state["状态"]
subgraph 智能体
systemp["系统提示词"]
tools["工具"]
lifecycle["生命周期回调"]
end
router["路由器"]
end
state-->systemp
state<-->tools
state<-->lifecycle
state<-->router
双向箭头表示读写访问权限,而单向箭头则表示只读访问权限。
这种共享状态与网络的消息历史相结合,构成了 AgentKit 确定性基于状态路由的基础。
基于代码的路由
我们建议从基于代码的路由开始,它能让你对网络的执行流程拥有完全的控制权。
这种路由模式是最具确定性的。通过提供一个能够访问状态和历史记录的路由函数,你可以实现一种智能体式的路由机制,该机制会根据智能体工具所执行的状态更新做出响应。
以下是一个编码智能体的例子,它使用基于代码的路由器,根据 codeAssistantAgent 生成的计划来编排网络中的各个智能体:
import { z } from "zod";
import {
anthropic,
createAgent,
createNetwork,
createTool,
} from "@inngest/agent-kit";
import { readFileSync } from "fs";
import { join } from "path";
// 创建一个共享工具
const saveSuggestions = createTool({
name: "save_suggestions",
description: "将其他智能体提出的建议保存到状态中",
parameters: z.object({
suggestions: z.array(z.string()),
}),
handler: async (input, { network }) => {
const suggestions = network?.state.kv.get("suggestions") || [];
network?.state.kv.set("suggestions", [
...suggestions,
...input.suggestions,
]);
return "建议已保存!";
},
});
// 创建可使用 `saveSuggestions` 工具访问状态的智能体
const documentationAgent = createAgent({
name: "documentation_agent",
system: "你是一位代码文档生成专家",
tools: [saveSuggestions],
});
const analysisAgent = createAgent({
name: "analysis_agent",
system: "你是一位代码分析和改进建议专家",
tools: [saveSuggestions],
});
const summarizationAgent = createAgent({
name: "summarization_agent",
system: ({ network }) => {
const suggestions = network?.state.kv.get("suggestions") || [];
return `请保存以下建议的摘要:
${suggestions.join("\n")}`;
},
tools: [
createTool({
name: "save_summary",
description:
"将其他智能体提出的建议摘要保存到状态中",
parameters: z.object({
summary: z.string(),
}),
handler: async (input, { network }) => {
network?.state.kv.set("summary", input.summary);
return "已保存!";
},
}),
],
});
// 创建生成计划的代码助手智能体
const codeAssistantAgent = createAgent({
name: "code_assistant_agent",
system: ({ network }) => {
const agents = Array.from(network?.agents.values() || [])
.filter(
(agent) =>
!["code_assistant_agent", "summarization_agent"].includes(agent.name)
)
.map((agent) => `${agent.name} (${agent.system})`);
return `根据用户请求,仅执行以下工具调用:
- 读取文件内容
- 根据以下列表生成要运行的智能体计划:${agents.join(", ")}
完成后回答“完成”。`;
},
tools: [
createTool({
name: "read_file",
description: "读取当前目录下的文件",
parameters: z.object({
filename: z.string(),
}),
handler: async (input, { network }) => {
const filePath = join(process.cwd(), `files/${input.filename}`);
const code = readFileSync(filePath, "utf-8");
network?.state.kv.set("code", code);
return "文件已读取!";
},
}),
createTool({
name: "generate_plan",
description: "生成要运行的智能体计划",
parameters: z.object({
plan: z.array(z.string()),
}),
handler: async (input, { network }) => {
network?.state.kv.set("plan", input.plan);
return "计划已生成!";
},
}),
],
});
const network = createNetwork({
name: "code-assistant-v2",
agents: [
codeAssistantAgent,
documentationAgent,
analysisAgent,
summarizationAgent,
],
// 我们的路由函数依赖共享状态来编排智能体
// 首先调用 codeAssistantAgent,然后逐步执行其计划,
// 直到摘要被写入状态。
router: ({ network }) => {
if (!network?.state.kv.has("code") || !network?.state.kv.has("plan")) {
return codeAssistantAgent;
} else {
const plan = (network?.state.kv.get("plan") || []) as string[];
const nextAgent = plan.pop();
if (nextAgent) {
network?.state.kv.set("plan", plan);
return network?.agents.get(nextAgent);
} else if (!network?.state.kv.has("summary")) {
return summarizationAgent;
} else {
return undefined;
}
}
},
defaultModel: anthropic({
model: "claude-3-5-sonnet-latest",
defaultParameters: {
max_tokens: 4096,
},
}),
});
源代码可在以下链接查看:https://github.com/inngest/agent-kit/blob/main/examples/code-assistant-agentic/src/index.ts
基于代理的路由
基于代理的路由用一个代理来替代传统的路由功能。这使得您的代理网络能够自主选择要执行的代理,并决定任务何时完成。
路由代理配备了一个 onRoute 生命周期回调,它沿用了基于代码的路由方法。这个生命周期回调是您掌控代理路由决策的入口。
下面的示例展示了一个支持代理,它使用路由代理作为“主管”:
import {
anthropic,
createAgent,
createNetwork,
createRoutingAgent,
createTool,
} from "@inngest/agent-kit";
import { z } from "zod";
import { isLastMessageOfType, lastResult } from "./utils.js";
import { knowledgeBaseDB, releaseNotesDB, ticketsDB } from "./databases.js";
// 创建共享工具
const searchKnowledgeBase = createTool({
name: "search_knowledge_base",
description: "在知识库中搜索相关文章",
parameters: z.object({
query: z.string().describe("搜索查询"),
}),
handler: async ({ query }, { step }) => {
return await step?.run("search_knowledge_base", async () => {
// 模拟知识库搜索
const results = knowledgeBaseDB.filter(
(article) =>
article.title.toLowerCase().includes(query.toLowerCase()) ||
article.content.toLowerCase().includes(query.toLowerCase())
);
return results;
});
},
});
const searchLatestReleaseNotes = createTool({
name: "search_latest_release_notes",
description: "在最新发布说明中搜索相关文章",
parameters: z.object({
query: z.string().describe("搜索查询"),
}),
handler: async ({ query }, { step }) => {
return await step?.run("search_latest_release_notes", async () => {
// 模拟知识库搜索
const results = releaseNotesDB.filter(
(releaseNote) =>
releaseNote.title.toLowerCase().includes(query.toLowerCase()) ||
releaseNote.content.toLowerCase().includes(query.toLowerCase())
);
return results;
});
},
});
const getTicketDetails = async (ticketId: string) => {
const ticket = ticketsDB.find((t) => t.id === ticketId);
return ticket || { error: "工单未找到" };
};
// 创建我们的代理
const customerSupportAgent = createAgent({
name: "客户支持",
description:
"我是一名客户支持代理,帮助客户解答疑问。",
system: `你是一位乐于助人的客户支持代理。
你的目标是协助客户解决他们的问题和疑虑。
请以专业、礼貌和详尽的方式回复。`,
model: anthropic({
model: "claude-3-5-haiku-latest",
defaultParameters: {
max_tokens: 1000,
},
}),
tools: [
searchKnowledgeBase,
createTool({
name: "update_ticket",
description: "更新工单备注",
parameters: z.object({
ticketId: z.string().describe("要更新的工单ID"),
priority: z.string().describe("工单优先级"),
status: z.string().describe("工单状态"),
note: z.string().describe("要添加到工单的备注"),
}),
handler: async ({ ticketId, priority, status, note }, { step }) => {
return await step?.run("update_ticket", async () => {
// TODO: 更新数据库中的工单
return { message: "工单更新成功" };
});
},
}),
],
});
const technicalSupportAgent = createAgent({
name: "技术支持",
description: "我是一名技术支持代理,负责处理紧急工单。",
system: `你是一位技术支持专家。
你的目标是帮助解决紧急工单。
运用你的专业知识诊断问题并提出解决方案。`,
model: anthropic({
model: "claude-3-5-haiku-latest",
defaultParameters: {
max_tokens: 1000,
},
}),
tools: [searchLatestReleaseNotes],
});
// 创建我们的路由代理,用于编排代理网络
// 并评估是否已回答支持请求。
const supervisorRoutingAgent = createRoutingAgent({
name: "主管",
description: "我是一名支持主管。",
system: `你是一位主管。
你的目标是回答客户的初始请求,或者在无法提供答案时升级工单。
请根据以下指示将工单路由到合适的代理:
- 紧急工单应路由到“技术支持”代理。
- 更新工单或处理非紧急工单等操作应路由到“客户支持”代理。
请逐步思考并理性做出决策。
当某个代理已经回答了工单的初始请求或更新了工单时,请调用“done”工具。`,
model: anthropic({
model: "claude-3-5-haiku-latest",
defaultParameters: {
max_tokens: 1000,
},
}),
tools: [
createTool({
name: "done",
description: "在工单解决或升级时调用此工具",
handler: async () => {},
}),
createTool({
name: "route_to_agent",
description: "将工单路由到合适的代理",
parameters: z.object({
agent: z.string().describe("要路由到的代理名称"),
}),
handler: async ({ agent }) => {
return agent;
},
}),
],
lifecycle: {
onRoute: ({ result, network }) => {
const lastMessage = lastResult(network?.state.results);
// 如果之前调用了工具,确保返回到上一个执行的代理
if (lastMessage && isLastMessageOfType(lastMessage, "tool_call")) {
return [lastMessage?.agent.name];
}
const tool = result.toolCalls[0];
if (!tool) {
return;
}
const toolName = tool.tool.name;
if (toolName === "done") {
return;
} else if (toolName === "route_to_agent") {
if (
typeof tool.content === "object" &&
tool.content !== null &&
"data" in tool.content &&
typeof tool.content.data === "string"
) {
return [tool.content.data];
}
}
return;
},
},
});
// 创建包含路由代理的支持网络
const supportNetwork = createNetwork({
name: "支持网络",
agents: [customerSupportAgent, technicalSupportAgent],
defaultModel: anthropic({
model: "claude-3-5-haiku-latest",
defaultParameters: {
max_tokens: 1000,
},
}),
router: supervisorRoutingAgent,
});
您可以在本地尝试这个代理网络:https://github.com/inngest/agent-kit/tree/main/examples/support-agent-human-in-the-loop#readme
两种方法都兼容
maxIter参数,该参数允许您设置网络迭代的最大次数。 我们建议在使用基于代理的路由时,始终设置一个master值。
示例
- AgentKit SWE-bench 示例 展示了如何构建一个由多个智能体组成的网络,以解决复杂的 SWE bench 挑战。
- 简单搜索智能体 能够自主地浏览网页,回答给定的问题。
- 支持智能体 展示了 Inngest 的
waitForEvent()如何使智能体能够请求人类的帮助。 - E2B 编码智能体 复现了 Cursor 的 Agent 模式,仅凭一个简单的提示就能创建出完整的项目。
- Daytona 编码智能体 可以创建 Web 应用、运行测试、执行脚本等,并且还具备自动检测开发服务器和生成预览的功能。
贡献
克隆仓库后:
- 确保已安装
node和pnpm:
node -v # 应该是 > 20.x
pnpm -v # 应该是 > 9.x
- 安装依赖:
pnpm i
- 构建包或运行测试:
pnpm build
pnpm test
许可证
版本历史
@inngest/agent-kit@0.13.22025/11/13@inngest/agent-kit@0.13.12025/10/07@inngest/use-agent@0.4.02025/10/01@inngest/agent-kit@0.13.02025/09/27@inngest/agent-kit@0.12.12025/09/25@inngest/use-agent@0.3.02025/09/24@inngest/agent-kit@0.12.02025/09/24@inngest/agent-kit@0.11.02025/09/24@inngest/use-agent@0.2.02025/09/24@inngest/agent-kit@0.9.02025/07/01@inngest/agent-kit@0.8.42025/07/01@inngest/agent-kit@0.8.32025/06/20@inngest/agent-kit@0.8.22025/06/19@inngest/agent-kit@0.8.12025/06/18@inngest/agent-kit@0.8.02025/05/14@inngest/agent-kit@0.7.32025/04/16@inngest/agent-kit@0.7.22025/04/09@inngest/agent-kit@0.7.12025/04/07@inngest/agent-kit@0.7.02025/03/21@inngest/agent-kit@0.6.02025/03/20常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。