把pick-ui-library 用于 Codex,TaoToken 提供调用入口
2026/9/19 3:50:24 网站建设 项目流程

1. 用 Codex 搭前端时,pick-ui-library 要解决的不是“选哪个库”,而是“别再手搓一个 Toast”

如果你最近在用 Codex 搭前端界面,大概率见过这种输出:页面结构、状态管理、表单校验都写得挺快,但一到 UI 细节就开始“露怯”。比如让它做一个设置页,它会给你手搓一个固定定位的 Toast,关闭逻辑靠setTimeout;让它做弹窗,它给你一个绝对定位的div,焦点管理和 Esc 关闭全靠缘分;让它做入场动画,它默认给你ease-in,看起来像页面在“卡一下”才出来。

单看每一处都不算错,但堆在一个页面里,界面就是差那么点意思。这也是emilkowalski/skillspick-ui-library这个 SKILL 的价值所在:它不是让 Codex 背一堆库名,而是让 Codex 在选型时先问场景、可访问性、动效成本、维护状态和设计系统兼容性,再给出候选库和淘汰理由。换句话说,它把“审美”和“工程经验”变成了 Codex 能照着执行的规则。

本文的目标很具体:把pick-ui-library接到 Codex,并用 TaoToken 作为模型调用入口。你需要先到 TaoToken 官网拿 Key:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_start ,然后把 Codex 的 Base URL 指向https://taotoken.net/api。之后 Codex 在执行 SKILL、分析 UI 库选型、生成对比方案时,消耗的就是 TaoToken 的 Token。下面从配置、安装、选型对照到排障,一步步写清楚。

2. 先把 TaoToken 接进 Codex:config.toml 的最小可用闭环

Codex 和 Claude Code 的配置方式不一样。Codex 走config.toml,Claude Code 走settings.jsonANTHROPIC_*环境变量,两者不能混用。这里先把 Codex 的模型入口接好,后面再讲 Claude Code 和 CC Switch 的对应关系。

2.1 到 TaoToken 创建 API Key

打开 TaoToken 官网,进入控制台创建 API Key:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_key 。创建后你会拿到类似YOUR_API_KEY的字符串。本文所有示例都用YOUR_API_KEY占位,复制时替换成你自己的 Key。

注意:Base URL 是https://taotoken.net/api,这个地址在 Codex 配置里不要加 UTM 参数,也不要写成/v1/chat/completions。Codex 会根据 provider 配置自己拼接请求路径。

2.2 写入 ~/.codex/config.toml

在用户目录下创建或编辑~/.codex/config.toml。下面是一份可直接复制的示例:

model = "gpt-5-codex" model_provider = "taotoken" approval_policy = "on-request" sandbox_mode = "workspace-write" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"

说明几个关键点:

  • model_provider = "taotoken"指向下面定义的 provider。
  • base_url = "https://taotoken.net/api"是 TaoToken 的 API 入口,不加 UTM。
  • env_key = "TAOTOKEN_API_KEY"表示 Codex 会从环境变量读取 Key,不要把 Key 明文写进config.toml
  • wire_api = "chat"是常见的 OpenAI 兼容聊天补全协议。如果你的 TaoToken 控制台或模型说明里明确要求用 Responses API,再把它改成wire_api = "responses"
  • model里的gpt-5-codex只是示例。实际模型名以 TaoToken 模型对话页或控制台展示为准。你可以先到模型对话页确认可用模型:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_chat 。

2.3 设置环境变量并验证

macOS、Linux、WSL 下可以这样设置当前会话的 Key:

export TAOTOKEN_API_KEY="YOUR_API_KEY" codex --version codex --model gpt-5-codex "只回复 pong"

Windows PowerShell 下用:

$env:TAOTOKEN_API_KEY="YOUR_API_KEY" codex --version codex --model gpt-5-codex "只回复 pong"

