replace db with sa to get typing support (#23240)

This commit is contained in:
Asuka Minato 2025-08-03 00:54:23 +09:00 • committed by GitHub
commit 58608f51da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 623 additions and 613 deletions

View file

@ -5,6 +5,7 @@ import secrets
from typing import Any, Optional from typing import Any, Optional
import click import click
import sqlalchemy as sa
from flask import current_app from flask import current_app
from pydantic import TypeAdapter from pydantic import TypeAdapter
from sqlalchemy import select from sqlalchemy import select
@ -457,7 +458,7 @@ def convert_to_agent_apps():
""" """
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query)) rs = conn.execute(sa.text(sql_query))
apps = [] apps = []
for i in rs: for i in rs:
@ -702,7 +703,7 @@ def fix_app_site_missing():
sql = """select apps.id as id from apps left join sites on sites.app_id=apps.id sql = """select apps.id as id from apps left join sites on sites.app_id=apps.id
where sites.id is null limit 1000""" where sites.id is null limit 1000"""
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql)) rs = conn.execute(sa.text(sql))
processed_count = 0 processed_count = 0
for i in rs: for i in rs:
@ -916,7 +917,7 @@ def clear_orphaned_file_records(force: bool):
) )
orphaned_message_files = [] orphaned_message_files = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(query)) rs = conn.execute(sa.text(query))
for i in rs: for i in rs:
orphaned_message_files.append({"id": str(i[0]), "message_id": str(i[1])}) orphaned_message_files.append({"id": str(i[0]), "message_id": str(i[1])})
@ -937,7 +938,7 @@ def clear_orphaned_file_records(force: bool):
click.echo(click.style("- Deleting orphaned message_files records", fg="white")) click.echo(click.style("- Deleting orphaned message_files records", fg="white"))
query = "DELETE FROM message_files WHERE id IN :ids" query = "DELETE FROM message_files WHERE id IN :ids"
with db.engine.begin() as conn: with db.engine.begin() as conn:
conn.execute(db.text(query), {"ids": tuple([record["id"] for record in orphaned_message_files])}) conn.execute(sa.text(query), {"ids": tuple([record["id"] for record in orphaned_message_files])})
click.echo( click.echo(
click.style(f"Removed {len(orphaned_message_files)} orphaned message_files records.", fg="green") click.style(f"Removed {len(orphaned_message_files)} orphaned message_files records.", fg="green")
) )
@ -954,7 +955,7 @@ def clear_orphaned_file_records(force: bool):
click.echo(click.style(f"- Listing file records in table {files_table['table']}", fg="white")) click.echo(click.style(f"- Listing file records in table {files_table['table']}", fg="white"))
query = f"SELECT {files_table['id_column']}, {files_table['key_column']} FROM {files_table['table']}" query = f"SELECT {files_table['id_column']}, {files_table['key_column']} FROM {files_table['table']}"
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(query)) rs = conn.execute(sa.text(query))
for i in rs: for i in rs:
all_files_in_tables.append({"table": files_table["table"], "id": str(i[0]), "key": i[1]}) all_files_in_tables.append({"table": files_table["table"], "id": str(i[0]), "key": i[1]})
click.echo(click.style(f"Found {len(all_files_in_tables)} files in tables.", fg="white")) click.echo(click.style(f"Found {len(all_files_in_tables)} files in tables.", fg="white"))
@ -974,7 +975,7 @@ def clear_orphaned_file_records(force: bool):
f"SELECT {ids_table['column']} FROM {ids_table['table']} WHERE {ids_table['column']} IS NOT NULL" f"SELECT {ids_table['column']} FROM {ids_table['table']} WHERE {ids_table['column']} IS NOT NULL"
) )
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(query)) rs = conn.execute(sa.text(query))
for i in rs: for i in rs:
all_ids_in_tables.append({"table": ids_table["table"], "id": str(i[0])}) all_ids_in_tables.append({"table": ids_table["table"], "id": str(i[0])})
elif ids_table["type"] == "text": elif ids_table["type"] == "text":
@ -989,7 +990,7 @@ def clear_orphaned_file_records(force: bool):
f"FROM {ids_table['table']}" f"FROM {ids_table['table']}"
) )
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(query)) rs = conn.execute(sa.text(query))
for i in rs: for i in rs:
for j in i[0]: for j in i[0]:
all_ids_in_tables.append({"table": ids_table["table"], "id": j}) all_ids_in_tables.append({"table": ids_table["table"], "id": j})
@ -1008,7 +1009,7 @@ def clear_orphaned_file_records(force: bool):
f"FROM {ids_table['table']}" f"FROM {ids_table['table']}"
) )
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(query)) rs = conn.execute(sa.text(query))
for i in rs: for i in rs:
for j in i[0]: for j in i[0]:
all_ids_in_tables.append({"table": ids_table["table"], "id": j}) all_ids_in_tables.append({"table": ids_table["table"], "id": j})
@ -1037,7 +1038,7 @@ def clear_orphaned_file_records(force: bool):
click.echo(click.style(f"- Deleting orphaned file records in table {files_table['table']}", fg="white")) click.echo(click.style(f"- Deleting orphaned file records in table {files_table['table']}", fg="white"))
query = f"DELETE FROM {files_table['table']} WHERE {files_table['id_column']} IN :ids" query = f"DELETE FROM {files_table['table']} WHERE {files_table['id_column']} IN :ids"
with db.engine.begin() as conn: with db.engine.begin() as conn:
conn.execute(db.text(query), {"ids": tuple(orphaned_files)}) conn.execute(sa.text(query), {"ids": tuple(orphaned_files)})
except Exception as e: except Exception as e:
click.echo(click.style(f"Error deleting orphaned file records: {str(e)}", fg="red")) click.echo(click.style(f"Error deleting orphaned file records: {str(e)}", fg="red"))
return return
@ -1107,7 +1108,7 @@ def remove_orphaned_files_on_storage(force: bool):
click.echo(click.style(f"- Listing files from table {files_table['table']}", fg="white")) click.echo(click.style(f"- Listing files from table {files_table['table']}", fg="white"))
query = f"SELECT {files_table['key_column']} FROM {files_table['table']}" query = f"SELECT {files_table['key_column']} FROM {files_table['table']}"
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(query)) rs = conn.execute(sa.text(query))
for i in rs: for i in rs:
all_files_in_tables.append(str(i[0])) all_files_in_tables.append(str(i[0]))
click.echo(click.style(f"Found {len(all_files_in_tables)} files in tables.", fg="white")) click.echo(click.style(f"Found {len(all_files_in_tables)} files in tables.", fg="white"))

View file

