Gogs 1 mēnesi atpakaļ
vecāks
revīzija
fbb7d5431b

+ 1 - 0
migrations/migrations/README

@@ -0,0 +1 @@
+Generic single-database configuration.

+ 71 - 0
migrations/migrations/env.py

@@ -0,0 +1,71 @@
+from __future__ import with_statement
+import asyncio
+from logging.config import fileConfig
+from sqlmodel import SQLModel, create_engine
+from alembic import context
+import sys
+import pathlib
+
+sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
+
+from config.database import db_settings
+from app.models import *  # noqa; necessarily to import something from file where your models are stored
+
+# this is the Alembic Config object, which provides
+# access to the values within the .ini file in use.
+config = context.config
+
+# Interpret the config file for Python logging.
+# This line sets up loggers basically.
+fileConfig(config.config_file_name)
+
+target_metadata = SQLModel.metadata
+
+db_url = db_settings.database_url
+
+
+# other values from the config, defined by the needs of env.py,
+# can be acquired:
+# my_important_option = config.get_main_option("my_important_option")
+# ... etc.
+
+
+def run_migrations_offline():
+    """Run migrations in 'offline' mode.
+    This configures the context with just a URL
+    and not an Engine, though an Engine is acceptable
+    here as well.  By skipping the Engine creation
+    we don't even need a DBAPI to be available.
+    Calls to context.execute() here emit the given string to the
+    script output.
+    """
+    context.configure(
+        url=db_url,
+        target_metadata=target_metadata,
+        literal_binds=True,
+        compare_type=True,
+        dialect_opts={"paramstyle": "named"},
+    )
+
+    with context.begin_transaction():
+        context.run_migrations()
+
+
+async def run_migrations_online():
+    """Run migrations in 'online' mode.
+    In this scenario we need to create an Engine
+    and associate a connection with the context.
+    """
+    connectable = create_engine(db_url, echo=True)
+
+    with connectable.connect() as connection:
+        context.configure(connection=connection, target_metadata=target_metadata)
+
+        with context.begin_transaction():
+            context.run_migrations()
+
+
+if context.is_offline_mode():
+    run_migrations_offline()
+else:
+    asyncio.run(run_migrations_online())

+ 27 - 0
migrations/migrations/script.py.mako

