| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | from sqlmodel import selectfrom sqlalchemy.ext.asyncio import AsyncSessionfrom app.exceptions.exception import ResourceNotFoundErrorfrom app.models.assistant import Assistant, AssistantUpdate, AssistantCreatefrom app.models.token_relation import RelationTypefrom app.providers.auth_provider import auth_policyfrom app.schemas.common import DeleteResponsefrom app.utils import revise_tool_namesclass AssistantService:    @staticmethod    async def create_assistant(        *, session: AsyncSession, body: AssistantCreate, token_id: str = None    ) -> Assistant:        revise_tool_names(body.tools)        db_assistant = Assistant.model_validate(body.model_dump(by_alias=True))        session.add(db_assistant)        auth_policy.insert_token_rel(            session=session,            token_id=token_id,            relation_type=RelationType.Assistant,            relation_id=db_assistant.id,        )        await session.commit()        await session.refresh(db_assistant)        return db_assistant    @staticmethod    async def modify_assistant(        *, session: AsyncSession, assistant_id: str, body: AssistantUpdate    ) -> Assistant:        revise_tool_names(body.tools)        db_assistant = await AssistantService.get_assistant(            session=session, assistant_id=assistant_id        )        update_data = body.dict(exclude_unset=True)        for key, value in update_data.items():            setattr(db_assistant, key, value)        session.add(db_assistant)        await session.commit()        await session.refresh(db_assistant)        return db_assistant    @staticmethod    async def delete_assistant(        *,        session: AsyncSession,        assistant_id: str,    ) -> DeleteResponse:        db_ass = await AssistantService.get_assistant(            session=session, assistant_id=assistant_id        )        await session.delete(db_ass)        await auth_policy.delete_token_rel(            session=session,            relation_type=RelationType.Assistant,            relation_id=assistant_id,        )        await session.commit()        return DeleteResponse(id=assistant_id, object="assistant.deleted", deleted=True)    @staticmethod    async def get_assistant(*, session: AsyncSession, assistant_id: str) -> Assistant:        statement = select(Assistant).where(Assistant.id == assistant_id)        result = await session.execute(statement)        assistant = result.scalars().one_or_none()        if assistant is None:            raise ResourceNotFoundError(message="Assistant not found")        return assistant    @staticmethod    def get_assistant_sync(*, session: AsyncSession, assistant_id: str) -> Assistant:        statement = select(Assistant).where(Assistant.id == assistant_id)        result = session.execute(statement)        assistant = result.scalars().one_or_none()        if assistant is None:            raise ResourceNotFoundError(message="Assistant not found")        return assistant    @staticmethod    def get_assistant_sync(*, session: AsyncSession, assistant_id: str) -> Assistant:        statement = select(Assistant).where(Assistant.id == assistant_id)        result = session.execute(statement)        assistant = result.scalars().one_or_none()        if assistant is None:            raise ResourceNotFoundError(message="Assistant not found")        return assistant
 |