Source code for veupath_chatbot.transport.http.schemas.strategies
"""Strategy request/response DTOs."""
from datetime import datetime
from uuid import UUID
from pydantic import BaseModel, Field
from .chat import MessageResponse, ThinkingResponse
from .plan import StrategyPlan
from .steps import StepResponse
[docs]
class StepCountsRequest(BaseModel):
"""Request to compute step counts from a plan."""
site_id: str = Field(alias="siteId")
plan: StrategyPlan
model_config = {"populate_by_name": True}
[docs]
class StepCountsResponse(BaseModel):
"""Step counts keyed by local step ID."""
counts: dict[str, int | None]
[docs]
class WdkStrategySummaryResponse(BaseModel):
"""WDK strategy summary for list views (backend-only)."""
wdk_strategy_id: int = Field(alias="wdkStrategyId")
name: str
site_id: str = Field(alias="siteId")
wdk_url: str | None = Field(default=None, alias="wdkUrl")
root_step_id: int | None = Field(default=None, alias="rootStepId")
is_saved: bool | None = Field(default=None, alias="isSaved")
is_internal: bool = Field(default=False, alias="isInternal")
model_config = {"populate_by_name": True}
[docs]
class OpenStrategyRequest(BaseModel):
"""Request to open a strategy."""
strategy_id: UUID | None = Field(default=None, alias="strategyId")
wdk_strategy_id: int | None = Field(default=None, alias="wdkStrategyId")
site_id: str | None = Field(default=None, alias="siteId")
model_config = {"populate_by_name": True}
[docs]
class OpenStrategyResponse(BaseModel):
"""Open strategy response."""
strategy_id: UUID = Field(alias="strategyId")
model_config = {"populate_by_name": True}
[docs]
class StrategyResponse(BaseModel):
"""Unified strategy response — used for both list and detail views.
List views: ``steps`` is ``[]``, ``stepCount``/``resultCount`` are populated.
Detail views: ``steps`` is populated, summary fields may also be set.
"""
id: UUID
name: str
title: str | None = None
description: str | None = None
site_id: str = Field(alias="siteId")
record_type: str | None = Field(alias="recordType")
steps: list[StepResponse] = Field(default_factory=list)
root_step_id: str | None = Field(default=None, alias="rootStepId")
wdk_strategy_id: int | None = Field(default=None, alias="wdkStrategyId")
is_saved: bool = Field(default=False, alias="isSaved")
messages: list[MessageResponse] | None = None
thinking: ThinkingResponse | None = None
model_id: str | None = Field(default=None, alias="modelId")
created_at: datetime = Field(alias="createdAt")
updated_at: datetime = Field(alias="updatedAt")
# Summary fields — always set, avoids needing steps loaded.
step_count: int | None = Field(default=None, alias="stepCount")
result_count: int | None = Field(default=None, alias="resultCount")
wdk_url: str | None = Field(default=None, alias="wdkUrl")
gene_set_id: str | None = Field(default=None, alias="geneSetId")
dismissed_at: datetime | None = Field(default=None, alias="dismissedAt")
model_config = {"populate_by_name": True}
[docs]
class CreateStrategyRequest(BaseModel):
"""Request to create a strategy."""
name: str = Field(min_length=1, max_length=255)
site_id: str = Field(alias="siteId")
plan: StrategyPlan
model_config = {"populate_by_name": True}
[docs]
class UpdateStrategyRequest(BaseModel):
"""Request to update a strategy."""
name: str | None = Field(default=None, min_length=1, max_length=255)
plan: StrategyPlan | None = None
wdk_strategy_id: int | None = Field(default=None, alias="wdkStrategyId")
is_saved: bool | None = Field(default=None, alias="isSaved")
model_config = {"populate_by_name": True}