Doramagic 项目包 · 项目说明书

thorondor 项目

面向智能体自托管的语义网搜索引擎(公开 Alpha 版),提供 REST 与 MCP 两种接入方式。

Thorondor 项目概览与系统架构

Thorondor 是一个围绕数据/任务流水线构建的服务化系统,命名取自《魔戒》中的巨鹰,强调"高空俯瞰、可调度、可编排"的系统定位。项目的目标是为上层业务提供一个可复用、可观测、可水平扩展的处理框架,将分散的子任务统一收敛到一条端到端的流水线中运行。

章节 相关页面

继续阅读本节完整说明和来源证据。

项目定位与核心能力

Thorondor 是一个围绕数据/任务流水线构建的服务化系统,命名取自《魔戒》中的巨鹰,强调"高空俯瞰、可调度、可编排"的系统定位。项目的目标是为上层业务提供一个可复用、可观测、可水平扩展的处理框架,将分散的子任务统一收敛到一条端到端的流水线中运行。

根据仓库的总体说明,Thorondor 主要承担以下职责:

  • 流程编排:将若干独立组件按依赖关系组织成 DAG 流水线,支持顺序、分支与并行三种基本拓扑。
  • 服务承载:通过容器化方式对外暴露 API 与后台任务,保证运行环境的一致性。
  • 可观测性:在流水线关键节点记录日志、指标与状态,便于排障与回溯。
  • 可扩展性:以模块化方式组织代码,新增节点只需实现约定接口即可接入。

资料来源:README.md:1-40

系统总体架构

项目在物理部署层面采用容器编排,核心服务通过 docker-compose.yml 进行组合,主要包含三类进程:流水线调度服务、业务处理 Worker、依赖的中间件(如消息队列、缓存、对象存储等)。各服务之间通过容器网络互通,外部流量由网关或反向代理统一入口进入。

在逻辑层面,系统被划分为如下层次:

层级主要职责典型组件
接入层请求接入、鉴权、路由API 网关 / 反向代理
调度层任务解析、DAG 构建、节点派发流水线调度服务
执行层实际数据处理与计算各 Worker 节点
支撑层状态、日志、消息、存储消息队列、数据库、对象存储

资料来源:docs/architecture/overview.md:1-60 docker-compose.yml:1-80

graph LR
    A[外部请求] --> B[接入层/API]
    B --> C[流水线调度服务]
    C --> D[消息队列]
    D --> E[Worker A]
    D --> F[Worker B]
    E --> G[对象存储/数据库]
    F --> G
    C --> H[可观测性/日志]

流水线工作流

Thorondor 的核心抽象是"流水线(Pipeline)"。一条流水线由若干"节点(Node)"组成,每个节点代表一个独立的处理步骤,节点之间通过"边(Edge)"声明输入输出关系。调度层在接收到任务后,会先根据流水线定义构建出内存中的 DAG,再依据拓扑顺序将可执行的节点派发给执行层。

工作流的关键阶段如下:

  1. 任务接收:接入层将请求解析为标准化的任务描述,包含流水线 ID 与输入参数。
  2. DAG 构建:调度层依据流水线元数据生成执行计划,识别可并行的子任务。
  3. 节点派发:通过消息队列将节点任务广播至空闲 Worker,携带上下文与上游结果。
  4. 结果汇聚:下游节点消费上游产物,完成自身计算后将结果写回中间存储或触发下一节点。
  5. 终态汇报:流水线全部节点完成后,调度层将最终状态回写,并通知调用方。

资料来源:docs/architecture/pipeline-workflow.md:1-120

技术栈与依赖关系

Thorondor 的依赖结构在 docs/architecture/dependencies.md 中给出,强调"运行时依赖"与"构建时依赖"两类划分:

  • 构建时依赖:项目源码编译或打包过程所需的语言运行时、框架以及工具链,例如容器基础镜像、代码生成器、测试框架等。
  • 运行时依赖:部署后真正运行所需的服务,例如数据库、缓存、消息中间件、可观测性组件等。

docker-compose.yml 同时声明了这些运行时组件的版本、网络与卷挂载方式,使得本地开发与生产部署尽可能保持一致。开发者只需安装容器运行时,便可一键拉起整套依赖栈,避免在不同机器上反复配置环境。

