from fastapi import APIRouter, Depends, HTTPException, Request, UploadFile, File from pydantic import BaseModel from typing import List, Optional from app.api.dto.kg_query import KGQueryRequest, KGQueryResponse, PredictedLabel, QueryContext from app.core.dependencies import get_all_models, get_clip_model, get_data_mapper from app.core.type import Node from app.models.crop_clip import CLIPModule from app.services.predict import PredictService, get_predict_service from app.utils.extract_entity import extract_entities router = APIRouter() class QueryRequest(BaseModel): question: str context: Optional[List[str]] = None class QueryResponse(BaseModel): answer: str sources: List[str] @router.post("/analyze") async def analyze( image: UploadFile = File(None), predict_service: PredictService = Depends(get_predict_service) ): predicted_label = predict_service.predict_image(image) return { "crop_id": predicted_label[0].crop_name, "predicted_labels": predicted_label, "nodes": [] } @router.post("/kg-query") async def query_kg( request: KGQueryRequest, predict_service: PredictService = Depends(get_predict_service), ): return predict_service.retrieve_kg(request)