CodeBot Wiki 是一款基于大语言模型的智能文档生成工具,能够自动解析项目代码,生成结构清晰、内容专业的项目 Wiki。它不仅覆盖项目概览、核心模块、关键逻辑等信息,还支持交互式理解,更适合团队协作与持续迭代,是理解开源项目或内部系统的理想助手!

本期解读项目地址:https://github.com/linshenkx/prompt-optimizer
项目概览
Prompt Optimizer 是一款旨在提升 AI 提示质量的强大工具,支持多种使用方式,包括网页应用、桌面应用、Chrome 扩展以及 Docker 部署。其核心功能包括智能优化、双模式优化、比较测试、多模型集成、安全架构、多平台支持、访问控制以及 MCP 协议支持。
核心功能
智能优化
提供一键式提示优化服务,通过多轮迭代改进增强 AI 回答的准确性。
双模式优化
支持系统提示和用户提示优化,以适应不同场景。
比较测试
实时对比原始和优化后的提示,直观展示优化效果。
多模型集成
支持主流 AI 模型,如 OpenAI、Gemini、DeepSeek、Zhipu AI、SiliconFlow 等。
安全架构
纯客户端处理,直接与 AI 服务提供商进行数据交互,避免中间服务器介入。
多平台支持
提供网页应用、桌面应用、Chrome 扩展以及 Docker 部署选项。
访问控制
通过密码保护实现安全部署。
MCP 协议支持
支持 Model Context Protocol (MCP),允许与兼容的 AI 应用程序(如 Claude Desktop)集成。
项目结构与技术细节
MCP Server
负责处理模型相关的请求,支持多种模型提供者(如 OpenAI、Gemini 等)。
前端应用
基于现代前端框架构建,支持多平台部署,包括网页应用、桌面应用和 Chrome 扩展。
后端服务
通过 Docker 部署,支持与 web 应用程序共存,并提供 /mcp
路径访问 MCP 服务。
工具
提供 optimize-user-prompt
、optimize-system-prompt
和 iterate-prompt
工具,分别用于优化用户提示、系统提示以及迭代改进成熟的提示。
开发与维护
开发命令
提供了本地开发的命令,包括克隆仓库、安装依赖项以及启动开发服务器等步骤。
贡献指南
详细说明了如何为项目做出贡献,包括 Fork 仓库、创建分支、提交更改和打开合并请求等流程。
贡献者
显示了所有对该项目做出贡献的开发者名单。
许可证
该项目采用 MIT 许可证授权。
部署与配置
Docker 部署
在 Docker 中,MCP Server 可以与 web 应用程序共存,并通过 /mcp
路径访问 MCP 服务。示例展示了如何使用 Docker 运行项目,包括映射容器端口到主机以及设置环境变量。
环境变量配置
通过 .env.local
文件设置环境变量,如 OpenAI API、Gemini API 和其他自定义 API 的密钥,支持多 API 的集成。
访问控制
通过密码保护实现安全部署。
项目依赖与构建
项目依赖
项目依赖包括 @vue/reactivity
、@vue/runtime-core
、@vue/i18n
等,用于实现 Vue.js 的响应式系统、国际化等功能。
构建命令
构建命令包括 build:core
、build:ui
、build:parallel
、build:web
、build:ext
、build:desktop-only
、build:desktop
,分别对应不同的构建任务,如构建核心模块、用户界面、桌面应用等。
开发命令
开发命令包括 dev
、dev:fresh
、dev:parallel
、dev:ext
、dev:desktop
、dev:desktop:fresh
、dev:desktop:parallel
,分别对应不同的开发任务,如启动开发环境、刷新整个项目、开发扩展模块等。
项目架构图

项目依赖关系图

项目部署与配置图

项目开发与维护图

项目功能与组件表
功能/组件 | 描述 |
---|---|
智能优化 | 提供一键式提示优化服务,通过多轮迭代改进增强 AI 回答的准确性 |
双模式优化 | 支持系统提示和用户提示优化,以适应不同场景 |
比较测试 | 实时对比原始和优化后的提示,直观展示优化效果 |
多模型集成 | 支持主流 AI 模型,如 OpenAI、Gemini、DeepSeek、Zhipu AI、SiliconFlow 等 |
安全架构 | 纯客户端处理,直接与 AI 服务提供商进行数据交互,避免中间服务器介入 |
多平台支持 | 提供网页应用、桌面应用、Chrome 扩展以及 Docker 部署选项 |
访问控制 | 通过密码保护实现安全部署 |
MCP 协议支持 | 支持 Model Context Protocol (MCP),允许与兼容的 AI 应用程序(如 Claude Desktop)集成 |
项目配置选项表
配置选项 | 类型 | 默认值 |
---|---|---|
VITE_OPENAI_API_KEY | string | ” |
VITE_GEMINI_API_KEY | string | ” |
MCP_DEFAULT_MODEL_PROVIDER | string | ‘openai’ |
MCP_HTTP_PORT | number | 3000 |
MCP_LOG_LEVEL | string | ‘debug’ |
ACCESS_USERNAME | string | ‘admin’ |
ACCESS_PASSWORD | string | ” |
项目数据模型字段表
字段 | 类型 | 约束 | 描述 |
---|---|---|---|
name | string | required | 项目名称 |
version | string | required | 当前版本号 |
private | boolean | required | 是否为私有项目 |
packageManager | string | required | 包管理器 |
engines | object | required | 项目支持的 Node.js 和 npm 版本 |
scripts | object | required | 构建、开发和测试命令 |
devDependencies | object | required | 开发依赖 |
dependencies | object | required | 生产依赖 |
keywords | array | required | 项目关键词 |
author | string | required | 作者信息 |
license | string | required | 许可证 |
MCP Server 架构与功能实现
MCP Server 核心功能
MCP Server 是 Prompt Optimizer 项目的一个重要组件,负责处理模型相关的请求,支持多种模型提供者(如 OpenAI、Gemini 等)。它可以通过界面设置或环境变量进行配置,并且支持与 Claude Desktop 集成。
MCP Server 配置管理
MCP Server 的配置可以通过界面设置或环境变量实现。界面配置允许用户直接在模型管理选项卡中输入 API 密钥并保存。环境变量用于 Docker 部署时指定 API 密钥。
MCP Server 模型提供者支持
MCP Server 支持多种模型提供者,包括 OpenAI、Google Gemini、DeepSeek、SiliconFlow、智谱AI 以及自定义API。通过 MCP_DEFAULT_MODEL_PROVIDER
可以指定首选的模型提供者。
MCP Server 工具接口实现
MCP Server 提供三个主要工具:optimize-user-prompt
、optimize-system-prompt
和 iterate-prompt
,分别用于优化用户提示、系统提示以及迭代改进成熟的提示。
MCP Server 与 Claude Desktop 集成
用户可以通过编辑或创建 services.json
文件,在 Claude Desktop 中添加服务配置,以便使用 Prompt Optimizer 优化提示语。需将服务 URL 指向实际部署的 MCP 服务器地址。
MCP Server 配置管理图

MCP Server 模型提供者支持图

MCP Server 工具接口实现图

MCP Server 与 Claude Desktop 集成图

Prompt Optimizer 项目通过其强大的功能和灵活的部署选项,为用户提供了一种高效的方式来优化 AI 提示,从而提高 AI 回答的准确性和质量。项目的模块化设计和详细的文档使其易于维护和扩展。MCP Server 作为项目的重要组件,提供了丰富的模型提供者支持和工具接口,使得用户可以方便地进行提示优化,并且支持与 Claude Desktop 等 AI 应用程序的集成。
核心服务模块
核心服务模块是项目中负责管理关键功能的核心组件,包括历史记录管理、大语言模型(LLM)服务和模型配置管理。这些模块通过定义清晰的接口和类型,确保系统各部分之间的高效协作和数据一致性。
历史记录管理
历史记录管理模块负责记录和管理用户与系统的交互历史,支持创建迭代链、导出导入数据等功能。
架构与组件
- HistoryManager: 核心类,负责历史记录的增删改查、链式记录管理、数据验证和错误处理。
- ElectronProxy: Electron 环境下的代理类,通过 IPC 与主进程通信,实现历史记录的远程管理。
- 错误处理: 定义了多种错误类,如
HistoryNotFoundError
、RecordNotFoundError
等,用于标识和处理历史记录相关异常。
数据结构
- PromptRecord: 包含 ID、原始提示词、优化后提示词、记录类型、链 ID、版本等字段。
- PromptRecordChain: 表示完整迭代链,包含根记录、当前记录和所有版本。
- IHistoryManager: 历史管理器接口,定义添加、获取、删除记录和链的方法。
Mermaid 图

