2025-12-20 20:18:54 +05:30
|
|
|
|
{
|
|
|
|
|
|
"common": {
|
|
|
|
|
|
"save": "保存",
|
|
|
|
|
|
"cancel": "キャンセル",
|
|
|
|
|
|
"close": "閉じる",
|
|
|
|
|
|
"confirm": "確認",
|
|
|
|
|
|
"clear": "クリア",
|
|
|
|
|
|
"edit": "編集",
|
|
|
|
|
|
"delete": "削除",
|
|
|
|
|
|
"loading": "読み込み中..",
|
|
|
|
|
|
"new": "新規"
|
|
|
|
|
|
},
|
|
|
|
|
|
"nav": {
|
|
|
|
|
|
"about": "概要",
|
|
|
|
|
|
"editor": "エディタ",
|
|
|
|
|
|
"newChat": "新しいチャットを開始",
|
2025-12-22 21:54:25 +08:00
|
|
|
|
"github": "GitHub",
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"settings": "設定",
|
|
|
|
|
|
"hidePanel": "チャットパネルを非表示 (Ctrl+B)",
|
|
|
|
|
|
"showPanel": "チャットパネルを表示 (Ctrl+B)",
|
2025-12-30 23:45:31 +09:00
|
|
|
|
"aiChat": "AI チャット"
|
2025-12-20 20:18:54 +05:30
|
|
|
|
},
|
|
|
|
|
|
"providers": {
|
|
|
|
|
|
"useServerDefault": "サーバーデフォルトを使用",
|
|
|
|
|
|
"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": "ダイアグラムを説明するか、ファイルをアップロード...",
|
|
|
|
|
|
"send": "送信",
|
2026-01-29 19:10:25 +05:30
|
|
|
|
"stopGeneration": "生成を停止",
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"sendMessage": "メッセージを送信",
|
|
|
|
|
|
"clearConversation": "会話をクリア",
|
|
|
|
|
|
"diagramHistory": "ダイアグラム履歴",
|
|
|
|
|
|
"saveDiagram": "ダイアグラムを保存",
|
|
|
|
|
|
"uploadFile": "ファイルをアップロード(画像、PDF、テキスト)",
|
|
|
|
|
|
"minimalStyle": "ミニマル",
|
|
|
|
|
|
"styledMode": "スタイル付き",
|
|
|
|
|
|
"minimalTooltip": "高速生成のためミニマルを使用(色なし)",
|
|
|
|
|
|
"regenerate": "応答を再生成",
|
|
|
|
|
|
"copyResponse": "応答をコピー",
|
|
|
|
|
|
"copied": "コピーしました!",
|
|
|
|
|
|
"failedToCopy": "コピーに失敗しました",
|
2025-12-30 19:52:57 +08:00
|
|
|
|
"failedToCopyDetail": "メッセージのコピーに失敗しました。手動でコピーするか、クリップボードの権限を確認してください。",
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"goodResponse": "良い応答",
|
|
|
|
|
|
"badResponse": "悪い応答",
|
|
|
|
|
|
"clickToEdit": "クリックして編集",
|
|
|
|
|
|
"editMessage": "メッセージを編集",
|
2026-01-05 20:53:50 +05:30
|
|
|
|
"saveAndSubmit": "保存して送信",
|
|
|
|
|
|
"ExtractURL": "URLから抽出"
|
2025-12-20 20:18:54 +05:30
|
|
|
|
},
|
|
|
|
|
|
"examples": {
|
|
|
|
|
|
"title": "AI でダイアグラムを作成",
|
|
|
|
|
|
"subtitle": "作成したいものを説明するか、画像をアップロードして複製",
|
|
|
|
|
|
"quickExamples": "クイック例",
|
|
|
|
|
|
"paperToDiagram": "論文からダイアグラムへ",
|
|
|
|
|
|
"paperDescription": ".pdf, .txt, .md, .json, .csv, .py, .js, .ts などをアップロード",
|
|
|
|
|
|
"animatedDiagram": "アニメーション図",
|
|
|
|
|
|
"animatedDescription": "アニメーションコネクタ付きの Transformer アーキテクチャを描画",
|
|
|
|
|
|
"awsArchitecture": "AWS アーキテクチャ",
|
|
|
|
|
|
"awsDescription": "AWS アイコンでクラウドアーキテクチャ図を作成",
|
|
|
|
|
|
"replicateFlowchart": "フローチャートを複製",
|
|
|
|
|
|
"replicateDescription": "既存のフローチャートをアップロードして複製",
|
|
|
|
|
|
"creativeDrawing": "クリエイティブな描画",
|
|
|
|
|
|
"creativeDescription": "楽しくてクリエイティブなものを描く",
|
|
|
|
|
|
"cachedNote": "例はキャッシュされ、即座に応答します",
|
|
|
|
|
|
"mcpServer": "MCP サーバー",
|
2026-04-06 10:17:38 +09:00
|
|
|
|
"mcpDescription": "Claude Desktop、VS Code、Cursor で使用"
|
2025-12-20 20:18:54 +05:30
|
|
|
|
},
|
|
|
|
|
|
"settings": {
|
|
|
|
|
|
"title": "設定",
|
|
|
|
|
|
"description": "アプリケーション設定を構成します。",
|
2026-01-28 14:36:54 +01:00
|
|
|
|
"apiKeysModels": "API キーとモデル",
|
|
|
|
|
|
"apiKeysModelsDescription": "AI プロバイダーと API キーを設定します。",
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"accessCode": "アクセスコード",
|
|
|
|
|
|
"accessCodePlaceholder": "アクセスコードを入力",
|
|
|
|
|
|
"accessCodeDescription": "このアプリケーションを使用するために必要です。",
|
|
|
|
|
|
"aiProvider": "AI プロバイダー設定",
|
|
|
|
|
|
"aiProviderDescription": "独自の API キーを使用して使用制限を回避できます。キーはブラウザのローカルに保存され、サーバーには保存されません。",
|
|
|
|
|
|
"provider": "プロバイダー",
|
|
|
|
|
|
"modelId": "モデル ID",
|
|
|
|
|
|
"apiKey": "API キー",
|
|
|
|
|
|
"apiKeyPlaceholder": "あなたの API キー",
|
|
|
|
|
|
"baseUrl": "ベース URL(オプション)",
|
|
|
|
|
|
"customEndpoint": "カスタムエンドポイント URL",
|
|
|
|
|
|
"overrides": "上書き",
|
|
|
|
|
|
"clearSettings": "設定をクリア",
|
|
|
|
|
|
"useServerDefault": "サーバーデフォルトを使用",
|
2025-12-22 21:54:25 +08:00
|
|
|
|
"language": "言語",
|
|
|
|
|
|
"languageDescription": "インターフェース言語を選択します。",
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"theme": "テーマ",
|
|
|
|
|
|
"themeDescription": "インターフェースと DrawIO キャンバスのダーク/ライトモード。",
|
|
|
|
|
|
"drawioStyle": "DrawIO スタイル",
|
2026-05-15 22:14:20 +08:00
|
|
|
|
"drawioStyleDescription": "キャンバススタイル",
|
|
|
|
|
|
"themeDefault": "デフォルト",
|
|
|
|
|
|
"themeDark": "ダーク",
|
|
|
|
|
|
"themeMinimal": "ミニマル",
|
|
|
|
|
|
"themeSketch": "スケッチ",
|
|
|
|
|
|
"themeSimple": "シンプル",
|
2025-12-28 18:46:10 +05:30
|
|
|
|
"diagramStyle": "ダイアグラムスタイル",
|
|
|
|
|
|
"diagramStyleDescription": "ミニマルとスタイル付きの出力を切り替えます。",
|
2026-01-11 07:54:32 +06:00
|
|
|
|
"sendShortcut": "送信ショートカット",
|
|
|
|
|
|
"sendShortcutDescription": "メッセージの送信方法を選択します。",
|
|
|
|
|
|
"enterToSend": "Enterで送信",
|
|
|
|
|
|
"ctrlEnterToSend": "Cmd/Ctrl+Enterで送信",
|
2025-12-28 18:46:10 +05:30
|
|
|
|
"diagramActions": "ダイアグラム操作",
|
|
|
|
|
|
"diagramActionsDescription": "ダイアグラムの履歴とエクスポートを管理",
|
|
|
|
|
|
"history": "履歴",
|
2026-01-09 09:26:19 +09:00
|
|
|
|
"download": "ダウンロード",
|
|
|
|
|
|
"proxy": "プロキシ設定",
|
|
|
|
|
|
"proxyDescription": "API リクエスト用の HTTP/HTTPS プロキシを設定(デスクトップ版のみ)",
|
|
|
|
|
|
"httpProxy": "HTTP プロキシ",
|
|
|
|
|
|
"httpsProxy": "HTTPS プロキシ",
|
|
|
|
|
|
"applyProxy": "適用",
|
2026-01-20 20:52:04 +09:00
|
|
|
|
"proxyApplied": "プロキシ設定が適用されました",
|
|
|
|
|
|
"diagramValidation": "ダイアグラム検証(実験的)",
|
|
|
|
|
|
"diagramValidationDescription": "視覚言語モデルを使用して生成されたダイアグラムを検証します。GPT-5.2 や Sonnet-4.5 などの VLM が必要です。",
|
|
|
|
|
|
"enabled": "有効",
|
2026-03-07 19:07:54 +09:00
|
|
|
|
"disabled": "無効",
|
|
|
|
|
|
"customSystemMessage": "カスタムシステムメッセージ",
|
|
|
|
|
|
"customSystemMessageDescription": "AIのシステムプロンプトに追加されるカスタム指示を入力します。",
|
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": "例:ダイアグラムには常に青色のカラースキームを使用...",
|
fix: raise the output budget so reasoning models reach the tool call (#927)
* fix: raise the output budget so reasoning models reach the tool call
A reasoning model spends the output budget in order: thinking first, then prose,
then the tool call. With 16000 the thinking alone can consume all of it, so the
turn ends with finishReason "length" before display_diagram is ever called. The
canvas stays empty and nothing surfaces in the UI, because no tool call means no
tool error, and the client never reads finishReason.
Measured on openrouter deepseek/deepseek-v4-flash, the model from the report:
- max_tokens=800 with reasoning on returns reasoning_tokens=800, empty content,
finish_reason length. So reasoning is billed against this budget, not exempt.
- refining an existing diagram (19k chars of XML in the input) produced 49142
chars of reasoning, zero tool calls, finishReason "length" at 16000
- the same request at 40000 finished and called edit_diagram with 12 operations
64000 cannot just be sent to every model: bedrock claude-3-haiku caps at 4096,
nova-lite at 10000, and the openrouter deepseek-r1 endpoint counts input and
output against one 64000 ceiling. All three name the real limit in the 400, so
parse it and retry once. Verified: nova-lite logs "64000 rejected, retrying with
10000" and then completes its tool call.
Also expose the budget in Settings. It is sent as a header rather than read from
env only, so desktop users can raise it themselves without an env file.
vercel.json goes back to the 300s it had before #238 traded it for $2-4/month.
That is now Vercel's own default, and billing pauses while the function waits on
the model, so the saving that motivated 120s no longer applies. edgeone.json is
left alone: its 120 may be that platform's actual ceiling.
* fix: only reinterpret an error as a budget rejection when it says so
Review of the first commit found the retry could fire on errors that have
nothing to do with the budget, which would replace a readable provider error
with a truncated response: exactly the symptom this PR exists to remove.
- Drop the generic "lower than N" pattern. For the Bedrock message it was dead
code, since "model limit of N" matches first with the same number. Left live,
it would read a number out of any message shaped like "must be lower than 2".
- Skip errors whose status is not 400 or 422, so auth and rate-limit failures
are never reinterpreted.
- Require the parsed ceiling to be at least 1024. Below that a diagram cannot
come out whole, so retrying would hide the error behind broken XML.
- Validate MAX_OUTPUT_TOKENS from env the same way as the header, so a stray
"-1" falls back instead of reaching the provider.
Adds tests for the retry wrapper itself, which had none: it retries once with
the named ceiling, leaves a 401 alone, does not retry when the ceiling is not
smaller, propagates a second rejection, and preserves the other call options.
Re-verified against the live APIs: bedrock nova-lite still logs "64000 rejected,
retrying with 10000" and completes its tool call, and deepseek-v4-flash still
finishes normally at 64000.
2026-08-22 20:47:10 +09:00
|
|
|
|
"maxOutputTokens": "最大出力トークン数",
|
|
|
|
|
|
"maxOutputTokensDescription": "1回の応答の予算で、思考過程とダイアグラムの XML が共有します。AI が考え続けてダイアグラムが生成されない場合は大きくしてください。空欄ならデフォルト値を使います。",
|
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
|
|
|
|
"panelVisibility": "ロビーパネル",
|
|
|
|
|
|
"panelVisibilityDescription": "チャットロビーに表示するパネルを選択します。",
|
|
|
|
|
|
"showRecentChats": "最近のチャット",
|
|
|
|
|
|
"showMyTemplates": "マイテンプレート",
|
|
|
|
|
|
"showQuickExamples": "クイック例"
|
2025-12-20 20:18:54 +05:30
|
|
|
|
},
|
|
|
|
|
|
"save": {
|
|
|
|
|
|
"title": "ダイアグラムを保存",
|
|
|
|
|
|
"description": "形式とファイル名を選択してダイアグラムを保存します。",
|
|
|
|
|
|
"format": "形式",
|
|
|
|
|
|
"filename": "ファイル名",
|
|
|
|
|
|
"filenamePlaceholder": "ファイル名を入力",
|
|
|
|
|
|
"formats": {
|
|
|
|
|
|
"drawio": "Draw.io XML",
|
|
|
|
|
|
"png": "PNG 画像",
|
2026-04-03 07:50:57 +08:00
|
|
|
|
"svg": "SVG 画像",
|
|
|
|
|
|
"xmlsvg": "編集可能 SVG"
|
2026-01-04 09:41:32 +05:30
|
|
|
|
},
|
|
|
|
|
|
"savedSuccessfully": "保存完了!"
|
2025-12-20 20:18:54 +05:30
|
|
|
|
},
|
|
|
|
|
|
"history": {
|
|
|
|
|
|
"title": "ダイアグラム履歴",
|
|
|
|
|
|
"description": "AI 修正前に保存された各ダイアグラム。\nダイアグラムをクリックして復元",
|
|
|
|
|
|
"noHistory": "まだ履歴がありません。メッセージを送信してダイアグラム履歴を作成してください。",
|
|
|
|
|
|
"version": "バージョン",
|
|
|
|
|
|
"restoreTo": "バージョン {version} に復元しますか?"
|
|
|
|
|
|
},
|
|
|
|
|
|
"dialogs": {
|
|
|
|
|
|
"clearTitle": "すべてクリアしますか?",
|
|
|
|
|
|
"clearDescription": "現在の会話をクリアし、ダイアグラムをリセットします。この操作は元に戻せません。",
|
|
|
|
|
|
"clearEverything": "すべてクリア",
|
|
|
|
|
|
"clearSuccess": "新しいチャットを開始しました"
|
|
|
|
|
|
},
|
|
|
|
|
|
"errors": {
|
|
|
|
|
|
"maxFiles": "ファイルが多すぎます。最大 {max} 個まで許可されています。",
|
|
|
|
|
|
"onlyMoreAllowed": "あと {slots} 個のファイルのみ許可されています",
|
|
|
|
|
|
"fileExceeds": "「{name}」は {size} です({max}MB を超えています)",
|
|
|
|
|
|
"unsupportedType": "「{name}」はサポートされていないファイルタイプです",
|
|
|
|
|
|
"filesRejected": "{count} 個のファイルが拒否されました:",
|
|
|
|
|
|
"andMore": "...およびさらに {count} 個",
|
|
|
|
|
|
"invalidAccessCode": "無効または欠落したアクセスコード。設定で入力してください。",
|
|
|
|
|
|
"networkError": "ネットワークエラー。接続を確認してください。",
|
|
|
|
|
|
"retryLimit": "自動再試行制限に達しました({max})。手動で再試行してください。",
|
2025-12-30 19:52:57 +08:00
|
|
|
|
"continuationRetryLimit": "継続再試行制限に達しました({max})。ダイアグラムが複雑すぎる可能性があります。",
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"validationFailed": "ダイアグラムの検証に失敗しました。再生成してみてください。",
|
|
|
|
|
|
"malformedXml": "AI が無効なダイアグラム XML を生成しました。再生成してみてください。",
|
|
|
|
|
|
"failedToProcess": "ダイアグラムの処理に失敗しました。再生成してみてください。",
|
|
|
|
|
|
"sessionCorrupted": "セッションデータが破損しました。最初からやり直します。",
|
|
|
|
|
|
"failedToSave": "localStorage へのメッセージの保存に失敗しました",
|
|
|
|
|
|
"failedToRestore": "localStorage からの復元に失敗しました",
|
|
|
|
|
|
"failedToPersist": "アンロード前の状態の永続化に失敗しました",
|
|
|
|
|
|
"failedToExport": "チャートデータの取得エラー",
|
2025-12-30 19:52:57 +08:00
|
|
|
|
"failedToLoadExample": "例の画像の読み込みエラー",
|
|
|
|
|
|
"failedToRecordFeedback": "フィードバックの記録に失敗しました。もう一度お試しください。",
|
|
|
|
|
|
"storageUpdateFailed": "チャットはクリアされましたが、ブラウザストレージを更新できませんでした"
|
2025-12-20 20:18:54 +05:30
|
|
|
|
},
|
|
|
|
|
|
"quota": {
|
|
|
|
|
|
"dailyLimit": "1日の割当量に達しました",
|
|
|
|
|
|
"tokenLimit": "1日のトークン制限に達しました",
|
|
|
|
|
|
"tpmLimit": "レート制限",
|
|
|
|
|
|
"tpmMessage": "リクエストが多すぎます。しばらくお待ちください。",
|
2025-12-22 19:30:20 +05:30
|
|
|
|
"tpmMessageDetailed": "レート制限に達しました({limit}トークン/分)。{seconds}秒待ってからもう一度リクエストしてください。",
|
2025-12-29 12:12:22 +09:00
|
|
|
|
"messageApi": "今日のデモ利用上限に達してしまったようです。楽しんでいただけて本当に嬉しいです。このデモはByteDance Doubaoのご厚意により提供されていますが、皆様に公平にご利用いただくため、少し制限を設けさせていただいております。",
|
2026-02-27 07:34:05 -08:00
|
|
|
|
"messageApiSelfHosted": null,
|
2025-12-29 12:12:22 +09:00
|
|
|
|
"messageToken": "今日のトークン利用上限に達してしまったようです。楽しんでいただけて本当に嬉しいです。このデモはByteDance Doubaoのご厚意により提供されていますが、皆様に公平にご利用いただくため、少し制限を設けさせていただいております。",
|
2026-02-27 07:34:05 -08:00
|
|
|
|
"messageTokenSelfHosted": null,
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"tip": "<strong>ヒント:</strong>独自の API キーを使用する(設定アイコンをクリック)か、プロジェクトをセルフホストしてこれらの制限を回避できます。",
|
2026-02-27 07:34:05 -08:00
|
|
|
|
"tipSelfHosted": "<strong>ヒント:</strong>設定で独自の API キーを設定することで、引き続きサービスをご利用いただけます。",
|
2025-12-29 12:12:22 +09:00
|
|
|
|
"reset": "制限は明日リセットされます。ご理解ありがとうございます。",
|
|
|
|
|
|
"doubaoSponsorship": "<a href=\"{link}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"underline hover:text-foreground\">こちらから登録</a>すると、各モデル(Doubao、DeepSeek、Kimi含む)で50万トークンを無料で取得できます。モデル設定でAPIキーを設定してください。",
|
|
|
|
|
|
"configModel": "APIキーを使用",
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"selfHost": "セルフホスト",
|
|
|
|
|
|
"sponsor": "スポンサー",
|
|
|
|
|
|
"learnMore": "詳細 →",
|
|
|
|
|
|
"usedOf": "{used}/{limit}"
|
|
|
|
|
|
},
|
|
|
|
|
|
"tools": {
|
|
|
|
|
|
"generateDiagram": "ダイアグラムを生成",
|
|
|
|
|
|
"editDiagram": "ダイアグラムを編集",
|
|
|
|
|
|
"appendDiagram": "ダイアグラムに追加",
|
|
|
|
|
|
"complete": "完了",
|
|
|
|
|
|
"error": "エラー",
|
|
|
|
|
|
"truncated": "切り捨て"
|
|
|
|
|
|
},
|
|
|
|
|
|
"file": {
|
|
|
|
|
|
"reading": "読み込み中...",
|
|
|
|
|
|
"chars": "文字",
|
|
|
|
|
|
"removeFile": "ファイルを削除"
|
|
|
|
|
|
},
|
2026-01-05 20:53:50 +05:30
|
|
|
|
"url": {
|
|
|
|
|
|
"title": "URLからコンテンツを抽出",
|
|
|
|
|
|
"description": "URLを貼り付けてそのコンテンツを抽出および分析します",
|
|
|
|
|
|
"Extracting": "抽出中...",
|
|
|
|
|
|
"extract": "抽出",
|
|
|
|
|
|
"Cancel": "キャンセル",
|
|
|
|
|
|
"enterUrl": "URLを入力してください",
|
|
|
|
|
|
"invalidFormat": "無効なURL形式です"
|
|
|
|
|
|
},
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"reasoning": {
|
|
|
|
|
|
"thinking": "考え中...",
|
|
|
|
|
|
"thoughtFor": "{duration} 秒考えました",
|
|
|
|
|
|
"thoughtBrief": "数秒考えました"
|
|
|
|
|
|
},
|
2025-12-30 19:52:57 +08:00
|
|
|
|
"dev": {
|
|
|
|
|
|
"title": "開発:XMLストリーミングシミュレーター",
|
|
|
|
|
|
"preset": "プリセット:",
|
|
|
|
|
|
"selectPreset": "プリセットを選択...",
|
|
|
|
|
|
"clear": "クリア",
|
|
|
|
|
|
"placeholder": "ここに mxCell XML を貼り付けるか、プリセットを選択...",
|
|
|
|
|
|
"interval": "間隔:",
|
|
|
|
|
|
"chars": "文字:",
|
|
|
|
|
|
"streaming": "ストリーミング中...",
|
|
|
|
|
|
"simulate": "シミュレート",
|
|
|
|
|
|
"stop": "停止",
|
|
|
|
|
|
"testQuotaToast": "クォータトーストをテスト",
|
|
|
|
|
|
"simulatingMessage": "[開発] XMLストリーミングをシミュレート中",
|
|
|
|
|
|
"successMessage": "ダイアグラムの表示に成功しました。"
|
|
|
|
|
|
},
|
2025-12-20 20:18:54 +05:30
|
|
|
|
"about": {
|
|
|
|
|
|
"modelChange": "モデル変更と利用制限について",
|
|
|
|
|
|
"walletCrying": "(別名:お財布が悲鳴を上げています)",
|
|
|
|
|
|
"seekingSponsorship": "スポンサー募集",
|
|
|
|
|
|
"contactMe": "お問い合わせ",
|
|
|
|
|
|
"usageNotice": "利用量の増加に伴い、コスト削減のためモデルを Claude から minimax-m2 に変更し、いくつかの利用制限を設けました。詳細は概要ページをご覧ください。"
|
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": "チャット履歴",
|
|
|
|
|
|
"newChat": "新しいチャット",
|
|
|
|
|
|
"empty": "チャット履歴はまだありません",
|
|
|
|
|
|
"emptyHint": "会話を始めてください",
|
|
|
|
|
|
"today": "今日",
|
|
|
|
|
|
"yesterday": "昨日",
|
|
|
|
|
|
"thisWeek": "今週",
|
|
|
|
|
|
"earlier": "それ以前",
|
|
|
|
|
|
"deleteTitle": "このチャットを削除しますか?",
|
|
|
|
|
|
"deleteDescription": "このチャットセッションとダイアグラムは完全に削除されます。この操作は取り消せません。",
|
|
|
|
|
|
"recentChats": "最近のチャット",
|
|
|
|
|
|
"justNow": "たった今",
|
|
|
|
|
|
"searchPlaceholder": "チャットを検索...",
|
|
|
|
|
|
"noResults": "チャットが見つかりません"
|
|
|
|
|
|
},
|
2026-01-20 20:52:04 +09:00
|
|
|
|
"validation": {
|
|
|
|
|
|
"title": "ダイアグラムを検証",
|
|
|
|
|
|
"capturing": "キャプチャ中",
|
|
|
|
|
|
"validating": "検証中",
|
|
|
|
|
|
"validatingWithAttempt": "検証中 ({attempt}/{max})",
|
|
|
|
|
|
"valid": "有効",
|
|
|
|
|
|
"validWithWarnings": "有効(警告あり)",
|
|
|
|
|
|
"issuesFound": "問題が見つかりました",
|
|
|
|
|
|
"error": "エラー",
|
|
|
|
|
|
"skipped": "スキップ",
|
|
|
|
|
|
"capturedScreenshot": "キャプチャした画像:",
|
|
|
|
|
|
"issuesFoundLabel": "検出された問題:",
|
|
|
|
|
|
"suggestions": "提案:",
|
|
|
|
|
|
"passedValidation": "ダイアグラムは視覚検証に合格しました - 問題は検出されませんでした。",
|
|
|
|
|
|
"improvementRequested": "改善リクエスト済み - 下の新しいダイアグラムを確認してください",
|
|
|
|
|
|
"improveWithSuggestions": "提案で改善",
|
|
|
|
|
|
"regenerateWithFeedback": "検証フィードバックを使用してダイアグラムを再生成"
|
|
|
|
|
|
},
|
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モデル設定",
|
|
|
|
|
|
"description": "複数のAIプロバイダーとモデルを設定",
|
|
|
|
|
|
"configure": "設定",
|
|
|
|
|
|
"addProvider": "プロバイダーを追加",
|
|
|
|
|
|
"addModel": "モデルを追加",
|
|
|
|
|
|
"modelId": "モデルID",
|
|
|
|
|
|
"modelLabel": "表示名",
|
|
|
|
|
|
"streaming": "ストリーミングを有効",
|
|
|
|
|
|
"deleteProvider": "プロバイダーを削除",
|
|
|
|
|
|
"deleteModel": "モデルを削除",
|
|
|
|
|
|
"noModels": "モデルが設定されていません。モデルを追加してください。",
|
|
|
|
|
|
"selectProvider": "プロバイダーを選択または追加してください",
|
|
|
|
|
|
"configureMultiple": "複数のAIプロバイダーを設定して簡単に切り替え",
|
|
|
|
|
|
"apiKeyStored": "APIキーはブラウザにローカル保存されます",
|
|
|
|
|
|
"test": "テスト",
|
|
|
|
|
|
"validationError": "検証に失敗しました",
|
2025-12-23 11:42:27 +09:00
|
|
|
|
"addModelFirst": "検証するには少なくとも1つのモデルを追加してください",
|
|
|
|
|
|
"providers": "プロバイダー",
|
|
|
|
|
|
"addProviderHint": "プロバイダーを追加して開始",
|
|
|
|
|
|
"verified": "検証済み",
|
|
|
|
|
|
"configuration": "設定",
|
|
|
|
|
|
"displayName": "表示名",
|
|
|
|
|
|
"awsAccessKeyId": "AWS アクセスキー ID",
|
|
|
|
|
|
"awsSecretAccessKey": "AWS シークレットアクセスキー",
|
|
|
|
|
|
"awsRegion": "AWS リージョン",
|
|
|
|
|
|
"selectRegion": "リージョンを選択",
|
|
|
|
|
|
"apiKey": "API キー",
|
|
|
|
|
|
"enterApiKey": "API キーを入力",
|
|
|
|
|
|
"enterSecretKey": "シークレットアクセスキーを入力",
|
|
|
|
|
|
"baseUrl": "ベース URL",
|
|
|
|
|
|
"optional": "(オプション)",
|
2026-01-20 13:39:33 +00:00
|
|
|
|
"baseUrlWithExample": "ベース URL(オプション、例: {example})",
|
2025-12-23 11:42:27 +09:00
|
|
|
|
"customEndpoint": "カスタムエンドポイント 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": "/anthropic で Anthropic 互換 API(推奨)、または /v1 で OpenAI 互換 API を使用",
|
2026-07-12 08:10:12 +08:00
|
|
|
|
"mimoBaseUrlHint": "デフォルトは従量課金キー(sk-...)用です。Token Plan 加入者(tp-... キー)は https://token-plan-cn.xiaomimimo.com/v1 を設定してください",
|
2025-12-23 11:42:27 +09:00
|
|
|
|
"models": "モデル",
|
|
|
|
|
|
"customModelId": "カスタムモデル ID...",
|
|
|
|
|
|
"allAdded": "すべて追加済み",
|
|
|
|
|
|
"suggested": "おすすめ",
|
|
|
|
|
|
"noModelsConfigured": "モデルが設定されていません",
|
|
|
|
|
|
"modelIdEmpty": "モデル ID は空にできません",
|
|
|
|
|
|
"modelIdExists": "このモデル ID は既に存在します",
|
|
|
|
|
|
"configureProviders": "AI プロバイダーを設定",
|
|
|
|
|
|
"selectProviderHint": "リストからプロバイダーを選択するか、新規追加して API キーとモデルを設定",
|
|
|
|
|
|
"deleteConfirmDesc": "{name} を削除してもよろしいですか?設定されたすべてのモデルが削除され、元に戻せません。",
|
|
|
|
|
|
"typeToConfirm": "確認のため「{name}」と入力",
|
|
|
|
|
|
"typeProviderName": "プロバイダー名を入力...",
|
|
|
|
|
|
"modelsConfiguredCount": "{count} 個のモデルを設定済み",
|
|
|
|
|
|
"validationFailedCount": "{count} 個のモデルの検証に失敗",
|
|
|
|
|
|
"cancel": "キャンセル",
|
|
|
|
|
|
"delete": "削除",
|
|
|
|
|
|
"clickToChange": "(クリックして変更)",
|
|
|
|
|
|
"usingServerDefault": "サーバーデフォルトモデルを使用中",
|
|
|
|
|
|
"selectModel": "モデルを選択",
|
|
|
|
|
|
"searchModels": "モデルを検索...",
|
|
|
|
|
|
"noVerifiedModels": "検証済みのモデルがありません。先にモデルをテストしてください。",
|
|
|
|
|
|
"noModelsFound": "モデルが見つかりません。",
|
|
|
|
|
|
"default": "デフォルト",
|
|
|
|
|
|
"serverDefault": "サーバーデフォルト",
|
2026-01-15 21:28:22 +05:30
|
|
|
|
"serverModels": "サーバーモデル",
|
|
|
|
|
|
"userModels": "ユーザーモデル",
|
2025-12-23 11:42:27 +09:00
|
|
|
|
"configureModels": "モデルを設定...",
|
2025-12-26 11:19:59 +08:00
|
|
|
|
"onlyVerifiedShown": "検証済みのモデルのみ表示",
|
|
|
|
|
|
"showUnvalidatedModels": "未検証のモデルを表示",
|
|
|
|
|
|
"allModelsShown": "すべてのモデルを表示(未検証を含む)",
|
2026-01-15 21:28:22 +05:30
|
|
|
|
"unvalidatedModelWarning": "このモデルは検証されていません",
|
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": "サーバーデフォルトモデル",
|
|
|
|
|
|
"showValue": "値を表示",
|
|
|
|
|
|
"hideValue": "値を非表示"
|
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": "マイテンプレート",
|
|
|
|
|
|
"subtitle": "素早いダイアグラム作成のための個人的なプロンプトライブラリ",
|
|
|
|
|
|
"emptyTitle": "テンプレートがありません",
|
|
|
|
|
|
"emptyDescription": "最初のテンプレートを作成して、個人的なプロンプトライブラリを構築しましょう",
|
|
|
|
|
|
"createFirst": "最初のテンプレートを作成",
|
|
|
|
|
|
"neverUsed": "未使用",
|
|
|
|
|
|
"usedCount": "{count} 回使用",
|
|
|
|
|
|
"myTemplates": "マイテンプレート",
|
|
|
|
|
|
"createTitle": "テンプレート作成",
|
|
|
|
|
|
"createDescription": "再利用のためにプロンプトを保存します。テンプレートを使用すると、一般的なワークフローを素早く開始できます。",
|
|
|
|
|
|
"promptLabel": "プロンプト",
|
|
|
|
|
|
"promptPlaceholder": "作成するダイアグラムを説明してください...",
|
|
|
|
|
|
"promptRequired": "プロンプトは必須です",
|
|
|
|
|
|
"titleLabel": "タイトル",
|
|
|
|
|
|
"titlePlaceholder": "タイトルを入力",
|
|
|
|
|
|
"titleHint": "空欄の場合はプロンプトの最初の20文字が使用されます",
|
|
|
|
|
|
"descriptionLabel": "説明",
|
|
|
|
|
|
"descriptionPlaceholder": "このテンプレートの説明を追加",
|
|
|
|
|
|
"pinnedLabel": "テンプレートをピン留め",
|
|
|
|
|
|
"pinnedHint": "ピン留めされたテンプレートはリストの上部に表示されます",
|
|
|
|
|
|
"createButton": "テンプレート作成",
|
|
|
|
|
|
"createFailed": "テンプレートの作成に失敗しました。もう一度お試しください。",
|
|
|
|
|
|
"editTitle": "テンプレート編集",
|
|
|
|
|
|
"editDescription": "テンプレートの内容と設定を更新します。",
|
|
|
|
|
|
"updateFailed": "テンプレートの更新に失敗しました。もう一度お試しください。",
|
|
|
|
|
|
"duplicate": "複製",
|
|
|
|
|
|
"copySuffix": "(コピー)",
|
|
|
|
|
|
"deleteTitle": "このテンプレートを削除しますか?",
|
|
|
|
|
|
"deleteDescription": "このテンプレートは完全に削除されます。この操作は取り消せません。",
|
|
|
|
|
|
"confirmSendTitle": "現在の入力を置き換えますか?",
|
|
|
|
|
|
"confirmSendDescription": "未送信のコンテンツがあります。このテンプレートを送信すると置き換えられます。",
|
|
|
|
|
|
"confirmSendButton": "テンプレートを送信",
|
|
|
|
|
|
"searchPlaceholder": "テンプレートを検索...",
|
|
|
|
|
|
"searchNoResults": "検索に一致するテンプレートがありません",
|
|
|
|
|
|
"pin": "上部にピン留め",
|
|
|
|
|
|
"unpin": "ピン留め解除",
|
|
|
|
|
|
"saveAsTemplate": "テンプレートとして保存",
|
|
|
|
|
|
"exportTemplates": "テンプレートをエクスポート",
|
|
|
|
|
|
"importTemplates": "テンプレートをインポート",
|
|
|
|
|
|
"exportEmpty": "エクスポートするテンプレートがありません",
|
|
|
|
|
|
"exportSuccess": "{count} 件のテンプレートをエクスポートしました",
|
|
|
|
|
|
"importNoFile": "JSON ファイルを選択してください",
|
|
|
|
|
|
"importFailed": "インポートに失敗しました:{error}",
|
|
|
|
|
|
"importSuccess": "{imported} 件インポート、{skipped} 件の重複をスキップしました"
|
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
|
|
|
|
},
|
|
|
|
|
|
"admin": {
|
|
|
|
|
|
"title": "管理者設定",
|
|
|
|
|
|
"loginPrompt": "サーバー設定を管理するには、管理者パスワード(ADMIN_PASSWORD 環境変数)を入力してください。",
|
|
|
|
|
|
"password": "パスワード",
|
|
|
|
|
|
"signIn": "ログイン",
|
|
|
|
|
|
"signingIn": "ログイン中…",
|
|
|
|
|
|
"loginFailed": "ログインに失敗しました",
|
|
|
|
|
|
"precedence": "ファイルが環境変数を上書き · 環境変数がデフォルトを上書き",
|
|
|
|
|
|
"notWritable": "このデプロイ環境では設定ファイルに書き込めません(サーバーレス環境には永続ディスクがありません)。設定は読み取り専用で表示されます——代わりに環境変数で構成してください。",
|
|
|
|
|
|
"settingGroups": "設定グループ",
|
|
|
|
|
|
"enabled": "有効",
|
|
|
|
|
|
"disabled": "無効",
|
|
|
|
|
|
"enableGroup": "{group} を有効化",
|
|
|
|
|
|
"unsavedChanges": "未保存の変更があります",
|
|
|
|
|
|
"saved": "設定を保存しました。変更は即座に反映されます。",
|
|
|
|
|
|
"saveFailed": "保存に失敗しました。接続を確認して再試行してください。",
|
|
|
|
|
|
"invalidSettings": "一部の設定が無効です。",
|
|
|
|
|
|
"discard": "破棄",
|
|
|
|
|
|
"saveChanges": "変更を保存",
|
|
|
|
|
|
"saving": "保存中…",
|
|
|
|
|
|
"sourceSaved": "保存済み",
|
|
|
|
|
|
"sourceEnv": "環境変数",
|
|
|
|
|
|
"sourceSavedTitle": "管理者設定ファイルで設定",
|
|
|
|
|
|
"sourceEnvTitle": "環境変数で設定",
|
|
|
|
|
|
"restartRequired": "再起動が必要",
|
|
|
|
|
|
"modified": "変更済み",
|
|
|
|
|
|
"notSet": "未設定",
|
|
|
|
|
|
"savedReplace": "保存済み({hint})——入力して置き換え",
|
|
|
|
|
|
"showValue": "値を表示",
|
|
|
|
|
|
"hideValue": "値を非表示",
|
|
|
|
|
|
"removeValue": "値を削除",
|
|
|
|
|
|
"removeValueTitle": "保存された値を削除",
|
|
|
|
|
|
"resetToDefault": "デフォルトに戻す",
|
|
|
|
|
|
"models": "モデル",
|
|
|
|
|
|
"modelsDescription": "全ユーザーが利用できるサーバー側のプロバイダーとモデル——個人の API キーは不要です。ユーザーがモデルを選択しない場合、デフォルトプロバイダーの最初のモデルが使用されます。",
|
|
|
|
|
|
"addProviderHint": "プロバイダーを追加して、全ユーザーにサーバー側モデルを提供します。",
|
|
|
|
|
|
"selectProviderHint": "プロバイダーを選択または追加して、その資格情報とモデルを構成します。",
|
|
|
|
|
|
"addProviderToOfferModels": "ユーザーにこのプロバイダーを公開するには、モデルを少なくとも 1 つ追加してください。",
|
|
|
|
|
|
"managedViaEnv": "(環境変数で管理)",
|
|
|
|
|
|
"envReadOnly": "AI_MODELS_CONFIG / ai-models.json で定義——ここでは読み取り専用です。変更するには環境構成を編集してください。",
|
|
|
|
|
|
"defaultModel": "デフォルトモデル",
|
|
|
|
|
|
"noModelsConfigured": "モデルが構成されていません",
|
|
|
|
|
|
"modelCount": "{count} 個のモデル",
|
|
|
|
|
|
"modelCountPlural": "{count} 個のモデル",
|
|
|
|
|
|
"default": "デフォルト",
|
|
|
|
|
|
"setAsDefault": "デフォルトプロバイダーに設定",
|
|
|
|
|
|
"defaultProvider": "デフォルトプロバイダー",
|
|
|
|
|
|
"modelIdPlaceholder": "モデル ID…",
|
|
|
|
|
|
"addModel": "モデルを追加",
|
|
|
|
|
|
"suggested": "おすすめ",
|
|
|
|
|
|
"test": "テスト",
|
|
|
|
|
|
"testOk": "正常({ms}ms)",
|
|
|
|
|
|
"testFailed": "失敗",
|
|
|
|
|
|
"removeModel": "{model} を削除",
|
|
|
|
|
|
"deleteProviderTitle": "{name} を削除しますか?",
|
|
|
|
|
|
"deleteProviderDesc": "保存後、その資格情報とモデルはサーバーから削除されます。",
|
|
|
|
|
|
"cancel": "キャンセル",
|
|
|
|
|
|
"delete": "削除",
|
|
|
|
|
|
"groups": {
|
|
|
|
|
|
"generation": {
|
|
|
|
|
|
"title": "生成",
|
|
|
|
|
|
"description": "すべてのチャットリクエストに適用される出力パラメーター。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"access": {
|
|
|
|
|
|
"title": "アクセス制御",
|
|
|
|
|
|
"description": "このデプロイを使用できるユーザーを制限します。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"features": {
|
|
|
|
|
|
"title": "機能",
|
|
|
|
|
|
"description": "オプション機能とセキュリティの切り替え。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"observability": {
|
|
|
|
|
|
"title": "オブザーバビリティ",
|
|
|
|
|
|
"description": "LLM 呼び出しの Langfuse トレース。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"quota": {
|
|
|
|
|
|
"title": "クォータとレート制限",
|
|
|
|
|
|
"description": "IP ごとの使用制限。強制には DynamoDB テーブルが必要です。"
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"settings": {
|
|
|
|
|
|
"TEMPERATURE": {
|
|
|
|
|
|
"label": "温度",
|
|
|
|
|
|
"description": "温度を受け付けない推論モデルの場合は未設定のままにしてください。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"MAX_OUTPUT_TOKENS": {
|
|
|
|
|
|
"label": "最大出力トークン数"
|
|
|
|
|
|
},
|
|
|
|
|
|
"ACCESS_CODE_LIST": {
|
|
|
|
|
|
"label": "アクセスコード",
|
|
|
|
|
|
"description": "カンマ区切りのリスト。チャットにはいずれかの入力が必要です。空 = オープンアクセス。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"ENABLE_VLM_VALIDATION": {
|
|
|
|
|
|
"label": "VLM 図検証",
|
|
|
|
|
|
"description": "ビジョンモデルで生成された図を視覚的に検証します。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"VALIDATION_MODEL": {
|
|
|
|
|
|
"label": "検証モデル",
|
|
|
|
|
|
"description": "空の場合はデフォルトの AI モデルにフォールバックします。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"VALIDATION_TIMEOUT": {
|
|
|
|
|
|
"label": "検証タイムアウト(ms)"
|
|
|
|
|
|
},
|
|
|
|
|
|
"ENABLE_HISTORY_XML_REPLACE": {
|
|
|
|
|
|
"label": "履歴 XML 圧縮",
|
|
|
|
|
|
"description": "履歴内の古い図 XML をプレースホルダーで置き換えます。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"ALLOW_PRIVATE_URLS": {
|
|
|
|
|
|
"label": "プライベート URL を許可",
|
|
|
|
|
|
"description": "オフにすると、プライベート IP や内部ホスト名へのリクエストをブロックします(SSRF 保護)。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"LANGFUSE_PUBLIC_KEY": {
|
|
|
|
|
|
"label": "Langfuse Public Key"
|
|
|
|
|
|
},
|
|
|
|
|
|
"LANGFUSE_SECRET_KEY": {
|
|
|
|
|
|
"label": "Langfuse Secret Key"
|
|
|
|
|
|
},
|
|
|
|
|
|
"LANGFUSE_BASEURL": {
|
|
|
|
|
|
"label": "Langfuse Base URL"
|
|
|
|
|
|
},
|
|
|
|
|
|
"DAILY_REQUEST_LIMIT": {
|
|
|
|
|
|
"label": "1 日あたりのリクエスト上限",
|
|
|
|
|
|
"description": "IP ごと 1 日あたり。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"DAILY_TOKEN_LIMIT": {
|
|
|
|
|
|
"label": "1 日あたりのトークン上限",
|
|
|
|
|
|
"description": "IP ごと 1 日あたり。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"TPM_LIMIT": {
|
|
|
|
|
|
"label": "1 分あたりのトークン数"
|
|
|
|
|
|
},
|
|
|
|
|
|
"DYNAMODB_QUOTA_TABLE": {
|
|
|
|
|
|
"label": "DynamoDB テーブル",
|
|
|
|
|
|
"description": "空の場合、クォータの強制は無効になります。"
|
|
|
|
|
|
},
|
|
|
|
|
|
"DYNAMODB_REGION": {
|
|
|
|
|
|
"label": "DynamoDB リージョン"
|
|
|
|
|
|
},
|
|
|
|
|
|
"QUOTA_TIMEZONE": {
|
|
|
|
|
|
"label": "クォータタイムゾーン",
|
|
|
|
|
|
"description": "1 日のリセット境界に使用するタイムゾーン。"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-20 20:18:54 +05:30
|
|
|
|
}
|
|
|
|
|
|
}
|