# PicoBot 常见问题

## Q: 如何切换模型？

修改 `config.json` 中 `agents` 配置，指定不同的 `provider` 和 `model`。如需新的 provider，在 `providers` 中添加对应 API 配置。

## Q: 如何添加新的渠道？

在 `config.json` 的 `channels` 中添加新条目。目前支持飞书 (feishu)，CLI 客户端无需配置。

## Q: 如何安装 skill？

将包含 `SKILL.md` 的目录放入 `~/.picobot/skills/`，程序自动检测。也可通过 agent 在 workspace 的 `skills/` 下创建新 skill。

## Q: 为什么 get_skill 找不到某个 skill？

确保 skill 目录中有 `SKILL.md` 文件，且文件头有正确的 frontmatter（name、description）。用 get_skill action="list" 查看当前加载的所有 skill。注意同名 skill 按目录优先级覆盖。

## Q: 内置的 about-picobot 文档在哪里？

`~/.picobot/skills/about-picobot/` 下，SKILL.md 为索引，references/ 下为各详细文档，assets/ 下为 config 示例。如被删除，重启程序自动重新安装。

内置 Skill 只在目标目录不存在时释放，不会覆盖已安装目录。升级 PicoBot 后如需获取新版内置文档，应先备份自己的修改，再删除旧的 `~/.picobot/skills/about-picobot/` 并重启。也可把定制版放在 `{workspace}/skills/about-picobot/`，它的优先级更高。

## Q: Docker 部署如何获取 WebUI 设备配对码？

在 Gateway 容器内执行：

```bash
docker compose exec picobot picobot pair --gateway-url http://127.0.0.1:19876
```

使用 `docker-compose.test.yml` 时增加 `-f docker-compose.test.yml`。签发接口要求请求来自 Gateway 的真实回环地址，并校验 `/app/.picobot/web_admin_token`；因此不要从宿主机经发布端口直接请求，也不要复制或输出管理密钥。代码为 8 位、5 分钟有效且只能使用一次。

## Q: 数据库文件在哪里？

默认 `{config_dir}/data/picobot.db`，`config_dir` 默认 `~/.picobot`，与 workspace 相互独立。

## Q: 如何禁用某个 skill 或 MCP 服务器？

Skill 安装后默认启用，可在 WebUI「工具 → Skills」页用开关禁用；禁用状态记录在 `~/.picobot/skills_state.json`，被禁用的 skill 不再进入提示词、列表和 `get_skill`。MCP 服务器在配置 `mcp.servers[].enabled`（默认 true）中控制，可在 WebUI「工具 → MCP」页开关；关闭后下次启动/重载时不连接该服务器。

## Q: 如何查看历史会话？

使用 `chat_manager` 工具：`action="list_sessions"` 列出会话，`action="list_messages"` 查看指定会话消息，支持 offset 翻页、before_time/after_time 时间范围过滤。

## Q: 如何创建定时任务？

使用 `cron_add` 创建，`cron_list` 查看，`cron_update`、`cron_enable`、`cron_disable`、`cron_remove` 管理。Schedule 类型为 `at`（Unix 毫秒时间戳）、`every`（毫秒间隔）或 6 段 `cron` 表达式，可指定 IANA 时区。

## Q: 上下文压缩是什么意思？

对话接近模型 token 限制时，PicoBot 用一份累计 checkpoint 摘要替代 Provider 上下文中的旧前缀，并原样保留近期消息尾部。原始消息和工具结果仍永久保存在聊天历史/SQLite 中，只是不再永久占用模型上下文；语义摘要还可通过 `timeline_recall` 检索。Model 的 `token_limit` 是窗口硬上限，未配置时为 128K；Agent 的可选 `token_limit` 只能收紧它，两者都有时取最小值。自动阈值采用窗口减 reserve 的机制，摘要输入按有效窗口动态限制而非固定 32K；换成更小模型后若历史已经超限，会在首次普通模型请求前压缩或明确降级。`/compact` 可在阈值前手动强制执行。

## Q: 如何修改 gateway 监听端口？

在 `config.json` 的 `gateway.port` 中设置，重启网关生效。默认 19876。

## Q: 如何查看 LLM 调用日志？

LLM 调用记录存储在 `llm_calls` 表中。可通过 SQLite 客户端直接查询，或在代码中通过 storage 模块访问。

该表可能包含完整用户消息、工具参数和模型响应，按敏感数据处理；不要直接上传或粘贴到公开 issue。

## Q: 为什么修改了某些 memory 配置却没有看到行为变化？

当前 `recall_limit`、`idle_consolidation_minutes`、`timeline_retention_days` 和 `max_failures_before_degrade` 都能被配置解析，但每轮 Knowledge 召回仍固定为 5，自动 idle consolidation、Timeline 清理和失败降级循环尚未接入。以当前代码行为为准。

## Q: Gateway 为什么无法立即退出？

正常关停会先停止渠道，再取消受 TaskSupervisor 管理的后台任务，并最多等待 10 秒。飞书自身另有 5 秒连接任务兜底。如果持续超过这些上限，应检查是否新增了未受监督的 `tokio::spawn`、不可取消的外部 I/O，或没有 timeout 的 JoinHandle 等待。
