91 lines
2.7 KiB
Python
91 lines
2.7 KiB
Python
|
|
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 FarmAlertsRequest(SchemaModel):
|
||
|
|
farm_uuid: UUID
|
||
|
|
sensor_uuid: UUID | None = None
|
||
|
|
query: str | None = None
|
||
|
|
|
||
|
|
|
||
|
|
class FarmAlertNotificationSchema(SchemaModel):
|
||
|
|
id: int | None = None
|
||
|
|
farm_uuid: str | None = None
|
||
|
|
endpoint: str | None = None
|
||
|
|
level: Literal['danger', 'warning', 'info'] | str
|
||
|
|
title: str
|
||
|
|
message: str
|
||
|
|
suggested_action: str | None = None
|
||
|
|
source_alert_id: str | None = None
|
||
|
|
source_metric_type: str | None = None
|
||
|
|
payload: JsonObject = Field(default_factory=dict)
|
||
|
|
created_at: str | None = None
|
||
|
|
updated_at: str | None = None
|
||
|
|
|
||
|
|
|
||
|
|
class FarmAlertsTimelineItem(SchemaModel):
|
||
|
|
timestamp: str | None = None
|
||
|
|
level: Literal['danger', 'warning', 'info'] | str
|
||
|
|
title: str
|
||
|
|
description: str | None = None
|
||
|
|
source_alert_id: str | None = None
|
||
|
|
source_metric_type: str | None = None
|
||
|
|
|
||
|
|
|
||
|
|
class FarmAlertsTrackerResponseData(SchemaModel):
|
||
|
|
farm_uuid: str
|
||
|
|
service_id: str | None = None
|
||
|
|
knowledge_base: str | None = None
|
||
|
|
tone_file: str | None = None
|
||
|
|
tracker: JsonObject = Field(default_factory=dict)
|
||
|
|
headline: str
|
||
|
|
overview: str | None = None
|
||
|
|
status_level: Literal['danger', 'warning', 'info'] | str
|
||
|
|
notifications: list[FarmAlertNotificationSchema] = Field(default_factory=list)
|
||
|
|
raw_llm_response: str | None = None
|
||
|
|
structured_context: JsonObject = Field(default_factory=dict)
|
||
|
|
|
||
|
|
|
||
|
|
class FarmAlertsTimelineResponseData(SchemaModel):
|
||
|
|
farm_uuid: str
|
||
|
|
service_id: str | None = None
|
||
|
|
knowledge_base: str | None = None
|
||
|
|
tone_file: str | None = None
|
||
|
|
tracker: JsonObject = Field(default_factory=dict)
|
||
|
|
headline: str
|
||
|
|
overview: str | None = None
|
||
|
|
timeline: list[FarmAlertsTimelineItem] = Field(default_factory=list)
|
||
|
|
notifications: list[FarmAlertNotificationSchema] = Field(default_factory=list)
|
||
|
|
raw_llm_response: str | None = None
|
||
|
|
structured_context: JsonObject = Field(default_factory=dict)
|
||
|
|
|
||
|
|
|
||
|
|
class FarmAlertsTrackerResponse(ApiEnvelope[FarmAlertsTrackerResponseData]):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class FarmAlertsTimelineResponse(ApiEnvelope[FarmAlertsTimelineResponseData]):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
CONTRACTS = [
|
||
|
|
RouteContract(
|
||
|
|
method='POST',
|
||
|
|
path='/api/farm-alerts/tracker/',
|
||
|
|
request_model=FarmAlertsRequest.__name__,
|
||
|
|
response_model=FarmAlertsTrackerResponse.__name__,
|
||
|
|
),
|
||
|
|
RouteContract(
|
||
|
|
method='POST',
|
||
|
|
path='/api/farm-alerts/timeline/',
|
||
|
|
request_model=FarmAlertsRequest.__name__,
|
||
|
|
response_model=FarmAlertsTimelineResponse.__name__,
|
||
|
|
),
|
||
|
|
]
|