表格
组件 | 描述 |
---|---|
HistoryManager | 核心类,负责历史记录的增删改查、链式记录管理、数据验证和错误处理 |
ElectronProxy | Electron 环境下的代理类,通过 IPC 与主进程通信,实现历史记录的远程管理 |
PromptRecord | 包含 ID、原始提示词、优化后提示词、记录类型、链 ID、版本等字段 |
PromptRecordChain | 表示完整迭代链,包含根记录、当前记录和所有版本 |
IHistoryManager | 历史管理器接口,定义添加、获取、删除记录和链的方法 |
HistoryManager 类实现
HistoryManager
类是历史记录管理的核心实现,具有以下关键特性:
- 使用
StorageAdapter
进行数据存储操作 - 通过
IModelManager
获取模型名称信息 - 实现了完整的记录管理功能,包括增删改查、链式记录管理等
关键方法包括:
addRecord
: 添加新记录,包含验证和数据补充逻辑getRecords
: 获取所有记录getRecord
: 根据ID获取特定记录deleteRecord
: 删除指定记录createNewChain
: 创建新的记录链addIteration
: 向现有链中添加迭代记录getChain
: 获取指定链的所有记录getAllChains
: 获取所有记录链exportData
和importData
: 实现数据导入导出功能
export class HistoryManager implements IHistoryManager {
private readonly storageKey = CORE_SERVICE_KEYS.PROMPT_HISTORY;
private readonly maxRecords = 50; // Maximum 50 records
private readonly storage: StorageAdapter;
private readonly modelManager: IModelManager;
constructor(storageProvider: IStorageProvider, modelManager: IModelManager) {
this.storage = new StorageAdapter(storageProvider);
this.modelManager = modelManager;
}
// ... 其他方法实现
}
ElectronHistoryManagerProxy 类
ElectronHistoryManagerProxy
是 Electron 环境下的代理类,通过 IPC 与主进程通信:
- 实现了
IHistoryManager
接口的所有方法 - 使用
safeSerializeForIPC
函数处理数据序列化,防止 Vue 响应式对象在 IPC 传递中出错 - 通过
window.electronAPI
与主进程通信
export class ElectronHistoryManagerProxy implements IHistoryManager {
private get electronAPI() {
if (!window.electronAPI) {
throw new Error('Electron API not available');
}
return window.electronAPI;
}
async addRecord(record: PromptRecord): Promise<void> {
// 自动序列化,防止Vue响应式对象IPC传递错误
const safeRecord = safeSerializeForIPC(record);
return this.electronAPI.history.addRecord(safeRecord);
}
// ... 其他方法实现
}
数据结构定义
PromptRecord 接口
定义了提示词记录的结构,包含以下关键字段:
id
: 记录IDoriginalPrompt
: 原始提示词optimizedPrompt
: 优化后的提示词type
: 记录类型(’optimize’ | ‘userOptimize’ | ‘iterate’ | ‘test’)chainId
: 所属链IDversion
: 版本号previousId
: 前一个版本ID(可选)timestamp
: 时间戳modelKey
: 使用的模型keymodelName
: 模型显示名称(可选)templateId
: 使用的提示词模板IDiterationNote
: 迭代修改说明(可选)metadata
: 元数据(包含优化模式等信息)
PromptRecordChain 接口
定义了记录链的结构:
chainId
: 链IDrootRecord
: 根记录(版本1)currentRecord
: 当前记录(最新版本)versions
: 所有版本记录的数组
错误处理机制
定义了多种错误类用于处理历史记录相关的异常情况:
HistoryError
: 基础错误类HistoryNotFoundError
: 历史记录未找到错误HistoryChainError
: 历史记录链错误RecordNotFoundError
: 记录不存在错误StorageError
: 存储错误RecordValidationError
: 记录验证错误
大语言模型(LLM)服务
LLM 服务模块负责与大语言模型进行交互,支持多种提供商(如 Gemini 和 OpenAI),提供结构化和流式消息发送功能。
架构与组件
- LLMService: 核心类,支持消息与模型配置验证、创建 API 实例、发送结构化与非结构化消息、流式消息处理、获取模型列表等。
- ElectronLLMProxy: Electron 渲染进程中的代理类,通过 IPC 与主进程通信,调用主进程方法测试连接、发送消息、获取模型列表等。
- 错误处理: 定义了多个 LLM 相关错误类,如
APIError
、ModelConfigError
等,用于区分不同错误类型并保持错误信息一致性。
数据结构
- 消息角色: 定义消息的角色,如用户、助手等。
- 响应格式: 定义响应的格式,支持结构化和流式处理。
- 流处理器: 定义流式消息的处理方式。
- 模型信息: 定义模型的基本信息,如名称、提供商等。
Mermaid 图

表格
组件 | 描述 |
---|---|
LLMService | 核心类,支持消息与模型配置验证、创建 API 实例、发送结构化与非结构化消息、流式消息处理、获取模型列表等 |
ElectronLLMProxy | Electron 渲染进程中的代理类,通过 IPC 与主进程通信,调用主进程方法测试连接、发送消息、获取模型列表等 |
消息角色 | 定义消息的角色,如用户、助手等 |
响应格式 | 定义响应的格式,支持结构化和流式处理 |
流处理器 | 定义流式消息的处理方式 |
模型信息 | 定义模型的基本信息,如名称、提供商等 |
模型配置管理
模型配置管理模块负责管理模型的配置信息,包括默认配置、环境变量加载、配置验证等。
架构与组件
- ModelManager: 核心类,负责模型配置的生命周期管理,包括初始化、添加、更新、删除、启用/禁用模型等。
- ElectronConfigManager: 单例类,用于同步主进程与渲染进程间的配置。
- ElectronProxy: Electron 环境下的代理类,通过 IPC 与主进程通信,实现模型的远程管理。
- 错误处理: 定义了多种模型相关错误类,如
ModelError
、ModelConfigError
等,用于标识和处理模型配置相关异常。
数据结构
- ModelConfig: 描述模型配置项,包括名称、URL、密钥、启用状态等。
- IModelManager: 模型管理器接口,定义模型管理器的行为,包括增删改查、启用/禁用、导出/导入等方法。
- AdvancedParameterDefinition: 定义高级参数的属性,如
id
、name
、labelKey
、descriptionKey
、type
、defaultValue
、minValue
、maxValue
、step
、unit
和appliesToProviders
。
Mermaid 图

表格
组件 | 描述 |
---|---|
ModelManager | 核心类,负责模型配置的生命周期管理,包括初始化、添加、更新、删除、启用/禁用模型等 |
ElectronConfigManager | 单例类,用于同步主进程与渲染进程间的配置 |
ElectronProxy | Electron 环境下的代理类,通过 IPC 与主进程通信,实现模型的远程管理 |
ModelConfig | 描述模型配置项,包括名称、URL、密钥、启用状态等 |
IModelManager | 模型管理器接口,定义模型管理器的行为,包括增删改查、启用/禁用、导出/导入等方法 |
AdvancedParameterDefinition | 定义高级参数的属性,如 id 、name 、labelKey 、descriptionKey 、type 、defaultValue 、minValue 、maxValue 、step 、unit 和 appliesToProviders |
结论
核心服务模块通过定义清晰的接口和类型,确保系统各部分之间的高效协作和数据一致性。历史记录管理模块支持创建迭代链、导出导入数据等功能;LLM 服务模块支持多种提供商,提供结构化和流式消息发送功能;模型配置管理模块负责管理模型的配置信息,包括默认配置、环境变量加载、配置验证等。这些模块共同构成了项目的核心功能,确保系统的稳定性和可扩展性。
日志与工具模块
简介
“日志与工具模块”旨在统一管理前端和后端的错误处理与日志记录功能,提升系统的健壮性和可维护性。前端通过 error.ts
文件中的 AppError
类和 createErrorHandler
工具函数,实现统一的错误封装与用户反馈机制;后端则通过 logging.ts
文件中的日志工具,提供结构化、可配置的日志输出能力,便于调试与监控。
该模块不依赖其他模块,是项目中基础性的工具支撑模块,适用于所有需要错误处理和日志记录的场景。
详细章节
前端错误处理模块(error.ts)
架构与功能
error.ts
文件定义了前端的错误处理机制,包含以下核心组件:
- 类:AppError
继承自 JavaScript 内置的Error
类,用于封装业务异常。包含以下属性: message
: 错误描述信息code
: 错误码,默认为'UNKNOWN_ERROR'
details
: 可选的附加信息,用于调试- 函数:createErrorHandler
接收一个context
字符串参数,返回一个包含handleError
方法的对象。该方法根据错误类型显示 Toast 提示,并在控制台输出带有上下文的日志。 - 常量:errorMessages
一组预定义的错误提示信息,用于向用户展示友好的错误反馈。
关键组件
组件名称 | 类型 | 描述 |
---|---|---|
AppError | 类 | 自定义错误类,用于封装业务异常 |
createErrorHandler | 函数 | 创建错误处理器,返回 handleError 方法 |
errorMessages | 常量 | 预定义的错误提示信息集合 |
代码片段
// packages/ui/src/utils/error.ts
export class AppError extends Error {
constructor(
message: string,
public code: string = 'UNKNOWN_ERROR',
public details?: Record<string, any>
) {
super(message)
this.name = 'AppError'
}
}
export function createErrorHandler(context: string) {
const toast = useToast()
return {
handleError(error: unknown) {
console.error(`[${context}]错误:`, error)
if (error instanceof AppError) {
toast.error(error.message)
return
}
if (error instanceof Error) {
toast.error(error.message || `${context}过程中发生错误`)
return
}
toast.error(`${context}过程中发生未知错误`)
}
}
}
export const errorMessages = {
SERVICE_NOT_INITIALIZED: '服务未初始化,请稍后重试',
TEMPLATE_NOT_SELECTED: '请先选择提示词模板',
INCOMPLETE_TEST_INFO: '请填写完整的测试信息',
LOAD_TEMPLATE_FAILED: '加载提示词失败',
CLEAR_HISTORY_FAILED: '清空历史记录失败'
} as const
Mermaid 图

