**[English](README.md) | [中文](README.zh-CN.md)** # phi 一个用 Go 编写的最小化终端编码代理框架(harness)——Pi 的姊妹项目。 刻意保持清亮:一个模型循环、一组工具、一个可读的 TUI——不是塞满功能的终端 IDE。 - **子代理(Sub-agents)** — 拉起隔离任务,在 TUI / job 日志里完整看到执行过程,而不是把每一步都塞进父会话上下文 - **Hashline 编辑** — 用整文件 `@file path#TAG` 加上行级 `LINE#HASH` 锚点改文件(思路对齐 [oh-my-pi](https://github.com/can1357/oh-my-pi)):模型瞄锚点改,而不是整文件重写;TAG/哈希对不上就拒绝,避免过度编辑和静默写坏 - **权限门控** — 危险工具先过 Gate / Ask;代理能碰你的代码树时,安全不是可选项 - **MCP 不炸上下文** — 随便配多少 MCP 服务器,工具 schema **绝不**进模型 prompt。系统提示只列 **server 名**(像 Skills 目录);Agent 用三个元工具(`mcp_list` / `mcp_inspect` / `mcp_call`)按需发现再调用;权限仍走 Gate / Ask / Hooks。详见 [MCP](#mcp) - **任意模型** — OpenAI 兼容或 Anthropic,无厂商锁定
  你可以通过 [Skills(技能)](#skills技能)、[Hooks(钩子)](#hooks钩子) 和 [MCP](#mcp) 扩展它——不必做成插件框架。 - [快速开始](#快速开始) - [资源占用](#资源占用) - [配置](#配置) - [交互模式](#交互模式) - [命令](#命令) - [会话](#会话) - [无头模式](#无头模式) - [Skills(技能)](#skills技能) - [权限](#权限) - [Hooks(钩子)](#hooks钩子) - [MCP](#mcp) - [子代理](#子代理) - [工具](#工具) - [项目结构](doc/project-layout.md) ## 快速开始 安装最新发布版本(macOS / Linux): ```sh curl -fsSL https://raw.githubusercontent.com/pulseaiclub/phi/main/scripts/install.sh | bash ``` Windows(PowerShell 5.1+): ```powershell irm https://raw.githubusercontent.com/pulseaiclub/phi/main/scripts/install.ps1 | iex ``` 首次启动需要配置模型。使用下面这个命令打开配置编辑器(会创建 `~/.phi` 目录结构并写入 `~/.phi/config.yaml`): ```sh phi config ``` 也可以设置环境变量做一次性运行: ```sh export PHI_MODEL=gpt-4o export PHI_API_KEY=sk-... ``` 然后启动 TUI: ```sh phi ``` 或者从源码构建(Go 1.26.3+,见 `go.mod`): ```sh make build # 生成 ./phi make install # 构建并安装到 $GOBIN ``` 首次启动时,phi 会自动创建 `~/.phi/{bin,skills,hooks,session}`。搜索工具 (`fd`、`rg`)缺失时会在后台下载到 `~/.phi/bin`。 TUI 给模型提供四个核心工具——`read`、`write`、`edit` 和 `bash`——外加 `grep`、`glob`、`list`、`fetch`。模型用这些工具来完成你的请求。 ## 资源占用 phi 的目标是运行便宜、也便于动手改造。以下数据来自剥离的发布构建 (`CGO_ENABLED=0`,`-ldflags="-s -w"`),除注明外均在 macOS arm64 上测得。 | 指标 | phi | | --- | ---: | | 发布二进制 | **约 12 MB** | | 空闲 RSS(1 个会话) | **约 21 MB** | | 10 个空闲会话(RSS 总量) | **约 196 MB**(每个约 20 MB) | | 首帧时间 | **约 40 ms**(27–65 ms) | | 冷 `go build`(空 `GOCACHE`) | **约 5.5 s** | | 热重建 | **约 0.7 s** | | Go 源码(不含测试) | **约 22k 行** / 107 个文件 | | Go 包数量 | **32** | | 直接模块依赖 | **6**(共 15 个模块) | | 链接运行时 | 仅系统库(无 Node / Electron / Python) | ## 配置 phi 读取 `~/.phi/config.yaml`(标准 YAML)。环境变量可覆盖配置,用于一次性运行。 `phi config` 会在浏览器中打开一个 HTML 编辑器来编辑同一个文件。  ```yaml # ~/.phi/config.yaml models: - name: gpt-4o # 模型名;"claude-*" 走 Anthropic API api_key: sk-... # 或设置 PHI_API_KEY base_url: https://api.openai.com/v1 # 默认;PHI_BASE_URL 可覆盖 context_window: 128000 # 可选 default: true # 启动时使用的模型;缺省时第一项生效 - name: claude-sonnet-4-20250514 # 额外模型;运行时可切换 api_key: sk-ant-... base_url: https://api.anthropic.com context_window: 200000 skill_path: ~/.phi/skills # SKILL.md 文件的加载目录 agents: enabled: true # 默认;设为 false 可禁用 agent_* 子代理工具 permissions: mode: interactive # interactive | readonly | autopilot | headless-strict bash: default: ask # ask | allow | deny allow: - "go test ./..." deny: - "rm -rf *" fetch: default: allow allowed_hosts: - "github.com" ``` 环境变量覆盖: | 变量 | 覆盖项 | | ---------------- | ------------------ | | `PHI_API_KEY` | `models[].api_key`(默认模型) | | `PHI_MODEL` | `models[].name`(默认模型) | | `PHI_BASE_URL` | `models[].base_url`(默认模型) | | `PHI_SKILL_PATH` | `skill_path` | 提供商路由:base URL 包含 `anthropic` 或模型名以 `claude` 开头时使用 Anthropic Messages API;其余走 OpenAI 兼容的 `/chat/completions` 路径。 ### 工作区布局 ``` ~/.phi/ ├── config.yaml # 全局配置 ├── bin/ # 下载的搜索工具(fd、ripgrep) ├── skills/ # SKILL.md 技能目录 ├── hooks/ # 工具循环 hook 脚本(hook.json + run) ├── jobs/ # 子代理任务产物(meta、logs、result.md) └── session/ # 持久化会话,每个工作目录一个目录 └──