@ -67,7 +67,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append({"date": str(i.date), "message_count": i.message_count}) response_data.append({"date": str(i.date), "message_count": i.message_count})
@ -176,7 +176,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append({"date": str(i.date), "terminal_count": i.terminal_count}) response_data.append({"date": str(i.date), "terminal_count": i.terminal_count})
@ -234,7 +234,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append( response_data.append(
{"date": str(i.date), "token_count": i.token_count, "total_price": i.total_price, "currency": "USD"} {"date": str(i.date), "token_count": i.token_count, "total_price": i.total_price, "currency": "USD"}
@ -310,7 +310,7 @@ ORDER BY
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append( response_data.append(
{"date": str(i.date), "interactions": float(i.interactions.quantize(Decimal("0.01")))} {"date": str(i.date), "interactions": float(i.interactions.quantize(Decimal("0.01")))}
@ -373,7 +373,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append( response_data.append(
{ {
@ -435,7 +435,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append({"date": str(i.date), "latency": round(i.latency * 1000, 4)}) response_data.append({"date": str(i.date), "latency": round(i.latency * 1000, 4)})
@ -495,7 +495,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append({"date": str(i.date), "tps": round(i.tokens_per_second, 4)}) response_data.append({"date": str(i.date), "tps": round(i.tokens_per_second, 4)})

View file

@ -2,6 +2,7 @@ from datetime import datetime
from decimal import Decimal from decimal import Decimal
import pytz import pytz
import sqlalchemy as sa
from flask import jsonify from flask import jsonify
from flask_login import current_user from flask_login import current_user
from flask_restful import Resource, reqparse from flask_restful import Resource, reqparse
@ -71,7 +72,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append({"date": str(i.date), "runs": i.runs}) response_data.append({"date": str(i.date), "runs": i.runs})
@ -133,7 +134,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append({"date": str(i.date), "terminal_count": i.terminal_count}) response_data.append({"date": str(i.date), "terminal_count": i.terminal_count})
@ -195,7 +196,7 @@ WHERE
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append( response_data.append(
{ {
@ -277,7 +278,7 @@ GROUP BY
response_data = [] response_data = []
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql_query), arg_dict) rs = conn.execute(sa.text(sql_query), arg_dict)
for i in rs: for i in rs:
response_data.append( response_data.append(
{"date": str(i.date), "interactions": float(i.interactions.quantize(Decimal("0.01")))} {"date": str(i.date), "interactions": float(i.interactions.quantize(Decimal("0.01")))}

View file

@ -7,6 +7,7 @@ from os import listdir, path
from threading import Lock from threading import Lock
from typing import TYPE_CHECKING, Any, Literal, Optional, Union, cast from typing import TYPE_CHECKING, Any, Literal, Optional, Union, cast
import sqlalchemy as sa
from pydantic import TypeAdapter from pydantic import TypeAdapter
from yarl import URL from yarl import URL
@ -616,7 +617,7 @@ class ToolManager:
WHERE tenant_id = :tenant_id WHERE tenant_id = :tenant_id
ORDER BY tenant_id, provider, is_default DESC, created_at DESC ORDER BY tenant_id, provider, is_default DESC, created_at DESC
""" """
ids = [row.id for row in db.session.execute(db.text(sql), {"tenant_id": tenant_id}).all()] ids = [row.id for row in db.session.execute(sa.text(sql), {"tenant_id": tenant_id}).all()]
return db.session.query(BuiltinToolProvider).where(BuiltinToolProvider.id.in_(ids)).all() return db.session.query(BuiltinToolProvider).where(BuiltinToolProvider.id.in_(ids)).all()
@classmethod @classmethod

View file

@ -3,6 +3,7 @@ import json
from datetime import datetime from datetime import datetime
from typing import Optional, cast from typing import Optional, cast
import sqlalchemy as sa
from flask_login import UserMixin # type: ignore from flask_login import UserMixin # type: ignore
from sqlalchemy import DateTime, String, func, select from sqlalchemy import DateTime, String, func, select
from sqlalchemy.orm import Mapped, mapped_column, reconstructor from sqlalchemy.orm import Mapped, mapped_column, reconstructor
@ -83,9 +84,9 @@ class AccountStatus(enum.StrEnum):
class Account(UserMixin, Base): class Account(UserMixin, Base):
__tablename__ = "accounts" __tablename__ = "accounts"
__table_args__ = (db.PrimaryKeyConstraint("id", name="account_pkey"), db.Index("account_email_idx", "email")) __table_args__ = (sa.PrimaryKeyConstraint("id", name="account_pkey"), sa.Index("account_email_idx", "email"))
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
name: Mapped[str] = mapped_column(String(255)) name: Mapped[str] = mapped_column(String(255))
email: Mapped[str] = mapped_column(String(255)) email: Mapped[str] = mapped_column(String(255))
password: Mapped[Optional[str]] = mapped_column(String(255)) password: Mapped[Optional[str]] = mapped_column(String(255))
@ -97,7 +98,7 @@ class Account(UserMixin, Base):
last_login_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) last_login_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
last_login_ip: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) last_login_ip: Mapped[Optional[str]] = mapped_column(String(255), nullable=True)
last_active_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp(), nullable=False) last_active_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp(), nullable=False)
status: Mapped[str] = mapped_column(String(16), server_default=db.text("'active'::character varying")) status: Mapped[str] = mapped_column(String(16), server_default=sa.text("'active'::character varying"))
initialized_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) initialized_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp(), nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp(), nullable=False)
updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp(), nullable=False) updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp(), nullable=False)
@ -195,14 +196,14 @@ class TenantStatus(enum.StrEnum):
class Tenant(Base): class Tenant(Base):
__tablename__ = "tenants" __tablename__ = "tenants"
__table_args__ = (db.PrimaryKeyConstraint("id", name="tenant_pkey"),) __table_args__ = (sa.PrimaryKeyConstraint("id", name="tenant_pkey"),)
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
name: Mapped[str] = mapped_column(String(255)) name: Mapped[str] = mapped_column(String(255))
encrypt_public_key = db.Column(db.Text) encrypt_public_key = db.Column(sa.Text)
plan: Mapped[str] = mapped_column(String(255), server_default=db.text("'basic'::character varying")) plan: Mapped[str] = mapped_column(String(255), server_default=sa.text("'basic'::character varying"))
status: Mapped[str] = mapped_column(String(255), server_default=db.text("'normal'::character varying")) status: Mapped[str] = mapped_column(String(255), server_default=sa.text("'normal'::character varying"))
custom_config: Mapped[Optional[str]] = mapped_column(db.Text) custom_config: Mapped[Optional[str]] = mapped_column(sa.Text)
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp(), nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp(), nullable=False)
updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp())
@ -225,16 +226,16 @@ class Tenant(Base):
class TenantAccountJoin(Base): class TenantAccountJoin(Base):
__tablename__ = "tenant_account_joins" __tablename__ = "tenant_account_joins"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tenant_account_join_pkey"), sa.PrimaryKeyConstraint("id", name="tenant_account_join_pkey"),
db.Index("tenant_account_join_account_id_idx", "account_id"), sa.Index("tenant_account_join_account_id_idx", "account_id"),
db.Index("tenant_account_join_tenant_id_idx", "tenant_id"), sa.Index("tenant_account_join_tenant_id_idx", "tenant_id"),
db.UniqueConstraint("tenant_id", "account_id", name="unique_tenant_account_join"), sa.UniqueConstraint("tenant_id", "account_id", name="unique_tenant_account_join"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID) tenant_id: Mapped[str] = mapped_column(StringUUID)
account_id: Mapped[str] = mapped_column(StringUUID) account_id: Mapped[str] = mapped_column(StringUUID)
current: Mapped[bool] = mapped_column(db.Boolean, server_default=db.text("false")) current: Mapped[bool] = mapped_column(sa.Boolean, server_default=sa.text("false"))
role: Mapped[str] = mapped_column(String(16), server_default="normal") role: Mapped[str] = mapped_column(String(16), server_default="normal")
invited_by: Mapped[Optional[str]] = mapped_column(StringUUID) invited_by: Mapped[Optional[str]] = mapped_column(StringUUID)
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp())
@ -244,12 +245,12 @@ class TenantAccountJoin(Base):
class AccountIntegrate(Base): class AccountIntegrate(Base):
__tablename__ = "account_integrates" __tablename__ = "account_integrates"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="account_integrate_pkey"), sa.PrimaryKeyConstraint("id", name="account_integrate_pkey"),
db.UniqueConstraint("account_id", "provider", name="unique_account_provider"), sa.UniqueConstraint("account_id", "provider", name="unique_account_provider"),
db.UniqueConstraint("provider", "open_id", name="unique_provider_open_id"), sa.UniqueConstraint("provider", "open_id", name="unique_provider_open_id"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
account_id: Mapped[str] = mapped_column(StringUUID) account_id: Mapped[str] = mapped_column(StringUUID)
provider: Mapped[str] = mapped_column(String(16)) provider: Mapped[str] = mapped_column(String(16))
open_id: Mapped[str] = mapped_column(String(255)) open_id: Mapped[str] = mapped_column(String(255))
@ -261,20 +262,20 @@ class AccountIntegrate(Base):
class InvitationCode(Base): class InvitationCode(Base):
__tablename__ = "invitation_codes" __tablename__ = "invitation_codes"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="invitation_code_pkey"), sa.PrimaryKeyConstraint("id", name="invitation_code_pkey"),
db.Index("invitation_codes_batch_idx", "batch"), sa.Index("invitation_codes_batch_idx", "batch"),
db.Index("invitation_codes_code_idx", "code", "status"), sa.Index("invitation_codes_code_idx", "code", "status"),
) )
id: Mapped[int] = mapped_column(db.Integer) id: Mapped[int] = mapped_column(sa.Integer)
batch: Mapped[str] = mapped_column(String(255)) batch: Mapped[str] = mapped_column(String(255))
code: Mapped[str] = mapped_column(String(32)) code: Mapped[str] = mapped_column(String(32))
status: Mapped[str] = mapped_column(String(16), server_default=db.text("'unused'::character varying")) status: Mapped[str] = mapped_column(String(16), server_default=sa.text("'unused'::character varying"))
used_at: Mapped[Optional[datetime]] = mapped_column(DateTime) used_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
used_by_tenant_id: Mapped[Optional[str]] = mapped_column(StringUUID) used_by_tenant_id: Mapped[Optional[str]] = mapped_column(StringUUID)
used_by_account_id: Mapped[Optional[str]] = mapped_column(StringUUID) used_by_account_id: Mapped[Optional[str]] = mapped_column(StringUUID)
deprecated_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) deprecated_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=db.text("CURRENT_TIMESTAMP(0)")) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=sa.text("CURRENT_TIMESTAMP(0)"))
class TenantPluginPermission(Base): class TenantPluginPermission(Base):
@ -290,11 +291,11 @@ class TenantPluginPermission(Base):
__tablename__ = "account_plugin_permissions" __tablename__ = "account_plugin_permissions"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="account_plugin_permission_pkey"), sa.PrimaryKeyConstraint("id", name="account_plugin_permission_pkey"),
db.UniqueConstraint("tenant_id", name="unique_tenant_plugin"), sa.UniqueConstraint("tenant_id", name="unique_tenant_plugin"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
install_permission: Mapped[InstallPermission] = mapped_column(String(16), nullable=False, server_default="everyone") install_permission: Mapped[InstallPermission] = mapped_column(String(16), nullable=False, server_default="everyone")
debug_permission: Mapped[DebugPermission] = mapped_column(String(16), nullable=False, server_default="noone") debug_permission: Mapped[DebugPermission] = mapped_column(String(16), nullable=False, server_default="noone")
@ -313,16 +314,16 @@ class TenantPluginAutoUpgradeStrategy(Base):
__tablename__ = "tenant_plugin_auto_upgrade_strategies" __tablename__ = "tenant_plugin_auto_upgrade_strategies"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tenant_plugin_auto_upgrade_strategy_pkey"), sa.PrimaryKeyConstraint("id", name="tenant_plugin_auto_upgrade_strategy_pkey"),
db.UniqueConstraint("tenant_id", name="unique_tenant_plugin_auto_upgrade_strategy"), sa.UniqueConstraint("tenant_id", name="unique_tenant_plugin_auto_upgrade_strategy"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
strategy_setting: Mapped[StrategySetting] = mapped_column(String(16), nullable=False, server_default="fix_only") strategy_setting: Mapped[StrategySetting] = mapped_column(String(16), nullable=False, server_default="fix_only")
upgrade_time_of_day: Mapped[int] = mapped_column(db.Integer, nullable=False, default=0) # seconds of the day upgrade_time_of_day: Mapped[int] = mapped_column(sa.Integer, nullable=False, default=0) # seconds of the day
upgrade_mode: Mapped[UpgradeMode] = mapped_column(String(16), nullable=False, server_default="exclude") upgrade_mode: Mapped[UpgradeMode] = mapped_column(String(16), nullable=False, server_default="exclude")
exclude_plugins: Mapped[list[str]] = mapped_column(db.ARRAY(String(255)), nullable=False) # plugin_id (author/name) exclude_plugins: Mapped[list[str]] = mapped_column(sa.ARRAY(String(255)), nullable=False) # plugin_id (author/name)
include_plugins: Mapped[list[str]] = mapped_column(db.ARRAY(String(255)), nullable=False) # plugin_id (author/name) include_plugins: Mapped[list[str]] = mapped_column(sa.ARRAY(String(255)), nullable=False) # plugin_id (author/name)
created_at = db.Column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at = db.Column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = db.Column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = db.Column(DateTime, nullable=False, server_default=func.current_timestamp())

View file

@ -1,11 +1,11 @@
import enum import enum
from datetime import datetime from datetime import datetime
import sqlalchemy as sa
from sqlalchemy import DateTime, String, Text, func from sqlalchemy import DateTime, String, Text, func
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
from .base import Base from .base import Base
from .engine import db
from .types import StringUUID from .types import StringUUID
@ -19,11 +19,11 @@ class APIBasedExtensionPoint(enum.Enum):
class APIBasedExtension(Base): class APIBasedExtension(Base):
__tablename__ = "api_based_extensions" __tablename__ = "api_based_extensions"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="api_based_extension_pkey"), sa.PrimaryKeyConstraint("id", name="api_based_extension_pkey"),
db.Index("api_based_extension_tenant_idx", "tenant_id"), sa.Index("api_based_extension_tenant_idx", "tenant_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
api_endpoint: Mapped[str] = mapped_column(String(255), nullable=False) api_endpoint: Mapped[str] = mapped_column(String(255), nullable=False)

View file

@ -12,6 +12,7 @@ from datetime import datetime
from json import JSONDecodeError from json import JSONDecodeError
from typing import Any, Optional, cast from typing import Any, Optional, cast
import sqlalchemy as sa
from sqlalchemy import DateTime, String, func, select from sqlalchemy import DateTime, String, func, select
from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
@ -38,23 +39,23 @@ class DatasetPermissionEnum(enum.StrEnum):
class Dataset(Base): class Dataset(Base):
__tablename__ = "datasets" __tablename__ = "datasets"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_pkey"),
db.Index("dataset_tenant_idx", "tenant_id"), sa.Index("dataset_tenant_idx", "tenant_id"),
db.Index("retrieval_model_idx", "retrieval_model", postgresql_using="gin"), sa.Index("retrieval_model_idx", "retrieval_model", postgresql_using="gin"),
) )
INDEXING_TECHNIQUE_LIST = ["high_quality", "economy", None] INDEXING_TECHNIQUE_LIST = ["high_quality", "economy", None]
PROVIDER_LIST = ["vendor", "external", None] PROVIDER_LIST = ["vendor", "external", None]
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID) tenant_id: Mapped[str] = mapped_column(StringUUID)
name: Mapped[str] = mapped_column(String(255)) name: Mapped[str] = mapped_column(String(255))
description = mapped_column(db.Text, nullable=True) description = mapped_column(sa.Text, nullable=True)
provider: Mapped[str] = mapped_column(String(255), server_default=db.text("'vendor'::character varying")) provider: Mapped[str] = mapped_column(String(255), server_default=sa.text("'vendor'::character varying"))
permission: Mapped[str] = mapped_column(String(255), server_default=db.text("'only_me'::character varying")) permission: Mapped[str] = mapped_column(String(255), server_default=sa.text("'only_me'::character varying"))
data_source_type = mapped_column(String(255)) data_source_type = mapped_column(String(255))
indexing_technique: Mapped[Optional[str]] = mapped_column(String(255)) indexing_technique: Mapped[Optional[str]] = mapped_column(String(255))
index_struct = mapped_column(db.Text, nullable=True) index_struct = mapped_column(sa.Text, nullable=True)
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
@ -63,7 +64,7 @@ class Dataset(Base):
embedding_model_provider = db.Column(String(255), nullable=True) # TODO: mapped_column embedding_model_provider = db.Column(String(255), nullable=True) # TODO: mapped_column
collection_binding_id = mapped_column(StringUUID, nullable=True) collection_binding_id = mapped_column(StringUUID, nullable=True)
retrieval_model = mapped_column(JSONB, nullable=True) retrieval_model = mapped_column(JSONB, nullable=True)
built_in_field_enabled: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) built_in_field_enabled: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
@property @property
def dataset_keyword_table(self): def dataset_keyword_table(self):
@ -262,14 +263,14 @@ class Dataset(Base):
class DatasetProcessRule(Base): class DatasetProcessRule(Base):
__tablename__ = "dataset_process_rules" __tablename__ = "dataset_process_rules"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_process_rule_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_process_rule_pkey"),
db.Index("dataset_process_rule_dataset_id_idx", "dataset_id"), sa.Index("dataset_process_rule_dataset_id_idx", "dataset_id"),
) )
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
mode = mapped_column(String(255), nullable=False, server_default=db.text("'automatic'::character varying")) mode = mapped_column(String(255), nullable=False, server_default=sa.text("'automatic'::character varying"))
rules = mapped_column(db.Text, nullable=True) rules = mapped_column(sa.Text, nullable=True)
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
@ -302,20 +303,20 @@ class DatasetProcessRule(Base):
class Document(Base): class Document(Base):
__tablename__ = "documents" __tablename__ = "documents"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="document_pkey"), sa.PrimaryKeyConstraint("id", name="document_pkey"),
db.Index("document_dataset_id_idx", "dataset_id"), sa.Index("document_dataset_id_idx", "dataset_id"),
db.Index("document_is_paused_idx", "is_paused"), sa.Index("document_is_paused_idx", "is_paused"),
db.Index("document_tenant_idx", "tenant_id"), sa.Index("document_tenant_idx", "tenant_id"),
db.Index("document_metadata_idx", "doc_metadata", postgresql_using="gin"), sa.Index("document_metadata_idx", "doc_metadata", postgresql_using="gin"),
) )
# initial fields # initial fields
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
position: Mapped[int] = mapped_column(db.Integer, nullable=False) position: Mapped[int] = mapped_column(sa.Integer, nullable=False)
data_source_type: Mapped[str] = mapped_column(String(255), nullable=False) data_source_type: Mapped[str] = mapped_column(String(255), nullable=False)
data_source_info = mapped_column(db.Text, nullable=True) data_source_info = mapped_column(sa.Text, nullable=True)
dataset_process_rule_id = mapped_column(StringUUID, nullable=True) dataset_process_rule_id = mapped_column(StringUUID, nullable=True)
batch: Mapped[str] = mapped_column(String(255), nullable=False) batch: Mapped[str] = mapped_column(String(255), nullable=False)
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
@ -328,8 +329,8 @@ class Document(Base):
processing_started_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) processing_started_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
# parsing # parsing
file_id = mapped_column(db.Text, nullable=True) file_id = mapped_column(sa.Text, nullable=True)
word_count: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) # TODO: make this not nullable word_count: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True) # TODO: make this not nullable
parsing_completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) parsing_completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
# cleaning # cleaning
@ -339,32 +340,32 @@ class Document(Base):
splitting_completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) splitting_completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
# indexing # indexing
tokens: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) tokens: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
indexing_latency: Mapped[Optional[float]] = mapped_column(db.Float, nullable=True) indexing_latency: Mapped[Optional[float]] = mapped_column(sa.Float, nullable=True)
completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
# pause # pause
is_paused: Mapped[Optional[bool]] = mapped_column(db.Boolean, nullable=True, server_default=db.text("false")) is_paused: Mapped[Optional[bool]] = mapped_column(sa.Boolean, nullable=True, server_default=sa.text("false"))
paused_by = mapped_column(StringUUID, nullable=True) paused_by = mapped_column(StringUUID, nullable=True)
paused_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) paused_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
# error # error
error = mapped_column(db.Text, nullable=True) error = mapped_column(sa.Text, nullable=True)
stopped_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) stopped_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
# basic fields # basic fields
indexing_status = mapped_column(String(255), nullable=False, server_default=db.text("'waiting'::character varying")) indexing_status = mapped_column(String(255), nullable=False, server_default=sa.text("'waiting'::character varying"))
enabled: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("true")) enabled: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("true"))
disabled_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) disabled_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
disabled_by = mapped_column(StringUUID, nullable=True) disabled_by = mapped_column(StringUUID, nullable=True)
archived: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) archived: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
archived_reason = mapped_column(String(255), nullable=True) archived_reason = mapped_column(String(255), nullable=True)
archived_by = mapped_column(StringUUID, nullable=True) archived_by = mapped_column(StringUUID, nullable=True)
archived_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) archived_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
doc_type = mapped_column(String(40), nullable=True) doc_type = mapped_column(String(40), nullable=True)
doc_metadata = mapped_column(JSONB, nullable=True) doc_metadata = mapped_column(JSONB, nullable=True)
doc_form = mapped_column(String(255), nullable=False, server_default=db.text("'text_model'::character varying")) doc_form = mapped_column(String(255), nullable=False, server_default=sa.text("'text_model'::character varying"))
doc_language = mapped_column(String(255), nullable=True) doc_language = mapped_column(String(255), nullable=True)
DATA_SOURCES = ["upload_file", "notion_import", "website_crawl"] DATA_SOURCES = ["upload_file", "notion_import", "website_crawl"]
@ -643,44 +644,44 @@ class Document(Base):
class DocumentSegment(Base): class DocumentSegment(Base):
__tablename__ = "document_segments" __tablename__ = "document_segments"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="document_segment_pkey"), sa.PrimaryKeyConstraint("id", name="document_segment_pkey"),
db.Index("document_segment_dataset_id_idx", "dataset_id"), sa.Index("document_segment_dataset_id_idx", "dataset_id"),
db.Index("document_segment_document_id_idx", "document_id"), sa.Index("document_segment_document_id_idx", "document_id"),
db.Index("document_segment_tenant_dataset_idx", "dataset_id", "tenant_id"), sa.Index("document_segment_tenant_dataset_idx", "dataset_id", "tenant_id"),
db.Index("document_segment_tenant_document_idx", "document_id", "tenant_id"), sa.Index("document_segment_tenant_document_idx", "document_id", "tenant_id"),
db.Index("document_segment_node_dataset_idx", "index_node_id", "dataset_id"), sa.Index("document_segment_node_dataset_idx", "index_node_id", "dataset_id"),
db.Index("document_segment_tenant_idx", "tenant_id"), sa.Index("document_segment_tenant_idx", "tenant_id"),
) )
# initial fields # initial fields
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
document_id = mapped_column(StringUUID, nullable=False) document_id = mapped_column(StringUUID, nullable=False)
position: Mapped[int] position: Mapped[int]
content = mapped_column(db.Text, nullable=False) content = mapped_column(sa.Text, nullable=False)
answer = mapped_column(db.Text, nullable=True) answer = mapped_column(sa.Text, nullable=True)
word_count: Mapped[int] word_count: Mapped[int]
tokens: Mapped[int] tokens: Mapped[int]
# indexing fields # indexing fields
keywords = mapped_column(db.JSON, nullable=True) keywords = mapped_column(sa.JSON, nullable=True)
index_node_id = mapped_column(String(255), nullable=True) index_node_id = mapped_column(String(255), nullable=True)
index_node_hash = mapped_column(String(255), nullable=True) index_node_hash = mapped_column(String(255), nullable=True)
# basic fields # basic fields
hit_count: Mapped[int] = mapped_column(db.Integer, nullable=False, default=0) hit_count: Mapped[int] = mapped_column(sa.Integer, nullable=False, default=0)
enabled: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("true")) enabled: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("true"))
disabled_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) disabled_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
disabled_by = mapped_column(StringUUID, nullable=True) disabled_by = mapped_column(StringUUID, nullable=True)
status: Mapped[str] = mapped_column(String(255), server_default=db.text("'waiting'::character varying")) status: Mapped[str] = mapped_column(String(255), server_default=sa.text("'waiting'::character varying"))
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
indexing_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) indexing_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
error = mapped_column(db.Text, nullable=True) error = mapped_column(sa.Text, nullable=True)
stopped_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) stopped_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
@property @property
@ -794,36 +795,36 @@ class DocumentSegment(Base):
class ChildChunk(Base): class ChildChunk(Base):
__tablename__ = "child_chunks" __tablename__ = "child_chunks"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="child_chunk_pkey"), sa.PrimaryKeyConstraint("id", name="child_chunk_pkey"),
db.Index("child_chunk_dataset_id_idx", "tenant_id", "dataset_id", "document_id", "segment_id", "index_node_id"), sa.Index("child_chunk_dataset_id_idx", "tenant_id", "dataset_id", "document_id", "segment_id", "index_node_id"),
db.Index("child_chunks_node_idx", "index_node_id", "dataset_id"), sa.Index("child_chunks_node_idx", "index_node_id", "dataset_id"),
db.Index("child_chunks_segment_idx", "segment_id"), sa.Index("child_chunks_segment_idx", "segment_id"),
) )
# initial fields # initial fields
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
document_id = mapped_column(StringUUID, nullable=False) document_id = mapped_column(StringUUID, nullable=False)
segment_id = mapped_column(StringUUID, nullable=False) segment_id = mapped_column(StringUUID, nullable=False)
position: Mapped[int] = mapped_column(db.Integer, nullable=False) position: Mapped[int] = mapped_column(sa.Integer, nullable=False)
content = mapped_column(db.Text, nullable=False) content = mapped_column(sa.Text, nullable=False)
word_count: Mapped[int] = mapped_column(db.Integer, nullable=False) word_count: Mapped[int] = mapped_column(sa.Integer, nullable=False)
# indexing fields # indexing fields
index_node_id = mapped_column(String(255), nullable=True) index_node_id = mapped_column(String(255), nullable=True)
index_node_hash = mapped_column(String(255), nullable=True) index_node_hash = mapped_column(String(255), nullable=True)
type = mapped_column(String(255), nullable=False, server_default=db.text("'automatic'::character varying")) type = mapped_column(String(255), nullable=False, server_default=sa.text("'automatic'::character varying"))
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
updated_at: Mapped[datetime] = mapped_column( updated_at: Mapped[datetime] = mapped_column(
DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
indexing_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) indexing_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
error = mapped_column(db.Text, nullable=True) error = mapped_column(sa.Text, nullable=True)
@property @property
def dataset(self): def dataset(self):
@ -841,11 +842,11 @@ class ChildChunk(Base):
class AppDatasetJoin(Base): class AppDatasetJoin(Base):
__tablename__ = "app_dataset_joins" __tablename__ = "app_dataset_joins"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="app_dataset_join_pkey"), sa.PrimaryKeyConstraint("id", name="app_dataset_join_pkey"),
db.Index("app_dataset_join_app_dataset_idx", "dataset_id", "app_id"), sa.Index("app_dataset_join_app_dataset_idx", "dataset_id", "app_id"),
) )
id = mapped_column(StringUUID, primary_key=True, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, primary_key=True, nullable=False, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=db.func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=db.func.current_timestamp())
@ -858,13 +859,13 @@ class AppDatasetJoin(Base):
class DatasetQuery(Base): class DatasetQuery(Base):
__tablename__ = "dataset_queries" __tablename__ = "dataset_queries"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_query_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_query_pkey"),
db.Index("dataset_query_dataset_id_idx", "dataset_id"), sa.Index("dataset_query_dataset_id_idx", "dataset_id"),
) )
id = mapped_column(StringUUID, primary_key=True, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, primary_key=True, nullable=False, server_default=sa.text("uuid_generate_v4()"))
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
content = mapped_column(db.Text, nullable=False) content = mapped_column(sa.Text, nullable=False)
source: Mapped[str] = mapped_column(String(255), nullable=False) source: Mapped[str] = mapped_column(String(255), nullable=False)
source_app_id = mapped_column(StringUUID, nullable=True) source_app_id = mapped_column(StringUUID, nullable=True)
created_by_role = mapped_column(String, nullable=False) created_by_role = mapped_column(String, nullable=False)
@ -875,15 +876,15 @@ class DatasetQuery(Base):
class DatasetKeywordTable(Base): class DatasetKeywordTable(Base):
__tablename__ = "dataset_keyword_tables" __tablename__ = "dataset_keyword_tables"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_keyword_table_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_keyword_table_pkey"),
db.Index("dataset_keyword_table_dataset_id_idx", "dataset_id"), sa.Index("dataset_keyword_table_dataset_id_idx", "dataset_id"),
) )
id = mapped_column(StringUUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, primary_key=True, server_default=sa.text("uuid_generate_v4()"))
dataset_id = mapped_column(StringUUID, nullable=False, unique=True) dataset_id = mapped_column(StringUUID, nullable=False, unique=True)
keyword_table = mapped_column(db.Text, nullable=False) keyword_table = mapped_column(sa.Text, nullable=False)
data_source_type = mapped_column( data_source_type = mapped_column(
String(255), nullable=False, server_default=db.text("'database'::character varying") String(255), nullable=False, server_default=sa.text("'database'::character varying")
) )
@property @property
@ -920,19 +921,19 @@ class DatasetKeywordTable(Base):
class Embedding(Base): class Embedding(Base):
__tablename__ = "embeddings" __tablename__ = "embeddings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="embedding_pkey"), sa.PrimaryKeyConstraint("id", name="embedding_pkey"),
db.UniqueConstraint("model_name", "hash", "provider_name", name="embedding_hash_idx"), sa.UniqueConstraint("model_name", "hash", "provider_name", name="embedding_hash_idx"),
db.Index("created_at_idx", "created_at"), sa.Index("created_at_idx", "created_at"),
) )
id = mapped_column(StringUUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, primary_key=True, server_default=sa.text("uuid_generate_v4()"))
model_name = mapped_column( model_name = mapped_column(
String(255), nullable=False, server_default=db.text("'text-embedding-ada-002'::character varying") String(255), nullable=False, server_default=sa.text("'text-embedding-ada-002'::character varying")
) )
hash = mapped_column(String(64), nullable=False) hash = mapped_column(String(64), nullable=False)
embedding = mapped_column(db.LargeBinary, nullable=False) embedding = mapped_column(sa.LargeBinary, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
provider_name = mapped_column(String(255), nullable=False, server_default=db.text("''::character varying")) provider_name = mapped_column(String(255), nullable=False, server_default=sa.text("''::character varying"))
def set_embedding(self, embedding_data: list[float]): def set_embedding(self, embedding_data: list[float]):
self.embedding = pickle.dumps(embedding_data, protocol=pickle.HIGHEST_PROTOCOL) self.embedding = pickle.dumps(embedding_data, protocol=pickle.HIGHEST_PROTOCOL)
@ -944,14 +945,14 @@ class Embedding(Base):
class DatasetCollectionBinding(Base): class DatasetCollectionBinding(Base):
__tablename__ = "dataset_collection_bindings" __tablename__ = "dataset_collection_bindings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_collection_bindings_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_collection_bindings_pkey"),
db.Index("provider_model_name_idx", "provider_name", "model_name"), sa.Index("provider_model_name_idx", "provider_name", "model_name"),
) )
id = mapped_column(StringUUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, primary_key=True, server_default=sa.text("uuid_generate_v4()"))
provider_name: Mapped[str] = mapped_column(String(255), nullable=False) provider_name: Mapped[str] = mapped_column(String(255), nullable=False)
model_name: Mapped[str] = mapped_column(String(255), nullable=False) model_name: Mapped[str] = mapped_column(String(255), nullable=False)
type = mapped_column(String(40), server_default=db.text("'dataset'::character varying"), nullable=False) type = mapped_column(String(40), server_default=sa.text("'dataset'::character varying"), nullable=False)
collection_name = mapped_column(String(64), nullable=False) collection_name = mapped_column(String(64), nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
@ -959,17 +960,17 @@ class DatasetCollectionBinding(Base):
class TidbAuthBinding(Base): class TidbAuthBinding(Base):
__tablename__ = "tidb_auth_bindings" __tablename__ = "tidb_auth_bindings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tidb_auth_bindings_pkey"), sa.PrimaryKeyConstraint("id", name="tidb_auth_bindings_pkey"),
db.Index("tidb_auth_bindings_tenant_idx", "tenant_id"), sa.Index("tidb_auth_bindings_tenant_idx", "tenant_id"),
db.Index("tidb_auth_bindings_active_idx", "active"), sa.Index("tidb_auth_bindings_active_idx", "active"),
db.Index("tidb_auth_bindings_created_at_idx", "created_at"), sa.Index("tidb_auth_bindings_created_at_idx", "created_at"),
db.Index("tidb_auth_bindings_status_idx", "status"), sa.Index("tidb_auth_bindings_status_idx", "status"),
) )
id = mapped_column(StringUUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, primary_key=True, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=True) tenant_id = mapped_column(StringUUID, nullable=True)
cluster_id: Mapped[str] = mapped_column(String(255), nullable=False) cluster_id: Mapped[str] = mapped_column(String(255), nullable=False)
cluster_name: Mapped[str] = mapped_column(String(255), nullable=False) cluster_name: Mapped[str] = mapped_column(String(255), nullable=False)
active: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) active: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=db.text("false"))
status = mapped_column(String(255), nullable=False, server_default=db.text("'CREATING'::character varying")) status = mapped_column(String(255), nullable=False, server_default=db.text("'CREATING'::character varying"))
account: Mapped[str] = mapped_column(String(255), nullable=False) account: Mapped[str] = mapped_column(String(255), nullable=False)
password: Mapped[str] = mapped_column(String(255), nullable=False) password: Mapped[str] = mapped_column(String(255), nullable=False)
@ -979,10 +980,10 @@ class TidbAuthBinding(Base):
class Whitelist(Base): class Whitelist(Base):
__tablename__ = "whitelists" __tablename__ = "whitelists"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="whitelists_pkey"), sa.PrimaryKeyConstraint("id", name="whitelists_pkey"),
db.Index("whitelists_tenant_idx", "tenant_id"), sa.Index("whitelists_tenant_idx", "tenant_id"),
) )
id = mapped_column(StringUUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, primary_key=True, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=True) tenant_id = mapped_column(StringUUID, nullable=True)
category: Mapped[str] = mapped_column(String(255), nullable=False) category: Mapped[str] = mapped_column(String(255), nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
@ -991,33 +992,33 @@ class Whitelist(Base):
class DatasetPermission(Base): class DatasetPermission(Base):
__tablename__ = "dataset_permissions" __tablename__ = "dataset_permissions"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_permission_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_permission_pkey"),
db.Index("idx_dataset_permissions_dataset_id", "dataset_id"), sa.Index("idx_dataset_permissions_dataset_id", "dataset_id"),
db.Index("idx_dataset_permissions_account_id", "account_id"), sa.Index("idx_dataset_permissions_account_id", "account_id"),
db.Index("idx_dataset_permissions_tenant_id", "tenant_id"), sa.Index("idx_dataset_permissions_tenant_id", "tenant_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()"), primary_key=True) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"), primary_key=True)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
account_id = mapped_column(StringUUID, nullable=False) account_id = mapped_column(StringUUID, nullable=False)
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
has_permission: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("true")) has_permission: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("true"))
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
class ExternalKnowledgeApis(Base): class ExternalKnowledgeApis(Base):
__tablename__ = "external_knowledge_apis" __tablename__ = "external_knowledge_apis"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="external_knowledge_apis_pkey"), sa.PrimaryKeyConstraint("id", name="external_knowledge_apis_pkey"),
db.Index("external_knowledge_apis_tenant_idx", "tenant_id"), sa.Index("external_knowledge_apis_tenant_idx", "tenant_id"),
db.Index("external_knowledge_apis_name_idx", "name"), sa.Index("external_knowledge_apis_name_idx", "name"),
) )
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
description: Mapped[str] = mapped_column(String(255), nullable=False) description: Mapped[str] = mapped_column(String(255), nullable=False)
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
settings = mapped_column(db.Text, nullable=True) settings = mapped_column(sa.Text, nullable=True)
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
@ -1061,18 +1062,18 @@ class ExternalKnowledgeApis(Base):
class ExternalKnowledgeBindings(Base): class ExternalKnowledgeBindings(Base):
__tablename__ = "external_knowledge_bindings" __tablename__ = "external_knowledge_bindings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="external_knowledge_bindings_pkey"), sa.PrimaryKeyConstraint("id", name="external_knowledge_bindings_pkey"),
db.Index("external_knowledge_bindings_tenant_idx", "tenant_id"), sa.Index("external_knowledge_bindings_tenant_idx", "tenant_id"),
db.Index("external_knowledge_bindings_dataset_idx", "dataset_id"), sa.Index("external_knowledge_bindings_dataset_idx", "dataset_id"),
db.Index("external_knowledge_bindings_external_knowledge_idx", "external_knowledge_id"), sa.Index("external_knowledge_bindings_external_knowledge_idx", "external_knowledge_id"),
db.Index("external_knowledge_bindings_external_knowledge_api_idx", "external_knowledge_api_id"), sa.Index("external_knowledge_bindings_external_knowledge_api_idx", "external_knowledge_api_id"),
) )
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
external_knowledge_api_id = mapped_column(StringUUID, nullable=False) external_knowledge_api_id = mapped_column(StringUUID, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
external_knowledge_id = mapped_column(db.Text, nullable=False) external_knowledge_id = mapped_column(sa.Text, nullable=False)
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
@ -1082,57 +1083,57 @@ class ExternalKnowledgeBindings(Base):
class DatasetAutoDisableLog(Base): class DatasetAutoDisableLog(Base):
__tablename__ = "dataset_auto_disable_logs" __tablename__ = "dataset_auto_disable_logs"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_auto_disable_log_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_auto_disable_log_pkey"),
db.Index("dataset_auto_disable_log_tenant_idx", "tenant_id"), sa.Index("dataset_auto_disable_log_tenant_idx", "tenant_id"),
db.Index("dataset_auto_disable_log_dataset_idx", "dataset_id"), sa.Index("dataset_auto_disable_log_dataset_idx", "dataset_id"),
db.Index("dataset_auto_disable_log_created_atx", "created_at"), sa.Index("dataset_auto_disable_log_created_atx", "created_at"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
document_id = mapped_column(StringUUID, nullable=False) document_id = mapped_column(StringUUID, nullable=False)
notified: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) notified: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
class RateLimitLog(Base): class RateLimitLog(Base):
__tablename__ = "rate_limit_logs" __tablename__ = "rate_limit_logs"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="rate_limit_log_pkey"), sa.PrimaryKeyConstraint("id", name="rate_limit_log_pkey"),
db.Index("rate_limit_log_tenant_idx", "tenant_id"), sa.Index("rate_limit_log_tenant_idx", "tenant_id"),
db.Index("rate_limit_log_operation_idx", "operation"), sa.Index("rate_limit_log_operation_idx", "operation"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
subscription_plan: Mapped[str] = mapped_column(String(255), nullable=False) subscription_plan: Mapped[str] = mapped_column(String(255), nullable=False)
operation: Mapped[str] = mapped_column(String(255), nullable=False) operation: Mapped[str] = mapped_column(String(255), nullable=False)
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
class DatasetMetadata(Base): class DatasetMetadata(Base):
__tablename__ = "dataset_metadatas" __tablename__ = "dataset_metadatas"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_metadata_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_metadata_pkey"),
db.Index("dataset_metadata_tenant_idx", "tenant_id"), sa.Index("dataset_metadata_tenant_idx", "tenant_id"),
db.Index("dataset_metadata_dataset_idx", "dataset_id"), sa.Index("dataset_metadata_dataset_idx", "dataset_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
type: Mapped[str] = mapped_column(String(255), nullable=False) type: Mapped[str] = mapped_column(String(255), nullable=False)
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
updated_at: Mapped[datetime] = mapped_column( updated_at: Mapped[datetime] = mapped_column(
DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
@ -1141,14 +1142,14 @@ class DatasetMetadata(Base):
class DatasetMetadataBinding(Base): class DatasetMetadataBinding(Base):
__tablename__ = "dataset_metadata_bindings" __tablename__ = "dataset_metadata_bindings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_metadata_binding_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_metadata_binding_pkey"),
db.Index("dataset_metadata_binding_tenant_idx", "tenant_id"), sa.Index("dataset_metadata_binding_tenant_idx", "tenant_id"),
db.Index("dataset_metadata_binding_dataset_idx", "dataset_id"), sa.Index("dataset_metadata_binding_dataset_idx", "dataset_id"),
db.Index("dataset_metadata_binding_metadata_idx", "metadata_id"), sa.Index("dataset_metadata_binding_metadata_idx", "metadata_id"),
db.Index("dataset_metadata_binding_document_idx", "document_id"), sa.Index("dataset_metadata_binding_document_idx", "document_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
metadata_id = mapped_column(StringUUID, nullable=False) metadata_id = mapped_column(StringUUID, nullable=False)

View file

@ -35,10 +35,10 @@ from .types import StringUUID
class DifySetup(Base): class DifySetup(Base):
__tablename__ = "dify_setups" __tablename__ = "dify_setups"
__table_args__ = (db.PrimaryKeyConstraint("version", name="dify_setup_pkey"),) __table_args__ = (sa.PrimaryKeyConstraint("version", name="dify_setup_pkey"),)
version: Mapped[str] = mapped_column(String(255), nullable=False) version: Mapped[str] = mapped_column(String(255), nullable=False)
setup_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) setup_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
class AppMode(StrEnum): class AppMode(StrEnum):
@ -69,33 +69,33 @@ class IconType(Enum):
class App(Base): class App(Base):
__tablename__ = "apps" __tablename__ = "apps"
__table_args__ = (db.PrimaryKeyConstraint("id", name="app_pkey"), db.Index("app_tenant_id_idx", "tenant_id")) __table_args__ = (sa.PrimaryKeyConstraint("id", name="app_pkey"), sa.Index("app_tenant_id_idx", "tenant_id"))
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID) tenant_id: Mapped[str] = mapped_column(StringUUID)
name: Mapped[str] = mapped_column(String(255)) name: Mapped[str] = mapped_column(String(255))
description: Mapped[str] = mapped_column(db.Text, server_default=db.text("''::character varying")) description: Mapped[str] = mapped_column(sa.Text, server_default=sa.text("''::character varying"))
mode: Mapped[str] = mapped_column(String(255)) mode: Mapped[str] = mapped_column(String(255))
icon_type: Mapped[Optional[str]] = mapped_column(String(255)) # image, emoji icon_type: Mapped[Optional[str]] = mapped_column(String(255)) # image, emoji
icon = db.Column(String(255)) icon = db.Column(String(255))
icon_background: Mapped[Optional[str]] = mapped_column(String(255)) icon_background: Mapped[Optional[str]] = mapped_column(String(255))
app_model_config_id = mapped_column(StringUUID, nullable=True) app_model_config_id = mapped_column(StringUUID, nullable=True)
workflow_id = mapped_column(StringUUID, nullable=True) workflow_id = mapped_column(StringUUID, nullable=True)
status: Mapped[str] = mapped_column(String(255), server_default=db.text("'normal'::character varying")) status: Mapped[str] = mapped_column(String(255), server_default=sa.text("'normal'::character varying"))
enable_site: Mapped[bool] = mapped_column(db.Boolean) enable_site: Mapped[bool] = mapped_column(sa.Boolean)
enable_api: Mapped[bool] = mapped_column(db.Boolean) enable_api: Mapped[bool] = mapped_column(sa.Boolean)
api_rpm: Mapped[int] = mapped_column(db.Integer, server_default=db.text("0")) api_rpm: Mapped[int] = mapped_column(sa.Integer, server_default=sa.text("0"))
api_rph: Mapped[int] = mapped_column(db.Integer, server_default=db.text("0")) api_rph: Mapped[int] = mapped_column(sa.Integer, server_default=sa.text("0"))
is_demo: Mapped[bool] = mapped_column(db.Boolean, server_default=db.text("false")) is_demo: Mapped[bool] = mapped_column(sa.Boolean, server_default=sa.text("false"))
is_public: Mapped[bool] = mapped_column(db.Boolean, server_default=db.text("false")) is_public: Mapped[bool] = mapped_column(sa.Boolean, server_default=sa.text("false"))
is_universal: Mapped[bool] = mapped_column(db.Boolean, server_default=db.text("false")) is_universal: Mapped[bool] = mapped_column(sa.Boolean, server_default=sa.text("false"))
tracing = mapped_column(db.Text, nullable=True) tracing = mapped_column(sa.Text, nullable=True)
max_active_requests: Mapped[Optional[int]] max_active_requests: Mapped[Optional[int]]
created_by = mapped_column(StringUUID, nullable=True) created_by = mapped_column(StringUUID, nullable=True)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
updated_at: Mapped[datetime] = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
use_icon_as_answer_icon: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) use_icon_as_answer_icon: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
@property @property
def desc_or_prompt(self): def desc_or_prompt(self):
@ -302,36 +302,36 @@ class App(Base):
class AppModelConfig(Base): class AppModelConfig(Base):
__tablename__ = "app_model_configs" __tablename__ = "app_model_configs"
__table_args__ = (db.PrimaryKeyConstraint("id", name="app_model_config_pkey"), db.Index("app_app_id_idx", "app_id")) __table_args__ = (sa.PrimaryKeyConstraint("id", name="app_model_config_pkey"), sa.Index("app_app_id_idx", "app_id"))
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
provider = mapped_column(String(255), nullable=True) provider = mapped_column(String(255), nullable=True)
model_id = mapped_column(String(255), nullable=True) model_id = mapped_column(String(255), nullable=True)
configs = mapped_column(db.JSON, nullable=True) configs = mapped_column(sa.JSON, nullable=True)
created_by = mapped_column(StringUUID, nullable=True) created_by = mapped_column(StringUUID, nullable=True)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
opening_statement = mapped_column(db.Text) opening_statement = mapped_column(sa.Text)
suggested_questions = mapped_column(db.Text) suggested_questions = mapped_column(sa.Text)
suggested_questions_after_answer = mapped_column(db.Text) suggested_questions_after_answer = mapped_column(sa.Text)
speech_to_text = mapped_column(db.Text) speech_to_text = mapped_column(sa.Text)
text_to_speech = mapped_column(db.Text) text_to_speech = mapped_column(sa.Text)
more_like_this = mapped_column(db.Text) more_like_this = mapped_column(sa.Text)
model = mapped_column(db.Text) model = mapped_column(sa.Text)
user_input_form = mapped_column(db.Text) user_input_form = mapped_column(sa.Text)
dataset_query_variable = mapped_column(String(255)) dataset_query_variable = mapped_column(String(255))
pre_prompt = mapped_column(db.Text) pre_prompt = mapped_column(sa.Text)
agent_mode = mapped_column(db.Text) agent_mode = mapped_column(sa.Text)
sensitive_word_avoidance = mapped_column(db.Text) sensitive_word_avoidance = mapped_column(sa.Text)
retriever_resource = mapped_column(db.Text) retriever_resource = mapped_column(sa.Text)
prompt_type = mapped_column(String(255), nullable=False, server_default=db.text("'simple'::character varying")) prompt_type = mapped_column(String(255), nullable=False, server_default=sa.text("'simple'::character varying"))
chat_prompt_config = mapped_column(db.Text) chat_prompt_config = mapped_column(sa.Text)
completion_prompt_config = mapped_column(db.Text) completion_prompt_config = mapped_column(sa.Text)
dataset_configs = mapped_column(db.Text) dataset_configs = mapped_column(sa.Text)
external_data_tools = mapped_column(db.Text) external_data_tools = mapped_column(sa.Text)
file_upload = mapped_column(db.Text) file_upload = mapped_column(sa.Text)
@property @property
def app(self): def app(self):
@ -553,24 +553,24 @@ class AppModelConfig(Base):
class RecommendedApp(Base): class RecommendedApp(Base):
__tablename__ = "recommended_apps" __tablename__ = "recommended_apps"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="recommended_app_pkey"), sa.PrimaryKeyConstraint("id", name="recommended_app_pkey"),
db.Index("recommended_app_app_id_idx", "app_id"), sa.Index("recommended_app_app_id_idx", "app_id"),
db.Index("recommended_app_is_listed_idx", "is_listed", "language"), sa.Index("recommended_app_is_listed_idx", "is_listed", "language"),
) )
id = mapped_column(StringUUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, primary_key=True, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
description = mapped_column(db.JSON, nullable=False) description = mapped_column(sa.JSON, nullable=False)
copyright: Mapped[str] = mapped_column(String(255), nullable=False) copyright: Mapped[str] = mapped_column(String(255), nullable=False)
privacy_policy: Mapped[str] = mapped_column(String(255), nullable=False) privacy_policy: Mapped[str] = mapped_column(String(255), nullable=False)
custom_disclaimer: Mapped[str] = mapped_column(sa.TEXT, default="") custom_disclaimer: Mapped[str] = mapped_column(sa.TEXT, default="")
category: Mapped[str] = mapped_column(String(255), nullable=False) category: Mapped[str] = mapped_column(String(255), nullable=False)
position: Mapped[int] = mapped_column(db.Integer, nullable=False, default=0) position: Mapped[int] = mapped_column(sa.Integer, nullable=False, default=0)
is_listed: Mapped[bool] = mapped_column(db.Boolean, nullable=False, default=True) is_listed: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, default=True)
install_count: Mapped[int] = mapped_column(db.Integer, nullable=False, default=0) install_count: Mapped[int] = mapped_column(sa.Integer, nullable=False, default=0)
language = mapped_column(String(255), nullable=False, server_default=db.text("'en-US'::character varying")) language = mapped_column(String(255), nullable=False, server_default=sa.text("'en-US'::character varying"))
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@property @property
def app(self): def app(self):
@ -581,20 +581,20 @@ class RecommendedApp(Base):
class InstalledApp(Base): class InstalledApp(Base):
__tablename__ = "installed_apps" __tablename__ = "installed_apps"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="installed_app_pkey"), sa.PrimaryKeyConstraint("id", name="installed_app_pkey"),
db.Index("installed_app_tenant_id_idx", "tenant_id"), sa.Index("installed_app_tenant_id_idx", "tenant_id"),
db.Index("installed_app_app_id_idx", "app_id"), sa.Index("installed_app_app_id_idx", "app_id"),
db.UniqueConstraint("tenant_id", "app_id", name="unique_tenant_app"), sa.UniqueConstraint("tenant_id", "app_id", name="unique_tenant_app"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
app_owner_tenant_id = mapped_column(StringUUID, nullable=False) app_owner_tenant_id = mapped_column(StringUUID, nullable=False)
position: Mapped[int] = mapped_column(db.Integer, nullable=False, default=0) position: Mapped[int] = mapped_column(sa.Integer, nullable=False, default=0)
is_pinned: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) is_pinned: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
last_used_at = mapped_column(db.DateTime, nullable=True) last_used_at = mapped_column(sa.DateTime, nullable=True)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@property @property
def app(self): def app(self):
@ -610,23 +610,23 @@ class InstalledApp(Base):
class Conversation(Base): class Conversation(Base):
__tablename__ = "conversations" __tablename__ = "conversations"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="conversation_pkey"), sa.PrimaryKeyConstraint("id", name="conversation_pkey"),
db.Index("conversation_app_from_user_idx", "app_id", "from_source", "from_end_user_id"), sa.Index("conversation_app_from_user_idx", "app_id", "from_source", "from_end_user_id"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
app_model_config_id = mapped_column(StringUUID, nullable=True) app_model_config_id = mapped_column(StringUUID, nullable=True)
model_provider = mapped_column(String(255), nullable=True) model_provider = mapped_column(String(255), nullable=True)
override_model_configs = mapped_column(db.Text) override_model_configs = mapped_column(sa.Text)
model_id = mapped_column(String(255), nullable=True) model_id = mapped_column(String(255), nullable=True)
mode: Mapped[str] = mapped_column(String(255)) mode: Mapped[str] = mapped_column(String(255))
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
summary = mapped_column(db.Text) summary = mapped_column(sa.Text)
_inputs: Mapped[dict] = mapped_column("inputs", db.JSON) _inputs: Mapped[dict] = mapped_column("inputs", sa.JSON)
introduction = mapped_column(db.Text) introduction = mapped_column(sa.Text)
system_instruction = mapped_column(db.Text) system_instruction = mapped_column(sa.Text)
system_instruction_tokens: Mapped[int] = mapped_column(db.Integer, nullable=False, server_default=db.text("0")) system_instruction_tokens: Mapped[int] = mapped_column(sa.Integer, nullable=False, server_default=sa.text("0"))
status: Mapped[str] = mapped_column(String(255), nullable=False) status: Mapped[str] = mapped_column(String(255), nullable=False)
# The `invoke_from` records how the conversation is created. # The `invoke_from` records how the conversation is created.
@ -639,18 +639,18 @@ class Conversation(Base):
from_source: Mapped[str] = mapped_column(String(255), nullable=False) from_source: Mapped[str] = mapped_column(String(255), nullable=False)
from_end_user_id = mapped_column(StringUUID) from_end_user_id = mapped_column(StringUUID)
from_account_id = mapped_column(StringUUID) from_account_id = mapped_column(StringUUID)
read_at = mapped_column(db.DateTime) read_at = mapped_column(sa.DateTime)
read_account_id = mapped_column(StringUUID) read_account_id = mapped_column(StringUUID)
dialogue_count: Mapped[int] = mapped_column(default=0) dialogue_count: Mapped[int] = mapped_column(default=0)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
messages = db.relationship("Message", backref="conversation", lazy="select", passive_deletes="all") messages = db.relationship("Message", backref="conversation", lazy="select", passive_deletes="all")
message_annotations = db.relationship( message_annotations = db.relationship(
"MessageAnnotation", backref="conversation", lazy="select", passive_deletes="all" "MessageAnnotation", backref="conversation", lazy="select", passive_deletes="all"
) )
is_deleted: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) is_deleted: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
@property @property
def inputs(self): def inputs(self):
@ -892,36 +892,36 @@ class Message(Base):
Index("message_created_at_idx", "created_at"), Index("message_created_at_idx", "created_at"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
model_provider = mapped_column(String(255), nullable=True) model_provider = mapped_column(String(255), nullable=True)
model_id = mapped_column(String(255), nullable=True) model_id = mapped_column(String(255), nullable=True)
override_model_configs = mapped_column(db.Text) override_model_configs = mapped_column(sa.Text)
conversation_id = mapped_column(StringUUID, db.ForeignKey("conversations.id"), nullable=False) conversation_id = mapped_column(StringUUID, sa.ForeignKey("conversations.id"), nullable=False)
_inputs: Mapped[dict] = mapped_column("inputs", db.JSON) _inputs: Mapped[dict] = mapped_column("inputs", sa.JSON)
query: Mapped[str] = mapped_column(db.Text, nullable=False) query: Mapped[str] = mapped_column(sa.Text, nullable=False)
message = mapped_column(db.JSON, nullable=False) message = mapped_column(sa.JSON, nullable=False)
message_tokens: Mapped[int] = mapped_column(db.Integer, nullable=False, server_default=db.text("0")) message_tokens: Mapped[int] = mapped_column(sa.Integer, nullable=False, server_default=sa.text("0"))
message_unit_price = mapped_column(db.Numeric(10, 4), nullable=False) message_unit_price = mapped_column(sa.Numeric(10, 4), nullable=False)
message_price_unit = mapped_column(db.Numeric(10, 7), nullable=False, server_default=db.text("0.001")) message_price_unit = mapped_column(sa.Numeric(10, 7), nullable=False, server_default=sa.text("0.001"))
answer: Mapped[str] = db.Column(db.Text, nullable=False) # TODO make it mapped_column answer: Mapped[str] = db.Column(sa.Text, nullable=False) # TODO make it mapped_column
answer_tokens: Mapped[int] = mapped_column(db.Integer, nullable=False, server_default=db.text("0")) answer_tokens: Mapped[int] = mapped_column(sa.Integer, nullable=False, server_default=sa.text("0"))
answer_unit_price = mapped_column(db.Numeric(10, 4), nullable=False) answer_unit_price = mapped_column(sa.Numeric(10, 4), nullable=False)
answer_price_unit = mapped_column(db.Numeric(10, 7), nullable=False, server_default=db.text("0.001")) answer_price_unit = mapped_column(sa.Numeric(10, 7), nullable=False, server_default=sa.text("0.001"))
parent_message_id = mapped_column(StringUUID, nullable=True) parent_message_id = mapped_column(StringUUID, nullable=True)
provider_response_latency = mapped_column(db.Float, nullable=False, server_default=db.text("0")) provider_response_latency = mapped_column(sa.Float, nullable=False, server_default=sa.text("0"))
total_price = mapped_column(db.Numeric(10, 7)) total_price = mapped_column(sa.Numeric(10, 7))
currency: Mapped[str] = mapped_column(String(255), nullable=False) currency: Mapped[str] = mapped_column(String(255), nullable=False)
status = mapped_column(String(255), nullable=False, server_default=db.text("'normal'::character varying")) status = mapped_column(String(255), nullable=False, server_default=sa.text("'normal'::character varying"))
error = mapped_column(db.Text) error = mapped_column(sa.Text)
message_metadata = mapped_column(db.Text) message_metadata = mapped_column(sa.Text)
invoke_from: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) invoke_from: Mapped[Optional[str]] = mapped_column(String(255), nullable=True)
from_source: Mapped[str] = mapped_column(String(255), nullable=False) from_source: Mapped[str] = mapped_column(String(255), nullable=False)
from_end_user_id: Mapped[Optional[str]] = mapped_column(StringUUID) from_end_user_id: Mapped[Optional[str]] = mapped_column(StringUUID)
from_account_id: Mapped[Optional[str]] = mapped_column(StringUUID) from_account_id: Mapped[Optional[str]] = mapped_column(StringUUID)
created_at: Mapped[datetime] = mapped_column(db.DateTime, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(sa.DateTime, server_default=func.current_timestamp())
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
agent_based: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) agent_based: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
workflow_run_id: Mapped[Optional[str]] = mapped_column(StringUUID) workflow_run_id: Mapped[Optional[str]] = mapped_column(StringUUID)
@property @property
@ -1228,23 +1228,23 @@ class Message(Base):
class MessageFeedback(Base): class MessageFeedback(Base):
__tablename__ = "message_feedbacks" __tablename__ = "message_feedbacks"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="message_feedback_pkey"), sa.PrimaryKeyConstraint("id", name="message_feedback_pkey"),
db.Index("message_feedback_app_idx", "app_id"), sa.Index("message_feedback_app_idx", "app_id"),
db.Index("message_feedback_message_idx", "message_id", "from_source"), sa.Index("message_feedback_message_idx", "message_id", "from_source"),
db.Index("message_feedback_conversation_idx", "conversation_id", "from_source", "rating"), sa.Index("message_feedback_conversation_idx", "conversation_id", "from_source", "rating"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
conversation_id = mapped_column(StringUUID, nullable=False) conversation_id = mapped_column(StringUUID, nullable=False)
message_id = mapped_column(StringUUID, nullable=False) message_id = mapped_column(StringUUID, nullable=False)
rating: Mapped[str] = mapped_column(String(255), nullable=False) rating: Mapped[str] = mapped_column(String(255), nullable=False)
content = mapped_column(db.Text) content = mapped_column(sa.Text)
from_source: Mapped[str] = mapped_column(String(255), nullable=False) from_source: Mapped[str] = mapped_column(String(255), nullable=False)
from_end_user_id = mapped_column(StringUUID) from_end_user_id = mapped_column(StringUUID)
from_account_id = mapped_column(StringUUID) from_account_id = mapped_column(StringUUID)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@property @property
def from_account(self): def from_account(self):
@ -1270,9 +1270,9 @@ class MessageFeedback(Base):
class MessageFile(Base): class MessageFile(Base):
__tablename__ = "message_files" __tablename__ = "message_files"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="message_file_pkey"), sa.PrimaryKeyConstraint("id", name="message_file_pkey"),
db.Index("message_file_message_idx", "message_id"), sa.Index("message_file_message_idx", "message_id"),
db.Index("message_file_created_by_idx", "created_by"), sa.Index("message_file_created_by_idx", "created_by"),
) )
def __init__( def __init__(
@ -1296,37 +1296,37 @@ class MessageFile(Base):
self.created_by_role = created_by_role.value self.created_by_role = created_by_role.value
self.created_by = created_by self.created_by = created_by
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
message_id: Mapped[str] = mapped_column(StringUUID, nullable=False) message_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
type: Mapped[str] = mapped_column(String(255), nullable=False) type: Mapped[str] = mapped_column(String(255), nullable=False)
transfer_method: Mapped[str] = mapped_column(String(255), nullable=False) transfer_method: Mapped[str] = mapped_column(String(255), nullable=False)
url: Mapped[Optional[str]] = mapped_column(db.Text, nullable=True) url: Mapped[Optional[str]] = mapped_column(sa.Text, nullable=True)
belongs_to: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) belongs_to: Mapped[Optional[str]] = mapped_column(String(255), nullable=True)
upload_file_id: Mapped[Optional[str]] = mapped_column(StringUUID, nullable=True) upload_file_id: Mapped[Optional[str]] = mapped_column(StringUUID, nullable=True)
created_by_role: Mapped[str] = mapped_column(String(255), nullable=False) created_by_role: Mapped[str] = mapped_column(String(255), nullable=False)
created_by: Mapped[str] = mapped_column(StringUUID, nullable=False) created_by: Mapped[str] = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
class MessageAnnotation(Base): class MessageAnnotation(Base):
__tablename__ = "message_annotations" __tablename__ = "message_annotations"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="message_annotation_pkey"), sa.PrimaryKeyConstraint("id", name="message_annotation_pkey"),
db.Index("message_annotation_app_idx", "app_id"), sa.Index("message_annotation_app_idx", "app_id"),
db.Index("message_annotation_conversation_idx", "conversation_id"), sa.Index("message_annotation_conversation_idx", "conversation_id"),
db.Index("message_annotation_message_idx", "message_id"), sa.Index("message_annotation_message_idx", "message_id"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id: Mapped[str] = mapped_column(StringUUID) app_id: Mapped[str] = mapped_column(StringUUID)
conversation_id: Mapped[Optional[str]] = mapped_column(StringUUID, db.ForeignKey("conversations.id")) conversation_id: Mapped[Optional[str]] = mapped_column(StringUUID, sa.ForeignKey("conversations.id"))
message_id: Mapped[Optional[str]] = mapped_column(StringUUID) message_id: Mapped[Optional[str]] = mapped_column(StringUUID)
question = db.Column(db.Text, nullable=True) question = db.Column(sa.Text, nullable=True)
content = mapped_column(db.Text, nullable=False) content = mapped_column(sa.Text, nullable=False)
hit_count: Mapped[int] = mapped_column(db.Integer, nullable=False, server_default=db.text("0")) hit_count: Mapped[int] = mapped_column(sa.Integer, nullable=False, server_default=sa.text("0"))
account_id = mapped_column(StringUUID, nullable=False) account_id = mapped_column(StringUUID, nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@property @property
def account(self): def account(self):
@ -1342,24 +1342,24 @@ class MessageAnnotation(Base):
class AppAnnotationHitHistory(Base): class AppAnnotationHitHistory(Base):
__tablename__ = "app_annotation_hit_histories" __tablename__ = "app_annotation_hit_histories"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="app_annotation_hit_histories_pkey"), sa.PrimaryKeyConstraint("id", name="app_annotation_hit_histories_pkey"),
db.Index("app_annotation_hit_histories_app_idx", "app_id"), sa.Index("app_annotation_hit_histories_app_idx", "app_id"),
db.Index("app_annotation_hit_histories_account_idx", "account_id"), sa.Index("app_annotation_hit_histories_account_idx", "account_id"),
db.Index("app_annotation_hit_histories_annotation_idx", "annotation_id"), sa.Index("app_annotation_hit_histories_annotation_idx", "annotation_id"),
db.Index("app_annotation_hit_histories_message_idx", "message_id"), sa.Index("app_annotation_hit_histories_message_idx", "message_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
annotation_id: Mapped[str] = mapped_column(StringUUID, nullable=False) annotation_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
source = mapped_column(db.Text, nullable=False) source = mapped_column(sa.Text, nullable=False)
question = mapped_column(db.Text, nullable=False) question = mapped_column(sa.Text, nullable=False)
account_id = mapped_column(StringUUID, nullable=False) account_id = mapped_column(StringUUID, nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
score = mapped_column(Float, nullable=False, server_default=db.text("0")) score = mapped_column(Float, nullable=False, server_default=sa.text("0"))
message_id = mapped_column(StringUUID, nullable=False) message_id = mapped_column(StringUUID, nullable=False)
annotation_question = mapped_column(db.Text, nullable=False) annotation_question = mapped_column(sa.Text, nullable=False)
annotation_content = mapped_column(db.Text, nullable=False) annotation_content = mapped_column(sa.Text, nullable=False)
@property @property
def account(self): def account(self):
@ -1380,18 +1380,18 @@ class AppAnnotationHitHistory(Base):
class AppAnnotationSetting(Base): class AppAnnotationSetting(Base):
__tablename__ = "app_annotation_settings" __tablename__ = "app_annotation_settings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="app_annotation_settings_pkey"), sa.PrimaryKeyConstraint("id", name="app_annotation_settings_pkey"),
db.Index("app_annotation_settings_app_idx", "app_id"), sa.Index("app_annotation_settings_app_idx", "app_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
score_threshold = mapped_column(Float, nullable=False, server_default=db.text("0")) score_threshold = mapped_column(Float, nullable=False, server_default=sa.text("0"))
collection_binding_id = mapped_column(StringUUID, nullable=False) collection_binding_id = mapped_column(StringUUID, nullable=False)
created_user_id = mapped_column(StringUUID, nullable=False) created_user_id = mapped_column(StringUUID, nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_user_id = mapped_column(StringUUID, nullable=False) updated_user_id = mapped_column(StringUUID, nullable=False)
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@property @property
def collection_binding_detail(self): def collection_binding_detail(self):
@ -1408,58 +1408,58 @@ class AppAnnotationSetting(Base):
class OperationLog(Base): class OperationLog(Base):
__tablename__ = "operation_logs" __tablename__ = "operation_logs"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="operation_log_pkey"), sa.PrimaryKeyConstraint("id", name="operation_log_pkey"),
db.Index("operation_log_account_action_idx", "tenant_id", "account_id", "action"), sa.Index("operation_log_account_action_idx", "tenant_id", "account_id", "action"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
account_id = mapped_column(StringUUID, nullable=False) account_id = mapped_column(StringUUID, nullable=False)
action: Mapped[str] = mapped_column(String(255), nullable=False) action: Mapped[str] = mapped_column(String(255), nullable=False)
content = mapped_column(db.JSON) content = mapped_column(sa.JSON)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
created_ip: Mapped[str] = mapped_column(String(255), nullable=False) created_ip: Mapped[str] = mapped_column(String(255), nullable=False)
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
class EndUser(Base, UserMixin): class EndUser(Base, UserMixin):
__tablename__ = "end_users" __tablename__ = "end_users"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="end_user_pkey"), sa.PrimaryKeyConstraint("id", name="end_user_pkey"),
db.Index("end_user_session_id_idx", "session_id", "type"), sa.Index("end_user_session_id_idx", "session_id", "type"),
db.Index("end_user_tenant_session_id_idx", "tenant_id", "session_id", "type"), sa.Index("end_user_tenant_session_id_idx", "tenant_id", "session_id", "type"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
app_id = mapped_column(StringUUID, nullable=True) app_id = mapped_column(StringUUID, nullable=True)
type: Mapped[str] = mapped_column(String(255), nullable=False) type: Mapped[str] = mapped_column(String(255), nullable=False)
external_user_id = mapped_column(String(255), nullable=True) external_user_id = mapped_column(String(255), nullable=True)
name = mapped_column(String(255)) name = mapped_column(String(255))
is_anonymous: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("true")) is_anonymous: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("true"))
session_id: Mapped[str] = mapped_column() session_id: Mapped[str] = mapped_column()
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
class AppMCPServer(Base): class AppMCPServer(Base):
__tablename__ = "app_mcp_servers" __tablename__ = "app_mcp_servers"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="app_mcp_server_pkey"), sa.PrimaryKeyConstraint("id", name="app_mcp_server_pkey"),
db.UniqueConstraint("tenant_id", "app_id", name="unique_app_mcp_server_tenant_app_id"), sa.UniqueConstraint("tenant_id", "app_id", name="unique_app_mcp_server_tenant_app_id"),
db.UniqueConstraint("server_code", name="unique_app_mcp_server_server_code"), sa.UniqueConstraint("server_code", name="unique_app_mcp_server_server_code"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
description: Mapped[str] = mapped_column(String(255), nullable=False) description: Mapped[str] = mapped_column(String(255), nullable=False)
server_code: Mapped[str] = mapped_column(String(255), nullable=False) server_code: Mapped[str] = mapped_column(String(255), nullable=False)
status = mapped_column(String(255), nullable=False, server_default=db.text("'normal'::character varying")) status = mapped_column(String(255), nullable=False, server_default=sa.text("'normal'::character varying"))
parameters = mapped_column(db.Text, nullable=False) parameters = mapped_column(sa.Text, nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@staticmethod @staticmethod
def generate_server_code(n): def generate_server_code(n):
@ -1478,34 +1478,34 @@ class AppMCPServer(Base):
class Site(Base): class Site(Base):
__tablename__ = "sites" __tablename__ = "sites"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="site_pkey"), sa.PrimaryKeyConstraint("id", name="site_pkey"),
db.Index("site_app_id_idx", "app_id"), sa.Index("site_app_id_idx", "app_id"),
db.Index("site_code_idx", "code", "status"), sa.Index("site_code_idx", "code", "status"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
title: Mapped[str] = mapped_column(String(255), nullable=False) title: Mapped[str] = mapped_column(String(255), nullable=False)
icon_type = mapped_column(String(255), nullable=True) icon_type = mapped_column(String(255), nullable=True)
icon = mapped_column(String(255)) icon = mapped_column(String(255))
icon_background = mapped_column(String(255)) icon_background = mapped_column(String(255))
description = mapped_column(db.Text) description = mapped_column(sa.Text)
default_language: Mapped[str] = mapped_column(String(255), nullable=False) default_language: Mapped[str] = mapped_column(String(255), nullable=False)
chat_color_theme = mapped_column(String(255)) chat_color_theme = mapped_column(String(255))
chat_color_theme_inverted: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) chat_color_theme_inverted: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
copyright = mapped_column(String(255)) copyright = mapped_column(String(255))
privacy_policy = mapped_column(String(255)) privacy_policy = mapped_column(String(255))
show_workflow_steps: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("true")) show_workflow_steps: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("true"))
use_icon_as_answer_icon: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) use_icon_as_answer_icon: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
_custom_disclaimer: Mapped[str] = mapped_column("custom_disclaimer", sa.TEXT, default="") _custom_disclaimer: Mapped[str] = mapped_column("custom_disclaimer", sa.TEXT, default="")
customize_domain = mapped_column(String(255)) customize_domain = mapped_column(String(255))
customize_token_strategy: Mapped[str] = mapped_column(String(255), nullable=False) customize_token_strategy: Mapped[str] = mapped_column(String(255), nullable=False)
prompt_public: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) prompt_public: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
status = mapped_column(String(255), nullable=False, server_default=db.text("'normal'::character varying")) status = mapped_column(String(255), nullable=False, server_default=sa.text("'normal'::character varying"))
created_by = mapped_column(StringUUID, nullable=True) created_by = mapped_column(StringUUID, nullable=True)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_by = mapped_column(StringUUID, nullable=True) updated_by = mapped_column(StringUUID, nullable=True)
updated_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
code = mapped_column(String(255)) code = mapped_column(String(255))
@property @property
@ -1535,19 +1535,19 @@ class Site(Base):
class ApiToken(Base): class ApiToken(Base):
__tablename__ = "api_tokens" __tablename__ = "api_tokens"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="api_token_pkey"), sa.PrimaryKeyConstraint("id", name="api_token_pkey"),
db.Index("api_token_app_id_type_idx", "app_id", "type"), sa.Index("api_token_app_id_type_idx", "app_id", "type"),
db.Index("api_token_token_idx", "token", "type"), sa.Index("api_token_token_idx", "token", "type"),
db.Index("api_token_tenant_idx", "tenant_id", "type"), sa.Index("api_token_tenant_idx", "tenant_id", "type"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=True) app_id = mapped_column(StringUUID, nullable=True)
tenant_id = mapped_column(StringUUID, nullable=True) tenant_id = mapped_column(StringUUID, nullable=True)
type = mapped_column(String(16), nullable=False) type = mapped_column(String(16), nullable=False)
token: Mapped[str] = mapped_column(String(255), nullable=False) token: Mapped[str] = mapped_column(String(255), nullable=False)
last_used_at = mapped_column(db.DateTime, nullable=True) last_used_at = mapped_column(sa.DateTime, nullable=True)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@staticmethod @staticmethod
def generate_api_key(prefix, n): def generate_api_key(prefix, n):
@ -1561,26 +1561,26 @@ class ApiToken(Base):
class UploadFile(Base): class UploadFile(Base):
__tablename__ = "upload_files" __tablename__ = "upload_files"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="upload_file_pkey"), sa.PrimaryKeyConstraint("id", name="upload_file_pkey"),
db.Index("upload_file_tenant_idx", "tenant_id"), sa.Index("upload_file_tenant_idx", "tenant_id"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
storage_type: Mapped[str] = mapped_column(String(255), nullable=False) storage_type: Mapped[str] = mapped_column(String(255), nullable=False)
key: Mapped[str] = mapped_column(String(255), nullable=False) key: Mapped[str] = mapped_column(String(255), nullable=False)
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
size: Mapped[int] = mapped_column(db.Integer, nullable=False) size: Mapped[int] = mapped_column(sa.Integer, nullable=False)
extension: Mapped[str] = mapped_column(String(255), nullable=False) extension: Mapped[str] = mapped_column(String(255), nullable=False)
mime_type: Mapped[str] = mapped_column(String(255), nullable=True) mime_type: Mapped[str] = mapped_column(String(255), nullable=True)
created_by_role: Mapped[str] = mapped_column( created_by_role: Mapped[str] = mapped_column(
String(255), nullable=False, server_default=db.text("'account'::character varying") String(255), nullable=False, server_default=sa.text("'account'::character varying")
) )
created_by: Mapped[str] = mapped_column(StringUUID, nullable=False) created_by: Mapped[str] = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
used: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) used: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
used_by: Mapped[str | None] = mapped_column(StringUUID, nullable=True) used_by: Mapped[str | None] = mapped_column(StringUUID, nullable=True)
used_at: Mapped[datetime | None] = mapped_column(db.DateTime, nullable=True) used_at: Mapped[datetime | None] = mapped_column(sa.DateTime, nullable=True)
hash: Mapped[str | None] = mapped_column(String(255), nullable=True) hash: Mapped[str | None] = mapped_column(String(255), nullable=True)
source_url: Mapped[str] = mapped_column(sa.TEXT, default="") source_url: Mapped[str] = mapped_column(sa.TEXT, default="")
@ -1623,71 +1623,71 @@ class UploadFile(Base):
class ApiRequest(Base): class ApiRequest(Base):
__tablename__ = "api_requests" __tablename__ = "api_requests"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="api_request_pkey"), sa.PrimaryKeyConstraint("id", name="api_request_pkey"),
db.Index("api_request_token_idx", "tenant_id", "api_token_id"), sa.Index("api_request_token_idx", "tenant_id", "api_token_id"),
) )
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
api_token_id = mapped_column(StringUUID, nullable=False) api_token_id = mapped_column(StringUUID, nullable=False)
path: Mapped[str] = mapped_column(String(255), nullable=False) path: Mapped[str] = mapped_column(String(255), nullable=False)
request = mapped_column(db.Text, nullable=True) request = mapped_column(sa.Text, nullable=True)
response = mapped_column(db.Text, nullable=True) response = mapped_column(sa.Text, nullable=True)
ip: Mapped[str] = mapped_column(String(255), nullable=False) ip: Mapped[str] = mapped_column(String(255), nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
class MessageChain(Base): class MessageChain(Base):
__tablename__ = "message_chains" __tablename__ = "message_chains"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="message_chain_pkey"), sa.PrimaryKeyConstraint("id", name="message_chain_pkey"),
db.Index("message_chain_message_id_idx", "message_id"), sa.Index("message_chain_message_id_idx", "message_id"),
) )
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
message_id = mapped_column(StringUUID, nullable=False) message_id = mapped_column(StringUUID, nullable=False)
type: Mapped[str] = mapped_column(String(255), nullable=False) type: Mapped[str] = mapped_column(String(255), nullable=False)
input = mapped_column(db.Text, nullable=True) input = mapped_column(sa.Text, nullable=True)
output = mapped_column(db.Text, nullable=True) output = mapped_column(sa.Text, nullable=True)
created_at = mapped_column(db.DateTime, nullable=False, server_default=db.func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=db.func.current_timestamp())
class MessageAgentThought(Base): class MessageAgentThought(Base):
__tablename__ = "message_agent_thoughts" __tablename__ = "message_agent_thoughts"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="message_agent_thought_pkey"), sa.PrimaryKeyConstraint("id", name="message_agent_thought_pkey"),
db.Index("message_agent_thought_message_id_idx", "message_id"), sa.Index("message_agent_thought_message_id_idx", "message_id"),
db.Index("message_agent_thought_message_chain_id_idx", "message_chain_id"), sa.Index("message_agent_thought_message_chain_id_idx", "message_chain_id"),
) )
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
message_id = mapped_column(StringUUID, nullable=False) message_id = mapped_column(StringUUID, nullable=False)
message_chain_id = mapped_column(StringUUID, nullable=True) message_chain_id = mapped_column(StringUUID, nullable=True)
position: Mapped[int] = mapped_column(db.Integer, nullable=False) position: Mapped[int] = mapped_column(sa.Integer, nullable=False)
thought = mapped_column(db.Text, nullable=True) thought = mapped_column(sa.Text, nullable=True)
tool = mapped_column(db.Text, nullable=True) tool = mapped_column(sa.Text, nullable=True)
tool_labels_str = mapped_column(db.Text, nullable=False, server_default=db.text("'{}'::text")) tool_labels_str = mapped_column(sa.Text, nullable=False, server_default=sa.text("'{}'::text"))
tool_meta_str = mapped_column(db.Text, nullable=False, server_default=db.text("'{}'::text")) tool_meta_str = mapped_column(sa.Text, nullable=False, server_default=sa.text("'{}'::text"))
tool_input = mapped_column(db.Text, nullable=True) tool_input = mapped_column(sa.Text, nullable=True)
observation = mapped_column(db.Text, nullable=True) observation = mapped_column(sa.Text, nullable=True)
# plugin_id = mapped_column(StringUUID, nullable=True) ## for future design # plugin_id = mapped_column(StringUUID, nullable=True) ## for future design
tool_process_data = mapped_column(db.Text, nullable=True) tool_process_data = mapped_column(sa.Text, nullable=True)
message = mapped_column(db.Text, nullable=True) message = mapped_column(sa.Text, nullable=True)
message_token: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) message_token: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
message_unit_price = mapped_column(db.Numeric, nullable=True) message_unit_price = mapped_column(sa.Numeric, nullable=True)
message_price_unit = mapped_column(db.Numeric(10, 7), nullable=False, server_default=db.text("0.001")) message_price_unit = mapped_column(sa.Numeric(10, 7), nullable=False, server_default=sa.text("0.001"))
message_files = mapped_column(db.Text, nullable=True) message_files = mapped_column(sa.Text, nullable=True)
answer = db.Column(db.Text, nullable=True) answer = db.Column(sa.Text, nullable=True)
answer_token: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) answer_token: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
answer_unit_price = mapped_column(db.Numeric, nullable=True) answer_unit_price = mapped_column(sa.Numeric, nullable=True)
answer_price_unit = mapped_column(db.Numeric(10, 7), nullable=False, server_default=db.text("0.001")) answer_price_unit = mapped_column(sa.Numeric(10, 7), nullable=False, server_default=sa.text("0.001"))
tokens: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) tokens: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
total_price = mapped_column(db.Numeric, nullable=True) total_price = mapped_column(sa.Numeric, nullable=True)
currency = mapped_column(String, nullable=True) currency = mapped_column(String, nullable=True)
latency: Mapped[Optional[float]] = mapped_column(db.Float, nullable=True) latency: Mapped[Optional[float]] = mapped_column(sa.Float, nullable=True)
created_by_role = mapped_column(String, nullable=False) created_by_role = mapped_column(String, nullable=False)
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=db.func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=db.func.current_timestamp())
@property @property
def files(self) -> list: def files(self) -> list:
@ -1769,80 +1769,80 @@ class MessageAgentThought(Base):
class DatasetRetrieverResource(Base): class DatasetRetrieverResource(Base):
__tablename__ = "dataset_retriever_resources" __tablename__ = "dataset_retriever_resources"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="dataset_retriever_resource_pkey"), sa.PrimaryKeyConstraint("id", name="dataset_retriever_resource_pkey"),
db.Index("dataset_retriever_resource_message_id_idx", "message_id"), sa.Index("dataset_retriever_resource_message_id_idx", "message_id"),
) )
id = mapped_column(StringUUID, nullable=False, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, nullable=False, server_default=sa.text("uuid_generate_v4()"))
message_id = mapped_column(StringUUID, nullable=False) message_id = mapped_column(StringUUID, nullable=False)
position: Mapped[int] = mapped_column(db.Integer, nullable=False) position: Mapped[int] = mapped_column(sa.Integer, nullable=False)
dataset_id = mapped_column(StringUUID, nullable=False) dataset_id = mapped_column(StringUUID, nullable=False)
dataset_name = mapped_column(db.Text, nullable=False) dataset_name = mapped_column(sa.Text, nullable=False)
document_id = mapped_column(StringUUID, nullable=True) document_id = mapped_column(StringUUID, nullable=True)
document_name = mapped_column(db.Text, nullable=False) document_name = mapped_column(sa.Text, nullable=False)
data_source_type = mapped_column(db.Text, nullable=True) data_source_type = mapped_column(sa.Text, nullable=True)
segment_id = mapped_column(StringUUID, nullable=True) segment_id = mapped_column(StringUUID, nullable=True)
score: Mapped[Optional[float]] = mapped_column(db.Float, nullable=True) score: Mapped[Optional[float]] = mapped_column(sa.Float, nullable=True)
content = mapped_column(db.Text, nullable=False) content = mapped_column(sa.Text, nullable=False)
hit_count: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) hit_count: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
word_count: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) word_count: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
segment_position: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) segment_position: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
index_node_hash = mapped_column(db.Text, nullable=True) index_node_hash = mapped_column(sa.Text, nullable=True)
retriever_from = mapped_column(db.Text, nullable=False) retriever_from = mapped_column(sa.Text, nullable=False)
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=db.func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=db.func.current_timestamp())
class Tag(Base): class Tag(Base):
__tablename__ = "tags" __tablename__ = "tags"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tag_pkey"), sa.PrimaryKeyConstraint("id", name="tag_pkey"),
db.Index("tag_type_idx", "type"), sa.Index("tag_type_idx", "type"),
db.Index("tag_name_idx", "name"), sa.Index("tag_name_idx", "name"),
) )
TAG_TYPE_LIST = ["knowledge", "app"] TAG_TYPE_LIST = ["knowledge", "app"]
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=True) tenant_id = mapped_column(StringUUID, nullable=True)
type = mapped_column(String(16), nullable=False) type = mapped_column(String(16), nullable=False)
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
class TagBinding(Base): class TagBinding(Base):
__tablename__ = "tag_bindings" __tablename__ = "tag_bindings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tag_binding_pkey"), sa.PrimaryKeyConstraint("id", name="tag_binding_pkey"),
db.Index("tag_bind_target_id_idx", "target_id"), sa.Index("tag_bind_target_id_idx", "target_id"),
db.Index("tag_bind_tag_id_idx", "tag_id"), sa.Index("tag_bind_tag_id_idx", "tag_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=True) tenant_id = mapped_column(StringUUID, nullable=True)
tag_id = mapped_column(StringUUID, nullable=True) tag_id = mapped_column(StringUUID, nullable=True)
target_id = mapped_column(StringUUID, nullable=True) target_id = mapped_column(StringUUID, nullable=True)
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
class TraceAppConfig(Base): class TraceAppConfig(Base):
__tablename__ = "trace_app_config" __tablename__ = "trace_app_config"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tracing_app_config_pkey"), sa.PrimaryKeyConstraint("id", name="tracing_app_config_pkey"),
db.Index("trace_app_config_app_id_idx", "app_id"), sa.Index("trace_app_config_app_id_idx", "app_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
tracing_provider = mapped_column(String(255), nullable=True) tracing_provider = mapped_column(String(255), nullable=True)
tracing_config = mapped_column(db.JSON, nullable=True) tracing_config = mapped_column(sa.JSON, nullable=True)
created_at = mapped_column(db.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column( updated_at = mapped_column(
db.DateTime, nullable=False, server_default=func.current_timestamp(), onupdate=func.current_timestamp() sa.DateTime, nullable=False, server_default=func.current_timestamp(), onupdate=func.current_timestamp()
) )
is_active: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("true")) is_active: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("true"))
@property @property
def tracing_config_dict(self): def tracing_config_dict(self):

View file

@ -2,11 +2,11 @@ from datetime import datetime
from enum import Enum from enum import Enum
from typing import Optional from typing import Optional
import sqlalchemy as sa
from sqlalchemy import DateTime, String, func, text from sqlalchemy import DateTime, String, func, text
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
from .base import Base from .base import Base
from .engine import db
from .types import StringUUID from .types import StringUUID
@ -47,9 +47,9 @@ class Provider(Base):
__tablename__ = "providers" __tablename__ = "providers"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="provider_pkey"), sa.PrimaryKeyConstraint("id", name="provider_pkey"),
db.Index("provider_tenant_id_provider_idx", "tenant_id", "provider_name"), sa.Index("provider_tenant_id_provider_idx", "tenant_id", "provider_name"),
db.UniqueConstraint( sa.UniqueConstraint(
"tenant_id", "provider_name", "provider_type", "quota_type", name="unique_provider_name_type_quota" "tenant_id", "provider_name", "provider_type", "quota_type", name="unique_provider_name_type_quota"
), ),
) )
@ -60,15 +60,15 @@ class Provider(Base):
provider_type: Mapped[str] = mapped_column( provider_type: Mapped[str] = mapped_column(
String(40), nullable=False, server_default=text("'custom'::character varying") String(40), nullable=False, server_default=text("'custom'::character varying")
) )
encrypted_config: Mapped[Optional[str]] = mapped_column(db.Text, nullable=True) encrypted_config: Mapped[Optional[str]] = mapped_column(sa.Text, nullable=True)
is_valid: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=text("false")) is_valid: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=text("false"))
last_used: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) last_used: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
quota_type: Mapped[Optional[str]] = mapped_column( quota_type: Mapped[Optional[str]] = mapped_column(
String(40), nullable=True, server_default=text("''::character varying") String(40), nullable=True, server_default=text("''::character varying")
) )
quota_limit: Mapped[Optional[int]] = mapped_column(db.BigInteger, nullable=True) quota_limit: Mapped[Optional[int]] = mapped_column(sa.BigInteger, nullable=True)
quota_used: Mapped[Optional[int]] = mapped_column(db.BigInteger, default=0) quota_used: Mapped[Optional[int]] = mapped_column(sa.BigInteger, default=0)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
@ -104,9 +104,9 @@ class ProviderModel(Base):
__tablename__ = "provider_models" __tablename__ = "provider_models"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="provider_model_pkey"), sa.PrimaryKeyConstraint("id", name="provider_model_pkey"),
db.Index("provider_model_tenant_id_provider_idx", "tenant_id", "provider_name"), sa.Index("provider_model_tenant_id_provider_idx", "tenant_id", "provider_name"),
db.UniqueConstraint( sa.UniqueConstraint(
"tenant_id", "provider_name", "model_name", "model_type", name="unique_provider_model_name" "tenant_id", "provider_name", "model_name", "model_type", name="unique_provider_model_name"
), ),
) )
@ -116,8 +116,8 @@ class ProviderModel(Base):
provider_name: Mapped[str] = mapped_column(String(255), nullable=False) provider_name: Mapped[str] = mapped_column(String(255), nullable=False)
model_name: Mapped[str] = mapped_column(String(255), nullable=False) model_name: Mapped[str] = mapped_column(String(255), nullable=False)
model_type: Mapped[str] = mapped_column(String(40), nullable=False) model_type: Mapped[str] = mapped_column(String(40), nullable=False)
encrypted_config: Mapped[Optional[str]] = mapped_column(db.Text, nullable=True) encrypted_config: Mapped[Optional[str]] = mapped_column(sa.Text, nullable=True)
is_valid: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=text("false")) is_valid: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=text("false"))
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
@ -125,8 +125,8 @@ class ProviderModel(Base):
class TenantDefaultModel(Base): class TenantDefaultModel(Base):
__tablename__ = "tenant_default_models" __tablename__ = "tenant_default_models"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tenant_default_model_pkey"), sa.PrimaryKeyConstraint("id", name="tenant_default_model_pkey"),
db.Index("tenant_default_model_tenant_id_provider_type_idx", "tenant_id", "provider_name", "model_type"), sa.Index("tenant_default_model_tenant_id_provider_type_idx", "tenant_id", "provider_name", "model_type"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()"))
@ -141,8 +141,8 @@ class TenantDefaultModel(Base):
class TenantPreferredModelProvider(Base): class TenantPreferredModelProvider(Base):
__tablename__ = "tenant_preferred_model_providers" __tablename__ = "tenant_preferred_model_providers"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tenant_preferred_model_provider_pkey"), sa.PrimaryKeyConstraint("id", name="tenant_preferred_model_provider_pkey"),
db.Index("tenant_preferred_model_provider_tenant_provider_idx", "tenant_id", "provider_name"), sa.Index("tenant_preferred_model_provider_tenant_provider_idx", "tenant_id", "provider_name"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()"))
@ -156,8 +156,8 @@ class TenantPreferredModelProvider(Base):
class ProviderOrder(Base): class ProviderOrder(Base):
__tablename__ = "provider_orders" __tablename__ = "provider_orders"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="provider_order_pkey"), sa.PrimaryKeyConstraint("id", name="provider_order_pkey"),
db.Index("provider_order_tenant_provider_idx", "tenant_id", "provider_name"), sa.Index("provider_order_tenant_provider_idx", "tenant_id", "provider_name"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()"))
@ -167,9 +167,9 @@ class ProviderOrder(Base):
payment_product_id: Mapped[str] = mapped_column(String(191), nullable=False) payment_product_id: Mapped[str] = mapped_column(String(191), nullable=False)
payment_id: Mapped[Optional[str]] = mapped_column(String(191)) payment_id: Mapped[Optional[str]] = mapped_column(String(191))
transaction_id: Mapped[Optional[str]] = mapped_column(String(191)) transaction_id: Mapped[Optional[str]] = mapped_column(String(191))
quantity: Mapped[int] = mapped_column(db.Integer, nullable=False, server_default=text("1")) quantity: Mapped[int] = mapped_column(sa.Integer, nullable=False, server_default=text("1"))
currency: Mapped[Optional[str]] = mapped_column(String(40)) currency: Mapped[Optional[str]] = mapped_column(String(40))
total_amount: Mapped[Optional[int]] = mapped_column(db.Integer) total_amount: Mapped[Optional[int]] = mapped_column(sa.Integer)
payment_status: Mapped[str] = mapped_column( payment_status: Mapped[str] = mapped_column(
String(40), nullable=False, server_default=text("'wait_pay'::character varying") String(40), nullable=False, server_default=text("'wait_pay'::character varying")
) )
@ -187,8 +187,8 @@ class ProviderModelSetting(Base):
__tablename__ = "provider_model_settings" __tablename__ = "provider_model_settings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="provider_model_setting_pkey"), sa.PrimaryKeyConstraint("id", name="provider_model_setting_pkey"),
db.Index("provider_model_setting_tenant_provider_model_idx", "tenant_id", "provider_name", "model_type"), sa.Index("provider_model_setting_tenant_provider_model_idx", "tenant_id", "provider_name", "model_type"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()"))
@ -196,8 +196,8 @@ class ProviderModelSetting(Base):
provider_name: Mapped[str] = mapped_column(String(255), nullable=False) provider_name: Mapped[str] = mapped_column(String(255), nullable=False)
model_name: Mapped[str] = mapped_column(String(255), nullable=False) model_name: Mapped[str] = mapped_column(String(255), nullable=False)
model_type: Mapped[str] = mapped_column(String(40), nullable=False) model_type: Mapped[str] = mapped_column(String(40), nullable=False)
enabled: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=text("true")) enabled: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=text("true"))
load_balancing_enabled: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=text("false")) load_balancing_enabled: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=text("false"))
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
@ -209,8 +209,8 @@ class LoadBalancingModelConfig(Base):
__tablename__ = "load_balancing_model_configs" __tablename__ = "load_balancing_model_configs"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="load_balancing_model_config_pkey"), sa.PrimaryKeyConstraint("id", name="load_balancing_model_config_pkey"),
db.Index("load_balancing_model_config_tenant_provider_model_idx", "tenant_id", "provider_name", "model_type"), sa.Index("load_balancing_model_config_tenant_provider_model_idx", "tenant_id", "provider_name", "model_type"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=text("uuid_generate_v4()"))
@ -219,7 +219,7 @@ class LoadBalancingModelConfig(Base):
model_name: Mapped[str] = mapped_column(String(255), nullable=False) model_name: Mapped[str] = mapped_column(String(255), nullable=False)
model_type: Mapped[str] = mapped_column(String(40), nullable=False) model_type: Mapped[str] = mapped_column(String(40), nullable=False)
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
encrypted_config: Mapped[Optional[str]] = mapped_column(db.Text, nullable=True) encrypted_config: Mapped[Optional[str]] = mapped_column(sa.Text, nullable=True)
enabled: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=text("true")) enabled: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=text("true"))
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())