后端日志模块(logging.ts)
架构与功能
logging.ts
是基于 debug
库实现的日志工具模块,提供以下功能:
- 日志级别函数:
debug
、info
、warn
、error
,支持附加元数据或错误对象。 - 动态日志级别设置:通过
setLogLevel
函数动态调整日志输出级别。 - 颜色区分:不同级别的日志在终端中以不同颜色显示,便于识别。
- 环境兼容性:支持开发与生产环境的日志输出控制。
关键组件
组件名称 | 类型 | 描述 |
---|---|---|
debug | 函数 | 输出调试级别日志 |
info | 函数 | 输出信息级别日志 |
warn | 函数 | 输出警告级别日志 |
error | 函数 | 输出错误级别日志 |
setLogLevel | 函数 | 动态设置日志级别 |
代码片段
// packages/mcp-server/src/utils/logging.ts
import createDebug from 'debug';
const debugLogger = createDebug('mcp:debug');
const infoLogger = createDebug('mcp:info');
const warnLogger = createDebug('mcp:warn');
const errorLogger = createDebug('mcp:error');
export function debug(message: string, meta?: unknown): void {
if (meta !== undefined) {
debugLogger(message, meta);
} else {
debugLogger(message);
}
}
export function info(message: string, meta?: unknown): void {
if (meta !== undefined) {
infoLogger(message, meta);
} else {
infoLogger(message);
}
}
export function warn(message: string, meta?: unknown): void {
if (meta !== undefined) {
warnLogger(message, meta);
} else {
warnLogger(message);
}
}
export function error(message: string, err?: Error): void {
if (err) {
errorLogger(message, {
message: err.message,
stack: err.stack,
name: err.name
});
} else {
errorLogger(message);
}
}
export function setLogLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {
const levelMap = {
debug: 'mcp:*',
info: 'mcp:info,mcp:warn,mcp:error',
warn: 'mcp:warn,mcp:error',
error: 'mcp:error'
};
if (!process.env.DEBUG) {
process.env.DEBUG = levelMap[level];
}
const debugPattern = process.env.DEBUG || levelMap[level];
createDebug.enabled = (namespace: string) => {
if (debugPattern === 'mcp:*') return namespace.startsWith('mcp:');
return debugPattern.split(',').some(pattern =>
pattern.trim() === namespace ||
(pattern.includes('*') && namespace.startsWith(pattern.replace('*', '')))
);
};
debugLogger.enabled = createDebug.enabled('mcp:debug');
infoLogger.enabled = createDebug.enabled('mcp:info');
warnLogger.enabled = createDebug.enabled('mcp:warn');
errorLogger.enabled = createDebug.enabled('mcp:error');
}
Mermaid 图

总结
“日志与工具模块”通过前端的错误处理机制和后端的日志记录功能,为项目提供了统一的异常管理和调试支持。前端通过 AppError
和 createErrorHandler
实现用户友好的错误反馈,后端通过 logging.ts
提供灵活的日志输出能力。该模块是项目稳定运行和高效开发的重要基础。
用户界面模块
简介
用户界面模块是项目中负责构建和管理用户交互体验的核心部分。它通过一系列 Vue 组件、样式定义和组合式函数,提供了从基础 UI 元素到复杂交互逻辑的完整解决方案。该模块不仅涵盖了组件的视觉呈现,还涉及状态管理、国际化支持、主题切换、数据交互等功能,确保用户能够高效、直观地使用系统。
模块的设计遵循响应式和模块化原则,支持多种设备和屏幕尺寸,同时通过 Tailwind CSS 和自定义样式文件实现一致的视觉风格。此外,模块还集成了通知系统、全屏模式、自动滚动、剪贴板操作等辅助功能,提升了用户体验的完整性和流畅性。
详细章节
样式管理
用户界面模块通过多个 CSS 文件定义了全局和组件级别的样式规则,确保 UI 的一致性和可定制性。
主题与全局样式
theme.css
文件基于 Tailwind CSS 实现了多主题切换功能,支持暗黑、蓝色、绿色、紫色等多种主题模式。它定义了全局过渡效果和各类组件的样式,如按钮、输入框、模态框等,确保在不同主题下 UI 元素的视觉一致性。
自定义滚动条与选择器
scrollbar.css
和 common.css
文件分别定义了自定义滚动条和选择器的样式。通过隐藏默认浏览器样式并应用自定义设计,模块实现了跨浏览器一致的滚动条和选择器外观。
样式整合
index.css
文件整合了所有样式文件,并加载了 Tailwind CSS 的基础与组件样式,确保整个 UI 的样式统一性和可维护性。
组件架构
用户界面模块包含多个 Vue 组件,每个组件负责特定的 UI 功能或交互逻辑。
基础组件
ActionButton.vue
:提供可交互的按钮,支持加载状态和国际化。ContentCard.vue
:卡片容器组件,支持响应式布局和插槽机制。Panel.vue
:主题卡片式容器,用于构建灵活的 UI 面板。Toast.vue
:用于显示临时通知消息,支持多种类型和动画效果。
输入与选择组件
InputPanel.vue
:多行输入组件,支持模型和模板选择器插槽。InputWithSelect.vue
:结合输入框与下拉选择功能,支持过滤和自动聚焦。ModelSelect.vue
:模型选择组件,提供下拉菜单让用户选择已启用模型。TemplateSelect.vue
:模板选择组件,支持模板的实时更新和管理操作。
输出与展示组件
OutputDisplay.vue
:整合OutputDisplayCore
和OutputDisplayFullscreen
,支持多种视图模式和功能。OutputPanel.vue
:输出结果展示面板,支持 Markdown 显示、复制和流式加载。TextDiff.vue
:用于展示文本对比效果,支持新增和删除部分的高亮显示。
模态与对话框组件
Modal.vue
:模态对话框组件,支持背景遮罩和动画效果。FullscreenDialog.vue
:全屏对话框组件,使用Teleport
挂载到body
上。UpdaterModal.vue
:用于管理软件更新的模态框,支持版本信息展示和下载进度。
管理与配置组件
ModelManager.vue
:用于管理模型的组件,支持创建、编辑、启用、禁用、删除和测试连接。TemplateManager.vue
:模板管理组件,支持浏览、选择、编辑、复制、迁移、导出和导入等操作。DataManager.vue
:提供数据导出、导入及文件上传功能。
历史与主题组件
HistoryDrawer.vue
:用于展示和管理历史记录,支持版本切换和删除操作。ThemeToggleUI.vue
:用于切换用户界面主题,支持多种预设主题和本地存储持久化。
组合式函数 (Composables)
用户界面模块通过一系列组合式函数(Composables)管理应用的状态和逻辑,提升代码的复用性和可维护性。
状态管理
useModals.ts
:管理模态框的状态和操作。useModelManager.ts
:管理模型的选择和配置界面。useHistoryManager.ts
:管理历史记录相关操作。useTemplateManager.ts
:管理模板选择、显示和保存逻辑。
辅助功能
useClipboard.ts
:提供复制文本到剪贴板的功能。useFullscreen.ts
:管理组件的全屏状态。useAutoScroll.ts
:实现智能自动滚动逻辑。useToast.ts
:管理通知消息的显示和隐藏。
应用初始化与存储
useAppInitializer.ts
:负责根据运行环境初始化应用程序的核心服务。useStorage.ts
:统一管理应用存储,支持localStorage
和Dexie
。
数据流与交互逻辑
用户界面模块通过组件间的事件传递和状态管理,实现了复杂的数据流和交互逻辑。
模板与模型管理
TemplateManager.vue
和 ModelManager.vue
组件通过 useTemplateManager
和 useModelManager
组合式函数,实现了模板和模型的增删改查操作。用户可以通过 UI 界面进行模板和模型的管理,并通过事件通知父组件更新状态。
提示词优化与测试
PromptPanel.vue
和 TestPanel.vue
组件分别负责提示词的优化和测试功能。通过 usePromptOptimizer
和 usePromptTester
组合式函数,模块实现了提示词的流式优化、迭代优化和版本切换功能,并支持不同优化模式下的测试逻辑。
历史记录管理
HistoryDrawer.vue
和 usePromptHistory
组合式函数共同管理提示词的历史记录。用户可以通过 UI 界面查看、重用、删除和清空历史记录,并通过事件通知父组件更新状态。
模板管理功能详解
核心功能
TemplateManager.vue
是一个功能全面的模板管理组件,支持多语言环境,提供浏览、选择、编辑、复制、迁移、导出和导入等交互功能。以下是其主要功能模块:
模态窗口控制
控制模态窗口的显示与关闭,点击背景可关闭窗口。
语言切换与类别选择
支持系统优化、用户优化和迭代三种模板类别。提供内置语言切换器,使用 t
函数实现多语言翻译。
模板列表与筛选
显示当前类别的模板列表,支持筛选和选择/编辑模板。
添加新模板
提供“添加”按钮创建新模板,通过 showAddForm
控制表单显示。
模板操作
非内置模板支持编辑和复制,内置模板仅支持查看。
高级模板模式
支持为每条消息指定角色(系统、用户、助手),并调整顺序或删除消息。提供预览区域展示配置后的消息列表。
模板管理逻辑
接收多个模板作为 props,根据类型和状态管理选中模板。支持高级模板与普通模板之间的转换。
导入与导出
支持 .json
格式的模板导入与导出。提供迁移对话框,允许用户比较并应用迁移。
辅助功能
使用 useI18n
和 useToast
实现多语言支持和错误提示。提供日期格式化、模板加载等功能。
数据结构与状态管理
TemplateManager.vue
组件通过 useTemplateManager
组合式函数管理模板选择、显示和保存逻辑。useTemplateManager
提供了以下核心功能:
- 模板选择:通过
handleTemplateSelect
更新并保存选中模板。 - 初始化与恢复:从本地存储加载默认模板。
- 模板保存:自动保存模板选择并触发通知。
- UI 控制:提供
openTemplateManager
和handleTemplateManagerClose
控制面板。 - 依赖注入:依赖
AppServices
和usePreferences
。 - 国际化支持:使用
vue-i18n
和useToast
提示用户。
高级模板模式
TemplateManager.vue
组件支持高级模板模式,允许用户为每条消息指定角色(系统、用户、助手),并调整顺序或删除消息。这种模式特别适用于需要构建多轮对话的场景。
在高级模板模式下,用户可以通过 UI 界面添加、编辑、删除和重新排列消息。每条消息都有一个角色属性,用于指定消息的发送者(系统、用户或助手)。用户还可以通过预览区域查看配置后的消息列表。
国际化支持
TemplateManager.vue
组件通过 useI18n
实现多语言支持。组件中的所有文本内容都通过 t
函数进行翻译,确保在不同语言环境下都能正确显示。
错误处理机制
TemplateManager.vue
组件通过 useToast
实现错误提示功能。当用户在操作模板时发生错误(如导入失败、保存失败等),组件会通过 toast
显示错误信息,帮助用户了解问题并进行相应的处理。
Mermaid 图
用户界面模块架构图

