将豆包桌面客户端的对话能力包装为 OpenAI 兼容的标准 API,供 Claude Code、OpenCode 等 AI Agent 软件直接调用。
- 🔄 OpenAI 兼容 — 完全兼容
/v1/chat/completions接口,支持流式/非流式 - 🤖 Anthropic 兼容 — 完全兼容
/v1/messages接口,支持 Claude Code 原生对接 - 🖼️ Vision 图片识别 — 支持 OpenAI Vision 格式,自动上传图片到豆包 ImageX
- 🎨 图片生成 — 支持
/v1/images/generations,兼容 OpenAI Image API - 🎵 音乐生成 — 支持 AI 音乐创作,自动生成歌词+音频,Web端直接播放
- 🎙️ 播客生成 — 支持 AI 播客脚本+音频生成,火山引擎原生TTS,前置/后置音乐
- 🧠 思考模式 — 深度推理,边想边搜
- 💻 编程模式 — 基于 Doubao-Seed-Code 的代码生成
- ✍️ 写作/翻译/解题 — 7种特殊模式,参数切换
- 📊 数据分析师 — 生成数据分析代码(pandas/matplotlib)
- 📤 对话导出/导入 — 直接调用豆包 IM 接口抓取已有对话,支持媒体下载,JSON/JSONL 格式
- 💾 服务端持久存储 — SQLite 数据库存储对话和消息,刷新不丢失
- 🌓 明暗主题切换 — 白天模式(豆包色系)+ 暗黑模式,自动记忆偏好
- 📊 管理面板 — Web UI 状态监控、在线对话、日志查看,设置面板集成服务状态
- 👥 多账号池 — Cookie 轮询 + 自动故障转移
- 🔐 纯算签名 — 默认
sign_method=pure,聊天接口使用 Python 原生纯算a_bogus - 📝 对话日志 — 自动记录每次输入输出
默认走 Python 原生签名 + 直接 HTTP 请求,不安装浏览器依赖:
pip install -r requirements.txt如果需要启用音乐/播客/导出的浏览器最后兜底,再额外安装:
pip install -r requirements-browser.txt
playwright install chromium浏览器兜底默认关闭,只有配置 enable_browser_fallback=true 时才会尝试使用。
登录 豆包网页版,从浏览器开发者工具复制 www.doubao.com 的 Cookie,并准备 device_id、web_id、tea_uuid 等设备参数,写入 config.json。
最小配置可以从 config.example.json 复制:
cp config.example.json config.json然后编辑 config.json,至少填入:
{
"cookie": "sessionid=...; sid_guard=...; ...",
"device_id": "...",
"web_id": "...",
"tea_uuid": "...",
"sign_method": "pure"
}python main.py服务启动后监听 http://localhost:8765,浏览器打开即可使用管理面板。
# 健康检查
curl http://localhost:8765/health
# 查看模型列表
curl http://localhost:8765/v1/models
# 非流式对话
curl -X POST http://localhost:8765/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"doubao-pro-chat","messages":[{"role":"user","content":"你好"}]}'
# 流式对话
curl -X POST http://localhost:8765/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"doubao-pro-chat","messages":[{"role":"user","content":"你好"}],"stream":true}'ANTHROPIC_API_KEY=any-string ANTHROPIC_BASE_URL=http://localhost:8765 claudeClaude Code 使用 Anthropic Messages API (/v1/messages),本服务已完整兼容,包括流式 SSE 事件格式。
OPENAI_API_BASE=http://localhost:8765/v1 OPENAI_API_KEY=sk-doubao claude{
"provider": "openai",
"api_base": "http://localhost:8765/v1",
"api_key": "any-string",
"model": "doubao-pro-chat"
}config.example.json 保留了原项目给 OpenClaw 使用的 custom_prompt:它会要求模型输出 OpenAI tool_calls JSON,服务端会把纯 JSON 工具调用结果转换为兼容的 tool_calls 响应。
from openai import OpenAI
client = OpenAI(api_key="any-string", base_url="http://localhost:8765/v1")
# 非流式
response = client.chat.completions.create(
model="doubao-pro-chat",
messages=[{"role": "user", "content": "你好"}]
)
print(response.choices[0].message.content)
# 流式
stream = client.chat.completions.create(
model="doubao-pro-chat",
messages=[{"role": "user", "content": "你好"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")| 模型 ID | 模式 | 说明 |
|---|---|---|
doubao-pro-chat |
快速模式 | 默认,Doubao-Seed-2.0-Mini |
doubao-thinking |
思考模式 | 深度推理,边想边搜 |
doubao-expert |
超能模式 | 自动搜索+深度分析 |
doubao-coding |
编程模式 | Doubao-Seed-Code 代码生成 |
doubao-writing |
写作助手 | 公文/邮件/文案/小说 |
doubao-translator |
翻译 | 多语言互译 |
doubao-tutor |
解题答疑 | 数学/物理/化学逐步解题 |
doubao-data-analyst |
数据分析师 | 生成数据分析代码 |
doubao-lite-chat |
轻量模式 | 轻量快速 |
doubao-pro-32k |
Pro 32K | 长上下文 |
doubao-pro-128k |
Pro 128K | 超长上下文 |
doubao-image |
图片生成 | 文生图,兼容 OpenAI Image API |
doubao-podcast |
播客生成 | AI 播客脚本+音频 |
doubao-music |
音乐生成 | AI 音乐创作(歌词+音频) |
支持 OpenAI Vision API 格式,自动上传图片到豆包 ImageX 服务:
# URL 图片
curl -X POST http://localhost:8765/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-pro-chat",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "描述这张图片"},
{"type": "image_url", "image_url": {"url": "https://example.com/image.png"}}
]
}]
}'# Python SDK - base64 图片
import base64
from openai import OpenAI
client = OpenAI(api_key="any-string", base_url="http://localhost:8765/v1")
with open("photo.jpg", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="doubao-pro-chat",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "描述这张图片"},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64}"}}
]
}]
)支持两种图片输入:
- HTTP URL:
https://...— 自动下载并上传 - Base64 Data URL:
data:image/png;base64,...— 自动解码并上传
本服务完整实现了 Anthropic Messages API (/v1/messages),Claude Code 可直接使用:
| Claude 模型 | 豆包模型 |
|---|---|
claude-3-5-sonnet-latest |
doubao-pro-chat |
claude-3-5-haiku-latest |
doubao-lite-chat |
claude-3-opus-latest |
doubao-expert |
claude-sonnet-4-* |
doubao-pro-chat |
ANTHROPIC_API_KEY=any-string ANTHROPIC_BASE_URL=http://localhost:8765 claudecurl -X POST http://localhost:8765/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: any-string" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-3-5-sonnet-latest",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}'from anthropic import Anthropic
client = Anthropic(api_key="any-string", base_url="http://localhost:8765")
# 非流式
message = client.messages.create(
model="claude-3-5-sonnet-latest",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}]
)
print(message.content[0].text)
# 流式
with client.messages.stream(
model="claude-3-5-sonnet-latest",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)- ✅ 流式 SSE(message_start, content_block_start, content_block_delta, message_delta, message_stop)
- ✅ 非流式响应
- ✅ system 提示词(字符串和 content blocks 格式)
- ✅ Vision 图片识别(base64 和 URL)
- ✅ 多轮对话
- ✅ stop_reason(end_turn)
- ✅ usage 统计
| 端点 | 方法 | 说明 |
|---|---|---|
/v1/chat/completions |
POST | OpenAI 对话补全(流式/非流式) |
/v1/messages |
POST | Anthropic Messages API(流式/非流式) |
/v1/models |
GET | 模型列表(含能力描述) |
/v1/images/upload |
POST | 上传图片文件 |
/v1/images/generations |
POST | 图片生成(OpenAI 兼容 API) |
/v1/music/generate |
POST | 音乐生成 |
/v1/music/status/{task_id} |
GET | 音乐生成状态查询 |
/v1/music/audio/{task_id} |
GET | 获取音乐音频URL |
/v1/music/lyric/{task_id} |
GET | 获取音乐歌词 |
/v1/music/list |
GET | 音乐任务列表 |
/v1/music/styles |
GET | 获取音乐风格列表 |
/v1/podcast/generate |
POST | 播客生成(自动账号重试) |
/v1/podcast/upload |
POST | 播客文件上传 |
/v1/podcast/status/{task_id} |
GET | 播客生成状态查询 |
/v1/podcast/audio/{task_id} |
GET | 获取播客音频URL |
/v1/podcast/script/{task_id} |
GET | 获取播客脚本 |
/v1/podcast/list |
GET | 播客任务列表 |
/v1/podcast/file/{filename} |
GET | 播客本地音频文件 |
/v1/podcast/config |
GET/POST | 播客配置(前置/后置音乐开关) |
/v1/user/info |
GET | 获取当前豆包用户信息 |
/v1/doubao/conversations |
GET | 获取豆包网站对话列表 |
/v1/doubao/conversations/{id}/export |
GET | 导出指定对话(含媒体下载) |
/api/conversations* |
GET/POST/DELETE | 本地 SQLite 会话库;保存 doubao_conversation_id 后可同步删除上游会话 |
/api/proxy/audio |
GET | 音频代理播放;支持 task_id 或原始 url |
/api/proxy/download/{task_id} |
GET | 音乐下载代理 |
/health |
GET | 健康检查 + 功能状态 |
/logs/today |
GET | 查看今日对话日志 |
/logs/{date} |
GET | 查看指定日期日志 |
/accounts |
GET/POST | 账号池管理 |
/accounts/{name} |
DELETE | 删除账号 |
/conversations/{id} |
GET | 查看会话状态 |
支持 OpenAI 兼容的 /v1/images/generations 端点,可用于生成图片:
curl -X POST http://localhost:8765/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"prompt": "一只可爱的小猫",
"n": 4,
"size": "1024x1024"
}'Python SDK 示例:
from openai import OpenAI
client = OpenAI(api_key="any-string", base_url="http://localhost:8765/v1")
response = client.images.generate(
model="dall-e-3", # 模型名可任意,实际使用豆包
prompt="一只可爱的小猫",
size="1024x1024",
n=4
)
for item in response.data:
print(item.url)响应格式:
{
"created": 1715731200,
"data": [
{
"url": "https://...",
"revised_prompt": "一只可爱的小猫"
}
]
}浏览器打开 http://localhost:8765 即可使用管理面板:
- 📊 状态页 — 服务状态、账号健康度、模型列表(集成在设置面板中)
- 💬 对话页 — 在线对话测试,支持图片上传,音乐/播客生成
- 📋 日志页 — 按日期/关键词/模型筛选日志
- 👤 账号页 — Cookie 账号池管理
- ⚙️ 设置页 — 服务配置+服务状态+可用模型
- 📤 导出/导入 — 豆包网站对话抓取、本地对话导出导入
- 🌓 主题切换 — 白天/暗黑模式,自动记忆
通过 doubao-podcast 模型生成 AI 播客,支持脚本生成 + 原生TTS音频合成:
# 生成播客
curl -X POST http://localhost:8765/v1/podcast/generate \
-H "Content-Type: application/json" \
-d '{"topic": "人工智能的未来发展"}'
# 查询状态
curl http://localhost:8765/v1/podcast/status/{task_id}
# 获取音频
curl http://localhost:8765/v1/podcast/audio/{task_id}播客音频使用火山引擎原生TTS(豆包同款音色):
| 项目 | 详情 |
|---|---|
| 协议 | 火山引擎 V1 WebSocket 二进制协议 |
| 端点 | wss://openspeech.bytedance.com/api/v1/tts/ws_binary |
| 认证 | 通过豆包 /alice/user/launch API 获取 appid + token |
| 音色 | zh_female_wenroutaozi_uranus_bigtts(温柔桃子女声) |
| 格式 | MP3, 24kHz 采样率 |
工作流程:
- 调用豆包 FPA API 生成播客脚本(双人对话格式)
- 解析脚本,按主播分段
- 通过火山引擎 WebSocket TTS 合成每段音频
- 合并所有音频段,返回完整播客
自动重试机制:
- Cookie 过期时自动切换账号池中的其他账号
- 火山引擎 TTS 失败时自动回退到 edge-tts
前置/后置音乐:
- 播客音频自动添加前置音乐(intro_jingle.mp3)和后置音乐(outro_jingle.mp3)
- 使用 ffmpeg 合并音频,带渐入渐出效果
- 可通过前端复选框或 API 参数控制开关:
- 生成时传参:
{"topic": "...", "intro_jingle": true, "outro_jingle": true} - 配置端点:
GET/POST /v1/podcast/config
- 生成时传参:
| 端点 | 方法 | 说明 |
|---|---|---|
/v1/podcast/generate |
POST | 生成播客(自动账号重试) |
/v1/podcast/status/{task_id} |
GET | 播客生成状态查询 |
/v1/podcast/audio/{task_id} |
GET | 获取播客音频URL |
/v1/podcast/script/{task_id} |
GET | 获取播客脚本 |
/v1/podcast/list |
GET | 播客任务列表 |
/v1/podcast/file/{filename} |
GET | 音频文件下载 |
/v1/podcast/config |
GET/POST | 播客配置(前置/后置音乐开关) |
通过 doubao-music 模型生成 AI 音乐,支持歌词+音频自动生成:
curl -X POST http://localhost:8765/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-music",
"messages": [{"role": "user", "content": "创作一首关于春天的歌曲"}],
"stream": true
}'音乐生成流程:
- 本地用
pure_signer.py签/samantha/chat/completion,发送content_type=2005音乐 skill 输入 message.ext.input_skill.variables必须使用豆包 skill pack 的英文值,例如genre=Pop、mood=Happy、gender=Female、generation_type=AI_lyric- SSE 返回
content_type=2006音乐卡片,里面包含歌词、封面、音频video_model等字段 - Web 界面自动显示音频播放器(封面+标题+时长+播放控件),并记录真实
conversation_id供删除上游会话
也可直接调用音乐 API:
# 生成音乐
curl -X POST http://localhost:8765/v1/music/generate \
-H "Content-Type: application/json" \
-d '{"prompt":"一首快乐的流行歌曲","style":"流行","mood":"快乐","voice":"女声"}'
# 查询状态
curl http://localhost:8765/v1/music/status/{task_id}
# 获取音频URL
curl http://localhost:8765/v1/music/audio/{task_id}系统优先直接调用豆包网页当前使用的 IM 接口获取对话数据;只有直接请求失败时,才回退到浏览器拦截方案:
- 抓取对话列表 —
POST /im/chain/recent_conv - 读取对话信息 —
POST /im/conversation/info - 导出单个对话消息 —
POST /im/chain/single - 下载媒体文件 — 自动下载对话中的图片、音频、视频到本地
exports/media/目录 - 保存为 JSON — 导出结果保存到
exports/{conversation_id}.json
# 获取对话列表
curl http://localhost:8765/v1/doubao/conversations
# 导出指定对话(含媒体下载)
curl http://localhost:8765/v1/doubao/conversations/{conversation_id}/export聊天补全接口 /samantha/chat/completion 默认使用 sign_method=pure 生成 a_bogus。浏览器实测发现:对话列表/历史消息已不再走旧文档里的 /samantha/chat/conversation/list、/samantha/chat/conversation/message/list,而是走 /im/* 协议接口;这些 IM 接口携带登录 Cookie 和设备参数即可直接请求,不需要浏览器常驻。
导出流程采用 直接 IM 请求优先 + 浏览器降级 策略:
- 直接 IM 请求:
im_api.py使用aiohttp请求/im/chain/recent_conv、/im/conversation/info、/im/chain/single - 浏览器降级:直接请求失败时,
exporter.py才使用 CloakBrowser/Playwright 拦截网页请求
工作流程:
1. 从 Cookie 池中选择有效账号(检查 sid_guard 过期时间)
2. 直接请求 /im/chain/recent_conv 获取对话列表
3. 直接请求 /im/conversation/info 获取标题/参与者信息
4. 直接请求 /im/chain/single 获取消息链
5. 解析响应数据,提取对话/消息/用户信息
6. 如直接请求失败,再启动 CloakBrowser/Playwright 作为降级
可选配置:
{
"export_page_size": 50,
"export_max_pages": 50
}{
"conversation_id": "7xxxxxxxxxx",
"messages": [
{
"message_id": "msg_xxx",
"role": "user",
"content_type": 10000,
"created_at": 1715731200,
"text": "你好",
"images": [],
"audio_url": null,
"video_url": null
},
{
"message_id": "msg_yyy",
"role": "assistant",
"content_type": 2006,
"text": "春暖人间烂漫\n\n(歌词...)",
"images": ["exports/media/conv_id/msg_yyy_img0.jpg"],
"audio_url": "exports/media/conv_id/msg_yyy_audio.mp3",
"video_url": null
}
],
"message_count": 2,
"exported_at": 1715731200.0
}Web 管理面板支持:
- 导出本地对话:将系统中的对话导出为 JSON 或 JSONL 格式
- 导入对话文件:导入 JSON/JSONL 格式的对话文件,自动去重
doubao-api/
├── main.py # FastAPI 入口 + 路由注册
├── config.py # 读取 config.json/accounts.json、Cookie 池、日志目录
├── config.example.json # 配置模板;复制为 config.json 后填入登录态/设备参数
├── config.json # 本地敏感配置(git 忽略,不提交)
├── accounts.json # 多账号池配置(可选,git 忽略)
├── requirements.txt # 当前 pure 签名 + 直接 HTTP 主路径最小依赖
├── requirements-browser.txt # 可选浏览器兜底依赖
├── models.py # 请求/响应模型 + 豆包模型映射
├── sse.py # 豆包 SSE 解析 + OpenAI SSE 格式化
├── openai_api.py # OpenAI 兼容 /v1/chat/completions 主逻辑
├── anthropic_api.py # Anthropic 兼容 /v1/messages 主逻辑
├── pure_signer.py # Python 原生 a_bogus 签名(默认 pure 模式)
├── im_api.py # 豆包 IM 直连接口(对话列表/详情/消息)
├── exporter.py # 对话导出(IM 直连优先 + 浏览器降级 + 媒体下载)
├── uploader.py # 图片上传模块(ImageX 4 步流程)
├── signer.py # Playwright 签名模块(B2 实验性/不推荐)
├── storage.py # SQLite 本地会话存储
├── music.py # 音乐生成模块
├── podcast.py # 播客生成模块
├── volcengine_tts.py # 火山引擎 TTS WebSocket 客户端
├── index.html # Web 管理面板
├── run-server.bat # Windows 启动脚本
├── README.md # 项目说明
├── .gitignore # 忽略敏感配置与运行产物
├── docs/
│ └── reverse-engineering-report.md
├── data/ # 自动生成;SQLite/播客等数据(git 忽略)
├── conversations/ # 自动生成;对话状态/日志(git 忽略)
├── logs/ # 自动生成;运行日志(git 忽略)
├── exports/ # 自动生成;导出的对话与媒体(git 忽略)
├── media/ # 自动生成;音频缓存(git 忽略)
└── temp/ # 可选;本地临时调试目录(git 忽略)
配置最小示例:
{
"cookie": "YOUR_COOKIE_HERE",
"device_id": "YOUR_DEVICE_ID_HERE",
"web_id": "YOUR_WEB_ID_HERE",
"tea_uuid": "YOUR_TEA_UUID_HERE",
"api_base": "https://www.doubao.com",
"sign_method": "pure",
"server_host": "0.0.0.0",
"server_port": 8765
}默认使用 Python 原生 pure 签名方案,由 pure_signer.py 生成 a_bogus;B3/x-flow-trace 仅作为历史兼容/回退分支:
- 从豆包网页版准备 Cookie 和设备参数
- 序列化请求体,并通过
pure_signer.py为/samantha/chat/completion生成a_bogus - 调用豆包
/samantha/chat/completionAPI;如果 pure 签名生成失败,再退回 B3 参数直连 - 将三层嵌套 SSE 响应转换为 OpenAI 标准格式
| 方案 | 方法 | 结果 | 原因 |
|---|---|---|---|
| pure | Python 原生 a_bogus | ✅ 默认 | 调用 pure_signer.py 原生生成 172/176 字符长 a_bogus |
| B3 | x-flow-trace 绕过 | ✅ 兼容 | 不依赖 a_bogus,作为历史兼容分支保留 |
| B2 | Playwright 生成 X-Bogus | ❌ 不推荐 | 触发服务端浏览器指纹验证,且依赖浏览器 |
启用纯算签名:
{
"sign_method": "pure"
}pure 模式默认走 Python 原生签名,不需要 Node、浏览器、Playwright、CloakBrowser、JS 文件或 JSRPC。
1. prepare_upload → 获取 AWS 临时凭证
2. ApplyImageUpload → 获取 TOS 存储地址
3. Upload Binary → 上传图片二进制 (CRC32 校验)
4. CommitImageUpload → 确认上传,获取 ImageUri
| 业务 | 主路径 | 签名/接口失败后的降级 |
|---|---|---|
| 聊天 | pure_signer.py 签 /samantha/chat/completion |
B3 参数直连降级;再按账号池重试 |
| 图片生成 | 复用聊天 call_doubao_api() |
B3 参数直连降级;再按账号池重试 |
| 音乐生成 | pure_signer.py 签 /samantha/chat/completion |
pure 签名失败 → B3 参数直连;请求/空响应失败 → 账号池重试;最后才按 enable_browser_fallback=true 允许浏览器兜底 |
| 播客生成 | pure_signer.py 签 /samantha/chat/completion |
pure 签名失败 → B3 参数直连;脚本有结果但无音频 → 聊天触发音频/TTS;最后才按 enable_browser_fallback=true 允许浏览器兜底 |
| 上传 | /alice/resource/prepare_upload + ImageX |
不依赖 a_bogus;失败按上传错误处理 |
| IM/会话删除 | /im/* |
不依赖 a_bogus;失败按接口错误处理 |
降级不等于都走浏览器:所有 /samantha/chat/completion 业务都先走 pure 签名;pure 生成失败时先退回 B3 参数直连。音乐/播客即使开启 enable_browser_fallback=true,也只是在非浏览器兜底失败后才走浏览器,避免缺 Playwright/CloakBrowser 时覆盖真实 API 错误。
| 业务 | 本地入口 | 上游接口 | 是否需要 a_bogus |
当前实现 |
|---|---|---|---|---|
| 聊天 | /v1/chat/completions、/v1/messages |
/samantha/chat/completion |
是 | openai_api.py -> pure_signer.py |
| 图片生成 | /v1/images/generations |
/samantha/chat/completion |
是 | 复用 call_doubao_api(),走 pure_signer.py |
| 音乐生成 | /v1/music/generate |
/samantha/chat/completion |
是 | music.py -> pure_signer.py;pure 失败后 B3,浏览器兜底默认关闭 |
| 播客生成 | /v1/podcast/generate |
/samantha/chat/completion |
是 | podcast.py -> pure_signer.py;pure 失败后 B3,音频阶段可退 TTS,浏览器兜底默认关闭 |
| 图片/文件上传准备 | /v1/images/upload、/v1/podcast/upload |
/alice/resource/prepare_upload |
否 | Cookie + 设备参数即可;后续 ImageX 走 AWS4Auth |
| 对话列表 | /v1/doubao/conversations |
/im/chain/recent_conv |
否 | im_api.py 直连 |
| 对话信息 | 导出流程内部 | /im/conversation/info |
否 | im_api.py 直连 |
| 消息链 | /v1/doubao/conversations/{id}/export |
/im/chain/single |
否 | im_api.py 直连 |
| 会话删除 | /v1/conversations/{id} |
/im/conversation/batch_del_user_conv |
否 | openai_api.py -> im_api.py |
| 账号新增/删除 | /accounts、/accounts/{name} |
无上游请求 | 否 | 只改本地 accounts.json/内存池 |
| 本地会话创建/删除 | /api/conversations* |
无上游请求 | 否 | 只改本地 SQLite |
| 用户偏好 | 手动验证/内部调用 | /samantha/user/preference/get |
否 | im_api.py::user_preference() |
判断规则:只要业务最终打 /samantha/chat/completion,主路径就走 pure_signer.py 生成 a_bogus;如果 pure 签名生成失败,退回 B3 参数直连。/im/*、账号池、本地 SQLite、上传准备接口不需要。
项目不再保留独立测试脚本。常用手动验证命令如下:
# 健康检查
curl http://localhost:8765/health
# 模型列表
curl http://localhost:8765/v1/models
# 非流式聊天
curl -X POST http://localhost:8765/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"doubao-pro-chat","messages":[{"role":"user","content":"只回复 OK"}]}'
# 音乐风格列表
curl http://localhost:8765/v1/music/styles
# 本地会话列表
curl http://localhost:8765/api/conversations
# 豆包网页 IM 对话列表
curl http://localhost:8765/v1/doubao/conversations需要测试上游 /samantha/chat/completion、音乐、播客、图片生成这类会创建网页会话或媒体任务的接口时,测试后要手动删除对应会话,避免污染账号历史。
Cookie 有效期约 30 天。过期后重新登录豆包网页版,并把新的 www.doubao.com Cookie 更新到 config.json 即可。
- 仅供学习研究,请勿用于商业用途
- Cookie 属于敏感信息,请勿泄露(
config.json已加入 .gitignore) - 豆包 API 可能随时变更,导致服务失效
- 建议不要高频调用,以免触发风控
MIT