AI 时代 OJ 设计的 2a:先把现有提示记下来,为后面的分级和两段式诊断攒对照数据。
提示本身的行为不变,发给模型的 prompt 一字未改。
- 迁移 0017 建 ai_hint:模型、prompt 版本、内容、错误、耗时、学生评价;
成功和失败都记(失败率是 AI 悄悄变差时最先动的数)。挂在 submission 上 CASCADE
- streamChat 第三个参数改成 { onComplete, onError }:onComplete 的返回值并进
done 事件,提示 id 由此带回前端;班级学情分析那处调用同步改写,行为不变
- 落库失败只记日志,不影响学生拿到提示
- 新增 POST /ai/hint/:id/feedback:只能评自己的提示(别人的一律 404),可以改票
- 前端提示生成完出「有帮助 / 没帮助」,选中的高亮;后端没存上时不出按钮
- 实跑:本地假 LLM 验证成功 / provider 断开 / 缺 AI_KEY 三条路径的落库,
评价接口六种请求,浏览器里按钮出现、改票、重复点不发请求
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -123,6 +123,12 @@ export const HINT_MIN_FAILURES = 3
|
||||
|
||||
export const aiHintRequestSchema = z.object({ submissionId: z.string().min(1) })
|
||||
|
||||
/**
|
||||
* 学生对一条 AI 提示的评价(POST /ai/hint/:id/feedback)。提示的 id 由 /ai/hint 流的
|
||||
* `done` 事件带回来。可以改票,以最后一次为准。
|
||||
*/
|
||||
export const aiHintFeedbackRequestSchema = z.object({ helpful: z.boolean() })
|
||||
|
||||
export const classAnalysisRequestSchema = z.object({
|
||||
comparison: z.record(z.string(), z.unknown()),
|
||||
})
|
||||
@@ -181,6 +187,7 @@ export type LoginSummary = z.infer<typeof loginSummarySchema>
|
||||
|
||||
export type AiAnalysisRequest = z.infer<typeof aiAnalysisRequestSchema>
|
||||
export type AiHintRequest = z.infer<typeof aiHintRequestSchema>
|
||||
export type AiHintFeedbackRequest = z.infer<typeof aiHintFeedbackRequestSchema>
|
||||
export type ClassAnalysisRequest = z.infer<typeof classAnalysisRequestSchema>
|
||||
export type ClassPkAnalysisRequest = z.infer<
|
||||
typeof classPkAnalysisRequestSchema
|
||||
|
||||
Reference in New Issue
Block a user