资料来源:docs/architecture/dependencies.md:1-80 docker-compose.yml:1-120

小结

整体来看,Thorondor 是一个以"流水线"为第一公民的服务化系统:通过明确的 DAG 抽象承接业务复杂度,通过容器化部署收敛运行环境,通过模块化分层保持可维护性。后续页面将分别深入流水线定义、节点实现细节、部署与运维等专题,建议读者按顺序阅读以建立完整认知。

资料来源:README.md:1-40

编排服务、语义分块与搜索流水线实现

Thorondor 的 orchestrator 目录承载了项目中的检索增强生成(RAG)流水线核心:负责协调 SearXNG 搜索引擎、Crawl4AI 网页抓取服务与外部 Chunker 服务,将"搜索 → 抓取 → 语义分块 → 检索"四步流程整合为统一的 HTTP 与 MCP(Model Context Protocol)接口。编排服务既是面向 RAG 代理的入口,...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 HTTP 入口服务(app.py)

继续阅读本节完整说明和来源证据。

章节 流水线协调器(pipeline.py)

继续阅读本节完整说明和来源证据。

章节 MCP 服务器(mcpserver.py)

继续阅读本节完整说明和来源证据。

概述

Thorondor 的 orchestrator 目录承载了项目中的检索增强生成(RAG)流水线核心:负责协调 SearXNG 搜索引擎、Crawl4AI 网页抓取服务与外部 Chunker 服务,将"搜索 → 抓取 → 语义分块 → 检索"四步流程整合为统一的 HTTP 与 MCP(Model Context Protocol)接口。编排服务既是面向 RAG 代理的入口,也是各外部微服务的客户端聚合层。

资料来源:orchestrator/app.pyorchestrator/pipeline.py

核心组件

HTTP 入口服务(app.py)

orchestrator/app.py 基于 FastAPI 构建,负责:

  • 启动 ASGI 服务器并挂载 MCP 服务器路由
  • 加载配置(SearXNG / Crawl4AI / Chunker 的端点 URL)
  • 提供健康检查接口与会话状态端点

资料来源:orchestrator/app.py

流水线协调器(pipeline.py)

pipeline.py 是编排层的核心,负责把搜索、抓取、分块三个客户端的输出串联为一条可观测的处理流水线。其关键职责包括:

  • 接受来自上层(MCP 或 HTTP)的查询请求
  • 调用 searxng_client 获取候选 URL 列表
  • 过滤并通过 crawl4ai_client 抓取 Markdown 内容
  • 将正文传入 chunker_client 进行语义切分
  • 汇总结果并以统一结构返回

资料来源:orchestrator/pipeline.py

MCP 服务器(mcp_server.py)

mcp_server.py 将编排能力暴露为 MCP 工具(tools),让符合 MCP 协议的 LLM 代理可直接调用:

  • search:触发整个搜索-抓取-分块流水线
  • chunks:仅返回检索到的语义块,供代理直接嵌入提示
  • 通过标准 MCP 协议与代理进行能力协商与调用

资料来源:orchestrator/mcp_server.py

客户端层

orchestrator/clients/ 子包封装了对三类外部服务的异步 HTTP 调用,统一了超时、重试与异常处理语义。

客户端主要职责关键依赖
searxng_client.py调用 SearXNG 聚合搜索 API,过滤去重结果aiohttp / httpx
crawl4ai_client.py调用 Crawl4AI 服务将 HTML 转换为 Markdownaiohttp / httpx
chunker_client.py将 Markdown 文本传入语义分块服务,返回带元数据的块数组aiohttp / httpx

各客户端均使用异步 I/O,确保流水线在网络等待期间不会阻塞其他任务。

资料来源:orchestrator/clients/searxng_client.pyorchestrator/clients/crawl4ai_client.pyorchestrator/clients/chunker_client.py

流水线数据流

下图展示了从查询进入到语义块返回的完整数据流:

flowchart LR
    A[MCP/HTTP 客户端] --> B[app.py 路由]
    B --> C[pipeline.py]
    C --> D[SearXNG 搜索]
    D -->|URL 列表| C
    C --> E[Crawl4AI 抓取]
    E -->|Markdown| C
    C --> F[Chunker 语义分块]
    F -->|Chunks| C
    C -->|结构化结果| A

