Yao OpenAPI 模块架构与源码解析入门
1. 模块概述
在 Yao 框架中,openapi 目录并非指代 "OpenAPI Specification (Swagger)" 的定义文件,而是指 Yao 平台对外暴露的核心系统级 HTTP API 实现代码。
与用户在 DSL (apis/*.http.json) 中定义的业务接口不同,openapi 目录下的代码实现了 Yao 引擎自带的高级功能接口,特别是 v0.10.4+ 版本引入的 AI Agent(智能体)、Chat(对话)、KB(知识库)以及配套的安全认证(OAuth)体系。
核心职责:
- 提供 AI 助手(Assistant)的管理与交互接口。
- 提供知识库(Knowledge Base/RAG)的切片、索引与检索接口。
- 提供基于 OAuth2 和 OIDC 的系统级身份认证与权限控制(ACL)。
- 提供系统监控与 Trace(链路追踪)接口。
2. 代码目录结构分析
该目录结构清晰地按“功能领域”划分。以下是核心子目录的解析:
2.1 核心业务域
agent/: 智能体管理。包含 Agent 的创建、更新、以及相关的配置。assistant/: 助手逻辑,处理具体的 AI 助理交互流。chat/: 对话核心。处理completions(补全)、消息流式传输(Streaming)以及上下文管理。kb/(Knowledge Base): 知识库核心实现。- 包含文档上传 (
addfile.go)、URL解析 (addurl.go)。 - 包含向量检索与图谱构建 (
graph.go,search.go)。
- 包含文档上传 (
mcp/: Model Context Protocol 的实现。这是 Yao 连接外部工具和数据源的标准协议接口。job/: 异步任务管理。用于处理耗时的 AI 任务(如大文件 RAG 索引构建)。
2.2 基础设施域
oauth/: 极其重要的安全模块。acl/: 访问控制列表(Access Control List),定义了 Scope(作用域)和 Role(角色)。providers/: 认证提供商的具体实现。token.go: 处理 JWT 令牌的签发与验证。
trace/: 可观测性模块。记录 AI 思考过程、Token 消耗和执行步骤 (events.go,logs.go)。dsl/: 处理 Yao 特有的 DSL (Domain Specific Language) 转换与解析接口。
2.3 入口与配置
openapi.go: 整个模块的入口。通常包含路由注册、中间件加载等初始化逻辑。config.go: 配置加载,读取关于 API 路径、端口等系统配置。
3. 核心模块深度解析
3.1 安全认证主线 (openapi/oauth)
Yao 的系统 API 采用了一套完善的 OAuth2 风格认证机制。
- 设计理念: 基于 Scope 的权限控制。
- 关键文件:
openapi/oauth/guard.go: 这是一个中间件(Middleware),用于拦截请求,校验 Token,并根据请求的资源检查 ACL 权限。openapi/oauth/acl/enforce.go: 具体的权限执行逻辑,判断 User 是否拥有某个 Resource 的 Operation 权限。
- 学习建议: 阅读
acl目录下的DESIGN.md(如果存在) 或acl.go,理解 Yao 是如何将 API 路由映射到权限点的。
3.2 AI 对话主线 (openapi/chat & openapi/agent)
这是构建 AI 应用的核心。
- 通信机制: 大量使用了 Server-Sent Events (SSE) 进行流式输出,因为 AI 响应通常是渐进式的。
- 关键文件:
openapi/chat/chat.go: 处理/chat路由,接收用户输入。openapi/chat/completions.go: 对接底层 LLM(大语言模型)接口,封装 Prompt 并调用。
- MCP 集成: 观察
openapi/mcp目录,了解 Chat 模块如何在运行时动态调用外部工具(Tools),这是 Agent 能够“联网”或“操作数据库”的关键。
3.3 RAG 知识库主线 (openapi/kb)
知识库是 Yao 区别于普通 Web 框架的亮点。
- 流程:
- Ingest (摄入):
addfile.go接收文件 -> 调用convert模块转文本。 - Chunking (切片): 将文本切分为块 (Chunk)。
- Embedding (向量化): 调用 Embedding 模型生成向量。
- Indexing (存储): 存入向量数据库(如 Qdrant, Milvus 等,位于
yao/stores或gou库中)。
- Ingest (摄入):
- API:
search.go提供了混合检索(Hybrid Search)的接口,结合了关键词搜索和向量搜索。
4. 开发入门指南
如果想基于此代码库进行二次开发或 Debug,请遵循以下步骤:
环境搭建:
- 确保安装 Go 1.20+。
- 查看
Makefile,通常包含make test或make run指令。 - 查看
go.mod了解依赖关系,特别是对yaoapp/gou(运行时核心) 和yaoapp/xun(ORM核心) 的依赖。
阅读入口: 从
openapi/openapi.go开始。查找func Start()或func Load()之类的函数,弄清楚 HTTP 路由是如何注册到 Gin 或 Fiber 引擎上的。go// 伪代码示例,寻找类似逻辑 func Load(router *gin.Engine) { group := router.Group("/api/v1") group.Use(oauth.Guard()) // 鉴权中间件 group.POST("/chat", chat.Handler) }调试重点:
- Trace: 关注
openapi/trace。当你觉得 AI 回答很慢或者逻辑不对时,这个模块负责记录每一步的耗时和输入输出。 - Tests: 目录下的
openapi/tests/非常丰富。例如openapi/tests/chat_test.go或openapi/tests/kb/collection_test.go。运行这些单元测试是理解 API 输入输出格式的最快方式。
- Trace: 关注
5. 总结
yao/openapi 是 Yao 作为一个 AI 原生应用引擎 的“控制面”。它不像传统的 CRUD API 那样简单,而是融合了复杂的 长连接管理(SSE)、大文件处理(RAG Pipeline)和 细粒度权限控制(ACL)。
建议的学习路径:
- 先看
openapi/tests下的测试用例,理解 API 怎么用。 - 阅读
openapi/oauth/guard.go理解请求是如何被保护的。 - 深入
openapi/chat和openapi/kb理解 AI 业务逻辑流。