快速创建属于你的互联网身份。 V1:先从一个真正属于你的名字开始。
按 internet_identity_v1_design.md 实现的 V1 完整功能。
npm install
cp .env.example .env.local # 填入 ANTHROPIC_API_KEY
npm run dev # http://localhost:3111不填 API Key 也能跑:产品会进入演示模式,返回一组固定的示例名字,页面上会明确标出「这不是为你生成的」。方便先看界面和交互,不能用来判断名字质量。
.env.local 里还有三个可选项:
| 变量 | 作用 |
|---|---|
NAMEYOU_MODEL |
起名模型,默认 claude-opus-5。更在意首屏速度可换 claude-sonnet-5。 |
NAMEYOU_EFFORT |
思考深度 low–max,默认 medium。名字质量与首卡延迟之间唯一的旋钮。 |
GITHUB_TOKEN |
不配也能用,但未认证的 GitHub 查询限流只有 60 次/小时/IP,高峰期会大量返回「无法确认」。一个无任何 scope 的 token 就够。 |
NAMEYOU_EVENTS_FILE |
匿名事件的落盘位置,默认 .data/events.jsonl。设为 off 完全关闭。 |
/ 首页 · 告诉我
/studio 名字发现 → 探索 → 最终名字(同一页,无跳转)
/check 独立名字检查
/privacy 你的信息去了哪里
POST /api/generate 流式生成 6 个候选(SSE)
POST /api/explore 流式探索 / 检查页的「帮我想几个接近的」(SSE)
POST /api/compare 帮我选一个
GET /api/availability GitHub + 域名可用性
GET /api/share 分享卡出图(1:1 / 4:5 / 16:9,服务端渲染)
POST /api/events 匿名行为事件
探索、发现和最终页放在同一个路由里,是为了让「新名字从旧名字里长出来」这件事没有页面跳转的断点。
设计文档在一些地方留了口子,两种做法都说得通但代价差很远。这里记下选了哪一边,以及为什么。
文档里第 3 章说「30 秒左右」,第 9 章说「几秒级」,差一个数量级。这里统一按首张名字卡片 ≤ 3 秒出现来做,而不是「全部完成时间」。
做法是一次模型调用完成理解、策略选择和生成(文档第 27 章的五个「AI 能力」是逻辑划分,串行调用光往返就超标了),流式返回,服务端边收边扫 JSON,一个候选写完就立刻推给前端(src/lib/partial-json.ts)。
文档第 4.3 章有一条硬约束:宁可显示无法确认,也不能误报为可用。
这条约束一路透传到了措辞上——我们能观测到的事实是「现在查不到占用记录」,而平台保留字、争议期、账号注销保留期都会让它和「你一定能注册」不划等号。所以 UI 上写的是「未被占用」,并在旁边给出这个结论的边界。
- GitHub:
api.github.com/users/{name},404 判未被占用,200 判已占用,403/429 一律「无法确认」。另有一份平台保留路径清单,命中直接判已占用。 - 域名:直连各注册局 RDAP,失败退回
rdap.org。DNS 只用来把「无法确认」升级成「已占用」,永远不用来判定未被占用——注册了但没解析的域名太多了。 - 缓存分状态:已占用 24 小时,未被占用 2 小时,无法确认 5 分钟。
一批 6 个名字 × 5 个数据源 = 30 次外部调用,未认证的 GitHub 限流几分钟就会把所有人打成「无法确认」。
所以只有重点推荐且明显是 ID 类的名字会自动查一次;其余名字在展开后给一个「查一下还能不能用」的按钮,由用户触发。最终名字页和检查页则是自动查——那时用户已经在等结论了。
探索是核心交互,重度用户会走十几轮——恰好是最希望发生的行为,也最先撞上上下文膨胀。
所以轨迹分成两份:前端持有完整轨迹用于展示和回退,发给模型的是压缩版——只有最近 8 步的「名字 + 操作」,更早的折成一个数字告诉模型「还有多少轮」。口味(likes / dislikes)各保留 10 条,滚动淘汰。完整的候选对象从不回传。
用户可以返回探索轨迹的任意一层。这时候之前几层攒下的偏好怎么办,文档没说,两种做法都说得通。
选的是:dislikes 全程累积,likes 跟着轨迹回滚。因为「不喜欢什么」通常是稳定的,用户退回来是想换一个方向,不是想收回讨厌的东西。全部保留会让人觉得「它没听我的」,全部丢掉会让人觉得「它忘了我刚说过的话」。
V1 没有账号,收藏只在浏览器 localStorage 里。最终页那个「保存名字」如果让用户以为东西被安全存起来了,丢掉的时候伤害更大。
所以:保存 = 加入收藏,页面上直说它只存在这台设备;收藏抽屉里给一个「存一份到本地」的纯文本导出;分享卡片同时承担「名字的存档」这个职责,而不只是传播工具。
文档第 22 章说「文字就是核心内容,字体非常重要」。客户端 canvas 在中文字体加载时机、跨域和移动端 Safari 画布尺寸上坑太深,所以用 next/og 服务端出图。
中文字体不可能把十几兆的字库塞进仓库,做法是按这张卡实际用到的字向 Google Fonts 要一个子集,通常只有几 KB,并在内存里缓存。见 src/lib/og-font.ts。
第 29 章用 5 个转化率判断 V1 成败,第 25/26/27 章又说不建画像、不强制数据库。这两件事只有分开表述才不矛盾:
不存个人线索 ≠ 不存匿名行为事件
所以 src/lib/analytics.ts 只记录「发生了什么」——一个随机、关掉标签页就失效的会话编号,加上事件名和几个数字。字符串属性统一截断到 40 字,杜绝把用户线索夹带进来。落盘是一个 JSONL 文件,不需要数据库。
第 17 章那个无登录、无门槛的检查入口,等于免费对外提供域名和用户名批量查询。不加限制的话,脚本会在上线几天内刷爆配额,把正常用户的核心功能一起拖下水。
src/lib/ratelimit.ts 是进程内令牌桶,单实例部署够用。多实例部署时每个实例各算各的,实际额度会放大到 N 倍——那时需要换成共享存储。
文档第 29 章列了 5 个指标但没给通过线。没有事先约定的阈值,上线后拿到数据只会变成主观争论。下面这组是拍板值,可以调,但要在上线前定下来:
| 指标 | 事件口径 | 目标 |
|---|---|---|
| 首批命中率 | 一次 generate 后,至少一次 card_expand 或 explore |
≥ 60% |
| 探索率 | 会话内至少一次 explore |
≥ 40% |
| 最终选定率 | 会话内出现 finalize |
≥ 25% |
| 收藏率 | 会话内至少一次 favorite_add |
≥ 35% |
| 分享卡生成率 | 会话内出现 share_card |
≥ 15% |
最小样本量:300 个有效会话(有效 = 至少完成一次 generate)。
重点看探索率,文档自己说它是 V1 最重要的行为。
判读规则:
- 生成量高、探索低 → 名字质量或首屏吸引力不足。
- 探索高、最终选定低 → 系统会「变」但不会「收敛」。
- 最终选定高、分享高 → 核心价值基本成立,可以做 V1.1。
事件在 .data/events.jsonl,一行一条,直接用 jq 就能算。
src/
├── app/
│ ├── page.tsx 首页
│ ├── studio/page.tsx 发现 + 探索 + 最终选定
│ ├── check/page.tsx 独立名字检查
│ ├── privacy/page.tsx 隐私说明
│ ├── globals.css 设计令牌与三处动效
│ └── api/ 6 个接口
├── components/ 名字卡片、探索面板、收藏抽屉、最终页、分享卡
└── lib/
├── prompts.ts 起名人格与输出契约(产品的核心)
├── claude.ts 流式结构化输出
├── partial-json.ts 边收边解析,让首卡尽早出现
├── availability.ts GitHub + RDAP,含缓存
├── ratelimit.ts 按 IP 的令牌桶
├── analytics.ts 匿名事件
├── og-font.ts 分享卡的中文字体子集
└── types.ts 身份对象的数据结构
src/lib/types.ts 刻意把「线索 / 偏好 / 口味」和「名字」分开建模,V2 的头像、简介、视觉风格会挂在同一个身份对象上,而不是重开一套结构。
- 可用性检测依赖外部服务。 GitHub 和 RDAP 都可能限流或超时,这时显示「无法确认」是正确行为,不是 bug。配上
GITHUB_TOKEN能显著改善。 - 限流是进程内的,多实例部署需要换共享存储(见上文第 9 条)。
- 埋点写本地文件,Serverless 平台上文件系统通常是临时的,需要换成日志服务或对象存储。
- 演示模式的名字是写死的,只用来看界面,不代表模型输出质量。
- 本次开发环境没有可用的 Claude 凭据,因此真实模型链路(prompt 效果、首卡延迟、名字质量)尚未实测;演示链路、可用性检测、分享卡出图、限流和埋点均已端到端验证。配好 key 后第一件该做的事就是跑一轮真实生成,校准
NAMEYOU_EFFORT。
按文档第 32 章,V1.1 优先加强起名能力本身:更多中文策略、更强的谐音和中英对应、更好的英文自造词、更多高可信平台检测、探索历史可视化。
最终名字页已经给头像 / 个人简介 / 视觉风格留好了入口位置(标为「即将支持」)——第 44 章要求的,让第一次用的人就明白这不是一个昵称小工具。