Files
letta-server/letta/orm/llm_batch_job.py
Kian Jones f5c4ab50f4 chore: add ty + pre-commit hook and repeal even more ruff rules (#9504)
* auto fixes

* auto fix pt2 and transitive deps and undefined var checking locals()

* manual fixes (ignored or letta-code fixed)

* fix circular import

* remove all ignores, add FastAPI rules and Ruff rules

* add ty and precommit

* ruff stuff

* ty check fixes

* ty check fixes pt 2

* error on invalid
2026-02-24 10:55:11 -08:00

56 lines
2.5 KiB
Python

import uuid
from datetime import datetime
from typing import TYPE_CHECKING, List, Optional, Union
if TYPE_CHECKING:
from letta.orm.llm_batch_items import LLMBatchItem
from letta.orm.organization import Organization
from anthropic.types.beta.messages import BetaMessageBatch
from sqlalchemy import DateTime, ForeignKey, Index, String
from sqlalchemy.orm import Mapped, mapped_column, relationship
from letta.orm.custom_columns import CreateBatchResponseColumn, PollBatchResponseColumn
from letta.orm.mixins import OrganizationMixin
from letta.orm.sqlalchemy_base import SqlalchemyBase
from letta.schemas.enums import JobStatus, ProviderType
from letta.schemas.llm_batch_job import LLMBatchJob as PydanticLLMBatchJob
class LLMBatchJob(SqlalchemyBase, OrganizationMixin):
"""Represents a single LLM batch request made to a provider like Anthropic"""
__tablename__ = "llm_batch_job"
__table_args__ = (
Index("ix_llm_batch_job_created_at", "created_at"),
Index("ix_llm_batch_job_status", "status"),
)
__pydantic_model__ = PydanticLLMBatchJob
# TODO: We want to migrate all the ORM models to do this, so we will need to move this to the SqlalchemyBase
# TODO: Some still rely on the Pydantic object to do this
id: Mapped[str] = mapped_column(String, primary_key=True, default=lambda: f"batch_req-{uuid.uuid4()}")
status: Mapped[JobStatus] = mapped_column(String, default=JobStatus.created, doc="The current status of the batch.")
llm_provider: Mapped[ProviderType] = mapped_column(String, doc="LLM provider used (e.g., 'Anthropic')")
create_batch_response: Mapped[Union[BetaMessageBatch]] = mapped_column(
CreateBatchResponseColumn, doc="Full JSON response from initial batch creation"
)
latest_polling_response: Mapped[Union[BetaMessageBatch]] = mapped_column(
PollBatchResponseColumn, nullable=True, doc="Last known polling result from LLM provider"
)
last_polled_at: Mapped[Optional[datetime]] = mapped_column(
DateTime(timezone=True), nullable=True, doc="Last time we polled the provider for status"
)
letta_batch_job_id: Mapped[str] = mapped_column(
String, ForeignKey("jobs.id", ondelete="CASCADE"), nullable=False, doc="ID of the Letta batch job"
)
organization: Mapped["Organization"] = relationship("Organization", back_populates="llm_batch_jobs")
items: Mapped[List["LLMBatchItem"]] = relationship("LLMBatchItem", back_populates="batch", lazy="selectin")