from __future__ import annotations from typing import Literal from uuid import UUID from pydantic import Field from .common import ApiEnvelope, JsonObject, JsonValue, RouteContract, SchemaModel class PestDiseaseDetectionRequest(SchemaModel): farm_uuid: UUID sensor_uuid: UUID | None = None plant_name: str | None = None query: str | None = None image_urls: list[str] = Field(default_factory=list) image: str | None = None images: list[str] = Field(default_factory=list) class PestDiseaseDetectionResponseData(SchemaModel): has_issue: bool category: Literal['no_issue', 'pest', 'disease', 'nutrient_stress', 'abiotic_stress', 'unknown'] | str confidence: float | None = None severity: Literal['low', 'medium', 'high'] | str summary: str detected_signs: list[str] = Field(default_factory=list) possible_causes: list[str] = Field(default_factory=list) immediate_actions: list[str] = Field(default_factory=list) reasoning: list[str] = Field(default_factory=list) farm_uuid: str | None = None knowledge_base: str | None = None tone_file: str | None = None raw_response: str | None = None class PestDiseaseRiskRequest(SchemaModel): farm_uuid: UUID sensor_uuid: UUID | None = None plant_name: str | None = None growth_stage: str | None = None query: str | None = None class RiskBlock(SchemaModel): score: float | None = None level: Literal['low', 'medium', 'high'] | str | None = None likely_conditions: list[str] = Field(default_factory=list) reasoning: list[str] = Field(default_factory=list) statsLabel: str | None = None class PestDiseaseRiskResponseData(SchemaModel): summary: str forecast_window: str | None = None overall_risk: Literal['low', 'medium', 'high'] | str disease_risk: RiskBlock = Field(default_factory=RiskBlock) pest_risk: RiskBlock = Field(default_factory=RiskBlock) key_drivers: list[str] = Field(default_factory=list) recommended_actions: list[str] = Field(default_factory=list) farm_context: JsonObject = Field(default_factory=dict) farm_uuid: str | None = None knowledge_base: str | None = None tone_file: str | None = None raw_response: str | None = None class PestDiseaseRiskSummaryRequest(SchemaModel): farm_uuid: UUID sensor_uuid: UUID | None = None class PestDiseaseRiskSummaryDrivers(SchemaModel): keyDrivers: list[str] = Field(default_factory=list) summary: str | None = None forecastWindow: str | None = None source: str | None = None class PestDiseaseRiskSummaryResponseData(SchemaModel): farm_uuid: str diseaseRisk: RiskBlock = Field(default_factory=RiskBlock) pestRisk: RiskBlock = Field(default_factory=RiskBlock) drivers: PestDiseaseRiskSummaryDrivers = Field(default_factory=PestDiseaseRiskSummaryDrivers) class PestDiseaseDetectionResponse(ApiEnvelope[PestDiseaseDetectionResponseData]): pass class PestDiseaseRiskResponse(ApiEnvelope[PestDiseaseRiskResponseData]): pass class PestDiseaseRiskSummaryResponse(ApiEnvelope[PestDiseaseRiskSummaryResponseData]): pass CONTRACTS = [ RouteContract( method='POST', path='/api/pest-disease/detect/', request_model=PestDiseaseDetectionRequest.__name__, response_model=PestDiseaseDetectionResponse.__name__, ), RouteContract( method='POST', path='/api/pest-disease/risk/', request_model=PestDiseaseRiskRequest.__name__, response_model=PestDiseaseRiskResponse.__name__, ), RouteContract( method='POST', path='/api/pest-disease/risk-summary/', request_model=PestDiseaseRiskSummaryRequest.__name__, response_model=PestDiseaseRiskSummaryResponse.__name__, ), ]