Back to Picoclaw

⚙️ 配置指南

docs/guides/configuration.zh.md

0.2.936.1 KB
Original Source

⚙️ 配置指南

返回 README

⚙️ 配置详解

配置文件路径: ~/.picoclaw/config.json

环境变量

你可以使用环境变量覆盖默认路径。这对于便携安装、容器化部署或将 picoclaw 作为系统服务运行非常有用。这些变量是独立的,控制不同的路径。

变量描述默认路径
PICOCLAW_CONFIG覆盖配置文件的路径。这直接告诉 picoclaw 加载哪个 config.json,忽略所有其他位置。~/.picoclaw/config.json
PICOCLAW_HOME覆盖 picoclaw 数据根目录。这会更改 workspace 和其他数据目录的默认位置。~/.picoclaw

示例:

bash
# 使用特定的配置文件运行 picoclaw
# 工作区路径将从该配置文件中读取
PICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway

# 在 /opt/picoclaw 中存储所有数据运行 picoclaw
# 配置将从默认的 ~/.picoclaw/config.json 加载
# 工作区将在 /opt/picoclaw/workspace 创建
PICOCLAW_HOME=/opt/picoclaw picoclaw agent

# 同时使用两者进行完全自定义设置
PICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway

Gateway 日志等级

gateway.log_level 控制 Gateway 的日志详细程度,可在 config.json 中配置:

json
{
  "gateway": {
    "log_level": "warn"
  }
}

默认值为 warn。支持的值:debuginfowarnerrorfatal

也可通过环境变量覆盖:PICOCLAW_LOG_LEVEL=info

工作区布局 (Workspace Layout)

PicoClaw 将数据存储在您配置的工作区中(默认:~/.picoclaw/workspace):

~/.picoclaw/workspace/
├── sessions/          # 对话会话和历史
├── memory/           # 长期记忆 (MEMORY.md)
├── state/            # 持久化状态 (最后一次频道等)
├── cron/             # 定时任务数据库
├── skills/           # 自定义技能
├── AGENT.md          # Agent 行为指南
├── HEARTBEAT.md      # 周期性任务提示词 (每 30 分钟检查一次)
├── IDENTITY.md       # Agent 身份设定
├── SOUL.md           # Agent 灵魂/性格
└── USER.md           # 用户偏好

提示:AGENT.mdSOUL.mdUSER.mdmemory/MEMORY.md 的修改会通过文件修改时间(mtime)在运行时自动检测。无需重启 gateway,Agent 将在下一次请求时自动加载最新内容。

Agent 自进化

evolution 配置块控制 PicoClaw 的自进化运行时。启用后,Agent 会把已完成的回合记录为学习记录。在更高模式下,它可以聚类重复出现的成功模式、生成技能草稿,并可选择把已接受的草稿应用到工作区技能中。

json
{
  "evolution": {
    "enabled": false,
    "mode": "observe",
    "state_dir": "",
    "min_task_count": 2,
    "min_success_ratio": 0.7,
    "cold_path_trigger": "after_turn",
    "cold_path_times": []
  }
}
字段默认值说明
enabledfalse启用已完成 Agent 回合的学习记录采集。Heartbeat 回合会被忽略。
modeobserveobserve 只记录数据;draft 可生成候选技能草稿;apply 可将已接受草稿应用到工作区技能。
state_dir""自进化状态的可选目录。留空时使用工作区下的默认位置。
min_task_count2一个模式具备生成草稿资格前所需的最小相关任务记录数。
min_success_ratio0.7任务聚类所需的最小成功率,取值需大于 0,且不超过 1
cold_path_triggerafter_turn草稿生成可在 after_turn 后运行、按 scheduled 定时运行;设置为 manual 时会关闭自动冷路径运行。目前还没有用户可用的手动触发入口。仅在 draftapply 模式下生效。
cold_path_times[]cold_path_triggerscheduled 时使用的运行时间,格式为 HH:MM 字符串。