@@ -0,0 +1,27 @@
+"""${message}
+
+Revision ID: ${up_revision}
+Revises: ${down_revision | comma,n}
+Create Date: ${create_date}
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+${imports if imports else ""}
+
+# revision identifiers, used by Alembic.
+revision: str = ${repr(up_revision)}
+down_revision: Union[str, None] = ${repr(down_revision)}
+branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
+depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
+
+
+def upgrade() -> None:
+    ${upgrades if upgrades else "pass"}
+
+
+def downgrade() -> None:
+    ${downgrades if downgrades else "pass"}

+ 166 - 0
migrations/migrations/versions/2023-12-13-15-09_eacc2313d69c.py

@@ -0,0 +1,166 @@
+"""empty message
+
+Revision ID: eacc2313d69c
+Revises:
+Create Date: 2023-12-13 15:09:59.056426
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+
+
+# revision identifiers, used by Alembic.
+revision: str = "eacc2313d69c"
+down_revision: Union[str, None] = None
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.create_table(
+        "assistant",
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("model", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.Column("file_ids", sa.JSON(), nullable=True),
+        sa.Column("instructions", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.Column("metadata", sa.JSON(), nullable=True),
+        sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.Column("tools", sa.JSON(), nullable=True),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    op.create_table(
+        "assistant_file",
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("assistant_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    op.create_index("assistant_file_assistant_id_id_idx", "assistant_file", ["assistant_id", "id"], unique=False)
+    op.create_table(
+        "file",
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("bytes", sa.Integer(), nullable=False),
+        sa.Column("filename", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("purpose", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("key", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("status", sa.Enum("error", "processed", "uploaded"), nullable=True),
+        sa.Column("status_details", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    op.create_index("file_purpose_idx", "file", ["purpose"], unique=False)
+    op.create_table(
+        "message",
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("role", sa.Enum("assistant", "user", "system", "function", "tool"), nullable=False),
+        sa.Column("thread_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("content", sa.JSON(), nullable=True),
+        sa.Column("file_ids", sa.JSON(), nullable=True),
+        sa.Column("metadata", sa.JSON(), nullable=True),
+        sa.Column("assistant_id", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.Column("run_id", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    op.create_table(
+        "message_file",
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("message_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    op.create_table(
+        "run",
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("instructions", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.Column("model", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.Column(
+            "status",
+            sa.Enum(
+                "cancelled", "cancelling", "completed", "expired", "failed", "in_progress", "queued", "requires_action"
+            ),
+            nullable=True,
+        ),
+        sa.Column("assistant_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("thread_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("file_ids", sa.JSON(), nullable=True),
+        sa.Column("metadata", sa.JSON(), nullable=True),
+        sa.Column("last_error", sa.JSON(), nullable=True),
+        sa.Column("required_action", sa.JSON(), nullable=True),
+        sa.Column("tools", sa.JSON(), nullable=True),
+        sa.Column("started_at", sa.DateTime(), nullable=True),
+        sa.Column("completed_at", sa.DateTime(), nullable=True),
+        sa.Column("cancelled_at", sa.DateTime(), nullable=True),
+        sa.Column("expires_at", sa.DateTime(), nullable=True),
+        sa.Column("failed_at", sa.DateTime(), nullable=True),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    op.create_table(
+        "run_step",
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("status", sa.Enum("cancelled", "completed", "expired", "failed", "in_progress"), nullable=False),
+        sa.Column("type", sa.Enum("message_creation", "tool_calls"), nullable=False),
+        sa.Column("assistant_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("thread_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("run_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("metadata", sa.JSON(), nullable=True),
+        sa.Column("last_error", sa.JSON(), nullable=True),
+        sa.Column("step_details", sa.JSON(), nullable=True),
+        sa.Column("completed_at", sa.DateTime(), nullable=True),
+        sa.Column("cancelled_at", sa.DateTime(), nullable=True),
+        sa.Column("expires_at", sa.DateTime(), nullable=True),
+        sa.Column("failed_at", sa.DateTime(), nullable=True),
+        sa.Column("message_id", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    op.create_index("run_step_run_id_idx", "run_step", ["run_id"], unique=False)
+    op.create_index("run_step_run_id_type_idx", "run_step", ["run_id", "type"], unique=False)
+    op.create_table(
+        "thread",
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("metadata", sa.JSON(), nullable=True),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_table("thread")
+    op.drop_index("run_step_run_id_type_idx", table_name="run_step")
+    op.drop_index("run_step_run_id_idx", table_name="run_step")
+    op.drop_table("run_step")
+    op.drop_table("run")
+    op.drop_table("message_file")
+    op.drop_table("message")
+    op.drop_index("file_purpose_idx", table_name="file")
+    op.drop_table("file")
+    op.drop_index("assistant_file_assistant_id_id_idx", table_name="assistant_file")
+    op.drop_table("assistant_file")
+    op.drop_table("assistant")
+    # ### end Alembic commands ###

+ 45 - 0
migrations/migrations/versions/2024-01-07-17-46_66734dc3664b.py

@@ -0,0 +1,45 @@
+"""empty message
+
+Revision ID: 66734dc3664b
+Revises: 38c796c62e21
+Create Date: 2024-01-07 17:46:55.736276
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision: str = '66734dc3664b'
+down_revision: Union[str, None] = 'eacc2313d69c'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.alter_column('assistant', 'instructions',
+               existing_type=mysql.VARCHAR(length=255),
+               type_=sa.TEXT(),
+               existing_nullable=True)
+    op.alter_column('run', 'instructions',
+               existing_type=mysql.VARCHAR(length=255),
+               type_=sa.TEXT(),
+               existing_nullable=True)
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.alter_column('run', 'instructions',
+               existing_type=sa.TEXT(),
+               type_=mysql.VARCHAR(length=255),
+               existing_nullable=True)
+    op.alter_column('assistant', 'instructions',
+               existing_type=sa.TEXT(),
+               type_=mysql.VARCHAR(length=255),
+               existing_nullable=True)
+    # ### end Alembic commands ###

+ 29 - 0
migrations/migrations/versions/2024-01-18-17-17_6db192bc124b.py

@@ -0,0 +1,29 @@
+"""empty message
+
+Revision ID: 6db192bc124b
+Revises: 66734dc3664b
+Create Date: 2024-01-18 17:17:53.932240
+
+"""
+from typing import Sequence, Union
+
+import sqlalchemy as sa
+from alembic import op
+
+# revision identifiers, used by Alembic.
+revision: str = '6db192bc124b'
+down_revision: Union[str, None] = '66734dc3664b'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('run', sa.Column('additional_instructions', sa.TEXT(), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('run', 'additional_instructions')
+    # ### end Alembic commands ###

+ 50 - 0
migrations/migrations/versions/2024-01-25-15-41_283e8cbdf17a.py

@@ -0,0 +1,50 @@
+"""empty message
+
+Revision ID: 283e8cbdf17a
+Revises: 6db192bc124b
+Create Date: 2024-01-25 15:41:50.410216
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+
+
+# revision identifiers, used by Alembic.
+revision: str = '283e8cbdf17a'
+down_revision: Union[str, None] = '6db192bc124b'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.create_table('token',
+    sa.Column('id', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+    sa.Column('created_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False),
+    sa.Column('updated_at', sa.DateTime(), server_default=sa.text('null'), nullable=True),
+    sa.Column('llm_base_url', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+    sa.Column('llm_api_key', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+    sa.Column('description', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
+    sa.Column('assistant_token', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+    sa.PrimaryKeyConstraint('id')
+    )
+    op.create_table('token_relation',
+    sa.Column('id', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+    sa.Column('created_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False),
+    sa.Column('updated_at', sa.DateTime(), server_default=sa.text('null'), nullable=True),
+    sa.Column('token_id', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+    sa.Column('relation_type', sa.Enum('Assistant', 'File', 'Thread', name='relationtype'), nullable=False),
+    sa.Column('relation_id', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+    sa.PrimaryKeyConstraint('id')
+    )
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_table('token_relation')
+    op.drop_table('token')
+    # ### end Alembic commands ###

+ 62 - 0
migrations/migrations/versions/2024-02-23-15-55_e7339aab6549.py

@@ -0,0 +1,62 @@
+"""add action
+
+Revision ID: e7339aab6549
+Revises: 283e8cbdf17a
+Create Date: 2024-02-23 15:55:52.440984
+
+"""
+
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+
+
+# revision identifiers, used by Alembic.
+revision: str = "e7339aab6549"
+down_revision: Union[str, None] = "283e8cbdf17a"
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.create_table(
+        "action",
+        sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP"), nullable=False),
+        sa.Column("updated_at", sa.DateTime(), server_default=sa.text("null"), nullable=True),
+        sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("openapi_schema", sa.JSON(), nullable=True),
+        sa.Column("authentication", sa.JSON(), nullable=True),
+        sa.Column("extra", sa.JSON(), nullable=True),
+        sa.Column("metadata", sa.JSON(), nullable=True),
+        sa.Column("operation_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("url", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("method", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("path_param_schema", sa.JSON(), nullable=True),
+        sa.Column("query_param_schema", sa.JSON(), nullable=True),
+        sa.Column("body_param_schema", sa.JSON(), nullable=True),
+        sa.Column("body_type", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("function_def", sa.JSON(), nullable=True),
+        sa.Column("object", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+        sa.Column("use_for_everyone", sa.Boolean(), default=False, nullable=False),
+        sa.PrimaryKeyConstraint("id"),
+    )
+    op.add_column("run", sa.Column("extra_body", sa.JSON(), nullable=True))
+    op.execute(
+        " ALTER TABLE token_relation MODIFY COLUMN relation_type enum('Assistant','File','Thread','Action') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;"
+    )
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_table("action")
+    op.drop_column("run", "extra_body")
+    op.execute(
+        "ALTER TABLE token_relation MODIFY COLUMN relation_type enum('Assistant','File','Thread') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;"
+    )
+    # ### end Alembic commands ###

+ 31 - 0
migrations/migrations/versions/2024-03-19-15-27_8dbb8f38ef77.py

@@ -0,0 +1,31 @@
+"""add extra body to assistants
+
+Revision ID: 8dbb8f38ef77
+Revises: e7339aab6549
+Create Date: 2024-03-19 15:27:39.793603
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+
+
+# revision identifiers, used by Alembic.
+revision: str = '8dbb8f38ef77'
+down_revision: Union[str, None] = 'e7339aab6549'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('assistant', sa.Column('extra_body', sa.JSON(), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('assistant', 'extra_body')
+    # ### end Alembic commands ###

+ 56 - 0
migrations/migrations/versions/2024-04-22-17-19_aa4bda3363e3.py

@@ -0,0 +1,56 @@
+"""update models
+
+Revision ID: aa4bda3363e3
+Revises: 8dbb8f38ef77
+Create Date: 2024-04-22 17:19:59.829072
+
+"""
+
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+
+
+# revision identifiers, used by Alembic.
+revision: str = "aa4bda3363e3"
+down_revision: Union[str, None] = "8dbb8f38ef77"
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column("assistant", sa.Column("response_format", sqlmodel.sql.sqltypes.AutoString(), nullable=True))
+    op.add_column("assistant", sa.Column("tool_resources", sa.JSON(), nullable=True))
+    op.add_column("assistant", sa.Column("temperature", sa.Float(), nullable=True))
+    op.add_column("assistant", sa.Column("top_p", sa.Float(), nullable=True))
+    op.add_column("run", sa.Column("incomplete_details", sqlmodel.sql.sqltypes.AutoString(), nullable=True))
+    op.add_column("run", sa.Column("max_completion_tokens", sa.Integer(), nullable=True))
+    op.add_column("run", sa.Column("max_prompt_tokens", sa.Integer(), nullable=True))
+    op.add_column("run", sa.Column("response_format", sqlmodel.sql.sqltypes.AutoString(), nullable=True))
+    op.add_column("run", sa.Column("tool_choice", sqlmodel.sql.sqltypes.AutoString(), nullable=True))
+    op.add_column("run", sa.Column("truncation_strategy", sa.JSON(), nullable=True))
+    op.add_column("run", sa.Column("usage", sa.JSON(), nullable=True))
+    op.add_column("run", sa.Column("temperature", sa.Float(), nullable=True))
+    op.add_column("run", sa.Column("top_p", sa.Float(), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column("run", "top_p")
+    op.drop_column("run", "temperature")
+    op.drop_column("run", "usage")
+    op.drop_column("run", "truncation_strategy")
+    op.drop_column("run", "tool_choice")
+    op.drop_column("run", "response_format")
+    op.drop_column("run", "max_prompt_tokens")
+    op.drop_column("run", "max_completion_tokens")
+    op.drop_column("run", "incomplete_details")
+    op.drop_column("assistant", "top_p")
+    op.drop_column("assistant", "temperature")
+    op.drop_column("assistant", "tool_resources")
+    op.drop_column("assistant", "response_format")
+    # ### end Alembic commands ###

+ 45 - 0
migrations/migrations/versions/2024-05-28-11-35_1c667e62f698.py

@@ -0,0 +1,45 @@
+"""empty message
+
+Revision ID: 1c667e62f698
+Revises: aa4bda3363e3
+Create Date: 2024-05-28 11:35:33.961196
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision: str = '1c667e62f698'
+down_revision: Union[str, None] = 'aa4bda3363e3'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.alter_column('assistant', 'response_format',
+               existing_type=mysql.VARCHAR(collation='utf8mb4_unicode_ci', length=255),
+               type_=sa.JSON(),
+               existing_nullable=True)
+    op.alter_column('run', 'response_format',
+               existing_type=mysql.VARCHAR(collation='utf8mb4_unicode_ci', length=255),
+               type_=sa.JSON(),
+               existing_nullable=True)
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.alter_column('run', 'response_format',
+               existing_type=sa.JSON(),
+               type_=mysql.VARCHAR(collation='utf8mb4_unicode_ci', length=255),
+               existing_nullable=True)
+    op.alter_column('assistant', 'response_format',
+               existing_type=sa.JSON(),
+               type_=mysql.VARCHAR(collation='utf8mb4_unicode_ci', length=255),
+               existing_nullable=True)
+    # ### end Alembic commands ###

+ 35 - 0
migrations/migrations/versions/2024-08-23-15-24_b217fafdb5f0.py

@@ -0,0 +1,35 @@
+"""empty message
+
+Revision ID: b217fafdb5f0
+Revises: 1c667e62f698
+Create Date: 2024-08-23 15:24:41.917447
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+
+
+# revision identifiers, used by Alembic.
+revision: str = 'b217fafdb5f0'
+down_revision: Union[str, None] = '1c667e62f698'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('message', sa.Column('attachments', sa.JSON(), nullable=True))
+    op.add_column('thread', sa.Column('tool_resources', sa.JSON(), nullable=True))
+    op.create_index('token_assistant_token_idx', 'token', ['assistant_token'], unique=True)
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_index('token_assistant_token_idx', table_name='token')
+    op.drop_column('thread', 'tool_resources')
+    op.drop_column('message', 'attachments')
+    # ### end Alembic commands ###

+ 31 - 0
migrations/migrations/versions/2024-11-15-18-30_5b2b73d0fdf6.py

@@ -0,0 +1,31 @@
+"""empty message
+
+Revision ID: 5b2b73d0fdf6
+Revises: b217fafdb5f0
+Create Date: 2024-11-15 18:30:43.391344
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel
+
+
+# revision identifiers, used by Alembic.
+revision: str = '5b2b73d0fdf6'
+down_revision: Union[str, None] = 'b217fafdb5f0'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('run', sa.Column('stream_options', sa.JSON(), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('run', 'stream_options')
+    # ### end Alembic commands ###

+ 5 - 5
pyproject.toml

@@ -70,7 +70,7 @@ email-validator = "2.2.0"
 et-xmlfile = "2.0.0"
 eval-type-backport = "0.2.0"
 exceptiongroup = "1.2.0"
-fastapi = "0.114.2"
+fastapi = "0.115.12"
 fastapi-pagination = "0.12.32"
 fastjsonschema = "2.20.0"
 filelock = "3.16.1"
@@ -174,9 +174,9 @@ psycopg2-binary = "2.9.10"
 ptyprocess = "0.7.0"
 pycparser = "2.22"
 pycryptodome = "3.20.0"
-pydantic = "2.10.3"
+pydantic = "2.11.3"
 pydantic-settings = "2.4.0"
-pydantic-core = "2.27.1"
+pydantic-core = "2.33.1"
 pyjwt = "2.9.0"
 pymupdf = "1.23.8"
 pymupdfb = "1.23.7"
@@ -195,7 +195,7 @@ python-multipart = "0.0.9"
 python-pptx = "1.0.2"
 pytz = "2024.2"
 pyyaml = "6.0.1"
-r2r = "3.3.18"
+r2r = "3.5.11"
 rapidfuzz = "3.10.1"
 realtime = "2.0.6"
 redis = "5.0.8"
@@ -221,7 +221,7 @@ sqlalchemy = "2.0.36"
 sqlmodel = "0.0.21"
 sse-starlette = "1.8.2"
 starkbank-ecdsa = "2.2.0"
-starlette = "0.38.6"
+starlette = "0.46.1"
 statsmodels = "0.14.4"
 storage3 = "0.9.0"
 strenum = "0.4.15"