45 lines
1.1 KiB
Python
45 lines
1.1 KiB
Python
from enum import Enum
|
|
from typing import Literal, Optional
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class RunStatus(str, Enum):
|
|
QUEUED = "queued"
|
|
RUNNING = "running"
|
|
COMPLETE = "complete"
|
|
ERROR = "error"
|
|
|
|
|
|
class RunConfig(BaseModel):
|
|
ticker: str
|
|
date: str # "YYYY-MM-DD"
|
|
llm_provider: str = "openai"
|
|
deep_think_llm: str = "gpt-5.2"
|
|
quick_think_llm: str = "gpt-5-mini"
|
|
max_debate_rounds: int = Field(default=1, ge=1, le=5)
|
|
max_risk_discuss_rounds: int = Field(default=1, ge=1, le=5)
|
|
enabled_analysts: list[str] = Field(
|
|
default=["market", "news", "fundamentals", "social"]
|
|
)
|
|
|
|
|
|
class RunSummary(BaseModel):
|
|
id: str
|
|
ticker: str
|
|
date: str
|
|
status: RunStatus
|
|
decision: Optional[Literal["BUY", "SELL", "HOLD"]] = None
|
|
created_at: str
|
|
|
|
|
|
class TokenUsage(BaseModel):
|
|
tokens_in: int = 0
|
|
tokens_out: int = 0
|
|
|
|
|
|
class RunResult(RunSummary):
|
|
config: Optional[RunConfig] = None
|
|
reports: dict[str, str] = Field(default_factory=dict)
|
|
error: Optional[str] = None
|
|
token_usage: dict[str, TokenUsage] = Field(default_factory=dict)
|