# 智能与技能 API

记忆系统、技能市场、ClawHub、Hands 自动化、扩展、插件和媒体生成的端点。

## 记忆端点

LibreFang 提供两套记忆系统：每个 Agent 独立的简单键值存储，以及支持关系图谱和衰减的主动式语义记忆系统（类 mem0 风格）。

### GET /api/memory/agents/&lbrace;id&rbrace;/kv

列出 Agent 的所有键值对。

**响应** `200 OK`：

```json
{
  "kv_pairs": [
    {"key": "preferences", "value": {"theme": "dark"}},
    {"key": "state", "value": {"step": 3}}
  ]
}
```

### GET /api/memory/agents/&lbrace;id&rbrace;/kv/&lbrace;key&rbrace;

获取指定的键值对。

**响应** `200 OK`：

```json
{
  "key": "preferences",
  "value": {"theme": "dark"}
}
```

**响应** `404 Not Found`（键不存在时）：

```json
{
  "error": "Key 'preferences' not found"
}
```

### PUT /api/memory/agents/&lbrace;id&rbrace;/kv/&lbrace;key&rbrace;

设置键值对。创建或覆盖。

**请求体**：

```json
{
  "value": {"theme": "dark", "language": "en"}
}
```

**响应** `200 OK`：

```json
{
  "status": "stored",
  "key": "preferences"
}
```

### DELETE /api/memory/agents/&lbrace;id&rbrace;/kv/&lbrace;key&rbrace;

删除键值对。

**响应** `200 OK`：

```json
{
  "status": "deleted",
  "key": "preferences"
}
```

### GET /api/memory

列出所有主动式记忆条目（全局，跨 Agent 和用户）。

### POST /api/memory

添加新的主动式记忆条目。

**请求体**：

```json
{
  "content": "User prefers concise answers",
  "agent_id": "a1b2c3d4-...",
  "user_id": "user-1",
  "tags": ["preference"]
}
```

### GET /api/memory/search

使用语义相似性搜索主动式记忆。

**查询参数：**
- `q`（必填）：搜索查询字符串
- `agent_id`（可选）：限制为特定 Agent
- `limit`（可选）：最大结果数（默认：10）

### GET /api/memory/stats

获取主动式记忆存储的聚合统计信息。

### POST /api/memory/cleanup

移除过期或陈旧的记忆条目。

### POST /api/memory/decay

对记忆条目评分施加时间衰减（降低旧条目的相关性）。

### POST /api/memory/bulk-delete

通过 ID 列表批量删除记忆条目。

### PUT /api/memory/items/&lbrace;memory_id&rbrace;

更新指定的记忆条目。

### DELETE /api/memory/items/&lbrace;memory_id&rbrace;

删除指定的记忆条目。

### GET /api/memory/items/&lbrace;memory_id&rbrace;/history

获取指定记忆条目的编辑历史。

### GET /api/memory/user/&lbrace;user_id&rbrace;

获取与指定用户关联的所有记忆条目。

### GET /api/memory/agents/&lbrace;id&rbrace;

列出指定 Agent 的所有主动式记忆条目。

### DELETE /api/memory/agents/&lbrace;id&rbrace;

删除指定 Agent 的所有主动式记忆条目。

### GET /api/memory/agents/&lbrace;id&rbrace;/search

搜索指定 Agent 的主动式记忆。

### GET /api/memory/agents/&lbrace;id&rbrace;/stats

获取指定 Agent 的记忆统计信息。

### DELETE /api/memory/agents/&lbrace;id&rbrace;/level/&lbrace;level&rbrace;

清除指定 Agent 在特定重要性级别的所有记忆条目。

### GET /api/memory/agents/&lbrace;id&rbrace;/duplicates

查找指定 Agent 的重复记忆条目。

### POST /api/memory/agents/&lbrace;id&rbrace;/consolidate

合并和去重指定 Agent 的记忆条目。

### GET /api/memory/agents/&lbrace;id&rbrace;/count

获取指定 Agent 的记忆条目总数。

### GET /api/memory/agents/&lbrace;id&rbrace;/relations

查询指定 Agent 的关系图谱条目。

