feat(US5+6): QA generation — POST /api/v1/qa/gen-text and /gen-image
- Add qa_models.py with TextQAItem, GenTextQARequest, QAPair, ImageQAItem, GenImageQARequest, ImageQAPair, TextQAResponse, ImageQAResponse - Implement gen_text_qa(): batch-formats triples into a single prompt, calls llm.chat(), parses JSON array via extract_json() - Implement gen_image_qa(): downloads cropped image from source-data bucket, base64-encodes inline (data URI), builds multimodal message, calls llm.chat_vision(), parses JSON; image_path preserved on ImageQAPair - Replace qa.py stub with full router: POST /qa/gen-text and /qa/gen-image using Depends(get_llm_client) and Depends(get_storage_client) - 15 new tests (8 service + 7 router), 53/53 total passing
This commit is contained in:
@@ -1,3 +1,31 @@
|
||||
from fastapi import APIRouter
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from app.clients.llm.base import LLMClient
|
||||
from app.clients.storage.base import StorageClient
|
||||
from app.core.dependencies import get_llm_client, get_storage_client
|
||||
from app.models.qa_models import (
|
||||
GenImageQARequest,
|
||||
GenTextQARequest,
|
||||
ImageQAResponse,
|
||||
TextQAResponse,
|
||||
)
|
||||
from app.services import qa_service
|
||||
|
||||
router = APIRouter(tags=["QA"])
|
||||
|
||||
|
||||
@router.post("/qa/gen-text", response_model=TextQAResponse)
|
||||
async def gen_text_qa(
|
||||
req: GenTextQARequest,
|
||||
llm: LLMClient = Depends(get_llm_client),
|
||||
) -> TextQAResponse:
|
||||
return await qa_service.gen_text_qa(req, llm)
|
||||
|
||||
|
||||
@router.post("/qa/gen-image", response_model=ImageQAResponse)
|
||||
async def gen_image_qa(
|
||||
req: GenImageQARequest,
|
||||
llm: LLMClient = Depends(get_llm_client),
|
||||
storage: StorageClient = Depends(get_storage_client),
|
||||
) -> ImageQAResponse:
|
||||
return await qa_service.gen_image_qa(req, llm, storage)
|
||||
|
||||
Reference in New Issue
Block a user