nanoClaw/README.md

221 lines
7.5 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.

# NanoClaw
基于 LLM 大语言模型的 AI 对话应用,支持工具调用、思维链、流式回复和工作目录隔离。
## 功能特性
- 多轮对话 - 支持上下文管理的多轮对话
- 工具调用 - 网页搜索、代码执行、文件操作等 13 个内置工具
- 思维链 - 支持链式思考推理DeepSeek R1 / GLM thinking
- 工作目录 - 项目级文件隔离,安全操作
- Token 统计 - 按日/周/月统计使用量
- 流式响应 - 实时 SSE 流式输出,穿插显示思考/文本/工具调用
- 代码编辑器 - 基于 CodeMirror 6支持 15+ 语言语法高亮和暗色主题
- 多数据库 - 支持 MySQL、SQLite、PostgreSQL
- 多用户/单用户 - 支持单用户免登录和多用户 JWT 认证两种模式
## 快速开始
### 1. 安装依赖
```bash
conda create -n claw python=3.12
conda activate claw
pip install -e .
```
### 2. 配置
复制并编辑 `config.yml`
```yaml
# Port
backend_port: 3000
frontend_port: 4000
# Max agentic loop iterations (tool call rounds)
max_iterations: 15
# Available models
# Each model must have its own id, name, api_url, api_key
models:
- id: deepseek-chat
name: DeepSeek V3
api_url: https://api.deepseek.com/chat/completions
api_key: sk-xxx
- id: glm-5
name: GLM-5
api_url: https://open.bigmodel.cn/api/paas/v4/chat/completions
api_key: xxx
default_model: deepseek-chat
# Database Configuration
# Supported types: mysql, sqlite, postgresql
db_type: sqlite
# MySQL/PostgreSQL Settings (ignored for sqlite)
# db_host: localhost
# db_port: 3306
# db_user: root
# db_password: "123456"
# db_name: nano_claw
# SQLite Settings (ignored for mysql/postgresql)
db_sqlite_file: nano_claw.db
# Workspace Configuration
workspace_root: ./workspaces
# Authentication (optional, defaults to single-user mode)
# auth_mode: single # "single" (default) or "multi"
# jwt_secret: nano-claw-default-secret-change-in-production
```
> **说明**`api_key` 支持环境变量替换,例如 `api_key: ${DEEPSEEK_API_KEY}`。
### 3. 启动后端
```bash
python -m backend.run
```
### 4. 启动前端
```bash
cd frontend
npm install
npm run dev
```
## 项目结构
```
backend/
├── __init__.py # 应用工厂数据库初始化load_config()
├── config.py # 配置加载与验证
├── models.py # SQLAlchemy 数据模型
├── run.py # 入口文件
├── routes/ # API 路由
│ ├── auth.py # 认证(登录/注册/JWT/profile
│ ├── conversations.py # 会话 CRUD
│ ├── messages.py # 消息 CRUD + 聊天SSE 流式)
│ ├── models.py # 模型列表
│ ├── projects.py # 项目管理 + 文件操作
│ ├── stats.py # Token 使用统计
│ └── tools.py # 工具列表
├── services/ # 业务逻辑
│ ├── chat.py # 聊天补全服务SSE 流式 + 多轮工具调用)
│ └── llm_client.py # OpenAI 兼容 LLM API 客户端
├── tools/ # 工具系统
│ ├── core.py # 核心类ToolDefinition/ToolRegistry
│ ├── factory.py # @tool 装饰器 + register_tool()
│ ├── executor.py # 工具执行器(缓存、去重、上下文注入)
│ ├── services.py # 辅助服务(搜索/抓取/计算)
│ └── builtin/ # 内置工具
│ ├── crawler.py # 网页搜索、抓取
│ ├── data.py # 计算器、文本、JSON 处理
│ ├── weather.py # 天气查询(模拟)
│ ├── file_ops.py # 文件操作6 个工具project_id 自动注入)
│ └── code.py # Python 代码执行(沙箱)
└── utils/ # 辅助函数
├── helpers.py # 通用函数ok/err/build_messages 等)
└── workspace.py # 工作目录工具(路径验证、项目目录管理)
frontend/
└── src/
├── api/ # API 请求层request + SSE 流解析)
├── components/ # Vue 组件12 个)
├── composables/ # 组合式函数(主题/模态框/Toast
└── utils/ # 工具模块Markdown 渲染/代码高亮/图标)
```
## 工作目录系统
### 概述
工作目录系统为文件操作提供安全隔离,确保 AI 只能访问指定项目目录内的文件。
### 使用流程
1. **创建项目** - 在侧边栏点击"新建项目"或上传文件夹
2. **选择项目** - 在对话中选择当前工作目录
3. **文件操作** - AI 自动在项目目录内执行文件操作(`project_id` 由后端自动注入,对 AI 透明)
### 安全机制
- 所有文件工具的 `project_id` 由后端自动注入AI 不可见也不可伪造
- 后端强制验证路径在项目目录内
- 阻止目录遍历攻击(如 `../../../etc/passwd`
## API 概览
### 认证
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET` | `/api/auth/mode` | 获取当前认证模式 |
| `POST` | `/api/auth/login` | 用户登录 |
| `POST` | `/api/auth/register` | 用户注册 |
| `GET` | `/api/auth/profile` | 获取当前用户信息 |
| `PATCH` | `/api/auth/profile` | 更新当前用户信息 |
### 会话管理
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET/POST` | `/api/conversations` | 会话列表 / 创建会话 |
| `GET` | `/api/conversations/:id` | 会话详情 |
| `PATCH` | `/api/conversations/:id` | 更新会话 |
| `DELETE` | `/api/conversations/:id` | 删除会话 |
### 消息管理
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET` | `/api/conversations/:id/messages` | 消息列表 |
| `POST` | `/api/conversations/:id/messages` | 发送消息SSE 流式) |
| `DELETE` | `/api/conversations/:id/messages/:mid` | 删除消息 |
| `POST` | `/api/conversations/:id/regenerate/:mid` | 重新生成消息 |
### 项目管理
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET/POST` | `/api/projects` | 项目列表 / 创建项目 |
| `GET/PUT/DELETE` | `/api/projects/:id` | 项目详情 / 更新 / 删除 |
| `POST` | `/api/projects/upload` | 上传文件夹作为项目 |
| `GET` | `/api/projects/:id/files` | 列出项目文件 |
| `GET/PUT/PATCH/DELETE` | `/api/projects/:id/files/:path` | 文件 CRUD |
| `POST` | `/api/projects/:id/directories` | 创建目录 |
| `POST` | `/api/projects/:id/search` | 搜索文件内容 |
### 其他
| 方法 | 路径 | 说明 |
|------|------|------|
| `GET` | `/api/models` | 获取可用模型列表 |
| `GET` | `/api/tools` | 获取工具列表 |
| `GET` | `/api/stats/tokens` | Token 使用统计 |
## 内置工具
| 分类 | 工具 | 说明 |
|------|------|------|
| **爬虫** | web_search, fetch_page, crawl_batch | 网页搜索和抓取 |
| **数据处理** | calculator, text_process, json_process | 数学计算和文本处理 |
| **代码执行** | execute_python | 沙箱环境执行 Python |
| **文件操作** | file_read, file_write, file_delete, file_list, file_exists, file_mkdir | project_id 自动注入 |
| **天气** | get_weather | 天气查询(模拟) |
## 文档
- [后端设计](docs/Design.md) - 架构设计、数据模型、API 文档、SSE 事件
- [工具系统](docs/ToolSystemDesign.md) - 工具开发指南、安全设计
## 技术栈
- **后端**: Python 3.10+, Flask, SQLAlchemy, requests
- **前端**: Vue 3, Vite 6, CodeMirror 6, marked, highlight.js, KaTeX
- **LLM**: 支持任何 OpenAI 兼容 APIDeepSeek、GLM、OpenAI、Moonshot、Qwen 等)