1. 从 Reddit 热帖到本地复现:一个 800 star 的 Next.js 全栈项目到底长什么样
逛社区的时候刷到一个帖子,说有个开源项目三周多拿了 800 star,而且号称 100% 由 AI 生成。我第一反应是标题党,但点进去看了提交记录之后,确实有点坐不住了——有个 PR 前后两万多行代码,三天就合进去了。这个项目叫 fulling,核心功能是把 Next.js、shadcn/ui、pgsql 和 Claude Code 打包成一个开箱即用的编程工具,跑在 Kubernetes 上,点个按钮就能直接开始让 agent 干活。
这个项目最让我感兴趣的不是它有多少 star,而是它验证了一件事:AI 已经能写出架构不算简单的全栈应用了。底层有 k8s、有数据库、有网络域名管理,甚至还有个 ttyd 的 web terminal。如果这些真是 AI 生成的,那说明当前模型处理复杂基础设施应用的能力已经超过了很多人的预期。
但今天这篇不是来吹这个项目的。我想做的是另一件事:把这个项目的技术骨架拆出来,用 Claude Code 从零复现一个同款 Next.js + shadcn/ui + pgsql 的项目骨架,并且把 Claude Code 的 endpoint 和 auth.json 改到 TaoToken 的统一 Key 通道上。这样你不需要去折腾 k8s 和域名,本地就能跑起来一套可用的开发环境,三周内复现出同款项目骨架完全可行。
适合谁看?如果你正在用 Claude Code 写 Next.js 项目,或者想试试用统一 Key 接入多个模型来辅助全栈开发,这篇的配置和排障步骤可以直接抄。如果你还没装 Claude Code,也没关系,我会从环境准备开始讲,保证每一步都能跟做。
核心检索词先明确:Next.js 全栈项目骨架、shadcn/ui 组件库、pgsql 数据库、Claude Code 接入、TaoToken 统一 Key。这几个词会贯穿全文,你可以在每一步里找到对应的操作。
我试过用默认的 Claude Code 配置直接生成 Next.js 项目,结果卡在认证和模型切换上,后来把 endpoint 改到统一通道之后才顺畅起来。下面按步骤来,先讲清楚问题场景,再给可复制的配置。
2. 前置准备:TaoToken 统一 Key 与 Claude Code 环境搭建
在开始写代码之前,需要先把 Claude Code 的接入通道准备好。默认情况下,Claude Code 会走 Anthropic 官方的 endpoint,但如果你手上有多个模型来源,或者想用统一 Key 管理调用,就需要把 endpoint 和认证文件改掉。TaoToken 在这里的角色就是一个统一 Key 的 API 通道,官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。
先说你需要的环境:Node.js 18 以上、pnpm 或 npm、PostgreSQL 14 以上(本地用 Docker 跑一个就行)、Claude Code CLI。如果你还没装 Claude Code,可以用 npm 全局安装:
npm install -g @anthropic-ai/claude-code安装完之后,先别急着跑claude命令,因为默认配置会直接连官方通道。我们需要先拿到 TaoToken 的 API Key。登录控制台之后,在 API Keys 页面创建一个新的 Key,复制出来备用。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。
拿到 Key 之后,需要确认两件事:Base URL 和 Model ID。Base URL 就是 https://taotoken.net/api ,Model ID 根据你用的模型来填,比如 claude-sonnet-4-20250514 或者 claude-opus-4-20250514。这两个信息在模型对话页面也能查到,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。
接下来是 Claude Code 的配置文件。Claude Code 在 macOS/Linux 下默认读取~/.claude/settings.json,在 Windows 下读取%USERPROFILE%\.claude\settings.json。如果目录不存在就手动创建。这个文件里需要写清楚 env 变量,把 Anthropic 的 base URL 和 auth token 指向 TaoToken。
这里有个坑要注意:Claude Code 的 settings.json 里环境变量名是固定的,不能随便改。你需要用ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN这两个 key。如果你写成别的名字,Claude Code 启动时会报 401 或者直接忽略你的配置。
另外,如果你用的是 Claude Code 的 coding plan 模式,还需要在 settings.json 里加上ANTHROPIC_MODEL指定默认模型。Coding Plan 的入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,开通之后可以拿到对应的模型列表和额度信息。
环境准备好之后,先别急着生成项目。建议先用一个简单的请求验证通道是否通了。你可以用 curl 直接打 TaoToken 的 API:
curl -X POST https://taotoken.net/api/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: 你的TaoToken Key" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 100, "messages": [{"role": "user", "content": "回复 ok"}] }'如果返回里能看到content字段并且有正常的文本,说明 Key 和通道都没问题。如果返回 401,检查 Key 是否复制完整;如果返回 404,检查 Base URL 是否写成了https://taotoken.net/api而不是别的路径。
这一步做完之后,Claude Code 的接入通道就算准备好了。接下来才是重头戏:用 Claude Code 生成 Next.js + shadcn/ui + pgsql 的项目骨架。
3. 可复制配置:settings.json 与 Next.js 项目初始化
这一节给的是可以直接复制的配置片段和命令。先看 Claude Code 的 settings.json 完整内容,路径是~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的TaoTokenKey", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514", "ANTHROPIC_SMALL_FAST_MODEL": "claude-sonnet-4-20250514" }, "permissions": { "allow": [ "Bash(pnpm:*)", "Bash(npx:*)", "Bash(git:*)", "Read", "Write", "Edit" ] } }注意ANTHROPIC_AUTH_TOKEN的值要换成你在控制台创建的那个 Key,不要带引号以外的空格。ANTHROPIC_SMALL_FAST_MODEL是 Claude Code 用来做轻量任务的模型,也指向同一个模型就行,避免因为模型名不对导致后台任务失败。
如果你用的是 Codex 或者 Cline MCP 这类工具,配置方式类似,但文件路径不同。Codex 的 auth.json 通常在~/.codex/auth.json,内容格式是:
{ "openai": { "apiKey": "sk-你的TaoTokenKey", "baseURL": "https://taotoken.net/api" } }Cline MCP 的配置在 VS Code 的 settings.json 里,需要写全三件套:Base URL、Key、Model ID。比如:
{ "cline.mcpServers": { "taotoken": { "command": "npx", "args": ["-y", "@taotoken/mcp-server"], "env": { "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_API_KEY": "sk-你的TaoTokenKey", "TAOTOKEN_MODEL": "claude-sonnet-4-20250514" } } } }配置写完之后,重启终端或者重新加载 VS Code,让环境变量生效。然后验证一下 Claude Code 是否能正常启动:
claude --version claude "回复一句:通道已就绪"如果第二条命令能正常返回文本,说明 Claude Code 已经通过 TaoToken 的通道在跑了。接下来初始化 Next.js 项目。用 create-next-app 生成骨架:
pnpm create next-app@latest fulling-clone --typescript --tailwind --eslint --app --src-dir --import-alias "@/*" cd fulling-clone然后安装 shadcn/ui:
pnpm dlx shadcn@latest init初始化过程中会问你几个问题,比如 style 选 default,base color 选 slate,CSS variables 选 yes。这些按默认来就行。接着添加几个常用组件:
pnpm dlx shadcn@latest add button card input dialog table数据库这边用 pgsql,本地用 Docker 跑一个:
docker run --name fulling-pg -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=fulling -p 5432:5432 -d postgres:16然后在项目里安装 Prisma 或者 Drizzle 作为 ORM。这里我选 Drizzle,因为它的 schema 定义更接近 SQL,AI 生成的时候不容易跑偏:
pnpm add drizzle-orm postgres pnpm add -D drizzle-kit创建src/db/schema.ts,定义一个简单的表:
import { pgTable, serial, text, timestamp } from "drizzle-orm/pg-core"; export const projects = pgTable("projects", { id: serial("id").primaryKey(), name: text("name").notNull(), description: text("description"), createdAt: timestamp("created_at").defaultNow().notNull(), });再创建src/db/index.ts:
import { drizzle } from "drizzle-orm/postgres-js"; import postgres from "postgres"; import * as schema from "./schema"; const client = postgres(process.env.DATABASE_URL!); export const db = drizzle(client, { schema });在.env.local里写上:
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/fulling到这里,项目骨架和数据库连接就都配好了。你可以用 Claude Code 来生成页面和 API 路由,比如让它写一个项目列表页,它会自动引用 shadcn/ui 的组件和 Drizzle 的查询。关键是,所有这些生成请求都会走 TaoToken 的统一 Key 通道,不需要你反复切换配置。
4. 验证请求:一次真实的 Claude Code 生成动作与结果检查
配置写完之后,必须做一次完整的验证,确认 Claude Code 真的在通过 TaoToken 的通道工作,而不是偷偷走了别的 endpoint。验证分两步:先看请求日志,再看生成结果。
第一步,在项目目录下启动 Claude Code:
cd fulling-clone claude进入交互模式后,输入一个明确的生成指令:
请在 src/app/page.tsx 里生成一个项目列表页面,使用 shadcn/ui 的 Card 和 Table 组件,数据从 src/db/schema.ts 的 projects 表读取,用 Drizzle 查询。Claude Code 会开始思考并生成代码。这时候观察终端输出,如果配置正确,它不会报认证错误,也不会提示找不到模型。生成完成后,打开src/app/page.tsx,你应该能看到类似这样的代码:
import { db } from "@/db"; import { projects } from "@/db/schema"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; export default async function Home() { const allProjects = await db.select().from(projects); return ( <div className="container mx-auto py-10"> <Card> <CardHeader> <CardTitle>项目列表</CardTitle> </CardHeader> <CardContent> <Table> <TableHeader> <TableRow> <TableHead>ID</TableHead> <TableHead>名称</TableHead> <TableHead>描述</TableHead> </TableRow> </TableHeader> <TableBody> {allProjects.map((project) => ( <TableRow key={project.id}> <TableCell>{project.id}</TableCell> <TableCell>{project.name}</TableCell> <TableCell>{project.description}</TableCell> </TableRow> ))} </TableBody> </Table> </CardContent> </Card> </div> ); }这段代码能直接跑,说明 Claude Code 不仅理解了 shadcn/ui 的组件用法,还正确引用了 Drizzle 的查询。接下来跑一下开发服务器:
pnpm dev打开http://localhost:3000,如果页面正常渲染出表格(哪怕数据是空的),说明整条链路是通的。你可以在数据库里插一条测试数据:
docker exec -it fulling-pg psql -U postgres -d fulling -c "INSERT INTO projects (name, description) VALUES ('测试项目', '这是一个验证数据');"刷新页面,如果能看到这条数据,说明 Next.js、shadcn/ui、pgsql 和 Claude Code 的接入全部验证通过。
第二步,检查请求是否真的走了 TaoToken。你可以在 TaoToken 控制台的日志页面看到刚才的调用记录,包括模型名、token 消耗和时间戳。如果日志里有记录,说明请求确实经过了统一 Key 通道。这一步很重要,因为有些配置错误会导致 Claude Code 回退到默认通道,而你却不知道。
验证过程中如果遇到问题,先别急着改代码,大概率是配置或者环境变量的问题。下一节列出几个常见的报错和排查方法。
5. 常见报错排查:401、local proxy failed、reading choices 与 OAuth 问题
这一节对照真实报错来排查。以下四个错误是我在接入过程中实际遇到过的,按出现频率排序。
第一个:401 Unauthorized。这个最常见,通常是因为ANTHROPIC_AUTH_TOKEN的值不对。检查三点:Key 是否复制完整(不要漏掉sk-前缀)、settings.json 里是否有拼写错误、环境变量是否被其他配置覆盖。你可以用echo $ANTHROPIC_AUTH_TOKEN确认当前 shell 里的值。如果用的是 Codex 的 auth.json,检查apiKey字段是否写在了正确的层级。
第二个:local proxy failed。这个报错通常出现在你之前配置过本地代理,但代理服务没启动或者端口不对。Claude Code 会读取HTTP_PROXY和HTTPS_PROXY环境变量,如果这两个变量指向了一个不可用的地址,就会报这个错。解决办法是临时取消代理设置:
unset HTTP_PROXY unset HTTPS_PROXY然后重新启动 Claude Code。如果你确实需要代理,确保代理服务在运行,并且地址和端口正确。
第三个:reading choices 相关报错。这个通常是因为返回的 JSON 结构不符合预期,比如模型名写错了,或者 API 版本不匹配。检查ANTHROPIC_MODEL是否写成了 TaoToken 支持的模型 ID。你可以在模型对话页面确认可用的模型列表。另外,anthropic-version请求头必须是2023-06-01,如果这个头不对,也会导致解析失败。
第四个:OAuth 相关报错。Claude Code 在某些版本里会尝试用 OAuth 登录,如果你已经配置了 API Key,但 OAuth 流程被触发,就会冲突。解决办法是在 settings.json 里明确禁用 OAuth:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的TaoTokenKey", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514", "CLAUDE_CODE_DISABLE_OAUTH": "1" } }加完这个环境变量之后,重启 Claude Code,OAuth 就不会再干扰 API Key 认证了。
除了这四个,还有一个容易忽略的问题:文件权限。settings.json 的权限如果是 777,Claude Code 可能会拒绝读取。建议改成 600:
chmod 600 ~/.claude/settings.json排查的时候按顺序来:先确认 Key 和 Base URL,再确认环境变量,最后看网络和权限。大部分问题都在前两步。
6. 长期编码与 Agent 场景:把统一 Key 通道用顺手
项目骨架跑起来之后,接下来就是长期编码和 Agent 场景了。如果你打算用 Claude Code 持续生成代码,或者跑一些自动化的 Agent 任务,建议把 Coding Plan 用起来。入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,开通之后可以拿到更稳定的额度和模型切换能力。
日常使用中,有几个技巧可以让统一 Key 通道更顺手。第一,把常用的模型 ID 记下来,在 settings.json 里配好默认模型和快速模型,避免每次手动切换。第二,如果你同时用 Claude Code 和 Cline MCP,确保两个工具的 Base URL 和 Key 都指向同一个 TaoToken 通道,这样额度是共享的,不用分别管理。第三,定期在控制台看调用日志,如果发现某个模型的错误率偏高,及时换模型。
对于 Agent 场景,比如让 Claude Code 自动跑测试、自动提交代码,建议在 settings.json 的 permissions 里把常用命令加进去,减少每次确认的打断。但要注意,不要给太宽泛的权限,比如Bash(*)这种,容易出问题。按需添加,比如Bash(pnpm test:*)、Bash(git commit:*)。
如果你想把项目部署到 Kubernetes 上,可以参考 fulling 的思路,把 Next.js 应用打包成 Docker 镜像,用 Deployment 和 Service 暴露出来,数据库用 StatefulSet 或者外部 pgsql。这部分内容比较多,后面可以单独写一篇。当前这篇的重点是把本地开发链路跑通,让你能在三周内复现出同款项目骨架。
最后说一个实际经验:AI 生成代码的质量和你的指令清晰度直接相关。指令里写清楚文件路径、组件名、数据来源,生成结果就靠谱很多。如果只写“帮我写个页面”,出来的东西大概率要返工。把 Claude Code 当成一个需要明确需求的搭档,而不是一个许愿池,效率会高很多。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,API Keys 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。配置过程中遇到问题,先对照第五节的报错排查,大部分情况都能解决。