feat(ai-improve): 添加题目详情并优化代码结构

-增加了获取题目详情的功能,如果提供了 problemId
- 重构了代码,使其更具可读性和可维护性
- 添加了注释,以提高代码的可理解性
- 优化了提示词,以获得更好的 AI 优化建议
This commit is contained in:
fly6516 2025-05-16 02:07:34 +08:00
parent fabdb7c17a
commit ebea5c986e
2 changed files with 69 additions and 34 deletions

View File

@ -1,42 +1,75 @@
"use server";
import {
OptimizeCodeInput,
OptimizeCodeOutput,
OptimizeCodeOutputSchema
OptimizeCodeOutputSchema,
} from "@/types/ai-improve";
import { openai } from "@/lib/ai";
import { CoreMessage, generateText } from "ai";
import { prisma } from "@/lib/prisma"; // Prisma客户端
/**
* AI优化代码
* @param input ID的输入
* @returns
*/
export const optimizeCode = async (
input: OptimizeCodeInput
): Promise<OptimizeCodeOutput> => {
const model = openai("gpt-4o-mini");
const prompt = `
Analyze the following programming code for potential errors, inefficiencies or code style issues.
Provide an optimized version of the code with explanations. Focus on:
1. Fixing any syntax errors
2. Improving performance
3. Enhancing code readability
4. Following best practices
Original code:
\`\`\`
${input.code}
\`\`\`
Error message (if any): ${input.error || "No error message provided"}
Respond ONLY with the JSON object containing the optimized code and explanations.
Format:
{
"optimizedCode": "optimized code here",
"explanation": "explanation of changes made",
"issuesFixed": ["list of issues fixed"]
// 获取题目详情如果提供了problemId
let problemDetails = "";
if (input.problemId) {
try {
const problem = await prisma.problem.findUnique({
where: { problemId: input.problemId },
});
if (problem) {
problemDetails = `
Problem Requirements:
-------------------
Description: ${problem.description}
Input: ${problem.inputSpec}
Output: ${problem.outputSpec}
Test Cases: ${JSON.stringify(problem.testCases)}
`;
}
} catch (error) {
console.error("Failed to fetch problem details:", error);
}
}
`;
// 构建AI提示词
const prompt = `
Analyze the following programming code for potential errors, inefficiencies or code style issues.
Provide an optimized version of the code with explanations. Focus on:
1. Fixing any syntax errors
2. Improving performance
3. Enhancing code readability
4. Following best practices
Original code:
\`\`\`
${input.code}
\`\`\`
Error message (if any): ${input.error || "No error message provided"}
${problemDetails}
Respond ONLY with the JSON object containing the optimized code and explanations.
Format:
{
"optimizedCode": "optimized code here",
"explanation": "explanation of changes made",
"issuesFixed": ["list of issues fixed"]
}
`;
// 发送请求给OpenAI
const messages: CoreMessage[] = [{ role: "user", content: prompt }];
let text;
try {
const response = await generateText({
@ -49,6 +82,7 @@ export const optimizeCode = async (
throw new Error("Failed to generate response from OpenAI");
}
// 解析LLM响应
let llmResponseJson;
try {
const cleanedText = text.trim();
@ -59,13 +93,12 @@ export const optimizeCode = async (
throw new Error("Invalid JSON response from LLM");
}
const validationResult =
OptimizeCodeOutputSchema.safeParse(llmResponseJson);
// 验证响应格式
const validationResult = OptimizeCodeOutputSchema.safeParse(llmResponseJson);
if (!validationResult.success) {
console.error("Zod validation failed:", validationResult.error.format());
throw new Error("Response validation failed");
}
return validationResult.data;
};
};

View File

@ -1,17 +1,19 @@
import { z } from "zod";
// 优化代码的输入类型
export const OptimizeCodeInputSchema = z.object({
code: z.string(),
error: z.string().optional(),
code: z.string(), // 用户输入的代码
error: z.string().optional(), // 可选的错误信息
problemId: z.string().optional(), // 可选的题目ID
});
export type OptimizeCodeInput = z.infer<typeof OptimizeCodeInputSchema>;
// 优化代码的输出类型
export const OptimizeCodeOutputSchema = z.object({
optimizedCode: z.string(),
explanation: z.string(),
issuesFixed: z.array(z.string()).optional(),
optimizedCode: z.string(), // 优化后的代码
explanation: z.string(), // 优化说明
issuesFixed: z.array(z.string()).optional(), // 修复的问题列表
});
export type OptimizeCodeOutput = z.infer<typeof OptimizeCodeOutputSchema>;