feat: dual LLM mode (default via .env, custom per-request) for AI analysis
This commit is contained in:
+29
-2
@@ -1,3 +1,4 @@
|
||||
import json
|
||||
import logging
|
||||
|
||||
from django.db import transaction
|
||||
@@ -12,6 +13,26 @@ from .models import Requirement, Submission
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _parse_llm_override(request) -> dict:
|
||||
raw = request.data.get("llm")
|
||||
if not raw:
|
||||
return {}
|
||||
if isinstance(raw, str):
|
||||
try:
|
||||
raw = json.loads(raw)
|
||||
except json.JSONDecodeError:
|
||||
return {}
|
||||
return raw if isinstance(raw, dict) else {}
|
||||
|
||||
|
||||
def _validate_llm_override(override: dict) -> str | None:
|
||||
if override.get("mode") != "custom":
|
||||
return None
|
||||
if not (override.get("base_url") or "").strip() or not (override.get("model") or "").strip():
|
||||
return "custom 模式必须提供 llm.base_url 和 llm.model"
|
||||
return None
|
||||
|
||||
|
||||
@api_view(["POST"])
|
||||
@permission_classes([IsAuthenticated])
|
||||
@transaction.atomic
|
||||
@@ -20,13 +41,19 @@ def create_requirement(request):
|
||||
content = (request.data.get("content") or "").strip()
|
||||
if not title or not content:
|
||||
return Response({"detail": "title 和 content 不能为空"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
override = _parse_llm_override(request)
|
||||
err = _validate_llm_override(override)
|
||||
if err:
|
||||
return Response({"detail": err}, status=status.HTTP_400_BAD_REQUEST)
|
||||
try:
|
||||
spec = analyze_requirements(content)
|
||||
spec = analyze_requirements(content, override)
|
||||
except Exception:
|
||||
logger.exception("AI 分析作业要求失败, 使用默认检测计划")
|
||||
from .llm import _default_spec
|
||||
spec = _default_spec()
|
||||
requirement = Requirement.objects.create(title=title, content=content, spec=spec)
|
||||
requirement = Requirement.objects.create(
|
||||
title=title, content=content, spec=spec, llm_config=override,
|
||||
)
|
||||
from .serializers import RequirementSerializer
|
||||
return Response(RequirementSerializer(requirement).data, status=status.HTTP_201_CREATED)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user