AIClient-2-API/src/providers/forward/forward-strategy.js
hex2077 a069feea71 feat: 新增系统提示词内容替换功能并重构常量定义
- 新增 SYSTEM_PROMPT_REPLACEMENTS 配置项,支持在系统提示词中执行顺序内容替换
- 将 MODEL_PROVIDER 等常量从 common.js 迁移到独立的 constants.js 文件
- 为所有提供商策略(OpenAI、Claude、Gemini、Grok、Forward、Codex Responses)添加系统提示词替换支持
- 更新 UI 配置界面,添加替换规则管理功能
- 更新 Grok 提供商模型列表至 4.20 版本
2026-04-07 00:04:00 +08:00

84 lines
3.1 KiB
JavaScript

import { ProviderStrategy } from '../../utils/provider-strategy.js';
import logger from '../../utils/logger.js';
import { extractSystemPromptFromRequestBody, MODEL_PROTOCOL_PREFIX } from '../../utils/common.js';
import { applySystemPromptReplacements } from '../../converters/utils.js';
/**
* Forward provider strategy implementation.
* Designed to be as transparent as possible.
*/
class ForwardStrategy extends ProviderStrategy {
extractModelAndStreamInfo(req, requestBody) {
const model = requestBody.model || 'default';
const isStream = requestBody.stream === true;
return { model, isStream };
}
extractResponseText(response) {
// Attempt to extract text using common patterns (OpenAI, Claude, etc.)
if (response.choices && response.choices.length > 0) {
const choice = response.choices[0];
if (choice.message && choice.message.content) {
return choice.message.content;
} else if (choice.delta && choice.delta.content) {
return choice.delta.content;
}
}
if (response.content && Array.isArray(response.content)) {
return response.content.map(c => c.text || '').join('');
}
return '';
}
extractPromptText(requestBody) {
if (requestBody.messages && requestBody.messages.length > 0) {
const lastMessage = requestBody.messages[requestBody.messages.length - 1];
let content = lastMessage.content;
if (typeof content === 'object' && content !== null) {
return JSON.stringify(content);
}
return content;
}
return '';
}
async applySystemPromptFromFile(config, requestBody) {
if (!config.SYSTEM_PROMPT_FILE_PATH) {
return requestBody;
}
const filePromptContent = config.SYSTEM_PROMPT_CONTENT;
if (filePromptContent === null) {
return requestBody;
}
const existingSystemText = extractSystemPromptFromRequestBody(requestBody, MODEL_PROTOCOL_PREFIX.OPENAI);
const newSystemText = config.SYSTEM_PROMPT_MODE === 'append' && existingSystemText
? `${existingSystemText}\n${filePromptContent}`
: filePromptContent;
// Apply system prompt replacements
const finalSystemText = applySystemPromptReplacements(newSystemText, config.SYSTEM_PROMPT_REPLACEMENTS);
if (!requestBody.messages) {
requestBody.messages = [];
}
const systemMessageIndex = requestBody.messages.findIndex(m => m.role === 'system');
if (systemMessageIndex !== -1) {
requestBody.messages[systemMessageIndex].content = finalSystemText;
} else {
requestBody.messages.unshift({ role: 'system', content: finalSystemText });
}
logger.info(`[System Prompt] Applied system prompt from ${config.SYSTEM_PROMPT_FILE_PATH} in '${config.SYSTEM_PROMPT_MODE}' mode for provider 'forward'.`);
return requestBody;
}
async manageSystemPrompt(requestBody) {
// No-op for transparency
}
}
export { ForwardStrategy };