如果 Codex 能正常返回,说明模型入口已经通了。若报 401 或 403,优先检查三件事:Key 是否复制完整、环境变量是否在当前终端生效、base_url是否误写成其他地址。不要把ANTHROPIC_*环境变量塞进 Codex,Codex 不认这套。

3. 安装 pick-ui-library SKILL:用户级和项目级两种落法

Codex 支持 SKILL 机制后,你可以把pick-ui-library放到用户级技能目录,也可以放到项目级目录。用户级适合你经常用 Codex 做前端项目;项目级适合把选型规则固定在某个仓库里,团队其他人拉代码后也能复用。

3.1 准备本地仓库

先把emilkowalski/skills仓库放到本地一个固定目录,例如~/src/emilkowalski-skills。不要从来源不明的压缩包安装,也不要随便执行不认识的脚本。本文只演示目录复制方式,不依赖额外 CLI。

3.2 用户级安装到 ~/.codex/skills

# 假设仓库已经放在 ~/src/emilkowalski-skills mkdir -p ~/.codex/skills # 如果仓库根目录直接有 pick-ui-library cp -R ~/src/emilkowalski-skills/pick-ui-library ~/.codex/skills/pick-ui-library # 如果仓库结构是 skills/pick-ui-library,则改用这一条 # cp -R ~/src/emilkowalski-skills/skills/pick-ui-library ~/.codex/skills/pick-ui-library ls ~/.codex/skills/pick-ui-library

安装完成后,确认里面存在SKILL.md

test -f ~/.codex/skills/pick-ui-library/SKILL.md && echo "SKILL ok"

3.3 项目级安装到 .codex/skills

如果你希望这个仓库里的 Codex 始终使用pick-ui-library,用项目级目录:

mkdir -p .codex/skills cp -R ~/src/emilkowalski-skills/pick-ui-library .codex/skills/pick-ui-library test -f .codex/skills/pick-ui-library/SKILL.md && echo "project SKILL ok"

项目级和用户级同时存在时,一般项目级优先。安装后重启 Codex 会话,或者在提示词里明确要求使用该 SKILL。

3.4 用提示词触发 pick-ui-library

装好之后,不要只问“帮我选个 Toast 库”。这种问法太泛,Codex 很容易直接给一个它训练数据里常见的包。更稳的方式是把场景、约束和输出格式一起给它:

请使用 pick-ui-library SKILL。 项目:React + Vite + TypeScript 设置页。 需要:Toast、Dialog、Drawer、Select、Tooltip。 约束:可访问性优先,不引入停更包,入场动画用 ease-out,阴影优先于实线边框。 输出:1) 需求拆解 2) 候选库对比 3) 淘汰理由 4) 安装命令 5) 文件结构 6) 代码骨架。

这样 Codex 在读取pick-ui-library的规则后,会先做需求拆解,再给候选库和淘汰理由,而不是直接甩一个组件库名字。这个过程中,模型推理、SKILL 内容读取、对比输出都会消耗 Token。TaoToken 在这里的角色就是提供稳定的调用入口,你可以在同一套 Key 下管理模型对话、Coding Plan 和 API Keys。

4. pick-ui-library 的选型逻辑:先问“为什么”,再给“用哪个”

pick-ui-library最值得用的地方,不是它列了多少库,而是它把选型拆成了几个连续判断。你可以把它理解成一套给 Codex 用的 UI 库决策树。

4.1 先判断“该不该手搓”

很多界面细节看起来简单,实际上门槛很高。Toast 的堆叠、超时、暂停、关闭按钮、屏幕阅读器播报;Dialog 的焦点陷阱、Esc 关闭、滚动锁定、aria-labelledby;Drawer 的手势拖拽、触摸惯性、安全区域。这些东西手搓一个能看的版本很快,但手搓一个能上线的版本很慢。

所以pick-ui-library的第一条规则是:如果已有成熟库能覆盖 80% 场景,优先用库;只有在需求非常特殊、包体积极度敏感、设计系统完全不兼容时,才考虑自己实现。

