This document provides a high-level introduction to the Prompt Optimizer system, an AI prompt optimization tool that helps users improve their prompts for large language models (LLMs). This overview covers:
For detailed information about specific subsystems:
Prompt Optimizer is a web-based AI prompt optimization tool that intelligently improves prompts for large language models. The system analyzes user-provided prompts and generates optimized versions that produce better, more consistent AI responses.
Key Capabilities:
The application is a pure client-side tool—all data processing occurs in the browser or desktop app, with API calls made directly to AI service providers. No intermediate servers handle user data.
Sources: README.md23-55 packages/ui/src/i18n/locales/en-US.ts18-106
Prompt Optimizer follows a layered monorepo architecture with clear separation between shared libraries and platform-specific implementations:
Architecture Principles:
Platform-Agnostic Core (packages/core/): Contains all business logic with zero UI dependencies
PromptService, LLMService, ImageService, EvaluationServiceModelManager, TemplateManager, HistoryManager, VariableManagerTextAdapterRegistry, ImageAdapterRegistry with 10+ provider implementationsStorageProvider interface with IndexedDBStorageProvider, FileStorageProviderReusable UI Layer (packages/ui/): Vue 3 components and Pinia stores shared across platforms
PromptOptimizerApp.vue with router-driven mode switchingBasicSystemWorkspace.vue, ContextUserWorkspace.vue, ImageText2ImageWorkspace.vue, etc.ModelManagerUI.vue, TemplateManagerUI.vue, HistoryDrawerUI.vueThin Platform Wrappers: Minimal platform-specific code
packages/web/src/main.ts): Direct mount of PromptOptimizerApp.vuepackages/desktop/main.js): Electron IPC bridge + bundled web apppackages/extension/src/main.ts): Chrome extension popup wrapperpackages/mcp-server/src/start.ts): Express HTTP server exposing core servicesAdapter Pattern: Provider integrations implement common interfaces
OpenAIAdapter, GeminiAdapter, AnthropicAdapter in packages/core/src/services/llm/adapters/GeminiImageAdapter, OpenAIImageAdapter in packages/core/src/services/llm/adapters/Storage Abstraction: Platform-specific persistence through unified interface
IndexedDBStorageProvider via DexieFileStorageProvider writing to userData/data.jsonImageStorageService with SHA-256 content-based deduplicationSources: package.json1-107 packages/ui/src/components/app-layout/PromptOptimizerApp.vue1-70 packages/core/package.json1-46 packages/ui/package.json1-67
The codebase is organized as a pnpm workspace monorepo with six packages and strict dependency order:
| Package | Key Files | Dependencies | Build Tool | Output Format |
|---|---|---|---|---|
@prompt-optimizer/core | src/index.tssrc/services/PromptService.tssrc/managers/ModelManager.ts | None | tsup | CJS/ESM librarydist/index.js, dist/index.cjs |
@prompt-optimizer/ui | src/components/app-layout/PromptOptimizerApp.vuesrc/router/index.tssrc/stores/sessions/ | @prompt-optimizer/core | vite (lib mode) | ESM + CSSdist/index.js, dist/style.css |
@prompt-optimizer/web | src/main.tssrc/App.vue | @prompt-optimizer/ui | vite | Static sitedist/index.html |
@prompt-optimizer/desktop | main.js (Electron main)preload.js (contextBridge)web-dist/ (bundled web) | @prompt-optimizer/coreBundles web build | electron-builder | Native apps.exe, .dmg, .AppImage |
@prompt-optimizer/extension | src/main.tspublic/manifest.jsonbackground.js | @prompt-optimizer/ui | vite | Extension bundledist/ |
@prompt-optimizer/mcp-server | src/start.tssrc/index.ts | @prompt-optimizer/core | tsup | Node.js CLIdist/start.cjs |
The monorepo enforces a strict build order defined in package.json scripts:
1. Core Build (no dependencies):
2. UI Build (depends on core):
3. Platform Builds (parallel, depend on core/ui):
4. Full Build (orchestrates all):
Development servers (with hot reload):
Sources: package.json11-59 packages/core/package.json16-24 packages/ui/package.json24-31 packages/web/package.json6-13 packages/desktop/package.json10-16 packages/extension/package.json6-11 packages/mcp-server/package.json11-17
The same codebase deploys to four distinct platforms through different entry points:
| Platform | Entry Point | Storage | Unique Features |
|---|---|---|---|
| Web | packages/web/src/main.ts | IndexedDB | Browser CORS restrictions |
| Desktop | packages/desktop/main.js | File system (userData) | IPC bridge, auto-updates, proxy support |
| Extension | packages/extension/src/main.ts | IndexedDB (extension storage) | Chrome API access, manifest v3 |
| MCP | packages/mcp-server/src/start.ts | Environment variables | MCP protocol tools, HTTP server |
Each platform uses a different StorageProvider implementation:
IndexedDBStorageProvider: Used by web and extension for browser-based persistenceFileStorageProvider: Used by desktop for file system persistence at app.getPath('userData')/data.jsonprocess.env.VITE_* variablesAll storage providers implement the same interface, allowing the core services to remain platform-agnostic.
Sources: packages/web/package.json1-36 packages/desktop/package.json1-99 packages/extension/package.json1-48 packages/mcp-server/package.json1-48
The application organizes functionality into three function modes with router-driven workspace selection:
| Function Mode | Submodes | Workspace Components | Key Features |
|---|---|---|---|
| Basic | system, user | BasicSystemWorkspace, BasicUserWorkspace | Simple prompt input/output, template selection |
| Pro/Context | multi, variable | ContextSystemWorkspace, ContextUserWorkspace | Variable management, conversation manager, tool calling |
| Image | text2image, image2image | ImageText2ImageWorkspace, ImageImage2ImageWorkspace | Image generation, parameter configuration |
Each workspace component follows a common structure:
Pro Mode Distinction:
ContextSystemWorkspace): Includes ConversationManager for managing multi-turn conversations with system/user/assistant/tool messagesContextUserWorkspace): Single prompt input with variable extraction and smart generation featuresSources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue1-14 packages/ui/src/components/context-mode/ContextSystemWorkspace.vue1-27 packages/ui/src/i18n/locales/en-US.ts125-165
The @prompt-optimizer/core package implements business logic through a layered service-oriented architecture:
PromptService: Main orchestration layer for optimization workflows
TemplateProcessorLLMService: Handles all text model API communication
ImageService: Handles image generation
ImageStorageService for deduplicationModelManager/ImageModelManager: Configuration management for models
TemplateManager: Manages optimization templates
HistoryManager: Version control and iteration tracking
PromptRecordChain structuresSources: Core service files in packages/core/src/services/ and manager files in packages/core/src/managers/
The @prompt-optimizer/ui package provides reusable Vue 3 components organized by feature domain:
PromptOptimizerApp: Central coordination component
Workspace Components: Mode-specific layouts
InputPanelUI: Prompt input with features
PromptPanelUI: Optimized output display
ConversationManager: Multi-message editor (Pro Multi mode only)
Sources: packages/ui/src/components/app-layout/PromptOptimizerApp.vue1-70 workspace components in packages/ui/src/components/basic-mode/, context-mode/, and image-mode/
The application uses Pinia stores for reactive state management with automatic mode-isolated persistence:
Each session store maintains:
| State Field | Type | Purpose |
|---|---|---|
originalPrompt | string | User's input prompt |
optimizedPrompt | string | Latest optimized result |
optimizedReasoning | string | AI's reasoning explanation |
chainId | string | Current iteration chain ID |
versionId | string | Current version ID |
selectedModelKey | string | Selected optimization model |
selectedTemplateId | string | Selected template |
testVariants | array | Multi-column test configurations |
testVariantResults | map | Test results per variant |
temporaryVariables | map | Session-scoped variables (Pro/Image modes) |
PreferenceService with debouncingImageStorageService with content-based deduplication using SHA-256 hashesSources: packages/ui/src/stores/sessions/basicSystem.ts packages/ui/src/stores/sessions/proVariable.ts packages/ui/src/stores/sessions/imageText2Image.ts packages/core/src/services/PreferenceService.ts packages/core/src/services/ImageStorageService.ts packages/core/src/storage/dexie.ts packages/core/src/storage/file.ts
| Layer | Technology | Purpose |
|---|---|---|
| Frontend Framework | Vue 3.5+ | Reactive UI components |
| State Management | Pinia 3.0+ | Centralized state stores |
| UI Library | Naive UI 2.42+ | Component library |
| Routing | Vue Router 4 | Client-side routing |
| Internationalization | vue-i18n 11.2+ | Multi-language support (en-US, zh-CN, zh-TW) |
| Build Tool | Vite 7.2+ | Fast development and production builds |
| Type System | TypeScript 5.8+ | Static type checking |
| Component | Technology | Purpose |
|---|---|---|
| Runtime | Electron 39.2+ | Native desktop wrapper |
| IPC | ipcMain/ipcRenderer | Main-renderer communication |
| Security | contextBridge | Secure API exposure to renderer |
| Updates | electron-updater 6.6.2 | Auto-update mechanism |
| Packaging | electron-builder 26.0+ | Multi-platform builds |
| Component | Technology | Purpose |
|---|---|---|
| AI SDKs | OpenAI SDK, Google GenAI, Anthropic SDK | Provider-specific API clients |
| HTTP Client | Built into SDKs | API communication |
| Template Engine | Mustache 4.2 | Variable substitution in templates |
| Schema Validation | Zod 3.25+ | Runtime type validation |
| Storage | Dexie 4.0+ (IndexedDB wrapper) | Browser persistence |
| Tool | Technology | Purpose |
|---|---|---|
| Package Manager | pnpm 10.6+ | Monorepo management |
| Test Framework | Vitest 4.0+ | Unit and integration tests |
| E2E Testing | Playwright 1.56+ | End-to-end browser tests |
| Code Quality | ESLint + TypeScript ESLint | Linting and type checking |
| Markdown Rendering | markdown-it 14.1+ | Prompt output rendering |
| Code Highlighting | highlight.js 11.11+ | Syntax highlighting in output |
Sources: package.json74-95 packages/core/package.json34-45 packages/ui/package.json33-49 packages/desktop/package.json24-30
All AI providers implement a common interface through adapter classes:
OpenAIAdapter: OpenAI API integrationGeminiAdapter: Google Gemini API integrationAnthropicAdapter: Anthropic Claude API integrationDeepSeekAdapter: DeepSeek API integrationThis enables provider-agnostic business logic in LLMService and easy addition of new providers.
Core services are instantiated once and passed down through the component tree via props or provide/inject, avoiding redundant initialization.
Managers (like ModelManager, TemplateManager) act as repositories, abstracting storage operations through the StorageProvider interface.
Workspace components follow a template structure with common lifecycle hooks (mount, save, restore) but implement mode-specific behavior.
Pinia stores implement reactive observers—components automatically re-render when store state changes.
Sources: Adapter implementations in packages/core/src/adapters/, service files in packages/core/src/services/
The following sequence diagram shows an optimization request flowing through the system with actual method names and classes:
User Action: Click "Optimize" button in ContextUserWorkspace.vue → calls handleOptimize()
State Retrieval: Workspace reads from useProVariableSession() store
store.originalPromptstore.selectedModelKeystore.selectedTemplateIdService Call: Invokes PromptService.optimize(OptimizationRequest)
packages/core/src/services/PromptService.tsoriginalPrompt, modelKey, templateId, optimizationModeTemplate Processing:
TemplateManager.getTemplate(templateId) retrieves template definitionTemplateProcessor.processTemplate(template, variables) substitutes {{originalPrompt}}, {{lastOptimizedPrompt}}, etc.Message[] array with roles and contentLLM Streaming:
LLMService.streamOptimization(request) orchestrates the API callModelManager.getModelConfig(modelKey) retrieves provider configurationLLMService.getAdapter(provider) returns appropriate adapter (e.g., OpenAIAdapter)adapter.streamChatCompletion({ messages, stream: true }) makes HTTP requestAPI Streaming: Provider API streams chunks via Server-Sent Events
Adapter yields chunks as async generatorAdapter → LLMService → PromptService → WorkspaceHistory Tracking:
HistoryManager.saveOptimization(record) saves resultPromptRecordChain or adds version to existing chain{ chainId, versionId } for version trackingState Update: Workspace updates Pinia store
store.optimizedPrompt = result.optimizedPromptstore.chainId = result.chainIdwatch() triggers automatic savePersistence: Store saves to storage via PreferenceService
'session/v1/pro/variable'DexieStorageProvider (web) or FileStorageProvider (desktop)Sources: packages/core/src/services/PromptService.ts packages/core/src/services/LLMService.ts packages/core/src/managers/TemplateManager.ts packages/core/src/services/llm/adapters/openaiadapter.ts packages/ui/src/components/context-mode/ContextUserWorkspace.vue packages/ui/src/stores/sessions/proVariable.ts
The system reads configuration from environment variables prefixed with VITE_:
| Variable Pattern | Example | Purpose |
|---|---|---|
VITE_OPENAI_API_KEY | sk-... | OpenAI API key |
VITE_GEMINI_API_KEY | AI... | Google Gemini API key |
VITE_DEEPSEEK_API_KEY | sk-... | DeepSeek API key |
VITE_CUSTOM_API_KEY_<id> | VITE_CUSTOM_API_KEY_ollama | Custom model API key |
VITE_CUSTOM_API_BASE_URL_<id> | http://localhost:11434/v1 | Custom model base URL |
VITE_CUSTOM_API_MODEL_<id> | qwen2.5:7b | Custom model name |
ACCESS_PASSWORD | mypassword | Docker deployment password |
Models are configured in ModelManager with properties:
modelKey: Unique identifierdisplayName: User-facing nameprovider: Provider type (openai, gemini, anthropic, etc.)apiUrl: API base URLapiKey: API key (optional if set via env var)defaultModel: Default model name for providerenabled: Whether model is activecapabilities: Feature flags (tools, reasoning, vision)Sources: README.md248-289 packages/core/src/managers/ModelManager.ts
To understand specific subsystems in depth, refer to the following wiki pages:
For development setup and contribution guidelines, see Development Workflow and Build System.
Sources: README.md1-472 table of contents in prompt
Refresh this wiki