### POST /api/memory/agents/&lbrace;id&rbrace;/relations

为指定 Agent 存储新的关系图谱条目。

### GET /api/memory/agents/&lbrace;id&rbrace;/export

将指定 Agent 的所有主动式记忆条目导出为 JSON。

### POST /api/memory/agents/&lbrace;id&rbrace;/import

从 JSON 导入指定 Agent 的主动式记忆条目。

---

## 技能和市场端点

管理技能注册表。技能通过 Python、Node.js、WASM 或纯提示模块扩展 Agent 的能力。所有技能安装都会经过 SHA256 验证和提示注入扫描。

### GET /api/skills

列出所有已安装的技能。

**响应** `200 OK`：

```json
{
  "skills": [
    {
      "name": "github",
      "version": "1.0.0",
      "runtime": "PromptOnly",
      "description": "GitHub integration for issues, PRs, and repos",
      "author": "librefang",
      "tags": ["devtools"],
      "tools_count": 0,
      "enabled": true,
      "has_prompt_context": true,
      "source": {"type": "local"}
    }
  ],
  "total": 60,
  "categories": ["ai-ml", "cloud", "data", "devtools", "general"]
}
```

### POST /api/skills/install

从本地路径或 URL 安装技能。技能清单会经过验证（SHA256 校验和）并在安装前扫描提示注入。

**请求体**：

```json
{
  "source": "/path/to/skill",
  "verify": true
}
```

**响应** `201 Created`：

```json
{
  "status": "installed",
  "skill": "my-custom-skill",
  "version": "1.0.0"
}
```

### POST /api/skills/uninstall

移除已安装的技能。内置技能无法被卸载。

**请求体**：

```json
{
  "name": "my-custom-skill"
}
```

**响应** `200 OK`：

```json
{
  "status": "uninstalled",
  "skill": "my-custom-skill"
}
```

### POST /api/skills/create

通过 evolution 模块创建一个新的 prompt-only 技能。技能会被校验、安全扫描，并立即热加载到注册表。

**请求体**：

```json
{
  "name": "csv-analysis",
  "description": "Expert CSV data analysis and cleaning workflows",
  "prompt_context": "# CSV Analysis\n\nWhen analyzing CSV files...",
  "tags": ["data", "csv"]
}
```

**响应** `200 OK`：

```json
{
  "status": "created",
  "name": "csv-analysis",
  "version": "0.1.0",
  "message": "Skill 'csv-analysis' created successfully"
}
```

### GET /api/skills/&lbrace;name&rbrace;

获取某个技能的详细信息，包括演化历史、工具、配套文件以及使用指标。

**响应** `200 OK`：

```json
{
  "name": "csv-analysis",
  "version": "0.1.2",
  "description": "Expert CSV data analysis and cleaning workflows",
  "author": "agent-evolved",
  "license": "",
  "tags": ["data", "csv"],
  "runtime": "PromptOnly",
  "tools": [],
  "has_prompt_context": true,
  "prompt_context_length": 2450,
  "source": "Local",
  "enabled": true,
  "path": "/home/user/.librefang/skills/csv-analysis",
  "linked_files": {
    "references": ["pandas-cheatsheet.md"],
    "templates": ["clean.py"]
  },
  "evolution": {
    "versions": [
      {
        "version": "0.1.0",
        "timestamp": "2026-04-16T12:00:00Z",
        "changelog": "Initial creation by agent",
        "content_hash": "a1b2c3..."
      },
      {
        "version": "0.1.2",
        "timestamp": "2026-04-16T14:30:00Z",
        "changelog": "Added encoding detection step",
        "content_hash": "d4e5f6..."
      }
    ],
    "use_count": 12,
    "evolution_count": 3
  }
}
```

**响应** `404 Not Found`：

```json
{
  "error": "Skill 'nonexistent' not found"
}
```

### GET /api/marketplace/search

在 FangHub 市场搜索社区技能。

**查询参数：**
- `q`（必填）：搜索查询字符串
- `page`（可选）：页码（默认：1）

**响应** `200 OK`：