4.2 再看可访问性和维护状态

一个 UI 库能不能用,不只看 GitHub Star 数。Codex 应该检查:

  • 是否有明确的键盘交互支持;
  • 是否处理了焦点管理;
  • 是否支持屏幕阅读器;
  • 最近是否有发布;
  • 是否有未关闭的严重 issue;
  • 是否与项目现有 React/Vue/Svelte 版本兼容;
  • 是否支持 tree-shaking 或按需引入。

pick-ui-library会让 Codex 把这些点作为淘汰理由写出来。这样你看到的不是“推荐 sonner”,而是“Toast 场景优先 sonner,因为堆叠、关闭、动效和可访问性都覆盖;不推荐手搓,因为焦点和 aria 容易漏”。

4.3 最后看动效和视觉细节

原文作者 Emil Kowalski 做过 sonner、vaul 这类前端组件,也在注重设计体验的团队里工作过。emil-design-eng等 SKILL 关注的是动画节奏、缓动曲线、阴影层次和交互反馈。pick-ui-library则进一步要求:选库时要考虑库自带的动效质量,而不是选完再硬补 CSS。

例如入场动画应优先用ease-out系列曲线,让元素快速进入、缓慢停下;阴影用来表达层级,比一条实线边框更自然;弹窗遮罩用半透明背景加轻微模糊,比纯黑遮罩更柔和。这些规则不是玄学,而是可以被 Codex 执行的约束。

5. UI 库选型对照:Codex 执行 pick-ui-library 后应该给出的 8 类结论

下面这张表不是让你背库名,而是给你一个检查 Codex 输出是否靠谱的参照。实际项目里,Codex 应该根据你的技术栈、设计系统和包体积要求调整。

| 场景 | 优先候选 | 备选 | 不建议 | 给 Codex 的约束 | | Toast 通知 | sonner | Radix Toast | 手搓setTimeout+ 固定定位 | 支持堆叠、关闭、暂停、屏幕阅读器播报 | | Dialog/Modal | Radix Dialog | Headless UI Dialog | 无焦点陷阱的div弹层 | 焦点锁定、Esc 关闭、aria-labelledby| | Drawer/Bottom Sheet | vaul | Radix Dialog + 自定义手势 | 纯 CSStranslateY无手势 | 拖拽关闭、触摸惯性、安全区域 | | Popover/Dropdown | Radix Popover | Headless UI Popover | 手动监听document.click| 定位、翻转、外部点击、键盘导航 | | Select/Combobox | Radix Select | React Aria Select | 原生select硬套复杂样式 | 键盘选择、搜索、分组、无障碍 | | Tooltip | Radix Tooltip | React Aria Tooltip |title属性冒充 Tooltip | 延迟、定位、触摸设备处理 | | 动画编排 | Motion | CSS transition | 全部用ease-in| 入场ease-out,退出更快,尊重prefers-reduced-motion| | 基础无样式组件 | Base UI / Headless UI | React Aria | 直接装停更多年的包 | 可访问性、维护状态、与设计系统兼容 |

Codex 在pick-ui-library规则下,应该先输出“需求拆解”,再输出“候选库对比”,最后才给安装命令和代码骨架。如果它一上来就pnpm add xxx,说明 SKILL 没有被正确读取,或者你的提示词太弱。

6. 实战:让 Codex 改造一个设置页的 UI 选型

假设你有一个 React + Vite + TypeScript 项目,设置页需要保存提示、编辑资料弹窗、移动端抽屉和下拉选择。你可以这样给 Codex 下指令:

请使用 pick-ui-library SKILL,改造 src/pages/Settings.tsx。 技术栈:React 18 + Vite + TypeScript + Tailwind。 目标: 1. 保存成功用 Toast,不要手搓。 2. 编辑资料用 Dialog,焦点不能跑到背景。 3. 移动端筛选用 Drawer,支持拖拽关闭。 4. 语言选择用 Select,支持键盘操作。 5. 入场动画用 ease-out,阴影层级清晰,不要用实线边框硬撑。 输出:先给选型对比表,再给安装命令,再给组件结构和代码。