如果你只想先检查学习记录,建议从 observe 开始。需要生成可审查改进时使用 draft。只有在你接受让已通过的草稿更新工作区技能时,才使用 apply

请求上下文策略

turn_profileagents.defaults.turn_profile 下的可选请求上下文策略,用来控制每个新回合是否带入历史、系统提示、技能提示,以及允许调用哪些工具。不写该配置或设置 "enabled": false 时,PicoClaw 完全保持原逻辑;设置 "enabled": true 后,下面的策略会应用到每个新回合。

所有块都使用同一组 mode

Mode含义
default保持 PicoClaw 原逻辑。块缺失或 mode 缺失都按 default 处理。
off关闭该块。
custom使用允许列表。本版本仅支持 skillstools,在 historysystem_prompt 中使用会触发配置校验错误。

各块含义:

控制内容
history是否读取历史和摘要、写入用户/助手/工具消息、写入 context manager,以及是否压缩或总结本轮会话。
system_prompt是否注入 PicoClaw 默认身份、工作区指令、记忆、运行时上下文和摘要。关闭后仍可使用外部传入的 system prompt。
skills是否加载技能目录和 active skill 提示。custom.allow 只保留列出的技能名。
tools暴露给模型并允许执行的工具。custom.allow 只保留已注册且列出的工具名。

system_prompt.modeoff、工具仍可见且没有外部 system prompt 时,PicoClaw 会复用现有的工具使用规则作为最小兜底提示。如果 tools.modeoff,则不会添加兜底提示。

只保留 Web 工具的干净上下文示例:

json
{
  "agents": {
    "defaults": {
      "turn_profile": {
        "enabled": true,
        "history": { "mode": "off" },
        "system_prompt": { "mode": "off" },
        "skills": { "mode": "off" },
        "tools": {
          "mode": "custom",
          "allow": ["web_search", "web_fetch"]
        }
      }
    }
  }
}

Web 启动器控制台

picoclaw-launcher 打开浏览器控制台前需要先使用密码登录。首次启动时打开 /launcher-setup 创建 dashboard 登录密码;后续手动登录使用 /launcher-login

  • 配置文件:与 config.json 同一目录(若设置了 PICOCLAW_CONFIG,则与它所指的文件同目录)。启动器专用文件名为 launcher-config.json
  • 密码存储:支持的平台会把 bcrypt 后的密码哈希存入 launcher-auth.db。如果当前平台不支持 SQLite 密码存储,则把 bcrypt 哈希存入 launcher-config.json
  • 旧配置迁移:旧版 launcher_token 会一次性迁移为密码登录,并从保存后的 launcher 配置中移除。
  • 本地自动登录:launcher 启动后自动打开本地浏览器时,会使用仅允许 loopback 访问的一次性引导入口自动设置会话 Cookie。
  • 不再支持的鉴权方式:不再支持 URL token 登录(?token=...)、PICOCLAW_LAUNCHER_TOKENAuthorization: Bearer dashboard 鉴权。
  • 退出登录:应使用 POST /api/auth/logout,且请求头为 Content-Type: application/json(请求体可为 {}),勿使用可被第三方页面触发的 GET 链接登出。
  • 暴力尝试POST /api/auth/login 对同一远程地址有 每分钟尝试次数上限(超限返回 HTTP 429)。
  • 会话时长:登录后的 HttpOnly 会话 Cookie 默认约 31 天有效,但 launcher 进程重启后已有会话会失效。

技能来源 (Skill Sources)

默认情况下,技能会按以下顺序加载:

  1. ~/.picoclaw/workspace/skills(工作区)
  2. ~/.picoclaw/skills(全局)
  3. <构建时嵌入路径>/skills(内置)

在高级/测试场景下,可通过以下环境变量覆盖内置技能目录:

bash
export PICOCLAW_BUILTIN_SKILLS=/path/to/skills

在聊天频道中使用技能