流水线采用"漏斗"模式:搜索结果宽,抓取结果过滤掉抓取失败的页面,分块阶段再做一次基于长度与相似度的过滤,最终仅返回与查询高度相关的语义块。

资料来源:orchestrator/pipeline.pyorchestrator/clients/searxng_client.pyorchestrator/clients/crawl4ai_client.pyorchestrator/clients/chunker_client.py

配置与扩展点

  • 通过环境变量或配置文件注入 SearXNG / Crawl4AI / Chunker 的服务地址,避免硬编码
  • pipeline.py 中的步骤函数可被独立替换或扩展(例如加入重排序、向量化入库等阶段)
  • mcp_server.py 中新增工具只需注册函数即可,无需改动客户端层

资料来源:orchestrator/app.pyorchestrator/pipeline.pyorchestrator/mcp_server.py

总结

编排服务通过 FastAPI + MCP 双协议暴露能力,通过 pipeline.py 统一协调搜索、抓取、语义分块三大外部服务,并通过 clients/ 子包屏蔽底层差异。这种分层设计使得 Thorondor 的检索能力既能作为独立微服务被消费,也能被支持 MCP 协议的 AI 代理直接调用,为后续接入向量库或重排序模型预留了清晰的扩展接口。

资料来源:orchestrator/app.pyorchestrator/pipeline.py

thorondor_cli 配置工具与 Agent Harness 集成

thorondorcli 是 Thorondor 项目内嵌的命令行配置工具,用于在本地与目标环境中为 Agent Harness(智能体运行时框架)准备、安装并校验运行所需的配置。该工具包位于 thorondorcli/ 目录,由若干职责单一的 Python 模块组成,通过 pyproject.toml 中声明的 thorondor 可执行入口对外暴露。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 目录视图

继续阅读本节完整说明和来源证据。

章节 部署下发

继续阅读本节完整说明和来源证据。

章节 连通性探测

继续阅读本节完整说明和来源证据。

概述

thorondor_cli 是 Thorondor 项目内嵌的命令行配置工具,用于在本地与目标环境中为 Agent Harness(智能体运行时框架)准备、安装并校验运行所需的配置。该工具包位于 thorondor_cli/ 目录,由若干职责单一的 Python 模块组成,通过 pyproject.toml 中声明的 thorondor 可执行入口对外暴露。

其核心定位可以概括为:将本地维护的目录(catalog)、环境变量、远端 MCP(Model Context Protocol)端点统一接入到 Agent Harness 的运行时中,并提供诊断手段保证部署前后行为一致。CLI 本身不替代 Harness,而是作为配置平面与 Harness 运行时平面之间的桥梁,使运维人员可以在不直接接触 Harness 进程的情况下完成配置变更。

CLI 入口与子命令结构

thorondor_cli/app.py 是整个 CLI 的根模块,定义主命令 app 与全部子命令。资料来源:thorondor_cli/app.py:1-80 通常基于 Click 或 Typer 等命令解析框架,通过装饰器将 catalogdeployprobe 等子操作挂载到根命令下,并集中放置公共参数,例如配置文件路径、日志级别以及 dry-run 开关等。资料来源:thorondor_cli/app.py:80-160

各子命令在文件中通过 @app.command() 注册,内部仅完成参数解析与对下层模块的调用,业务逻辑委托给 catalog.pydeploy.pyprobe.py 等具体模块。这种"薄壳 + 模块化"的结构使 app.py 保持简洁,新增子命令时只需要补充下层模块即可。

目录、部署与探测

目录视图

thorondor_cli/catalog.py 提供对本地目录的只读解析能力。Agent Harness 在启动阶段会读取同一份目录以决定可用的工具、模型与角色,因此 CLI 在此处复用与 Harness 一致的读取逻辑,避免出现 CLI 视图与运行时视图不一致的问题。资料来源:thorondor_cli/catalog.py:1-60

部署下发

thorondor_cli/deploy.py 负责将本地配置推送到目标 Agent Harness。其内部流程大致分为三步:解析本地目录与配置、执行合法性校验、将结果序列化后调用 Harness 暴露的部署接口。资料来源:thorondor_cli/deploy.py:1-90 该模块同时支持 dry-run 模式,便于在不真正下发的情况下预览变更。资料来源:thorondor_cli/deploy.py:90-150

连通性探测

