diff --git a/server/alembic/versions/2025_11_13_1731-add_timestamp_to_chat_step.py b/server/alembic/versions/2025_11_13_1731-add_timestamp_to_chat_step.py new file mode 100644 index 000000000..9f9f7edc5 --- /dev/null +++ b/server/alembic/versions/2025_11_13_1731-add_timestamp_to_chat_step.py @@ -0,0 +1,28 @@ +"""add_timestamp_to_chat_step + +Revision ID: add_timestamp_to_chat_step +Revises: eec7242b3a9b +Create Date: 2025-11-13 17:31:51.692506 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = "add_timestamp_to_chat_step" +down_revision: Union[str, None] = "eec7242b3a9b" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Add timestamp column to chat_step table.""" + op.add_column("chat_step", sa.Column("timestamp", sa.Float(), nullable=True)) + + +def downgrade() -> None: + """Remove timestamp column from chat_step table.""" + op.drop_column("chat_step", "timestamp") diff --git a/server/app/controller/chat/step_controller.py b/server/app/controller/chat/step_controller.py index 21e7199a9..d16a7b7b9 100644 --- a/server/app/controller/chat/step_controller.py +++ b/server/app/controller/chat/step_controller.py @@ -4,6 +4,7 @@ from typing import List, Optional from fastapi import Depends, HTTPException, Query, Response, APIRouter from fastapi.responses import StreamingResponse from sqlmodel import Session, asc, select +from sqlalchemy.sql.expression import case from app.component.database import session from app.component.auth import Auth, auth_must from fastapi_babel import _ @@ -46,7 +47,11 @@ async def share_playback( async def event_generator(): try: - stmt = select(ChatStep).where(ChatStep.task_id == task_id).order_by(asc(ChatStep.id)) + stmt = select(ChatStep).where(ChatStep.task_id == task_id).order_by( + asc(case((ChatStep.timestamp.is_(None), 1), else_=0)), + asc(ChatStep.timestamp), + asc(ChatStep.id) + ) steps = session.exec(stmt).all() if not steps: @@ -101,6 +106,7 @@ async def create_chat_step(step: ChatStepIn, session: Session = Depends(session) task_id=step.task_id, step=step.step, data=step.data, + timestamp=step.timestamp ) session.add(chat_step) session.commit() diff --git a/server/app/model/chat/chat_step.py b/server/app/model/chat/chat_step.py index 7b567d924..4694ff64c 100644 --- a/server/app/model/chat/chat_step.py +++ b/server/app/model/chat/chat_step.py @@ -11,6 +11,7 @@ class ChatStep(AbstractModel, DefaultTimes, table=True): task_id: str = Field(index=True) step: str data: str = Field(sa_type=JSON) + timestamp: float | None = Field(default=None, nullable=True) @field_validator("data", mode="before") @classmethod @@ -34,6 +35,7 @@ class ChatStepIn(BaseModel): task_id: str step: str data: Any + timestamp: float | None = None class ChatStepOut(BaseModel): @@ -41,3 +43,4 @@ class ChatStepOut(BaseModel): task_id: str step: str data: Any + timestamp: float | None = None