Files
OJ2/docker/.env.example
yuetsh 06ad6745b7
Some checks failed
Deploy / deploy (push) Has been cancelled
feat(AI 提示): 两段式提示——先诊断出错误标签,再生成提示
AI 时代 OJ 设计的 2b。标准答案能让提示准得多,但不能进生成提示的 prompt
(学生代码里一段注释就能把它套走),所以拆成两段:
- 诊断:看得到标准答案、第一个没过的测试点、带行号的学生代码;出参只允许
  { tag, lines, confidence },safeParse 过闸、多余字段剥掉,没有自由文本通道
- 生成提示:看不到标准答案和测试点原文,只多一句「问题定位:X,大约在第 a 行」
- 诊断失败(20 秒超时、不是 JSON、校验不过)退回单段式;同一条提交复用诊断;
  编译失败不诊断
- 契约新增 HINT_ERROR_TAGS(13 个,落库值,只增不改)与 hintDiagnosisSchema
- 迁移 0018:ai_hint 加 diagnosis / diagnosis_error 两列
- 单段式 prompt 原样搬进 services/hint-diagnosis.ts,记版本 1;两段式记版本 2
- completeChat 支持 JSON 模式和自定义超时,现有调用不受影响
- 开关 AI_HINT_DIAGNOSE 默认关(2a 的基线还在攒),两套生产 compose 透传

实跑(一次性库 + 本地假 LLM):开关关时请求与 2a 逐字节相同;开时正常 /
复用 / 坏 JSON / 非法标签 / 行号越界 / 超时 / 编译失败七种场景符合预期;
12 次模型请求里诊断全都带标准答案和测试点,生成全都不带。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 06:56:38 -06:00

76 lines
3.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署用的环境变量。拷成 .env服务器或 .env.school机房后填。
#
# cp docker/.env.example docker/.env
#
# 仓库里不留任何真实密钥。带 `:?` 的变量没设置时 docker compose 会直接报错退出,
# 不会静默起一个用弱默认值的服务。
# 数据库口令。机房那套连的是服务器的库,两边必须一致。
POSTGRES_PASSWORD=
# 判题机 token。后端和判题机容器读的是同一个变量自己生成
# openssl rand -hex 32
OJ2_JUDGE_TOKEN=
# 判题并发。受判题沙箱能力限制,不是越大越好。
# 服务器 2机房机器宽裕可以给 4。
JUDGE_CONCURRENCY=2
# DeepSeek key用于题解 AI 分析。留空则 AI 功能不可用(其余功能不受影响)。
AI_KEY=
# AI 提示走两段式(先诊断、再生成)。填 1 打开,留空为关。
# 服务器和机房共用一个库、各有各的 .env —— 两边要一起开关,不然 ai_hint 里两种口径的数据混在一起。
AI_HINT_DIAGNOSE=
# --- 数据在哪 ---
#
# 这三个变量决定新栈是「自带 postgres/redis」还是「接着用旧栈的」。
#
# DATA_DIR 是所有数据卷的根(库、测试点、上传的图片、判题机日志)。
# **不设的话默认是 `../data`,也就是 `OJ2/data` —— 不是部署目录的 `data/`。**
# 沿用旧数据时必须写成旧目录的绝对路径,例如服务器上:
#
# DATA_DIR=/root/OJDeploy/data
#
# 不设它就等于开一套空数据:空库(站点没有用户没有题)、没有测试点、题面图片 404。
DATA_DIR=
# 库和 redis 的位置。留空 = 用本 compose 自己起的容器(要加 `--profile local-data`)。
# 沿用旧栈那两个容器时这样填(它们已经把端口发布在宿主机上了):
#
# DB_HOST=host.docker.internal
# DB_PORT=5445
# REDIS_HOST=host.docker.internal
# REDIS_PORT=5446
#
# host.docker.internal 由 compose 里的 extra_hosts 映射到 host-gateway不出本机。
# 机房那套没有本地库DB_HOST 不填时默认指向服务器(默认值在 compose.school.yml 里)。
DB_HOST=
DB_PORT=
REDIS_HOST=
REDIS_PORT=
# --- 并行试跑oj2.xuyue.cc才需要 ---
#
# 新站和旧站同时跑的时候,这两个必须设,否则会跟旧栈抢资源。
#
# 对外端口。旧 backend 占着 8080机房 81新栈换一个NPM 那边把
# oj2.xuyue.cc 指到这个端口。**NPM 的记录要打开 Websockets Support**
# 否则学生那边「判题中…」永远不动。
WEB_PORT=
# 判题机的运行状态目录。不设的话是 `$DATA_DIR/judge_server`,和旧判题机同一份 ——
# 试跑期间两个 judger 都在跑,必须分开,例如:
#
# JUDGE_STATE_DIR=/root/OJDeploy/data/judge_server_oj2
#
# 建完记得 `mkdir -p .../{log,run}`。
# `test_case` 和 `public/upload` 仍然共享,那是**故意的** —— 测试点和题面图片
# 两边必须看到同一份。
JUDGE_STATE_DIR=
# --- 只有机房那套需要 ---
# 机房走 http 直连 IP没有 TLS必须 false否则 Cookie 发不回来。
COOKIE_SECURE=false