组件交互流程图

模板管理功能流程图

表格
主要功能或组件及其描述
组件/功能 | 描述 |
---|---|
ActionButton.vue | 可交互的按钮组件,支持加载状态和国际化 |
ContentCard.vue | 卡片容器组件,支持响应式布局和插槽机制 |
ModelManager.vue | 用于管理模型的组件,支持创建、编辑、启用、禁用、删除和测试连接 |
TemplateManager.vue | 模板管理组件,支持浏览、选择、编辑、复制、迁移、导出和导入等操作 |
PromptPanel.vue | 用于管理和优化提示词的用户界面组件,支持版本切换、提示词优化和迭代优化 |
TestPanel.vue | 用于测试和优化对话模型提示语的 Vue 组件,支持系统优化和用户优化两种模式 |
useToast.ts | 管理通知消息的显示和隐藏 |
useClipboard.ts | 提供复制文本到剪贴板的功能 |
useFullscreen.ts | 管理组件的全屏状态 |
配置选项及其类型和默认值
配置项 | 类型 | 默认值 | 描述 |
---|---|---|---|
theme | String | ‘dark’ | 当前激活的主题 |
isFullscreen | Boolean | false | 是否处于全屏模式 |
showHistory | Boolean | false | 是否显示历史记录抽屉 |
showTemplates | Boolean | false | 是否显示模板管理模态框 |
showConfig | Boolean | false | 是否显示模型配置界面 |
模板管理功能相关函数
函数名 | 描述 |
---|---|
handleTemplateSelect | 更新并保存选中模板 |
openTemplateManager | 打开模板管理界面 |
handleTemplateManagerClose | 关闭模板管理界面 |
loadTemplatesByType | 根据类型加载模板 |
deepCompareTemplateContent | 判断模板内容是否变化 |
refreshTemplates | 重新加载模板 |
结论/总结
用户界面模块通过一系列精心设计的 Vue 组件、样式文件和组合式函数,构建了一个功能丰富、响应迅速且易于维护的 UI 系统。它不仅提供了基础的 UI 元素和交互逻辑,还通过状态管理、国际化支持、主题切换等功能,确保了用户在不同场景下的良好体验。模块的架构清晰,组件间职责分明,数据流和交互逻辑明确,为项目的进一步扩展和维护奠定了坚实的基础。
模板管理功能作为用户界面模块中的一个重要组成部分,提供了全面的模板管理能力,包括浏览、选择、编辑、复制、迁移、导出和导入等操作。通过高级模板模式,用户可以构建复杂的多轮对话场景。同时,模块还支持国际化和错误处理,确保了在不同语言环境下的可用性和稳定性。
Web 前端模块
简介
Web 前端模块是项目中负责处理运行时配置的部分,主要用于非 Docker 环境下的开发和测试阶段。它通过定义一个全局对象 window.runtime_config
来存储运行时配置参数。当前该对象为空 {}
,表示使用的是默认配置。在 Docker 环境中,此文件会被替换为实际的配置文件,因此它仅适用于开发和测试环境。
详细章节
配置模块概述
config.js
文件位于 packages/web/public/
目录下,是 Web 前端模块的核心配置文件。它的主要作用是在非 Docker 环境中提供默认的运行时配置。通过 console.log
输出 "使用默认配置"
,提示开发者当前环境的状态。
关键配置元素
window.runtime_config
: 全局对象,用于存储运行时配置参数。当前为空对象{}
。
流程图

表格
配置项 | 类型 | 默认值 | 描述 |
---|---|---|---|
window.runtime_config | Object | {} | 存储运行时配置参数的全局对象,仅用于开发和测试环境 |
代码片段
// packages/web/public/config.js
window.runtime_config = {};
console.log("使用默认配置");
研究结果
配置管理机制
config.js
文件在项目中扮演着关键角色,特别是在不同环境下的配置管理。在非 Docker 环境中,该文件提供了一个默认的配置对象 window.runtime_config
,确保应用在开发和测试阶段能够正常运行。而在 Docker 环境中,该文件会被替换为实际的配置文件,从而实现环境特定的配置管理。
环境对比分析
- 非 Docker 环境:使用
config.js
文件中的默认配置,window.runtime_config
为空对象{}
。 - Docker 环境:
config.js
文件被替换为实际配置文件,window.runtime_config
包含实际的配置参数。
代码调用链分析
由于工具调用失败,无法直接查询 window.runtime_config
在项目中的具体使用情况。但根据文件内容和注释,可以推断该项目中其他模块可能会引用 window.runtime_config
来获取运行时配置参数。这种设计使得配置管理更加灵活,能够适应不同的运行环境。
结论
Web 前端模块通过 config.js
文件为非 Docker 环境提供了默认的运行时配置,确保了开发和测试阶段的正常运行。该模块的核心是 window.runtime_config
对象,它在不同环境中会被替换为实际配置,体现了项目的灵活性和可扩展性。通过环境对比分析,可以看出该模块在不同环境下的配置管理机制,为项目的部署和运行提供了便利。
桌面应用模块
简介
桌面应用模块主要负责 Electron 应用的日志管理和软件更新流程。该模块通过 ConsoleLogger
类实现灵活的日志记录机制,同时通过 constants.js
和 update-config.js
提供标准化的事件命名、配置支持以及版本管理功能。这些组件协同工作,确保应用在运行过程中能够高效地记录日志并安全地进行版本更新。
详细章节
日志管理
架构与组件
console-logger.js
文件中定义的 ConsoleLogger
类是日志管理的核心组件。它负责初始化日志配置、解析消息前缀、劫持控制台输出、处理全局错误,并提供日志文件路径。通过这些功能,ConsoleLogger
实现了对 Electron 应用日志的全面管理。
关键功能
- 日志初始化与配置:设置主日志和模块日志的路径、级别及格式。
- 消息解析:识别特定前缀,选择对应日志器记录消息。
- 控制台劫持:拦截
console.*
方法,统一管理输出。 - 全局错误处理:捕获异常并记录到日志文件。
- 获取日志路径:提供所有日志文件的完整路径。
Mermaid 图