技能安装完成后,可以直接在聊天频道里查看并显式启用它们:

  • /list skills:显示当前 Agent 可用的已安装技能名称。
  • /use <skill> <message>:只对当前这一条请求强制使用指定技能。
  • /use <skill>:为同一会话中的下一条消息预先启用该技能。
  • /use clear:取消通过 /use <skill> 设置的待应用技能。
  • /btw <question>:发起一个即时的旁支提问,且不改动当前会话历史。/btw 会按一次无工具的直接问答处理,不会进入常规的工具执行流程。

示例:

text
/list skills
/use git explain how to squash the last 3 commits
/btw 帮我回顾一下刚才关于发布方案的结论
/use italiapersonalfinance
dammi le ultime news

统一命令执行策略

  • 通用斜杠命令通过 pkg/agent/loop.go 中的 commands.Executor 统一执行。
  • Channel 适配器不再在本地消费通用命令;它们只负责把入站文本转发到 bus/agent 路径。Telegram 仍会在启动时自动注册其支持的命令菜单,例如 /start/help/show/list/use/btw
  • 未注册的斜杠命令(例如 /foo)会透传给 LLM 按普通输入处理。
  • 已注册但当前 channel 不支持的命令(例如 WhatsApp 上的 /show)会返回明确的用户可见错误,并停止后续处理。

Session 隔离

Session scope 决定了聊天、用户、线程和 space 之间共享多少上下文。

  • 全局默认值使用 session.dimensions
  • 如果只想让某条路由例外,使用 dispatch rule 上的 session_dimensions

如果你想看完整的隔离方案和配置配方,请看 Session 使用指南

Routing

Routing 通过 agents.dispatch.rules 配置。

每条规则都针对 channel 归一化后的 inbound context 做匹配。 规则按从上到下顺序检查,第一条命中的规则立即生效。若没有规则命中,PicoClaw 会回退到默认 agent。

支持的匹配字段:

  • channel
  • account
  • space
  • chat
  • topic
  • sender
  • mentioned

这些值使用和 session system 一致的归一化词汇:

  • space: workspace:t001guild:123456
  • chat: direct:user123group:-100123channel:c123
  • topic: topic:42
  • sender: 平台归一化后的 sender 标识

规则也可以通过 session_dimensions 覆盖全局 session.dimensions,这样路由和会话隔离就能保持一致,而不必回到旧的 bindingsdm_scope 配置。

示例:

json
{
  "agents": {
    "list": [
      { "id": "main", "default": true },
      { "id": "support" },
      { "id": "sales" }
    ],
    "dispatch": {
      "rules": [
        {
          "name": "vip in support group",
          "agent": "sales",
          "when": {
            "channel": "telegram",
            "chat": "group:-1001234567890",
            "sender": "12345"
          },
          "session_dimensions": ["chat", "sender"]
        },
        {
          "name": "telegram support group",
          "agent": "support",
          "when": {
            "channel": "telegram",
            "chat": "group:-1001234567890"
          },
          "session_dimensions": ["chat"]
        }
      ]
    }
  },
  "session": {
    "dimensions": ["chat"]
  }
}

在这个例子里,VIP 规则必须放在更宽泛的群规则前面。 因为 routing 是严格按顺序执行的,所以更具体的规则要放前面,兜底规则放后面。

如果你想看更完整的 agent 路由和模型分层示例,请看 路由使用指南

🔒 安全沙箱 (Security Sandbox)

PicoClaw 默认在沙箱环境中运行。Agent 只能访问配置的工作区内的文件和执行命令。

默认配置

json
{
  "agents": {
    "defaults": {
      "workspace": "~/.picoclaw/workspace",
      "restrict_to_workspace": true
    }
  }
}
选项默认值描述
workspace~/.picoclaw/workspaceAgent 的工作目录
restrict_to_workspacetrue限制文件/命令访问在工作区内

受保护的工具

restrict_to_workspace: true 时,以下工具会被沙箱化:

工具功能限制
read_file读取文件仅限工作区内的文件
write_file写入文件仅限工作区内的文件
list_dir列出目录仅限工作区内的目录
edit_file编辑文件仅限工作区内的文件
append_file追加文件仅限工作区内的文件
exec执行命令命令路径必须在工作区内

额外的 Exec 保护

即使 restrict_to_workspace: falseexec 工具也会阻止以下危险命令:

  • rm -rfdel /frmdir /s — 批量删除
  • formatmkfsdiskpart — 磁盘格式化
  • dd if= — 磁盘镜像
  • 写入 /dev/sd[a-z] — 直接磁盘写入
  • shutdownrebootpoweroff — 系统关机
  • Fork bomb :(){ :|:& };:

文件访问控制

配置键类型默认值描述
tools.allow_read_pathsstring[][]允许在工作区外读取的额外路径
tools.allow_write_pathsstring[][]允许在工作区外写入的额外路径

Exec 安全配置

配置键类型默认值描述
tools.exec.allow_remoteboolfalse允许从远程渠道(Telegram/Discord 等)执行 exec 工具
tools.exec.enable_deny_patternsbooltrue启用危险命令拦截
tools.exec.custom_deny_patternsstring[][]自定义阻止的正则表达式模式
tools.exec.custom_allow_patternsstring[][]自定义允许的正则表达式模式

安全提示: Symlink 保护默认启用——所有文件路径在允许列表匹配前都会通过 filepath.EvalSymlinks 解析,防止符号链接逃逸攻击。

已知限制:构建工具的子进程

exec 安全守卫仅检查 PicoClaw 直接启动的命令行。它不会递归检查由 makego runcargonpm run 或自定义构建脚本等开发工具产生的子进程。

这意味着顶层命令通过初始守卫检查后,仍可以编译或启动其他二进制文件。实际上,应将构建脚本、Makefile、包脚本和生成的二进制文件视为与直接 shell 命令同等级别的可执行代码进行审查。

对于高风险环境:

  • 执行前审查构建脚本。
  • 对编译并运行的工作流优先使用审批/手动审查。
  • 如果需要比内置守卫更强的隔离,请在容器或虚拟机中运行 PicoClaw。

错误示例

[ERROR] tool: Tool execution failed
{tool=exec, error=Command blocked by safety guard (path outside working dir)}
[ERROR] tool: Tool execution failed
{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}

禁用限制(安全风险)

如果需要 Agent 访问工作区外的路径:

方法 1: 配置文件

json
{
  "agents": {
    "defaults": {
      "restrict_to_workspace": false
    }
  }
}

方法 2: 环境变量

bash
export PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false

⚠️ 警告: 禁用此限制将允许 Agent 访问系统上的任何路径。仅在受控环境中谨慎使用。

安全边界一致性

restrict_to_workspace 设置在所有执行路径中一致应用:

执行路径安全边界
主 Agentrestrict_to_workspace
子 Agent / Spawn继承相同限制 ✅
心跳任务继承相同限制 ✅

所有路径共享相同的工作区限制——无法通过子 Agent 或定时任务绕过安全边界。

心跳 / 周期性任务 (Heartbeat)

PicoClaw 可以自动执行周期性任务。在工作区创建 HEARTBEAT.md 文件:

markdown
# Periodic Tasks

- Check my email for important messages
- Review my calendar for upcoming events
- Check the weather forecast

Agent 将每隔 30 分钟(可配置)读取此文件,并使用可用工具执行任务。

使用 Spawn 的异步任务

对于耗时较长的任务(网络搜索、API 调用),使用 spawn 工具创建一个 子 Agent (subagent)

markdown
# Periodic Tasks

## Quick Tasks (respond directly)

- Report current time

## Long Tasks (use spawn for async)

- Search the web for AI news and summarize
- Check email and report important messages

关键行为:

特性描述
spawn创建异步子 Agent,不阻塞主心跳进程
独立上下文子 Agent 拥有独立上下文,无会话历史
message tool子 Agent 通过 message 工具直接与用户通信
非阻塞spawn 后,心跳继续处理下一个任务

