1. 为什么我要用 Vibe Coding 搭一个 C17 在线判题系统在线判题系统Online Judge简称 OJ是每个学编程的人都绕不开的东西你提交一段 C17 代码后台编译、跑测试用例、比对输出、返回 AC/WA/TLE。听起来像是一个大厂内部系统但真动手写核心逻辑其实没那么玄乎——难的是环境、编译参数、沙箱隔离、上下文管理这些琐碎活儿。我这次想聊的不是如何从零手写一个 OJ而是用 Vibe Coding 的方式在 OpenCode 这个终端 AI 编程工具里把 C17 判题系统的最小可用版本跑起来。所谓 Vibe Coding就是你用自然语言描述意图AI 帮你补全代码、改配置、查报错你负责把关方向。它特别适合 OJ 这种逻辑清晰但细节多的项目。这篇文章面向三类人一是刚接触 AI CLI 工具、想找个真实项目练手的开发者二是写过 C 但没搭过判题服务的同学三是已经在用 OpenCode但不知道怎么管理上下文、怎么让 AI 记住项目约定的朋友。读完之后你应该能拿到一份可复制的settings.json骨架、一段 OpenCode 配置片段并且亲手启动判题服务、提交一份样例代码看到结果。整个流程我会拆成六块先讲清楚问题和场景再准备 TaoToken 作为模型接入层然后给可复制的配置接着验证请求再排常见错误最后按不同需求分流到对应的入口。全程命令和参数都能直接抄。2. 前置准备Node.js、npm 与 TaoToken 接入2.1 Node.js 和 npm 到底在干嘛OpenCode 是用 Node.js 写的 CLI 工具所以你得先有 Node.js 运行时。打个比方Node.js 就像 Python 解释器npm 就像 pip。你装完 Node.jsnode和npm两个命令就都有了。Linux以 Ubuntu 24.04 为例下系统自带的 apt 源版本往往偏低建议引入 NodeSource 源装 v24curl -sL https://deb.nodesource.com/setup_24.x | sudo -E bash - sudo apt install -y nodejs node -v npm -vWindows 11 更简单去 Node.js 官网下载 LTS 安装包一路 Next然后在 PowerShell 里node -v验证即可。装完确认版本号在 v20 以上否则 OpenCode 可能跑不起来。2.2 安装 OpenCodeOpenCode 通过 npm 全局安装Windows 和 Linux 命令一致sudo npm i -g opencode-ai opencode --version装完之后先别急着写代码。OpenCode 的工作目录就是你运行opencode命令时所在的目录它默认只能操作这个目录及其子目录。所以正确姿势是先建项目目录cd进去再启动。mkdir cpp17-judge cd cpp17-judge opencode2.3 为什么模型接入层选 TaoTokenOpenCode 本身不带模型你得给它接一个模型提供方。TaoToken 在这里扮演的是统一模型接入层的角色你拿到一个 API Key就能在 OpenCode 里配置模型不用为每个模型单独折腾一套鉴权。具体操作登录 TaoToken 控制台在 API Keys 页面创建一个 Key复制保存。这个 Key 后面会写进 OpenCode 的配置里。控制台地址是 https://taotoken.net/console API 端点是 https://taotoken.net/api 注意 API 地址后面不加任何多余路径。提示API Key 只显示一次创建后立刻保存到本地密码管理器或环境变量里别直接提交到 Git。如果你还没决定用哪个模型可以先在模型对话页面试一下手感确认响应速度和代码能力符合预期再写进配置。模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel_chat3. 可复制配置settings.json 骨架与 OpenCode 片段3.1 项目目录结构先把判题系统的骨架搭出来。最小可用版本我建议这样分cpp17-judge/ ├── settings.json # 判题服务配置 ├── AGENTS.md # 给 OpenCode 的项目约定持久上下文 ├── src/ │ ├── server.js # 判题 HTTP 服务 │ └── judge.js # 编译 运行 比对逻辑 ├── submissions/ # 用户提交的代码 ├── testcases/ # 测试用例 │ └── a-plus-b/ │ ├── 1.in │ ├── 1.out │ ├── 2.in │ └── 2.out └── package.json3.2 settings.json 骨架这份配置定义了判题服务的端口、编译参数、超时和内存限制。C17 的关键是-stdc17别写成-stdc1z那种老写法。{ server: { port: 3000, host: 127.0.0.1 }, judge: { compiler: g, compileFlags: [-stdc17, -O2, -Wall, -static], timeLimitMs: 2000, memoryLimitMb: 256, outputLimitKb: 1024, workDir: ./submissions, testcaseDir: ./testcases }, model: { provider: taotoken, baseUrl: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY, modelName: your-model-name } }几个参数值得单独说-static让编译产物静态链接避免运行环境缺库timeLimitMs设 2000 是给 C 留足余量实际判题可以按题目调整memoryLimitMb在 Linux 下配合ulimit或 cgroup 生效Windows 下需要另想办法。3.3 OpenCode 配置片段OpenCode 的模型配置可以写在项目根目录的配置文件里也可以通过命令面板交互式接入。推荐前者方便版本管理。把 API Key 放进环境变量配置文件里只引用变量名export TAOTOKEN_API_KEYsk-你的key然后在 OpenCode 里通过ctrla进入 model provider 选择界面选 TaoToken粘贴 Key模型就接入了。如果你想让配置持久化可以在 OpenCode 的配置目录里写{ provider: { taotoken: { type: openai-compatible, baseURL: https://taotoken.net/api, apiKey: {env:TAOTOKEN_API_KEY} } }, model: taotoken/your-model-name }{env:TAOTOKEN_API_KEY}这种写法让 OpenCode 从环境变量读取避免明文写 Key。接入文档里有更完整的字段说明遇到字段不识别可以去查https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc3.4 AGENTS.md让 AI 记住项目约定这是 Vibe Coding 里最容易被忽略、但最影响体验的一环。OpenCode 会把AGENTS.md的内容作为系统提示词的一部分相当于给 AI 一份项目说明书。我建议至少写清楚这几条# 项目约定 - 语言标准C17编译命令固定为 g -stdc17 -O2 -Wall -static - 判题结果枚举AC / WA / TLE / MLE / RE / CE - 服务框架Node.js 原生 http 模块不引入 Express - 所有用户提交代码写入 submissions/文件名用 submission_id.cpp - 测试用例目录结构testcases/problem-id/case.in 和 .out - 不要修改 settings.json 里的 compileFlags除非我明确要求有了这份约定你后面让 AI 改代码时它不会突然给你换成 C20也不会自作主张引入一堆依赖。这就是上下文管理的第一层用文件固化长期约定。4. 启动判题服务并提交样例代码4.1 用 OpenCode 生成判题核心逻辑进入项目目录启动 OpenCodecd cpp17-judge opencode在 OpenCode 里用Tab键切到 Build Agent能改代码的那个然后输入你的意图。比如请实现 src/judge.js导出一个 judge(submissionPath, testcaseDir) 函数。 要求用 child_process 调用 g 编译编译失败返回 CE 并带上 stderr 编译成功后逐个跑测试用例用 spawn 执行可执行文件超时 2000ms 返回 TLE 比对 stdout 和 .out 文件忽略行尾空格不一致返回 WA。OpenCode 会生成代码你审一遍逻辑重点看超时处理和输出比对。如果它用了exec而不是spawn让它改——exec不方便做超时 kill。4.2 启动服务src/server.js用 Node.js 原生http模块起一个 POST 接口接收代码和题目 IDconst http require(http); const fs require(fs); const path require(path); const { judge } require(./judge); const settings require(../settings.json); const server http.createServer(async (req, res) { if (req.method ! POST || req.url ! /submit) { res.writeHead(404); return res.end(not found); } let body ; req.on(data, chunk body chunk); req.on(end, async () { const { problemId, code } JSON.parse(body); const submissionPath path.join( settings.judge.workDir, submission_${Date.now()}.cpp ); fs.writeFileSync(submissionPath, code); const result await judge(submissionPath, path.join(settings.judge.testcaseDir, problemId)); res.writeHead(200, { Content-Type: application/json }); res.end(JSON.stringify(result)); }); }); server.listen(settings.server.port, settings.server.host, () { console.log(judge server on http://${settings.server.host}:${settings.server.port}); });启动node src/server.js看到judge server on http://127.0.0.1:3000就说明服务起来了。4.3 准备测试用例以经典的 AB 为例testcases/a-plus-b/1.in1 21.out3再补一组边界用例2.in写-1000000 10000002.out写0。4.4 提交样例代码验证另开一个终端用 curl 提交curl -X POST http://127.0.0.1:3000/submit \ -H Content-Type: application/json \ -d { problemId: a-plus-b, code: #include iostream\nint main(){long long a,b;std::cinab;std::coutabstd::endl;return 0;} }预期返回{status:AC,passed:2,total:2,timeMs:12}如果返回CE看返回体里的stderr字段通常是头文件或语法问题。如果返回WA检查输出比对逻辑是不是把换行也算进去了。5. 本篇常见错误排查5.1 编译报错g 找不到或版本太低现象提交后立刻返回 CEstderr 里写g: command not found或error: unrecognized command-line option -stdc17。原因系统没装 g或者版本低于 5.0C17 需要 g 5 以上完整支持建议 g 9。解决g --version sudo apt install -y g build-essentialUbuntu 24.04 默认源里的 g 版本足够新一般不会踩这个坑。5.2 超时误判TLE 但本地跑得飞快现象本地手动跑可执行文件 10ms 出结果判题服务却返回 TLE。原因spawn的超时计时从进程创建开始算如果编译产物是动态链接、首次加载慢或者测试用例输入很大都可能超。另外如果你在judge.js里用了setTimeout但没kill子进程超时后进程还在跑会污染后续用例。解决确认超时后调用child.kill(SIGKILL)并且把timeLimitMs按题目难度调整别一刀切 1000ms。5.3 上下文爆炸AI 开始答非所问现象聊了十几轮之后OpenCode 生成的代码开始偏离项目约定比如突然用 C20 的std::format或者把settings.json的字段名改了。原因上下文窗口被历史对话塞满LLM 注意力分散。这是 Vibe Coding 最典型的坑。解决三个动作配合使用。第一把关键约定写进AGENTS.md让它作为系统提示词常驻第二用/compact压缩当前会话把历史总结成摘要第三针对新功能点用/new开新会话别在一个 session 里从判题逻辑聊到前端页面。5.4 模型接入失败401 或 model not found现象OpenCode 里发消息报鉴权错误或者提示模型不存在。原因API Key 没设进环境变量或者baseURL写错比如多加了/v1或者模型名和 TaoToken 控制台里的不一致。解决先echo $TAOTOKEN_API_KEY确认变量有值再检查配置里的baseURL是不是https://taotoken.net/api不要带多余路径最后核对模型名。如果还不行去 API Keys 页面重新生成一个 Key 试试https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi_keys5.5 工作目录搞错OpenCode 改不到文件现象让 OpenCode 改src/judge.js它说找不到文件或者改到了别的地方。原因启动opencode时不在项目根目录。OpenCode 只能操作工作目录内部的内容。解决退出cd到项目根目录重新opencode。养成习惯先pwd确认位置再启动。6. 按需求分流接下来该往哪走跑通最小判题流程之后你的下一步取决于目标。如果你是想长期用 AI 辅助写代码、搭 Agent 工作流那 Coding Plan 更适合你它针对持续编码场景做了上下文和额度的优化https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding_plan如果你只是想先验证某个模型写 C 判题逻辑靠不靠谱直接在模型对话里贴代码片段试就行不用配 OpenCodehttps://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel_chat如果你在接入过程中卡在鉴权或字段配置上先看接入文档大部分报错都有对应说明https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc如果你用的是 Claude Code 那套工作流想对比一下配置方式可以看这个入口https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude_code最后说个我自己的习惯每次开新功能点之前先花两分钟更新AGENTS.md把这次要遵守的约定写进去再/new开一个干净会话。这样 AI 不会带着上一轮的包袱干活判题系统的编译参数和结果枚举也不会莫名其妙被改掉。上下文管理这件事工具给了你/compact和/new但真正决定效果的是你有没有把项目约定固化下来。
企业数字化 ERP 产品动态
相关推荐
智能编程助手 Claude Code 配 TaoToken:settings.json 骨架与终端报错排查 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 13:55:08
福州短视频seo平台选型避坑:3个核心维度定性能优化生死 福州短视频seo平台选型避坑:3个核心维度定性能优化生死 改个需求建站公司拖一周,这大概是福州做短视频SEO平台的朋友最头疼的事。你急着上线一个落地页,那边技术说在排期,等你拿到代码,服务器响应慢得像老牛拉破车,流量全跑了。这时候你才意识到… · 2026/9/27 13:54:19
毕业设计网站开发流程详细步骤 新手入门看这篇:毕业设计网站开发全流程与避坑指南 找建站公司怕被坑高价?别慌。很多大学生和新手入门开发者在准备毕业设计时,第一反应就是找外包或者买源码,结果花了冤枉钱,代码还跑不起来。其实,只要理清思路,自己动手或者精准外包,成本能降一大半… · 2026/9/27 14:36:30
Trae AI IDEA安装与使用:TaoToken统一Key接入与settings.json配置骨架 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 14:36:18
做网站会员登陆图解步骤:3步搞定高转化入口 做网站会员登陆图解步骤:3步搞定高转化入口 别再盯着那些千篇一律的模板网站看了。说实话,大多数企业官网的会员登录入口,要么藏在页脚角落没人点,要么设计得像个二维码广告,丑得让人不想点。很多老板觉得,网站嘛,能看就行,会员系统那是大公司才玩的… · 2026/9/27 14:36:18
网站开发如何收费?拆透建站报价单里的猫腻 网站开发如何收费?拆透建站报价单里的猫腻 域名服务器搞不懂,是不是让你在看建站报价单时心里直打鼓?别急,这行水太深,很多小白刚接触就被各种名词绕晕,生怕被坑。今天咱就掰开了揉碎了,把【网站开发如何收费】这件事讲得明明白白,让你拿到【建站报价… · 2026/9/27 14:36:06
2025年8月国产大模型综合评测:5大维度TOP10榜单与TaoToken接入配置指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 14:36:06
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01