表格
功能 | 描述 |
---|---|
日志初始化与配置 | 设置主日志和模块日志的路径、级别及格式 |
消息解析 | 识别特定前缀,选择对应日志器记录消息 |
控制台劫持 | 拦截 console.* 方法,统一管理输出 |
全局错误处理 | 捕获异常并记录到日志文件 |
获取日志路径 | 提供所有日志文件的完整路径 |
ConsoleLogger 类详细分析
通过深入分析 console-logger.js
文件,发现 ConsoleLogger
类具有以下核心实现:
1. 构造函数和初始化
constructor() {
this.originalConsole = {
log: console.log,
error: console.error,
warn: console.warn,
info: console.info,
debug: console.debug
};
this.setupElectronLog();
this.setupModuleLoggers();
this.hijackConsole();
}
构造函数保存了原始的控制台方法,并依次执行日志系统的初始化、模块日志器设置和控制台劫持。
2. Electron日志配置
setupElectronLog() {
const userDataPath = app ? app.getPath('userData') : process.cwd();
const logDir = path.join(userDataPath, 'logs');
log.transports.file.level = 'info';
log.transports.file.maxSize = 10 * 1024 * 1024;
log.transports.file.format = '[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}] {text}';
log.transports.file.resolvePathFn = () => path.join(logDir, 'main.log');
log.transports.console.level = process.env.NODE_ENV === 'development' ? 'debug' : 'info';
log.transports.console.format = '[{y}-{m}-{d} {h}:{i}:{s}] [{level}] {text';
log.transports.ipc.level = false;
}
主日志配置设置了日志级别、文件大小限制、格式和路径。
3. 模块日志器设置
setupModuleLoggers() {
this.loggers = {
main: this.createModuleLogger('main'),
desktop: this.createModuleLogger('desktop'),
updater: this.createModuleLogger('updater'),
ipc: this.createModuleLogger('ipc'),
error: this.createModuleLogger('error')
};
this.loggers.error.transports.file.level = 'error';
this.loggers.error.transports.console.level = 'error';
}
为不同模块创建了专门的日志器,其中错误日志器有特殊的配置。
4. 消息解析机制
parseLogMessage(message) {
const messageStr = typeof message === 'string' ? message : String(message);
const modulePatterns = [
{ pattern: /^\[Main Process\]/i, logger: this.loggers.main, prefix: '[Main Process]' },
{ pattern: /^\[DESKTOP\]/i, logger: this.loggers.desktop, prefix: '[DESKTOP]' },
{ pattern: /^\[Updater\]/i, logger: this.loggers.updater, prefix: '[Updater]' },
{ pattern: /^\[.*IPC.*\]/i, logger: this.loggers.ipc, prefix: '[IPC]' },
];
for (const { pattern, logger, prefix } of modulePatterns) {
if (pattern.test(messageStr)) {
const cleanMessage = messageStr.replace(pattern, '').trim();
return { logger, message: cleanMessage, originalPrefix: prefix };
}
}
return { logger: this.loggers.main, message: messageStr, originalPrefix: null };
}
通过正则表达式匹配消息前缀来确定使用哪个模块日志器。
5. 控制台劫持实现
控制台劫持通过重写 console
对象的方法实现,以 console.log
为例:
console.log = (...args) => {
const firstArg = args[0];
const { logger, message, originalPrefix } = this.parseLogMessage(firstArg);
if (originalPrefix && args.length === 1) {
logger.info(message);
} else if (originalPrefix) {
const restArgs = args.slice(1);
logger.info(message, ...restArgs);
} else {
logger.info(...args);
}
if (process.env.NODE_ENV === 'development') {
this.originalConsole.log(...args);
}
};
6. 全局错误处理
setupGlobalErrorHandlers() {
process.on('uncaughtException', (error) => {
const errorInfo = {
type: 'uncaughtException',
message: error.message,
stack: error.stack,
timestamp: new Date().toISOString(),
pid: process.pid
};
this.loggers.error.error('CRITICAL - Uncaught Exception:', JSON.stringify(errorInfo, null, 2));
this.originalConsole.error('[CRITICAL] Uncaught Exception:', error);
setTimeout(() => {
process.exit(1);
}, 1000);
});
}
7. 日志路径管理
getLogPaths() {
const userDataPath = app ? app.getPath('userData') : process.cwd();
const logDir = path.join(userDataPath, 'logs');
return {
logDir,
main: path.join(logDir, 'main.log'),
desktop: path.join(logDir, 'desktop.log'),
updater: path.join(logDir, 'updater.log'),
ipc: path.join(logDir, 'ipc.log'),
error: path.join(logDir, 'error.log')
};
}
软件更新
架构与组件
constants.js
和 update-config.js
文件共同构成了软件更新模块的核心。constants.js
定义了 IPC 事件常量、偏好设置键名和默认配置,而 update-config.js
则集中管理软件更新相关配置,包括获取仓库信息、验证版本号、构建 Release URL 等。
关键功能
- IPC 事件常量:定义主进程与渲染进程通信的事件名称,如检查更新、下载、安装等。
- 偏好设置键名:定义用户忽略版本信息的存储键名。
- 默认配置:包含自动下载、检查间隔、请求超时等默认参数。
- 获取仓库信息:从环境变量或配置文件中提取仓库信息,返回默认值若未找到。
- 验证版本号:检查版本是否符合语义化规范,不符合则抛出错误。
- 构建 Release URL:根据版本号和仓库信息生成 GitHub Releases 页面链接。
Mermaid 图

表格
功能 | 描述 |
---|---|
IPC 事件常量 | 定义主进程与渲染进程通信的事件名称 |
偏好设置键名 | 定义用户忽略版本信息的存储键名 |
默认配置 | 包含自动下载、检查间隔、请求超时等默认参数 |
获取仓库信息 | 从环境变量或配置文件中提取仓库信息,返回默认值若未找到 |
验证版本号 | 检查版本是否符合语义化规范,不符合则抛出错误 |
构建 Release URL | 根据版本号和仓库信息生成 GitHub Releases 页面链接 |
结论
桌面应用模块通过日志管理和软件更新两个核心组件,确保了 Electron 应用在运行过程中的稳定性和可维护性。ConsoleLogger
类提供了灵活的日志记录机制,而 constants.js
和 update-config.js
则为软件更新流程提供了标准化的配置支持。这些组件的协同工作,使得应用能够在复杂的运行环境中保持高效和安全。
扩展功能模块
简介
扩展功能模块是 Chrome 扩展的核心部分,负责定义扩展的基本行为、本地化支持和用户交互逻辑。该模块通过 manifest.json
配置扩展的基本信息,如名称、版本、图标和默认语言,并通过 background.js
实现点击扩展图标后打开主界面的功能。本地化支持通过 _locales
目录下的 JSON 文件实现,支持英文和中文界面显示。
详细章节
扩展配置 (manifest.json)
manifest.json
是 Chrome 扩展的配置文件,定义了扩展的基本信息和行为。它包括扩展名称、版本、图标、默认语言等基本信息,指定后台脚本为模块类型,并设置安全策略、离线模式及隐身模式行为。此外,它还引用本地化占位符以支持多语言显示。
配置选项
选项 | 类型 | 描述 |
---|---|---|
name | string | 扩展名称 |
version | string | 扩展版本 |
default_locale | string | 默认语言 |
background | object | 后台脚本配置 |
content_security_policy | string | 安全策略 |
offline_enabled | boolean | 离线模式支持 |
incognito | string | 隐身模式行为 |
本地化支持 (_locales)
本地化支持通过 _locales
目录下的 JSON 文件实现,支持英文和中文界面显示。en/messages.json
定义英文本地化消息,包括扩展名称、描述和简称。zh_CN/messages.json
提供中文本地化字符串,包含扩展名称“提示词优化器”及其描述。
本地化消息
消息 | 语言 | 描述 |
---|---|---|
extensionName | en | 扩展名称 |
extensionDescription | en | 扩展描述 |
extensionShortName | en | 扩展简称 |
extensionName | zh_CN | 扩展名称 |
extensionDescription | zh_CN | 扩展描述 |
用户交互 (background.js)
background.js
监听浏览器动作点击事件,触发后通过 chrome.runtime.getURL
获取 index.html
的 URL,并使用 chrome.tabs.create
在新标签页中打开该页面。实现点击图标启动扩展主界面的基本交互功能。
代码片段
chrome.action.onClicked.addListener(() => {
const url = chrome.runtime.getURL('index.html');
chrome.tabs.create({ url });
});
Mermaid图
扩展功能模块架构