如果配置正确,Codex 应该给出类似下面的安装命令:

pnpm add sonner vaul @radix-ui/react-dialog @radix-ui/react-select motion

然后生成组件骨架。你可以要求它把 Toast、Dialog、Drawer 分成独立组件:

import { Toaster, toast } from "sonner"; import * as Dialog from "@radix-ui/react-dialog"; import { Drawer } from "vaul"; export function SettingsEntry() { return ( <> <Toaster position="top-right" richColors /> <button onClick={() => toast.success("设置已保存")}> 保存 </button> <Dialog.Root> <Dialog.Trigger asChild> <button>打开对话框</button> </Dialog.Trigger> <Dialog.Portal> <Dialog.Overlay className="dialog-overlay" /> <Dialog.Content className="dialog-content"> <Dialog.Title>编辑资料</Dialog.Title> <Dialog.Description> 更新你的显示名称和头像。 </Dialog.Description> </Dialog.Content> </Dialog.Portal> </Dialog.Root> <Drawer.Root> <Drawer.Trigger asChild> <button>打开抽屉</button> </Drawer.Trigger> <Drawer.Portal> <Drawer.Overlay className="drawer-overlay" /> <Drawer.Content className="drawer-content"> <p>移动端设置项</p> </Drawer.Content> </Drawer.Portal> </Drawer.Root> </> ); }

配套的 CSS 不要用实线边框堆层级,而是用阴影和半透明遮罩:

:root { --ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1); } .dialog-overlay { position: fixed; inset: 0; background: rgba(15, 23, 42, 0.32); backdrop-filter: blur(6px); animation: overlay-in 180ms var(--ease-out-quart); } .dialog-content { background: rgba(255, 255, 255, 0.92); box-shadow: 0 24px 80px rgba(15, 23, 42, 0.18); border: 1px solid rgba(15, 23, 42, 0.08); border-radius: 16px; animation: dialog-in 220ms var(--ease-out-quart); } @keyframes overlay-in { from { opacity: 0; } to { opacity: 1; } } @keyframes dialog-in { from { opacity: 0; transform: translateY(8px) scale(0.98); } to { opacity: 1; transform: translateY(0) scale(1); } }

这段代码的重点不是具体数值,而是让 Codex 按规则输出:Toast 用成熟库,Dialog 有焦点管理,Drawer 支持手势,动画用ease-out,层级用阴影表达。执行这些 SKILL 规则时,模型会读取你的项目上下文和 SKILL 内容,Token 消耗会高于普通问答。如果你的前端项目经常这样跑,可以到 Coding Plan 页看更稳定的方案:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_plan 。

7. 排障:Codex 不读 SKILL、Base URL 写错、Key 失效怎么查

7.1 Codex 不读 pick-ui-library

先确认目录和文件名:

find ~/.codex/skills/pick-ui-library -maxdepth 2 -type f find .codex/skills/pick-ui-library -maxdepth 2 -type f

必须能看到SKILL.md。如果文件名是skill.mdREADME.md,Codex 可能不会按 SKILL 读取。然后重启 Codex 会话,并在提示词里明确写“请使用 pick-ui-library SKILL”。

7.2 Base URL 报 404 或连接失败

检查~/.codex/config.toml中:

[model_providers.taotoken] base_url = "https://taotoken.net/api"

不要写成https://taotoken.net/api/v1,也不要带?utm_source=...。Base URL 不加 UTM。如果你从某篇旧文章复制了其他中转地址,先清掉,只保留 TaoToken 的入口。

7.3 Key 失效或 401

在终端确认环境变量已经生效:

echo $TAOTOKEN_API_KEY