配置:

json
{
  "heartbeat": {
    "enabled": true,
    "interval": 30
  }
}
选项默认值描述
enabledtrue启用/禁用心跳
interval30检查间隔,单位分钟 (最小: 5)

环境变量:

  • PICOCLAW_HEARTBEAT_ENABLED=false 禁用
  • PICOCLAW_HEARTBEAT_INTERVAL=60 更改间隔

子 Agent 通信流程

心跳触发
    ↓
Agent 读取 HEARTBEAT.md
    ↓
遇到耗时任务:spawn 子 Agent
    ↓                           ↓
继续处理下一个任务         子 Agent 独立运行
    ↓                           ↓
所有任务完成               子 Agent 使用 "message" 工具
    ↓                           ↓
回复 HEARTBEAT_OK          用户直接收到结果

子 Agent 拥有工具访问权限(message、web_search 等),可以独立与用户通信,无需经过主 Agent。

Providers(模型提供商)

[!NOTE] Groq 通过 Whisper 提供免费语音转录。配置后,任意渠道的语音消息都会在 Agent 层自动转录为文字。

提供商用途获取 API Key
geminiLLM(Gemini 直连)aistudio.google.com
zhipuLLM(智谱直连)bigmodel.cn
volcengineLLM(火山引擎直连)volcengine.com
openrouterLLM(推荐,可访问所有模型)openrouter.ai
anthropicLLM(Claude 直连)console.anthropic.com
openaiLLM(GPT 直连)platform.openai.com
deepseekLLM(DeepSeek 直连)platform.deepseek.com
qwenLLM(通义千问直连)dashscope.console.aliyun.com
groqLLM + 语音转录(Whisper)console.groq.com
cerebrasLLM(Cerebras 直连)cerebras.ai
vivgridLLM(Vivgrid 直连)vivgrid.com

模型配置 (model_list)

新特性: PicoClaw 现在优先推荐显式 provider + 原生 model 的配置方式,例如 "provider": "zhipu", "model": "glm-4.7"。如果未设置 provider,旧的单字段 provider/model 写法仍然兼容。

这一设计同时支持多 Agent场景,灵活选择提供商:

  • 不同 Agent 使用不同提供商:每个 Agent 可以使用独立的 LLM 提供商
  • 模型降级:配置主模型和备用模型,提升可用性
  • 负载均衡:将请求分发到多个端点
  • 集中管理:在一处管理所有提供商配置

所有支持的厂商

厂商provider默认 API Base协议API Key
OpenAIopenaihttps://api.openai.com/v1OpenAI获取
Anthropicanthropichttps://api.anthropic.com/v1Anthropic获取
智谱 AI (GLM)zhipuhttps://open.bigmodel.cn/api/paas/v4OpenAI获取
DeepSeekdeepseekhttps://api.deepseek.com/v1OpenAI获取
Google Geminigeminihttps://generativelanguage.googleapis.com/v1betaGemini获取
Groqgroqhttps://api.groq.com/openai/v1OpenAI获取
Moonshotmoonshothttps://api.moonshot.cn/v1OpenAI获取
通义千问 (Qwen)qwenhttps://dashscope.aliyuncs.com/compatible-mode/v1OpenAI获取
NVIDIAnvidiahttps://integrate.api.nvidia.com/v1OpenAI获取
Ollamaollamahttp://localhost:11434/v1OpenAI本地(无需 Key)
LM Studiolmstudiohttp://localhost:1234/v1OpenAI可选(本地默认无需密钥)
OpenRouteropenrouterhttps://openrouter.ai/api/v1OpenAI获取
LiteLLM Proxylitellmhttp://localhost:4000/v1OpenAI你的 LiteLLM 代理 Key
VLLMvllmhttp://localhost:8000/v1OpenAI本地
Cerebrascerebrashttps://api.cerebras.ai/v1OpenAI获取
火山引擎 (豆包)volcenginehttps://ark.cn-beijing.volces.com/api/v3OpenAI获取
神算云shengsuanyunhttps://router.shengsuanyun.com/api/v1OpenAI
BytePlusbyteplushttps://ark.ap-southeast.bytepluses.com/api/v3OpenAI获取
Vivgridvivgridhttps://api.vivgrid.com/v1OpenAI获取
LongCatlongcathttps://api.longcat.chat/openaiOpenAI获取
ModelScope (魔搭)modelscopehttps://api-inference.modelscope.cn/v1OpenAI获取
AntigravityantigravityGoogle CloudCustom仅 OAuth
GitHub Copilotgithub-copilotlocalhost:4321gRPC