表格
主要功能或组件
功能或组件 | 描述 |
---|---|
manifest.json | 扩展配置文件 |
_locales | 本地化支持 |
background.js | 用户交互逻辑 |
配置选项
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
name | string | – | 扩展名称 |
version | string | – | 扩展版本 |
default_locale | string | en | 默认语言 |
background | object | – | 后台脚本配置 |
content_security_policy | string | – | 安全策略 |
offline_enabled | boolean | false | 离线模式支持 |
incognito | string | not_allowed | 隐身模式行为 |
结论/总结
扩展功能模块通过 manifest.json
配置扩展的基本信息和行为,通过 background.js
实现用户交互逻辑,并通过 _locales
目录下的 JSON 文件实现本地化支持。该模块是 Chrome 扩展的核心部分,负责定义扩展的基本行为和用户交互逻辑。
图标构建模块
简介
图标构建模块是 Electron 应用程序中一个关键的资源处理组件,负责生成适用于不同操作系统的图标资源。该模块通过使用 electron-icon-builder
工具,能够从一个 1024×1024 的 PNG 源图片生成 Windows (.ico)、macOS (.icns) 和 Linux (.png) 格式的图标。此模块确保应用在各种平台上具有一致且高质量的图标展示,并简化了开发者在多平台部署时的图标维护工作。
详细章节
图标类型与尺寸
图标构建模块支持三种主要操作系统的图标格式:
- Windows: 使用
.ico
格式 - macOS: 使用
.icns
格式 - Linux: 使用
.png
格式
所有图标均以 1024×1024 的 PNG 图片为基础,生成多种尺寸(如 16×16、32×32 等),以支持高分辨率屏幕(如 Retina 显示屏)。
构建流程
构建流程根据目标平台略有不同,但总体步骤包括:
- 删除旧图标文件夹
- 使用
electron-icon-builder
工具生成图标 - 重命名并复制原始图片到目标目录
对于 Linux 和 macOS 平台,构建过程使用标准的命令行工具(如 rm
、mv
、cp
)完成。
构建流程图

配置说明
图标路径的配置在 package.json
文件中指定。开发者需要为每个平台定义图标路径,以确保 Electron 在构建时能正确引用图标资源。
跨平台构建命令
为了简化多平台图标构建,项目提供了统一的构建命令:
pnpm run build:cross-platform
该命令将自动为 Windows、macOS 和 Linux 生成所需的图标资源。
表格总结
主要功能与组件
功能/组件 | 描述 |
---|---|
图标生成工具 | 使用 electron-icon-builder 生成图标 |
平台支持 | 支持 Windows (.ico)、macOS (.icns)、Linux (.png) |
图标尺寸 | 以 1024×1024 PNG 为基础,生成多种尺寸 |
跨平台构建命令 | pnpm run build:cross-platform |
配置选项
配置项 | 类型 | 描述 |
---|---|---|
图标路径 | string | 在 package.json 中指定各平台图标路径 |
结论
图标构建模块通过自动化工具和清晰的构建流程,为 Electron 应用提供了高效的跨平台图标生成方案。开发者只需维护一个高分辨率源图片,即可轻松适配不同操作系统的需求,显著提升了开发效率和图标维护的便捷性。
API 服务模块
简介
API 服务模块是项目的核心组件,负责处理认证、代理请求、流式传输和状态检查等功能。该模块通过多个独立的 API 端点实现不同的功能,包括用户身份验证、HTTP 请求代理、流式数据传输以及服务状态监控。这些功能共同构成了一个灵活且安全的 API 服务体系,适用于前后端通信、跨域请求处理和边缘部署场景。
详细章节
认证中间件 (auth.js)
api/auth.js
是一个认证中间件,用于处理用户身份验证和会话管理。它通过 GET 和 POST 请求验证权限,并根据结果设置或清除 Cookie。
功能描述
- OPTIONS 请求:返回 200 状态码。
- POST 请求:
- 检查
password
和action
字段。 - 若
action=verify
并密码匹配,则设置HttpOnly
Cookie(7 天有效期)并返回成功消息;否则返回 401。 - GET 请求:
- 若
action=logout
,则清除 Cookie 并返回成功消息。
特殊情况
- 未设置
ACCESS_PASSWORD
则直接返回 200。 - 不支持的方法返回 405。
依赖
- 使用环境变量
ACCESS_PASSWORD
。 - 设置
HttpOnly
和Secure
标志增强安全性。
流程图

HTTP 代理服务 (proxy.js)
api/proxy.js
是一个 HTTP 代理服务,用于将客户端请求转发到指定目标 URL,并支持多种方法(GET、POST、PUT、DELETE、OPTIONS),同时处理 CORS。
功能描述
- OPTIONS 请求:返回标准的 CORS 预检响应。
- 参数解析与验证:提取并验证
targetUrl
参数,无效则返回 400。 - 请求头过滤:排除敏感字段如
host
,connection
,content-length
。 - 请求体处理:非 GET/HEAD 请求读取请求体。
- 转发请求:构建新请求并发送至目标 URL。
- 响应头设置:复制目标响应头并添加 CORS 相关头。
- 错误处理:捕获异常并返回相应状态码和信息。
流程图

流式代理函数 (stream.js)
api/stream.js
是一个流式代理函数,用于将请求转发至目标 URL,并以流方式返回响应。
功能描述
- OPTIONS 请求:设置 CORS 头,允许任意来源访问。
- 参数解析:从查询中提取
targetUrl
,无效则返回 400。 - 请求头处理:过滤特定头字段,记录方法和头数量。
- 请求体读取:非 GET/HEAD 请求读取请求体内容。
- 转发请求:使用
fetch
发送请求,支持duplex: 'half'
流模式。 - 响应类型判断:若为
text/event-stream
,调整响应头支持 SSE。 - 流式传输:使用
TransformStream
实现数据块逐块传输,每 10 块记录进度。 - 错误处理:捕获错误并返回 500 错误响应。
流程图

服务状态接口 (vercel-status.js)
api/vercel-status.js
是一个 Vercel 边缘运行时函数,用于返回服务状态信息的 JSON 响应。
功能描述
- 配置:设置运行时为
edge
,提升响应速度。 - 默认导出函数
handler
:接收请求并返回包含以下信息的 JSON 响应: status
: 表示服务可用;environment
: 当前为vercel
;proxySupport
: 支持代理请求;version
: 服务版本号1.0.0
。- CORS 设置:
- 允许任意来源;
- 允许
GET
和OPTIONS
方法; - 允许
Content-Type
请求头; - 响应类型为
application/json
。
流程图

