Back to Cc Switch

Pi 前端 UI/UX 需求与规范

docs/pi-frontend-uiux-guidelines-zh.md

3.20.019.2 KB
Original Source

Pi 前端 UI/UX 需求与规范

状态:当前 Pi 前端的评审基线 适用范围:供应商、提示词、Skills、Sessions,以及以后考虑接入的 Pi 原生设置 最后更新:2026-08-05

这份文档面向 cc-switch 的设计者、开发者和评审者。它不是功能清单,也不是用户手册。新增 Pi 界面或字段时,应先用本文判断该能力是否该由 cc-switch 提供,再讨论具体组件。

文中的“必须”是合并前要求;“应该”允许有明确理由的例外;“不得”表示当前产品边界。

1. 产品目标

Pi 界面必须同时满足两类用户:

  • 第一次使用的小白能看懂哪些供应商已加入 Pi,知道从哪里添加供应商,并能完成 API Key、请求地址和模型配置。
  • 熟悉 Pi 的用户可以在第一次创建时配置接口格式、模型能力和请求头,不需要先保存一份错误配置再回来修改。

“简单”指默认路径短、入口少、术语清楚,不是删除必要能力。普通字段直接展示,少用解释文字;只有在不解释就可能误用、丢数据或改变 Pi 行为时才保留提示。

稳定性优先于覆盖所有边界。P0、P1 问题必须解决;罕见且低影响的 P2 可以记录后延期。不要为了单条评审意见叠加新的影子状态、特殊分支或一次性组件。

2. 设计来源与家族化原则

Pi 不建立独立设计系统。交互参考顺序如下:

  1. OpenCode:供应商是可累加配置,最接近 Pi 的供应商管理方式。
  2. Hermes:模型详情、可选能力和原生设置的渐进展示。
  3. Claude Code、Codex:供应商表单、请求头、配置 JSON、卡片和操作按钮的视觉语言。

应该复用现有的 ProviderPresetSelectorBasicFormFieldsApiKeySectionEndpointFieldRequestHeadersEditorJsonEditor、供应商卡片、图标、分类与合作伙伴排序。只有 Pi 原生语义无法用现有组件表达时,才增加 Pi 专用组件。

同一种信息在不同应用中应使用相同的层级、字号、间距和操作位置。Pi 可以有不同的数据语义,不能因此出现一套完全不同的布局。

3. Pi 原生语义是最高约束

所有认证、模型、文件路径、加载顺序和传输行为,必须由开发时最新 Pi 或 request capture 验证。源码阅读和经验判断只能用于提出假设,不能作为产品状态的依据。实现取舍见 Pi 原生契约与实现边界

前端必须遵守以下规则:

  • Pi 原生文件和目录采用 exists = active,不得再增加一个 enabled 字段。
  • Pi 全局保存的当前供应商和模型只由后端读取:默认供应商仅用于移除或删除前的条件提醒。它们不作为供应商页面的展示状态,也不从数据库元数据猜测。
  • 后端无法读取 models.json 时,涉及 Pi 供应商成员关系的写操作必须失败关闭。无法读取全局默认项时不阻止成员关系操作。
  • 已存在但暂未暴露的 Pi 字段必须原样透传,结构化表单不能把未知字段清空。
  • 前端只展示后端已经稳定实现的状态。没有可靠读取和写入契约的按钮不得出现。

4. 供应商页面

4.1 信息架构

供应商页面采用统一结构:

  1. CC Switch 中保存的供应商列表。
  2. 页面右上角唯一的“+”添加入口。

供应商卡片不展示模型列表。模型只在添加或编辑表单中配置,避免卡片高度失控和信息重复。

列表中的常规操作沿用家族组件:

  • 启用:把供应商加入 Pi 原生配置。
  • 移除:从 Pi 原生配置移除,但保留 CC Switch 中的供应商。
  • 编辑:修改供应商配置。
  • 删除:删除 CC Switch 中的供应商。
  • 复制、连通性检测和用量配置继续使用现有上下文操作,不增加第二个主入口。
  • 不提供“导入当前原生供应商”等第二个添加入口;需要托管的供应商统一从右上角“+”创建。

供应商标识是成员身份。Pi models.json 中存在该标识即表示已启用,不再比较整份 JSON 来制造“漂移”或“所有权”状态。凡是显式存在于 models.json.providers 的供应商都应同步到供应商列表,包括与 Pi 内置供应商同名的 ID;原生修改同步回已保存档案,原生移除只改变启用状态。只存在于 auth.json/login 或环境变量中的认证状态始终由 Pi 管理,不生成 CC Switch 卡片。详细规则见 Pi 显式供应商同步需求