基础配置

json
{
  "model_list": [
    {
      "model_name": "ark-code-latest",
      "provider": "volcengine",
      "model": "ark-code-latest",
      "api_keys": ["sk-your-api-key"]
    },
    {
      "model_name": "gpt-5.4",
      "provider": "openai",
      "model": "gpt-5.4",
      "api_keys": ["sk-your-openai-key"]
    },
    {
      "model_name": "claude-sonnet-4.6",
      "provider": "anthropic",
      "model": "claude-sonnet-4.6",
      "api_keys": ["sk-ant-your-key"]
    },
    {
      "model_name": "glm-4.7",
      "provider": "zhipu",
      "model": "glm-4.7",
      "api_keys": ["your-zhipu-key"]
    }
  ],
  "agents": {
    "defaults": {
      "model": "gpt-5.4"
    }
  }
}

解析规则:

  • 推荐显式写成 "provider": "openai", "model": "gpt-5.4"
  • 如果设置了 provider,PicoClaw 会将 model 原样发送。
  • 如果未设置 provider,PicoClaw 会把 model 第一个 / 之前的字段当作 provider,并把第一个 / 之后的全部内容当作最终模型 ID。
  • 这意味着 "model": "openrouter/openai/gpt-5.4" 这样的兼容写法仍然可用,并会把 openai/gpt-5.4 发送给 OpenRouter。

流式输出配置

Provider 流式输出采用双开关,默认关闭。只有当前 channel 的 settings.streaming.enabled 和当前模型条目的 streaming.enabled 都为 true,并且 provider 与 channel 都支持流式能力时,Agent 才会尝试流式请求;任一条件不满足时仍使用普通非流式请求。

当前完整落地的是 Pico WebUI。Pico 使用已有的 message.create 创建第一条 assistant 消息,随后用 message.update 更新同一条消息,不新增协议消息类型。

不需要流式时请省略 streaming 配置块。省略表示关闭,不需要写 "streaming": {"enabled": false}

开启示例:

json
{
  "model_list": [
    {
      "model_name": "gpt-5.4",
      "provider": "openai",
      "model": "gpt-5.4",
      "api_keys": ["sk-your-openai-key"],
      "streaming": {
        "enabled": true
      }
    }
  ],
  "channel_list": {
    "pico": {
      "enabled": true,
      "type": "pico",
      "settings": {
        "token": "YOUR_PICO_TOKEN",
        "streaming": {
          "enabled": true
        }
      }
    }
  }
}
字段类型默认值说明
channel_list.<name>.settings.streaming.enabledboolfalse是否允许该 channel 尝试展示 provider 流式输出
channel_list.<name>.settings.streaming.throttle_secondsintPico 开启后默认 0中间更新的最小时间间隔,最终内容不受此限制
channel_list.<name>.settings.streaming.min_growth_charsintPico 开启后默认 1中间更新相比上次发送至少增长的字符数,最终内容不受此限制
model_list[].streaming.enabledboolfalse是否允许该模型条目尝试 provider 流式请求

Telegram 旧环境变量仍兼容:PICOCLAW_CHANNELS_TELEGRAM_STREAMING_ENABLEDPICOCLAW_CHANNELS_TELEGRAM_STREAMING_THROTTLE_SECONDSPICOCLAW_CHANNELS_TELEGRAM_STREAMING_MIN_GROWTH_CHARS。这些环境变量只作用于 Telegram settings,不会开启或修改 Pico 的 settings.streaming