表格
主要功能或组件及其描述
功能/组件 | 描述 |
---|---|
认证中间件 | 处理用户身份验证和会话管理 |
HTTP 代理服务 | 将客户端请求转发到指定目标 URL |
流式代理函数 | 以流方式返回响应 |
服务状态接口 | 返回服务状态信息的 JSON 响应 |
API 接口参数、类型和描述
接口 | 参数 | 类型 | 描述 |
---|---|---|---|
/api/auth | password, action | string | 用于身份验证和会话管理 |
/api/proxy | targetUrl | string | 目标 URL,用于请求转发 |
/api/stream | targetUrl | string | 目标 URL,用于流式传输 |
/api/vercel-status | 无 | 无 | 返回服务状态信息 |
配置选项及其类型和默认值
配置项 | 类型 | 默认值 | 描述 |
---|---|---|---|
ACCESS_PASSWORD | string | 无 | 用于身份验证的密码 |
runtime | string | edge | Vercel 边缘运行时配置 |
代码片段
认证中间件 (auth.js)
export default function handler(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
if (req.method === 'OPTIONS') {
res.status(200).end();
return;
}
const accessPassword = process.env.ACCESS_PASSWORD;
if (!accessPassword) {
return res.status(200).json({
success: true,
message: 'No password protection configured'
});
}
if (req.method === 'POST') {
const { password, action } = req.body;
if (action === 'verify') {
if (password === accessPassword) {
const maxAge = 60 * 60 * 24 * 7;
res.setHeader('Set-Cookie', [
`vercel_access_token=${accessPassword}; HttpOnly; Path=/; Max-Age=${maxAge}; SameSite=Strict${process.env.NODE_ENV === 'production' ? '; Secure' : ''}`
]);
return res.status(200).json({
success: true,
message: 'Authentication successful'
});
} else {
return res.status(401).json({
success: false,
message: 'Invalid password'
});
}
}
}
if (req.method === 'GET') {
const { action } = req.query;
if (action === 'logout') {
res.setHeader('Set-Cookie', [
'vercel_access_token=; HttpOnly; Path=/; Max-Age=0; SameSite=Strict'
]);
return res.status(200).json({
success: true,
message: 'Logged out successfully'
});
}
}
res.status(405).json({ error: 'Method not allowed' });
}
HTTP 代理服务 (proxy.js)
export default async function handler(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
if (req.method === 'OPTIONS') {
res.status(200).end();
return;
}
const { targetUrl } = req.query;
if (!targetUrl) {
res.status(400).json({ message: 'Missing targetUrl parameter' });
return;
}
const headers = {};
for (const key in req.headers) {
if (!['host', 'connection', 'content-length'].includes(key.toLowerCase())) {
headers[key] = req.headers[key];
}
}
const body = req.method !== 'GET' && req.method !== 'HEAD' ? await readBody(req) : null;
try {
const response = await fetch(targetUrl, {
method: req.method,
headers,
body,
});
for (const key in response.headers) {
res.setHeader(key, response.headers[key]);
}
res.setHeader('Access-Control-Allow-Origin', '*');
res.status(response.status).send(await response.text());
} catch (error) {
res.status(500).json({ message: 'Proxy request failed', error: error.message });
}
}
async function readBody(req) {
return new Promise((resolve) => {
let body = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
resolve(body);
});
});
}
流式代理函数 (stream.js)
export default async function handler(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
if (req.method === 'OPTIONS') {
res.status(200).end();
return;
}
const { targetUrl } = req.query;
if (!targetUrl) {
res.status(400).json({ message: 'Missing targetUrl parameter' });
return;
}
const headers = {};
for (const key in req.headers) {
if (!['host', 'connection', 'content-length'].includes(key.toLowerCase())) {
headers[key] = req.headers[key];
}
}
const body = req.method !== 'GET' && req.method !== 'HEAD' ? await readBody(req) : null;
try {
const response = await fetch(targetUrl, {
method: req.method,
headers,
body,
duplex: 'half',
});
if (response.headers.get('content-type') === 'text/event-stream') {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
}
const reader = response.body.getReader();
const decoder = new TextDecoder();
let count = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
res.write(chunk);
count++;
if (count % 10 === 0) {
console.log(`Processed ${count} chunks`);
}
}
res.end();
} catch (error) {
res.status(500).json({ message: 'Stream request failed', error: error.message });
}
}
async function readBody(req) {
return new Promise((resolve) => {
let body = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
resolve(body);
});
});
}
服务状态接口 (vercel-status.js)
export const config = {
runtime: 'edge',
};
export default async function handler(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
res.setHeader('Content-Type', 'application/json');
if (req.method === 'OPTIONS') {
res.status(200).end();
return;
}
if (req.method === 'GET') {
res.status(200).json({
status: 'available',
environment: 'vercel',
proxySupport: true,
version: '1.0.0',
});
return;
}
res.status(405).json({ message: 'Method not allowed' });
}
结论/总结
API 服务模块通过认证中间件、HTTP 代理服务、流式代理函数和服务状态接口,提供了一个全面且灵活的 API 服务体系。这些组件共同确保了系统的安全性、可扩展性和高效性,适用于各种前后端通信和边缘部署场景。认证中间件提供了基于 Cookie 的身份验证机制,通过环境变量和安全的 Cookie 设置增强了系统的安全性。HTTP 代理服务和流式代理函数则提供了灵活的请求转发能力,解决了跨域问题并支持流式数据传输。服务状态接口为系统监控和健康检查提供了便利。
MCP 协议服务模块
简介
MCP 协议服务模块是 mcp-server
项目的核心组成部分,负责协调和管理多个关键服务,包括模型管理、语言服务、模板管理、历史记录和提示服务等。该模块通过统一的接口和配置管理,确保系统在不同环境下的稳定运行,并提供灵活的扩展能力。模块的设计遵循 MCP 协议规范,支持工具注册、请求处理、错误处理等功能,为上层应用提供可靠的服务支持。
详细章节
核心服务管理
CoreServicesManager
是 MCP 协议服务模块的核心组件,负责初始化和管理多个关键服务。它通过统一的接口提供对 ModelManager
、LLMService
、LanguageService
、TemplateManager
、HistoryManager
和 PromptService
的访问。
核心服务初始化流程

关键类和方法
CoreServicesManager
:核心服务管理器类,负责初始化和管理所有核心服务。getPromptService()
:获取提示服务实例。getHealthStatus()
:获取服务健康状态。
错误处理机制
MCPErrorHandler
类负责将 Core 错误转换为 MCP 协议兼容的错误格式,确保系统在遇到错误时能够提供一致的错误信息。
错误处理流程

关键类和方法
MCPErrorHandler
:错误处理类,负责错误转换和生成。convertCoreError(error: Error): McpError
:将 Core 错误转换为 MCP 错误。createValidationError(message)
:生成参数验证错误。createInternalError(message)
:生成内部错误。
语言服务管理
SimpleLanguageService
类实现语言偏好管理,支持中英文切换,简化多语言配置。
语言服务管理流程

关键类和方法
SimpleLanguageService
:语言服务类,负责语言管理。getCurrentLanguage()
:获取当前语言。setLanguage(language)
:设置语言。toggleLanguage()
:切换语言。
参数验证
ParameterValidator
类用于验证输入参数的有效性,确保输入数据的合法性和一致性。
参数验证流程

关键类和方法
ParameterValidator
:参数验证类,负责输入验证。validatePrompt(prompt: string)
:验证提示词。validateTemplate(template?: string)
:验证模板。validateRequirements(requirements: string)
:验证需求描述。
环境配置管理
environment.ts
文件负责管理环境变量和配置,确保应用在不同环境中正确运行。
环境配置管理流程

关键类和方法
loadConfig
:加载配置函数。validateConfig
:验证配置函数。
模型配置管理
models.ts
文件负责根据配置动态设置 MCP 服务器的默认模型,实现灵活的模型配置与管理。
模型配置管理流程

关键类和方法
setupDefaultModel
:设置默认模型函数。
模板管理
templates.ts
文件提供模板相关操作,复用 @prompt-optimizer/core
模板系统,支持模板管理和用户交互中的模板展示需求。
模板管理流程

关键类和方法
getDefaultTemplateId
:获取默认模板 ID。getTemplateOptions
:获取模板选项。
日志管理
logging.ts
文件是 mcp-server
的日志工具模块,基于 debug
库实现,支持不同级别的日志记录。
日志管理流程

关键类和方法
debug
:调试日志函数。info
:信息日志函数。warn
:警告日志函数。error
:错误日志函数。setLogLevel
:设置日志级别函数。
MCP协议接口实现
MCP协议服务模块通过index.ts
文件实现了三个核心工具接口,用于处理用户提示词优化、系统提示词优化和提示词迭代。
工具接口实现流程

核心工具接口
- optimize-user-prompt:优化用户提示词
- 参数:prompt(用户输入的提示词)、template(可选模板ID)、requirements(优化要求)
- 功能:调用
PromptService.optimizePrompt
方法进行用户提示词优化
- optimize-system-prompt:优化系统提示词
- 参数:prompt(系统提示词)、template(可选模板ID)、requirements(优化要求)
- 功能:调用
PromptService.optimizePrompt
方法进行系统提示词优化
- iterate-prompt:迭代优化提示词
- 参数:prompt(当前提示词)、historyId(历史记录ID)、requirements(迭代要求)
- 功能:调用
PromptService.iteratePrompt
方法进行提示词迭代优化
关键实现函数
setupServerHandlers
:设置服务器处理器函数PromptService.optimizePrompt
:提示词优化方法PromptService.iteratePrompt
:提示词迭代方法
模板系统集成
模板系统通过templates.ts
文件与Core包的内置模板系统集成,提供模板管理和用户交互支持。
模板系统集成流程

