feat: dual LLM mode (default via .env, custom per-request) for AI analysis

This commit is contained in:
hyh
2026-09-04 12:06:05 +08:00
parent 1a935cae6e
commit 4a4c6f2ec2
10 changed files with 154 additions and 63 deletions
+29 -2
View File
@@ -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)