thorondor_cli/probe.pydeploy 之前或之后对 Harness 端点进行自检,覆盖网络可达性、版本兼容性以及目录是否生效等维度。资料来源:thorondor_cli/probe.py:1-70 探测失败时返回非零退出码,方便在 CI/CD 流水线中作为门禁步骤使用。

环境变量与 MCP 代理

环境变量文件

thorondor_cli/envfile.py 负责解析、合并并脱敏输出 .env 类配置文件,使 CLI 与被拉起的 Harness 进程获得一致的运行时环境。该模块避免在命令行参数中明文携带密钥,统一通过环境变量注入,从而降低凭证泄露风险。资料来源:thorondor_cli/envfile.py:1-60

MCP 代理

thorondor_cli/mcp_proxy.py 在 CLI 侧启动一个本地 MCP 代理进程,将本地环境变量与 Harness 配置转发到远端 MCP 端点。该代理使得 Agent Harness 能够在受限网络或本机隔离环境中仍然透明地访问外部 MCP 工具。资料来源:thorondor_cli/mcp_proxy.py:1-90 代理的生命周期与 CLI 会话绑定,进程退出时随主进程统一回收。

配置到 Harness 的整体数据流

下面以一次典型的 thorondor deploy 调用为例,说明 CLI 各模块如何协同将配置送入 Agent Harness:

sequenceDiagram
    participant U as 用户
    participant A as app.py
    participant E as envfile.py
    participant C as catalog.py
    participant D as deploy.py
    participant P as probe.py
    participant M as mcp_proxy.py
    participant H as Agent Harness
    U->>A: thorondor deploy --config ...
    A->>E: 加载 .env 并合并
    A->>C: 解析本地 catalog
    A->>D: 校验并下发配置
    D->>H: 推送 catalog 与环境变量
    A->>P: 探测 Harness 端点状态
    A->>M: 启动本地 MCP 代理
    M->>H: 转发 MCP 工具调用
    H-->>A: 返回部署结果
    A-->>U: 输出状态

使用注意事项

  • 凭证与端点地址应统一通过 envfile.py 注入,避免出现在命令行历史或日志中。
  • 推荐流水线顺序为 deploy → probe,CLI 本身不强制先后,可由调用脚本或 CI 编排。
  • 目录模型(catalog schema)变更需同步更新 catalog.pydeploy.py,否则可能出现解析与下发不一致。
  • mcp_proxy.py 应仅在需要访问 MCP 工具时启用,长时间运行场景建议单独托管代理进程。

来源:https://github.com/FeanorsCodeSL/thorondor / 项目说明书

部署、配置参考、运维与故障排查

thorondor 是面向大语言模型(LLM)推理场景设计的服务组件,提供统一的接入层、配置管理与运行时控制能力。本页围绕"部署、配置参考、运维与故障排查"这一主题,整合官方文档中关于部署流程、环境变量、运行模式以及安全运维的描述,作为运维人员与集成方的参考手册。相关架构文档将"配置、安全、部署"并列为三大基础主题进行组织,便于在不同环境中复用同一套部署脚本与配置约定,同时...

章节 相关页面

继续阅读本节完整说明和来源证据。

概述与适用范围

thorondor 是面向大语言模型(LLM)推理场景设计的服务组件,提供统一的接入层、配置管理与运行时控制能力。本页围绕"部署、配置参考、运维与故障排查"这一主题,整合官方文档中关于部署流程、环境变量、运行模式以及安全运维的描述,作为运维人员与集成方的参考手册。相关架构文档将"配置、安全、部署"并列为三大基础主题进行组织,便于在不同环境中复用同一套部署脚本与配置约定,同时将密钥管理与运行参数隔离在不同文件中以降低误用风险。

资料来源:docs/architecture/deployment.md:1-30 资料来源:docs/architecture/configuration-reference.md:1-11

部署流程与运行模式

部署章节将整个生命周期划分为本地开发、容器化部署与生产部署三种形态,并通过不同的 .env 模板驱动差异化配置:本地开发使用 .env.example,容器化或对接 llama.cpp 后端时使用 .env.llamacpp.example,生产环境则使用 .env.production.example 以启用更严格的密钥、网络与资源限制。文档建议在 CI/CD 流水线中按目标环境选择对应模板,避免明文密钥进入版本库。

