Coverage for src/fastoai/models/generated/run.py: 86%
58 statements
« prev ^ index » next coverage.py v7.6.8, created at 2024-12-06 09:34 +0800
« prev ^ index » next coverage.py v7.6.8, created at 2024-12-06 09:34 +0800
1from datetime import datetime
2from typing import TYPE_CHECKING, Annotated
4from openai.types.beta.assistant_response_format_option import (
5 AssistantResponseFormatOption,
6)
7from openai.types.beta.assistant_tool import AssistantTool
8from openai.types.beta.assistant_tool_choice_option import AssistantToolChoiceOption
9from openai.types.beta.threads.run import (
10 IncompleteDetails,
11 LastError,
12 RequiredAction,
13 TruncationStrategy,
14 Usage,
15)
16from openai.types.beta.threads.run import Run as _Run
17from openai.types.beta.threads.run_status import RunStatus
18from pydantic import field_serializer
19from sqlalchemy.ext.asyncio import AsyncAttrs
20from sqlmodel import Field, Relationship
22from .._metadata import WithMetadata
23from .._types import as_sa_type
24from .._utils import now, random_id_with_prefix
25from .assistant import Assistant
26from .thread import Thread
28if TYPE_CHECKING:
29 from .message import Message
30 from .run_step import RunStep
32class Run(AsyncAttrs, WithMetadata, table=True):
33 id: Annotated[str, Field(primary_key=True, default_factory=random_id_with_prefix('run_'))]
34 assistant_id: Annotated[str, Field(foreign_key='assistant.id')]
35 cancelled_at: datetime | None = None
36 completed_at: datetime | None = None
37 created_at: Annotated[datetime, Field(default_factory=now)]
38 expires_at: datetime | None = None
39 failed_at: datetime | None = None
40 incomplete_details: Annotated[IncompleteDetails | None, Field(sa_type=as_sa_type(IncompleteDetails), nullable=True)] = None
41 instructions: str
42 last_error: Annotated[LastError | None, Field(sa_type=as_sa_type(LastError), nullable=True)] = None
43 max_completion_tokens: int | None = None
44 max_prompt_tokens: int | None = None
45 model: str
46 parallel_tool_calls: bool
47 required_action: Annotated[RequiredAction | None, Field(sa_type=as_sa_type(RequiredAction), nullable=True)] = None
48 response_format: Annotated[AssistantResponseFormatOption | None, Field(sa_type=as_sa_type(AssistantResponseFormatOption), nullable=True)] = None
49 started_at: datetime | None = None
50 status: Annotated[RunStatus, Field(sa_type=as_sa_type(RunStatus))]
51 thread_id: Annotated[str, Field(foreign_key='thread.id')]
52 tool_choice: Annotated[AssistantToolChoiceOption | None, Field(sa_type=as_sa_type(AssistantToolChoiceOption), nullable=True)] = None
53 tools: Annotated[list[AssistantTool], Field(default_factory=list, sa_type=as_sa_type(list[AssistantTool]))]
54 truncation_strategy: Annotated[TruncationStrategy | None, Field(sa_type=as_sa_type(TruncationStrategy), nullable=True)] = None
55 usage: Annotated[Usage | None, Field(sa_type=as_sa_type(Usage), nullable=True)] = None
56 temperature: float | None = None
57 top_p: float | None = None
59 async def to_openai_model(self) -> _Run:
60 value = self.model_dump(by_alias=True)
61 value['object'] = 'thread.run'
62 return _Run.model_validate(value)
64 @field_serializer('cancelled_at', 'completed_at', 'created_at', 'expires_at', 'failed_at', 'started_at')
65 def serialize_datetime(self, dt: datetime | None) -> int | None:
66 if dt is None:
67 return None
68 return int(dt.timestamp())
69 assistant: Assistant = Relationship(back_populates='runs')
70 thread: Thread = Relationship(back_populates='runs')
71 messages: list['Message'] = Relationship(back_populates='run')
72 steps: list['RunStep'] = Relationship(back_populates='run')