mirror of
https://github.com/tiennm99/DocsGPT.git
synced 2026-10-14 10:17:55 +00:00
The backend import package is now docsgpt, the name it will carry on PyPI; application was far too generic to install into anyone's site-packages. git mv plus a mechanical rewrite of every import, dotted string and path reference: 734 Python files, the compose files, Dockerfile, workflows, docs, setup scripts, devcontainer, k8s manifests, vscode config, pytest and coverage config, .gitignore. Behaviour is unchanged. Kept for one release: - A top-level application package whose meta-path finder resolves application.x.y to the already-imported docsgpt.x.y object, so old imports and entry points (celery -A application.app.celery, uvicorn application.asgi:asgi_app) keep working with a FutureWarning. - Celery registers every application.* task name as an alias of its docsgpt.* task on start-up, so messages queued by the previous release still run. The redbeat key prefix moves to redbeat:docsgpt:v2: so schedule entries the previous release wrote are left unread instead of firing twice. The backend image builds from the repository root (docker build -f docsgpt/Dockerfile .) so it can ship the alias package; a root .dockerignore allow-lists docsgpt/ and application/ and keeps caches, local data, .env files, the sample index files and the Dockerfile out. Compose and the image workflows point at the new context.
66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
"""0003 user_custom_models — per-user OpenAI-compatible model registrations.
|
|
|
|
Revision ID: 0003_user_custom_models
|
|
Revises: 0002_app_metadata
|
|
"""
|
|
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
|
|
|
|
revision: str = "0003_user_custom_models"
|
|
down_revision: Union[str, None] = "0002_app_metadata"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.execute(
|
|
"""
|
|
CREATE TABLE user_custom_models (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id TEXT NOT NULL,
|
|
upstream_model_id TEXT NOT NULL,
|
|
display_name TEXT NOT NULL,
|
|
description TEXT NOT NULL DEFAULT '',
|
|
base_url TEXT NOT NULL,
|
|
api_key_encrypted TEXT NOT NULL,
|
|
capabilities JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
enabled BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
"""
|
|
)
|
|
op.execute(
|
|
"CREATE INDEX user_custom_models_user_id_idx "
|
|
"ON user_custom_models (user_id);"
|
|
)
|
|
|
|
# Mirror the project-wide invariants set up in 0001_initial:
|
|
# * user_id FK with ON DELETE RESTRICT (deferrable),
|
|
# * ensure_user_exists() trigger so the parent users row autocreates,
|
|
# * set_updated_at() trigger.
|
|
op.execute(
|
|
"ALTER TABLE user_custom_models "
|
|
"ADD CONSTRAINT user_custom_models_user_id_fk "
|
|
"FOREIGN KEY (user_id) REFERENCES users(user_id) "
|
|
"ON DELETE RESTRICT DEFERRABLE INITIALLY IMMEDIATE;"
|
|
)
|
|
op.execute(
|
|
"CREATE TRIGGER user_custom_models_ensure_user "
|
|
"BEFORE INSERT OR UPDATE OF user_id ON user_custom_models "
|
|
"FOR EACH ROW EXECUTE FUNCTION ensure_user_exists();"
|
|
)
|
|
op.execute(
|
|
"CREATE TRIGGER user_custom_models_set_updated_at "
|
|
"BEFORE UPDATE ON user_custom_models "
|
|
"FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) "
|
|
"EXECUTE FUNCTION set_updated_at();"
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.execute("DROP TABLE IF EXISTS user_custom_models;")
|