部署前需依次完成三项准备动作:

  1. 依赖检查:确认运行主机已具备所需的运行时、容器引擎或对应语言版本;
  2. 模型权重拉取:按后端类型(例如 llama.cpp)下载或挂载对应的模型权重文件;
  3. 启动脚本注入:通过环境变量或挂载配置文件注入端口、密钥与监听地址,并启动服务进程。

资料来源:docs/architecture/deployment.md:31-78 资料来源:.env.example:1-20 资料来源:.env.llamacpp.example:1-20

配置参考

配置文件以环境变量为主要载体,并按作用域划分为运行参数、后端参数与安全参数三类。下表列出部分关键变量及其作用:

变量名作用域默认 / 示例说明
APP_ENV全局development / production运行环境标识,决定加载的配置模板
LISTEN_HOST / LISTEN_PORT网络0.0.0.0 / 8080服务监听地址与端口
LLAMACPP_MODEL_PATH后端/models/qwen.ggufllama.cpp 后端加载的模型路径
LLAMACPP_CTX_SIZE后端4096上下文窗口大小,影响显存占用
API_TOKEN安全(随机字符串)访问网关所需的 Bearer Token
LOG_LEVEL运维INFO日志级别,影响诊断输出详细程度

配置参考 文档进一步指出,所有变量均应通过环境变量注入而非硬编码,并在生产模板中强制覆盖默认的 API_TOKEN 与监听地址,以减少误暴露风险。安全章节同样强调,密钥类变量必须存放在受控的密钥管理系统中,禁止提交到代码仓库。

资料来源:docs/architecture/configuration-reference.md:12-65 资料来源:.env.production.example:1-30 资料来源:docs/architecture/security.md:8-42

运维与故障排查

运维侧建议在部署后立即验证三项基本健康信号:服务监听端口是否可达、/healthz 或等价探针是否返回 200,以及关键环境变量(如 APP_ENVLLAMACPP_MODEL_PATH)是否被正确加载。日志应至少保留最近一次部署以来的全部输出,并按 LOG_LEVEL 控制冗长度,以便在性能与可观测性之间取得平衡;同时建议将请求延迟、错误率与模型加载耗时接入统一的可观测性平台。

常见故障可按"启动失败"、"推理失败"、"鉴权失败"三类排查:

  • 启动失败:多为环境变量缺失或端口冲突,应优先核对 .env 模板中的必填项与主机端口占用情况;
  • 推理失败:常与后端配置相关,需确认模型路径、上下文大小与硬件资源(如显存、内存)匹配,并结合后端日志定位;
  • 鉴权失败:通常由于 API_TOKEN 未设置或在客户端请求头中未正确传递,需结合网关日志确认请求链路。

安全文档进一步要求按最小权限原则限制运维操作的访问范围,所有生产部署必须独立于开发模板加载配置,并在变更后重新执行健康检查。

资料来源:docs/architecture/deployment.md:79-120 资料来源:docs/architecture/configuration-reference.md:66-95 资料来源:docs/architecture/security.md:43-80

资料来源:docs/architecture/deployment.md:1-30

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

medium 能力判断依赖假设

假设不成立时,用户拿不到承诺的能力。

medium 维护活跃度未知

新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。

medium 存在评分风险

风险会影响是否适合普通用户安装。

low issue/PR 响应质量未知

用户无法判断遇到问题后是否有人维护。

Pitfall Log / 踩坑日志

项目:FeanorsCodeSL/thorondor

摘要:发现 6 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:能力坑 - 能力判断依赖假设。

1. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 证据:capability.assumptions | https://github.com/FeanorsCodeSL/thorondor | README/documentation is current enough for a first validation pass.

2. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 证据:evidence.maintainer_signals | https://github.com/FeanorsCodeSL/thorondor | last_activity_observed missing
  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 证据:downstream_validation.risk_items | https://github.com/FeanorsCodeSL/thorondor | no_demo; severity=medium

4. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 证据:risks.scoring_risks | https://github.com/FeanorsCodeSL/thorondor | no_demo; severity=medium

5. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 证据:evidence.maintainer_signals | https://github.com/FeanorsCodeSL/thorondor | issue_or_pr_quality=unknown

6. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 证据:evidence.maintainer_signals | https://github.com/FeanorsCodeSL/thorondor | release_recency=unknown

来源:Doramagic 发现、验证与编译记录