Files
NotesAgentic/docs/AI-Core与Agent-Core开发说明.md
T
admin 1741f7b1aa 添加provider工厂和Ollama支持
- 实现ProviderFactory用于构建不同类型的provider适配器
- 添加EnvironmentCredentialResolver用于解析环境变量中的凭证
- 实现OllamaProvider支持本地模型调用
- 实现OpenAICompatibleProvider支持OpenAI兼容接口
- 在AgentRuntime中添加对ProviderError的处理
- 更新Message结构体添加tool_calls字段
- 实现provider配置的增删改查API端点
- 添加provider注册表的replace方法
- 添加HTTP基础类和工具参数解码功能
- 更新依赖添加httpx库
- 添加相关单元测试验证provider适配器功能
```
2026-08-27 14:16:57 +08:00

252 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI Core 与 Agent Core 开发说明
> 本文档用于团队开发和模块联调,记录当前已经落地的核心边界与使用方式。
## 当前实现
当前已经建立第一条可运行链路:
```text
FastAPI
→ Provider Registry
→ Agent Runtime
→ Permission Manager
→ Tool Registry
→ Agent Trace / SSE
```
对应代码:
```text
backend/app/
├── providers/
│ ├── base.py Provider Protocol 与统一 Turn
│ ├── registry.py Provider 注册、发现、模型列表和连接测试
│ └── mock.py 离线开发 Provider
├── agent/
│ ├── runtime.py Agent Loop、限制、取消、Trace 和 SSE
│ ├── tools.py Tool 注册、参数校验、隔离执行和结果转换
│ ├── permissions.py 权限策略、确认请求和会话授权
│ └── builtin_tools.py 无副作用的内置开发 Tool
└── container.py AI Core 依赖组装
```
Router 只负责 HTTP/SSE 与错误转换,不实现 Agent、Tool 或 Provider 业务逻辑。
## 模块边界
当前实现属于范涵宇负责的 AI Core / Agent Core
- Provider 抽象与注册;
- Agent Run 生命周期;
- Tool Registry
- Tool 参数校验与执行隔离;
- Permission
- Step、Timeout、Token Budget、取消;
- 内存 Trace 与 SSE
- 公共 Contract 和 API 接入。
以下内容保持接口,不在本模块实现:
- Note、NoteBlock、Markdown Parser:由 Knowledge Core 提供;
- FTS5、Vector、RRF、Reranker、Citation:由 Retrieval Core 提供;
- 文件系统和 API Key 明文读取:由 Rust Host 提供;
- Skill、Plugin 生命周期:后续在 Extension Core 中实现。
## Provider
默认注册离线 Provider
```text
provider_id = mock
model = mock-1
```
它支持:
```text
chat
tool_calling
streaming
```
普通 Chat 请求:
```json
{
"provider_id": "mock",
"model": "mock-1",
"messages": [
{"role": "user", "content": "hello"}
]
}
```
`POST /api/chat` 返回 ModelEvent SSE。
另外已经实现以下可配置 Adapter:
```text
openai_chat / openai_compatible
ollama
```
创建 Ollama Provider
```json
{
"provider_type": "ollama",
"name": "Local Ollama",
"base_url": "http://127.0.0.1:11434",
"default_model": "qwen3:latest"
}
```
创建 OpenAI-Compatible Provider
```json
{
"provider_type": "openai_compatible",
"name": "OpenAI Compatible",
"base_url": "https://api.openai.com/v1",
"default_model": "<model>",
"credential_id": "openai-main"
}
```
凭证 ID `openai-main` 对应 Sidecar 进程中的临时环境变量 `AINOTE_CREDENTIAL_OPENAI_MAIN`。环境变量由 Rust Host 从 Stronghold 读取后注入,不写入 Provider Config、日志或前端 Store。
Provider 配置生命周期接口已经可用:
```text
GET /api/providers
POST /api/providers
GET /api/providers/{provider_id}
PATCH /api/providers/{provider_id}
DELETE /api/providers/{provider_id}
GET /api/providers/{provider_id}/models
POST /api/providers/test
```
## Agent Run
创建普通 Agent Run
```json
{
"input": "hello",
"provider_id": "mock",
"model": "mock-1",
"max_steps": 10
}
```
请求:
```text
POST /api/agent/runs
```
创建后通过以下接口读取状态和事件:
```text
GET /api/agent/runs/{run_id}
GET /api/agent/runs/{run_id}/events
POST /api/agent/runs/{run_id}/cancel
```
当前 Run 与 Trace 保存在内存中,AI Core 重启后清空。后续数据库层接入时替换 Repository,不改变 API Contract。
## Tool Calling
当前注册两个无副作用开发 Tool
```text
system.echo
math.add
```
Mock Provider 使用下面的开发语法产生 Tool Call:
```text
/tool system.echo {"text":"hello tool"}
/tool math.add {"left":1,"right":2}
```
Agent Run 需要显式声明 `allowed_tools`
```json
{
"input": "/tool math.add {\"left\":1,\"right\":2}",
"provider_id": "mock",
"model": "mock-1",
"allowed_tools": ["math.add"]
}
```
Tool 参数由独立 Pydantic Model 再次校验。Tool 的异常、非法参数、超时和权限拒绝统一转换为 `ToolResult`,不会直接打断 API 进程。
## Permission
Permission Policy 当前支持:
```text
allow
confirm
deny
```
需要确认时,Agent 状态进入 `waiting_permission`,并发出 `PermissionRequired` 事件。前端使用:
```text
POST /api/agent/runs/{run_id}/permissions/{request_id}
```
提交以下决策之一:
```json
{"decision":"allow_once"}
{"decision":"allow_session"}
{"decision":"deny"}
```
默认需要确认的高影响权限包括 `notes.write``notes.delete``network.request``secrets.use`
## Knowledge / Retrieval 接入约定
其他成员完成服务后,通过注册 Tool 接入 Agent,不让 Agent Runtime 直接依赖具体实现:
```python
tool_registry.register(
definition=tool_definition,
arguments_model=arguments_model,
executor=executor,
)
```
建议第一批接入:
```text
notes.search
notes.read
notes.create
notes.update
notes.list
notes.move
rag.search
tasks.create
tasks.update
tasks.list
```
写操作 Executor 调用 Knowledge Core Service,不直接访问 SQLite;检索 Executor 调用 Retrieval Core Service,不直接拼接 FTS5 或 sqlite-vec SQL。
## 当前限制与下一步
- 已实现 Mock、OpenAI-Compatible Chat Completions 与 Ollama AdapterOpenAI Responses 和 Anthropic Messages 尚未实现。
- Provider 配置暂存内存,后续通过 Repository 接入 SQLite。
- Run/Trace 暂存内存;下一步抽象 Repository 并接入 SQLite。
- Permission 已有核心等待/恢复机制,前端确认 UI 尚未联调。
- Note/RAG Tool 等待对应模块 Service 接入。
- Skill/Plugin 将复用现有 Tool Registry 和 Permission Manager。