```json
{
  "results": [
    {
      "name": "weather-api",
      "author": "community",
      "description": "Real-time weather data integration",
      "downloads": 1250,
      "version": "2.1.0"
    }
  ],
  "total": 1,
  "page": 1
}
```

---

## ClawHub 端点

浏览和安装 ClawHub（OpenClaw 生态系统兼容）上的技能。所有安装都会经过完整的安全流水线：SHA256 验证、SKILL.md 安全扫描和信任边界执行。

### GET /api/clawhub/search

在 ClawHub 搜索兼容的技能。

**查询参数：**
- `q`（必填）：搜索查询

### GET /api/clawhub/browse

浏览 ClawHub 分类。

**查询参数：**
- `category`（可选）：按分类过滤
- `page`（可选）：页码（默认：1）

### GET /api/clawhub/skill/&lbrace;slug&rbrace;

获取指定 ClawHub 技能的详细信息。

### GET /api/clawhub/skill/&lbrace;slug&rbrace;/code

获取 ClawHub 技能的原始源代码。

### POST /api/clawhub/install

从 ClawHub 安装技能。下载后验证 SHA256 校验和，扫描提示注入，并自动将 SKILL.md 格式转换为 LibreFang 的 skill.toml。

**请求体**：

```json
{
  "slug": "data-pipeline"
}
```

**响应** `201 Created`：

```json
{
  "status": "installed",
  "skill": "data-pipeline",
  "version": "1.2.0",
  "converted_from": "SKILL.md"
}
```

---

## Hands 端点

Hands 是由内核管理的持久化自动化进程（浏览器自动化、RPA、长期运行的 Bot）。

### GET /api/hands

列出所有已安装的 Hand 定义。

### POST /api/hands/install

从清单或注册表 slug 安装 Hand。

### GET /api/hands/active

列出当前活跃（运行中）的 Hand 实例。

### GET /api/hands/&lbrace;hand_id&rbrace;

获取指定 Hand 定义的详细信息。

### POST /api/hands/&lbrace;hand_id&rbrace;/activate

激活 Hand，创建新的运行实例。

### POST /api/hands/&lbrace;hand_id&rbrace;/check-deps

检查 Hand 所需的所有依赖项是否已安装。

### POST /api/hands/&lbrace;hand_id&rbrace;/install-deps

安装 Hand 缺失的依赖项。

### GET /api/hands/&lbrace;hand_id&rbrace;/settings

获取 Hand 的当前设置。

### PUT /api/hands/&lbrace;hand_id&rbrace;/settings

更新 Hand 的设置。

### POST /api/hands/instances/&lbrace;id&rbrace;/pause

暂停运行中的 Hand 实例。

### POST /api/hands/instances/&lbrace;id&rbrace;/resume

恢复已暂停的 Hand 实例。

### DELETE /api/hands/instances/&lbrace;id&rbrace;

停用并移除 Hand 实例。

### GET /api/hands/instances/&lbrace;id&rbrace;/stats

获取 Hand 实例的运行时统计信息（运行时长、已处理事件数、错误数）。

### GET /api/hands/instances/&lbrace;id&rbrace;/browser

获取浏览器自动化 Hand 实例的当前浏览器状态。

---

## 扩展端点

扩展可为守护进程本身添加新能力（自定义工具、路由、集成等），无需修改核心代码。

### GET /api/extensions

列出所有已安装的扩展。

### GET /api/extensions/&lbrace;name&rbrace;

获取指定扩展的信息。

### POST /api/extensions/install

从路径或注册表安装扩展。

### POST /api/extensions/uninstall

按名称卸载扩展。

---

## 插件端点

上下文引擎插件扩展上下文组装流水线（RAG、预处理、文档加载器等）。

### GET /api/plugins/registries

列出已配置的插件注册表（本地和远程）。

### GET /api/plugins

列出所有已安装的插件。

### GET /api/plugins/&lbrace;name&rbrace;

获取指定插件的信息。

### POST /api/plugins/install

从注册表或本地路径安装插件。

### POST /api/plugins/uninstall

按名称卸载插件。

### POST /api/plugins/scaffold

