rtc-voice-chat/backend/README.md

191 lines
5.1 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.

# AIGC BackendPython FastAPI
这是当前 Demo 的后端服务,负责三件事:
- 根据 `backend/.env``backend/config/custom_scene.py` 构建 `Custom` 场景配置
- 代理调用火山 RTC OpenAPI
- 在同一个 FastAPI 进程里提供本地 `CustomLLM` 回调接口 `/api/chat_callback`
## 环境要求
- Python 3.13+
## 安装依赖
```shell
uv sync
```
## 启动方式
```shell
uv run uvicorn server:app --host 0.0.0.0 --port 3001 --reload
```
服务默认监听 `http://localhost:3001`
## 配置方式
`Custom` 场景固定使用:
- `backend/.env`
- `backend/config/custom_scene.py`
不再依赖 `backend/scenes/Custom.json`
先复制示例配置:
```shell
cp .env.example .env
```
### 必填基础配置
| 变量名 | 说明 |
| --- | --- |
| `CUSTOM_ACCESS_KEY_ID` | 火山引擎 AK |
| `CUSTOM_SECRET_KEY` | 火山引擎 SK |
| `CUSTOM_RTC_APP_ID` | RTC 应用 ID同时作为 `RTCConfig.AppId``VoiceChat.AppId` |
| `CUSTOM_TASK_ID` | AIGC 任务 ID |
| `CUSTOM_AGENT_USER_ID` | 智能体用户 ID |
| `CUSTOM_AGENT_WELCOME_MESSAGE` | 智能体欢迎语 |
| `CUSTOM_LLM_SYSTEM_MESSAGE` | System Message |
| `CUSTOM_ASR_APP_ID` | ASR 应用 ID |
| `CUSTOM_TTS_APP_ID` | TTS 应用 ID |
### RTC 相关配置
| 变量名 | 说明 |
| --- | --- |
| `CUSTOM_RTC_APP_KEY` | 未提供 `CUSTOM_RTC_TOKEN` 时,用于自动生成 Token |
| `CUSTOM_RTC_ROOM_ID` | 房间 ID留空时服务端自动生成 |
| `CUSTOM_RTC_USER_ID` | 用户 ID留空时服务端自动生成 |
| `CUSTOM_RTC_TOKEN` | RTC Token留空时服务端会自动生成 |
| `RTC_OPENAPI_VERSION` | `StartVoiceChat/StopVoiceChat` 使用的 OpenAPI 版本,默认 `2025-06-01` |
### LLM 模式一ArkV3
```dotenv
CUSTOM_LLM_MODE=ArkV3
CUSTOM_LLM_ENDPOINT_ID=your-ark-endpoint-id
```
### LLM 模式二CustomLLM 本地回调
这个模式不是再起一个额外代理服务,而是直接由当前 `backend` 自己对外提供回调接口:
```dotenv
CUSTOM_LLM_MODE=CustomLLM
CUSTOM_LLM_URL=http://127.0.0.1:3001/api/chat_callback
CUSTOM_LLM_API_KEY=your-callback-token
CUSTOM_LLM_MODEL_NAME=my-model
```
推荐调试流程:
1. 先启动当前 `backend`
2.`ngrok` 暴露 `3001` 端口
3.`CUSTOM_LLM_URL` 改成公网地址,例如:
```dotenv
CUSTOM_LLM_URL=https://your-ngrok-domain.ngrok-free.app/api/chat_callback
```
`CUSTOM_LLM_API_KEY` 是火山调用你这个本地回调接口时带上的 Bearer Token如果你不需要这层鉴权可以留空。
### 当前 backend 内置的 Ark 配置
`/api/chat_callback` 内部会直接调用方舟 SDK因此还需要
```dotenv
ARK_API_KEY=your-ark-api-key
ARK_ENDPOINT_ID=your-ark-endpoint-id
ARK_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
ARK_TIMEOUT_SECONDS=1800
LOCAL_LLM_SYSTEM_PROMPT=
LOCAL_LLM_TEMPERATURE=0.3
```
如果 `LOCAL_LLM_SYSTEM_PROMPT` 留空,会回退使用 `CUSTOM_LLM_SYSTEM_MESSAGE`
### 可选 RAG 占位配置
当前仓库内置了一个最小 RAG 占位实现,但首版默认不接入主链路,支持两种输入来源:
```dotenv
RAG_STATIC_CONTEXT=
RAG_CONTEXT_FILE=
```
- `RAG_STATIC_CONTEXT`:直接写死一段知识文本
- `RAG_CONTEXT_FILE`:从本地文件读取全文作为知识上下文
后续如果你要接真实向量检索,直接替换 `services/rag_service.py` 里的 `retrieve`,再把 `server.py` 主链路接回去即可。
### CustomLLM 可选参数
| 变量名 | 说明 |
| --- | --- |
| `CUSTOM_LLM_HISTORY_LENGTH` | 历史轮数 |
| `CUSTOM_LLM_PREFILL` | 是否开启 Prefill |
| `CUSTOM_LLM_CUSTOM` | 透传到请求体的 `custom` 字段 |
| `CUSTOM_LLM_EXTRA_HEADER_JSON` | 额外请求头JSON 对象字符串 |
| `CUSTOM_LLM_ENABLE_PARALLEL_TOOL_CALLS` | 是否开启并行工具调用 |
| `CUSTOM_LLM_TEMPERATURE` | 透传温度参数 |
| `CUSTOM_LLM_TOP_P` | 透传 `top_p` |
| `CUSTOM_LLM_MAX_TOKENS` | 透传 `max_tokens` |
其余 ASR、TTS、数字人相关可选字段请直接参考 `backend/.env.example`
## 接口说明
### `POST /getScenes`
返回场景列表,并自动补齐:
- `RoomId`
- `UserId`
- `Token`
### `POST /proxy?Action={Action}&Version={Version}`
代理转发到火山 RTC OpenAPI。
支持:
- `StartVoiceChat`
- `StopVoiceChat`
请求体必须包含 `SceneID`
版本优先级如下:
1. 查询参数里的 `Version`
2. 环境变量 `RTC_OPENAPI_VERSION`
3. 默认值 `2025-06-01`
### `POST /api/chat_callback`
这是当前 backend 内置的 `CustomLLM` 回调接口,也是你配置给火山 `LLMConfig.Url` 的目标地址。
行为说明:
- 接收火山传入的 `messages`
- 可选校验 `Authorization: Bearer <CUSTOM_LLM_API_KEY>`
- 内部调用 `services/local_llm_service.py` 里的 Ark SDK
- 按火山要求返回 `text/event-stream`
- 结束时一定补 `data: [DONE]`
### `POST /debug/chat`
本地调试 LLM 文本流,不经过 RTC。
### `GET /debug/rag?query=...`
本地调试 RAG 返回结果。
## 说明
- 当前前端不会直接决定模型供应商,模型切换统一由后端环境变量控制。
- 如果缺少关键 `CUSTOM_*``ARK_*` 配置,服务会在启动阶段直接报错,而不是进入半可用状态。