DSupport
一个基于Kotlin Multiplatform开发的AI客服系统开源项目,不使用Agent框架,从零手写RAG、MCP与多智能体编排,采用Clean Architecture将模型与确定性代码严格分离
时间轴 (近 90 天)
DSupport 是一个使用 Kotlin Multiplatform 构建的 AI 客服项目,由开发者 Diego Ferreira Caetano 创建,项目从零手写 RAG、MCP 与多智能体编排,不使用任何 Agent 框架。
DSupport 的架构将职责划分为:模型(非确定性)负责理解自然语言、决定调用哪个工具、起草回复、在专家之间路由;代码(确定性)负责校验类型与规则、隐藏敏感数据、拦截不可放行的操作、运行离线测试。
DSupport 中 5 个角色使用模型,14 个组件是纯代码,后者包括护栏、验证器、TF-IDF 检索、工具、MCP 传输、追踪、评估打分等。
DSupport 采用 Clean Architecture 与 Ports & Adapters,模块包括 contract、core、adapters、mcp-orders、mcp-tickets、cli、server、app、eval,依赖方向只向内。
DSupport 的 core 模块通过 LlmClient 接口认知模型,该接口包含 next(返回文本或工具调用请求)与 structured(强制模型填充 JSON 表单)两个方法,更换 Claude 只需写一个新适配器。
DSupport 拥有 380 多个测试,全部离线运行,没有一个测试消耗 API 额度。
DSupport 的智能体循环使用 repeat(maxTurns) 设置轮次上限,防止模型无限调用;达到上限时由代码返回升级人工的消息,而非由模型自己决定。
DSupport 的工具调用通过 async + awaitAll 并行执行,结果按请求顺序回填,因为模型 API 要求对应关系。
DSupport 的 RAG 实现按段落切分文章,使用 TF-IDF 做词权重向量化,可选接入 VoyageEmbedder 做语义检索,SearchKbTool 中的相关性截断值为 minScore = 0.25。
在 DSupport 中,当 RAG 过滤后结果为空时,工具返回 nothing_relevant_found,知识专家被要求回答 NO_ANSWER 而非编造答案。
还有 5 条时间轴事件
全部知识事实 (15)
DSupport 是一个使用 Kotlin Multiplatform 构建的 AI 客服项目,由开发者 Diego Ferreira Caetano 创建,项目从零手写 RAG、MCP 与多智能体编排,不使用任何 Agent 框架。
50%待验证DSupport 的架构将职责划分为:模型(非确定性)负责理解自然语言、决定调用哪个工具、起草回复、在专家之间路由;代码(确定性)负责校验类型与规则、隐藏敏感数据、拦截不可放行的操作、运行离线测试。
50%待验证DSupport 中 5 个角色使用模型,14 个组件是纯代码,后者包括护栏、验证器、TF-IDF 检索、工具、MCP 传输、追踪、评估打分等。
50%待验证DSupport 采用 Clean Architecture 与 Ports & Adapters,模块包括 contract、core、adapters、mcp-orders、mcp-tickets、cli、server、app、eval,依赖方向只向内。
50%待验证DSupport 的 core 模块通过 LlmClient 接口认知模型,该接口包含 next(返回文本或工具调用请求)与 structured(强制模型填充 JSON 表单)两个方法,更换 Claude 只需写一个新适配器。
50%待验证DSupport 拥有 380 多个测试,全部离线运行,没有一个测试消耗 API 额度。
50%待验证DSupport 的智能体循环使用 repeat(maxTurns) 设置轮次上限,防止模型无限调用;达到上限时由代码返回升级人工的消息,而非由模型自己决定。
50%待验证DSupport 的工具调用通过 async + awaitAll 并行执行,结果按请求顺序回填,因为模型 API 要求对应关系。
50%待验证DSupport 的 RAG 实现按段落切分文章,使用 TF-IDF 做词权重向量化,可选接入 VoyageEmbedder 做语义检索,SearchKbTool 中的相关性截断值为 minScore = 0.25。
50%待验证在 DSupport 中,当 RAG 过滤后结果为空时,工具返回 nothing_relevant_found,知识专家被要求回答 NO_ANSWER 而非编造答案。
50%待验证DSupport 的 MCP 部分基于官方 Kotlin SDK,通过 stdio 运行,客户端把服务端作为子进程启动,会话消息为 initialize、tools/list、tools/call。
50%待验证在 MCP 的 stdio 模式下,stdout 是协议通道本身,任何非协议内容混入都会导致对端解析失败,因此 DSupport 的服务端把 System.out 重定向到了 System.err。
50%待验证DSupport 的编排者不持有任何数据工具,只负责判断谁处理哪部分并始终委派给专家;若编排者持有工具,DSupportAssembly 会直接装配失败,用代码强制架构约束。
50%待验证DSupport 中每个专家被包装成 SubAgentTool,对编排者而言就是一个普通工具;SubAgentTool 接收的是 agent 工厂而非 agent 实例,因为每个 agent 持有自己的历史,并行调用不能共享实例。
50%待验证DSupport 的护栏是运行在智能体循环三个固定点的确定性代码,通过 Hook 接口暴露 beforeTool、afterTool、beforeFinal 三个切面,每个切面可以允许、拒绝或修改。
50%