失败处理保持保守:如果还没有任何可见 chunk 就失败,PicoClaw 会回退到普通 Chat() 路径重试一次;如果已经有 chunk 展示给用户,则不会再发送一条非流式最终答案,避免界面重复输出。

各厂商配置示例

<details> <summary><b>OpenAI</b></summary>
json
{
  "model_name": "gpt-5.4",
  "provider": "openai",
  "model": "gpt-5.4",
  "api_keys": ["sk-..."]
}
</details> <details> <summary><b>火山引擎(豆包)</b></summary>
json
{
  "model_name": "ark-code-latest",
  "provider": "volcengine",
  "model": "ark-code-latest",
  "api_keys": ["sk-..."]
}
</details> <details> <summary><b>智谱 AI (GLM)</b></summary>
json
{
  "model_name": "glm-4.7",
  "provider": "zhipu",
  "model": "glm-4.7",
  "api_keys": ["your-key"]
}
</details> <details> <summary><b>DeepSeek</b></summary>
json
{
  "model_name": "deepseek-chat",
  "provider": "deepseek",
  "model": "deepseek-chat",
  "api_keys": ["sk-..."]
}
</details> <details> <summary><b>Anthropic</b></summary>
json
{
  "model_name": "claude-sonnet-4.6",
  "provider": "anthropic",
  "model": "claude-sonnet-4.6",
  "api_keys": ["sk-ant-your-key"]
}

运行 picoclaw auth login --provider anthropic 粘贴 API Token。

如需直连 Anthropic 原生接口(不兼容 OpenAI 格式的端点):

json
{
  "model_name": "claude-opus-4-6",
  "provider": "anthropic-messages",
  "model": "claude-opus-4-6",
  "api_keys": ["sk-ant-your-key"],
  "api_base": "https://api.anthropic.com"
}

当端点不支持 OpenAI 兼容格式(/v1/chat/completions),需要 Anthropic 原生 /v1/messages 时使用 anthropic-messages

</details> <details> <summary><b>Ollama(本地)</b></summary>
json
{
  "model_name": "llama3",
  "provider": "ollama",
  "model": "llama3"
}
</details> <details> <summary><b>LM Studio(本地)</b></summary>
json
{
  "model_name": "lmstudio-local",
  "provider": "lmstudio",
  "model": "openai/gpt-oss-20b"
}

api_base 默认是 http://localhost:1234/v1。除非你在 LM Studio 侧启用了认证,否则不需要配置 API Key。 显式设置 provider 后,PicoClaw 会把 openai/gpt-oss-20b 原样发送给 LM Studio。旧的兼容写法 "model": "lmstudio/openai/gpt-oss-20b" 在未设置 provider 时也会解析成相同的上游模型 ID。

</details> <details> <summary><b>自定义代理 / LiteLLM</b></summary>
json
{
  "model_name": "my-custom-model",
  "provider": "openai",
  "model": "custom-model",
  "api_base": "https://my-proxy.com/v1",
  "api_keys": ["sk-..."]
}

显式设置 provider 后,PicoClaw 会将 model 原样发送。因此 "provider": "litellm", "model": "lite-gpt4" 会发送 lite-gpt4,而 "provider": "litellm", "model": "openai/gpt-4o" 会发送 openai/gpt-4o。旧的兼容写法 litellm/lite-gpt4litellm/openai/gpt-4o 在未设置 provider 时也会得到相同结果。

</details>

负载均衡

为同一模型名称配置多个端点,PicoClaw 会自动轮询:

json
{
  "model_list": [
    {
      "model_name": "gpt-5.4",
      "provider": "openai",
      "model": "gpt-5.4",
      "api_base": "https://api1.example.com/v1",
      "api_keys": ["sk-key1"]
    },
    {
      "model_name": "gpt-5.4",
      "provider": "openai",
      "model": "gpt-5.4",
      "api_base": "https://api2.example.com/v1",
      "api_keys": ["sk-key2"]
    }
  ]
}

