Swiftide
用 Rust 构建流式 LLM 应用的框架:代理工具框架、类型化任务图与可组合的 RAG 索引/查询管道,一站式解决 AI 应用编排问题。
证据显示代理框架默认本地工具执行、提供docker执行器隔离、人工审批(ApprovalRequired)与可定制停止工具,权限面与外部效应有基本约束(各2分);但未见细粒度权限声明、数据/密钥脱敏文档与回滚机制的具体说明,故未给满分。
类型化任务图、停止条件、结构化失败负载与tracing/指标表明自洽性和错误报告有支撑;workspace统一依赖版本、CI测试与覆盖率徽章支持依赖可用性;但静态审查无法验证运行行为,扣一分。
README面向明确受众(Rust开发者构建agent/RAG),场景与示例划分清楚,能力边界(pre-1.0、API可变)有声明;但触发精度(工具/停止语义)仅有描述性说明,无文档细节,环境适配(多provider集成)为feature-gated描述。
信息架构、安装说明、示例目录、MIT许可(LICENSE与Cargo.toml一致)都非常完整,给3分;维护者(核心团队、贡献指南、Discord)清晰;但未见CHANGELOG文件,版本演进仅靠crates.io徽章,已知限制仅在Project Status一句带过,扣分。
示例展示可组合、流式输出与可观测性,输出可用性有支撑;功能门控保持依赖轻量,成本收益合理;但实际效用需运行验证,静态审查只能给中等分。
README中的能力声明多可对应到具体示例文件和docs.rs链接,可追溯性中等;CI/覆盖率徽章与Cargo.toml、LICENSE互相印证;但静态材料无法核实徽章背后的真实状态,README中部分能力(如resume、MCP)仅陈述未见源码细节,扣分。
- 项目pre-1.0,API可能在不通知的情况下变更,生产使用需锁定版本。
- 代理默认在本地执行工具/命令,接入LLM前应配置隔离(如docker执行器)与人工审批。
- API密钥通过环境变量(OPENAI_API_KEY)注入,未见密钥脱敏或日志防泄漏文档,需自行审计。
- 未提供CHANGELOG,升级依赖版本前应审查diff。
- 发布方身份未经企业注册表验证,信任需自行建立。
这个 Agent 能做什么,适合哪些场景?
Swiftide 是 bosun-ai 组织下的一个 Rust 框架,用于构建 LLM 应用,包含三大核心组件:代理框架(Agent Harness)、类型化任务图(Typed Task Graphs)以及流式 RAG 索引与查询管道。代理框架负责管理消息历史、调用 LLM、执行工具、运行生命周期钩子并按停止条件结束循环;任务图通过强类型节点和转换规则编排复杂工作流,支持并行分支、暂停与恢复;RAG 管道则以流式方式串联加载器、转换器、嵌入器、缓存和存储后端。它集成了 OpenAI、Anthropic、Gemini、Ollama 等多家 LLM 提供商,以及 Qdrant、Redis、LanceDB、PgVector 等存储方案,支持 MCP 工具加载和 Langfuse 可观测性。项目仍处于 1.0 之前的阶段,API 可能变化,采用 MIT 许可证发布。
Swiftide 提供三条主要能力线。第一,代理框架:通过 agents::Agent::builder() 构建代理,使用 #[swiftide::tool] 宏将 Rust 函数注册为工具,通过 AgentContext 抽象消息历史与 ToolExecutor(默认本地执行,也可用 Docker 执行器),支持生命周期钩子、人工审批(ApprovalRequired)、结构化停止/失败载荷、MCP 工具箱和流式响应。第二,任务图:以 Task 和 TaskNode 组成编译期强类型的工作流,节点间通过 Transition 决定输出流向,支持扇出/汇合(tasks_fanout.rs 示例)、顺序或并行执行、暂停与恢复。第三,RAG 管道:indexing::Pipeline 串联 FileLoader、ChunkCode(基于 tree-sitter 的代码分块)、MetadataQACode、Embed 和 Qdrant 等存储后端完成索引;查询管道支持查询转换、检索、混合搜索、重排序与评估。
- Rust 开发者需要为自己的代码库构建检索增强问答系统,用 FileLoader 加载 .rs 文件、tree-sitter 分块后嵌入并存入 Qdrant
- 团队需要构建能调用本地工具、支持人工审批环节的半自主代理,例如代码审查或运维助手
- 需要将提示步骤、代理和领域逻辑编排成强类型多节点工作流,并支持暂停恢复以等待外部回调的平台工程团队
- 需要对接多家 LLM 提供商(OpenAI、Anthropic、Bedrock、Ollama 等)并保留切换自由的 AI 产品后端
- 需要流式处理大规模索引负载(Kafka、Fluvio、Parquet 数据源)并接入 Langfuse 追踪的数据团队
这个 Agent 有哪些优点和局限?
- 一个框架同时覆盖代理循环、类型化任务编排和流式 RAG 管道三条线,无需拼装多个库
- 多提供商适配(OpenAI、Anthropic、Gemini、Bedrock、Groq、Ollama 等)且按 feature 门控,依赖保持轻量
- 任务图在编译期强类型化,节点输入/输出/错误类型在构建时确定,减少运行时编排错误
- 原生 Rust 实现,适合对性能敏感的索引与检索路径,README 明确提示关注热路径的内存分配
- 工具生态开放:本地 Rust 函数、自定义 Tool 实现、MCP 服务器、Docker 执行器均可接入
- 项目处于 pre-1.0 阶段,README 明确警告 API 可能变化,升级存在迁移风险
- 要求使用者熟悉 Rust 异步编程(Tokio、Arc、泛型特征对象),对非 Rust 团队门槛较高
- 存储、数据源、可观测性等能力依赖各自外部系统(Qdrant、Redis、Kafka、Langfuse 等),部署复杂度随之增加
- MVP 文档以 API docs 和示例为主,README 自认示例是最可靠的签名来源,正式文档可能滞后
如何安装或部署这个 Agent?
通过 Cargo 安装并启用所需功能:
sh
cargo add swiftide --features swiftide-agents,openai
cargo add anyhow
cargo add tokio --features macros,rt-multi-thread若使用 OpenAI,需设置 API 密钥:
sh
export OPENAI_API_KEY=...
集成均按 feature 门控,按需启用可保持依赖轻量。
如何使用这个 Agent?
以最小代理为例:用 swiftide::integrations::openai::OpenAI::builder().default_prompt_model("gpt-4o-mini").build()? 构建 LLM 客户端;用 #[swiftide::tool] 宏定义异步工具函数;通过 agents::Agent::builder().llm(&openai).tools([...]).on_new_message(...).limit(8).build()? 构建代理,最后调用 .query("...").await? 执行。RAG 索引则使用 indexing::Pipeline::from_loader(FileLoader::new(".")) 后链式调用 then_chunk、then、then_in_batch(Embed::new(...))、then_store_with(qdrant) 并 .run().await?。examples 目录包含 hello_agents、tasks、tasks_fanout、hybrid_search、langfuse 等完整示例可参考。