SillyTavern AI 后端集成系统分析
1. AI 后端架构概述
SillyTavern 采用模块化架构支持多种 AI 后端,主要分为两大类:
- Chat Completions API: 基于消息列表的聊天式 API
- Text Completions API: 基于文本补全的生成式 API
1.1 架构组件图 (Mermaid)
2. 支持的 AI 后端列表
2.1 Chat Completion 后端
| 后端名称 | 源标识 | API 端点 | 密钥类型 | 特殊功能 |
|---|---|---|---|---|
| OpenAI | openai | api.openai.com/v1 | OPENAI | GPT-4, GPT-3.5, DALL-E, TTS, Whisper |
| Claude | claude | api.anthropic.com/v1 | CLAUDE | 原生 System Prompt, 工具调用, 缓存 |
| OpenRouter | openrouter | openrouter.ai/api/v1 | OPENROUTER | 多模型聚合, 自动回退 |
| Google Gemini | makersuite | generativelanguage.googleapis.com | MAKERSUITE | 多模态, Vertex AI 支持 |
| Mistral AI | mistralai | api.mistral.ai/v1 | MISTRALAI | 欧洲模型, JSON Schema |
| Cohere | cohere | api.cohere.ai/v2 | COHERE | Command 系列模型 |
| DeepSeek | deepseek | api.deepseek.com/beta | DEEPSEEK | Reasoner 模型, 中文优化 |
| xAI (Grok) | xai | api.x.ai/v1 | XAI | Grok 系列, X 平台集成 |
| AI21 | ai21 | api.ai21.com/studio/v1 | AI21 | Jurassic 系列 |
| Perplexity | perplexity | api.perplexity.ai | PERPLEXITY | 带引用的搜索 |
| Groq | groq | api.groq.com/openai/v1 | GROQ | 高速推理 |
| Azure OpenAI | azure_openai | {base_url}/deployments | AZURE_OPENAI | 企业部署 |
| Chutes | chutes | llm.chutes.ai/v1 | CHUTES | 去中心化推理 |
| ElectronHub | electronhub | api.electronhub.ai/v1 | ELECTRONHUB | 多提供商聚合 |
| NanoGPT | nanogpt | nano-gpt.com/api/v1 | NANOGPT | 轻量级 |
| Moonshot | moonshot | api.moonshot.ai/v1 | MOONSHOT | 中文模型 |
| Fireworks | fireworks | api.fireworks.ai/inference/v1 | FIREWORKS | 高速推理 |
| AIMLAPI | aimlapi | api.aimlapi.com/v1 | AIMLAPI | 统一接口 |
| Pollinations | pollinations | text.pollinations.ai | 无需密钥 | 免费推理 |
| Z.AI | zai | api.z.ai/api/paas/v4 | ZAI | 360 智脑 |
| SiliconFlow | siliconflow | api.siliconflow.com/v1 | SILICONFLOW | 硅基流动 |
| CometAPI | cometapi | api.cometapi.com/v1 | COMETAPI | (暂时禁用) |
2.2 Text Completion 后端
| 后端名称 | 类型标识 | 特点 | 端点 |
|---|---|---|---|
| Kobold/KoboldCPP | koboldcpp | 经典本地推理 | /v1/generate |
| Ollama | ollama | 本地模型管理 | /api/generate |
| llama.cpp | llamacpp | 高性能本地推理 | /completion |
| TabbyAPI | tabby | 优化的本地 API | /v1/completions |
| Text Generation WebUI | ooba | Gradio 界面 | /v1/completions |
| vLLM | vllm | 高吞吐服务 | /v1/completions |
| Aphrodite | aphrodite | 优化推理 | /v1/completions |
| Together AI | togetherai | 云端服务 | /v1/completions |
| Mancer | mancer | 特定服务 | /oai/v1/completions |
| InfermaticAI | infermaticai | 推理服务 | /v1/completions |
| DreamGen | dreamgen | 创意生成 | /api/openai/v1/completions |
| Featherless | featherless | 轻量级 | /v1/completions |
| HuggingFace | huggingface | 模型托管 | /info |
| Generic | generic | 通用 OpenAI 兼容 | /v1/completions |
2.3 其他 AI 服务
| 服务类型 | 支持的提供商 | 说明 |
|---|---|---|
| 图像生成 | OpenAI DALL-E, Stable Diffusion, BFL, Fal.ai | 文生图 |
| 语音合成 (TTS) | OpenAI, ElevenLabs, ElectronHub, Chutes | 文本转语音 |
| 语音识别 | OpenAI Whisper, Groq, Mistral, Z.AI, Chutes | 语音转文本 |
| 视频生成 | OpenAI Sora | 文生视频 |
| 图像理解 | OpenAI GPT-4V, Claude, Gemini, Mistral, 等 | 视觉问答 |
3. Prompt 转换系统详解
3.1 转换流程
3.2 核心转换函数
3.2.1 convertClaudeMessages (Claude/Anthropic)
功能: 将 ChatML 格式转换为 Claude Messages API 格式
关键转换:
- 提取 System Prompt 到独立的
system字段 - 合并连续相同角色的消息
- 转换 Tool Calls 为
tool_use/tool_result格式 - 处理图像数据为 base64 inlineData
- 支持 Assistant Prefill (前缀引导)
代码示例:
// 输入: OpenAI 格式消息
[
{ role: 'system', content: 'You are a helpful assistant' },
{ role: 'user', content: 'Hello' },
{ role: 'assistant', content: 'Hi there!' }
]
// 输出: Claude 格式
{
system: [{ type: 'text', text: 'You are a helpful assistant' }],
messages: [
{ role: 'user', content: [{ type: 'text', text: 'Hello' }] },
{ role: 'assistant', content: [{ type: 'text', text: 'Hi there!' }] }
]
}
3.2.2 convertGooglePrompt (Gemini)
功能: 转换为 Google Gemini API 格式
关键转换:
- 分离 System Instruction 和 Contents
- 角色映射:
assistant->model,system/tool->user - 支持多模态内容 (text, image, video, audio)
- Function Calling 转换
- 支持 Gemini 3 的 Thought Signatures
特殊处理:
// 图像数据转换
{
type: 'image_url',
image_url: { url: 'data:image/png;base64,...' }
}
// 转换为
{
inlineData: {
mimeType: 'image/png',
data: '...'
}
}
3.2.3 convertMistralMessages (Mistral AI)
功能: Mistral AI 特定转换
关键特性:
- Tool ID 哈希化 (SHA512 截断)
- Assistant Prefix 支持
- 消息名称处理 (example_user/example_assistant)
3.2.4 convertCohereMessages (Cohere)
功能: Cohere API 格式转换
关键特性:
- Chat History 格式
- Tool Calls 引导消息处理
- 消息名称前缀添加
3.2.5 mergeMessages (通用合并)
功能: 通用消息处理和合并
处理类型 (PROMPT_PROCESSING_TYPE):
MERGE: 宽松合并, 保留所有内容MERGE_TOOLS: 合并并保留工具调用SEMI: 严格合并, 处理系统消息SEMI_TOOLS: 严格合并 + 工具支持STRICT: 严格模式, 强制交替角色STRICT_TOOLS: 严格模式 + 工具SINGLE: 单角色模式 (全部转为 user)
通用处理逻辑:
- 消息内容扁平化 (处理多模态数组)
- 名称前缀添加 (处理 example_user/example_assistant)
- 连续相同角色消息合并
- 系统消息位置调整
- 图像/音频 Token 替换与恢复
3.3 Prompt 后处理流程
3.4 Prompt Caching 支持
SillyTavern 实现了智能的 Prompt Caching 机制:
Claude Caching:
// 在指定深度添加 cache_control
function cachingAtDepthForClaude(messages, depth, ttl) {
// 从后往前遍历,跳过 Prefill
// 在指定深度的用户消息添加缓存标记
messages[i].content[content.length - 1].cache_control = {
type: 'ephemeral',
ttl: ttl // '5m' 或 '1h'
};
}
OpenRouter Caching:
- 支持 Claude 模型的缓存
- 支持 Gemini 模型的缓存 (需要模型支持)
- 自动检测可缓存模型
4. API 请求流程详解
4.1 请求处理流程图
4.2 关键代码流程
4.2.1 Chat Completions 请求处理
// src/endpoints/backends/chat-completions.js
router.post('/generate', async function (request, response) {
// 1. 应用自定义 Prompt 后处理
const postProcessingType = request.body.custom_prompt_post_processing;
if (postProcessingType) {
request.body.messages = postProcessPrompt(
request.body.messages,
postProcessingType,
getPromptNames(request)
);
}
// 2. 根据源选择处理器
switch (request.body.chat_completion_source) {
case CHAT_COMPLETION_SOURCES.CLAUDE:
return await sendClaudeRequest(request, response);
case CHAT_COMPLETION_SOURCES.MAKERSUITE:
return await sendMakerSuiteRequest(request, response);
// ... 其他后端
}
// 3. 通用 OpenAI 兼容处理
// 构建请求体,添加参数,发送请求
const requestBody = {
messages: request.body.messages,
model: request.body.model,
temperature: request.body.temperature,
max_tokens: request.body.max_tokens,
stream: request.body.stream,
// ... 其他参数
};
const fetchResponse = await fetch(endpointUrl, {
method: 'post',
headers: { 'Authorization': 'Bearer ' + apiKey },
body: JSON.stringify(requestBody),
signal: controller.signal,
});
// 4. 流式或非流式响应处理
if (request.body.stream) {
return forwardFetchResponse(fetchResponse, response);
} else {
const json = await fetchResponse.json();
return response.send(json);
}
});
4.2.2 流式响应转发
// src/util.js
export function forwardFetchResponse(fetchResponse, expressResponse) {
// 设置响应头
expressResponse.setHeader('Content-Type', 'text/event-stream');
// 管道传输
fetchResponse.body.pipe(expressResponse);
// 错误处理
fetchResponse.body.on('error', (error) => {
console.error('Streaming error:', error);
expressResponse.end();
});
}
4.3 请求取消机制
使用 AbortController 实现请求取消:
const controller = new AbortController();
// 客户端断开连接时取消
request.socket.removeAllListeners('close');
request.socket.on('close', function () {
controller.abort();
});
// 用于 fetch 请求
fetch(url, { signal: controller.signal });
5. 配置和密钥管理
5.1 Secrets 管理系统
5.2 密钥类型定义
文件: src/endpoints/secrets.js
export const SECRET_KEYS = {
// OpenAI 兼容
OPENAI: 'api_key_openai',
OPENROUTER: 'api_key_openrouter',
MISTRALAI: 'api_key_mistralai',
COHERE: 'api_key_cohere',
DEEPSEEK: 'api_key_deepseek',
XAI: 'api_key_xai',
GROQ: 'api_key_groq',
FIREWORKS: 'api_key_fireworks',
AZURE_OPENAI: 'api_key_azure_openai',
// Claude/Anthropic
CLAUDE: 'api_key_claude',
// Google
MAKERSUITE: 'api_key_makersuite',
VERTEXAI: 'api_key_vertexai',
VERTEXAI_SERVICE_ACCOUNT: 'vertexai_service_account_json',
// 本地/自托管
KOBOLDCPP: 'api_key_koboldcpp',
LLAMACPP: 'api_key_llamacpp',
VLLM: 'api_key_vllm',
APHRODITE: 'api_key_aphrodite',
TABBY: 'api_key_tabby',
// 其他云服务
CHUTES: 'api_key_chutes',
ELECTRONHUB: 'api_key_electronhub',
NANOGPT: 'api_key_nanogpt',
MOONSHOT: 'api_key_moonshot',
AIMLAPI: 'api_key_aimlapi',
COMETAPI: 'api_key_cometapi',
ZAI: 'api_key_zai',
SILICONFLOW: 'api_key_siliconflow',
// 图像/语音/其他
STABILITY: 'api_key_stability',
BFL: 'api_key_bfl',
FALAI: 'api_key_falai',
ELEVENLABS: 'api_key_elevenlabs',
AZURE_TTS: 'api_key_azure_tts',
// 翻译/搜索
DEEPL: 'deepl',
LIBRE: 'libre',
SERPAPI: 'api_key_serpapi',
TAVILY: 'api_key_tavily',
SERPER: 'api_key_serper',
// NovelAI/其他
NOVEL: 'api_key_novel',
HORDE: 'api_key_horde',
};
5.3 SecretManager 类功能
| 方法 | 功能 |
|---|---|
writeSecret(key, value, label) | 写入新密钥,自动激活 |
readSecret(key, id?) | 读取密钥值,支持按 ID 读取 |
deleteSecret(key, id?) | 删除指定密钥 |
rotateSecret(key, id) | 切换激活的密钥 |
renameSecret(key, id, label) | 重命名密钥标签 |
getSecretState() | 获取所有密钥状态(脱敏) |
getAllSecrets() | 获取所有密钥(原始值) |
migrateFlatSecrets() | 从旧版格式迁移 |
5.4 配置文件支持
config.yaml 相关配置:
# Claude 缓存配置
claude:
enableSystemPromptCache: true
cachingAtDepth: 4
extendedTTL: false # true = 1h, false = 5m
# Gemini 配置
gemini:
apiVersion: v1beta
enableSystemPromptCache: true
# OpenAI 配置
openai:
randomizeUserId: false
captionSystemPrompt: "Describe this image in detail"
# Ollama 配置
ollama:
keepAlive: -1
batchSize: 512
# 安全设置
allowKeysExposure: false # 是否允许暴露密钥
5.5 密钥安全特性
- 多重密钥支持: 每个后端可配置多个密钥,支持轮换
- 密钥脱敏显示: 默认隐藏密钥,仅显示后 3 位
- 激活机制: 同一时间只有一个密钥处于激活状态
- UUID 标识: 每个密钥有唯一 ID,便于管理
- 迁移支持: 自动从旧版平面格式迁移
6. 扩展功能支持
6.1 多模态支持
6.2 工具调用 (Function Calling)
支持的 Backend:
- OpenAI (GPT-4, GPT-3.5)
- Claude (3.5 Sonnet, 3 Opus, 3.7 Sonnet)
- Gemini (1.5 Pro, 2.0 Flash)
- Mistral (Large)
- Groq
- OpenRouter
6.3 JSON Schema / 结构化输出
支持的 Backend:
- OpenAI (response_format: json_schema)
- OpenRouter
- Groq
- Mistral
- Fireworks
- Azure OpenAI
- Cohere
- Chutes
- DeepSeek
7. 后端特定特性
7.1 Claude 特有功能
| 功能 | 说明 |
|---|---|
| Thinking | 推理模式 (claude-3-7-sonnet+) |
| Web Search | 内置网页搜索 |
| Extended Output | 128K 输出 |
| Prompt Caching | 系统提示和工具缓存 |
| Extended TTL | 1 小时缓存有效期 |
7.2 Gemini 特有功能
| 功能 | 说明 |
|---|---|
| Google Search | 内置搜索工具 |
| Image Generation | 原生图像生成 |
| Thinking Config | 推理预算配置 |
| Vertex AI | 企业级部署支持 |
| Safety Settings | 可关闭安全过滤 |
7.3 OpenRouter 特有功能
| 功能 | 说明 |
|---|---|
| Provider Routing | 提供商优先级 |
| Model Fallbacks | 自动回退 |
| Reasoning | 推理内容包含 |
| Middle-out | 上下文压缩 |
| Web Search Plugin | 网页搜索插件 |
8. 常量定义
文件: src/constants.js
8.1 Chat Completion 源标识
export const CHAT_COMPLETION_SOURCES = {
OPENAI: 'openai',
CLAUDE: 'claude',
OPENROUTER: 'openrouter',
AI21: 'ai21',
MAKERSUITE: 'makersuite',
VERTEXAI: 'vertexai',
MISTRALAI: 'mistralai',
CUSTOM: 'custom',
COHERE: 'cohere',
PERPLEXITY: 'perplexity',
GROQ: 'groq',
CHUTES: 'chutes',
ELECTRONHUB: 'electronhub',
NANOGPT: 'nanogpt',
DEEPSEEK: 'deepseek',
AIMLAPI: 'aimlapi',
XAI: 'xai',
POLLINATIONS: 'pollinations',
MOONSHOT: 'moonshot',
FIREWORKS: 'fireworks',
COMETAPI: 'cometapi',
AZURE_OPENAI: 'azure_openai',
ZAI: 'zai',
SILICONFLOW: 'siliconflow',
};
8.2 Text Generation 类型
export const TEXTGEN_TYPES = {
OOBA: 'ooba',
MANCER: 'mancer',
VLLM: 'vllm',
APHRODITE: 'aphrodite',
TABBY: 'tabby',
KOBOLDCPP: 'koboldcpp',
TOGETHERAI: 'togetherai',
LLAMACPP: 'llamacpp',
OLLAMA: 'ollama',
INFERMATICAI: 'infermaticai',
DREAMGEN: 'dreamgen',
OPENROUTER: 'openrouter',
FEATHERLESS: 'featherless',
HUGGINGFACE: 'huggingface',
GENERIC: 'generic',
};
9. 总结
SillyTavern 的 AI 后端集成系统设计精巧,具有以下特点:
- 高度模块化: 每个后端独立实现,便于扩展
- 统一接口: 前端使用统一格式,后端负责转换
- 丰富的转换器: 支持 20+ 种后端的 Prompt 格式转换
- 完善的密钥管理: 支持多密钥、轮换、脱敏显示
- 流式响应: 原生支持 SSE 流式传输
- 多模态支持: 图像、视频、音频的统一处理
- 工具调用: 跨后端的 Function Calling 支持
- 缓存优化: 智能的 Prompt Caching 机制
该系统使得 SillyTavern 能够无缝集成市面上绝大多数的 AI 服务,为用户提供统一的使用体验。