4.2 Pi 当前选择的安全边界

CC Switch 不设置、展示或标记 Pi 的当前供应商和模型。

  • 当前供应商和模型完全交给 Pi 原生 /model
  • 供应商页只管理供应商是否加入 Pi 原生配置,不显示“当前使用”“当前默认”、所有权或当前模型。
  • Pi 全局默认项指向待移除或删除的供应商时,在原有确认框中增加一条非阻塞提醒,说明 Pi 会尝试其他可用模型,并允许用户继续。
  • 移除或删除供应商不得修改 defaultProviderdefaultModel;失效引用及后续选择由 Pi 原生逻辑和 /model 管理。
  • models.json 状态未知时,启用、移除和删除操作应禁用。全局默认项读取失败时不显示条件提醒,也不阻止供应商成员关系操作。

不得用“列表第一个模型”推导默认模型,也不得在保存供应商时偷偷修改 Pi 默认选择。

项目级 .pi/settings.json 依赖启动 Pi 时的工作目录,供应商页没有权威项目上下文,不扫描目录或猜测活动会话。因此条件提醒只基于全局默认项;项目级选择仍由对应 Pi 会话管理。

4.3 添加流程

添加流程的心智模型是:

选择预设或自定义配置 → 填写凭证与请求信息 → 配置模型 → 保存

具体要求:

  • 新建页默认选中“自定义配置”,并从打开时就展示完整基础表单;预设选择器用于快速填充,不作为进入表单的门槛。
  • 选择预设后直接填入供应商知识,例如请求地址、接口格式和模型;用户通常只需填写 API Key。
  • 自定义配置显示供应商标识,并在创建后锁定。
  • 不使用 1、2、3 编号步骤,不增加向导专属页面。
  • piProviderPresets 是独立维护的 Pi 原生预设目录。可以参考其他应用的供应商知识,但不得在运行时导入或派生另一个应用的预设;Pi 的协议、请求根地址和模型能力必须在自己的目录中明确表达。
  • 预设供应商必须自带完整模型能力;自定义供应商和“获取模型列表”不自动推断能力。models.dev 等外部目录只可用于开发期人工核对,不参与运行时解析。
  • 提交前完成必填、重复模型、正数和请求地址校验,并把焦点移动到错误字段。

4.4 字段暴露范围

供应商级字段分为三类:

字段前端处理原因
供应商标识自定义创建时显示,编辑时锁定Pi models.json 的稳定键
显示名称直接展示列表识别所必需
备注、官网链接直接展示cc-switch 家族元数据
API Key直接展示API Key 供应商的核心凭证
请求地址 baseUrl直接展示自定义供应商通常必填
接口格式 api直接展示决定 Pi 调用的原生协议
模型 models直接展示新建自定义供应商必须声明;已有显式内置节点可为空
请求头 headers直接展示,复用家族请求头编辑器常见兼容需求,且是 Pi 原生字段
配置 JSON可编辑、默认展开,与结构化字段双向同步与 Claude Code、Codex 等应用的配置编辑行为一致
接口兼容性 compat直接展示键值编辑器Pi 当前稳定支持的供应商级兼容选项
oauthauthHeadermodelOverrides 等罕见字段不做结构化入口,原样透传不属于普通创建路径

接口格式默认使用 OpenAI Chat Completions。可选项来自 Pi 已验证支持的协议:

  • OpenAI Chat Completions
  • OpenAI Responses
  • Anthropic Messages
  • Google Generative AI
  • Amazon Bedrock

创建时不提供“自定义接口格式”。编辑已有未知格式时,应显示并保留该值,不能因为下拉列表不认识就覆盖。

请求地址的示例沿用家族写法 https://api.example.com/v1。占位文字只作格式示例,不推导实际路径。

接口兼容性与模型配置采用相同的信息层级,不使用折叠箭头。默认只显示说明和“添加”按钮;点击后,键值行直接向下追加。未配置时不向 Pi JSON 写入空的 compat

4.5 模型配置

一个供应商拥有多个模型。供应商级请求地址和接口格式是默认值,不为每个模型重复创建“模型 API”和“模型基础地址”字段。

模型行默认只显示:

  • 模型 ID
  • 显示名称
  • 展开按钮
  • 移除按钮

选择或填写模型 ID 后,仅在显示名称仍为空时同步模型 ID。预设供应商已经填好模型能力;自定义供应商不根据模型 ID 猜测能力。展开区只放 Pi 原生且常用的能力:

  • 支持扩展思考 reasoning
  • 支持图片输入 input
  • 上下文长度 contextWindow
  • 最大输出 Token 数 maxTokens
  • 思考档位 thinkingLevelMap