从模板脚手架创建新的插件项目。Body：`{"name": "...", "description": "...", "runtime": "python" | "native" | "v" | "node" | "deno" | "go" | "ruby" | "bash" | "bun" | "php" | "lua"}`。按选定语言生成对应的 hook 脚手架。

### GET /api/plugins/doctor

扫描主机上所有支持的 runtime，检测每个 runtime 的 launcher 是否在 PATH 上，并和已安装的插件做交叉比对。响应包含每个 runtime 检测到的版本号 + 缺失时的安装提示，并会标出哪些插件的声明 runtime 不可用。插件静默不工作时用这个端点排查。

### POST /api/plugins/&lbrace;name&rbrace;/install-deps

安装插件的运行时依赖项（例如 Python 包、Node 模块）。

---

## 媒体生成端点

跨提供商的媒体生成 -- 图像、文本转语音、视频和音乐。LibreFang 自动检测每种能力对应的首个已配置提供商，也可通过 `provider` 字段显式指定。

支持的提供商：**OpenAI**（图像、TTS）、**MiniMax**（图像、TTS、视频、音乐）。

### POST /api/media/image

根据文本提示生成一张或多张图像。

**请求体**：

```json
{
  "prompt": "A futuristic city skyline at sunset",
  "provider": "openai",
  "model": "gpt-image-1",
  "width": 1024,
  "height": 1024,
  "count": 1
}
```

除 `prompt` 外所有字段可选。省略 `provider` 时自动选择首个支持图像生成的已配置提供商。

**响应** `200 OK`：

```json
{
  "images": [
    { "url": "/api/uploads/550e8400-..." }
  ],
  "model": "gpt-image-1",
  "provider": "openai",
  "revised_prompt": "A detailed futuristic city..."
}
```

### POST /api/media/speech

文本转语音（TTS）。

**请求体**：

```json
{
  "text": "Hello, welcome to LibreFang.",
  "voice": "alloy",
  "format": "mp3",
  "speed": 1.0
}
```

除 `text` 外所有字段可选。

**响应** `200 OK`：

```json
{
  "url": "/api/uploads/550e8400-...",
  "format": "mp3",
  "provider": "openai",
  "model": "tts-1",
  "duration_ms": 2400,
  "sample_rate": 24000
}
```

### POST /api/media/video

提交异步视频生成任务。返回用于轮询的 task ID。

**请求体**：

```json
{
  "prompt": "A cat playing piano in a jazz bar",
  "provider": "minimax",
  "duration_secs": 5
}
```

除 `prompt` 外所有字段可选。

**响应** `202 Accepted`：

```json
{
  "task_id": "task-abc123",
  "provider": "minimax"
}
```

### GET /api/media/video/&lbrace;task_id&rbrace;?provider=minimax

轮询视频生成任务状态。`provider` 查询参数必填。

**响应** `200 OK`（处理中）：

```json
{
  "status": "processing",
  "task_id": "task-abc123"
}
```

**响应** `200 OK`（已完成）：

```json
{
  "status": "completed",
  "result": {
    "file_url": "https://cdn.example.com/video.mp4",
    "width": 1280,
    "height": 720,
    "duration_secs": 5.0,
    "provider": "minimax",
    "model": "T2V-01"
  }
}
```

### POST /api/media/music

根据文本提示和/或歌词生成音乐。

**请求体**：

```json
{
  "prompt": "Upbeat electronic dance track",
  "lyrics": "",
  "instrumental": true,
  "format": "mp3"
}
```

`prompt` 和 `lyrics` 至少需提供一个。

**响应** `200 OK`：

```json
{
  "url": "/api/uploads/550e8400-...",
  "format": "mp3",
  "duration_ms": 180000,
  "provider": "minimax",
  "model": "music-2.5",
  "sample_rate": 44100
}
```

### GET /api/media/providers

列出可用的媒体提供商及其能力和配置状态。

**响应** `200 OK`：

```json
{
  "providers": [
    {
      "name": "openai",
      "configured": true,
      "capabilities": ["ImageGeneration", "TextToSpeech"]
    },
    {
      "name": "minimax",
      "configured": true,
      "capabilities": ["ImageGeneration", "TextToSpeech", "VideoGeneration", "MusicGeneration"]
    }
  ]
}
```

---

