{
  "ai_group": {
    "name": "AI",
    "agent_runner": {
      "description": "Agent Runner",
      "hint": "Select the runner for AI conversations. Defaults to AstrBot's built-in Agent runner, which supports knowledge base, persona, and tool calling features. You don't need to modify this section unless you plan to integrate third-party Agent runners like Dify, Coze, or DeerFlow.",
      "provider_settings": {
        "enable": {
          "description": "Enable",
          "hint": "Master switch for AI conversations"
        },
        "agent_runner_type": {
          "description": "Runner",
          "labels": [
            "Built-in Agent",
            "Dify",
            "Coze",
            "Alibaba Cloud Bailian Application",
            "DeerFlow"
          ]
        },
        "coze_agent_runner_provider_id": {
          "description": "Coze Agent Runner Provider ID"
        },
        "dify_agent_runner_provider_id": {
          "description": "Dify Agent Runner Provider ID"
        },
        "dashscope_agent_runner_provider_id": {
          "description": "Alibaba Cloud Bailian Application Agent Runner Provider ID"
        },
        "deerflow_agent_runner_provider_id": {
          "description": "DeerFlow Agent Runner Provider ID"
        }
      }
    },
    "ai": {
      "description": "Model",
      "hint": "When using non-built-in Agent runners, the default chat model and default image caption model may not take effect, but some plugins rely on these settings to invoke AI capabilities.",
      "provider_settings": {
        "default_provider_id": {
          "description": "Default Chat Model",
          "hint": "Uses the first model when left empty"
        },
        "fallback_chat_models": {
          "description": "Fallback chat model IDs",
          "hint": "When the primary chat model request fails, fallback to these chat models in order."
        },
        "request_max_retries": {
          "description": "Request Max Retries",
          "hint": "Maximum attempts for a single model request when retryable errors occur."
        },
        "default_image_caption_provider_id": {
          "description": "Default Image Caption Model",
          "hint": "Leave empty to disable; useful for non-multimodal models"
        },
        "image_caption_prompt": {
          "description": "Image Caption Prompt"
        }
      },
      "provider_stt_settings": {
        "enable": {
          "description": "Enable Speech-to-Text",
          "hint": "Master switch for STT"
        },
        "provider_id": {
          "description": "Default Speech-to-Text Model",
          "hint": "Users can also select session-specific STT models using the /provider command."
        }
      },
      "provider_tts_settings": {
        "enable": {
          "description": "Enable Text-to-Speech",
          "hint": "Master switch for TTS"
        },
        "provider_id": {
          "description": "Default Text-to-Speech Model"
        },
        "trigger_probability": {
          "description": "TTS Trigger Probability"
        }
      }
    },
    "persona": {
      "description": "Persona",
      "hint": "Set the default persona for AI conversations. Personas can be managed in the Persona tab.",
      "provider_settings": {
        "default_personality": {
          "description": "Default Persona"
        }
      }
    },
    "knowledgebase": {
      "description": "Knowledge Base",
      "kb_names": {
        "description": "Knowledge Base List",
        "hint": "Supports multiple selections"
      },
      "kb_fusion_top_k": {
        "description": "Fusion Search Results Count",
        "hint": "Number of results returned after fusing search results from multiple knowledge bases"
      },
      "kb_final_top_k": {
        "description": "Final Results Count",
        "hint": "Number of results retrieved from the knowledge base. Higher values may provide more relevant information but could also introduce noise. Adjust based on actual needs"
      },
      "kb_agentic_mode": {
        "description": "Agentic Knowledge Base Retrieval",
        "hint": "When enabled, knowledge base retrieval becomes an LLM Tool, allowing the model to autonomously decide when to query the knowledge base. Requires the model to support function calling."
      }
    },
    "websearch": {
      "description": "Web Search",
      "provider_settings": {
        "web_search": {
          "description": "Enable Web Search"
        },
        "websearch_provider": {
          "description": "Web Search Provider"
        },
        "websearch_tavily_key": {
          "description": "Tavily API Key",
          "hint": "Multiple keys can be added for rotation."
        },
        "websearch_bocha_key": {
          "description": "BoCha API Key",
          "hint": "Multiple keys can be added for rotation."
        },
        "websearch_brave_key": {
          "description": "Brave Search API Key",
          "hint": "Multiple keys can be added for rotation."
        },
        "websearch_firecrawl_key": {
          "description": "Firecrawl API Key",
          "hint": "Multiple keys can be added for rotation."
        },
        "websearch_baidu_app_builder_key": {
          "description": "Baidu Qianfan Smart Cloud APP Builder API Key",
          "hint": "Reference: [https://console.bce.baidu.com/iam/#/iam/apikey/list](https://console.bce.baidu.com/iam/#/iam/apikey/list)"
        },
        "web_search_link": {
          "description": "Display Source Citations"
        },
        "websearch_exa_key": {
          "description": "Exa API Key",
          "hint": "Multiple keys can be added for rotation. Get a key at https://dashboard.exa.ai"
        }
      }
    },
    "file_extract": {
      "description": "File Extract",
      "provider_settings": {
        "file_extract": {
          "enable": {
            "description": "Enable File Extract"
          },
          "provider": {
            "description": "File Extract Provider"
          },
          "moonshotai_api_key": {
            "description": "Moonshot AI API Key"
          }
        }
      }
    },
    "agent_computer_use": {
      "description": "Agent Computer Use",
      "hint": "Allows the AstrBot to access and use your computer or an sandbox environment to perform more complex tasks. See: [Computer Use](https://docs.astrbot.app/use/computer.html).",
      "provider_settings": {
        "computer_use_runtime": {
          "description": "Computer Use Runtime",
          "hint": "Environment allowed for Agent usage. `local` means the local machine environment, `sandbox` means the sandbox environment, and `none` means no environment is allowed."
        },
        "computer_use_require_admin": {
          "description": "Require AstrBot Admin Permission",
          "hint": "When enabled, AstrBot admin permission is required to use computer capabilities. Admins can be added in Platform Config. Use the /sid command to view admin IDs."
        },
        "sandbox": {
          "booter": {
            "description": "Sandbox Environment Driver"
          },
          "shipyard_neo_endpoint": {
            "description": "Shipyard Neo API Endpoint",
            "hint": "Bay API address, default http://127.0.0.1:8114."
          },
          "shipyard_neo_access_token": {
            "description": "Shipyard Neo Access Token",
            "hint": "Bay API Key (sk-bay-...). Leave empty for auto-discovery from credentials.json."
          },
          "shipyard_neo_profile": {
            "description": "Shipyard Neo Profile",
            "hint": "Sandbox profile for Shipyard Neo, e.g. python-default. Leave empty to auto-select the most capable profile."
          },
          "shipyard_neo_ttl": {
            "description": "Shipyard Neo Sandbox TTL",
            "hint": "Sandbox time-to-live in seconds."
          },
          "cua_image": {
            "description": "CUA Image",
            "hint": "CUA sandbox image or OS type. Defaults to linux. Supported values depend on the installed CUA SDK."
          },
          "cua_os_type": {
            "description": "CUA OS Type",
            "hint": "CUA sandbox operating system type. Defaults to linux."
          },
          "cua_idle_timeout": {
            "description": "CUA Idle Timeout",
            "hint": "Idle timeout for CUA sandbox sessions in seconds. When greater than 0, AstrBot proactively shuts down an idle CUA sandbox after that amount of inactivity; 0 disables it."
          },
          "cua_telemetry_enabled": {
            "description": "CUA Telemetry",
            "hint": "Allow the CUA SDK to send telemetry data. Disabled by default."
          },
          "cua_local": {
            "description": "CUA Local Sandbox",
            "hint": "Prefer a local CUA sandbox. Enabled by default to avoid requiring CUA_API_KEY for cloud sandboxes. Disable this to use CUA cloud sandboxes."
          },
          "cua_api_key": {
            "description": "CUA API Key",
            "hint": "CUA cloud sandbox API key. Required only when local sandbox is disabled. You can also provide it via the CUA_API_KEY environment variable."
          },
          "shipyard_endpoint": {
            "description": "Shipyard API Endpoint",
            "hint": "API access address for Shipyard service."
          },
          "shipyard_access_token": {
            "description": "Shipyard Access Token",
            "hint": "Access token for accessing Shipyard service."
          },
          "shipyard_ttl": {
            "description": "Shipyard Session TTL",
            "hint": "Session time-to-live in seconds."
          },
          "shipyard_max_sessions": {
            "description": "Shipyard Max Sessions",
            "hint": "Maximum number of Shipyard sessions an instance can handle."
          }
        }
      }
    },
    "proactive_capability": {
      "description": "Proactive Agent",
      "hint": "AstrBot will wake up, run your tasks, and deliver the results to you. See [Proactive Agent](https://docs.astrbot.app/en/use/proactive-agent.html)",
      "provider_settings": {
        "proactive_capability": {
          "add_cron_tools": {
            "description": "Enable",
            "hint": "When enabled, related tools will be passed to the Agent to implement proactive Agent capabilities. You can tell AstrBot what to do at a future time, and it will be triggered on schedule to execute the task, and report the result back to you."
          }
        }
      }
    },
    "truncate_and_compress": {
      "hint": "[Context Management](https://docs.astrbot.app/en/use/context-compress.html)",
      "description": "Context Management Strategy",
      "provider_settings": {
        "max_context_length": {
          "description": "Max Turns Before Compression",
          "hint": "Persistent conversation history is truncated or LLM-compressed by the strategy below only after it exceeds this many turns. Request-time contexts are also constrained by this value before sending. -1 means no turn-based limit."
        },
        "dequeue_context_length": {
          "description": "Turns to Discard When Limit Exceeded",
          "hint": "When history exceeds 'Max Turns Before Compression' and LLM compression is unavailable, discard this many oldest turns at once. Request-time truncation also reuses this value."
        },
        "context_limit_reached_strategy": {
          "description": "Handling for History Limits or Context Window Pressure",
          "labels": [
            "Truncate by Turns",
            "Compress by LLM"
          ],
          "hint": "Persistent conversation history uses this strategy only after exceeding 'Max Turns Before Compression'. Before each request, the same strategy may also protect the in-flight context when tokens approach the model window."
        },
        "llm_compress_instruction": {
          "description": "Context Compression Instruction",
          "hint": "If empty, the default prompt will be used."
        },
        "llm_compress_keep_recent_ratio": {
          "description": "Recent Context Token Ratio to Keep",
          "hint": "Keep recent exact context by current context token ratio, from 0-0.3. 0.15 means keeping 15%; values above 0 keep at least the latest round."
        },
        "llm_compress_provider_id": {
          "description": "Model Provider ID for Context Compression",
          "hint": "When left empty, the current chat model will be used for compression. If the model is unavailable or compression fails, AstrBot falls back to the 'Truncate by Turns' strategy."
        },
        "fallback_max_context_tokens": {
          "description": "Fallback context window size",
          "hint": "When max_context_tokens is 0 and the model is not in built-in metadata, use this value as the context window size. Default: 128000."
        }
      }
    },
    "others": {
      "description": "Other Settings",
      "provider_settings": {
        "display_reasoning_text": {
          "description": "Display Reasoning Content"
        },
        "llm_safety_mode": {
          "description": "Healthy Mode",
          "hint": "Add safety guardrails to model replies."
        },
        "safety_mode_strategy": {
          "description": "Healthy Mode Strategy",
          "hint": "How to apply healthy mode."
        },
        "identifier": {
          "description": "User Identification",
          "hint": "When enabled, user ID information will be included in the prompt."
        },
        "group_name_display": {
          "description": "Display Group Name",
          "hint": "When enabled, group name information will be included in the prompt on supported platforms (OneBot v11)."
        },
        "datetime_system_prompt": {
          "description": "Real-world Time Awareness",
          "hint": "When enabled, current time information will be appended to the system prompt."
        },
        "show_tool_use_status": {
          "description": "Output Function Call Status"
        },
        "show_tool_call_result": {
          "description": "Output Tool Call Results",
          "hint": "Only takes effect when \"Output Function Call Status\" is enabled, and shows at most 70 characters."
        },
        "buffer_intermediate_messages": {
          "description": "Merge Agent Intermediate Messages",
          "hint": "When enabled, intermediate text generated during multi-step tool calls in non-streaming mode will be buffered and sent as a single merged reply after the Agent finishes."
        },
        "sanitize_context_by_modalities": {
          "description": "Sanitize History by Modalities",
          "hint": "When enabled, sanitizes contexts before each LLM request by removing image blocks and tool-call structures that the current provider's modalities do not support (this changes what the model sees)."
        },
        "max_quoted_fallback_images": {
          "description": "Forwarded Image Fetch Limit",
          "hint": "Maximum number of images injected from forwarded-message parsing; extra images are truncated."
        },
        "quoted_message_parser": {
          "max_component_chain_depth": {
            "description": "Forwarded Rich-Text Parse Depth",
            "hint": "Maximum recursive depth when parsing rich-text component chains inside forwarded messages."
          },
          "max_forward_node_depth": {
            "description": "Forward Nesting Parse Depth",
            "hint": "Maximum recursive depth when parsing nested forwarded nodes."
          },
          "max_forward_fetch": {
            "description": "Forward Recursive Fetch Limit",
            "hint": "Maximum number of recursive get_forward_msg fetch operations."
          },
          "warn_on_action_failure": {
            "description": "Warn on Forward Parse Failure",
            "hint": "When enabled, log warnings when all get_msg/get_forward_msg attempts fail."
          }
        },
        "max_agent_step": {
          "description": "Maximum Tool Call Rounds"
        },
        "tool_call_timeout": {
          "description": "Tool Call Timeout (seconds)"
        },
        "tool_schema_mode": {
          "description": "Tool Schema Mode",
          "hint": "Skills-like sends name/description first and re-queries for parameters; Full sends the complete schema in one step.",
          "labels": [
            "Skills-like (two-stage)",
            "Full schema"
          ]
        },
        "streaming_response": {
          "description": "Streaming Output"
        },
        "unsupported_streaming_strategy": {
          "description": "Platforms Without Streaming Support",
          "hint": "Select the handling method for platforms that don't support streaming responses. Real-time segmented reply sends content immediately when the system detects segment points like punctuation during streaming reception",
          "labels": [
            "Real-time Segmented Reply",
            "Disable Streaming Response"
          ]
        },
        "wake_prefix": {
          "description": "Additional LLM Chat Wake Prefix",
          "hint": "If the wake prefix is / and the additional chat wake prefix is chat, then /chat is required to trigger LLM requests"
        },
        "prompt_prefix": {
          "description": "User Prompt",
          "hint": "You can use {{prompt}} as a placeholder for user input. If no placeholder is provided, it will be added before the user input."
        },
        "image_compress_enabled": {
          "description": "Enable image compression",
          "hint": "When enabled, large local images are compressed before being sent to multimodal models."
        },
        "image_compress_options": {
          "description": "Image compression settings",
          "hint": "Control image resize limits, JPEG quality, and the minimum size threshold for compression.",
          "max_size": {
            "description": "Maximum edge length",
            "hint": "Longest edge of the compressed image in pixels. Images larger than this are resized proportionally."
          },
          "quality": {
            "description": "JPEG quality",
            "hint": "JPEG output quality from 1 to 100. Higher values preserve more detail but produce larger files."
          }
        },
        "reachability_check": {
          "description": "Provider Reachability Check",
          "hint": "When running the /provider command, test provider connectivity in parallel. This actively pings models and may consume extra tokens."
        }
      },
      "provider_tts_settings": {
        "dual_output": {
          "description": "Output Both Voice and Text When TTS is Enabled"
        }
      }
    }
  },
  "platform_group": {
    "name": "Platform",
    "platform": {
      "description": "Message Platform Adapters",
      "active_send_mode": {
        "description": "Use Proactive Send API"
      },
      "appid": {
        "description": "App ID",
        "hint": "Required. App ID for the current messaging platform. See the platform integration docs for how to obtain it."
      },
      "callback_server_host": {
        "description": "Callback Server Host",
        "hint": "Callback server host. Leave empty to disable the callback server."
      },
      "card_template_id": {
        "description": "Card Template ID",
        "hint": "Optional. DingTalk interactive card template ID. When enabled, streaming replies will use interactive cards."
      },
      "discord_activity_name": {
        "description": "Discord Activity Name",
        "hint": "Optional Discord activity name. Leave empty to disable."
      },
      "discord_allow_bot_messages": {
        "description": "Allow Bot Messages",
        "hint": "When enabled, AstrBot will receive messages from other Discord bots. Useful for bot-to-bot communication scenarios (e.g., message forwarding). Disabled by default."
      },
      "discord_command_register": {
        "description": "Register Discord slash commands",
        "hint": "When enabled, AstrBot will automatically register plugin commands as Discord slash commands"
      },
      "discord_proxy": {
        "description": "Discord Proxy URL",
        "hint": "Optional proxy URL: http://ip:port"
      },
      "discord_token": {
        "description": "Discord Bot Token",
        "hint": "Enter your Discord Bot Token here."
      },
      "enable": {
        "description": "Enable",
        "hint": "Whether to enable this adapter. Disabled adapters will not receive messages."
      },
      "enable_group_c2c": {
        "description": "Enable Message List Private Chat",
        "hint": "When enabled, the bot can receive private chats from QQ message list. You may need to add the bot as a friend by scanning a QR code in the QQ bot platform. See docs."
      },
      "enable_guild_direct_message": {
        "description": "Enable Guild Direct Messages",
        "hint": "When enabled, the bot can receive guild direct messages."
      },
      "id": {
        "description": "Bot Name",
        "hint": "Bot name"
      },
      "is_sandbox": {
        "description": "Sandbox Mode"
      },
      "kf_name": {
        "description": "WeChat Customer Service Account Name",
        "hint": "Optional. Customer service account name (not ID). Get it at https://kf.weixin.qq.com/kf/frame#/accounts"
      },
      "lark_connection_mode": {
        "description": "Subscription Mode",
        "labels": [
          "Long Connection Mode",
          "Webhook Server Mode"
        ]
      },
      "lark_encrypt_key": {
        "description": "Encrypt Key",
        "hint": "Encryption key for decrypting Lark callback data."
      },
      "lark_verification_token": {
        "description": "Verification Token",
        "hint": "Token for verifying Lark callback requests."
      },
      "misskey_allow_insecure_downloads": {
        "description": "Allow Insecure Downloads (Disable SSL Verification)",
        "hint": "If remote servers have certificate issues, SSL verification will be disabled as a fallback. Use only when necessary due to security risks."
      },
      "misskey_default_visibility": {
        "description": "Default Post Visibility",
        "hint": "Default visibility for bot posts. public: public, home: home timeline, followers: followers only."
      },
      "misskey_download_chunk_size": {
        "description": "Stream Download Chunk Size (bytes)",
        "hint": "Bytes read per chunk during streaming download and MD5 calculation. Too small increases overhead; too large uses more memory."
      },
      "misskey_download_timeout": {
        "description": "Remote Download Timeout (seconds)",
        "hint": "Timeout for downloading remote files (seconds), used when falling back to local upload."
      },
      "misskey_enable_chat": {
        "description": "Enable Chat Message Responses",
        "hint": "When enabled, the bot listens and responds to private chat messages."
      },
      "misskey_enable_file_upload": {
        "description": "Enable File Upload to Misskey",
        "hint": "When enabled, the adapter uploads files in message chains to Misskey. URL files try server-side upload first; if async upload fails, it falls back to local download and upload."
      },
      "misskey_instance_url": {
        "description": "Misskey Instance URL",
        "hint": "e.g. https://misskey.example. The Misskey instance where the bot account lives."
      },
      "misskey_local_only": {
        "description": "Local Only (No Federation)",
        "hint": "When enabled, bot posts are visible only on this instance and are not federated."
      },
      "misskey_max_download_bytes": {
        "description": "Max Download Size (bytes)",
        "hint": "To limit download size to prevent OOM, set the maximum bytes; empty or null means no limit."
      },
      "misskey_token": {
        "description": "Misskey Access Token",
        "hint": "API access token generated in the connection service settings."
      },
      "misskey_upload_concurrency": {
        "description": "Upload Concurrency Limit",
        "hint": "Max number of concurrent upload tasks (integer, default 3)."
      },
      "misskey_upload_folder": {
        "description": "Target Drive Folder ID",
        "hint": "Optional: ID of the target folder in Misskey drive. Leave empty to use the root folder."
      },
      "port": {
        "description": "Callback Server Port",
        "hint": "Callback server port. Leave empty to disable the callback server."
      },
      "satori_api_base_url": {
        "description": "Satori API Endpoint",
        "hint": "Base URL for the Satori API."
      },
      "satori_auto_reconnect": {
        "description": "Enable Auto Reconnect",
        "hint": "Automatically reconnect the WebSocket when disconnected."
      },
      "satori_endpoint": {
        "description": "Satori WebSocket Endpoint",
        "hint": "WebSocket endpoint for Satori events."
      },
      "satori_heartbeat_interval": {
        "description": "Satori Heartbeat Interval",
        "hint": "Interval in seconds between heartbeat messages."
      },
      "satori_reconnect_delay": {
        "description": "Satori Reconnect Delay",
        "hint": "Delay before attempting to reconnect (seconds)."
      },
      "satori_token": {
        "description": "Satori Token",
        "hint": "Token for Satori API authentication."
      },
      "secret": {
        "description": "Secret",
        "hint": "Required."
      },
      "slack_connection_mode": {
        "description": "Slack Connection Mode",
        "hint": "The connection mode for Slack. `webhook` uses a webhook server, `socket` uses Slack's Socket Mode."
      },
      "slack_webhook_host": {
        "description": "Slack Webhook Host",
        "hint": "Only valid when Slack connection mode is `webhook`."
      },
      "slack_webhook_path": {
        "description": "Slack Webhook Path",
        "hint": "Only valid when Slack connection mode is `webhook`."
      },
      "slack_webhook_port": {
        "description": "Slack Webhook Port",
        "hint": "Only valid when Slack connection mode is `webhook`."
      },
      "telegram_command_auto_refresh": {
        "description": "Telegram Command Auto Refresh",
        "hint": "When enabled, AstrBot automatically refreshes Telegram commands at runtime. (Setting this alone has no effect)"
      },
      "telegram_command_register": {
        "description": "Telegram Command Registration",
        "hint": "When enabled, AstrBot automatically registers Telegram commands."
      },
      "telegram_command_register_interval": {
        "description": "Telegram Command Auto Refresh Interval",
        "hint": "Telegram command auto-refresh interval in seconds."
      },
      "telegram_polling_restart_delay": {
        "description": "Telegram Polling Restart Delay",
        "hint": "Waiting time in seconds when the polling loop needs to restart after unexpected exits. Defaults to 5s."
      },
      "telegram_token": {
        "description": "Bot Token",
        "hint": "If you are in mainland China, set a proxy or change api_base in Other Settings."
      },
      "mattermost_url": {
        "description": "Mattermost URL",
        "hint": "Mattermost service URL, for example https://chat.example.com."
      },
      "mattermost_bot_token": {
        "description": "Mattermost Bot Token",
        "hint": "The access token generated after creating a bot account in Mattermost."
      },
      "mattermost_reconnect_delay": {
        "description": "Mattermost Reconnect Delay",
        "hint": "Delay in seconds before reconnecting after the WebSocket disconnects. Defaults to 5 seconds."
      },
      "type": {
        "description": "Adapter Type"
      },
      "unified_webhook_mode": {
        "description": "Unified Webhook Mode",
        "hint": "When enabled, use AstrBot unified webhook entry without opening a separate port. Callback URL is /api/v1/webhooks/platforms/{webhook_uuid}."
      },
      "webhook_uuid": {
        "description": "Webhook UUID",
        "hint": "Unique identifier for unified webhook mode; generated when creating the platform."
      },
      "wecom_ai_bot_name": {
        "description": "WeCom AI Bot Name",
        "hint": "Must be correct; otherwise some commands won't work."
      },
      "wecom_ai_bot_connection_mode": {
        "description": "WeCom AI Bot Connection Mode",
        "hint": "Webhook mode requires Token/EncodingAESKey; long_connection mode requires BotID/Secret."
      },
      "wecomaibot_friend_message_welcome_text": {
        "description": "WeCom AI Bot DM Welcome Message",
        "hint": "When a user enters a DM session on that day, reply with a welcome message. Leave empty to disable."
      },
      "wecomaibot_init_respond_text": {
        "description": "WeCom AI Bot Initial Response Text",
        "hint": "First reply when the bot receives a message. Leave empty to disable."
      },
      "wecomaibot_token": {
        "description": "WeCom AI Bot Token",
        "hint": "Used for authentication in webhook callback mode."
      },
      "wecomaibot_encoding_aes_key": {
        "description": "WeCom AI Bot EncodingAESKey",
        "hint": "Used for message encryption/decryption in webhook callback mode."
      },
      "wecomaibot_ws_bot_id": {
        "description": "Long Connection BotID",
        "hint": "BotID credential for WeCom AI Bot long connection mode."
      },
      "wecomaibot_ws_secret": {
        "description": "Long Connection Secret",
        "hint": "Secret credential for WeCom AI Bot long connection mode."
      },
      "wecomaibot_ws_url": {
        "description": "Long Connection WebSocket URL",
        "hint": "Default is wss://openws.work.weixin.qq.com and usually does not need changes."
      },
      "wecomaibot_heartbeat_interval": {
        "description": "Long Connection Heartbeat Interval",
        "hint": "Heartbeat interval (seconds) in long connection mode. 30 seconds is recommended."
      },
      "wpp_active_message_poll": {
        "description": "Enable Proactive Message Polling",
        "hint": "Only enable if WeChat messages are not syncing to AstrBot on time. Disabled by default."
      },
      "wpp_active_message_poll_interval": {
        "description": "Proactive Message Poll Interval",
        "hint": "Interval in seconds, default 3, should not exceed 60 or it may be considered old messages."
      },
      "ws_reverse_host": {
        "description": "Reverse WebSocket Host",
        "hint": "AstrBot acts as the server."
      },
      "ws_reverse_port": {
        "description": "Reverse WebSocket Port"
      },
      "ws_reverse_token": {
        "description": "Reverse WebSocket Token",
        "hint": "Reverse WebSocket token. If not set, token verification is disabled."
      },
      "msg_push_webhook_url": {
        "description": "WeCom Message Push Webhook URL",
        "hint": "Used for proactive message push. It is strongly recommended to set this for a better message sending experience."
      },
      "only_use_webhook_url_to_send": {
        "description": "Send Replies via Webhook Only",
        "hint": "When enabled, all WeCom AI Bot replies are sent through msg_push_webhook_url. The message push webhook supports more message types (such as images, files, etc.). If you do not need the typing effect, it is strongly recommended to use this option. "
      },
      "weixin_oc_base_url": {
        "description": "API Base URL",
        "hint": "Default: https://ilinkai.weixin.qq.com"
      },
      "weixin_oc_bot_type": {
        "description": "bot_type (QR login parameter)",
        "hint": "Default: 3"
      },
      "weixin_oc_qr_poll_interval": {
        "description": "QR status poll interval (seconds)",
        "hint": "Polling interval in seconds for QR code status."
      },
      "weixin_oc_long_poll_timeout_ms": {
        "description": "getUpdates long-poll timeout (ms)",
        "hint": "Timeout parameter for polling messages."
      },
      "weixin_oc_api_timeout_ms": {
        "description": "HTTP timeout (ms)",
        "hint": "Generic API request timeout."
      },
      "weixin_oc_token": {
        "description": "Token after login (optional)",
        "hint": "Automatically written after QR login; can be filled manually for advanced scenarios."
      },
      "kook_bot_token": {
        "description": "Bot Token",
        "type": "string",
        "hint": "Required. The Bot Token obtained from the KOOK Developer Platform."
      },
      "kook_reconnect_delay": {
        "description": "Reconnect Delay",
        "type": "int",
        "hint": "Delay time for reconnection (seconds), using an exponential backoff strategy."
      },
      "kook_max_reconnect_delay": {
        "description": "Max Reconnect Delay",
        "type": "int",
        "hint": "The maximum value for reconnection delay (seconds)."
      },
      "kook_max_retry_delay": {
        "description": "Max Retry Delay",
        "type": "int",
        "hint": "The maximum delay time for retries (seconds)."
      },
      "kook_heartbeat_interval": {
        "description": "Heartbeat Interval",
        "type": "int",
        "hint": "The interval time for heartbeat detection (seconds)."
      },
      "kook_heartbeat_timeout": {
        "description": "Heartbeat Timeout",
        "type": "int",
        "hint": "The timeout duration for heartbeat detection (seconds)."
      },
      "kook_max_heartbeat_failures": {
        "description": "Max Heartbeat Failures",
        "type": "int",
        "hint": "Maximum allowed heartbeat failures; the connection will be dropped if exceeded."
      },
      "kook_max_consecutive_failures": {
        "description": "Max Consecutive Failures",
        "type": "int",
        "hint": "Maximum allowed consecutive failures; retries will stop if exceeded."
      }
    },
    "general": {
      "description": "General",
      "admins_id": {
        "description": "Administrator IDs"
      },
      "platform_settings": {
        "unique_session": {
          "description": "Isolate Sessions",
          "hint": "When enabled, group members have independent contexts."
        },
        "friend_message_needs_wake_prefix": {
          "description": "Private Messages Require Wake Word"
        },
        "reply_prefix": {
          "description": "Reply Text Prefix"
        },
        "reply_with_mention": {
          "description": "Mention Sender in Reply"
        },
        "reply_with_quote": {
          "description": "Quote Sender's Message in Reply"
        },
        "forward_threshold": {
          "description": "Forward Message Word Count Threshold"
        },
        "empty_mention_waiting": {
          "description": "Trigger Waiting on Mention-only Messages"
        }
      },
      "wake_prefix": {
        "description": "Wake Word"
      },
      "disable_builtin_commands": {
        "description": "Disable Built-in Commands",
        "hint": "Disable all built-in AstrBot commands such as help, sid, new, etc."
      }
    },
    "whitelist": {
      "description": "Whitelist",
      "platform_settings": {
        "enable_id_white_list": {
          "description": "Enable Whitelist",
          "hint": "When enabled, only sessions in the whitelist will be responded to. If the whitelist is empty, the whitelist is disabled and all IDs are allowed."
        },
        "id_whitelist": {
          "description": "Whitelist ID List",
          "hint": "Use /sid to get IDs. If the list is empty, it means whitelist is disabled (all IDs are in the whitelist)."
        },
        "id_whitelist_log": {
          "description": "Output Logs",
          "hint": "When enabled, INFO level logs will be output when a message doesn't pass the whitelist."
        },
        "wl_ignore_admin_on_group": {
          "description": "Administrator Group Messages Bypass ID Whitelist"
        },
        "wl_ignore_admin_on_friend": {
          "description": "Administrator Private Messages Bypass ID Whitelist"
        }
      }
    },
    "rate_limit": {
      "description": "Rate Limiting",
      "platform_settings": {
        "rate_limit": {
          "time": {
            "description": "Message Rate Limit Time (seconds)"
          },
          "count": {
            "description": "Message Rate Limit Count"
          },
          "strategy": {
            "description": "Rate Limit Strategy"
          }
        }
      }
    },
    "content_safety": {
      "description": "Content Safety",
      "content_safety": {
        "also_use_in_response": {
          "description": "Also Check Model Response Content"
        },
        "baidu_aip": {
          "enable": {
            "description": "Use Baidu Content Safety Moderation",
            "hint": "You need to manually install the baidu-aip library."
          },
          "app_id": {
            "description": "App ID"
          },
          "api_key": {
            "description": "API Key"
          },
          "secret_key": {
            "description": "Secret Key"
          }
        },
        "internal_keywords": {
          "enable": {
            "description": "Keyword Check"
          },
          "extra_keywords": {
            "description": "Additional Keywords",
            "hint": "Additional keyword blocklist, supports regular expressions."
          }
        }
      }
    },
    "t2i": {
      "description": "Text-to-Image",
      "t2i": {
        "description": "Text-to-Image Output"
      },
      "t2i_word_threshold": {
        "description": "Text-to-Image Word Count Threshold"
      }
    },
    "others": {
      "description": "Other Settings",
      "platform_settings": {
        "ignore_bot_self_message": {
          "description": "Ignore Bot's Own Messages"
        },
        "ignore_at_all": {
          "description": "Ignore @All Events"
        },
        "no_permission_reply": {
          "description": "Reply When User Has Insufficient Permissions"
        }
      },
      "platform_specific": {
        "lark": {
          "pre_ack_emoji": {
            "enable": {
              "description": "[Lark] Enable Pre-acknowledgment Emoji"
            },
            "emojis": {
              "description": "Emoji List (Lark Emoji Enum Names)",
              "hint": "Emoji enum names reference: [https://open.feishu.cn/document/server-docs/im-v1/message-reaction/emojis-introduce](https://open.feishu.cn/document/server-docs/im-v1/message-reaction/emojis-introduce)"
            }
          }
        },
        "telegram": {
          "pre_ack_emoji": {
            "enable": {
              "description": "[Telegram] Enable Pre-acknowledgment Emoji"
            },
            "emojis": {
              "description": "Emoji List (Unicode)",
              "hint": "Telegram only supports a fixed reaction set, reference: [https://gist.github.com/Soulter/3f22c8e5f9c7e152e967e8bc28c97fc9](https://gist.github.com/Soulter/3f22c8e5f9c7e152e967e8bc28c97fc9)"
            }
          }
        },
        "discord": {
          "pre_ack_emoji": {
            "enable": {
              "description": "[Discord] Enable Pre-acknowledgment Emoji"
            },
            "emojis": {
              "description": "Emoji List (Unicode or Custom Emoji Name)",
              "hint": "Enter Unicode emoji symbols, e.g., 👍, 🤔, ⏳"
            }
          }
        }
      }
    }
  },
  "plugin_group": {
    "name": "Plugin",
    "plugin": {
      "description": "Plugins",
      "plugin_set": {
        "description": "Available Plugins",
        "hint": "All non-disabled plugins are enabled by default. If a plugin is disabled on the plugins page, selections here will not take effect."
      }
    }
  },
  "ext_group": {
    "name": "Ext.",
    "segmented_reply": {
      "description": "Segmented Reply",
      "platform_settings": {
        "segmented_reply": {
          "enable": {
            "description": "Enable Segmented Reply"
          },
          "only_llm_result": {
            "description": "Segment Only LLM Results"
          },
          "interval_method": {
            "description": "Interval Method",
            "hint": "random uses a random delay. log calculates delay by message length: $y=log_{log\\_base}(x)$, where x is word count and y is in seconds."
          },
          "interval": {
            "description": "Random Interval Time",
            "hint": "Format: minimum,maximum (e.g., 1.5,3.5)"
          },
          "log_base": {
            "description": "Logarithm Base",
            "hint": "Base for logarithmic intervals, defaults to 2.6. Value range: 1.0-10.0."
          },
          "words_count_threshold": {
            "description": "Segmented Reply Word Count Threshold",
            "hint": "Segmented reply word count threshold. Only messages with less than this number of words will be segmented, and messages with more than this number of words will be sent directly (not segmented)."
          },
          "split_mode": {
            "description": "Split Mode",
            "hint": "Used to segment a message. By default, it will be separated by punctuation marks like period, question mark, etc. For example, filling `[。？！]` will remove all periods, question marks, and exclamation marks. re.findall(r'<regex>', text)",
            "labels": [
              "Regex",
              "Words List"
            ]
          },
          "regex": {
            "description": "Segmentation Regular Expression",
            "hint": "Used to identify split points with a regular expression. Prefer patterns that match separators."
          },
          "split_words": {
            "description": "Split Word List",
            "hint": "Split when any word in the list is detected"
          },
          "content_cleanup_rule": {
            "description": "Content Filtering Regular Expression",
            "hint": "Remove specified content from segmented content. For example, `[。?!]` will remove all periods, question marks, and exclamation marks."
          }
        }
      }
    },
    "ltm": {
      "description": "Group Chat Context Awareness (formerly Chat Memory Enhancement)",
      "provider_ltm_settings": {
        "group_icl_enable": {
          "description": "Enable Group Chat Context Awareness"
        },
        "group_message_max_cnt": {
          "description": "Maximum Message Count"
        },
        "image_caption": {
          "description": "Auto-understand Images",
          "hint": "Requires setting a group chat image caption model."
        },
        "image_caption_provider_id": {
          "description": "Group Chat Image Caption Model",
          "hint": "Used for image understanding in group chat context awareness, configured separately from the default image caption model."
        },
        "active_reply": {
          "enable": {
            "description": "Active Reply"
          },
          "method": {
            "description": "Active Reply Method"
          },
          "possibility_reply": {
            "description": "Reply Probability",
            "hint": "Value between 0.0-1.0"
          },
          "whitelist": {
            "description": "Active Reply Whitelist",
            "hint": "Whitelist filtering is disabled when empty. Use /sid to get IDs."
          }
        }
      }
    }
  },
  "system_group": {
    "name": "System",
    "system": {
      "description": "System Settings",
      "t2i_strategy": {
        "description": "Text-to-Image Strategy",
        "hint": "Text-to-image strategy. `remote` uses a remote HTML-based rendering service, `local` uses PIL for local rendering. When using local, place a TTF font named 'font.ttf' in the data/ directory to customize the font."
      },
      "t2i_endpoint": {
        "description": "Text-to-Image Service API Endpoint",
        "hint": "Uses AstrBot API service when empty"
      },
      "t2i_template": {
        "description": "Text-to-Image Custom Template",
        "hint": "When enabled, you can customize HTML templates for text-to-image rendering."
      },
      "t2i_active_template": {
        "description": "Currently Active Text-to-Image Rendering Template",
        "hint": "This value is maintained by the text-to-image template management page."
      },
      "log_level": {
        "description": "Console Log Level",
        "hint": "Log level for console output."
      },
      "log_file_enable": {
        "description": "Enable File Logging",
        "hint": "Write logs to a file in addition to the console."
      },
      "log_file_path": {
        "description": "Log File Path",
        "hint": "Relative paths are resolved under the data directory, e.g. logs/astrbot.log; absolute paths are supported."
      },
      "log_file_max_mb": {
        "description": "Log File Max Size (MB)",
        "hint": "Rotate when exceeding this size; default 20MB."
      },
      "temp_dir_max_size": {
        "description": "Temp Directory Size Limit (MB)",
        "hint": "Limits total size of data/temp in MB. The system checks every 10 minutes, and when exceeded, deletes oldest files first to release about 30% of current size."
      },
      "trace_log_enable": {
        "description": "Enable Trace File Logging",
        "hint": "Write trace events to a separate file (does not change console output)."
      },
      "trace_log_path": {
        "description": "Trace Log File Path",
        "hint": "Relative paths are resolved under the data directory, e.g. logs/astrbot.trace.log; absolute paths are supported."
      },
      "trace_log_max_mb": {
        "description": "Trace Log Max Size (MB)",
        "hint": "Rotate when exceeding this size; default 20MB."
      },
      "pip_install_arg": {
        "description": "Additional pip Installation Arguments",
        "hint": "When installing plugin dependencies, Python's pip tool will be used. Additional arguments can be provided here, such as `--break-system-package`."
      },
      "pypi_index_url": {
        "description": "PyPI Repository URL",
        "hint": "PyPI repository URL for installing Python dependencies. Defaults to [https://mirrors.aliyun.com/pypi/simple/](https://mirrors.aliyun.com/pypi/simple/)"
      },
      "callback_api_base": {
        "description": "Externally Accessible Callback API Address",
        "hint": "External services may access AstrBot's backend through callback links generated by AstrBot (such as file download links). Since AstrBot cannot automatically determine the externally accessible host address in the deployment environment, this configuration item is needed to explicitly specify how external services should access AstrBot's address. Examples: [http://localhost:6185](http://localhost:6185), [https://example.com](https://example.com), etc."
      },
      "disable_metrics": {
        "description": "Disable Anonymous Usage Statistics",
        "hint": "When disabled, AstrBot will not upload anonymous usage statistics."
      },
      "dashboard": {
        "trust_proxy_headers": {
          "description": "Trust Proxy Headers for Client IP",
          "hint": "When disabled, ignore X-Forwarded-For/X-Real-IP and use the connection address only."
        },
        "auth_rate_limit": {
          "enable": {
            "description": "Enable Login Rate Limiting",
            "hint": "When disabled, authentication endpoints (login, TOTP, etc.) will not be rate-limited."
          },
          "average_interval": {
            "description": "Endpoint Rate Limit Average Interval (seconds)",
            "hint": "Minimum average interval between authentication requests. For example, 1.0 means at most 1 request per second."
          },
          "max_burst": {
            "description": "Endpoint Rate Limit Max Burst",
            "hint": "Maximum number of consecutive burst requests allowed. For example, 3 allows up to 3 requests in a short burst."
          }
        },
        "ssl": {
          "enable": {
            "description": "Enable WebUI HTTPS",
            "hint": "When enabled, WebUI serves directly over HTTPS."
          },
          "cert_file": {
            "description": "SSL Certificate File Path",
            "hint": "Certificate file path (PEM). Supports absolute and relative paths (relative to current working directory)."
          },
          "key_file": {
            "description": "SSL Private Key File Path",
            "hint": "Private key file path (PEM). Supports absolute and relative paths (relative to current working directory)."
          },
          "ca_certs": {
            "description": "SSL CA Certificate File Path",
            "hint": "Optional. Path to CA certificate file."
          }
        },
        "totp": {
          "enable": {
            "description": "Enable WebUI TOTP",
            "hint": "When enabled, a TOTP code is required during dashboard login."
          },
          "manage": "Manage",
          "configuration": "TOTP",
          "statusPending": "Setup required",
          "statusEnabled": "Enabled",
          "setupRequiredHint": "TOTP is enabled but not yet configured. Click Manage to complete setup.",
          "setupTitle": "Set up TOTP",
          "setupSubtitle": "Scan this QR code in your authenticator app, then enter a verification code.",
          "setupConfirm": "Verify and continue",
          "activeSubtitle": "Use this QR code or secret to add another authenticator device.",
          "rotateTitle": "Rotate TOTP Secret",
          "rotateSubtitle": "Generate a new secret, then enter a code from your authenticator to confirm the replacement.",
          "rotate": "Rotate",
          "rotateRecovery": "Rotate Recovery Code",
          "rotateConfirm": "Confirm Rotation",
          "rotateCancel": "Cancel",
          "rotateCode": "Verification Code",
          "rotateCodeHint": "Enter the code from your authenticator app to confirm the new key.",
          "rotateError": "Invalid code, please try again.",
          "recoveryTitle": "Recovery Codes",
          "recoverySubtitle": "This recovery code is shown once. Save it before continuing.",
          "recoveryWarning": "If lost, account access cannot be restored through normal means.",
          "recoveryAcknowledge": "I have saved my recovery codes",
          "recoveryClose": "Done",
          "disableTitle": "Disable TOTP",
          "disableSubtitle": "Enter a verification code to disable two-factor authentication.",
          "disableRecoverySubtitle": "Enter a recovery code to disable two-factor authentication.",
          "disableCode": "Verification Code",
          "disableRecoveryCode": "Recovery Code",
          "disableConfirm": "Disable",
          "disableCancel": "Cancel",
          "disableError": "Verification failed. Please try again.",
          "disableUseRecovery": "Can't use TOTP?",
          "disableUseCode": "Use verification code",
          "configSaveTitle": "Two-Factor Verification",
          "configSaveSubtitle": "Enter a verification code to change protected configuration.",
          "configSaveRotationHint": "When rotating TOTP keys, both the old and new verification codes are accepted (allowed once per rotation operation).",
          "configSaveCode": "Verification Code",
          "configSaveConfirm": "Continue",
          "configSaveCancel": "Cancel",
          "configSaveError": "Verification failed. Please try again."
        }
      },
      "timezone": {
        "description": "Timezone",
        "hint": "Timezone setting. Please enter an IANA timezone name, such as Asia/Shanghai. Uses system default timezone when empty. For all timezones, see: [https://data.iana.org/time-zones/tzdb-2021a/zone1970.tab](https://data.iana.org/time-zones/tzdb-2021a/zone1970.tab)"
      },
      "http_proxy": {
        "description": "HTTP Proxy",
        "hint": "When enabled, proxy will be set by adding environment variables. Format: `http://ip:port`"
      },
      "no_proxy": {
        "description": "Direct Connection Address List"
      }
    }
  },
  "provider_group": {
    "provider": {
      "genie_onnx_model_dir": {
        "description": "ONNX Model Directory",
        "hint": "The directory path containing the ONNX model files"
      },
      "genie_language": {
        "description": "Language"
      },
      "xai_native_search": {
        "description": "Enable native search",
        "hint": "When enabled, uses xAI Chat Completions native Live Search for web queries (billed on demand). Only applies to xAI providers."
      },
      "rerank_api_base": {
        "description": "Rerank Model API Base URL",
        "hint": "The full request URL is formed by combining the Base URL and a path suffix (defaults to /v1/rerank)."
      },
      "rerank_api_suffix": {
        "description": "API URL path suffix",
        "hint": "Path appended to base_url, e.g. /v1/rerank. Leave empty to disable auto-append."
      },
      "rerank_api_key": {
        "description": "API Key",
        "hint": "Leave empty if no API key is required."
      },
      "rerank_model": {
        "description": "Rerank model name"
      },
      "return_documents": {
        "description": "Return source documents in rerank results",
        "hint": "Default is false to reduce network overhead."
      },
      "instruct": {
        "description": "Custom rerank task description",
        "hint": "Only effective for qwen3-rerank models. Recommended to write in English."
      },
      "nvidia_rerank_api_base": {
        "description": "API Base URL"
      },
      "nvidia_rerank_api_key": {
        "description": "API Key"
      },
      "nvidia_rerank_model": {
        "description": "Rerank Model Name",
        "hint": "Please refer to the NVIDIA Docs for the model name."
      },
      "nvidia_rerank_model_endpoint": {
        "description": "Custom Model Endpoint",
        "hint": "Custom URL suffix endpoint, defaults to /reranking."
      },
      "nvidia_rerank_truncate": {
        "description": "Text Truncation Strategy",
        "hint": "Whether to truncate the input to fit the model's maximum context length when the input text is too long."
      },
      "launch_model_if_not_running": {
        "description": "Auto-start model if not running",
        "hint": "If the model is not running in Xinference, attempt to start it automatically. Recommended to disable in production."
      },
      "modalities": {
        "description": "Model capabilities",
        "hint": "Modalities supported by the model. If the model does not support images, uncheck image.",
        "labels": [
          "Text",
          "Image",
          "Audio",
          "Tool use"
        ]
      },
      "custom_headers": {
        "description": "Custom request headers",
        "hint": "Key/value pairs added here are merged into the OpenAI SDK default_headers for custom HTTP headers. Values must be strings."
      },
      "ollama_disable_thinking": {
        "description": "Disable thinking mode",
        "hint": "Close Ollama thinking mode."
      },
      "custom_extra_body": {
        "description": "Custom request body parameters",
        "hint": "Add extra parameters to requests, such as temperature, top_p, max_tokens, etc.",
        "template_schema": {
          "temperature": {
            "description": "Temperature",
            "hint": "Controls randomness, typically 0-2. Higher is more random.",
            "name": "Temperature"
          },
          "top_p": {
            "description": "Top-p sampling",
            "hint": "Nucleus sampling parameter, usually 0-1. Controls probability mass considered.",
            "name": "Top-p"
          },
          "max_tokens": {
            "description": "Max tokens",
            "hint": "Maximum number of generated tokens.",
            "name": "Max Tokens"
          }
        }
      },
      "gpt_weights_path": {
        "description": "GPT model file path",
        "hint": "The .ckpt file. Use an absolute path without quotes. Leave empty to use the GPT_SoVITS built-in SoVITS model (recommended to change defaults in GPT_SoVITS)."
      },
      "sovits_weights_path": {
        "description": "SoVITS model file path",
        "hint": "The .pth file. Use an absolute path without quotes. Leave empty to use the GPT_SoVITS built-in SoVITS model (recommended to change defaults in GPT_SoVITS)."
      },
      "gsv_default_parms": {
        "description": "GPT_SoVITS default parameters",
        "hint": "Reference audio file path and text are required; other parameters are optional.",
        "gsv_ref_audio_path": {
          "description": "Reference audio file path",
          "hint": "Required! Use an absolute path without quotes."
        },
        "gsv_prompt_text": {
          "description": "Reference audio text",
          "hint": "Required! Provide the transcript of the reference audio."
        },
        "gsv_prompt_lang": {
          "description": "Reference audio text language",
          "hint": "Language of the reference audio text; default is Chinese."
        },
        "gsv_aux_ref_audio_paths": {
          "description": "Auxiliary reference audio file paths",
          "hint": "Auxiliary reference audio files; optional."
        },
        "gsv_text_lang": {
          "description": "Text language",
          "hint": "Default is Chinese."
        },
        "gsv_top_k": {
          "description": "Speech diversity",
          "hint": ""
        },
        "gsv_top_p": {
          "description": "Nucleus sampling threshold",
          "hint": ""
        },
        "gsv_temperature": {
          "description": "Speech randomness",
          "hint": ""
        },
        "gsv_text_split_method": {
          "description": "Text splitting method",
          "hint": "Options: `cut0` no split, `cut1` split every 4 sentences, `cut2` split every 50 chars, `cut3` split by Chinese period, `cut4` split by English period, `cut5` split by punctuation."
        },
        "gsv_batch_size": {
          "description": "Batch size",
          "hint": ""
        },
        "gsv_batch_threshold": {
          "description": "Batch threshold",
          "hint": ""
        },
        "gsv_split_bucket": {
          "description": "Split text into buckets for parallel processing",
          "hint": ""
        },
        "gsv_speed_factor": {
          "description": "Speech playback speed",
          "hint": "1 is the original speed."
        },
        "gsv_fragment_interval": {
          "description": "Interval between speech segments",
          "hint": ""
        },
        "gsv_streaming_mode": {
          "description": "Enable streaming mode",
          "hint": ""
        },
        "gsv_seed": {
          "description": "Random seed",
          "hint": "For reproducible results."
        },
        "gsv_parallel_infer": {
          "description": "Run inference in parallel",
          "hint": ""
        },
        "gsv_repetition_penalty": {
          "description": "Repetition penalty",
          "hint": ""
        },
        "gsv_media_type": {
          "description": "Output media type",
          "hint": "Recommended: wav"
        }
      },
      "embedding_dimensions": {
        "description": "Embedding dimensions",
        "hint": "Embedding vector dimensions. May need adjustment per model; see model documentation. This must be correct or the vector database will not work."
      },
      "embedding_model": {
        "description": "Embedding model",
        "hint": "Embedding model name."
      },
      "embedding_api_key": {
        "description": "API Key"
      },
      "embedding_api_base": {
        "description": "API Base URL"
      },
      "openai_embedding": {
        "hint": "If testing fails, try adding /v1 at the end for some OpenAI API versions."
      },
      "gemini_embedding": {
        "hint": "Gemini Embedding does not require manually adding /v1beta."
      },
      "volcengine_cluster": {
        "description": "Volcengine cluster",
        "hint": "For voice cloning models, choose volcano_icl or volcano_icl_concurr; default is volcano_tts."
      },
      "volcengine_voice_type": {
        "description": "Volcengine voice",
        "hint": "Enter voice id (Voice_type)."
      },
      "volcengine_speed_ratio": {
        "description": "Speech rate",
        "hint": "Speech rate, range 0.2 to 3.0, default 1.0."
      },
      "volcengine_volume_ratio": {
        "description": "Volume",
        "hint": "Volume, range 0.0 to 2.0, default 1.0."
      },
      "azure_tts_voice": {
        "description": "Voice style",
        "hint": "API voice name"
      },
      "azure_tts_style": {
        "description": "Style",
        "hint": "A voice-specific speaking style. Can express emotions like happy, sympathetic, and calm."
      },
      "azure_tts_role": {
        "description": "Role (optional)",
        "hint": "Speaking role-play. The voice can emulate different ages and genders without changing the voice name. For example, a male voice can raise pitch to simulate a female voice, but the voice name does not change. If the role is missing or unsupported, this attribute is ignored."
      },
      "azure_tts_rate": {
        "description": "Speech rate",
        "hint": "Controls speaking rate. You can apply the rate at word or sentence level. Rate should be 0.5x to 2x of original audio."
      },
      "azure_tts_volume": {
        "description": "Speech volume",
        "hint": "Controls volume level. You can apply changes at sentence level. Use 0.0 to 100.0 (quiet to loud, e.g., 75). Default is 100.0."
      },
      "azure_tts_region": {
        "description": "API region",
        "hint": "Region where Azure TTS processes data. See https://learn.microsoft.com/zh-cn/azure/ai-services/speech-service/regions"
      },
      "azure_tts_subscription_key": {
        "description": "Service subscription key",
        "hint": "Azure TTS subscription key (not a token)."
      },
      "dashscope_tts_voice": {
        "description": "Voice"
      },
      "gm_resp_image_modal": {
        "description": "Enable image modality",
        "hint": "When enabled, responses can include images. Requires model support or it will error. See the Google Gemini website for supported models. Tip: if you need image generation, disable the `Enable member recognition` setting for better results."
      },
      "gm_native_search": {
        "description": "Enable native search",
        "hint": "When enabled, all function tools are disabled. Check official docs for free quota limits."
      },
      "gm_native_coderunner": {
        "description": "Enable native code runner",
        "hint": "When enabled, all function tools are disabled."
      },
      "gm_url_context": {
        "description": "Enable URL context",
        "hint": "When enabled, all function tools are disabled."
      },
      "gm_safety_settings": {
        "description": "Safety filters",
        "hint": "Set the safety filtering level for model input. Levels: NONE (no blocking), HIGH (block high risk), MEDIUM_AND_ABOVE (block medium risk and above), LOW_AND_ABOVE (block low risk and above). See Gemini API docs.",
        "harassment": {
          "description": "Harassment",
          "hint": "Negative or harmful comments"
        },
        "hate_speech": {
          "description": "Hate speech",
          "hint": "Rude, disrespectful, or profane content"
        },
        "sexually_explicit": {
          "description": "Sexually explicit content",
          "hint": "References to sexual acts or other obscene content"
        },
        "dangerous_content": {
          "description": "Dangerous content",
          "hint": "Content that promotes, encourages, or assists harmful behavior"
        }
      },
      "gm_thinking_config": {
        "description": "Thinking Config",
        "budget": {
          "description": "Thinking Budget",
          "hint": "Guides the model on the specific number of thinking tokens to use for reasoning. See: https://ai.google.dev/gemini-api/docs/thinking#set-budget"
        },
        "level": {
          "description": "Thinking Level",
          "hint": "Recommended for Gemini 3 models and onwards, lets you control reasoning behavior.See: https://ai.google.dev/gemini-api/docs/thinking#thinking-levels"
        }
      },
      "anth_thinking_config": {
        "description": "Thinking Config",
        "type": {
          "description": "Thinking Type",
          "hint": "Set 'adaptive' for Opus 4.6+ / Sonnet 4.6+ (recommended). Leave empty to use manual budget mode. See: https://platform.claude.com/docs/en/build-with-claude/adaptive-thinking"
        },
        "budget": {
          "description": "Thinking Budget",
          "hint": "Anthropic thinking.budget_tokens param. Must >= 1024. Only used when type is empty. Deprecated on Opus 4.6 / Sonnet 4.6. See: https://platform.claude.com/docs/en/build-with-claude/extended-thinking"
        },
        "effort": {
          "description": "Effort Level",
          "hint": "Controls thinking depth when type is 'adaptive'. 'high' is the default. 'max' is Opus 4.6 only. See: https://platform.claude.com/docs/en/build-with-claude/effort"
        }
      },
      "minimax-group-id": {
        "description": "User group",
        "hint": "Visible in Account Management -> Basic Info."
      },
      "minimax-langboost": {
        "description": "Target language/dialect",
        "hint": "Enhances recognition for specified languages/dialects and improves speech performance in those scenarios."
      },
      "minimax-voice-speed": {
        "description": "Speech rate",
        "hint": "Speech speed for synthesis, range [0.5, 2], default 1.0. Higher is faster."
      },
      "minimax-voice-vol": {
        "description": "Volume",
        "hint": "Volume for synthesis, range (0, 10], default 1.0. Higher is louder."
      },
      "minimax-voice-pitch": {
        "description": "Pitch",
        "hint": "Pitch for synthesis, range [-12, 12], default 0."
      },
      "minimax-is-timber-weight": {
        "description": "Enable mixed voices",
        "hint": "Enable mixing up to four voices with custom weights. When enabled, single voice settings are ignored."
      },
      "minimax-timber-weight": {
        "description": "Mixed voices",
        "hint": "Mixed voices and their weights. Up to four voices, integer weights in [1, 100]. Get presets and templates from the official API TTS debug console. Must be a JSON string; check the console to confirm parsing. See defaults and the official code preview for structure."
      },
      "minimax-voice-id": {
        "description": "Single voice",
        "hint": "Single voice ID; see the official documentation."
      },
      "minimax-voice-emotion": {
        "description": "Emotion",
        "hint": "Controls emotion of synthesized speech. When set to auto, it selects emotion based on text."
      },
      "minimax-voice-latex": {
        "description": "Read LaTeX formulas",
        "hint": "Read LaTeX formulas, but ensure input text is formatted per the official requirements."
      },
      "minimax-voice-english-normalization": {
        "description": "English text normalization",
        "hint": "Improves number-reading performance but slightly increases latency."
      },
      "rag_options": {
        "description": "RAG options",
        "hint": "Knowledge base retrieval settings, optional. Only supported for Agent app types (agent apps, including RAG apps). For Bailian apps, enabling this disables multi-turn conversations.",
        "pipeline_ids": {
          "description": "Knowledge base ID list",
          "hint": "Retrieve all documents in the specified knowledge bases. Go to https://bailian.console.aliyun.com/ Data Apps -> Knowledge Index to create and get IDs."
        },
        "file_ids": {
          "description": "Unstructured document IDs",
          "hint": "Retrieve specified unstructured documents. Go to https://bailian.console.aliyun.com/ Data Management to create and get IDs."
        },
        "output_reference": {
          "description": "Output knowledge base/document references",
          "hint": "Append reference sources to the end of each answer. Default is False."
        }
      },
      "sensevoice_hint": {
        "description": "Deploy SenseVoice",
        "hint": "Before enabling, install funasr, funasr_onnx, torchaudio, torch, modelscope, and jieba (CPU by default, about 1 GB download), and install ffmpeg. Otherwise STT will not work."
      },
      "is_emotion": {
        "description": "Emotion recognition",
        "hint": "Enable emotion recognition. happy?sad?angry?neutral?fearful?disgusted?surprised?unknown"
      },
      "stt_model": {
        "description": "Model name",
        "hint": "Model name on modelscope. Default: iic/SenseVoiceSmall."
      },
      "variables": {
        "description": "Workflow fixed input variables",
        "hint": "Optional. Fixed workflow input variables are used as workflow inputs. You can also set variables dynamically with /set during a chat. If names conflict, dynamic settings take precedence."
      },
      "dashscope_app_type": {
        "description": "App type",
        "hint": "Bailian app type."
      },
      "timeout": {
        "description": "Timeout",
        "hint": "Timeout in seconds."
      },
      "openai-tts-voice": {
        "description": "voice",
        "hint": "OpenAI TTS voice. OpenAI defaults: 'alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'."
      },
      "elevenlabs-tts-voice-id": {
        "description": "Voice ID",
        "hint": "ElevenLabs voice ID. Browse and copy voice IDs at https://elevenlabs.io/app/voice-library. Default 'JBFqnCBsd6RMkjVDRZzb' (George)."
      },
      "elevenlabs-tts-output-format": {
        "description": "Output format",
        "hint": "Audio output format, e.g. 'mp3_44100_128', 'mp3_22050_32', 'wav_44100', or 'opus_48000_128'. Raw PCM/u-law/a-law formats are not supported. Default 'mp3_44100_128'."
      },
      "elevenlabs-tts-stability": {
        "description": "Stability",
        "hint": "Voice stability, range [0, 1]. Higher is more consistent, lower is more expressive. Leave empty to use the server default."
      },
      "elevenlabs-tts-similarity-boost": {
        "description": "Similarity boost",
        "hint": "How closely the output matches the original voice, range [0, 1]. Leave empty to use the server default."
      },
      "elevenlabs-tts-style": {
        "description": "Style exaggeration",
        "hint": "Style exaggeration of the voice, range [0, 1]. Higher values increase latency. Leave empty to use the server default."
      },
      "elevenlabs-tts-use-speaker-boost": {
        "description": "Speaker boost",
        "hint": "Boost similarity to the original speaker. May slightly increase latency."
      },
      "mimo-tts-voice": {
        "description": "Voice",
        "hint": "MiMo TTS voice name. Supported values include 'mimo_default', 'default_en', and 'default_zh'."
      },
      "mimo-tts-format": {
        "description": "Output format",
        "hint": "Audio format generated by MiMo TTS. Supported values: 'wav', 'mp3', and 'pcm'."
      },
      "mimo-tts-style-prompt": {
        "description": "Style prompt",
        "hint": "Prepended to the synthesis target text as a <style>...</style> tag to control speed, emotion, character, or style, such as happy, faster, Sun Wukong, or whispering. Optional."
      },
      "mimo-tts-dialect": {
        "description": "Dialect",
        "hint": "Combined with the style prompt inside the leading <style>...</style> tag, for example Northeastern Mandarin, Sichuan dialect, Henan dialect, or Cantonese. Optional."
      },
      "mimo-tts-seed-text": {
        "description": "Seed text",
        "hint": "Sent as an optional user message to help guide tone and speaking style. It is not appended to the synthesis target text."
      },
      "fishaudio-tts-character": {
        "description": "character",
        "hint": "Fishaudio TTS character. Default is Klee. More roles: https://fish.audio/zh-CN/discovery"
      },
      "fishaudio-tts-reference-id": {
        "description": "reference_id",
        "hint": "Fishaudio TTS reference model ID (optional). If set, the model ID is used directly instead of looking up by role name. Example: 626bb6d3f3364c9cbc3aa6a67300a664. More models: https://fish.audio/zh-CN/discovery; open a model detail page to copy the model ID."
      },
      "whisper_hint": {
        "description": "Notes for local Whisper deployment",
        "hint": "Before enabling, install the openai-whisper library (NVIDIA users download ~2GB mainly for torch and cuda; CPU users download ~1GB), and install ffmpeg. Otherwise STT will not work."
      },
      "whisper_device": {
        "description": "Inference device",
        "hint": "Whisper inference device. Apple Silicon can use mps; other environments should use cpu. If mps is selected but unavailable, AstrBot will fall back to cpu."
      },
      "id": {
        "description": "ID"
      },
      "type": {
        "description": "Provider category"
      },
      "provider_type": {
        "description": "Provider capability type"
      },
      "enable": {
        "description": "Enable"
      },
      "key": {
        "description": "API Key"
      },
      "api_base": {
        "description": "API Base URL"
      },
      "proxy": {
        "description": "Proxy address",
        "hint": "HTTP/HTTPS proxy URL, e.g. http://127.0.0.1:7890. Applies only to this provider's API requests and does not affect Docker internal networking."
      },
      "model": {
        "description": "Model ID",
        "hint": "Model name, e.g., gpt-4o-mini, deepseek-chat."
      },
      "max_context_tokens": {
        "description": "Model context window size",
        "hint": "Maximum context tokens. If 0, it auto-fills from model metadata (if available); you can also edit manually."
      },
      "dify_api_key": {
        "description": "API Key",
        "hint": "Dify API Key. This field is required."
      },
      "dify_api_base": {
        "description": "API Base URL",
        "hint": "Dify API Base URL. Default: https://api.dify.ai/v1"
      },
      "dify_api_type": {
        "description": "Dify app type",
        "hint": "Dify API type. According to Dify docs, supported types are chat, chatflow, agent, workflow."
      },
      "dify_workflow_output_key": {
        "description": "Dify workflow output variable name",
        "hint": "Dify workflow output variable name. Only used when app type is workflow. Default: astrbot_wf_output."
      },
      "dify_query_input_key": {
        "description": "Prompt input variable name",
        "hint": "Input variable name for the message text. Default: astrbot_text_query."
      },
      "coze_api_key": {
        "description": "Coze API Key",
        "hint": "Coze API key for accessing Coze services."
      },
      "bot_id": {
        "description": "Bot ID",
        "hint": "Coze bot ID, obtained after creating a bot on the Coze platform."
      },
      "coze_api_base": {
        "description": "API Base URL",
        "hint": "Base URL for the Coze API. Default: https://api.coze.cn"
      },
      "deerflow_api_base": {
        "description": "API Base URL",
        "hint": "DeerFlow API gateway URL. Default: http://127.0.0.1:2026"
      },
      "deerflow_api_key": {
        "description": "DeerFlow API Key",
        "hint": "Optional. Fill this if your DeerFlow gateway is protected by Bearer auth."
      },
      "deerflow_auth_header": {
        "description": "Authorization Header",
        "hint": "Optional. Custom Authorization header value; takes precedence over DeerFlow API Key."
      },
      "deerflow_assistant_id": {
        "description": "Assistant ID",
        "hint": "LangGraph assistant_id, default is lead_agent."
      },
      "deerflow_model_name": {
        "description": "Model name override",
        "hint": "Optional. Overrides DeerFlow default model (maps to runtime context model_name)."
      },
      "deerflow_thinking_enabled": {
        "description": "Enable thinking mode"
      },
      "deerflow_plan_mode": {
        "description": "Enable plan mode",
        "hint": "Maps to DeerFlow is_plan_mode."
      },
      "deerflow_subagent_enabled": {
        "description": "Enable subagent",
        "hint": "Maps to DeerFlow subagent_enabled."
      },
      "deerflow_max_concurrent_subagents": {
        "description": "Max concurrent subagents",
        "hint": "Maps to DeerFlow max_concurrent_subagents. Effective only when subagent is enabled. Default: 3."
      },
      "deerflow_recursion_limit": {
        "description": "Recursion limit",
        "hint": "Maps to LangGraph recursion_limit."
      },
      "auto_save_history": {
        "description": "Conversation history managed by Coze",
        "hint": "When enabled, Coze manages conversation history. AstrBot's locally saved context will not take effect (read-only), and operations on AstrBot context will not apply. If disabled, AstrBot manages the context."
      }
    }
  },
  "help": {
    "documentation": "Official Documentation",
    "support": "Join Support Group",
    "helpText": "Don't understand the configuration? See {documentation} or {support}.",
    "helpPrefix": "Don't understand the configuration? See",
    "helpMiddle": "or",
    "helpSuffix": "."
  }
}