自定义模型默认关闭扩展思考并使用文本输入;上下文长度和最大输出 Token 必须由用户填写正数后才能保存。后台不得根据已知名称、模型前缀、相似版本、URL 或外部目录自动写入能力,也不显示“自动值”“已覆盖自动值”或“恢复自动值”。

thinkingLevelMap 排在上下文长度和最大输出 Token 之后,作为最后一项模型能力提供渐进式编辑。它默认折叠并保持整行宽度、左侧对齐;展开后用七行轻量列表直接展示字符串、Pi 默认和不可用三种状态,点击某一行才在表单中部打开该档位的编辑浮层。关闭“支持扩展思考”时整段隐藏,但不删除已有映射。

所有推理预设模型都显式提供 thinkingLevelMap;已确认的接口组合写入对应映射,其余预设使用 {} 明确沿用 Pi 默认行为。自定义模型不自动生成映射,用户可以手动配置。模型级 apibaseUrlcost 等少见字段不做结构化入口,但编辑保存必须保留。

4.6 请求头

请求头使用 Pi 原生 headers,不得增加“请求头身份”“Claude Code”“Codex”等模板选择器,也不得自动把 API Key 塞进某个 Header。

  • 没有请求头时,沿用家族编辑器的说明、空状态和“添加请求头”按钮。
  • 添加后显示名称和值两列。
  • Header 名称按 Enter 必须先提交名称,不能触发表单保存或静默丢失。
  • 已有 Header 必须完整回显并原样保存。
  • API Key 的认证方式由 Pi 和接口格式决定,请求头编辑器只管理用户明确填写的 Header。

4.7 配置 JSON 与敏感信息

名称统一使用“配置 JSON”,不使用“配置 JSON 预览”。

配置 JSON 默认展开并允许编辑,复用共享 JSON 编辑器的语法校验和格式化操作。结构化字段只改写自己负责的键;合法 JSON 会回填结构化字段。输入暂时不合法时保留原始草稿,不用旧结构化状态覆盖,保存前必须完成校验。

配置编辑器需要显示用户正在编辑的真实值。API Key、Authorization、Token、Secret、Password 等敏感值不得出现在编辑器以外的日志、toast、列表或测试输出中。

原配置缺少可选字段时,用户未主动修改就应保持缺失。例如根级 api 不存在时,界面可以显示默认协议帮助理解,但保存不能自动补写该字段。

4.8 认证边界

Pi 原生订阅登录和 OAuth 由 Pi 管理:

  • 用户在 Pi 中使用 /login
  • CC Switch 不复制 auth.json,不保存或刷新 OAuth Token。
  • CC Switch 不展示一套独立的“已登录”状态,也不提供 OAuth 供应商按钮。
  • API Key 供应商由 CC Switch 管理。

界面不得出现“CC Switch 显示已登录,但 Pi 仍使用旧凭证或旧请求路径”的半状态。

4.9 路由与故障转移

Pi 前端不提供路由、网关和故障转移:

  • 不显示“需要路由”“不支持路由”或 gatewayStatus
  • 不显示故障转移端点管理。
  • 不显示网关凭证和网关诊断。
  • 不从预设写入 allowGateway 等能力字段。

后端不得为 Pi 建立路由投影、网关状态或故障转移配置。通用代理基建遇到 Pi 时应明确跳过。

5. 提示词页面

Pi 提示词沿用 cc-switch 的列表、标签页、全屏编辑器和顶部主操作,不创建侧边栏专用设计。页面使用三个标签:

  • 全局提示:管理提示库,并选择一项写入 Pi 全局 AGENTS.md
  • 全局系统提示:管理 APPEND_SYSTEM.mdSYSTEM.md
  • 提示词模板:管理 Pi 原生模板。

全局提示同一时间只允许一项与 AGENTS.md 精确匹配。原生文件与提示库内容不一致时,显示“外部 AGENTS.md”,不得假装某个数据库选项仍在使用。编辑或停用旧选项不能覆盖外部内容;用户明确选择另一项时,先把非空的外部内容保存进提示库,再写入所选项。

APPEND_SYSTEM.md 是普通用户的推荐入口。SYSTEM.md 会完整替换系统提示,创建前必须明确警告。文件存在就是生效,不增加启用开关。

