ai_plan.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. """AI Plan Generation router (P3-M3).
  2. Endpoints for generating simulation plans from natural language
  3. using Kimi k3 model, with L0 pre-screening validation.
  4. """
  5. from typing import Dict, Any, Optional, List
  6. from fastapi import APIRouter, HTTPException
  7. from pydantic import BaseModel, Field
  8. from ..services.plan_generator import get_plan_generator
  9. router = APIRouter(prefix="/api/ai-plan", tags=["AI Plan Generation"])
  10. class GeneratePlanRequest(BaseModel):
  11. """Request to generate a plan from natural language."""
  12. requirement: str = Field(..., description="Natural language simulation requirement")
  13. project_context: Optional[Dict[str, Any]] = Field(default=None, description="Optional project context")
  14. existing_experience: Optional[List[Dict[str, Any]]] = Field(default=None, description="Optional similar experience cases")
  15. class RefinePlanRequest(BaseModel):
  16. """Request to refine an existing plan."""
  17. original_plan: Dict[str, Any] = Field(..., description="The previously generated plan")
  18. feedback: str = Field(..., description="Natural language feedback for refinement")
  19. @router.post("/generate")
  20. def generate_plan(request: GeneratePlanRequest):
  21. """Generate a simulation plan from natural language.
  22. Uses Kimi k3 model to convert natural language requirements into
  23. a structured simulation plan, with L0 pre-screening validation.
  24. """
  25. try:
  26. generator = get_plan_generator()
  27. result = generator.generate(
  28. user_requirement=request.requirement,
  29. project_context=request.project_context,
  30. existing_experience=request.existing_experience,
  31. )
  32. return result
  33. except RuntimeError as e:
  34. raise HTTPException(status_code=503, detail=str(e))
  35. except Exception as e:
  36. raise HTTPException(status_code=500, detail=f"Plan generation failed: {str(e)}")
  37. @router.post("/refine")
  38. def refine_plan(request: RefinePlanRequest):
  39. """Refine an existing plan based on user feedback."""
  40. try:
  41. generator = get_plan_generator()
  42. result = generator.refine_plan(
  43. original_plan=request.original_plan,
  44. user_feedback=request.feedback,
  45. )
  46. return result
  47. except RuntimeError as e:
  48. raise HTTPException(status_code=503, detail=str(e))
  49. except Exception as e:
  50. raise HTTPException(status_code=500, detail=f"Plan refinement failed: {str(e)}")
  51. @router.get("/templates")
  52. def list_templates():
  53. """List available plan generation prompt templates."""
  54. return {
  55. "templates": [
  56. {
  57. "name": "generate",
  58. "path": "prompts/plan_generation/generate.txt",
  59. "description": "Natural language to structured simulation plan",
  60. }
  61. ],
  62. "model": "kimi-k3",
  63. "endpoint": "https://api.kimi.com/coding/v1",
  64. }