diff --git a/config/config.example.json b/config/config.example.json index 910c4fbd38..5bfd5ef65a 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -1,4 +1,5 @@ { + "version": 3, "agents": { "defaults": { "workspace": "~/.picoclaw/workspace", @@ -24,13 +25,13 @@ { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-your-openai-key", + "api_keys": ["sk-your-openai-key"], "api_base": "https://api.openai.com/v1" }, { "model_name": "claude-sonnet-4.6", "model": "anthropic/claude-sonnet-4.6", - "api_key": "sk-ant-your-key", + "api_keys": ["sk-ant-your-key"], "api_base": "https://api.anthropic.com/v1", "thinking_level": "high" }, @@ -38,7 +39,7 @@ "_comment": "Anthropic Messages API - use native format for direct Anthropic API access", "model_name": "claude-opus-4-6", "model": "anthropic-messages/claude-opus-4-6", - "api_key": "sk-ant-your-key", + "api_keys": ["sk-ant-your-key"], "api_base": "https://api.anthropic.com" }, { @@ -50,12 +51,12 @@ { "model_name": "deepseek", "model": "deepseek/deepseek-chat", - "api_key": "sk-your-deepseek-key" + "api_keys": ["sk-your-deepseek-key"] }, { "model_name": "venice-uncensored", "model": "venice/venice-uncensored", - "api_key": "your-venice-api-key" + "api_keys": ["your-venice-api-key"] }, { "model_name": "lmstudio-local", @@ -64,114 +65,134 @@ { "model_name": "longcat", "model": "longcat/LongCat-Flash-Thinking", - "api_key": "your-longcat-api-key" + "api_keys": ["your-longcat-api-key"] }, { "model_name": "modelscope-qwen", "model": "modelscope/Qwen/Qwen3-235B-A22B-Instruct-2507", - "api_key": "your-modelscope-access-token", + "api_keys": ["your-modelscope-access-token"], "api_base": "https://api-inference.modelscope.cn/v1" }, { "model_name": "azure-gpt5", "model": "azure/my-gpt5-deployment", - "api_key": "your-azure-api-key", + "api_keys": ["your-azure-api-key"], "api_base": "https://your-resource.openai.azure.com" }, { "model_name": "loadbalanced-gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-key1", + "api_keys": ["sk-key1"], "api_base": "https://api1.example.com/v1" }, { "model_name": "loadbalanced-gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-key2", + "api_keys": ["sk-key2"], "api_base": "https://api2.example.com/v1" } ], - "channels": { + "channel_list": { "telegram": { "enabled": false, - "token": "YOUR_TELEGRAM_BOT_TOKEN", - "base_url": "", - "proxy": "", + "type": "telegram", "allow_from": ["YOUR_USER_ID"], - "use_markdown_v2": false, "reasoning_channel_id": "", - "streaming": { - "enabled": true + "settings": { + "token": "YOUR_TELEGRAM_BOT_TOKEN", + "base_url": "", + "proxy": "", + "use_markdown_v2": false, + "streaming": { + "enabled": true + } } }, "discord": { "enabled": false, - "token": "YOUR_DISCORD_BOT_TOKEN", - "proxy": "", + "type": "discord", "allow_from": [], "group_trigger": { "mention_only": false }, - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "token": "YOUR_DISCORD_BOT_TOKEN", + "proxy": "" + } }, "qq": { "enabled": false, - "app_id": "YOUR_QQ_APP_ID", - "app_secret": "YOUR_QQ_APP_SECRET", + "type": "qq", "allow_from": [], - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "app_id": "YOUR_QQ_APP_ID", + "app_secret": "YOUR_QQ_APP_SECRET" + } }, "maixcam": { "enabled": false, - "host": "0.0.0.0", - "port": 18790, + "type": "maixcam", "allow_from": [], - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "host": "0.0.0.0", + "port": 18790 + } }, "whatsapp": { "enabled": false, - "bridge_url": "ws://localhost:3001", - "use_native": false, - "session_store_path": "", + "type": "whatsapp", "allow_from": [], - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "bridge_url": "ws://localhost:3001", + "use_native": false, + "session_store_path": "" + } }, "feishu": { "enabled": false, - "app_id": "", - "app_secret": "", - "encrypt_key": "", - "verification_token": "", + "type": "feishu", "allow_from": [], + "reasoning_channel_id": "", "placeholder": { "enabled": true, "text": ["Thinking...", "Processing...", "Typing..."] }, - "reasoning_channel_id": "", - "random_reaction_emoji": [], - "is_lark": false + "settings": { + "app_id": "", + "app_secret": "", + "encrypt_key": "", + "verification_token": "", + "random_reaction_emoji": [], + "is_lark": false + } }, "dingtalk": { "enabled": false, - "client_id": "YOUR_CLIENT_ID", - "client_secret": "YOUR_CLIENT_SECRET", + "type": "dingtalk", "allow_from": [], - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "client_id": "YOUR_CLIENT_ID", + "client_secret": "YOUR_CLIENT_SECRET" + } }, "slack": { "enabled": false, - "bot_token": "xoxb-YOUR-BOT-TOKEN", - "app_token": "xapp-YOUR-APP-TOKEN", + "type": "slack", "allow_from": [], - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "bot_token": "xoxb-YOUR-BOT-TOKEN", + "app_token": "xapp-YOUR-APP-TOKEN" + } }, "matrix": { "enabled": false, - "homeserver": "https://matrix.org", - "user_id": "@your-bot:matrix.org", - "access_token": "YOUR_MATRIX_ACCESS_TOKEN", - "device_id": "", - "join_on_invite": true, + "type": "matrix", "allow_from": [], "group_trigger": { "mention_only": true @@ -181,68 +202,82 @@ "text": ["Thinking...", "Processing...", "Typing..."] }, "reasoning_channel_id": "", - "crypto_database_path": "", - "crypto_passphrase": "YOUR_MATRIX_CRYPTO_PICKLE_KEY" + "settings": { + "homeserver": "https://matrix.org", + "user_id": "@your-bot:matrix.org", + "access_token": "YOUR_MATRIX_ACCESS_TOKEN", + "device_id": "", + "join_on_invite": true, + "crypto_database_path": "", + "crypto_passphrase": "YOUR_MATRIX_CRYPTO_PICKLE_KEY" + } }, "line": { "enabled": false, - "channel_secret": "YOUR_LINE_CHANNEL_SECRET", - "channel_access_token": "YOUR_LINE_CHANNEL_ACCESS_TOKEN", - "webhook_path": "/webhook/line", + "type": "line", "allow_from": [], - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "channel_secret": "YOUR_LINE_CHANNEL_SECRET", + "channel_access_token": "YOUR_LINE_CHANNEL_ACCESS_TOKEN", + "webhook_path": "/webhook/line" + } }, "onebot": { "enabled": false, - "ws_url": "ws://127.0.0.1:3001", - "access_token": "", - "reconnect_interval": 5, - "group_trigger_prefix": [], + "type": "onebot", "allow_from": [], - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "group_trigger": { + "prefixes": [] + }, + "settings": { + "ws_url": "ws://127.0.0.1:3001", + "access_token": "", + "reconnect_interval": 5 + } }, "wecom": { "_comment": "WeCom AI Bot over WebSocket.", "enabled": false, - "bot_id": "YOUR_BOT_ID", - "secret": "YOUR_SECRET", - "websocket_url": "wss://openws.work.weixin.qq.com", - "send_thinking_message": true, + "type": "wecom", "allow_from": [], - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "bot_id": "YOUR_BOT_ID", + "secret": "YOUR_SECRET", + "websocket_url": "wss://openws.work.weixin.qq.com", + "send_thinking_message": true + } }, "pico": { "enabled": false, - "token": "YOUR_PICO_TOKEN", - "allow_token_query": false, - "allow_origins": [], - "ping_interval": 30, - "read_timeout": 60, - "max_connections": 100, - "allow_from": [] + "type": "pico", + "allow_from": [], + "settings": { + "token": "YOUR_PICO_TOKEN", + "allow_token_query": false, + "allow_origins": [], + "ping_interval": 30, + "read_timeout": 60, + "max_connections": 100 + } }, "pico_client": { "enabled": false, - "url": "wss://remote-pico-server/pico/ws", - "token": "YOUR_PICO_TOKEN", - "session_id": "", - "ping_interval": 30, - "read_timeout": 60, - "allow_from": [] + "type": "pico_client", + "allow_from": [], + "settings": { + "url": "wss://remote-pico-server/pico/ws", + "token": "YOUR_PICO_TOKEN", + "session_id": "", + "ping_interval": 30, + "read_timeout": 60 + } }, "irc": { "enabled": false, - "server": "irc.libera.chat:6697", - "tls": true, - "nick": "mybot", - "user": "", - "real_name": "", - "password": "", - "nickserv_password": "", - "sasl_user": "", - "sasl_password": "", - "channels": ["#mychannel"], - "request_caps": ["server-time", "message-tags"], + "type": "irc", "allow_from": [], "group_trigger": { "mention_only": true @@ -250,7 +285,20 @@ "typing": { "enabled": false }, - "reasoning_channel_id": "" + "reasoning_channel_id": "", + "settings": { + "server": "irc.libera.chat:6697", + "tls": true, + "nick": "mybot", + "user": "", + "real_name": "", + "password": "", + "nickserv_password": "", + "sasl_user": "", + "sasl_password": "", + "channels": ["#mychannel"], + "request_caps": ["server-time", "message-tags"] + } } }, "tools": { @@ -259,7 +307,6 @@ "web": { "enabled": true, "prefer_native": true, - "fetch_limit_bytes": 10485760, "format": "plaintext", "brave": { "enabled": false, diff --git a/docs/design/provider-refactoring.md b/docs/design/provider-refactoring.md index 3c31f610f0..e754a63911 100644 --- a/docs/design/provider-refactoring.md +++ b/docs/design/provider-refactoring.md @@ -78,17 +78,17 @@ Inspired by [LiteLLM](https://docs.litellm.ai/docs/proxy/configs) design: "model_name": "deepseek-chat", "model": "openai/deepseek-chat", "api_base": "https://api.deepseek.com/v1", - "api_key": "sk-xxx" + "api_keys": ["sk-xxx"] }, { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-xxx" + "api_keys": ["sk-xxx"] }, { "model_name": "claude-sonnet-4.6", "model": "anthropic/claude-sonnet-4.6", - "api_key": "sk-xxx" + "api_keys": ["sk-xxx"] }, { "model_name": "gemini-3-flash", @@ -99,7 +99,7 @@ Inspired by [LiteLLM](https://docs.litellm.ai/docs/proxy/configs) design: "model_name": "my-company-llm", "model": "openai/company-model-v1", "api_base": "https://llm.company.com/v1", - "api_key": "xxx" + "api_keys": ["xxx"] } ], @@ -252,7 +252,7 @@ func (c *Config) GetModelConfig(modelName string) (*ModelConfig, error) { { "providers": { "deepseek": { - "api_key": "sk-xxx", + "api_keys": ["sk-xxx"], "api_base": "https://api.deepseek.com/v1" } }, diff --git a/docs/project/README.fr.md b/docs/project/README.fr.md index b02067d2a6..f0c9141e93 100644 --- a/docs/project/README.fr.md +++ b/docs/project/README.fr.md @@ -346,6 +346,7 @@ Cela crée `~/.picoclaw/config.json` et le répertoire workspace. ```json { + "version": 3, "agents": { "defaults": { "model_name": "gpt-5.4" @@ -355,7 +356,7 @@ Cela crée `~/.picoclaw/config.json` et le répertoire workspace. { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-your-api-key" + "api_keys": ["sk-your-api-key"] } ] } diff --git a/docs/project/README.id.md b/docs/project/README.id.md index 49c64e74cc..f97da54959 100644 --- a/docs/project/README.id.md +++ b/docs/project/README.id.md @@ -342,6 +342,7 @@ Ini membuat `~/.picoclaw/config.json` dan direktori workspace. ```json { + "version": 3, "agents": { "defaults": { "model_name": "gpt-5.4" @@ -351,7 +352,7 @@ Ini membuat `~/.picoclaw/config.json` dan direktori workspace. { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-your-api-key" + "api_keys": ["sk-your-api-key"] } ] } diff --git a/docs/project/README.it.md b/docs/project/README.it.md index 0cf6cf8db3..710b39cf69 100644 --- a/docs/project/README.it.md +++ b/docs/project/README.it.md @@ -342,6 +342,7 @@ Questo crea `~/.picoclaw/config.json` e la directory workspace. ```json { + "version": 3, "agents": { "defaults": { "model_name": "gpt-5.4" @@ -351,7 +352,7 @@ Questo crea `~/.picoclaw/config.json` e la directory workspace. { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-your-api-key" + "api_keys": ["sk-your-api-key"] } ] } diff --git a/docs/project/README.ja.md b/docs/project/README.ja.md index 6e30606888..d396ba0176 100644 --- a/docs/project/README.ja.md +++ b/docs/project/README.ja.md @@ -343,6 +343,7 @@ picoclaw onboard ```json { + "version": 3, "agents": { "defaults": { "model_name": "gpt-5.4" @@ -352,7 +353,7 @@ picoclaw onboard { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-your-api-key" + "api_keys": ["sk-your-api-key"] } ] } diff --git a/docs/project/README.pt-br.md b/docs/project/README.pt-br.md index 74cb967def..897d3f9a2c 100644 --- a/docs/project/README.pt-br.md +++ b/docs/project/README.pt-br.md @@ -343,6 +343,7 @@ Isso cria `~/.picoclaw/config.json` e o diretório workspace. ```json { + "version": 3, "agents": { "defaults": { "model_name": "gpt-5.4" @@ -352,7 +353,7 @@ Isso cria `~/.picoclaw/config.json` e o diretório workspace. { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-your-api-key" + "api_keys": ["sk-your-api-key"] } ] } diff --git a/docs/project/README.vi.md b/docs/project/README.vi.md index 7430690216..edb6a82f21 100644 --- a/docs/project/README.vi.md +++ b/docs/project/README.vi.md @@ -343,6 +343,7 @@ Lệnh này tạo `~/.picoclaw/config.json` và thư mục workspace. ```json { + "version": 3, "agents": { "defaults": { "model_name": "gpt-5.4" @@ -352,7 +353,7 @@ Lệnh này tạo `~/.picoclaw/config.json` và thư mục workspace. { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-your-api-key" + "api_keys": ["sk-your-api-key"] } ] } diff --git a/docs/project/README.zh.md b/docs/project/README.zh.md index 253bb84ed1..c23177e81b 100644 --- a/docs/project/README.zh.md +++ b/docs/project/README.zh.md @@ -343,6 +343,7 @@ picoclaw onboard ```json { + "version": 3, "agents": { "defaults": { "model_name": "gpt-5.4" @@ -352,7 +353,7 @@ picoclaw onboard { "model_name": "gpt-5.4", "model": "openai/gpt-5.4", - "api_key": "sk-your-api-key" + "api_keys": ["sk-your-api-key"] } ] } diff --git a/docs/reference/config-versioning.md b/docs/reference/config-versioning.md index 36f327e8c9..a350ba108d 100644 --- a/docs/reference/config-versioning.md +++ b/docs/reference/config-versioning.md @@ -45,7 +45,8 @@ When you load a config file: The `version` field in `config.json` indicates the schema version: - `0` or missing: Legacy config (no version field) - `1`: Previous version (will be auto-migrated to V2 on load) -- `2`: Current version +- `2`: Previous version (will be auto-migrated to V3 on load) +- `3`: Current version ```json { @@ -64,8 +65,8 @@ When making breaking changes to the config schema: Create a new struct for the new version if the structure changes significantly: ```go -// ConfigV2 represents version 2 config structure -type ConfigV2 struct { +// ConfigV3 represents version 3 config structure +type ConfigV3 struct { Version int `json:"version"` Agents AgentsConfig `json:"agents"` // ... other fields with new structure @@ -75,7 +76,7 @@ type ConfigV2 struct { ### Step 2: Update Current Config Version ```go -const CurrentVersion = 2 // Increment this +const CurrentVersion = 3 // Increment this ``` ### Step 3: Add a Loader Function @@ -141,9 +142,9 @@ Create a test in `config_migration_test.go`: ```go func TestMigrateV2ToV3(t *testing.T) { - // Create a version 2 config - v2Config := Config{ - Version: 2, + // Create a version 3 config + v3Config := Config{ + Version: 3, // ... set up test data } @@ -224,7 +225,7 @@ Backups are created in the same directory as your config file: ### Scenario: Adding a new field with default value -Old config (version 2): +Old config (version 3): ```json { "version": 3, diff --git a/docs/security/ANTIGRAVITY_AUTH.fr.md b/docs/security/ANTIGRAVITY_AUTH.fr.md index 8550c94e36..eac3259d4e 100644 --- a/docs/security/ANTIGRAVITY_AUTH.fr.md +++ b/docs/security/ANTIGRAVITY_AUTH.fr.md @@ -691,7 +691,7 @@ case "your-provider": { "model_name": "your-model", "model": "your-provider/model-name", - "api_key": "your-api-key", + "api_keys": ["your-api-key"], "api_base": "https://api.your-provider.com/v1" } ] @@ -725,7 +725,7 @@ picoclaw agent -m "Hello" --model your-model export PICOCLAW_AGENTS_DEFAULTS_MODEL=your-model # Remplacer les paramètres du fournisseur -export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_key":"..."}]' +export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_keys":["..."]}]' ``` --- diff --git a/docs/security/ANTIGRAVITY_AUTH.ja.md b/docs/security/ANTIGRAVITY_AUTH.ja.md index e5ba91f8e3..a3754ccd22 100644 --- a/docs/security/ANTIGRAVITY_AUTH.ja.md +++ b/docs/security/ANTIGRAVITY_AUTH.ja.md @@ -691,7 +691,7 @@ case "your-provider": { "model_name": "your-model", "model": "your-provider/model-name", - "api_key": "your-api-key", + "api_keys": ["your-api-key"], "api_base": "https://api.your-provider.com/v1" } ] @@ -725,7 +725,7 @@ picoclaw agent -m "Hello" --model your-model export PICOCLAW_AGENTS_DEFAULTS_MODEL=your-model # プロバイダー設定の上書き -export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_key":"..."}]' +export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_keys":["..."]}]' ``` --- diff --git a/docs/security/ANTIGRAVITY_AUTH.md b/docs/security/ANTIGRAVITY_AUTH.md index d88d73c8de..7488ad9ba7 100644 --- a/docs/security/ANTIGRAVITY_AUTH.md +++ b/docs/security/ANTIGRAVITY_AUTH.md @@ -689,7 +689,7 @@ case "your-provider": { "model_name": "your-model", "model": "your-provider/model-name", - "api_key": "your-api-key", + "api_keys": ["your-api-key"], "api_base": "https://api.your-provider.com/v1" } ] @@ -723,7 +723,7 @@ picoclaw agent -m "Hello" --model your-model export PICOCLAW_AGENTS_DEFAULTS_MODEL=your-model # Override provider settings -export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_key":"..."}]' +export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_keys":["..."]}]' ``` --- diff --git a/docs/security/ANTIGRAVITY_AUTH.pt-br.md b/docs/security/ANTIGRAVITY_AUTH.pt-br.md index 626dc7433e..80475e4ddd 100644 --- a/docs/security/ANTIGRAVITY_AUTH.pt-br.md +++ b/docs/security/ANTIGRAVITY_AUTH.pt-br.md @@ -691,7 +691,7 @@ case "your-provider": { "model_name": "your-model", "model": "your-provider/model-name", - "api_key": "your-api-key", + "api_keys": ["your-api-key"], "api_base": "https://api.your-provider.com/v1" } ] @@ -725,7 +725,7 @@ picoclaw agent -m "Hello" --model your-model export PICOCLAW_AGENTS_DEFAULTS_MODEL=your-model # Substituir configurações do provedor -export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_key":"..."}]' +export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_keys":["..."]}]' ``` --- diff --git a/docs/security/ANTIGRAVITY_AUTH.vi.md b/docs/security/ANTIGRAVITY_AUTH.vi.md index 0800ce0f23..33c241f900 100644 --- a/docs/security/ANTIGRAVITY_AUTH.vi.md +++ b/docs/security/ANTIGRAVITY_AUTH.vi.md @@ -691,7 +691,7 @@ case "your-provider": { "model_name": "your-model", "model": "your-provider/model-name", - "api_key": "your-api-key", + "api_keys": ["your-api-key"], "api_base": "https://api.your-provider.com/v1" } ] @@ -725,7 +725,7 @@ picoclaw agent -m "Hello" --model your-model export PICOCLAW_AGENTS_DEFAULTS_MODEL=your-model # Ghi đè cài đặt nhà cung cấp -export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_key":"..."}]' +export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_keys":["..."]}]' ``` --- diff --git a/docs/security/ANTIGRAVITY_AUTH.zh.md b/docs/security/ANTIGRAVITY_AUTH.zh.md index 5ae5c8afe1..bc9ea8e674 100644 --- a/docs/security/ANTIGRAVITY_AUTH.zh.md +++ b/docs/security/ANTIGRAVITY_AUTH.zh.md @@ -691,7 +691,7 @@ case "your-provider": { "model_name": "your-model", "model": "your-provider/model-name", - "api_key": "your-api-key", + "api_keys": ["your-api-key"], "api_base": "https://api.your-provider.com/v1" } ] @@ -725,7 +725,7 @@ picoclaw agent -m "Hello" --model your-model export PICOCLAW_AGENTS_DEFAULTS_MODEL=your-model # 覆盖提供商设置 -export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_key":"..."}]' +export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_keys":["..."]}]' ``` --- diff --git a/docs/security/credential_encryption.fr.md b/docs/security/credential_encryption.fr.md index 67e2ed1231..fa4574727a 100644 --- a/docs/security/credential_encryption.fr.md +++ b/docs/security/credential_encryption.fr.md @@ -33,7 +33,7 @@ enc://AAAA...base64... { "model_name": "gpt-4o", "model": "openai/gpt-4o", - "api_key": "enc://AAAA...base64...", + "api_keys": ["enc://AAAA...base64..."], "api_base": "https://api.openai.com/v1" } ] diff --git a/docs/security/credential_encryption.ja.md b/docs/security/credential_encryption.ja.md index 9eeba98b46..20135254c0 100644 --- a/docs/security/credential_encryption.ja.md +++ b/docs/security/credential_encryption.ja.md @@ -32,7 +32,7 @@ enc://AAAA...base64... { "model_name": "gpt-4o", "model": "openai/gpt-4o", - "api_key": "enc://AAAA...base64...", + "api_keys": ["enc://AAAA...base64..."], "api_base": "https://api.openai.com/v1" } ] diff --git a/docs/security/credential_encryption.md b/docs/security/credential_encryption.md index 54c2ee5f95..930fdac7aa 100644 --- a/docs/security/credential_encryption.md +++ b/docs/security/credential_encryption.md @@ -31,7 +31,7 @@ enc://AAAA...base64... { "model_name": "gpt-4o", "model": "openai/gpt-4o", - // "api_key": "enc://AAAA...base64..." move to .security.yml + // "api_keys": ["enc://AAAA...base64..."] move to .security.yml "api_base": "https://api.openai.com/v1" } ] diff --git a/docs/security/credential_encryption.pt-br.md b/docs/security/credential_encryption.pt-br.md index d4a84be8e3..660ba23ee9 100644 --- a/docs/security/credential_encryption.pt-br.md +++ b/docs/security/credential_encryption.pt-br.md @@ -33,7 +33,7 @@ enc://AAAA...base64... { "model_name": "gpt-4o", "model": "openai/gpt-4o", - "api_key": "enc://AAAA...base64...", + "api_keys": ["enc://AAAA...base64..."], "api_base": "https://api.openai.com/v1" } ] diff --git a/docs/security/credential_encryption.vi.md b/docs/security/credential_encryption.vi.md index 38d568b940..1d7dd50777 100644 --- a/docs/security/credential_encryption.vi.md +++ b/docs/security/credential_encryption.vi.md @@ -33,7 +33,7 @@ enc://AAAA...base64... { "model_name": "gpt-4o", "model": "openai/gpt-4o", - "api_key": "enc://AAAA...base64...", + "api_keys": ["enc://AAAA...base64..."], "api_base": "https://api.openai.com/v1" } ] diff --git a/docs/security/credential_encryption.zh.md b/docs/security/credential_encryption.zh.md index 5083eee180..e98a71b540 100644 --- a/docs/security/credential_encryption.zh.md +++ b/docs/security/credential_encryption.zh.md @@ -32,7 +32,7 @@ enc://AAAA...base64... { "model_name": "gpt-4o", "model": "openai/gpt-4o", - "api_key": "enc://AAAA...base64...", + "api_keys": ["enc://AAAA...base64..."], "api_base": "https://api.openai.com/v1" } ] diff --git a/docs/security/security_configuration.md b/docs/security/security_configuration.md index 065eb1e766..ec038fa563 100644 --- a/docs/security/security_configuration.md +++ b/docs/security/security_configuration.md @@ -145,7 +145,7 @@ You can now remove sensitive fields from `config.json` since they're loaded from "model_name": "gpt-5.4", "model": "openai/gpt-5.4", "api_base": "https://api.openai.com/v1", - "api_key": "sk-your-actual-api-key-here" + "api_keys": ["sk-your-actual-api-key-here"] } ], "channel_list": { diff --git a/examples/pico-echo-server/README.md b/examples/pico-echo-server/README.md index f6b5d80200..bca27ec827 100644 --- a/examples/pico-echo-server/README.md +++ b/examples/pico-echo-server/README.md @@ -33,7 +33,7 @@ go run ./examples/pico-echo-server -addr :9090 -token secret 2. Configure `pico_client` in your `config.json`: ```json { - "channels": { + "channel_list": { "pico_client": { "enabled": true, "url": "ws://localhost:9090/ws", diff --git a/pkg/channels/README.md b/pkg/channels/README.md index 1cab1a4a6e..3d5d5ef971 100644 --- a/pkg/channels/README.md +++ b/pkg/channels/README.md @@ -791,7 +791,7 @@ the top level, with channel-specific settings in the `settings` sub-key: ```json { - "channels": { + "channel_list": { "matrix": { "enabled": true, "type": "matrix", diff --git a/pkg/channels/README.zh.md b/pkg/channels/README.zh.md index c44859c200..03780e7b0d 100644 --- a/pkg/channels/README.zh.md +++ b/pkg/channels/README.zh.md @@ -790,7 +790,7 @@ channel 特定的设置放在 `settings` 子键中: ```json { - "channels": { + "channel_list": { "matrix": { "enabled": true, "type": "matrix",