APPEND_SYSTEM.mdSYSTEM.md 与提示词模板复用全局提示的全屏编辑表单。内容区只使用应用统一的外边距,不增加固定最大宽度;编辑器随窗口宽度伸缩。

顶部“+”根据当前标签执行对应的添加动作;系统提示标签直接编辑两个固定文件,不显示无意义的添加按钮。

提示文字只保留以下情况:

  • 不解释就无法区分 APPEND_SYSTEM.mdSYSTEM.md
  • 操作需要在已打开的 Pi 中重新加载。
  • 原生文件与 CC Switch 状态发生冲突。

不要在页面上重复显示操作完成后 toast 已经说明的内容。

6. Skills、Sessions 与后续能力

Skills

Pi Skills 复用统一 Skills 页面和已有卡片。是否被 Pi 发现必须来自原生目录检查,不读取通用 skill.apps.pi 作为第二状态源。

不要在所有 Skill 卡片上无条件显示“Pi:未启用”。Pi 状态只在 Pi 上下文或确实需要解释发现结果时出现。

Sessions

Pi Sessions 复用现有会话管理器。相对 session 目录缺少项目上下文时,应说明需要项目目录;目录不可用时显示错误。不要制造 CC Switch 专用的 Pi 会话格式。

Extensions 与 Themes

Pi Packages、Extensions 与 Themes 由 Pi 原生管理,当前不进入 CC Switch 产品界面。CC Switch 不复制扩展文件,也不维护第二套安装、启用或更新状态。

7. 文案与视觉规范

固定术语如下:

使用不使用
请求地址供应商 API、供应商基础地址
接口格式自定义接口格式(作为重复标题)
模型配置默认模型配置、模型 API
请求头请求头身份
配置 JSON配置 JSON 预览
启用、移除切换、设为默认

普通字段 Label、模型配置标题和请求头标题使用同一视觉等级。当前实现基准为 14px / 400 / 20px。不要仅把某一组字段加粗,造成虚假的一级分区。

按钮、图标、圆角、边框和 hover 状态使用现有设计令牌。交互动画保持 150–300ms,并支持 prefers-reduced-motion。深色和浅色主题都必须保证文字、边框和禁用状态可辨认。

每个输入都有可关联的 Label。图标按钮需要可访问名称。动态错误使用 role="alert" 或合适的 live region。键盘操作不能丢失尚未提交的输入。

8. 新字段和新功能的准入条件

计划新增任何 Pi 设置时,依次回答:

  1. 这是开发时最新 Pi 已验证的原生能力吗?
  2. 它是创建或日常管理中常见、必要的字段吗?
  3. 这项操作属于 CC Switch,还是应该交给 Pi 的 /login/model 等原生命令?
  4. 后端能稳定读取、写入并无损往返吗?

四项都满足才进入默认界面。Pi 原生但罕见的字段优先透传;需要专业用户偶尔修改的字段可以进入渐进区域;不属于 CC Switch 或缺少可靠后端支持的能力不进入 UI。

参考 OpenCode 或 Hermes 时只复用相同问题的成熟交互。不能因为另一个应用有某个字段,就假设 Pi 也需要。

9. 错误处理与安全

  • 状态未知时,不用猜测值恢复写操作。
  • 删除和移除必须有确认;目标是 Pi 全局默认供应商时,在同一个确认框内增加非阻塞提醒。
  • 保存失败后保留用户输入,显示具体错误。
  • 表单错误就地显示并聚焦对应字段。
  • 日志、toast、列表和测试输出不得泄露 API Key 或 Header 中的凭证。
  • 外部原生内容发生变化时,刷新列表会按精确 ID 自动同步,不增加确认或 ownership 状态。

10. 验收

功能验收至少覆盖:

  • 首次进入默认选中“自定义配置”,能同时看到预设选择和可立即填写的基础表单。
  • 预设创建、自定义创建、模型获取、模型能力预填和手动覆盖。
  • Header 的添加、Enter 提交、编辑、移除与无损回显。
  • 配置 JSON 与结构化字段双向同步,格式化可用,并与实际保存内容一致。
  • 已有未知字段、缺失可选字段和精确模型 ID 的无损往返。
  • Pi 供应商配置加载、错误、外部新增、修改、删除与启用状态同步。
  • Pi /model/login 的所有权没有被 CC Switch 接管。
  • 中、英、日、繁中术语覆盖。
  • 键盘、浅色/深色主题和常见窗口宽度。

真实联调应使用已安装的 Pi,验证添加、启用、移除、编辑、模型获取、请求发送和 Pi 原生命令后的状态同步。协议与能力结论必须保留 oracle 或 request-capture 证据。