Initial import of all source code, config, and README assets: the packages workspace (cli, core, server, web, docs, landing, skills), build scripts, tooling config, and CI workflows. Includes the data-layout revision made on this branch: the local data root defaults to ~/.penguin/data (PENGUIN_HOME still overrides; the installer keeps its binaries in ~/.penguin), and every Agent lives under <project>/agents/<agent>/ — path helpers, the three agent-enumeration scans, the system prompt, built-in Skills, tests and docs all follow the new layout. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018ihk8iQuo3kv2aPjAYEPuR
4.2 KiB
title, description
| title | description |
|---|---|
| 模型与 Provider | 经 AgentHub 单一网关接入模型,以 (provider, model_id) 成对标识,Project 级模型表、凭证与思考等级配置。 |
单一网关
所有模型访问都经由一个网关库:@prismshadow/agenthub(AutoLLMClient)。core 只定义一层很薄的 LLMInterface(见 接口契约),各 Provider 的协议适配全部由 AgentHub 完成,因此可以接入 1000+ 在线或本地模型,包括任意 OpenAI 兼容端点。协议翻译实现在 packages/core/src/llm/generative-model.ts。
模型标识
模型身份永远是 (provider, model_id) 成对表示:provider 是配置分组名,model_id 是原样发给上游的请求 id。二者是两个独立字段,任何环节都不允许拼接成一个字符串。
Project 模型表
每个 Project 的可用模型记录在隐藏文件 .project_config.toml 中,由 CLI(penguin config model add / default / list,见 CLI 参考)或 Web 界面维护,不手工编辑。ModelEntry 字段:
| 字段 | 说明 |
|---|---|
provider |
配置分组名,与 model_id 成对构成唯一键 |
model_id |
上游请求 id |
context_window |
上下文窗口 |
client_type |
协议提示(如 openai);缺省由 AgentHub 按 model id 推断 |
display_name |
显示名 |
vision |
是否支持图像输入,默认 true |
pricing |
三档价格(单位 usd_per_mtok,USD 每百万 Token):cache_read / cache_write / output |
api_key / base_url |
内联凭证,可留空;留空时 AgentHub 回退读环境变量 |
新建 Project 的默认模型是 deepseek-v4-pro。另可配置一条 vision_model,作为 text-only 模型使用 describe_image 时的代读模型(见 工具与审批);默认不配置。
文件形态(示意):
default_model = { provider = "deepseek", model_id = "deepseek-v4-pro" }
vision_model = { provider = "google", model_id = "gemini-3.1-pro-preview" }
[[models]]
provider = "deepseek"
model_id = "deepseek-v4-pro"
context_window = 1000000
[[models]]
provider = "custom"
model_id = "my-model"
client_type = "openai"
base_url = "https://llm.example.com/v1"
api_key = "sk-..."
对标注 vision = false 的模型(如 DeepSeek 系列):对话输入中的图片会保存到 Session scratchpad,以文件路径形式拼入文本;读图工具切换为 describe_image。
内置 Provider 分组
内置分组及其环境变量回退(目录源:packages/core/src/state/model-catalog.ts);每个分组同时存在 _BASE_URL 变体(如 ANTHROPIC_BASE_URL):
| Provider | API Key 环境变量 | 说明 |
|---|---|---|
| deepseek | DEEPSEEK_API_KEY |
默认模型所在分组 |
| openrouter | OPENAI_API_KEY |
OpenAI 兼容网关,预置 base URL https://openrouter.ai/api/v1 |
| siliconflow | OPENAI_API_KEY |
OpenAI 兼容网关,预置 base URL https://api.siliconflow.cn/v1 |
GEMINI_API_KEY |
||
| anthropic | ANTHROPIC_API_KEY |
|
| openai | OPENAI_API_KEY |
|
| zhipu | ZAI_API_KEY |
|
| moonshot | MOONSHOT_API_KEY |
|
| custom | OPENAI_API_KEY |
任意 OpenAI 协议端点 |
网关分组(openrouter / siliconflow)经 AgentHub 的 OpenAI 客户端请求,因此凭证留空时读取的是 OPENAI_API_KEY,而非网关自己的变量名。
预置目录中的部分模型:deepseek-v4-pro / deepseek-v4-flash、gemini-3.1-pro-preview、claude-opus-4-8 / claude-sonnet-4-6、gpt-5.5、glm-5.2、kimi-k2.6 等(非完整清单)。
思考等级
思考等级共五档:none | low | medium | high | xhigh,按 Agent 在 system_config.yaml 的 model.thinking_level 配置,默认 medium。见 配置参考。
模型与 Agent 解耦
Agent 从不绑定模型:模型在创建 Session 时选定,并在该 Session 内锁定不变;同一个 Agent 可以在不同 Session 用不同模型运行。pricing 三档价格供用量/成本中心按 Token 计费。
凭证处理:
- 内联
api_key存放在权限 0600 的隐藏 Project 配置文件中; - Web 界面展示时打码;
- 凭证留空时回退到对应 Provider 的环境变量。
连通性测试
Web 的模型页为每个模型提供连通性测试(仅 owner 可用)。