diff --git a/CHANGELOG.md b/CHANGELOG.md index 658ef4d85..1eb9d5082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ ## [Unreleased] -## [v0.51.439] — 2026-06-15 — Release OZ (Insights dashboard polish) +## [v0.51.440] — 2026-06-15 — Release PA (advanced per-model options + auxiliary model routing) + +### Added + +- **Advanced model options and auxiliary model routing in Settings → Preferences.** A gear button next to the main model selector opens a "Main model options" dialog (Base URL override, Extra body JSON merged into the request, API key override — all the fields that actually take effect). An "Auxiliary Models" section lets you route side-tasks (vision, compression, web-extract, session-search, approval, MCP, title-generation, skills-hub, curator, kanban-decomposer, profile-describer, triage-specifier) to specific models/providers, each with its own advanced options (including per-task timeout / download-timeout / max-concurrency). API keys are write-only (never echoed back), `extra_body` must be a valid JSON object (malformed input is rejected with a 400), and the main model's `extra_body` is now passed through to the agent at request time via `request_overrides`. (#3097) ### Changed diff --git a/api/config.py b/api/config.py index 2e648ce34..f539b5215 100644 --- a/api/config.py +++ b/api/config.py @@ -3056,7 +3056,78 @@ def set_reasoning_effort( ) -def set_hermes_default_model(model_id: str) -> dict: +def _public_advanced_model_options(model_cfg: dict) -> dict: + """Return write-only-safe advanced options from a model config block.""" + if not isinstance(model_cfg, dict): + model_cfg = {} + return { + "base_url": str(model_cfg.get("base_url") or "").strip(), + "timeout": model_cfg.get("timeout", ""), + "download_timeout": model_cfg.get("download_timeout", ""), + "max_concurrency": model_cfg.get("max_concurrency", ""), + "extra_body": model_cfg.get("extra_body") if isinstance(model_cfg.get("extra_body"), dict) else {}, + "api_key_set": bool(str(model_cfg.get("api_key") or "").strip()), + } + + +def _main_model_request_overrides(config_data: dict) -> dict: + """Return supported runtime request overrides for the main chat model.""" + if not isinstance(config_data, dict): + return {} + model_cfg = config_data.get("model", {}) + if not isinstance(model_cfg, dict): + return {} + overrides = {} + extra_body = model_cfg.get("extra_body") + if isinstance(extra_body, dict) and extra_body: + overrides["extra_body"] = copy.deepcopy(extra_body) + return overrides + + +def _apply_advanced_model_options(model_cfg: dict, advanced: dict | None) -> None: + """Apply supported advanced model options to a config block in-place.""" + if advanced is None: + return + if not isinstance(advanced, dict): + raise ValueError("advanced model options must be an object") + if "base_url" in advanced: + base_url = str(advanced.get("base_url") or "").strip().rstrip("/") + if base_url: + model_cfg["base_url"] = base_url + else: + model_cfg.pop("base_url", None) + for field in ("timeout", "download_timeout", "max_concurrency"): + if field in advanced: + coerced = _coerce_optional_positive_int(advanced.get(field), field) + if coerced == "": + model_cfg.pop(field, None) + elif coerced is not None: + model_cfg[field] = coerced + if "extra_body" in advanced: + extra_body = advanced.get("extra_body") + if isinstance(extra_body, str): + text = extra_body.strip() + try: + extra_body = json.loads(text) if text else {} + except json.JSONDecodeError as exc: + raise ValueError("extra_body must be valid JSON") from exc + if extra_body in (None, ""): + model_cfg.pop("extra_body", None) + elif isinstance(extra_body, dict): + if extra_body: + model_cfg["extra_body"] = extra_body + else: + model_cfg.pop("extra_body", None) + else: + raise ValueError("extra_body must be a JSON object") + if advanced.get("api_key_clear"): + model_cfg.pop("api_key", None) + api_key = str(advanced.get("api_key") or "").strip() + if api_key: + model_cfg["api_key"] = api_key + + +def set_hermes_default_model(model_id: str, advanced: dict | None = None) -> dict: """Persist the Hermes default model in config.yaml and reload runtime config.""" selected_model = str(model_id or "").strip() if not selected_model: @@ -3107,6 +3178,8 @@ def set_hermes_default_model(model_id: str) -> dict: elif not persisted_provider.startswith("custom:"): model_cfg.pop("base_url", None) + _apply_advanced_model_options(model_cfg, advanced) + config_data["model"] = model_cfg _save_yaml_config_file(config_path, config_data) # Reload outside the lock — reload_config() acquires _cfg_lock itself. @@ -3133,6 +3206,9 @@ AUX_TASK_SLOTS: tuple[str, ...] = ( "mcp", "title_generation", "curator", + "kanban_decomposer", + "profile_describer", + "triage_specifier", ) @@ -3169,18 +3245,46 @@ def get_auxiliary_models() -> dict: "provider": str(entry.get("provider") or "auto").strip(), "model": str(entry.get("model") or "").strip(), "base_url": str(entry.get("base_url") or "").strip(), + "timeout": entry.get("timeout", ""), + "download_timeout": entry.get("download_timeout", ""), + "max_concurrency": entry.get("max_concurrency", ""), + "extra_body": entry.get("extra_body") if isinstance(entry.get("extra_body"), dict) else {}, + "api_key_set": bool(str(entry.get("api_key") or "").strip()), }) return { "tasks": tasks, - "main": {"provider": main_provider, "model": main_model}, + "main": { + "provider": main_provider, + "model": main_model, + **_public_advanced_model_options(model_cfg), + }, } -def set_auxiliary_model(task: str, provider: str, model: str) -> dict: +def _coerce_optional_positive_int(value, field: str): + if value is None: + return None + if isinstance(value, str): + value = value.strip() + if value == "": + return "" + try: + number = int(value) + except (TypeError, ValueError) as exc: + raise ValueError(f"{field} must be a positive integer") from exc + if number < 1: + raise ValueError(f"{field} must be a positive integer") + return number + + +def set_auxiliary_model(task: str, provider: str, model: str, advanced: dict | None = None) -> dict: """Persist an auxiliary model assignment in config.yaml. Special case: task='__reset__' clears all auxiliary slots. + ``advanced`` may update per-slot fields surfaced behind the WebUI gear menu. + Sensitive api_key values are write-only: get_auxiliary_models() only reports + whether one is set. """ if task != "__reset__" and task not in AUX_TASK_SLOTS: raise ValueError( @@ -3220,6 +3324,12 @@ def set_auxiliary_model(task: str, provider: str, model: str) -> dict: slot_cfg["base_url"] = str(resolved_base_url).strip().rstrip("/") except Exception: pass + if advanced is not None: + try: + _apply_advanced_model_options(slot_cfg, advanced) + except ValueError as exc: + msg = str(exc).replace("advanced model options", "advanced auxiliary options") + raise ValueError(msg) from exc aux_cfg[task] = slot_cfg config_data["auxiliary"] = aux_cfg diff --git a/api/routes.py b/api/routes.py index 8b6009498..3e6e65f00 100644 --- a/api/routes.py +++ b/api/routes.py @@ -8207,7 +8207,8 @@ def handle_post(handler, parsed) -> bool: if parsed.path == "/api/default-model": try: - return j(handler, set_hermes_default_model(body.get("model"))) + advanced = body.get("advanced") if isinstance(body, dict) else None + return j(handler, set_hermes_default_model(body.get("model"), advanced=advanced)) except ValueError as e: return bad(handler, str(e)) except RuntimeError as e: @@ -8219,15 +8220,16 @@ def handle_post(handler, parsed) -> bool: task = str(body.get("task") or "").strip() provider = str(body.get("provider") or "auto").strip() model = str(body.get("model") or "").strip() + advanced = body.get("advanced") if isinstance(body, dict) else None if scope == "auxiliary": from api.config import set_auxiliary_model try: - return j(handler, set_auxiliary_model(task, provider, model)) + return j(handler, set_auxiliary_model(task, provider, model, advanced=advanced)) except Exception as exc: return bad(handler, str(exc), status=400) if scope == "main": try: - return j(handler, set_hermes_default_model(model)) + return j(handler, set_hermes_default_model(model, advanced=advanced)) except ValueError as exc: return bad(handler, str(exc), status=400) return bad(handler, f"unknown scope: {scope}", status=400) diff --git a/api/streaming.py b/api/streaming.py index 4220888f9..d06c17faa 100644 --- a/api/streaming.py +++ b/api/streaming.py @@ -38,6 +38,7 @@ from api.config import ( load_settings, parse_reasoning_effort, coerce_reasoning_effort_for_model, + _main_model_request_overrides, ) from api.helpers import redact_session_data, _redact_text from api.compression_anchor import is_context_compression_marker, visible_messages_for_anchor @@ -6189,6 +6190,7 @@ def _run_agent_streaming( _prefill_context = _load_webui_prefill_context(_cfg) _prefill_messages = _prefill_messages_with_webui_context(_prefill_context, _cfg) _prefill_messages = _normalize_prefill_messages_before_user_turn(_prefill_messages) + _main_request_overrides = _main_model_request_overrides(_cfg) put('context_status', { 'session_id': session_id, 'prefill': _public_prefill_context_status(_prefill_context), @@ -6370,6 +6372,8 @@ def _run_agent_streaming( _agent_kwargs['max_iterations'] = _max_iterations_cfg if 'max_tokens' in _agent_params and _max_tokens_cfg is not None: _agent_kwargs['max_tokens'] = _max_tokens_cfg + if 'request_overrides' in _agent_params and _main_request_overrides: + _agent_kwargs['request_overrides'] = _main_request_overrides # Params added in newer hermes-agent — skip if not supported if 'api_mode' in _agent_params: _agent_kwargs['api_mode'] = _rt.get('api_mode') @@ -6411,6 +6415,7 @@ def _run_agent_streaming( _fallback_resolved or {}, sorted(_toolsets) if _toolsets else [], _reasoning_config or {}, + _main_request_overrides or {}, _public_prefill_context_status(_prefill_context), # #1897: profile_home is part of the agent's identity because # AIAgent caches `_cached_system_prompt` from `load_soul_md()` diff --git a/static/i18n.js b/static/i18n.js index 07e8bf62c..bcbbe61c1 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -609,6 +609,11 @@ const LOCALES = { settings_save_btn: 'Save Settings', settings_label_model: 'Default Model', settings_desc_model: 'Used for new conversations. Existing conversations keep their selected model.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: 'Auxiliary Models', settings_desc_auxiliary_models: 'Side-task routing for vision, compression, title generation, etc. "Auto" uses your main chat model.', settings_btn_reset_aux_models: 'Reset all to auto', @@ -625,6 +630,53 @@ const LOCALES = { settings_aux_save_failed: 'Failed to save auxiliary model', settings_aux_saved: 'Auxiliary models updated', settings_aux_no_changes: 'No changes to apply', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: 'Send Key', settings_label_theme: 'Theme', settings_label_skin: 'Skin', @@ -2035,6 +2087,11 @@ const LOCALES = { settings_save_btn: 'Salva Impostazioni', settings_label_model: 'Modello Predefinito', settings_desc_model: 'Usato per le nuove conversazioni. Le conversazioni esistenti mantengono il modello selezionato.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: 'Modelli Ausiliari', settings_desc_auxiliary_models: 'Routing per attività secondarie come visione, compressione, generazione titoli, ecc. "Auto" utilizza il modello chat principale.', settings_btn_reset_aux_models: 'Ripristina tutto ad auto', @@ -2051,6 +2108,53 @@ const LOCALES = { settings_aux_save_failed: 'Salvataggio del modello ausiliario non riuscito', settings_aux_saved: 'Modelli ausiliari aggiornati', settings_aux_no_changes: 'Nessuna modifica da applicare', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: 'Tasto Invio', settings_label_theme: 'Tema', settings_label_skin: 'Skin', @@ -3452,6 +3556,11 @@ const LOCALES = { settings_save_btn: '設定を保存', settings_label_model: 'デフォルトモデル', settings_desc_model: '新しい会話で使用されます。既存の会話は選択済みモデルを保持します。', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: '補助モデル', settings_desc_auxiliary_models: 'ビジョン、圧縮、タイトル生成などの補助タスクのルーティング。「自動」はメインチャットモデルを使用します。', settings_btn_reset_aux_models: 'すべて自動にリセット', @@ -3468,6 +3577,53 @@ const LOCALES = { settings_aux_save_failed: '補助モデルの保存に失敗しました', settings_aux_saved: '補助モデルを更新しました', settings_aux_no_changes: '適用する変更はありません', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: '送信キー', settings_label_theme: 'テーマ', settings_label_skin: 'スキン', @@ -4661,6 +4817,11 @@ const LOCALES = { settings_save_btn: 'Сохранить настройки', settings_label_model: 'Модель по умолчанию', settings_desc_model: 'Используется для новых бесед. Существующие беседы сохраняют выбранную модель.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: 'Вспомогательные модели', settings_desc_auxiliary_models: 'Маршрутизация побочных задач: зрение, сжатие, генерация заголовков и т.д. «Авто» использует основную модель чата.', settings_btn_reset_aux_models: 'Сбросить всё на авто', @@ -4677,6 +4838,53 @@ const LOCALES = { settings_aux_save_failed: 'Не удалось сохранить вспомогательную модель', settings_aux_saved: 'Вспомогательные модели обновлены', settings_aux_no_changes: 'Нет изменений для применения', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: 'Клавиша отправки', settings_label_theme: 'Тема', settings_label_language: 'Язык', @@ -5995,6 +6203,11 @@ const LOCALES = { settings_save_btn: 'Guardar configuración', settings_label_model: 'Modelo predeterminado', settings_desc_model: 'Se usa para conversaciones nuevas. Las conversaciones existentes conservan su modelo seleccionado.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: 'Modelos auxiliares', settings_desc_auxiliary_models: 'Enrutamiento para tareas secundarias como visión, compresión, generación de títulos, etc. «Auto» usa el modelo de chat principal.', settings_btn_reset_aux_models: 'Restablecer todo a auto', @@ -6011,6 +6224,53 @@ const LOCALES = { settings_aux_save_failed: 'Error al guardar el modelo auxiliar', settings_aux_saved: 'Modelos auxiliares actualizados', settings_aux_no_changes: 'Sin cambios para aplicar', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: 'Tecla de envío', settings_label_theme: 'Tema', settings_label_skin: 'Piel', @@ -7333,6 +7593,11 @@ const LOCALES = { settings_save_btn: 'Einstellungen speichern', settings_label_model: 'Standard-Modell', settings_desc_model: 'Wird für neue Chats verwendet. Bestehende Chats behalten ihr ausgewähltes Modell.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: 'Hilfsmodelle', settings_desc_auxiliary_models: 'Routing für Nebenaufgaben wie Vision, Komprimierung, Titelgenerierung usw. „Auto" verwendet das Haupt-Chat-Modell.', settings_btn_reset_aux_models: 'Alle auf auto zurücksetzen', @@ -7349,6 +7614,53 @@ const LOCALES = { settings_aux_save_failed: 'Hilfsmodell konnte nicht gespeichert werden', settings_aux_saved: 'Hilfsmodelle aktualisiert', settings_aux_no_changes: 'Keine Änderungen anzuwenden', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'Bild-/Screenshot-Analyse', + settings_aux_task_compression: 'Komprimierung', + settings_aux_task_compression_desc: 'Kontext-Zusammenfassung', + settings_aux_task_web_extract: 'Web-Extraktion', + settings_aux_task_web_extract_desc: 'Webseiten-Zusammenfassung', + settings_aux_task_session_search: 'Sitzungssuche', + settings_aux_task_session_search_desc: 'Erinnerung an frühere Gespräche', + settings_aux_task_approval: 'Freigabe', + settings_aux_task_approval_desc: 'intelligente Befehlsfreigabe', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP-Tool-Reasoning', + settings_aux_task_title_generation: 'Titelgenerierung', + settings_aux_task_title_generation_desc: 'Sitzungstitel', + settings_aux_task_skills_hub: 'Skills Hub', + settings_aux_task_skills_hub_desc: 'Skill-Suche/-Installation', + settings_aux_task_curator: 'Kurator', + settings_aux_task_curator_desc: 'Skill-Nutzungsprüfung', + settings_aux_task_kanban_decomposer: 'Kanban-Zerleger', + settings_aux_task_kanban_decomposer_desc: 'Aufgabenzerlegung', + settings_aux_task_profile_describer: 'Profilbeschreiber', + settings_aux_task_profile_describer_desc: 'Profil-Zusammenfassungen', + settings_aux_task_triage_specifier: 'Triage-Spezifizierer', + settings_aux_task_triage_specifier_desc: 'Issue-/Aufgaben-Triage-Spezifikationen', + settings_aux_advanced_button_title: 'Erweiterte Optionen', + settings_aux_advanced_button_aria: 'Erweiterte Optionen für {task}', + settings_aux_advanced_title: '{task}-Optionen', + settings_aux_advanced_subtitle: 'Erweiterte Konfiguration für diese Hilfsaufgabe.', + settings_aux_advanced_save: 'Optionen speichern', + settings_aux_advanced_base_url: 'Basis-URL', + settings_aux_advanced_base_url_desc: 'Optionaler Provider-Endpunkt-Override.', + settings_aux_advanced_timeout: 'Timeout in Sekunden', + settings_aux_advanced_timeout_desc: 'Request-Timeout für diese Hilfsaufgabe. Leer nutzt den Hermes-Standard.', + settings_aux_advanced_download_timeout: 'Download-Timeout in Sekunden', + settings_aux_advanced_download_timeout_desc: 'Nur relevant für Aufgaben, die Medien/Inhalte herunterladen, z. B. Vision. Leer nutzt den Standard.', + settings_aux_advanced_max_concurrency: 'Maximale Parallelität', + settings_aux_advanced_max_concurrency_desc: 'Optionale Parallelitätsgrenze pro Aufgabe. Leer nutzt den Standard.', + settings_aux_advanced_extra_body: 'Extra-Body JSON', + settings_aux_advanced_extra_body_desc: 'Optionales JSON-Objekt, das in den Model-Request-Body gemischt wird.', + settings_aux_advanced_api_key: 'API-Key-Override', + settings_aux_advanced_api_key_set_hint: 'API-Key ist gesetzt. Leer lassen, um ihn zu behalten, oder Löschen aktivieren.', + settings_aux_advanced_api_key_empty_hint: 'Leer lassen, um Provider-/Standard-Zugangsdaten zu verwenden.', + settings_aux_advanced_api_key_clear: 'Vorhandenen API-Key-Override löschen', + settings_aux_advanced_extra_body_invalid_json: 'Extra-Body muss gültiges JSON sein', + settings_aux_advanced_extra_body_object_required: 'Extra-Body muss ein JSON-Objekt sein', + settings_aux_advanced_saved: 'Hilfsoptionen gespeichert', + settings_aux_advanced_save_failed: 'Hilfsoptionen konnten nicht gespeichert werden', settings_label_send_key: 'Sende-Taste', settings_label_theme: 'Theme', settings_label_skin: 'Skin', @@ -8724,6 +9036,11 @@ const LOCALES = { settings_save_btn: '保存设置', settings_label_model: '默认模型', settings_desc_model: '用于新对话。现有对话保持各自选定的模型。', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: '辅助模型', settings_desc_auxiliary_models: '视觉分析、上下文压缩、标题生成等辅助任务的路由。"自动"表示使用主聊天模型。', settings_btn_reset_aux_models: '全部重置为自动', @@ -8740,6 +9057,53 @@ const LOCALES = { settings_aux_save_failed: '辅助模型保存失败', settings_aux_saved: '辅助模型已更新', settings_aux_no_changes: '没有需要应用的更改', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: '发送快捷键', settings_label_theme: '主题', settings_label_skin: '皮肤', @@ -10286,6 +10650,11 @@ const LOCALES = { settings_save_btn: '儲存設定', settings_label_model: '預設模型', settings_desc_model: '用於新對話。現有對話會保留各自選定的模型。', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: '輔助模型', settings_desc_auxiliary_models: '視覺分析、脈絡壓縮、標題產生等輔助任務的路由。「自動」表示使用主要聊天模型。', settings_btn_reset_aux_models: '全部重置為自動', @@ -10302,8 +10671,57 @@ const LOCALES = { settings_aux_save_failed: '輔助模型儲存失敗', settings_aux_saved: '輔助模型已更新', settings_aux_no_changes: '沒有需要應用的變更', + + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: '送出按鍵', settings_label_theme: '主題', + settings_label_skin: '佈景', settings_label_font_size: '字型大小', font_size_small: '小', @@ -11593,6 +12011,11 @@ const LOCALES = { settings_save_btn: 'Salvar Configurações', settings_label_model: 'Modelo Padrão', settings_desc_model: 'Usado para novas conversas. Conversas existentes mantêm o modelo selecionado.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: 'Modelos auxiliares', settings_desc_auxiliary_models: 'Roteamento para tarefas secundárias como visão, compressão, geração de títulos, etc. "Auto" usa o modelo de chat principal.', settings_btn_reset_aux_models: 'Restaurar tudo para auto', @@ -11609,6 +12032,53 @@ const LOCALES = { settings_aux_save_failed: 'Falha ao salvar o modelo auxiliar', settings_aux_saved: 'Modelos auxiliares atualizados', settings_aux_no_changes: 'Nenhuma alteração para aplicar', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: 'Tecla de Envio', settings_label_theme: 'Tema', settings_label_skin: 'Skin', @@ -12911,6 +13381,11 @@ const LOCALES = { settings_save_btn: '설정 저장', settings_label_model: '기본 모델', settings_desc_model: '새 대화에 사용됩니다. 기존 대화는 선택된 모델을 유지합니다.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: '보조 모델', settings_desc_auxiliary_models: '비전, 압축, 제목 생성 등 보조 작업 라우팅. "자동"은 기본 채팅 모델을 사용합니다.', settings_btn_reset_aux_models: '모두 자동으로 재설정', @@ -12927,6 +13402,53 @@ const LOCALES = { settings_aux_save_failed: '보조 모델 저장 실패', settings_aux_saved: '보조 모델 업데이트됨', settings_aux_no_changes: '적용할 변경 사항 없음', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: '전송 키', settings_label_theme: '테마', settings_label_skin: '스킨', @@ -14246,6 +14768,11 @@ const LOCALES = { settings_save_btn: 'Enregistrer les paramètres', settings_label_model: 'Modèle par défaut', settings_desc_model: 'Utilisé pour les nouvelles conversations. Les conversations existantes conservent leur modèle sélectionné.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_auxiliary_models: 'Modèles auxiliaires', settings_desc_auxiliary_models: 'Routage des tâches secondaires : vision, compression, génération de titres, etc. « Auto » utilise le modèle de chat principal.', settings_btn_reset_aux_models: 'Tout réinitialiser à auto', @@ -14262,6 +14789,53 @@ const LOCALES = { settings_aux_save_failed: 'Échec de la sauvegarde du modèle auxiliaire', settings_aux_saved: 'Modèles auxiliaires mis à jour', settings_aux_no_changes: 'Aucune modification à appliquer', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: 'Envoyer la clé', settings_label_theme: 'Thème', settings_label_skin: 'Peau', @@ -15690,6 +16264,53 @@ const LOCALES = { settings_aux_model_custom: 'Özel model…', settings_aux_model_custom_prompt: 'Model kimliğini girin:', settings_aux_no_changes: 'Uygulanacak değişiklik yok', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_aux_saved: 'Yardımcı modeller güncellendi', settings_aux_save_failed: 'Yardımcı model kaydedilemedi', settings_aux_reset_confirm_title: 'Yardımcı modeller sıfırlansın mı?', @@ -15698,6 +16319,11 @@ const LOCALES = { settings_btn_apply_aux_models: 'Değişiklikleri uygula', settings_btn_reset_aux_models: 'Tümünü otomatiğe sıfırla', settings_desc_model: 'Yeni konuşmalar için kullanılır. Mevcut konuşmalar seçilen modellerini korur.', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', settings_label_send_key: 'Anahtar Gönder', settings_label_theme: 'Tema', settings_label_skin: 'Deri', @@ -17128,6 +17754,58 @@ const LOCALES = { settings_aux_save_failed: 'Nie udało się zapisać modelu pomocniczego', settings_aux_saved: 'Zaktualizowano modele pomocnicze', settings_aux_no_changes: 'Brak zmian do zastosowania', + settings_aux_task_vision: 'Vision', + settings_aux_task_vision_desc: 'image/screenshot analysis', + settings_aux_task_compression: 'Compression', + settings_aux_task_compression_desc: 'context summarization', + settings_aux_task_web_extract: 'Web extract', + settings_aux_task_web_extract_desc: 'web page summarization', + settings_aux_task_session_search: 'Session search', + settings_aux_task_session_search_desc: 'past-conversation recall', + settings_aux_task_approval: 'Approval', + settings_aux_task_approval_desc: 'smart command approval', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'MCP tool reasoning', + settings_aux_task_title_generation: 'Title generation', + settings_aux_task_title_generation_desc: 'session titles', + settings_aux_task_skills_hub: 'Skills hub', + settings_aux_task_skills_hub_desc: 'skills search/install', + settings_aux_task_curator: 'Curator', + settings_aux_task_curator_desc: 'skill-usage review pass', + settings_aux_task_kanban_decomposer: 'Kanban decomposer', + settings_aux_task_kanban_decomposer_desc: 'task decomposition', + settings_aux_task_profile_describer: 'Profile describer', + settings_aux_task_profile_describer_desc: 'profile summaries', + settings_aux_task_triage_specifier: 'Triage specifier', + settings_aux_task_triage_specifier_desc: 'issue/task triage specs', + settings_main_advanced_button_aria: 'Advanced options for main model', + settings_main_advanced_title: 'Main model options', + settings_main_advanced_subtitle: 'Advanced config for the default chat model.', + settings_main_advanced_saved: 'Main model options saved', + settings_main_advanced_save_failed: 'Failed to save main model options', + settings_aux_advanced_button_title: 'Advanced options', + settings_aux_advanced_button_aria: 'Advanced options for {task}', + settings_aux_advanced_title: '{task} options', + settings_aux_advanced_subtitle: 'Advanced config for auxiliary.', + settings_aux_advanced_save: 'Save options', + settings_aux_advanced_base_url: 'Base URL', + settings_aux_advanced_base_url_desc: 'Optional provider endpoint override.', + settings_aux_advanced_timeout: 'Timeout seconds', + settings_aux_advanced_timeout_desc: 'Request timeout for this auxiliary task. Blank uses Hermes default.', + settings_aux_advanced_download_timeout: 'Download timeout seconds', + settings_aux_advanced_download_timeout_desc: 'Only relevant for tasks that download media/content, e.g. vision. Blank uses default.', + settings_aux_advanced_max_concurrency: 'Max concurrency', + settings_aux_advanced_max_concurrency_desc: 'Optional per-task concurrency limit. Blank uses default.', + settings_aux_advanced_extra_body: 'Extra body JSON', + settings_aux_advanced_extra_body_desc: 'Optional JSON object merged into the model request body.', + settings_aux_advanced_api_key: 'API key override', + settings_aux_advanced_api_key_set_hint: 'API key is set. Leave blank to keep it, or use clear to remove it.', + settings_aux_advanced_api_key_empty_hint: 'Leave blank to use provider/default credentials.', + settings_aux_advanced_api_key_clear: 'Clear existing API key override', + settings_aux_advanced_extra_body_invalid_json: 'Extra body must be valid JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body must be a JSON object', + settings_aux_advanced_saved: 'Auxiliary options saved', + settings_aux_advanced_save_failed: 'Failed to save auxiliary options', settings_label_send_key: 'Klawisz wysyłania', settings_label_theme: 'Motyw', settings_label_skin: 'Skórka', diff --git a/static/index.html b/static/index.html index 4bca04e28..d3501dd50 100644 --- a/static/index.html +++ b/static/index.html @@ -1056,7 +1056,10 @@