huangzhichao 1 месяц назад
Родитель
Сommit
0a2449fd1f
8 измененных файлов с 90 добавлено и 2 удалено
  1. 2 0
      .gitignore
  2. 5 0
      app/api/deps.py
  3. 8 2
      app/api/routes.py
  4. 15 0
      app/providers/audit_provider.py
  5. 6 0
      app/schemas/base.py
  6. 13 0
      app/services/audit_service.py
  7. 1 0
      requirements.txt
  8. 40 0
      script/audit.py

+ 2 - 0
.gitignore

@@ -24,3 +24,5 @@ logs/
 
 .env.local
 note
+
+script/*

+ 5 - 0
app/api/deps.py

@@ -6,6 +6,8 @@ from ..services.speech_service import SpeechService
 from ..services.vl_service import VLService
 from ..services.evaluation_service import EvaluationService
 from ..services.evaluation_service import EvaluationProvider
+from ..services.audit_service import AuditService
+from ..providers.audit_provider import CreativeAuditProvider
 
 
 def get_speech_service() -> SpeechService:
@@ -21,3 +23,6 @@ def get_copywriting_evaluation_service() -> EvaluationService:
     provider = EvaluationProvider()
     return EvaluationService(provider)
 
+def get_audit_service() -> AuditService:
+    provider = CreativeAuditProvider()
+    return AuditService(provider)

+ 8 - 2
app/api/routes.py

@@ -1,9 +1,10 @@
 from fastapi import APIRouter, Depends
-from .deps import get_speech_service, get_understand_image_service, get_copywriting_evaluation_service
-from ..schemas.base import DataResponse, TextToSpeechRequest, UnderstandImageRequest, CopywritingEvaluationRequest, BusinessLicenseExtractRequest
+from .deps import get_speech_service, get_understand_image_service, get_copywriting_evaluation_service, get_audit_service
+from ..schemas.base import DataResponse, TextToSpeechRequest, UnderstandImageRequest, CopywritingEvaluationRequest, BusinessLicenseExtractRequest, AuditRequest
 from ..services.speech_service import SpeechService
 from ..services.vl_service import VLService
 from ..services.evaluation_service import EvaluationService
+from ..services.audit_service import AuditService
 
 router = APIRouter()
 
@@ -27,3 +28,8 @@ def extract_business_license(req: BusinessLicenseExtractRequest, service: VLServ
 @router.post('/llm/copywriting-evaluation', response_model=DataResponse, tags=["llm"])
 def copywriting_evaluation(req: CopywritingEvaluationRequest, service: EvaluationService = Depends(get_copywriting_evaluation_service)):
     return service.copywriting_evaluation(req)
+
+
+@router.post('/llm/audit/creative', response_model=DataResponse, tags=["llm"])
+def creative_audit(req: AuditRequest, service: AuditService = Depends(get_audit_service)):
+    return service.creative_audit(req)

+ 15 - 0
app/providers/audit_provider.py

@@ -0,0 +1,15 @@
+from ..schemas.base import DataResponse
+
+class CreativeAuditProvider:
+    def __init__(self) -> None:
+        pass
+
+    def creative_audit(
+      self,
+      *,
+      audit_rules: list[str],
+      audit_list: list[str],
+      validation_rules: list[str]
+    ) -> DataResponse:
+        # Implementation for creative audit
+        pass

+ 6 - 0
app/schemas/base.py

@@ -70,3 +70,9 @@ class CopywritingEvaluationRequest(BaseModel):
     image_url: str
     text: str
     model: str
+
+
+class AuditRequest(BaseModel):
+    audit_rules: List[str]
+    audit_list: List[str]
+    validation_rules: List[str]

+ 13 - 0
app/services/audit_service.py

@@ -0,0 +1,13 @@
+from ..schemas.base import DataResponse, AuditRequest
+from ..providers.audit_provider import CreativeAuditProvider
+
+class AuditService:
+    def __init__(self, provider: CreativeAuditProvider) -> None:
+        self._provider = provider
+
+    def creative_audit(self, req: AuditRequest) -> DataResponse:
+        return self._provider.creative_audit(
+            audit_rules=req.audit_rules,
+            audit_list=req.audit_list,
+            validation_rules=req.validation_rules
+        )

+ 1 - 0
requirements.txt

@@ -6,3 +6,4 @@ python-dotenv>=1.0.1
 requests>=2.31.0
 openai==1.107.2
 httpx[socks]
+dotenv=0.9.9

+ 40 - 0
script/audit.py

@@ -0,0 +1,40 @@
+from http import HTTPStatus
+import os
+from dotenv import load_dotenv
+from pathlib import Path
+import os
+from dashscope import MultiModalConversation
+
+path = Path(__file__).parent / 'audit.md'
+SYSTEM_PROMPT = path.read_text()
+print(SYSTEM_PROMPT)
+load_dotenv('.env.local')
+
+messages = [
+    {'role': 'system', 'content': SYSTEM_PROMPT},
+    {'role': 'user', 'content': [
+      { 'text' : "对这条视频进行广告文案审核,要求文案结构清晰,内容合规,符合平台规范。请根据视频内容和文案进行审核,并在必要时提供修正建议。"},
+      { 'video': 'http://rescdn.yishihui.com/longvideo/transcode/video/vpc/20260310/53489993Lk3Sbht8pYLv80tmYq.mp4' }
+    ]}
+]
+
+# https://xycdn.yishihui.com/transcode/material/318/1769692782924.mp4
+# 1. http://rescdn.yishihui.com/longvideo/transcode/video/vpc/20260310/53489993Lk3Sbht8pYLv80tmYq.mp4
+# 2. http://rescdn.yishihui.com/longvideo/transcode/video/vpc/20260310/534899938S5gq7WL7jGMnG1zoB.mp4
+# 3. http://rescdn.yishihui.com/longvideo/transcode/video/vpc/20260310/5348999398ZTDPOjF01St11pf0.mp4
+
+response = MultiModalConversation.call(
+  model='qwen3-vl-plus',
+  api_key = os.getenv("ALIYUN_APIKEY") or '',
+  base_url= os.getenv("BASE_URL") or '',
+  messages=messages,
+  result_format='message',
+  temperature=0.3,
+)
+
+
+if response.status_code == HTTPStatus.OK:
+    print(response)
+else:
+    print(response.code)
+    print(response.message)