2025-12-20 20:18:54 +05:30
{
"common" : {
"save" : "Save" ,
"cancel" : "Cancel" ,
"close" : "Close" ,
"confirm" : "Confirm" ,
"clear" : "Clear" ,
"edit" : "Edit" ,
"delete" : "Delete" ,
"loading" : "Loading.." ,
"new" : "NEW"
} ,
"nav" : {
"about" : "About" ,
"editor" : "Editor" ,
"newChat" : "Start fresh chat" ,
2025-12-22 21:54:25 +08:00
"github" : "GitHub" ,
2025-12-20 20:18:54 +05:30
"settings" : "Settings" ,
"hidePanel" : "Hide chat panel (Ctrl+B)" ,
"showPanel" : "Show chat panel (Ctrl+B)" ,
2025-12-30 23:45:31 +09:00
"aiChat" : "AI Chat"
2025-12-20 20:18:54 +05:30
} ,
"providers" : {
"useServerDefault" : "Use Server Default" ,
"openai" : "OpenAI" ,
"anthropic" : "Anthropic" ,
"google" : "Google" ,
"azure" : "Azure OpenAI" ,
"openrouter" : "OpenRouter" ,
"deepseek" : "DeepSeek" ,
2026-01-06 18:41:25 +08:00
"siliconflow" : "SiliconFlow" ,
feat: Add support for Chinese AI providers (GLM, Qwen, Kimi, MiniMax, Qiniu)
* feat: Add support for Chinese AI providers (GLM, Qwen, Kimi, MiniMax, Qiniu)
- Add minimax, glm, qwen, qiniu, kimi to ProviderName type
- Add provider configurations to PROVIDER_INFO with default base URLs
- Add suggested models for MiniMax in SUGGESTED_MODELS
- Add minimax/glm/qwen/qiniu/kimi cases to getAIModel using OpenAI-compatible SDK
- Update ALLOWED_CLIENT_PROVIDERS and error messages
- Add environment variable examples to env.example
Fixes: MiniMax API compatibility issue (invalid chat setting 2013)
* fix: Add missing providers to PROVIDER_ENV_VARS type
* fix: Handle null case in PROVIDER_ENV_VARS for new providers
* fix: Add minimax/glm/qwen/kimi/qiniu support to validate-model API
- Add getDefaultBaseUrl helper function
- Add validation cases for new providers in validate-model route
* fix: Add new providers to buildProviderOptions switch case
* fix: Merge multiple system messages into one for minimax/glm/qwen/kimi/qiniu
MiniMax API doesn't support multiple system messages.
This fix combines them into a single message for Chinese providers.
* fix: Handle null provider in system message check
* debug: Add logging for allMessages count
* fix: Use effective provider (including env var fallback) for isSingleSystemProvider check
* fix: apply biome formatting (line-wrapping)
* docs: add Chinese AI providers documentation (MiniMax, GLM, Qwen, Kimi, Qiniu)
- Add i18n translations for new providers in all language dictionaries
- Add provider configuration documentation in en/cn/ja docs
* fix: 改进 PR #722 的代码审查反馈
1. 删除重复的 getDefaultBaseUrl 函数,改用 model-config.ts 的 PROVIDER_INFO
2. validate-model 路由改用 AI SDK 的 createOpenAI + generateText
3. 修复 resolveBaseURL 回退逻辑,传入 PROVIDER_INFO 的 defaultBaseUrl
4. 删除无用的 .bak 备份文件
Co-authored-by: Shinyi <shinyi@openclaw.ai>
* fix: 修正中国 AI provider 端点配置
- qiniu: api.qiniucdn.com → api.qnaigc.com
- qwen: dashscope.aliyun.com → dashscope.aliyuncs.com
- 更新 env.example 文档链接
Co-authored-by: Shinyi <shinyi@openclaw.ai>
* feat: MiniMax 使用 Anthropic 兼容 API
- MiniMax 改用 createAnthropic (而非 createOpenAI)
- 支持 api.minimax.io/anthropic 和 api.minimaxi.com/anthropic
- 合并多个 system 消息为单个 (MiniMax/GLM/Qwen/Kimi/Qiniu)
- 更新默认模型为 MiniMax-M2.5 系列
- 支持 MINIMAX_BASE_URL 环境变量配置
Co-authored-by: Shinyi <shinyi@openclaw.ai>
* docs: 更新 MiniMax 文档
- 添加 Anthropic 兼容 API 说明
- 更新默认模型为 MiniMax-M2.5
- 添加国际版/中国大陆版配置示例
- 更新 env.example 注释
Co-authored-by: Shinyi <shinyi@openclaw.ai>
* fix: 完善 MiniMax 双端点支持及问题修复
- 支持 MiniMax Anthropic 兼容端点和 OpenAI 兼容端点自动切换
- 修正默认端点为 api.minimaxi.com (中国大陆可用)
- 修复端点路径缺少 /v1 的问题
- 添加前端 MiniMax logo 映射
- 移除调试日志
- 修正 env.example 默认配置
* chore: clean backup artifacts and align biome formatting
* fix: resolve effectiveProvider bug, deduplicate MiniMax URL logic, fix docs
- Fix critical bug: effectiveProvider was empty during auto-detection,
causing multi-system-message to be sent to MiniMax (which rejects it).
Now uses resolved provider from getAIModel instead of re-deriving it.
- Extract normalizeMiniMaxBaseURL() shared helper to eliminate duplication
between ai-providers.ts and validate-model/route.ts
- Add guard for undefined MiniMax baseURL to prevent hitting api.anthropic.com
- Fix docs: mark China mainland URL as default (matches code behavior)
- Restructure minimax/glm/qwen/kimi/qiniu validation to use shared pattern
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: document MiniMax dual API formats in docs and UI
- Add hint below Base URL input when MiniMax is selected, explaining
Anthropic-compatible (/anthropic) vs OpenAI-compatible (/v1) endpoints
- Update all 3 ai-providers docs (en/cn/ja) to list all 4 endpoint options
(China/International × Anthropic/OpenAI)
- Add i18n translations for the hint in all 4 locales
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: deduplicate PROVIDER_LOGO_MAP, remove unnecessary optional chaining
- Extract PROVIDER_LOGO_MAP to lib/types/model-config.ts (was duplicated
in model-config-dialog.tsx and model-selector.tsx)
- Remove unnecessary ?. on PROVIDER_INFO.minimax (it's a full Record)
---------
Co-authored-by: msga-oc <msga-oc@gitea.misakiga.top>
Co-authored-by: Shinyi <shinyi@openclaw.ai>
Co-authored-by: dayuan.jiang <jdy.toh@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:53:47 +08:00
"modelscope" : "ModelScope" ,
"minimax" : "MiniMax" ,
"glm" : "GLM" ,
"qwen" : "Qwen" ,
"kimi" : "Kimi" ,
2026-07-12 08:10:12 +08:00
"qiniu" : "Qiniu" ,
"mimo" : "MiMo (Xiaomi)"
2025-12-20 20:18:54 +05:30
} ,
"chat" : {
"placeholder" : "Describe your diagram or upload a file..." ,
"send" : "Send" ,
2026-01-29 19:10:25 +05:30
"stopGeneration" : "Stop generation" ,
2025-12-20 20:18:54 +05:30
"sendMessage" : "Send message" ,
"clearConversation" : "Clear conversation" ,
"diagramHistory" : "Diagram history" ,
"saveDiagram" : "Save diagram" ,
"uploadFile" : "Upload file (image, PDF, text)" ,
"minimalStyle" : "Minimal" ,
"styledMode" : "Styled" ,
"minimalTooltip" : "Use minimal for faster generation (no colors)" ,
"regenerate" : "Regenerate response" ,
"copyResponse" : "Copy response" ,
"copied" : "Copied!" ,
"failedToCopy" : "Failed to copy" ,
2025-12-30 19:52:57 +08:00
"failedToCopyDetail" : "Failed to copy message. Please copy manually or check clipboard permissions." ,
2025-12-20 20:18:54 +05:30
"goodResponse" : "Good response" ,
"badResponse" : "Bad response" ,
"clickToEdit" : "Click to edit" ,
"editMessage" : "Edit message" ,
2026-01-05 20:53:50 +05:30
"saveAndSubmit" : "Save & Submit" ,
"ExtractURL" : "Extract from URL"
2025-12-20 20:18:54 +05:30
} ,
"examples" : {
"title" : "Create diagrams with AI" ,
"subtitle" : "Describe what you want to create or upload an image to replicate" ,
"quickExamples" : "Quick Examples" ,
"paperToDiagram" : "Paper to Diagram" ,
"paperDescription" : "Upload .pdf, .txt, .md, .json, .csv, .py, .js, .ts and more" ,
"animatedDiagram" : "Animated Diagram" ,
"animatedDescription" : "Draw a transformer architecture with animated connectors" ,
"awsArchitecture" : "AWS Architecture" ,
"awsDescription" : "Create a cloud architecture diagram with AWS icons" ,
"replicateFlowchart" : "Replicate Flowchart" ,
"replicateDescription" : "Upload and replicate an existing flowchart" ,
"creativeDrawing" : "Creative Drawing" ,
"creativeDescription" : "Draw something fun and creative" ,
"cachedNote" : "Examples are cached for instant response" ,
"mcpServer" : "MCP Server" ,
2026-04-06 10:17:38 +09:00
"mcpDescription" : "Use in Claude Desktop, VS Code & Cursor"
2025-12-20 20:18:54 +05:30
} ,
"settings" : {
"title" : "Settings" ,
"description" : "Configure your application settings." ,
2026-01-28 14:36:54 +01:00
"apiKeysModels" : "API Keys & Models" ,
"apiKeysModelsDescription" : "Configure AI providers and API keys." ,
2025-12-20 20:18:54 +05:30
"accessCode" : "Access Code" ,
"accessCodePlaceholder" : "Enter access code" ,
"accessCodeDescription" : "Required to use this application." ,
"aiProvider" : "AI Provider Settings" ,
"aiProviderDescription" : "Use your own API key to bypass usage limits. Your key is stored locally in your browser and is never stored on the server." ,
"provider" : "Provider" ,
"modelId" : "Model ID" ,
"apiKey" : "API Key" ,
"apiKeyPlaceholder" : "Your API key" ,
"baseUrl" : "Base URL (optional)" ,
"customEndpoint" : "Custom endpoint URL" ,
"overrides" : "Overrides" ,
"clearSettings" : "Clear Settings" ,
"useServerDefault" : "Use Server Default" ,
2025-12-22 21:54:25 +08:00
"language" : "Language" ,
"languageDescription" : "Choose your interface language." ,
2025-12-20 20:18:54 +05:30
"theme" : "Theme" ,
"themeDescription" : "Dark/Light mode for interface and DrawIO canvas." ,
"drawioStyle" : "DrawIO Style" ,
2026-05-15 22:14:20 +08:00
"drawioStyleDescription" : "Canvas style" ,
"themeDefault" : "Default" ,
"themeDark" : "Dark" ,
"themeMinimal" : "Minimal" ,
"themeSketch" : "Sketch" ,
"themeSimple" : "Simple" ,
2025-12-28 18:46:10 +05:30
"diagramStyle" : "Diagram Style" ,
"diagramStyleDescription" : "Toggle between minimal and styled diagram output." ,
2026-01-11 07:54:32 +06:00
"sendShortcut" : "Send Shortcut" ,
"sendShortcutDescription" : "Choose how to send messages." ,
"enterToSend" : "Enter to send" ,
"ctrlEnterToSend" : "Cmd/Ctrl+Enter to send" ,
2025-12-28 18:46:10 +05:30
"diagramActions" : "Diagram Actions" ,
"diagramActionsDescription" : "Manage diagram history and exports" ,
"history" : "History" ,
2026-01-09 09:26:19 +09:00
"download" : "Download" ,
"proxy" : "Proxy Settings" ,
"proxyDescription" : "Configure HTTP/HTTPS proxy for API requests (Desktop only)" ,
"httpProxy" : "HTTP Proxy" ,
"httpsProxy" : "HTTPS Proxy" ,
"applyProxy" : "Apply" ,
2026-01-20 20:52:04 +09:00
"proxyApplied" : "Proxy settings applied" ,
"diagramValidation" : "Diagram Validation (Experimental)" ,
"diagramValidationDescription" : "Use a vision language model to validate generated diagrams. Requires a VLM like GPT-5.2 or Sonnet-4.5." ,
"enabled" : "Enabled" ,
2026-03-07 19:07:54 +09:00
"disabled" : "Disabled" ,
"customSystemMessage" : "Custom System Message" ,
"customSystemMessageDescription" : "Add custom instructions appended to the AI's system prompt." ,
feat: add personal My Templates library alongside Quick Examples (#773)
* 增加了ralph自动化编程梳理
* feat: US-001 - 为模板库建立独立的 IndexedDB 存储层
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-002 - 在空聊天状态用我的模板库替换官方示例
- 将 ChatLobby 中的 Quick Examples 替换为 TemplatePanel
- 当没有历史会话时,展示完整的模板库面板
- 当有历史会话时,展示可折叠的 "My Templates" 区域
- 使用 TemplatePanel 组件展示用户的个人模板库
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-004 - Provide template creation flow
- Create TemplateCreateDialog component with form fields for prompt, title, description, tags, and pinned
- Add i18n translations for template creation UI in en, zh, zh-Hant, ja
- Update TemplatePanel to integrate the create dialog
- Support initialPrompt prop for pre-filling from current input
- Validate required prompt field (empty prompt not allowed)
- Auto-generate default title from first 20 chars of Pin templates appear at top of list
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-005 - 为模板卡片提供编辑、删除和复制操作
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-006 - Send template directly on click and record usage statistics
- Implement click-to-send template functionality with confirmation dialog
- Add clickCount and runCount increment logic
- Display runCount and lastUsedAt on template card
- Add i18n translations for confirmation dialog (en, zh, zh-Hant, ja)
- Pass onSendTemplate and currentInput props through component hierarchy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-007 - Support template search, pin and default sorting
- Add search bar to TemplatePanel with real-time filtering by title, description, and tags
- Add pin/unpin toggle button on template cards (uses Bookmark icon with fill indicator)
- Search uses existing searchTemplates function from template-storage
- Sort uses existing sortTemplates function (pinned desc, runCount desc, lastUsedAt desc, updatedAt desc)
- Show empty state with Search icon when search returns no results
- List re-sorts immediately after pin/unpin toggle
- Add i18n keys: searchPlaceholder, searchNoResults, pin, unpin for all 4 languages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-008 - Support saving current input as template
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-009 - Support saving historical user message as template
- Add "Save as Template" button to user messages
- Pre-fill prompt with original user message text
- Only show on user messages,- Dialog opens TemplateCreateDialog on click
- Template appears in list immediately after saving
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-010 - Support template import and export
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: remove local-only dirs from git tracking (.agents, .cursor, scripts, screenshots)
These directories contain local IDE configs, agent scripts, and
dev tooling that should not be part of the upstream repository.
Added them to .gitignore to prevent future accidental commits.
* chore: remove AGENTS.md from git tracking
* fix: add missing i18n keys for template export/import (en/zh/zh-Hant/ja)
* fix: review fixes for my-templates PR
- Fix fragile querySelector("form") with id-based lookup
- Add objectStoreNames.contains guards for IndexedDB upgrades
- Remove duplicate TemplateSchema, import from template-storage
- Revert contributor-specific .gitignore additions
- Fix broken i18n placeholders and missing translations (zh/ja/zh-Hant)
- Remove unused setFiles prop from ChatLobby
- Remove tags feature (unnecessary complexity)
- Improve template card layout: overlay icons on hover, align stats
- Add break-all and overflow-hidden for long prompt text in dialogs
- Move incrementClickCount into sendTemplate for accurate tracking
- Use Intl.RelativeTimeFormat for locale-aware relative time
* feat: restore Quick Examples panel and add lobby panel visibility settings
Bring back the ExamplePanel as a third collapsible section in ChatLobby
alongside Recent Chats and My Templates. Add toggle switches in Settings
to show/hide each lobby panel, persisted via localStorage.
* fix: template send race condition, import defaults, and empty title bug
- Use flushSync instead of setTimeout(0) in handleSendTemplate to
ensure React state is flushed before form submission
- Explicitly validate and default all fields in importTemplates to
prevent undefined counters from malformed import JSON
- Fall back to existing title in edit dialog instead of writing undefined
* fix: address Copilot review comments and remove PRD file
- Fix fallback formatLastUsed returning "Not used yet" for recent usage
- Remove dead mounted flag in TemplatePanel useEffect
- Respect panel visibility settings in no-history lobby state
- Reject empty/whitespace titles in import validation
- Trim title/prompt in importTemplates with default title fallback
- Remove tasks/prd-template-library-replaces-examples.md from repo
* fix: remove double sort, dead code, redundant stats, and break-all CSS
- Remove redundant sortTemplates call in loadTemplates (already sorted by getAllTemplates)
- Remove unused createEmptyTemplateInput and sortTemplates import
- Show "Not used yet" only once for unused templates instead of twice
- Use break-words instead of break-all on prompt textareas
---------
Co-authored-by: 杜雷 <dreamfly@126.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: dayuan.jiang <jdy.toh@gmail.com>
2026-04-03 11:16:01 +08:00
"customSystemMessagePlaceholder" : "e.g., Always use blue color scheme for diagrams..." ,
"panelVisibility" : "Lobby Panels" ,
"panelVisibilityDescription" : "Choose which panels to show on the chat lobby." ,
"showRecentChats" : "Recent Chats" ,
"showMyTemplates" : "My Templates" ,
"showQuickExamples" : "Quick Examples"
2025-12-20 20:18:54 +05:30
} ,
"save" : {
"title" : "Save Diagram" ,
"description" : "Choose a format and filename to save your diagram." ,
"format" : "Format" ,
"filename" : "Filename" ,
"filenamePlaceholder" : "Enter filename" ,
"formats" : {
"drawio" : "Draw.io XML" ,
"png" : "PNG Image" ,
2026-04-03 07:50:57 +08:00
"svg" : "SVG Image" ,
"xmlsvg" : "Editable SVG"
2026-01-04 09:41:32 +05:30
} ,
"savedSuccessfully" : "Saved successfully!"
2025-12-20 20:18:54 +05:30
} ,
"history" : {
"title" : "Diagram History" ,
"description" : "Here saved each diagram before AI modification.\nClick on a diagram to restore it" ,
"noHistory" : "No history available yet. Send messages to create diagram history." ,
"version" : "Version" ,
"restoreTo" : "Restore to Version {version}?"
} ,
"dialogs" : {
"clearTitle" : "Clear Everything?" ,
"clearDescription" : "This will clear the current conversation and reset the diagram. This action cannot be undone." ,
"clearEverything" : "Clear Everything" ,
"clearSuccess" : "Started a fresh chat"
} ,
"errors" : {
"maxFiles" : "Too many files. Maximum {max} allowed." ,
"onlyMoreAllowed" : "Only {slots} more file(s) allowed" ,
"fileExceeds" : "\"{name}\" is {size} (exceeds {max}MB)" ,
"unsupportedType" : "\"{name}\" is not a supported file type" ,
"filesRejected" : "{count} files rejected:" ,
"andMore" : "...and {count} more" ,
"invalidAccessCode" : "Invalid or missing access code. Please configure it in Settings." ,
"networkError" : "Network error. Please check your connection." ,
"retryLimit" : "Auto-retry limit reached ({max}). Please try again manually." ,
2025-12-30 19:52:57 +08:00
"continuationRetryLimit" : "Continuation retry limit reached ({max}). The diagram may be too complex." ,
2025-12-20 20:18:54 +05:30
"validationFailed" : "Diagram validation failed. Please try regenerating." ,
"malformedXml" : "AI generated invalid diagram XML. Please try regenerating." ,
"failedToProcess" : "Failed to process diagram. Please try regenerating." ,
"sessionCorrupted" : "Session data was corrupted. Starting fresh." ,
"failedToSave" : "Failed to save messages to localStorage" ,
"failedToRestore" : "Failed to restore from localStorage" ,
"failedToPersist" : "Failed to persist state before unload" ,
"failedToExport" : "Error fetching chart data" ,
2025-12-30 19:52:57 +08:00
"failedToLoadExample" : "Error loading example image" ,
"failedToRecordFeedback" : "Failed to record your feedback. Please try again." ,
"storageUpdateFailed" : "Chat cleared but browser storage could not be updated"
2025-12-20 20:18:54 +05:30
} ,
"quota" : {
"dailyLimit" : "Daily Quota Reached" ,
"tokenLimit" : "Daily Token Limit Reached" ,
"tpmLimit" : "Rate Limit" ,
"tpmMessage" : "Too many requests. Please wait a moment." ,
2025-12-22 19:30:20 +05:30
"tpmMessageDetailed" : "Rate limit reached ({limit} tokens/min). Please wait {seconds} seconds before sending another request." ,
2025-12-29 12:12:22 +09:00
"messageApi" : "Looks like you've reached today's demo limit. We're thrilled you're enjoying it, and while ByteDance Doubao generously sponsors this demo, we've had to set a few boundaries to keep things fair for everyone." ,
2026-02-27 07:34:05 -08:00
"messageApiSelfHosted" : null ,
2025-12-29 12:12:22 +09:00
"messageToken" : "Looks like you've reached today's token limit. We're thrilled you're enjoying it, and while ByteDance Doubao generously sponsors this demo, we've had to set a few boundaries to keep things fair for everyone." ,
2026-02-27 07:34:05 -08:00
"messageTokenSelfHosted" : null ,
2025-12-20 20:18:54 +05:30
"tip" : "<strong>Tip:</strong> You can use your own API key (click the Settings icon) or self-host the project to bypass these limits." ,
2026-02-27 07:34:05 -08:00
"tipSelfHosted" : "<strong>Tip:</strong> You can configure your own API key in the settings to continue using the service." ,
2025-12-29 12:12:22 +09:00
"reset" : "Your limit resets tomorrow. Thanks for understanding." ,
"doubaoSponsorship" : "<a href=\"{link}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"underline hover:text-foreground\">Register here</a> to get 500K free tokens per model (including Doubao, DeepSeek and Kimi), then configure your API key in model settings." ,
"configModel" : "Use Your API Key" ,
2025-12-20 20:18:54 +05:30
"selfHost" : "Self-host" ,
"sponsor" : "Sponsor" ,
"learnMore" : "Learn more →" ,
"usedOf" : "{used}/{limit}"
} ,
"tools" : {
"generateDiagram" : "Generate Diagram" ,
"editDiagram" : "Edit Diagram" ,
"appendDiagram" : "Continue Diagram" ,
"complete" : "Complete" ,
"error" : "Error" ,
"truncated" : "Truncated"
} ,
"file" : {
"reading" : "Reading..." ,
"chars" : "chars" ,
"removeFile" : "Remove file"
} ,
2026-01-05 20:53:50 +05:30
"url" : {
"title" : "Extract Content from URL" ,
"description" : "Paste a URL to extract and analyze its content" ,
"Extracting" : "Extracting..." ,
"extract" : "Extract" ,
"Cancel" : "Cancel" ,
"enterUrl" : "Please enter a URL" ,
"invalidFormat" : "Invalid URL format"
} ,
2025-12-20 20:18:54 +05:30
"reasoning" : {
"thinking" : "Thinking..." ,
"thoughtFor" : "Thought for {duration} seconds" ,
"thoughtBrief" : "Thought for a few seconds"
} ,
2025-12-30 19:52:57 +08:00
"dev" : {
"title" : "Dev: XML Streaming Simulator" ,
"preset" : "Preset:" ,
"selectPreset" : "Select a preset..." ,
"clear" : "Clear" ,
"placeholder" : "Paste mxCell XML here or select a preset..." ,
"interval" : "Interval:" ,
"chars" : "Chars:" ,
"streaming" : "Streaming..." ,
"simulate" : "Simulate" ,
"stop" : "Stop" ,
"testQuotaToast" : "Test Quota Toast" ,
"simulatingMessage" : "[Dev] Simulating XML streaming" ,
"successMessage" : "Successfully displayed the diagram."
} ,
2025-12-20 20:18:54 +05:30
"about" : {
"modelChange" : "Model Change & Usage Limits" ,
"walletCrying" : "(Or: Why My Wallet is Crying)" ,
"seekingSponsorship" : "Call for Sponsorship" ,
"contactMe" : "Contact Me" ,
"usageNotice" : "Due to high usage, I have changed the model from Claude to minimax-m2 and added some usage limits. See About page for details."
feat: multi-provider model configuration with UI/UX improvements (#355)
* feat: add multi-provider model configuration
- Add model config dialog for managing multiple AI providers
- Support for OpenAI, Anthropic, Google, Azure, Bedrock, OpenRouter, DeepSeek, SiliconFlow, Ollama, and AI Gateway
- Add model selector dropdown in chat panel header
- Add API key validation endpoint
- Add custom model ID input with keyboard navigation
- Fix hover highlight in Command component
- Add suggested models for each provider including latest Claude 4.5 series
- Store configuration locally in browser
* feat: improve model config UI and move selector to chat input
- Move model selector from header to chat input (left of send button)
- Add per-model validation status (queued, running, valid, invalid)
- Filter model selector to only show verified models
- Add editable model IDs in config dialog
- Add custom model input field alongside suggested models dropdown
- Fix hover states on provider buttons and select triggers
- Update OpenAI suggested models with GPT-5 series
- Add alert-dialog component for delete confirmation
* refactor: revert shadcn component changes, apply hover fix at usage site
* feat: add AWS credentials support for Bedrock provider
- Add AWS Access Key ID, Secret Access Key, Region fields for Bedrock
- Show different credential fields based on provider type
- Update validation API to handle Bedrock with AWS credentials
- Add region selector with common AWS regions
* fix: reset Test button after validation completes
* fix: reset validation button to Test after success
* fix: complete bedrock support and UI/UX improvements
- Add bedrock to ALLOWED_CLIENT_PROVIDERS for client credentials
- Pass AWS credentials through full chain (headers → API → provider)
- Replace non-existent GPT-5 models with real ones (o1, o3-mini)
- Add accessibility: aria-labels, focus-visible rings, inline errors
- Add more AWS regions (Ohio, London, Paris, Mumbai, Seoul, São Paulo)
- Fix setTimeout cleanup with useRef on component unmount
- Fix TypeScript type consistency in getSelectedAIConfig fallback
* chore: remove unused code
- Remove unused setAccessCodeRequired state in chat-panel.tsx
- Remove unused getSelectedModel export in model-config.ts
* fix: UI/UX improvements for model configuration dialog
- Add gradient header styling with icon badge
- Change Configuration section icon from Key to Settings2
- Add duplicate model detection with warning banner and inline removal
- Filter out already-added models from suggestions dropdown
- Add type-to-confirm for deleting providers with 3+ models
- Enhance delete confirmation dialog with warning icon
- Improve model selector discoverability (show model name + chevron)
- Add truncation for long model names with title tooltip
- Remove AI provider settings from Settings dialog (now in Model Config)
- Extract ValidationButton into reusable component
* fix: prevent duplicate model IDs within same provider
- Block adding model if ID already exists in provider
- Block editing model ID to match existing model in provider
* fix: improve duplicate model ID notifications
- Add toast notification when trying to add duplicate model
- Allow free typing when editing model ID, validate on blur
- Show warning toast instead of blocking input
* fix: improve duplicate model validation UX in config dialog
- Add inline error display for duplicate model IDs
- Show red border on input when error exists
- Validate on blur with shake animation for edit errors
- Prevent saving empty model names
- Clear errors when user starts typing
- Simplify error styling (small red text, no heavy chips)
2025-12-22 22:36:36 +09:00
} ,
feat: add chat session history with IndexedDB persistence (#500)
* feat(session): add chat session history with IndexedDB storage
- Add session-storage.ts with IndexedDB wrapper using idb library
- Add use-session-manager.ts hook for session state management
- Add session-history-dropdown.tsx for session selection UI
- Integrate session system into chat-panel.tsx
- Auto-generate session titles from first user message
- Auto-save sessions on message completion
- Support session switching, deletion, and creation
- Migrate existing localStorage data to IndexedDB
- Add i18n translations for session history UI
* feat(session): improve history dropdown and persist diagram history
- Add time-based grouping (Today, Yesterday, This Week, Earlier)
- Add thumbnail previews using Next.js Image component
- Add staggered entrance animations with fade-in effects
- Improve active session indicator with left border accent
- Fix scrolling by using native overflow instead of ScrollArea
- Persist diagram version history to IndexedDB sessions
- Remove redundant diagram XML from localStorage
- Add i18n strings for time group labels (en, ja, zh)
* fix(session): prevent data loss on theme change and tab close
- Add isDrawioReady effect to restore diagram after DrawIO remount
- Add visibilitychange handler to save session when page becomes hidden
- Fix missing currentSessionId in saveCurrentSession dependency array
- Remove unused sanitizeMessages import from use-session-manager
* fix(session): fix diagram save and migration data loss bugs
- Add diagramHistory to save effect dependency array so diagram-only
edits trigger saves (previously only message changes did)
- Destructure stable sessionManager values to prevent unnecessary
effect re-runs on every render
- Add try-catch wrapper around debounced async save operation
- Make saveSession() return boolean to indicate success/failure
- Verify IndexedDB write succeeded before deleting localStorage data
during migration (prevents data loss if write silently fails)
- Keep localStorage data for retry if migration fails instead of
marking as complete anyway
* refactor(session): extract helpers to reduce code duplication
- Add syncUIWithSession helper to consolidate 4 duplicate UI sync blocks
- Add buildSessionData helper to consolidate 4 duplicate save logic blocks
- Remove unused saveTimeoutRef and its cleanup effect
- Net reduction of ~80 lines of duplicate code
* style(ui): improve history dropdown and delete dialog styling
- Change destructive color from coral to muted rose for refined look
- Make session history panel taller (400px fixed height)
- Fix popover alignment to prevent truncation
- Style delete button with soft red outline instead of solid fill
- Make delete dialog more compact (max-w-sm)
* fix(session): reset refs on new chat and show recent sessions
- Fix cached example diagrams not displaying after creating new session
- Reset previousXML, lastProcessedXmlRef and processedToolCalls when
messages become empty (new chat or session switch)
- Add recent chats section in empty chat state with collapsible examples
- Pass sessions and onSelectSession to ChatMessageDisplay
- Add loadedMessageIdsRef to skip animations on session restore
- Add debug console.log for diagram processing flow
* feat(session): add search bar and improve history UI
- Remove session history dropdown, use main panel instead
- Add search bar to filter history chats by title
- Show minutes (Xm ago) instead of "Just now" for recent sessions
- Scroll to top when switching to new/empty chat
- Remove title truncation limit for better searchability
- Remove debug console.log statements
* refactor: remove redundant code and fix nested button hydration error
- Remove unused 'sessions' from deleteSession dependency array
- Remove unused 'switchedTo' variable and simplify return type
- Remove unused 'restoredMessageIdsRef' (always empty)
- Fix nested button hydration error by using div with role=button
- Simplify handleDeleteSession callback
* fix(session): fix migration bug, improve metadata perf, truncate titles
- Fix migration retry loop when localStorage has empty array
- Use cursor-based iteration for getAllSessionMetadata
- Truncate session titles to 100 chars with ellipsis
* refactor: remove dead code and extract diagram length constant
- Remove unused exports: getAllSessions, createNewSession, updateSessionTitle
- Remove write-only CURRENT_SESSION_KEY and all localStorage calls
- Remove dead messagesEndRef and unused scroll effect
- Extract magic number 300 to MIN_REAL_DIAGRAM_LENGTH constant
- Add isRealDiagram() helper function for semantic clarity
2026-01-04 10:25:19 +09:00
"sessionHistory" : {
"tooltip" : "Chat History" ,
"newChat" : "New Chat" ,
"empty" : "No chat history yet" ,
"emptyHint" : "Start a conversation to begin" ,
"today" : "Today" ,
"yesterday" : "Yesterday" ,
"thisWeek" : "This Week" ,
"earlier" : "Earlier" ,
"deleteTitle" : "Delete this chat?" ,
"deleteDescription" : "This will permanently delete this chat session and its diagram. This action cannot be undone." ,
"recentChats" : "Recent Chats" ,
"justNow" : "Just now" ,
"searchPlaceholder" : "Search chats..." ,
"noResults" : "No chats found"
} ,
feat: add personal My Templates library alongside Quick Examples (#773)
* 增加了ralph自动化编程梳理
* feat: US-001 - 为模板库建立独立的 IndexedDB 存储层
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-002 - 在空聊天状态用我的模板库替换官方示例
- 将 ChatLobby 中的 Quick Examples 替换为 TemplatePanel
- 当没有历史会话时,展示完整的模板库面板
- 当有历史会话时,展示可折叠的 "My Templates" 区域
- 使用 TemplatePanel 组件展示用户的个人模板库
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-004 - Provide template creation flow
- Create TemplateCreateDialog component with form fields for prompt, title, description, tags, and pinned
- Add i18n translations for template creation UI in en, zh, zh-Hant, ja
- Update TemplatePanel to integrate the create dialog
- Support initialPrompt prop for pre-filling from current input
- Validate required prompt field (empty prompt not allowed)
- Auto-generate default title from first 20 chars of Pin templates appear at top of list
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-005 - 为模板卡片提供编辑、删除和复制操作
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-006 - Send template directly on click and record usage statistics
- Implement click-to-send template functionality with confirmation dialog
- Add clickCount and runCount increment logic
- Display runCount and lastUsedAt on template card
- Add i18n translations for confirmation dialog (en, zh, zh-Hant, ja)
- Pass onSendTemplate and currentInput props through component hierarchy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-007 - Support template search, pin and default sorting
- Add search bar to TemplatePanel with real-time filtering by title, description, and tags
- Add pin/unpin toggle button on template cards (uses Bookmark icon with fill indicator)
- Search uses existing searchTemplates function from template-storage
- Sort uses existing sortTemplates function (pinned desc, runCount desc, lastUsedAt desc, updatedAt desc)
- Show empty state with Search icon when search returns no results
- List re-sorts immediately after pin/unpin toggle
- Add i18n keys: searchPlaceholder, searchNoResults, pin, unpin for all 4 languages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-008 - Support saving current input as template
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-009 - Support saving historical user message as template
- Add "Save as Template" button to user messages
- Pre-fill prompt with original user message text
- Only show on user messages,- Dialog opens TemplateCreateDialog on click
- Template appears in list immediately after saving
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: US-010 - Support template import and export
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: remove local-only dirs from git tracking (.agents, .cursor, scripts, screenshots)
These directories contain local IDE configs, agent scripts, and
dev tooling that should not be part of the upstream repository.
Added them to .gitignore to prevent future accidental commits.
* chore: remove AGENTS.md from git tracking
* fix: add missing i18n keys for template export/import (en/zh/zh-Hant/ja)
* fix: review fixes for my-templates PR
- Fix fragile querySelector("form") with id-based lookup
- Add objectStoreNames.contains guards for IndexedDB upgrades
- Remove duplicate TemplateSchema, import from template-storage
- Revert contributor-specific .gitignore additions
- Fix broken i18n placeholders and missing translations (zh/ja/zh-Hant)
- Remove unused setFiles prop from ChatLobby
- Remove tags feature (unnecessary complexity)
- Improve template card layout: overlay icons on hover, align stats
- Add break-all and overflow-hidden for long prompt text in dialogs
- Move incrementClickCount into sendTemplate for accurate tracking
- Use Intl.RelativeTimeFormat for locale-aware relative time
* feat: restore Quick Examples panel and add lobby panel visibility settings
Bring back the ExamplePanel as a third collapsible section in ChatLobby
alongside Recent Chats and My Templates. Add toggle switches in Settings
to show/hide each lobby panel, persisted via localStorage.
* fix: template send race condition, import defaults, and empty title bug
- Use flushSync instead of setTimeout(0) in handleSendTemplate to
ensure React state is flushed before form submission
- Explicitly validate and default all fields in importTemplates to
prevent undefined counters from malformed import JSON
- Fall back to existing title in edit dialog instead of writing undefined
* fix: address Copilot review comments and remove PRD file
- Fix fallback formatLastUsed returning "Not used yet" for recent usage
- Remove dead mounted flag in TemplatePanel useEffect
- Respect panel visibility settings in no-history lobby state
- Reject empty/whitespace titles in import validation
- Trim title/prompt in importTemplates with default title fallback
- Remove tasks/prd-template-library-replaces-examples.md from repo
* fix: remove double sort, dead code, redundant stats, and break-all CSS
- Remove redundant sortTemplates call in loadTemplates (already sorted by getAllTemplates)
- Remove unused createEmptyTemplateInput and sortTemplates import
- Show "Not used yet" only once for unused templates instead of twice
- Use break-words instead of break-all on prompt textareas
---------
Co-authored-by: 杜雷 <dreamfly@126.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: dayuan.jiang <jdy.toh@gmail.com>
2026-04-03 11:16:01 +08:00
"templates" : {
"title" : "My Templates" ,
"subtitle" : "Your personal prompt library for quick diagram creation" ,
"emptyTitle" : "No templates yet" ,
"emptyDescription" : "Create your first template to start building your personal prompt library" ,
"createFirst" : "Create First Template" ,
"neverUsed" : "Not used yet" ,
"usedCount" : "{count} uses" ,
"myTemplates" : "My Templates" ,
"createTitle" : "Create Template" ,
"createDescription" : "Save a prompt for repeated use. Templates help you quickly start common workflows." ,
"promptLabel" : "Prompt" ,
"promptPlaceholder" : "Describe the diagram you want to create..." ,
"promptRequired" : "Prompt is required" ,
"titleLabel" : "Title" ,
"titlePlaceholder" : "Enter a title" ,
"titleHint" : "Leave empty to use the first 20 characters of prompt" ,
"descriptionLabel" : "Description" ,
"descriptionPlaceholder" : "Add a description for this template" ,
"pinnedLabel" : "Pin Template" ,
"pinnedHint" : "Pinned templates appear at the top of the list" ,
"createButton" : "Create Template" ,
"createFailed" : "Failed to create template. Please try again." ,
"editTitle" : "Edit Template" ,
"editDescription" : "Update your template content and settings." ,
"updateFailed" : "Failed to update template. Please try again." ,
"duplicate" : "Duplicate" ,
"copySuffix" : "(copy)" ,
"deleteTitle" : "Delete this template?" ,
"deleteDescription" : "This will permanently delete this template. This action cannot be undone." ,
"confirmSendTitle" : "Replace current input?" ,
"confirmSendDescription" : "You have unsent content in the input. Sending this template will replace it." ,
"confirmSendButton" : "Send Template" ,
"searchPlaceholder" : "Search templates..." ,
"searchNoResults" : "No templates match your search" ,
"pin" : "Pin to top" ,
"unpin" : "Unpin from top" ,
"saveAsTemplate" : "Save as Template" ,
"exportTemplates" : "Export Templates" ,
"importTemplates" : "Import Templates" ,
"exportEmpty" : "No templates to export" ,
"exportSuccess" : "Exported {count} template(s) successfully" ,
"importNoFile" : "Please select a JSON file" ,
"importFailed" : "Import failed: {error}" ,
"importSuccess" : "Imported {imported} template(s), skipped {skipped} duplicate(s)"
} ,
2026-01-20 20:52:04 +09:00
"validation" : {
"title" : "Validate Diagram" ,
"capturing" : "Capturing" ,
"validating" : "Validating" ,
"validatingWithAttempt" : "Validating ({attempt}/{max})" ,
"valid" : "Valid" ,
"validWithWarnings" : "Valid with Warnings" ,
"issuesFound" : "Issues Found" ,
"error" : "Error" ,
"skipped" : "Skipped" ,
"capturedScreenshot" : "Captured Screenshot:" ,
"issuesFoundLabel" : "Issues Found:" ,
"suggestions" : "Suggestions:" ,
"passedValidation" : "Diagram passed visual validation - no issues detected." ,
"improvementRequested" : "Improvement requested - check the new diagram below" ,
"improveWithSuggestions" : "Improve with Suggestions" ,
"regenerateWithFeedback" : "Regenerate the diagram using the validation feedback"
} ,
feat: multi-provider model configuration with UI/UX improvements (#355)
* feat: add multi-provider model configuration
- Add model config dialog for managing multiple AI providers
- Support for OpenAI, Anthropic, Google, Azure, Bedrock, OpenRouter, DeepSeek, SiliconFlow, Ollama, and AI Gateway
- Add model selector dropdown in chat panel header
- Add API key validation endpoint
- Add custom model ID input with keyboard navigation
- Fix hover highlight in Command component
- Add suggested models for each provider including latest Claude 4.5 series
- Store configuration locally in browser
* feat: improve model config UI and move selector to chat input
- Move model selector from header to chat input (left of send button)
- Add per-model validation status (queued, running, valid, invalid)
- Filter model selector to only show verified models
- Add editable model IDs in config dialog
- Add custom model input field alongside suggested models dropdown
- Fix hover states on provider buttons and select triggers
- Update OpenAI suggested models with GPT-5 series
- Add alert-dialog component for delete confirmation
* refactor: revert shadcn component changes, apply hover fix at usage site
* feat: add AWS credentials support for Bedrock provider
- Add AWS Access Key ID, Secret Access Key, Region fields for Bedrock
- Show different credential fields based on provider type
- Update validation API to handle Bedrock with AWS credentials
- Add region selector with common AWS regions
* fix: reset Test button after validation completes
* fix: reset validation button to Test after success
* fix: complete bedrock support and UI/UX improvements
- Add bedrock to ALLOWED_CLIENT_PROVIDERS for client credentials
- Pass AWS credentials through full chain (headers → API → provider)
- Replace non-existent GPT-5 models with real ones (o1, o3-mini)
- Add accessibility: aria-labels, focus-visible rings, inline errors
- Add more AWS regions (Ohio, London, Paris, Mumbai, Seoul, São Paulo)
- Fix setTimeout cleanup with useRef on component unmount
- Fix TypeScript type consistency in getSelectedAIConfig fallback
* chore: remove unused code
- Remove unused setAccessCodeRequired state in chat-panel.tsx
- Remove unused getSelectedModel export in model-config.ts
* fix: UI/UX improvements for model configuration dialog
- Add gradient header styling with icon badge
- Change Configuration section icon from Key to Settings2
- Add duplicate model detection with warning banner and inline removal
- Filter out already-added models from suggestions dropdown
- Add type-to-confirm for deleting providers with 3+ models
- Enhance delete confirmation dialog with warning icon
- Improve model selector discoverability (show model name + chevron)
- Add truncation for long model names with title tooltip
- Remove AI provider settings from Settings dialog (now in Model Config)
- Extract ValidationButton into reusable component
* fix: prevent duplicate model IDs within same provider
- Block adding model if ID already exists in provider
- Block editing model ID to match existing model in provider
* fix: improve duplicate model ID notifications
- Add toast notification when trying to add duplicate model
- Allow free typing when editing model ID, validate on blur
- Show warning toast instead of blocking input
* fix: improve duplicate model validation UX in config dialog
- Add inline error display for duplicate model IDs
- Show red border on input when error exists
- Validate on blur with shake animation for edit errors
- Prevent saving empty model names
- Clear errors when user starts typing
- Simplify error styling (small red text, no heavy chips)
2025-12-22 22:36:36 +09:00
"modelConfig" : {
"title" : "AI Model Configuration" ,
"description" : "Configure multiple AI providers and models" ,
"configure" : "Configure" ,
"addProvider" : "Add Provider" ,
"addModel" : "Add Model" ,
"modelId" : "Model ID" ,
"modelLabel" : "Display Label" ,
"streaming" : "Enable Streaming" ,
"deleteProvider" : "Delete Provider" ,
"deleteModel" : "Delete Model" ,
"noModels" : "No models configured. Add a model to get started." ,
"selectProvider" : "Select a provider or add a new one" ,
"configureMultiple" : "Configure multiple AI providers and switch between them easily" ,
"apiKeyStored" : "API keys are stored locally in your browser" ,
"test" : "Test" ,
"validationError" : "Validation failed" ,
2025-12-23 11:42:27 +09:00
"addModelFirst" : "Add at least one model to validate" ,
"providers" : "Providers" ,
"addProviderHint" : "Add a provider to get started" ,
"verified" : "Verified" ,
"configuration" : "Configuration" ,
"displayName" : "Display Name" ,
"awsAccessKeyId" : "AWS Access Key ID" ,
"awsSecretAccessKey" : "AWS Secret Access Key" ,
"awsRegion" : "AWS Region" ,
"selectRegion" : "Select region" ,
"apiKey" : "API Key" ,
"enterApiKey" : "Enter your API key" ,
"enterSecretKey" : "Enter your secret access key" ,
"baseUrl" : "Base URL" ,
"optional" : "(optional)" ,
2026-01-20 13:39:33 +00:00
"baseUrlWithExample" : "Base URL (optional, e.g. {example})" ,
2025-12-23 11:42:27 +09:00
"customEndpoint" : "Custom endpoint URL" ,
feat: Add support for Chinese AI providers (GLM, Qwen, Kimi, MiniMax, Qiniu)
* feat: Add support for Chinese AI providers (GLM, Qwen, Kimi, MiniMax, Qiniu)
- Add minimax, glm, qwen, qiniu, kimi to ProviderName type
- Add provider configurations to PROVIDER_INFO with default base URLs
- Add suggested models for MiniMax in SUGGESTED_MODELS
- Add minimax/glm/qwen/qiniu/kimi cases to getAIModel using OpenAI-compatible SDK
- Update ALLOWED_CLIENT_PROVIDERS and error messages
- Add environment variable examples to env.example
Fixes: MiniMax API compatibility issue (invalid chat setting 2013)
* fix: Add missing providers to PROVIDER_ENV_VARS type
* fix: Handle null case in PROVIDER_ENV_VARS for new providers
* fix: Add minimax/glm/qwen/kimi/qiniu support to validate-model API
- Add getDefaultBaseUrl helper function
- Add validation cases for new providers in validate-model route
* fix: Add new providers to buildProviderOptions switch case
* fix: Merge multiple system messages into one for minimax/glm/qwen/kimi/qiniu
MiniMax API doesn't support multiple system messages.
This fix combines them into a single message for Chinese providers.
* fix: Handle null provider in system message check
* debug: Add logging for allMessages count
* fix: Use effective provider (including env var fallback) for isSingleSystemProvider check
* fix: apply biome formatting (line-wrapping)
* docs: add Chinese AI providers documentation (MiniMax, GLM, Qwen, Kimi, Qiniu)
- Add i18n translations for new providers in all language dictionaries
- Add provider configuration documentation in en/cn/ja docs
* fix: 改进 PR #722 的代码审查反馈
1. 删除重复的 getDefaultBaseUrl 函数,改用 model-config.ts 的 PROVIDER_INFO
2. validate-model 路由改用 AI SDK 的 createOpenAI + generateText
3. 修复 resolveBaseURL 回退逻辑,传入 PROVIDER_INFO 的 defaultBaseUrl
4. 删除无用的 .bak 备份文件
Co-authored-by: Shinyi <shinyi@openclaw.ai>
* fix: 修正中国 AI provider 端点配置
- qiniu: api.qiniucdn.com → api.qnaigc.com
- qwen: dashscope.aliyun.com → dashscope.aliyuncs.com
- 更新 env.example 文档链接
Co-authored-by: Shinyi <shinyi@openclaw.ai>
* feat: MiniMax 使用 Anthropic 兼容 API
- MiniMax 改用 createAnthropic (而非 createOpenAI)
- 支持 api.minimax.io/anthropic 和 api.minimaxi.com/anthropic
- 合并多个 system 消息为单个 (MiniMax/GLM/Qwen/Kimi/Qiniu)
- 更新默认模型为 MiniMax-M2.5 系列
- 支持 MINIMAX_BASE_URL 环境变量配置
Co-authored-by: Shinyi <shinyi@openclaw.ai>
* docs: 更新 MiniMax 文档
- 添加 Anthropic 兼容 API 说明
- 更新默认模型为 MiniMax-M2.5
- 添加国际版/中国大陆版配置示例
- 更新 env.example 注释
Co-authored-by: Shinyi <shinyi@openclaw.ai>
* fix: 完善 MiniMax 双端点支持及问题修复
- 支持 MiniMax Anthropic 兼容端点和 OpenAI 兼容端点自动切换
- 修正默认端点为 api.minimaxi.com (中国大陆可用)
- 修复端点路径缺少 /v1 的问题
- 添加前端 MiniMax logo 映射
- 移除调试日志
- 修正 env.example 默认配置
* chore: clean backup artifacts and align biome formatting
* fix: resolve effectiveProvider bug, deduplicate MiniMax URL logic, fix docs
- Fix critical bug: effectiveProvider was empty during auto-detection,
causing multi-system-message to be sent to MiniMax (which rejects it).
Now uses resolved provider from getAIModel instead of re-deriving it.
- Extract normalizeMiniMaxBaseURL() shared helper to eliminate duplication
between ai-providers.ts and validate-model/route.ts
- Add guard for undefined MiniMax baseURL to prevent hitting api.anthropic.com
- Fix docs: mark China mainland URL as default (matches code behavior)
- Restructure minimax/glm/qwen/kimi/qiniu validation to use shared pattern
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: document MiniMax dual API formats in docs and UI
- Add hint below Base URL input when MiniMax is selected, explaining
Anthropic-compatible (/anthropic) vs OpenAI-compatible (/v1) endpoints
- Update all 3 ai-providers docs (en/cn/ja) to list all 4 endpoint options
(China/International × Anthropic/OpenAI)
- Add i18n translations for the hint in all 4 locales
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: deduplicate PROVIDER_LOGO_MAP, remove unnecessary optional chaining
- Extract PROVIDER_LOGO_MAP to lib/types/model-config.ts (was duplicated
in model-config-dialog.tsx and model-selector.tsx)
- Remove unnecessary ?. on PROVIDER_INFO.minimax (it's a full Record)
---------
Co-authored-by: msga-oc <msga-oc@gitea.misakiga.top>
Co-authored-by: Shinyi <shinyi@openclaw.ai>
Co-authored-by: dayuan.jiang <jdy.toh@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:53:47 +08:00
"minimaxBaseUrlHint" : "Use /anthropic for Anthropic-compatible API (recommended), or /v1 for OpenAI-compatible API" ,
2026-07-12 08:10:12 +08:00
"mimoBaseUrlHint" : "Default works with pay-as-you-go keys (sk-...). Token Plan subscribers (tp-... keys) must set https://token-plan-cn.xiaomimimo.com/v1" ,
2025-12-23 11:42:27 +09:00
"models" : "Models" ,
"customModelId" : "Custom model ID..." ,
"allAdded" : "All added" ,
"suggested" : "Suggested" ,
"noModelsConfigured" : "No models configured" ,
"modelIdEmpty" : "Model ID cannot be empty" ,
"modelIdExists" : "This model ID already exists" ,
"configureProviders" : "Configure AI Providers" ,
"selectProviderHint" : "Select a provider from the list or add a new one to configure API keys and models" ,
"deleteConfirmDesc" : "Are you sure you want to delete {name}? This will remove all configured models and cannot be undone." ,
"typeToConfirm" : "Type \"{name}\" to confirm" ,
"typeProviderName" : "Type provider name..." ,
"modelsConfiguredCount" : "{count} model(s) configured" ,
"validationFailedCount" : "{count} model(s) failed validation" ,
"cancel" : "Cancel" ,
"delete" : "Delete" ,
"clickToChange" : "(click to change)" ,
"usingServerDefault" : "Using server default model" ,
"selectModel" : "Select Model" ,
"searchModels" : "Search models..." ,
"noVerifiedModels" : "No verified models. Test your models first." ,
"noModelsFound" : "No models found." ,
"default" : "Default" ,
"serverDefault" : "Server Default" ,
2026-01-15 21:28:22 +05:30
"serverModels" : "Server Models" ,
"userModels" : "User Models" ,
2025-12-23 11:42:27 +09:00
"configureModels" : "Configure Models..." ,
2025-12-26 11:19:59 +08:00
"onlyVerifiedShown" : "Only verified models are shown" ,
"showUnvalidatedModels" : "Show unvalidated models" ,
"allModelsShown" : "All models are shown (including unvalidated)" ,
2026-01-15 21:28:22 +05:30
"unvalidatedModelWarning" : "This model has not been validated" ,
feat: add file-based admin settings panel at /admin (#866)
* feat: add file-based admin settings panel at /admin
Settings saved in the panel are written to data/settings.json and
overlaid onto process.env, taking precedence over environment
variables and applying immediately without restart. Enable by setting
ADMIN_PASSWORD; on serverless platforms without persistent disk the
panel degrades to read-only.
* polish: admin panel UI improvements
- Provider logos in credential rows (shared ProviderLogo component,
extracted from model-config-dialog)
- Scroll-spy active state in the sidebar nav
- Green success state in the save bar that clears after a few seconds
- Wider content column (max-w-6xl) for less wasted space on desktop
* polish: admin panel section toggles and reorder
- Move Quota & Rate Limits to the end of the settings page
- Add enable switches to Observability and Quota sections; default off
with fields grayed out, auto-on when any field is already configured
* polish: make section enable switch more visible
Wrap the switch in a labeled pill ('Enabled'/'Disabled') with border
and background so the off state is clearly visible.
* refactor: derive admin registry from PROVIDER_INFO, simplify page state
- Provider options, labels, and base-URL placeholders now come from
PROVIDER_INFO instead of hand-copied lists (fixes SiliconFlow .com/.cn
placeholder drift; panel names now match the model-config dialog)
- Replace free-text subgroup strings + SUBGROUP_PROVIDERS reverse map
with a typed provider field on SettingDef
- Precompute SETTINGS_BY_GROUP and PROVIDER_SUBGROUPS at module level
- Merge justSaved into saveMessage, drop unused mainRef, hoist
fetchSettings out of the component, dedupe savedText logic
- Serialize from SETTINGS_REGISTRY directly; json validators in a map
instead of a hardcoded key check
- Make allowPrivateUrls a function so ALLOW_PRIVATE_URLS edits in the
admin panel apply without restart
* feat: graphical model management in admin panel
Replace the provider credential fields and raw AI_MODELS_CONFIG JSON
textarea with a Models section mirroring the in-app model settings UI:
provider instance list with logos, credential fields per provider type,
model add/remove with suggestions, per-model connectivity test, and a
default-provider star.
On save the server derives everything the runtime needs into
settings.json: credential env vars (with _2 suffixes for multiple
instances of one provider), AI_MODELS_CONFIG, and AI_PROVIDER/AI_MODEL
for the default. Secrets round-trip as masked markers and are never
sent back to the browser. The general settings registry now only
covers non-provider settings (generation, access, features,
observability, quota).
* fix: allow testing unsaved providers in admin panel
The test button previously looked up credentials by providerId in the
saved settings, so testing a newly added (unsaved) provider failed with
'Unknown provider or model'. The test endpoint now accepts the client's
current provider state; newly typed secrets are used as-is and masked
markers are resolved against the stored values, so testing works both
before and after saving.
* fix: merge env AI_MODELS_CONFIG with admin panel providers
Previously, saving in the admin panel wrote a complete AI_MODELS_CONFIG
into settings.json, which (by overlay precedence) replaced any config
from .env or ai-models.json — admins lost their env-configured models.
The panel no longer writes AI_MODELS_CONFIG. Instead its providers are
merged with the env baseline at read time in loadRawServerModelsConfig,
and panel credentials go to ADMIN_-prefixed env vars wired up via
apiKeyEnv/baseUrlEnv so they never shadow standard vars. Env-based
providers now appear read-only in the panel, name clashes are rejected,
and a panel default overrides the env default. data/ is now gitignored.
* fix: block global-credential providers already managed via env
Bedrock, Vertex AI, and Ollama credentials live in fixed env vars with
no apiKeyEnv redirection, so a panel instance of one of these would
silently override the credentials that env-configured models rely on.
The API now rejects saving such a provider when the env config already
uses that type, and the Add Provider dropdown disables it with a
'managed via env' note.
* fix: address admin panel review findings
- Security: test-model no longer resolves a stored secret when the
request's baseUrl/provider differs from the stored entry, closing a
path where a tampered baseUrl could exfiltrate a saved key
- Save failures are now visible: the save bar shows the error in red
(was masked by the persistent 'Unsaved changes' text), and per-field
validation errors from the settings API are surfaced under each field
- The Observability/Quota enable switch is now real: toggling off stages
deletion of the group's saved values, and the toggle no longer snaps
back to Enabled after saving
- Env provider's default star is hidden when a panel provider is the
active default (no more double star)
- Clearing a credential field reverts to the stored value instead of
silently deleting it; an explicit X button removes a stored secret
- Form inputs are disabled during an in-flight save
* refactor(admin): split 1549-line admin page into focused modules
Extract admin-shared.ts (types + fetch helper), setting-field.tsx
(registry-driven fields), and models-section.tsx (provider/model
manager) from page.tsx. Pure mechanical move, no behavior change.
* feat(admin): share credential fields with user dialog and localize panel
Extract ProviderCredentialsFields (display name + per-provider
credential inputs) used by both the user ModelConfigDialog and the
admin Models panel; secret input passed via renderSecret (plaintext
vs masked), test button via footer slot. Add full i18n for the admin
panel across en/zh/ja/zh-Hant, reusing modelConfig.* for shared parts.
* fix(admin): address Copilot review findings
- Reflect built-in defaults for boolean settings (ALLOW_PRIVATE_URLS
defaults on) and allow clearing a saved boolean back to default,
so the SSRF toggle matches actual runtime behavior.
- Harden JSON loading: filter settings values to strings only, and
schema-validate stored ADMIN_PROVIDERS entries, dropping malformed
ones instead of letting them reach runtime code.
- Set beforeunload returnValue so the unsaved-changes prompt shows in
all browsers; reject non-finite numbers in settings validation.
- Fix README/CN/JA docs that claimed the panel auto-generates
AI_MODELS_CONFIG (providers are merged at read time, not written).
- Add unit tests for corrupted-file value filtering and provider
schema validation.
* docs: move admin panel details to dedicated docs/{en,cn,ja}/admin-panel.md
The READMEs now carry a short blurb + link, matching the existing
per-topic docs (docker.md, ai-providers.md, ...). Removes the ~22-line
inline section and the duplicated data/settings.json mentions.
* fix(admin): address follow-up Copilot findings on the prior fixes
- loadAdminProviders now validates against a stored-shape schema where
secrets are plain strings, so a hand-edited ADMIN_PROVIDERS holding an
{isSet} marker is dropped instead of later crashing maskSecret().
- loadSettings guards against array values (typeof [] === 'object'),
which would otherwise overlay numeric keys onto process.env.
- Admin SecretInput uses the bare id so the shared component's
<Label htmlFor> stays associated (only one ProviderDetail mounts).
- Add tests: marker-secret rejection, array-values guard, bedrock
multi-secret round-trip.
2026-06-15 00:40:35 +09:00
"serverDefaultModel" : "Server default model" ,
"showValue" : "Show value" ,
"hideValue" : "Hide value"
} ,
"admin" : {
"title" : "Admin Settings" ,
"loginPrompt" : "Enter the admin password (the ADMIN_PASSWORD environment variable) to manage server settings." ,
"password" : "Password" ,
"signIn" : "Sign In" ,
"signingIn" : "Signing In…" ,
"loginFailed" : "Login failed" ,
"precedence" : "File overrides env · env overrides defaults" ,
"notWritable" : "The settings file is not writable on this deployment (serverless platforms have no persistent disk). Settings are shown read-only — configure via environment variables instead." ,
"settingGroups" : "Setting groups" ,
"enabled" : "Enabled" ,
"disabled" : "Disabled" ,
"enableGroup" : "Enable {group}" ,
"unsavedChanges" : "Unsaved changes" ,
"saved" : "Settings saved. Changes apply immediately." ,
"saveFailed" : "Save failed. Check your connection and try again." ,
"invalidSettings" : "Some settings are invalid." ,
"discard" : "Discard" ,
"saveChanges" : "Save Changes" ,
"saving" : "Saving…" ,
"sourceSaved" : "Saved" ,
"sourceEnv" : "Env" ,
"sourceSavedTitle" : "Set in the admin settings file" ,
"sourceEnvTitle" : "Set by an environment variable" ,
"restartRequired" : "Restart Required" ,
"modified" : "Modified" ,
"notSet" : "Not set" ,
"savedReplace" : "Saved ({hint}) — type to replace" ,
"showValue" : "Show value" ,
"hideValue" : "Hide value" ,
"removeValue" : "Remove value" ,
"removeValueTitle" : "Remove the stored value" ,
"resetToDefault" : "Reset to default" ,
"models" : "Models" ,
"modelsDescription" : "Server-side providers and models available to all users — no personal API key needed. The default provider's first model is used when users don't pick one." ,
"addProviderHint" : "Add a provider to offer server-side models to all users." ,
"selectProviderHint" : "Select or add a provider to configure its credentials and models." ,
"addProviderToOfferModels" : "Add at least one model to expose this provider to users." ,
"managedViaEnv" : "(managed via env)" ,
"envReadOnly" : "Defined in AI_MODELS_CONFIG / ai-models.json — read-only here. Edit the environment configuration to change it." ,
"defaultModel" : "Default Model" ,
"noModelsConfigured" : "No models configured" ,
"modelCount" : "{count} model" ,
"modelCountPlural" : "{count} models" ,
"default" : "Default" ,
"setAsDefault" : "Set as default provider" ,
"defaultProvider" : "Default provider" ,
"modelIdPlaceholder" : "Model ID…" ,
"addModel" : "Add model" ,
"suggested" : "Suggested" ,
"test" : "Test" ,
"testOk" : "OK ({ms}ms)" ,
"testFailed" : "Failed" ,
"removeModel" : "Remove {model}" ,
"deleteProviderTitle" : "Delete {name}?" ,
"deleteProviderDesc" : "Its credentials and models will be removed from the server after you save." ,
"cancel" : "Cancel" ,
"delete" : "Delete" ,
"groups" : {
"generation" : {
"title" : "Generation" ,
"description" : "Output parameters applied to all chat requests."
} ,
"access" : {
"title" : "Access Control" ,
"description" : "Restrict who can use this deployment."
} ,
"features" : {
"title" : "Features" ,
"description" : "Optional features and security toggles."
} ,
"observability" : {
"title" : "Observability" ,
"description" : "Langfuse tracing for LLM calls."
} ,
"quota" : {
"title" : "Quota & Rate Limits" ,
"description" : "Per-IP usage limits. Enforcement requires a DynamoDB table."
}
} ,
"settings" : {
"TEMPERATURE" : {
"label" : "Temperature" ,
"description" : "Leave unset for reasoning models that reject temperature."
} ,
"MAX_OUTPUT_TOKENS" : {
"label" : "Max Output Tokens"
} ,
"ACCESS_CODE_LIST" : {
"label" : "Access Codes" ,
"description" : "Comma-separated list. Users must enter one to chat. Empty = open access."
} ,
"ENABLE_VLM_VALIDATION" : {
"label" : "VLM Diagram Validation" ,
"description" : "Visually validate generated diagrams with a vision model."
} ,
"VALIDATION_MODEL" : {
"label" : "Validation Model" ,
"description" : "Falls back to the default AI model when empty."
} ,
"VALIDATION_TIMEOUT" : {
"label" : "Validation Timeout (ms)"
} ,
"ENABLE_HISTORY_XML_REPLACE" : {
"label" : "History XML Compression" ,
"description" : "Replace old diagram XML in history with placeholders."
} ,
"ALLOW_PRIVATE_URLS" : {
"label" : "Allow Private URLs" ,
"description" : "Turn off to block requests to private IPs and internal hostnames (SSRF protection)."
} ,
"LANGFUSE_PUBLIC_KEY" : {
"label" : "Langfuse Public Key"
} ,
"LANGFUSE_SECRET_KEY" : {
"label" : "Langfuse Secret Key"
} ,
"LANGFUSE_BASEURL" : {
"label" : "Langfuse Base URL"
} ,
"DAILY_REQUEST_LIMIT" : {
"label" : "Daily Request Limit" ,
"description" : "Per IP per day."
} ,
"DAILY_TOKEN_LIMIT" : {
"label" : "Daily Token Limit" ,
"description" : "Per IP per day."
} ,
"TPM_LIMIT" : {
"label" : "Tokens Per Minute"
} ,
"DYNAMODB_QUOTA_TABLE" : {
"label" : "DynamoDB Table" ,
"description" : "Quota enforcement is disabled when empty."
} ,
"DYNAMODB_REGION" : {
"label" : "DynamoDB Region"
} ,
"QUOTA_TIMEZONE" : {
"label" : "Quota Timezone" ,
"description" : "Timezone for the daily reset boundary."
}
}
2025-12-20 20:18:54 +05:30
}
}