关键实现函数
getDefaultTemplateId
:根据优化模式获取默认模板IDgetTemplateOptions
:获取指定类型的所有模板信息
表格
主要功能或组件及其描述
组件名称 | 描述 |
---|---|
CoreServicesManager | 核心服务管理器,负责初始化和管理所有核心服务 |
MCPErrorHandler | 错误处理类,负责错误转换和生成 |
SimpleLanguageService | 语言服务类,负责语言管理 |
ParameterValidator | 参数验证类,负责输入验证 |
environment.ts | 环境配置管理文件 |
models.ts | 模型配置管理文件 |
templates.ts | 模板管理文件 |
logging.ts | 日志管理文件 |
配置选项及其类型和默认值
配置项 | 类型 | 默认值 | 描述 |
---|---|---|---|
HTTP_PORT | number | 3000 | HTTP 服务器端口 |
LOG_LEVEL | string | ‘info’ | 日志级别 |
DEFAULT_LANGUAGE | string | ‘en’ | 默认语言 |
MCP协议工具接口参数
工具名称 | 参数 | 类型 | 必需 | 描述 |
---|---|---|---|---|
optimize-user-prompt | prompt | string | 是 | 用户输入的提示词 |
template | string | 否 | 模板ID | |
requirements | string | 否 | 优化要求 | |
optimize-system-prompt | prompt | string | 是 | 系统提示词 |
template | string | 否 | 模板ID | |
requirements | string | 否 | 优化要求 | |
iterate-prompt | prompt | string | 是 | 当前提示词 |
historyId | string | 是 | 历史记录ID | |
requirements | string | 否 | 迭代要求 |
结论/总结
MCP 协议服务模块通过统一管理核心服务、错误处理、语言服务、参数验证、环境配置、模型配置、模板管理和日志管理,为系统提供了稳定运行的基础。该模块的设计遵循 MCP 协议规范,支持灵活的扩展和配置,确保系统在不同环境下的稳定性和可靠性。通过实现三个核心工具接口(用户提示词优化、系统提示词优化和提示词迭代),模块为用户提供了一套完整的提示词优化解决方案。模板系统与Core包的深度集成进一步增强了模块的功能性和可扩展性。
国际化模块
简介
国际化模块(i18n)旨在为项目提供多语言支持,增强用户体验,确保用户界面在不同语言环境下的一致性和可读性。该模块通过定义结构化的语言资源文件(如 en-US.ts
和 zh-CN.ts
),为应用中的各类 UI 元素提供本地化文本。这些文本涵盖了从通用操作提示、导航栏标签到模型管理、模板配置等复杂功能模块的描述。
模块遵循《国际化(i18n)规范指南》中定义的命名结构和最佳实践,采用嵌套对象结构来组织翻译键,便于维护和扩展。通过参数化文本支持动态内容,并为新增语言提供清晰的流程指导。
详细章节
语言资源文件结构
语言资源文件(如 en-US.ts
和 zh-CN.ts
)采用模块化结构,将翻译键按功能划分,例如:
common
:通用操作文本(如“加载”、“保存”)nav
:导航栏文本(如“首页”、“仪表盘”)settings
:设置页面选项(如“语言设置”、“API 设置”)modelManager
:模型管理文本(如“模型列表”、“删除模型”)templateManager
:模板管理文本(如“添加模板”、“编辑模板”)
这种结构化方式便于快速定位和管理翻译键,同时确保命名的一致性和可读性。
参数化文本支持
为了支持动态内容,语言资源文件支持参数化文本。通过使用 {}
插入变量,可以在运行时动态生成文本内容。例如:
deleteConfirm: "确定要删除 {name} 吗?"
这种机制提高了文本的灵活性,使得同一翻译键可以适用于不同的上下文。
最佳实践
《国际化(i18n)规范指南》中强调了以下最佳实践:
- 一致性:使用统一的命名结构和风格。
- 避免重复:确保翻译键的唯一性,避免重复定义。
- 描述性键名:使用具有明确含义的键名,便于理解和维护。
- 模块化管理:将翻译键按功能模块划分,便于管理和扩展。
- 注释:为复杂的翻译键添加注释,说明其用途和上下文。
添加新语言
添加新语言的流程包括:
- 创建新的语言资源文件,如
fr-FR.ts
。 - 复制现有语言文件的结构和内容,并进行本地化翻译。
- 更新语言切换组件,使其支持新语言。
- 测试新语言的显示效果,确保所有文本正确显示。
Mermaid图
国际化模块结构

该图展示了国际化模块的核心组成部分,包括语言资源文件和规范指南。语言资源文件按语言划分,规范指南则提供了命名结构、模块划分、参数化文本、最佳实践和添加新语言的指导。
表格
主要功能模块及其描述
模块名称 | 描述 |
---|---|
common | 通用操作文本(如“加载”、“保存”) |
nav | 导航栏文本(如“首页”、“仪表盘”) |
settings | 设置页面选项(如“语言设置”、“API 设置”) |
modelManager | 模型管理文本(如“模型列表”、“删除模型”) |
templateManager | 模板管理文本(如“添加模板”、“编辑模板”) |
语言资源文件示例
文件名 | 描述 |
---|---|
en-US.ts | 英文语言资源文件 |
zh-CN.ts | 中文语言资源文件 |
代码片段
示例翻译键定义
// en-US.ts
export default {
common: {
loading: "Loading...",
save: "Save"
},
nav: {
home: "Home",
dashboard: "Dashboard"
}
};
// zh-CN.ts
export default {
common: {
loading: "加载中...",
save: "保存"
},
nav: {
home: "首页",
dashboard: "仪表盘"
}
};
深入分析
翻译键的组织方式
国际化模块采用嵌套对象结构来组织翻译键,这种结构清晰地反映了功能模块的层次关系。每个顶层键代表一个功能模块,如 common
、nav
、settings
等,而子键则对应具体的UI元素或操作。
例如,在 common
模块中,包含了加载状态、保存操作等通用文本:
common: {
loading: "Loading...",
save: "Save",
cancel: "Cancel",
confirm: "Confirm"
}
而在 nav
模块中,则定义了导航栏相关的文本:
nav: {
home: "Home",
dashboard: "Dashboard",
settings: "Settings"
}
这种组织方式使得翻译键易于查找和维护,同时也便于开发人员理解各个文本的用途。
参数化文本的实现细节
参数化文本通过在翻译键中使用占位符 {}
来实现动态内容的插入。这种方式允许同一个翻译键在不同上下文中显示不同的内容,提高了文本的复用性。
例如,删除确认提示可以通过参数化文本来适应不同的对象:
deleteConfirm: "Are you sure you want to delete {name}?"
在实际使用中,{name}
会被替换为具体的对象名称,如 “model” 或 “template”。这种实现方式不仅减少了翻译键的数量,还提高了文本的灵活性。
功能模块的本地化覆盖
国际化模块涵盖了项目中的主要功能模块,包括但不限于:
- 通用术语:常见操作和状态提示(如“加载中”、“确认”)
- 导航菜单项:导航栏中的页面标题(如“首页”、“仪表盘”)
- 提示词优化器:优化器界面和功能描述
- 模型管理:模型列表、连接测试、编辑删除等操作文本
- 模板管理:模板添加、编辑、导入导出及格式说明
- 历史记录:历史记录查看与清除提示
- 主题设置:不同主题模式的描述
- 测试功能:测试启动、对比、结果展示等文本
- 模板功能:模板配置、选择、编辑、迁移等操作提示
每个功能模块都有对应的翻译键,确保用户在使用不同语言时能够获得一致的体验。
规范指南的具体实现
《国际化(i18n)规范指南》中提到的命名结构和最佳实践在实际代码中得到了充分体现。例如,翻译键的命名遵循了描述性原则,使得每个键名都能清晰地表达其用途:
promptOptimizer: {
title: "Prompt Optimizer",
description: "Optimize your prompts for better results",
optimize: "Optimize",
reset: "Reset"
}
此外,模块化管理也得到了很好的实践,每个功能模块都有独立的翻译键集合,便于维护和扩展。
结论
国际化模块通过结构化的语言资源文件和规范指南,为项目提供了高质量的多语言支持。通过遵循最佳实践,确保翻译键的一致性和可维护性,同时支持参数化文本和新增语言的扩展。该模块在提升用户体验和应用可访问性方面发挥了重要作用。通过深入分析翻译键的组织方式、参数化文本的实现细节以及功能模块的本地化覆盖,我们可以看到国际化模块在项目中的重要地位和实际应用价值。
本网站提供的所有AI生成内容均基于人工智能技术和大语言模型算法,根据用户输入指令自动生成。生成内容不代表本网站观点,亦不构成任何形式的专业建议。本公司对生成内容的准确性、完整性、适用性及合法性不作明示或默示的保证,用户应对生成内容自行判断并承担全部使用风险。