如果输出为空,说明当前终端没有读到 Key。重新执行:

export TAOTOKEN_API_KEY="YOUR_API_KEY"

Windows PowerShell 用:

$env:TAOTOKEN_API_KEY

如果 Key 泄露或误提交,去 TaoToken 控制台重新创建:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_keys 。

7.4 输出还是很泛,不会做选型对比

大概率是提示词太短。把场景、技术栈、可访问性要求、动效要求、输出格式都写清楚。例如:

请使用 pick-ui-library SKILL。 技术栈:React + TypeScript + Tailwind。 场景:后台管理系统,需要 Toast、Dialog、Drawer、Select。 约束:不引入停更包,必须支持键盘操作,动画入场用 ease-out。 输出:选型对比表、淘汰理由、安装命令、组件目录、代码骨架。

7.5 不要让 Codex 直接操作生产库

UI 选型不需要连接数据库。任何安装命令、构建命令、测试命令都应由你在本地终端执行。Codex 只负责分析和生成配置、代码骨架、对比表。不要让它通过 MCP 或 Agent 直连生产数据库,也不要让它执行未经审查的删库、改表操作。

8. 如果你同时用 Claude Code:settings.json 和 CC Switch 三件套要单独配

本文主体是 Codex,但很多人会同时使用 Claude Code。这里特别强调:Claude Code 用settings.jsonANTHROPIC_*,Codex 用config.tomlTAOTOKEN_API_KEY,两者不要混。

Claude Code 的~/.claude/settings.json可以这样写:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }

再次提醒:上面的ANTHROPIC_*只给 Claude Code,不要放进 Codex 的config.toml。Codex 不认识ANTHROPIC_BASE_URLANTHROPIC_AUTH_TOKEN

如果你用 CC Switch 管理多个供应商,三件套要一起改,不能只改其中一项:

API 地址:https://taotoken.net/api API Key:YOUR_API_KEY 模型名:以 TaoToken 模型对话页展示为准

Provider 名称可以写TaoToken,但真正影响请求的是 API 地址、Key 和模型名。三件套不一致时,最容易出现“能连上但模型不存在”或“返回 404”的情况。Claude Code 的完整接入方式可以看 TaoToken 的 Claude Code 文档:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_claude_code 。

9. 从模型对话到 Coding Plan:把 Codex + pick-ui-library 跑成固定工作流

现在回到主线。把pick-ui-library用于 Codex,本质上是在做三件事:

  1. 让 Codex 有稳定的模型入口。Base URL 指向https://taotoken.net/api,Key 放在环境变量里。
  2. 让 Codex 能读到 SKILL。把pick-ui-library放进~/.codex/skills或项目.codex/skills
  3. 用清晰的提示词触发选型流程。先需求拆解,再候选对比,再淘汰理由,最后才是安装命令和代码。

当你把这套流程固定下来,Codex 在前端界面任务里的产出下限会明显提高。它可能仍然不会一次生成完美的设计,但至少不会轻易给你手搓 Toast、无焦点 Dialog、ease-in入场动画和实线边框堆层级。pick-ui-library提供的是规则,TaoToken 提供的是调用入口,真正决定最终效果的是你给 Codex 的场景约束和你自己的设计判断。

如果你还没开始,建议按下面顺序走一遍:

  • 先在模型对话页确认可用模型:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_chat
  • 如果准备长期跑 Codex 前端工作流,看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_plan
  • 创建并管理 API Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_keys
  • 同时用 Claude Code 的话,再读接入文档:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_claude_code
  • 需要回到官网统一管理时,从这里进:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=codex_pick_ui_library_cta

装好 SKILL、配好config.toml、把 Base URL 写成https://taotoken.net/api之后,你就可以让 Codex 用pick-ui-library去审你的 UI 选型了。它不会替你决定产品审美,但能帮你把那些“单看都不算错、堆在一起就是不对”的细节,提前拦在代码提交之前。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询