View file

@ -2,50 +2,50 @@ import json
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional
import sqlalchemy as sa
from sqlalchemy import DateTime, String, func from sqlalchemy import DateTime, String, func
from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
from models.base import Base from models.base import Base
from .engine import db
from .types import StringUUID from .types import StringUUID
class DataSourceOauthBinding(Base): class DataSourceOauthBinding(Base):
__tablename__ = "data_source_oauth_bindings" __tablename__ = "data_source_oauth_bindings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="source_binding_pkey"), sa.PrimaryKeyConstraint("id", name="source_binding_pkey"),
db.Index("source_binding_tenant_id_idx", "tenant_id"), sa.Index("source_binding_tenant_id_idx", "tenant_id"),
db.Index("source_info_idx", "source_info", postgresql_using="gin"), sa.Index("source_info_idx", "source_info", postgresql_using="gin"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
access_token: Mapped[str] = mapped_column(String(255), nullable=False) access_token: Mapped[str] = mapped_column(String(255), nullable=False)
provider: Mapped[str] = mapped_column(String(255), nullable=False) provider: Mapped[str] = mapped_column(String(255), nullable=False)
source_info = mapped_column(JSONB, nullable=False) source_info = mapped_column(JSONB, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
disabled: Mapped[Optional[bool]] = mapped_column(db.Boolean, nullable=True, server_default=db.text("false")) disabled: Mapped[Optional[bool]] = mapped_column(sa.Boolean, nullable=True, server_default=sa.text("false"))
class DataSourceApiKeyAuthBinding(Base): class DataSourceApiKeyAuthBinding(Base):
__tablename__ = "data_source_api_key_auth_bindings" __tablename__ = "data_source_api_key_auth_bindings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="data_source_api_key_auth_binding_pkey"), sa.PrimaryKeyConstraint("id", name="data_source_api_key_auth_binding_pkey"),
db.Index("data_source_api_key_auth_binding_tenant_id_idx", "tenant_id"), sa.Index("data_source_api_key_auth_binding_tenant_id_idx", "tenant_id"),
db.Index("data_source_api_key_auth_binding_provider_idx", "provider"), sa.Index("data_source_api_key_auth_binding_provider_idx", "provider"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
category: Mapped[str] = mapped_column(String(255), nullable=False) category: Mapped[str] = mapped_column(String(255), nullable=False)
provider: Mapped[str] = mapped_column(String(255), nullable=False) provider: Mapped[str] = mapped_column(String(255), nullable=False)
credentials = mapped_column(db.Text, nullable=True) # JSON credentials = mapped_column(sa.Text, nullable=True) # JSON
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
disabled: Mapped[Optional[bool]] = mapped_column(db.Boolean, nullable=True, server_default=db.text("false")) disabled: Mapped[Optional[bool]] = mapped_column(sa.Boolean, nullable=True, server_default=sa.text("false"))
def to_dict(self): def to_dict(self):
return { return {

View file

@ -1,6 +1,7 @@
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional
import sqlalchemy as sa
from celery import states # type: ignore from celery import states # type: ignore
from sqlalchemy import DateTime, String from sqlalchemy import DateTime, String
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
@ -16,7 +17,7 @@ class CeleryTask(Base):
__tablename__ = "celery_taskmeta" __tablename__ = "celery_taskmeta"
id = mapped_column(db.Integer, db.Sequence("task_id_sequence"), primary_key=True, autoincrement=True) id = mapped_column(sa.Integer, sa.Sequence("task_id_sequence"), primary_key=True, autoincrement=True)
task_id = mapped_column(String(155), unique=True) task_id = mapped_column(String(155), unique=True)
status = mapped_column(String(50), default=states.PENDING) status = mapped_column(String(50), default=states.PENDING)
result = mapped_column(db.PickleType, nullable=True) result = mapped_column(db.PickleType, nullable=True)
@ -26,12 +27,12 @@ class CeleryTask(Base):
onupdate=lambda: naive_utc_now(), onupdate=lambda: naive_utc_now(),
nullable=True, nullable=True,
) )
traceback = mapped_column(db.Text, nullable=True) traceback = mapped_column(sa.Text, nullable=True)
name = mapped_column(String(155), nullable=True) name = mapped_column(String(155), nullable=True)
args = mapped_column(db.LargeBinary, nullable=True) args = mapped_column(sa.LargeBinary, nullable=True)
kwargs = mapped_column(db.LargeBinary, nullable=True) kwargs = mapped_column(sa.LargeBinary, nullable=True)
worker = mapped_column(String(155), nullable=True) worker = mapped_column(String(155), nullable=True)
retries: Mapped[Optional[int]] = mapped_column(db.Integer, nullable=True) retries: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
queue = mapped_column(String(155), nullable=True) queue = mapped_column(String(155), nullable=True)
@ -41,7 +42,7 @@ class CeleryTaskSet(Base):
__tablename__ = "celery_tasksetmeta" __tablename__ = "celery_tasksetmeta"
id: Mapped[int] = mapped_column( id: Mapped[int] = mapped_column(
db.Integer, db.Sequence("taskset_id_sequence"), autoincrement=True, primary_key=True sa.Integer, sa.Sequence("taskset_id_sequence"), autoincrement=True, primary_key=True
) )
taskset_id = mapped_column(String(155), unique=True) taskset_id = mapped_column(String(155), unique=True)
result = mapped_column(db.PickleType, nullable=True) result = mapped_column(db.PickleType, nullable=True)

View file

@ -25,33 +25,33 @@ from .types import StringUUID
class ToolOAuthSystemClient(Base): class ToolOAuthSystemClient(Base):
__tablename__ = "tool_oauth_system_clients" __tablename__ = "tool_oauth_system_clients"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_oauth_system_client_pkey"), sa.PrimaryKeyConstraint("id", name="tool_oauth_system_client_pkey"),
db.UniqueConstraint("plugin_id", "provider", name="tool_oauth_system_client_plugin_id_provider_idx"), sa.UniqueConstraint("plugin_id", "provider", name="tool_oauth_system_client_plugin_id_provider_idx"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
plugin_id = mapped_column(String(512), nullable=False) plugin_id = mapped_column(String(512), nullable=False)
provider: Mapped[str] = mapped_column(String(255), nullable=False) provider: Mapped[str] = mapped_column(String(255), nullable=False)
# oauth params of the tool provider # oauth params of the tool provider
encrypted_oauth_params: Mapped[str] = mapped_column(db.Text, nullable=False) encrypted_oauth_params: Mapped[str] = mapped_column(sa.Text, nullable=False)
# tenant level tool oauth client params (client_id, client_secret, etc.) # tenant level tool oauth client params (client_id, client_secret, etc.)
class ToolOAuthTenantClient(Base): class ToolOAuthTenantClient(Base):
__tablename__ = "tool_oauth_tenant_clients" __tablename__ = "tool_oauth_tenant_clients"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_oauth_tenant_client_pkey"), sa.PrimaryKeyConstraint("id", name="tool_oauth_tenant_client_pkey"),
db.UniqueConstraint("tenant_id", "plugin_id", "provider", name="unique_tool_oauth_tenant_client"), sa.UniqueConstraint("tenant_id", "plugin_id", "provider", name="unique_tool_oauth_tenant_client"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# tenant id # tenant id
tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
plugin_id: Mapped[str] = mapped_column(String(512), nullable=False) plugin_id: Mapped[str] = mapped_column(String(512), nullable=False)
provider: Mapped[str] = mapped_column(String(255), nullable=False) provider: Mapped[str] = mapped_column(String(255), nullable=False)
enabled: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("true")) enabled: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("true"))
# oauth params of the tool provider # oauth params of the tool provider
encrypted_oauth_params: Mapped[str] = mapped_column(db.Text, nullable=False) encrypted_oauth_params: Mapped[str] = mapped_column(sa.Text, nullable=False)
@property @property
def oauth_params(self) -> dict: def oauth_params(self) -> dict:
@ -65,14 +65,14 @@ class BuiltinToolProvider(Base):
__tablename__ = "tool_builtin_providers" __tablename__ = "tool_builtin_providers"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_builtin_provider_pkey"), sa.PrimaryKeyConstraint("id", name="tool_builtin_provider_pkey"),
db.UniqueConstraint("tenant_id", "provider", "name", name="unique_builtin_tool_provider"), sa.UniqueConstraint("tenant_id", "provider", "name", name="unique_builtin_tool_provider"),
) )
# id of the tool provider # id of the tool provider
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
name: Mapped[str] = mapped_column( name: Mapped[str] = mapped_column(
String(256), nullable=False, server_default=db.text("'API KEY 1'::character varying") String(256), nullable=False, server_default=sa.text("'API KEY 1'::character varying")
) )
# id of the tenant # id of the tenant
tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=True) tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=True)
@ -81,19 +81,19 @@ class BuiltinToolProvider(Base):
# name of the tool provider # name of the tool provider
provider: Mapped[str] = mapped_column(String(256), nullable=False) provider: Mapped[str] = mapped_column(String(256), nullable=False)
# credential of the tool provider # credential of the tool provider
encrypted_credentials: Mapped[str] = mapped_column(db.Text, nullable=True) encrypted_credentials: Mapped[str] = mapped_column(sa.Text, nullable=True)
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") sa.DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
updated_at: Mapped[datetime] = mapped_column( updated_at: Mapped[datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") sa.DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
is_default: Mapped[bool] = mapped_column(db.Boolean, nullable=False, server_default=db.text("false")) is_default: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, server_default=sa.text("false"))
# credential type, e.g., "api-key", "oauth2" # credential type, e.g., "api-key", "oauth2"
credential_type: Mapped[str] = mapped_column( credential_type: Mapped[str] = mapped_column(
String(32), nullable=False, server_default=db.text("'api-key'::character varying") String(32), nullable=False, server_default=sa.text("'api-key'::character varying")
) )
expires_at: Mapped[int] = mapped_column(db.BigInteger, nullable=False, server_default=db.text("-1")) expires_at: Mapped[int] = mapped_column(sa.BigInteger, nullable=False, server_default=sa.text("-1"))
@property @property
def credentials(self) -> dict: def credentials(self) -> dict:
@ -107,28 +107,28 @@ class ApiToolProvider(Base):
__tablename__ = "tool_api_providers" __tablename__ = "tool_api_providers"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_api_provider_pkey"), sa.PrimaryKeyConstraint("id", name="tool_api_provider_pkey"),
db.UniqueConstraint("name", "tenant_id", name="unique_api_tool_provider"), sa.UniqueConstraint("name", "tenant_id", name="unique_api_tool_provider"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# name of the api provider # name of the api provider
name = mapped_column(String(255), nullable=False, server_default=db.text("'API KEY 1'::character varying")) name = mapped_column(String(255), nullable=False, server_default=sa.text("'API KEY 1'::character varying"))
# icon # icon
icon: Mapped[str] = mapped_column(String(255), nullable=False) icon: Mapped[str] = mapped_column(String(255), nullable=False)
# original schema # original schema
schema = mapped_column(db.Text, nullable=False) schema = mapped_column(sa.Text, nullable=False)
schema_type_str: Mapped[str] = mapped_column(String(40), nullable=False) schema_type_str: Mapped[str] = mapped_column(String(40), nullable=False)
# who created this tool # who created this tool
user_id = mapped_column(StringUUID, nullable=False) user_id = mapped_column(StringUUID, nullable=False)
# tenant id # tenant id
tenant_id = mapped_column(StringUUID, nullable=False) tenant_id = mapped_column(StringUUID, nullable=False)
# description of the provider # description of the provider
description = mapped_column(db.Text, nullable=False) description = mapped_column(sa.Text, nullable=False)
# json format tools # json format tools
tools_str = mapped_column(db.Text, nullable=False) tools_str = mapped_column(sa.Text, nullable=False)
# json format credentials # json format credentials
credentials_str = mapped_column(db.Text, nullable=False) credentials_str = mapped_column(sa.Text, nullable=False)
# privacy policy # privacy policy
privacy_policy = mapped_column(String(255), nullable=True) privacy_policy = mapped_column(String(255), nullable=True)
# custom_disclaimer # custom_disclaimer
@ -167,11 +167,11 @@ class ToolLabelBinding(Base):
__tablename__ = "tool_label_bindings" __tablename__ = "tool_label_bindings"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_label_bind_pkey"), sa.PrimaryKeyConstraint("id", name="tool_label_bind_pkey"),
db.UniqueConstraint("tool_id", "label_name", name="unique_tool_label_bind"), sa.UniqueConstraint("tool_id", "label_name", name="unique_tool_label_bind"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# tool id # tool id
tool_id: Mapped[str] = mapped_column(String(64), nullable=False) tool_id: Mapped[str] = mapped_column(String(64), nullable=False)
# tool type # tool type
@ -187,12 +187,12 @@ class WorkflowToolProvider(Base):
__tablename__ = "tool_workflow_providers" __tablename__ = "tool_workflow_providers"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_workflow_provider_pkey"), sa.PrimaryKeyConstraint("id", name="tool_workflow_provider_pkey"),
db.UniqueConstraint("name", "tenant_id", name="unique_workflow_tool_provider"), sa.UniqueConstraint("name", "tenant_id", name="unique_workflow_tool_provider"),
db.UniqueConstraint("tenant_id", "app_id", name="unique_workflow_tool_provider_app_id"), sa.UniqueConstraint("tenant_id", "app_id", name="unique_workflow_tool_provider_app_id"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# name of the workflow provider # name of the workflow provider
name: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False)
# label of the workflow provider # label of the workflow provider
@ -208,17 +208,17 @@ class WorkflowToolProvider(Base):
# tenant id # tenant id
tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
# description of the provider # description of the provider
description: Mapped[str] = mapped_column(db.Text, nullable=False) description: Mapped[str] = mapped_column(sa.Text, nullable=False)
# parameter configuration # parameter configuration
parameter_configuration: Mapped[str] = mapped_column(db.Text, nullable=False, server_default="[]") parameter_configuration: Mapped[str] = mapped_column(sa.Text, nullable=False, server_default="[]")
# privacy policy # privacy policy
privacy_policy: Mapped[str] = mapped_column(String(255), nullable=True, server_default="") privacy_policy: Mapped[str] = mapped_column(String(255), nullable=True, server_default="")
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") sa.DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
updated_at: Mapped[datetime] = mapped_column( updated_at: Mapped[datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") sa.DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
@property @property
@ -245,19 +245,19 @@ class MCPToolProvider(Base):
__tablename__ = "tool_mcp_providers" __tablename__ = "tool_mcp_providers"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_mcp_provider_pkey"), sa.PrimaryKeyConstraint("id", name="tool_mcp_provider_pkey"),
db.UniqueConstraint("tenant_id", "server_url_hash", name="unique_mcp_provider_server_url"), sa.UniqueConstraint("tenant_id", "server_url_hash", name="unique_mcp_provider_server_url"),
db.UniqueConstraint("tenant_id", "name", name="unique_mcp_provider_name"), sa.UniqueConstraint("tenant_id", "name", name="unique_mcp_provider_name"),
db.UniqueConstraint("tenant_id", "server_identifier", name="unique_mcp_provider_server_identifier"), sa.UniqueConstraint("tenant_id", "server_identifier", name="unique_mcp_provider_server_identifier"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# name of the mcp provider # name of the mcp provider
name: Mapped[str] = mapped_column(String(40), nullable=False) name: Mapped[str] = mapped_column(String(40), nullable=False)
# server identifier of the mcp provider # server identifier of the mcp provider
server_identifier: Mapped[str] = mapped_column(String(64), nullable=False) server_identifier: Mapped[str] = mapped_column(String(64), nullable=False)
# encrypted url of the mcp provider # encrypted url of the mcp provider
server_url: Mapped[str] = mapped_column(db.Text, nullable=False) server_url: Mapped[str] = mapped_column(sa.Text, nullable=False)
# hash of server_url for uniqueness check # hash of server_url for uniqueness check
server_url_hash: Mapped[str] = mapped_column(String(64), nullable=False) server_url_hash: Mapped[str] = mapped_column(String(64), nullable=False)
# icon of the mcp provider # icon of the mcp provider
@ -267,16 +267,16 @@ class MCPToolProvider(Base):
# who created this tool # who created this tool
user_id: Mapped[str] = mapped_column(StringUUID, nullable=False) user_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
# encrypted credentials # encrypted credentials
encrypted_credentials: Mapped[str] = mapped_column(db.Text, nullable=True) encrypted_credentials: Mapped[str] = mapped_column(sa.Text, nullable=True)
# authed # authed
authed: Mapped[bool] = mapped_column(db.Boolean, nullable=False, default=False) authed: Mapped[bool] = mapped_column(sa.Boolean, nullable=False, default=False)
# tools # tools
tools: Mapped[str] = mapped_column(db.Text, nullable=False, default="[]") tools: Mapped[str] = mapped_column(sa.Text, nullable=False, default="[]")
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") sa.DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
updated_at: Mapped[datetime] = mapped_column( updated_at: Mapped[datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)") sa.DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)")
) )
def load_user(self) -> Account | None: def load_user(self) -> Account | None:
@ -347,9 +347,9 @@ class ToolModelInvoke(Base):
""" """
__tablename__ = "tool_model_invokes" __tablename__ = "tool_model_invokes"
__table_args__ = (db.PrimaryKeyConstraint("id", name="tool_model_invoke_pkey"),) __table_args__ = (sa.PrimaryKeyConstraint("id", name="tool_model_invoke_pkey"),)
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# who invoke this tool # who invoke this tool
user_id = mapped_column(StringUUID, nullable=False) user_id = mapped_column(StringUUID, nullable=False)
# tenant id # tenant id
@ -361,18 +361,18 @@ class ToolModelInvoke(Base):
# tool name # tool name
tool_name = mapped_column(String(128), nullable=False) tool_name = mapped_column(String(128), nullable=False)
# invoke parameters # invoke parameters
model_parameters = mapped_column(db.Text, nullable=False) model_parameters = mapped_column(sa.Text, nullable=False)
# prompt messages # prompt messages
prompt_messages = mapped_column(db.Text, nullable=False) prompt_messages = mapped_column(sa.Text, nullable=False)
# invoke response # invoke response
model_response = mapped_column(db.Text, nullable=False) model_response = mapped_column(sa.Text, nullable=False)
prompt_tokens: Mapped[int] = mapped_column(db.Integer, nullable=False, server_default=db.text("0")) prompt_tokens: Mapped[int] = mapped_column(sa.Integer, nullable=False, server_default=sa.text("0"))
answer_tokens: Mapped[int] = mapped_column(db.Integer, nullable=False, server_default=db.text("0")) answer_tokens: Mapped[int] = mapped_column(sa.Integer, nullable=False, server_default=sa.text("0"))
answer_unit_price = mapped_column(db.Numeric(10, 4), nullable=False) answer_unit_price = mapped_column(sa.Numeric(10, 4), nullable=False)
answer_price_unit = mapped_column(db.Numeric(10, 7), nullable=False, server_default=db.text("0.001")) answer_price_unit = mapped_column(sa.Numeric(10, 7), nullable=False, server_default=sa.text("0.001"))
provider_response_latency = mapped_column(db.Float, nullable=False, server_default=db.text("0")) provider_response_latency = mapped_column(sa.Float, nullable=False, server_default=sa.text("0"))
total_price = mapped_column(db.Numeric(10, 7)) total_price = mapped_column(sa.Numeric(10, 7))
currency: Mapped[str] = mapped_column(String(255), nullable=False) currency: Mapped[str] = mapped_column(String(255), nullable=False)
created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@ -386,13 +386,13 @@ class ToolConversationVariables(Base):
__tablename__ = "tool_conversation_variables" __tablename__ = "tool_conversation_variables"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_conversation_variables_pkey"), sa.PrimaryKeyConstraint("id", name="tool_conversation_variables_pkey"),
# add index for user_id and conversation_id # add index for user_id and conversation_id
db.Index("user_id_idx", "user_id"), sa.Index("user_id_idx", "user_id"),
db.Index("conversation_id_idx", "conversation_id"), sa.Index("conversation_id_idx", "conversation_id"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# conversation user id # conversation user id
user_id = mapped_column(StringUUID, nullable=False) user_id = mapped_column(StringUUID, nullable=False)
# tenant id # tenant id
@ -400,7 +400,7 @@ class ToolConversationVariables(Base):
# conversation id # conversation id
conversation_id = mapped_column(StringUUID, nullable=False) conversation_id = mapped_column(StringUUID, nullable=False)
# variables pool # variables pool
variables_str = mapped_column(db.Text, nullable=False) variables_str = mapped_column(sa.Text, nullable=False)
created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp()) created_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp()) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=func.current_timestamp())
@ -417,11 +417,11 @@ class ToolFile(Base):
__tablename__ = "tool_files" __tablename__ = "tool_files"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="tool_file_pkey"), sa.PrimaryKeyConstraint("id", name="tool_file_pkey"),
db.Index("tool_file_conversation_id_idx", "conversation_id"), sa.Index("tool_file_conversation_id_idx", "conversation_id"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# conversation user id # conversation user id
user_id: Mapped[str] = mapped_column(StringUUID) user_id: Mapped[str] = mapped_column(StringUUID)
# tenant id # tenant id
@ -448,30 +448,30 @@ class DeprecatedPublishedAppTool(Base):
__tablename__ = "tool_published_apps" __tablename__ = "tool_published_apps"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="published_app_tool_pkey"), sa.PrimaryKeyConstraint("id", name="published_app_tool_pkey"),
db.UniqueConstraint("app_id", "user_id", name="unique_published_app_tool"), sa.UniqueConstraint("app_id", "user_id", name="unique_published_app_tool"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
# id of the app # id of the app
app_id = mapped_column(StringUUID, ForeignKey("apps.id"), nullable=False) app_id = mapped_column(StringUUID, ForeignKey("apps.id"), nullable=False)
user_id: Mapped[str] = mapped_column(StringUUID, nullable=False) user_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
# who published this tool # who published this tool
description = mapped_column(db.Text, nullable=False) description = mapped_column(sa.Text, nullable=False)
# llm_description of the tool, for LLM # llm_description of the tool, for LLM
llm_description = mapped_column(db.Text, nullable=False) llm_description = mapped_column(sa.Text, nullable=False)
# query description, query will be seem as a parameter of the tool, # query description, query will be seem as a parameter of the tool,
# to describe this parameter to llm, we need this field # to describe this parameter to llm, we need this field
query_description = mapped_column(db.Text, nullable=False) query_description = mapped_column(sa.Text, nullable=False)
# query name, the name of the query parameter # query name, the name of the query parameter
query_name = mapped_column(String(40), nullable=False) query_name = mapped_column(String(40), nullable=False)
# name of the tool provider # name of the tool provider
tool_name = mapped_column(String(40), nullable=False) tool_name = mapped_column(String(40), nullable=False)
# author # author
author = mapped_column(String(40), nullable=False) author = mapped_column(String(40), nullable=False)
created_at = mapped_column(sa.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)")) created_at = mapped_column(sa.DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)"))
updated_at = mapped_column(sa.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)")) updated_at = mapped_column(sa.DateTime, nullable=False, server_default=sa.text("CURRENT_TIMESTAMP(0)"))
@property @property
def description_i18n(self) -> I18nObject: def description_i18n(self) -> I18nObject:

