# Pi GPT-5.6 Switcher

[English](README.md) | [简体中文](README.zh-CN.md)

[![CI](https://github.com/yoyooyooo/gpt56-switcher/actions/workflows/ci.yml/badge.svg)](https://github.com/yoyooyooo/gpt56-switcher/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

一个键盘优先的 [Pi](https://github.com/earendil-works/pi) 扩展，用于在不离开当前 Provider 的前提下切换 GPT-5.6 能力模型和 Thinking level。

![GPT-5.6 Switcher 预览](docs/assets/preview.png)

> 截图展示的是一个 Provider 配置示例。实际显示的能力行和 Thinking level 由当前 Pi 模型注册表动态决定。

## 为什么需要它

一个 Provider 可能通过 Luna、Terra、Sol 多个能力模型提供 GPT-5.6，而且每个模型支持的 Thinking level 可能不同。Pi 可以分别切换模型和 Thinking，但反复打开两个选择器不利于快速检查和切换组合。

GPT-5.6 Switcher 将有效组合组织为一个内联三行选择器：

- 只发现当前 Provider 中的模型；
- 缺失的能力模型不会显示；
- 每一行只显示该模型真正支持的 Thinking level；
- 移动只更新预览，按 Enter 才同时应用模型和 Thinking；
- 底部对比当前与目标 Profile，目标中发生变化的字段会显示为黄色；如果当前模型不属于 GPT-5.6 能力模型，则显示为 `Other`，不会伪装成某个能力档位。

## 环境要求

- `@earendil-works/pi-coding-agent` 0.80.10 或更高版本
- 当前 Provider 至少注册以下一个模型：
  - `gpt-5.6-luna`
  - `gpt-5.6-terra`
  - `gpt-5.6-sol`

本扩展不会注册模型或 Provider，只使用 Pi 模型注册表中已经存在的模型。

## 安装

从 npm 安装：

```bash
pi install npm:pi-gpt56-switcher
```

也可以直接从 GitHub 安装：

```bash
pi install git:github.com/yoyooyooo/gpt56-switcher
```

重启 Pi，或在已有 TUI 会话中执行 `/reload`。

本地开发：

```bash
git clone https://github.com/yoyooyooo/gpt56-switcher.git
cd gpt56-switcher
bun install
pi -e .
```

## 使用

打开选择器：

```text
/g56
```

也可以不打开选择器，直接应用指定 Profile：

```text
/g56 terra high
/g56 sol max
```

如果当前 Provider 不具备指定模型或 Thinking level，命令不会修改状态，并会提示该 Profile 不可用。

### 按键

| 按键 | 行为 |
|---|---|
| 左 / 右 | 在当前能力行支持的 Thinking level 之间移动 |
| 上 / 下 | 在已有能力行之间移动，并尽量保持 Thinking；必要时安全收敛到可用档位 |
| Home / End | 跳到当前行的第一个或最后一个 Thinking level |
| `1` / `2` / `3` | 在存在时直达 Luna / Terra / Sol |
| Enter | 先应用目标模型，再应用对应 Thinking level |
| Escape | 取消且不做任何修改 |

## 动态发现规则

能力顺序固定为 Luna → Terra → Sol。Thinking 顺序遵循 Pi：

```text
off → minimal → low → medium → high → xhigh → max
```

对于每个匹配模型，扩展遵循 Pi 的模型元数据语义：

- `reasoning: false` 时只提供 `off`；
- `thinkingLevelMap` 中的 `null` 表示明确不支持该档位；
- 只有显式映射时才显示 `xhigh` 和 `max`；
- 普通档位缺少映射时沿用 Pi 默认行为。

扩展不会自动切换到其他 Provider。

## 交互设计

Pi 自定义组件公开的是键盘输入协议，没有公开的鼠标坐标、命中检测或拖拽事件。因此本扩展采用三行键盘交互，不接管终端 mouse tracking，也不启动第二套 renderer。

从用户视角看，选择过程具有事务边界：

1. 移动只更新预览；
2. Escape 退出且不修改状态；
3. Enter 先调用 Pi 的模型切换；
4. 模型切换成功后再应用 Thinking level；
5. 最终提示 Pi 的实际 Thinking level，包括异常收敛结果。

## 隐私与安全

扩展只读取 Pi 在进程内公开的模型元数据，不读取 Provider 凭据文件、不发送遥测，也不会自行发起模型请求。认证、路由和凭据存储仍由 Pi 与当前 Provider 负责。

安全问题报告方式见 [SECURITY.md](SECURITY.md)。

## 开发

```bash
bun install
bun test
bun run typecheck
```

欢迎贡献，具体见 [CONTRIBUTING.md](CONTRIBUTING.md)。

## 许可证

[MIT](LICENSE)
