AIClient-2-API/src/gemini/gemini-strategy.js
hex2077 5f0cd6ad83 feat(docker): 添加Docker支持和部署指南
新增Dockerfile、.dockerignore和健康检查脚本,支持通过Docker部署服务。添加了详细的部署文档和自动化脚本,便于在不同环境下快速启动和配置服务。同时优化了系统提示词应用逻辑,移除了调试日志输出。
2025-07-30 19:46:12 +08:00

69 lines
2.8 KiB
JavaScript

import { API_ACTIONS, extractSystemPromptFromRequestBody, MODEL_PROTOCOL_PREFIX } from '../common.js';
import { ProviderStrategy } from '../provider-strategy.js';
/**
* Gemini provider strategy implementation.
*/
class GeminiStrategy extends ProviderStrategy {
extractModelAndStreamInfo(req, requestBody) {
const requestUrl = new URL(req.url, `http://${req.headers.host}`);
const urlPattern = new RegExp(`/v1beta/models/(.+?):(${API_ACTIONS.GENERATE_CONTENT}|${API_ACTIONS.STREAM_GENERATE_CONTENT})`);
const urlMatch = requestUrl.pathname.match(urlPattern);
const [, urlmodel, action] = urlMatch;
const model = urlmodel;
const isStream = action === API_ACTIONS.STREAM_GENERATE_CONTENT;
return { model, isStream };
}
extractResponseText(response) {
if (response.candidates && response.candidates.length > 0) {
const candidate = response.candidates[0];
if (candidate.content && candidate.content.parts && candidate.content.parts.length > 0) {
return candidate.content.parts.map(part => part.text).join('');
}
}
return '';
}
extractPromptText(requestBody) {
if (requestBody.contents && requestBody.contents.length > 0) {
const lastContent = requestBody.contents[requestBody.contents.length - 1];
if (lastContent.parts && lastContent.parts.length > 0) {
return lastContent.parts.map(part => part.text).join('');
}
}
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.GEMINI);
const newSystemText = config.SYSTEM_PROMPT_MODE === 'append' && existingSystemText
? `${existingSystemText}\n${filePromptContent}`
: filePromptContent;
requestBody.systemInstruction = { parts: [{ text: newSystemText }] };
if (requestBody.system_instruction) {
delete requestBody.system_instruction;
}
console.log(`[System Prompt] Applied system prompt from ${config.SYSTEM_PROMPT_FILE_PATH} in '${config.SYSTEM_PROMPT_MODE}' mode for provider 'gemini'.`);
return requestBody;
}
async manageSystemPrompt(requestBody) {
const incomingSystemText = extractSystemPromptFromRequestBody(requestBody, MODEL_PROTOCOL_PREFIX.GEMINI);
await this._updateSystemPromptFile(incomingSystemText, MODEL_PROTOCOL_PREFIX.GEMINI);
}
}
export { GeminiStrategy };