View file

@ -1,5 +1,6 @@
from datetime import datetime from datetime import datetime
import sqlalchemy as sa
from sqlalchemy import DateTime, String, func from sqlalchemy import DateTime, String, func
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
@ -13,15 +14,15 @@ from .types import StringUUID
class SavedMessage(Base): class SavedMessage(Base):
__tablename__ = "saved_messages" __tablename__ = "saved_messages"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="saved_message_pkey"), sa.PrimaryKeyConstraint("id", name="saved_message_pkey"),
db.Index("saved_message_message_idx", "app_id", "message_id", "created_by_role", "created_by"), sa.Index("saved_message_message_idx", "app_id", "message_id", "created_by_role", "created_by"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
message_id = mapped_column(StringUUID, nullable=False) message_id = mapped_column(StringUUID, nullable=False)
created_by_role = mapped_column( created_by_role = mapped_column(
String(255), nullable=False, server_default=db.text("'end_user'::character varying") String(255), nullable=False, server_default=sa.text("'end_user'::character varying")
) )
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
@ -34,15 +35,15 @@ class SavedMessage(Base):
class PinnedConversation(Base): class PinnedConversation(Base):
__tablename__ = "pinned_conversations" __tablename__ = "pinned_conversations"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="pinned_conversation_pkey"), sa.PrimaryKeyConstraint("id", name="pinned_conversation_pkey"),
db.Index("pinned_conversation_conversation_idx", "app_id", "conversation_id", "created_by_role", "created_by"), sa.Index("pinned_conversation_conversation_idx", "app_id", "conversation_id", "created_by_role", "created_by"),
) )
id = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
app_id = mapped_column(StringUUID, nullable=False) app_id = mapped_column(StringUUID, nullable=False)
conversation_id: Mapped[str] = mapped_column(StringUUID) conversation_id: Mapped[str] = mapped_column(StringUUID)
created_by_role = mapped_column( created_by_role = mapped_column(
String(255), nullable=False, server_default=db.text("'end_user'::character varying") String(255), nullable=False, server_default=sa.text("'end_user'::character varying")
) )
created_by = mapped_column(StringUUID, nullable=False) created_by = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())

