QILIN ENGINE · 技术架构

架构总览

运行中的麒麟引擎是一棵插件树:入口模式接入插件树,插件树持有智能体循环、工具注册表、模型适配器与执行世界;会话、设置与检索在旁持久化。图中每条连接都有流动的数据包。

QiLin 架构总览图:入口模式接入 Kylin 插件树,插件树持有 agent loop、工具注册表、模型适配器与执行世界;会话、设置与检索在旁持久化
QiLin 运行时动态总览 · 图中连接随数据流动

01Profile 与组合包

运行中的引擎由启动时按序叠加的各层组合而成——组合即产品,配置即代码。

Profile 是存放在 Harness home 中的具名组装。它列出自己叠放的组合包,存放自己安装的树外插件,并保存用户自己的 cordis.patch.yml。web、headless、sdk、sdk-minimal 和 acp 作为模板随发行版交付。

组合包(bundle)是 Kylin 配置项及其挂载代码的分发格式,因此它插入的内容始终可被其上各层 patch。各层按此顺序应用在空条目列表之上:

组合包(按 profile 列出的顺序)
  → profile 的 cordis.patch.yml
    → home 级的 cordis.patch.yml
      → 任意 --patch overlay

一条 patch 按 id 定位某个条目并替换其整个 config,或插入新条目。qilin-base 是 web、headless、sdk 与 acp profile 的共享第一层:模型适配器、工具、持久化、沙箱与审批策略、设置、凭据、遥测。qilin-web-app 增加浏览器应用,qilin-headless 增加不带服务器的一次性运行器,qilin-sdk-app 增加 SDK JSON-RPC 服务器,qilin-acp-app 增加仅用于自动化的 ACP 服务器。

要查看一台机器启动的配置树:

qilin --profile web --dump-config

它打印出的任何条目,都可以由你自己的 patch 替换。

02核心包

以下包向 Kylin 插件树贡献内容,每个服务占据一个稳定的上下文键。

包职责上下文键
core/session仅追加的 SessionEvent 日志和内存存储ctx.sessions
core/system-prompt提示词片段与工具 schema 的组装ctx.systemPrompt
core/tools作用域化的工具注册表和带把关的执行流水线ctx.tools
core/agentAgent 接口、活跃 agent 注册表和 agent/* 事件ctx.agents
core/agent-loop实现该接口的默认驱动器ctx.agentLoop
core/scope按 agent 划分作用域的注册原语库,无 ctx 键
llm/llm消息与流式词汇表,以及适配器 seamctx.llm
webhook/webhook已认证 delivery 的分派和会话创建ctx.webhookRuntime

03事件域

事件就是扩展点,而选对事件域是大多数改动的第一个决定。

  • 会话事件是追加到日志并通过 session/event 广播的持久事实。当某个事实必须在重新加载后仍然存在时,使用它。
  • Agent 事件(agent/*)携带活跃 agent:inbox、步骤、状态、请求、验证、续跑。要观察或拦截进行中的工作时,使用它。
  • 能力事件无需导入循环即可向某个 seam(fs/*、tools/*、telemetry/*)附加策略和适配器。

其中 agent/pre-step、agent/request、llm/stream 和三个 tools/* 事件是 waterfall(瀑布式)事件,其监听器必须调用 next() 才能委托下去;策略监听器在拥有决策权时可以短路,仅做观察的监听器必须委托。

04轮次流程

一个步骤是一次模型请求加上它调用的工具;一个轮次包含零个或多个步骤:它在领取首条输入之前打开,并在不再欠下任何工作时关闭。

turn/start
  claim next-step input plus one queued message
  assemble prompt sections + tool schemas; project runtime context
  -> agent/pre-step                reject | enter(messages)
     step/start
     agent/request -> prepareCall
     reconcile system/message using the prepared call capability
     derive and freeze model history from the log
     stream the bound prepared call -> llm/stream -> agent/assistant-stream
       assistant/message | assistant/attempt
     tool/call* -> tools/pre-execute -> tools/execute -> tools/post-execute -> tool/result*
     step/end
     tools owe another request, or next-step input arrived -> claim -> next step
  -> agent/turn-stopping
turn/end

turn/*、step/*、system/message、user/message、assistant/message、assistant/attempt 和 tool/* 是持久会话事件;其余是分属三个事件域的实时扩展点。循环发送不可变请求,同时保留实时取消能力;每次尝试同步协调同一份已渲染组装结果、仅在首次尝试追加用户消息、按需记录 header/context、派生并冻结请求,再通过绑定调用发起流式请求。

05两种部署形态

同一套基座以两种形态交付,差异是有意为之。

WEB · 多租户

qilin web

为多个账户服务同一个入口。supervisor 维护账户名册,并按需为每个账户启动一个隔离的运行时;会话、工作区、用量账本、插件与模型设置都归属各自的租户。浏览器经部署自己的门认证,路由 cookie 转发到所属账户的运行时;TLS 可由 hub 终结,也可为每个账户分配独立 origin。

DESKTOP · 单用户

桌面壳

把一个本地引擎包进一个窗口,服务于一个人:没有名册、没有账户门、没有租户路由——整套基座在本地对着一个数据目录运行,插件树、会话与工具与 Web 形态完全一致。

更深入的子系统文档、配置目录与扩展指南,随源码仓库的 docs/ 目录与GitHub 仓库发布。