从旧版 providers 配置迁移

旧版 providers 配置已废弃,V2 中已移除。现有 V0/V1 配置会自动迁移。完整迁移指南见 docs/migration/model-list-migration.md

Provider 架构

PicoClaw 按协议族路由提供商:

  • OpenAI 兼容:OpenRouter、Groq、智谱、vLLM 风格端点及大多数其他提供商。
  • Gemini 原生:Google Gemini 通过原生 models/*:generateContentmodels/*:streamGenerateContent 端点接入。
  • Anthropic:Claude 原生 API 行为。
  • Codex/OAuth:OpenAI OAuth/Token 认证路由。

这使运行时保持轻量,同时让接入新的 OpenAI 兼容后端基本只需配置 api_base + api_keys

<details> <summary><b>智谱(旧版 providers 格式)</b></summary>
json
{
  "agents": {
    "defaults": {
      "workspace": "~/.picoclaw/workspace",
      "model": "glm-4.7",
      "max_tokens": 8192,
      "temperature": 0.7,
      "max_tool_iterations": 20
    }
  },
  "providers": {
    "zhipu": {
      "api_key": "Your API Key",
      "api_base": "https://open.bigmodel.cn/api/paas/v4"
    }
  }
}
</details> <details> <summary><b>完整配置示例</b></summary>
json
{
  "agents": {
    "defaults": {
      "model_name": "claude-opus-4-5"
    }
  },
  "session": {
    "dm_scope": "per-channel-peer",
    "backlog_limit": 20
  },
  "providers": {
    "openrouter": {
      "api_key": "sk-or-v1-xxx"
    },
    "groq": {
      "api_key": "gsk_xxx"
    }
  },
  "channel_list": {
    "telegram": {
      "enabled": true,
      "type": "telegram",
      "token": "123456:ABC...",
      "allow_from": ["123456789"]
    }
  },
  "tools": {
    "web": {
      "duckduckgo": {
        "enabled": true,
        "max_results": 5
      }
    }
  },
  "heartbeat": {
    "enabled": true,
    "interval": 30
  }
}
</details>

事件日志

PicoClaw 的 runtime events 会覆盖 agent、channel、gateway、message bus 和 MCP 等运行时组件。默认只打印 agent.* 事件,其他事件仍会发布到 runtime event bus,但不会进入日志。

json
{
  "events": {
    "logging": {
      "enabled": true,
      "include": ["agent.*"],
      "exclude": [],
      "min_severity": "info",
      "include_payload": false
    }
  }
}

常用配置:

json
{
  "events": {
    "logging": {
      "include": ["*"],
      "exclude": ["agent.llm.delta"],
      "min_severity": "warn"
    }
  }
}

include / exclude 支持精确事件名和 gateway.*channel.lifecycle.* 这类模式。include_payload 默认关闭,避免把完整用户消息或工具参数写入日志;agent 事件会默认输出长度、计数、状态等摘要字段。

更多字段说明和示例见 Runtime Events 与事件日志

定时任务 / 提醒

PicoClaw 通过 cron 工具支持 cron 风格的定时任务。Agent 可以设置、列出和取消在指定时间触发的提醒或周期性任务。

json
{
  "tools": {
    "cron": {
      "enabled": true,
      "exec_timeout_minutes": 5
    }
  }
}

定时任务在重启后持久保存,存储于 ~/.picoclaw/workspace/cron/

进阶主题

主题说明
敏感数据过滤在发送给 LLM 前,从工具结果中过滤 API 密钥和令牌
Runtime Events 与事件日志统一运行时事件、日志过滤和调试配置
Hook 系统事件驱动 Hook:观察者、拦截器、审批 Hook
Steering在工具调用间向运行中的 Agent 注入消息
SubTurn子 Agent 协调、并发控制、生命周期管理
上下文管理上下文边界检测、主动预算检查、压缩策略