View file

@ -6,6 +6,7 @@ from enum import Enum, StrEnum
from typing import TYPE_CHECKING, Any, Optional, Union from typing import TYPE_CHECKING, Any, Optional, Union
from uuid import uuid4 from uuid import uuid4
import sqlalchemy as sa
from flask_login import current_user from flask_login import current_user
from sqlalchemy import DateTime, orm from sqlalchemy import DateTime, orm
@ -24,7 +25,6 @@ from ._workflow_exc import NodeNotFoundError, WorkflowDataError
if TYPE_CHECKING: if TYPE_CHECKING:
from models.model import AppMode from models.model import AppMode
import sqlalchemy as sa
from sqlalchemy import Index, PrimaryKeyConstraint, String, UniqueConstraint, func from sqlalchemy import Index, PrimaryKeyConstraint, String, UniqueConstraint, func
from sqlalchemy.orm import Mapped, declared_attr, mapped_column from sqlalchemy.orm import Mapped, declared_attr, mapped_column
@ -117,11 +117,11 @@ class Workflow(Base):
__tablename__ = "workflows" __tablename__ = "workflows"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="workflow_pkey"), sa.PrimaryKeyConstraint("id", name="workflow_pkey"),
db.Index("workflow_version_idx", "tenant_id", "app_id", "version"), sa.Index("workflow_version_idx", "tenant_id", "app_id", "version"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
app_id: Mapped[str] = mapped_column(StringUUID, nullable=False) app_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
type: Mapped[str] = mapped_column(String(255), nullable=False) type: Mapped[str] = mapped_column(String(255), nullable=False)
@ -140,10 +140,10 @@ class Workflow(Base):
server_onupdate=func.current_timestamp(), server_onupdate=func.current_timestamp(),
) )
_environment_variables: Mapped[str] = mapped_column( _environment_variables: Mapped[str] = mapped_column(
"environment_variables", db.Text, nullable=False, server_default="{}" "environment_variables", sa.Text, nullable=False, server_default="{}"
) )
_conversation_variables: Mapped[str] = mapped_column( _conversation_variables: Mapped[str] = mapped_column(
"conversation_variables", db.Text, nullable=False, server_default="{}" "conversation_variables", sa.Text, nullable=False, server_default="{}"
) )
VERSION_DRAFT = "draft" VERSION_DRAFT = "draft"
@ -491,11 +491,11 @@ class WorkflowRun(Base):
__tablename__ = "workflow_runs" __tablename__ = "workflow_runs"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="workflow_run_pkey"), sa.PrimaryKeyConstraint("id", name="workflow_run_pkey"),
db.Index("workflow_run_triggerd_from_idx", "tenant_id", "app_id", "triggered_from"), sa.Index("workflow_run_triggerd_from_idx", "tenant_id", "app_id", "triggered_from"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID) tenant_id: Mapped[str] = mapped_column(StringUUID)
app_id: Mapped[str] = mapped_column(StringUUID) app_id: Mapped[str] = mapped_column(StringUUID)
@ -503,19 +503,19 @@ class WorkflowRun(Base):
type: Mapped[str] = mapped_column(String(255)) type: Mapped[str] = mapped_column(String(255))
triggered_from: Mapped[str] = mapped_column(String(255)) triggered_from: Mapped[str] = mapped_column(String(255))
version: Mapped[str] = mapped_column(String(255)) version: Mapped[str] = mapped_column(String(255))
graph: Mapped[Optional[str]] = mapped_column(db.Text) graph: Mapped[Optional[str]] = mapped_column(sa.Text)
inputs: Mapped[Optional[str]] = mapped_column(db.Text) inputs: Mapped[Optional[str]] = mapped_column(sa.Text)
status: Mapped[str] = mapped_column(String(255)) # running, succeeded, failed, stopped, partial-succeeded status: Mapped[str] = mapped_column(String(255)) # running, succeeded, failed, stopped, partial-succeeded
outputs: Mapped[Optional[str]] = mapped_column(sa.Text, default="{}") outputs: Mapped[Optional[str]] = mapped_column(sa.Text, default="{}")
error: Mapped[Optional[str]] = mapped_column(db.Text) error: Mapped[Optional[str]] = mapped_column(sa.Text)
elapsed_time: Mapped[float] = mapped_column(db.Float, nullable=False, server_default=sa.text("0")) elapsed_time: Mapped[float] = mapped_column(sa.Float, nullable=False, server_default=sa.text("0"))
total_tokens: Mapped[int] = mapped_column(sa.BigInteger, server_default=sa.text("0")) total_tokens: Mapped[int] = mapped_column(sa.BigInteger, server_default=sa.text("0"))
total_steps: Mapped[int] = mapped_column(db.Integer, server_default=db.text("0"), nullable=True) total_steps: Mapped[int] = mapped_column(sa.Integer, server_default=sa.text("0"), nullable=True)
created_by_role: Mapped[str] = mapped_column(String(255)) # account, end_user created_by_role: Mapped[str] = mapped_column(String(255)) # account, end_user
created_by: Mapped[str] = mapped_column(StringUUID, nullable=False) created_by: Mapped[str] = mapped_column(StringUUID, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.current_timestamp())
finished_at: Mapped[Optional[datetime]] = mapped_column(DateTime) finished_at: Mapped[Optional[datetime]] = mapped_column(DateTime)
exceptions_count: Mapped[int] = mapped_column(db.Integer, server_default=db.text("0"), nullable=True) exceptions_count: Mapped[int] = mapped_column(sa.Integer, server_default=sa.text("0"), nullable=True)
@property @property
def created_by_account(self): def created_by_account(self):
@ -704,25 +704,25 @@ class WorkflowNodeExecutionModel(Base):
), ),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID) tenant_id: Mapped[str] = mapped_column(StringUUID)
app_id: Mapped[str] = mapped_column(StringUUID) app_id: Mapped[str] = mapped_column(StringUUID)
workflow_id: Mapped[str] = mapped_column(StringUUID) workflow_id: Mapped[str] = mapped_column(StringUUID)
triggered_from: Mapped[str] = mapped_column(String(255)) triggered_from: Mapped[str] = mapped_column(String(255))
workflow_run_id: Mapped[Optional[str]] = mapped_column(StringUUID) workflow_run_id: Mapped[Optional[str]] = mapped_column(StringUUID)
index: Mapped[int] = mapped_column(db.Integer) index: Mapped[int] = mapped_column(sa.Integer)
predecessor_node_id: Mapped[Optional[str]] = mapped_column(String(255)) predecessor_node_id: Mapped[Optional[str]] = mapped_column(String(255))
node_execution_id: Mapped[Optional[str]] = mapped_column(String(255)) node_execution_id: Mapped[Optional[str]] = mapped_column(String(255))
node_id: Mapped[str] = mapped_column(String(255)) node_id: Mapped[str] = mapped_column(String(255))
node_type: Mapped[str] = mapped_column(String(255)) node_type: Mapped[str] = mapped_column(String(255))
title: Mapped[str] = mapped_column(String(255)) title: Mapped[str] = mapped_column(String(255))
inputs: Mapped[Optional[str]] = mapped_column(db.Text) inputs: Mapped[Optional[str]] = mapped_column(sa.Text)
process_data: Mapped[Optional[str]] = mapped_column(db.Text) process_data: Mapped[Optional[str]] = mapped_column(sa.Text)
outputs: Mapped[Optional[str]] = mapped_column(db.Text) outputs: Mapped[Optional[str]] = mapped_column(sa.Text)
status: Mapped[str] = mapped_column(String(255)) status: Mapped[str] = mapped_column(String(255))
error: Mapped[Optional[str]] = mapped_column(db.Text) error: Mapped[Optional[str]] = mapped_column(sa.Text)
elapsed_time: Mapped[float] = mapped_column(db.Float, server_default=db.text("0")) elapsed_time: Mapped[float] = mapped_column(sa.Float, server_default=sa.text("0"))
execution_metadata: Mapped[Optional[str]] = mapped_column(db.Text) execution_metadata: Mapped[Optional[str]] = mapped_column(sa.Text)
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp()) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.current_timestamp())
created_by_role: Mapped[str] = mapped_column(String(255)) created_by_role: Mapped[str] = mapped_column(String(255))
created_by: Mapped[str] = mapped_column(StringUUID) created_by: Mapped[str] = mapped_column(StringUUID)
@ -834,11 +834,11 @@ class WorkflowAppLog(Base):
__tablename__ = "workflow_app_logs" __tablename__ = "workflow_app_logs"
__table_args__ = ( __table_args__ = (
db.PrimaryKeyConstraint("id", name="workflow_app_log_pkey"), sa.PrimaryKeyConstraint("id", name="workflow_app_log_pkey"),
db.Index("workflow_app_log_app_idx", "tenant_id", "app_id"), sa.Index("workflow_app_log_app_idx", "tenant_id", "app_id"),
) )
id: Mapped[str] = mapped_column(StringUUID, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, server_default=sa.text("uuid_generate_v4()"))
tenant_id: Mapped[str] = mapped_column(StringUUID) tenant_id: Mapped[str] = mapped_column(StringUUID)
app_id: Mapped[str] = mapped_column(StringUUID) app_id: Mapped[str] = mapped_column(StringUUID)
workflow_id: Mapped[str] = mapped_column(StringUUID, nullable=False) workflow_id: Mapped[str] = mapped_column(StringUUID, nullable=False)
@ -871,7 +871,7 @@ class ConversationVariable(Base):
id: Mapped[str] = mapped_column(StringUUID, primary_key=True) id: Mapped[str] = mapped_column(StringUUID, primary_key=True)
conversation_id: Mapped[str] = mapped_column(StringUUID, nullable=False, primary_key=True, index=True) conversation_id: Mapped[str] = mapped_column(StringUUID, nullable=False, primary_key=True, index=True)
app_id: Mapped[str] = mapped_column(StringUUID, nullable=False, index=True) app_id: Mapped[str] = mapped_column(StringUUID, nullable=False, index=True)
data: Mapped[str] = mapped_column(db.Text, nullable=False) data: Mapped[str] = mapped_column(sa.Text, nullable=False)
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
DateTime, nullable=False, server_default=func.current_timestamp(), index=True DateTime, nullable=False, server_default=func.current_timestamp(), index=True
) )
@ -933,7 +933,7 @@ class WorkflowDraftVariable(Base):
__allow_unmapped__ = True __allow_unmapped__ = True
# id is the unique identifier of a draft variable. # id is the unique identifier of a draft variable.
id: Mapped[str] = mapped_column(StringUUID, primary_key=True, server_default=db.text("uuid_generate_v4()")) id: Mapped[str] = mapped_column(StringUUID, primary_key=True, server_default=sa.text("uuid_generate_v4()"))
created_at: Mapped[datetime] = mapped_column( created_at: Mapped[datetime] = mapped_column(
DateTime, DateTime,

View file

@ -2,6 +2,7 @@ import json
import logging import logging
import click import click
import sqlalchemy as sa
from core.plugin.entities.plugin import GenericProviderID, ModelProviderID, ToolProviderID from core.plugin.entities.plugin import GenericProviderID, ModelProviderID, ToolProviderID
from models.engine import db from models.engine import db
@ -38,7 +39,7 @@ class PluginDataMigration:
where {provider_column_name} not like '%/%' and {provider_column_name} is not null and {provider_column_name} != '' where {provider_column_name} not like '%/%' and {provider_column_name} is not null and {provider_column_name} != ''
limit 1000""" limit 1000"""
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql)) rs = conn.execute(sa.text(sql))
current_iter_count = 0 current_iter_count = 0
for i in rs: for i in rs:
@ -94,7 +95,7 @@ limit 1000"""
:provider_name :provider_name
{update_retrieval_model_sql} {update_retrieval_model_sql}
where id = :record_id""" where id = :record_id"""
conn.execute(db.text(sql), params) conn.execute(sa.text(sql), params)
click.echo( click.echo(
click.style( click.style(
f"[{processed_count}] Migrated [{table_name}] {record_id} ({provider_name})", f"[{processed_count}] Migrated [{table_name}] {record_id} ({provider_name})",
@ -148,7 +149,7 @@ limit 1000"""
params = {"last_id": last_id or ""} params = {"last_id": last_id or ""}
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(sql), params) rs = conn.execute(sa.text(sql), params)
current_iter_count = 0 current_iter_count = 0
batch_updates = [] batch_updates = []
@ -193,7 +194,7 @@ limit 1000"""
SET {provider_column_name} = :updated_value SET {provider_column_name} = :updated_value
WHERE id = :record_id WHERE id = :record_id
""" """
conn.execute(db.text(update_sql), [{"updated_value": u, "record_id": r} for u, r in batch_updates]) conn.execute(sa.text(update_sql), [{"updated_value": u, "record_id": r} for u, r in batch_updates])
click.echo( click.echo(
click.style( click.style(
f"[{processed_count}] Batch migrated [{len(batch_updates)}] records from [{table_name}]", f"[{processed_count}] Batch migrated [{len(batch_updates)}] records from [{table_name}]",

View file

@ -9,6 +9,7 @@ from typing import Any, Optional
from uuid import uuid4 from uuid import uuid4
import click import click
import sqlalchemy as sa
import tqdm import tqdm
from flask import Flask, current_app from flask import Flask, current_app
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
@ -197,7 +198,7 @@ class PluginMigration:
""" """
with Session(db.engine) as session: with Session(db.engine) as session:
rs = session.execute( rs = session.execute(
db.text(f"SELECT DISTINCT {column} FROM {table} WHERE tenant_id = :tenant_id"), {"tenant_id": tenant_id} sa.text(f"SELECT DISTINCT {column} FROM {table} WHERE tenant_id = :tenant_id"), {"tenant_id": tenant_id}
) )
result = [] result = []
for row in rs: for row in rs:

View file

@ -3,6 +3,7 @@ import time
from collections.abc import Callable from collections.abc import Callable
import click import click
import sqlalchemy as sa
from celery import shared_task # type: ignore from celery import shared_task # type: ignore
from sqlalchemy import delete from sqlalchemy import delete
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
@ -331,7 +332,7 @@ def _delete_trace_app_configs(tenant_id: str, app_id: str):
def _delete_records(query_sql: str, params: dict, delete_func: Callable, name: str) -> None: def _delete_records(query_sql: str, params: dict, delete_func: Callable, name: str) -> None:
while True: while True:
with db.engine.begin() as conn: with db.engine.begin() as conn:
rs = conn.execute(db.text(query_sql), params) rs = conn.execute(sa.text(query_sql), params)
if rs.rowcount == 0: if rs.rowcount == 0:
break break