code.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. """代码执行API"""
  2. import uuid
  3. from datetime import datetime
  4. from typing import Optional
  5. from fastapi import APIRouter
  6. from pydantic import BaseModel
  7. from ...services.code_executor import get_executor
  8. from ...agents.review_agent import get_review_agent
  9. from ...services.data_store import data_store
  10. from ...models.learning import CodeSubmission
  11. router = APIRouter(prefix="/code", tags=["代码执行"])
  12. class CodeRequest(BaseModel):
  13. """代码执行请求"""
  14. code: str
  15. language: str = "python"
  16. class CodeResponse(BaseModel):
  17. """代码执行响应"""
  18. success: bool
  19. output: str
  20. error: str
  21. exit_code: int
  22. class CodeSubmitRequest(BaseModel):
  23. """代码提交审查请求"""
  24. code: str
  25. language: str = "python"
  26. output: str = ""
  27. error: str = ""
  28. success: bool = True
  29. exit_code: int = 0
  30. user_id: str = "default"
  31. lesson_id: Optional[str] = None
  32. class CodeSubmitResponse(BaseModel):
  33. """代码提交审查响应"""
  34. feedback: str
  35. submission_id: str
  36. created_at: str
  37. @router.post("/execute", response_model=CodeResponse)
  38. async def execute_code(request: CodeRequest):
  39. """执行代码"""
  40. executor = get_executor()
  41. result = executor.execute(request.code, request.language)
  42. return CodeResponse(
  43. success=result["success"],
  44. output=result["output"],
  45. error=result["error"],
  46. exit_code=result["exit_code"],
  47. )
  48. @router.post("/submit", response_model=CodeSubmitResponse)
  49. async def submit_code(request: CodeSubmitRequest):
  50. """提交代码进行AI审查"""
  51. # 调用 ReviewAgent 进行练习反馈
  52. review_agent = get_review_agent()
  53. feedback = review_agent.review_exercise(request.code, context={
  54. "output": request.output,
  55. "error": request.error,
  56. "success": request.success,
  57. "exit_code": request.exit_code,
  58. "lesson_id": request.lesson_id,
  59. })
  60. # 构建提交记录
  61. submission_id = str(uuid.uuid4())
  62. created_at = datetime.now()
  63. submission = CodeSubmission(
  64. id=submission_id,
  65. user_id=request.user_id,
  66. code=request.code,
  67. language=request.language,
  68. output=request.output,
  69. error=request.error,
  70. success=request.success,
  71. exit_code=request.exit_code,
  72. lesson_id=request.lesson_id,
  73. feedback=feedback,
  74. created_at=created_at,
  75. )
  76. # 持久化
  77. data_store.save_submission(submission)
  78. return CodeSubmitResponse(
  79. feedback=feedback,
  80. submission_id=submission_id,
  81. created_at=created_at.isoformat(),
  82. )