From 4ed32f619e0194c05fe9c92a0f31d5843de49ea4 Mon Sep 17 00:00:00 2001 From: hachall Date: Wed, 21 Oct 2026 12:17:09 +0100 Subject: [PATCH 1/2] refactor!: retire the serving-class presets, grants and default classes The interactive/throughput presets, per-account class grants and account or overlay default classes are unused. Removing them now keeps the routing path small before model class routing lands. - Onwards resolves only overlay targets (`custom`) or nothing (`standard`) and the self-hosted restriction; class suffixes are no longer parsed. - dwctl no longer strips or interprets realtime class suffixes. Flex, background and batch uploads still discard a model suffix after a shape check, unchanged. - The admin API drops the grant and default-class fields; the organisation serving view and model overlays keep targets and self_hosted_only. - The model catalog accepts `serving_classes` only as an empty map. The organisation catalog prices `standard` and `custom` only, and retires any rows it owned under the old class names. - The dashboard drops the grant, default-class and preset views. Stored onwards configuration that still carries the old fields loads with them ignored. Database columns are left in place for a later migration. --- ...314f2413fbb770dcc41797f608da9fe32d25d.json | 14 + ...e5cb5d9b9c29e9adcc71f374dfd761df87dd1.json | 239 ----- ...6e682b3ba284a504c476707b1ae2ca4bd3c0.json} | 12 +- ...7564605acefaed107003823faa04199973f1d.json | 12 + ...1648d7dc97559683ef1aab1ae870829d4b0f.json} | 16 +- ...5479fe1cc4fae59e27795364fa9db948583d9.json | 220 ---- ...16eda45bf97b6d1f5d4fef08d34563761e4f9.json | 220 ---- ...b26792d4dafa8f7cc285626a6fbecd08c06ba.json | 12 - ...42171937b00f011ffcaaa0aa5b83d1e303108.json | 230 ----- ...2d569730c909825ce19eb056da0e8f7d50f9a.json | 239 ----- ...cfc7e0beb139daa7944bd1a603e5db5fbe95.json} | 18 +- ...3659aeb359b1286b810d6845d553fa82954b4.json | 230 ----- ...4857371a43a0529bb91f23e06e4d8b7b7cca5.json | 230 ----- ...0430aa30f3411dfbce9b8238605ad820c115.json} | 21 +- ...80cd3fa9d69e2fe205a31ff7bd70cfa71274b.json | 191 ---- ...e31da7e20b5a09f0e3ffe636402704a1a65e6.json | 232 ----- ...cb87fa34dc8b216aabf606fc38dc4135ffdf6.json | 194 ---- ...afef924435367d98d56b4df9d6836f5011bf.json} | 18 +- ...9fb7aa6a5ee46496a86fe1b74c21e7e09072.json} | 21 +- ...7ec0b1d39c90ea88c9a258328134c7510c91c.json | 22 + ...6cd1b7afc13cf40f5e0deb61a378f7dbc50f3.json | 220 ---- ...03b6155ff37920e710a4684695906baecdaf8.json | 12 + ...2dbe4111e69606e91d5bf15e683eef6b882f.json} | 10 +- ...ed7d1298b10b35013cc41ce79803401b538ea.json | 190 ---- ...a103831eb7aaa02edbdbe1bdd805600ee31c3.json | 38 - ...f61dc26f270bfb490be03ccf21a1620efcd0c.json | 238 ----- ...3f100aceca853bb764fc92dc7cae23db2c014.json | 194 ---- ...7d8fe20a3194a39ad1665aa7582d6b7f9a9eb.json | 26 + ...1acdcd34a30eda74fe691c8bb48b4cd62afe6.json | 232 +++++ ...abc0478e8c4248bd0df263cef6a671b1860a.json} | 18 +- ...2bc21674b2d8ccf070dcb0a03b1080adf1016.json | 12 - ...06ce13114cc60859bd4d7dcc994630ef544d1.json | 12 - ...fd8ca33cc51f7bece450934524f28f0ec2897.json | 220 ---- ...34a07da7fe1fd992bb96b1d6d3047c7a2bd18.json | 228 ----- ...d3ac5f93006462db4c72279a199db64e831e9.json | 12 - ...2e36dbbb886cda6a98b5407e325844e523000.json | 190 ---- ...36d8c612fce4f8e6a667ddef353822847e58.json} | 18 +- ...2da866083e4af05fc89b3e7cae292f0562e1c.json | 228 ----- ...2b558ca638607619b84da77364766a8872cb8.json | 191 ---- ...40dd5296e6d8c1cf5e86ae8bf2950dcecffd.json} | 18 +- ...71ab66c3e337c508dbd54979be518c2eac61.json} | 16 +- ...e6172ec2127149113450f699bea4329be0f12.json | 230 ----- .../src/api/control-layer/mocks/handlers.ts | 1 - dashboard/src/api/control-layer/types.ts | 17 +- .../models/manage/ModelPricing.test.tsx | 15 +- .../features/models/manage/ModelPricing.tsx | 43 +- .../EditOrganizationModal.test.tsx | 15 +- .../organizations/EditOrganizationModal.tsx | 57 +- .../OrganizationServingCard.test.tsx | 1 - .../organizations/OrganizationServingCard.tsx | 25 +- .../features/serving/OverlayDetails.tsx | 16 +- .../users-groups/UsersGroups/UsersGroups.tsx | 2 - .../EditUserModal/EditUserModal.test.tsx | 16 +- .../modals/EditUserModal/EditUserModal.tsx | 73 +- .../src/how-to/organization-model-overlays.md | 32 +- docs/src/reference/configuration.md | 2 +- docs/src/reference/model-provisioning.md | 5 +- dwctl/src/api/handlers/auth.rs | 4 - dwctl/src/api/handlers/deployments.rs | 11 +- dwctl/src/api/handlers/files.rs | 6 +- dwctl/src/api/handlers/mod.rs | 13 - dwctl/src/api/handlers/organizations.rs | 43 +- dwctl/src/api/handlers/payments.rs | 6 - dwctl/src/api/handlers/serving.rs | 18 +- dwctl/src/api/handlers/users.rs | 33 +- .../src/api/models/deployments/enrichment.rs | 1 - dwctl/src/api/models/deployments/mod.rs | 14 - dwctl/src/api/models/organizations.rs | 13 - dwctl/src/api/models/serving.rs | 10 - dwctl/src/api/models/users.rs | 19 - dwctl/src/auth/current_user.rs | 2 - dwctl/src/db/handlers/deployments.rs | 13 +- dwctl/src/db/handlers/model_provisioning.rs | 10 +- dwctl/src/db/handlers/organizations.rs | 36 +- dwctl/src/db/handlers/users.rs | 48 +- dwctl/src/db/models/deployments.rs | 3 - dwctl/src/db/models/organizations.rs | 5 - dwctl/src/db/models/users.rs | 12 - dwctl/src/inference/middleware.rs | 92 +- dwctl/src/inference/mod.rs | 1 + dwctl/src/inference/model_selector.rs | 47 + dwctl/src/inference/rejections.rs | 2 +- dwctl/src/model_provisioning.rs | 147 +-- dwctl/src/org_overlays.rs | 103 +- dwctl/src/sample_files/mod.rs | 1 - dwctl/src/sync/endpoint_sync.rs | 1 - dwctl/src/sync/onwards_config/mod.rs | 70 +- dwctl/src/sync/onwards_config/tests.rs | 76 +- dwctl/src/test/serving_classes.rs | 112 +- dwctl/src/test/utils.rs | 4 - dwctl/tests/org_catalog_validator.rs | 6 +- model-provisioning.schema.json | 46 +- onwards/src/handlers.rs | 98 +- onwards/src/lib.rs | 3 +- onwards/src/load_balancer.rs | 40 +- onwards/src/serving.rs | 963 +++--------------- onwards/src/target.rs | 33 +- onwards/tests/rejections.rs | 22 - 98 files changed, 881 insertions(+), 6570 deletions(-) create mode 100644 .sqlx/query-0283463f57286bf37b40c6ce174314f2413fbb770dcc41797f608da9fe32d25d.json delete mode 100644 .sqlx/query-04c9480e5d6e7b51d1e0c204520e5cb5d9b9c29e9adcc71f374dfd761df87dd1.json rename .sqlx/{query-2812e4f2b125ba6710354865fa125d23761fc8f43b2a37f3e111369eae847349.json => query-06ba2412b030e59abcc02fc737cd6e682b3ba284a504c476707b1ae2ca4bd3c0.json} (51%) create mode 100644 .sqlx/query-0d0de7088b2fc8162e72a920fa97564605acefaed107003823faa04199973f1d.json rename .sqlx/{query-3760af261851960f785fa7318d9567dfe90150961bad41ce15f9e0c9423eefdc.json => query-1b61dc7f99f119321f26b2b811b71648d7dc97559683ef1aab1ae870829d4b0f.json} (79%) delete mode 100644 .sqlx/query-1bc851ff9d5303a703b46ff6b9e5479fe1cc4fae59e27795364fa9db948583d9.json delete mode 100644 .sqlx/query-1f40d9f411027995c3bd37d65c316eda45bf97b6d1f5d4fef08d34563761e4f9.json delete mode 100644 .sqlx/query-331d4be1b0ad65341541e9873c8b26792d4dafa8f7cc285626a6fbecd08c06ba.json delete mode 100644 .sqlx/query-41450c6080bae08d697bb842a9e42171937b00f011ffcaaa0aa5b83d1e303108.json delete mode 100644 .sqlx/query-41c346d978119f37f45d2ea5f542d569730c909825ce19eb056da0e8f7d50f9a.json rename .sqlx/{query-b26923e64d58f98e50cac53a7ab94d0b6fc105e312b9ead96336a0f20b098c8a.json => query-4c623c6e65501098d3574bd73e2ecfc7e0beb139daa7944bd1a603e5db5fbe95.json} (91%) delete mode 100644 .sqlx/query-4fe92a5226d820b8301a6acaa6e3659aeb359b1286b810d6845d553fa82954b4.json delete mode 100644 .sqlx/query-5124e7a1d40771d8e5ac2091a2c4857371a43a0529bb91f23e06e4d8b7b7cca5.json rename .sqlx/{query-6dc1f2e8e5ee7eb2cd49a3890a46537bf6e0be92906fabe93efa6e59efda8266.json => query-53031ec6629387a0a7beac8792e10430aa30f3411dfbce9b8238605ad820c115.json} (82%) delete mode 100644 .sqlx/query-616cd17f9ebddac2645b215ae4280cd3fa9d69e2fe205a31ff7bd70cfa71274b.json delete mode 100644 .sqlx/query-727298074e8c30b6f5386a05e41e31da7e20b5a09f0e3ffe636402704a1a65e6.json delete mode 100644 .sqlx/query-7906763e9250d0f7a30e0937fedcb87fa34dc8b216aabf606fc38dc4135ffdf6.json rename .sqlx/{query-1e58059d2038426045c82e58c7eb452fae8f00be38bd884b57ceeef70dbcc8cf.json => query-7be7944400646dcf299040f1f884afef924435367d98d56b4df9d6836f5011bf.json} (92%) rename .sqlx/{query-9fbf45082890e8ce04783e093ed014d5e4df6a2b52278a807fd90419e941fb64.json => query-7c97dce6f302fdaf8950f299ee879fb7aa6a5ee46496a86fe1b74c21e7e09072.json} (74%) create mode 100644 .sqlx/query-85d8e79af893d8cd3f5d5ff078e7ec0b1d39c90ea88c9a258328134c7510c91c.json delete mode 100644 .sqlx/query-8b3461c74bef7e971ea3f822c426cd1b7afc13cf40f5e0deb61a378f7dbc50f3.json create mode 100644 .sqlx/query-97ed98d95b232b32298169ba2ce03b6155ff37920e710a4684695906baecdaf8.json rename .sqlx/{query-b26b5029fd3185c8a6c88768a22094fc819b814eb0adc6e8184efd31dcfce1a3.json => query-9c7c89bf8db504e0a82390db6f812dbe4111e69606e91d5bf15e683eef6b882f.json} (90%) delete mode 100644 .sqlx/query-a056ee03ddac4796bfa0113104fed7d1298b10b35013cc41ce79803401b538ea.json delete mode 100644 .sqlx/query-a8267e1c6bf5ae1e38c2ddb155ba103831eb7aaa02edbdbe1bdd805600ee31c3.json delete mode 100644 .sqlx/query-a862c5bf7fb4418be2f16ccb233f61dc26f270bfb490be03ccf21a1620efcd0c.json delete mode 100644 .sqlx/query-ab1df7bfdc8d8036f568a19a39c3f100aceca853bb764fc92dc7cae23db2c014.json create mode 100644 .sqlx/query-ba34540c4fd715b7f949617bdda7d8fe20a3194a39ad1665aa7582d6b7f9a9eb.json create mode 100644 .sqlx/query-beca7427dfd22f328c1e31fff391acdcd34a30eda74fe691c8bb48b4cd62afe6.json rename .sqlx/{query-5849bc1e94bb696c829b8b37f792a908da49c92f3e2b8e3dbaa3a601473d13b2.json => query-bf54c1aaefa7b49b3fff8f39b39cabc0478e8c4248bd0df263cef6a671b1860a.json} (64%) delete mode 100644 .sqlx/query-c427588e0f5bb4e505b588014082bc21674b2d8ccf070dcb0a03b1080adf1016.json delete mode 100644 .sqlx/query-cbec4649892601b3c826cb167d906ce13114cc60859bd4d7dcc994630ef544d1.json delete mode 100644 .sqlx/query-d6a3bdde96679776f85e03ab9e5fd8ca33cc51f7bece450934524f28f0ec2897.json delete mode 100644 .sqlx/query-d6d7728c78dd244939db19786d634a07da7fe1fd992bb96b1d6d3047c7a2bd18.json delete mode 100644 .sqlx/query-d819dfc7acfe76e845c3ce89d94d3ac5f93006462db4c72279a199db64e831e9.json delete mode 100644 .sqlx/query-e5fdd0ad37f6dbfb5f9e4a752202e36dbbb886cda6a98b5407e325844e523000.json rename .sqlx/{query-a341d2e54b667a7020e013cb6fdbb6bf6ec887e855399f6175330776cfe01a40.json => query-e6af3350d4474eb89f8eb399def936d8c612fce4f8e6a667ddef353822847e58.json} (90%) delete mode 100644 .sqlx/query-ec12fcc8bc130c0e3ed513769eb2da866083e4af05fc89b3e7cae292f0562e1c.json delete mode 100644 .sqlx/query-ec50b8fbce7489cf6cb820d4a492b558ca638607619b84da77364766a8872cb8.json rename .sqlx/{query-3eeeff204fd4edb60c30709611619a9005bdb5fd4f1fdd8e87faa4322f295677.json => query-f3cb86b0d6ff8dc0ae72958ac70940dd5296e6d8c1cf5e86ae8bf2950dcecffd.json} (89%) rename .sqlx/{query-5bee3bad4a63e4b46a016115a1776622affe52125e2c1364284f1d56a27c6b4d.json => query-fb5ec1f12566c18f47242d618d3171ab66c3e337c508dbd54979be518c2eac61.json} (79%) delete mode 100644 .sqlx/query-fdb0c173dbf6c4983b907ed0100e6172ec2127149113450f699bea4329be0f12.json create mode 100644 dwctl/src/inference/model_selector.rs diff --git a/.sqlx/query-0283463f57286bf37b40c6ce174314f2413fbb770dcc41797f608da9fe32d25d.json b/.sqlx/query-0283463f57286bf37b40c6ce174314f2413fbb770dcc41797f608da9fe32d25d.json new file mode 100644 index 000000000..658dbfa2d --- /dev/null +++ b/.sqlx/query-0283463f57286bf37b40c6ce174314f2413fbb770dcc41797f608da9fe32d25d.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE users\n SET auto_topup_amount = 25.0,\n auto_topup_threshold = 10.0,\n payment_provider_id = 'cus_provider_failure'\n WHERE id = $1\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "0283463f57286bf37b40c6ce174314f2413fbb770dcc41797f608da9fe32d25d" +} diff --git a/.sqlx/query-04c9480e5d6e7b51d1e0c204520e5cb5d9b9c29e9adcc71f374dfd761df87dd1.json b/.sqlx/query-04c9480e5d6e7b51d1e0c204520e5cb5d9b9c29e9adcc71f374dfd761df87dd1.json deleted file mode 100644 index 1bdd9e91c..000000000 --- a/.sqlx/query-04c9480e5d6e7b51d1e0c204520e5cb5d9b9c29e9adcc71f374dfd761df87dd1.json +++ /dev/null @@ -1,239 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE users SET\n display_name = COALESCE($2, display_name),\n avatar_url = COALESCE($3, avatar_url),\n password_hash = COALESCE($4, password_hash),\n batch_notifications_enabled = COALESCE($5, batch_notifications_enabled),\n low_balance_threshold = CASE\n WHEN $6::boolean THEN $7\n ELSE low_balance_threshold\n END,\n low_balance_notification_sent = CASE\n WHEN $6::boolean THEN false\n ELSE low_balance_notification_sent\n END,\n auto_topup_amount = CASE\n WHEN $8::boolean THEN $9\n ELSE auto_topup_amount\n END,\n auto_topup_threshold = CASE\n WHEN $10::boolean THEN $11\n ELSE auto_topup_threshold\n END,\n auto_topup_monthly_limit = CASE\n WHEN $12::boolean THEN $13\n ELSE auto_topup_monthly_limit\n END,\n auto_topup_limit_notification_sent = CASE\n WHEN $12::boolean THEN false\n ELSE auto_topup_limit_notification_sent\n END,\n auto_topup_soft_failure_count = CASE\n WHEN $8::boolean OR $10::boolean THEN 0\n ELSE auto_topup_soft_failure_count\n END,\n auto_topup_retry_after = CASE\n WHEN $8::boolean OR $10::boolean THEN NULL\n ELSE auto_topup_retry_after\n END,\n zero_data_retention = COALESCE($14, zero_data_retention),\n default_serving_class = CASE\n WHEN $15::boolean THEN $16\n ELSE default_serving_class\n END,\n self_hosted_only = COALESCE($17, self_hosted_only),\n granted_serving_classes = COALESCE($18, granted_serving_classes),\n toleration_preset = CASE\n WHEN $19::boolean THEN $20\n ELSE toleration_preset\n END,\n updated_at = NOW()\n WHERE id = $1\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only, toleration_preset\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 23, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "auto_topup_soft_failure_count", - "type_info": "Int4" - }, - { - "ordinal": 27, - "name": "auto_topup_retry_after", - "type_info": "Timestamptz" - }, - { - "ordinal": 28, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 29, - "name": "auto_join_enabled", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 31, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "toleration_preset", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Text", - "Bool", - "Bool", - "Float4", - "Bool", - "Float4", - "Bool", - "Float4", - "Bool", - "Float4", - "Bool", - "Bool", - "Text", - "Bool", - "TextArray", - "Bool", - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "04c9480e5d6e7b51d1e0c204520e5cb5d9b9c29e9adcc71f374dfd761df87dd1" -} diff --git a/.sqlx/query-2812e4f2b125ba6710354865fa125d23761fc8f43b2a37f3e111369eae847349.json b/.sqlx/query-06ba2412b030e59abcc02fc737cd6e682b3ba284a504c476707b1ae2ca4bd3c0.json similarity index 51% rename from .sqlx/query-2812e4f2b125ba6710354865fa125d23761fc8f43b2a37f3e111369eae847349.json rename to .sqlx/query-06ba2412b030e59abcc02fc737cd6e682b3ba284a504c476707b1ae2ca4bd3c0.json index 4dd163cc1..7af881e1a 100644 --- a/.sqlx/query-2812e4f2b125ba6710354865fa125d23761fc8f43b2a37f3e111369eae847349.json +++ b/.sqlx/query-06ba2412b030e59abcc02fc737cd6e682b3ba284a504c476707b1ae2ca4bd3c0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT mo.user_id, dm.alias, mo.default_serving_class, mo.targets, mo.self_hosted_only\n FROM model_overlays mo\n INNER JOIN deployed_models dm ON dm.id = mo.deployed_model_id\n INNER JOIN users u ON u.id = mo.user_id\n WHERE dm.deleted = FALSE\n AND u.is_deleted = FALSE\n ", + "query": "\n SELECT mo.user_id, dm.alias, mo.targets, mo.self_hosted_only\n FROM model_overlays mo\n INNER JOIN deployed_models dm ON dm.id = mo.deployed_model_id\n INNER JOIN users u ON u.id = mo.user_id\n WHERE dm.deleted = FALSE\n AND u.is_deleted = FALSE\n ", "describe": { "columns": [ { @@ -15,16 +15,11 @@ }, { "ordinal": 2, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 3, "name": "targets", "type_info": "Jsonb" }, { - "ordinal": 4, + "ordinal": 3, "name": "self_hosted_only", "type_info": "Bool" } @@ -36,9 +31,8 @@ false, false, true, - true, true ] }, - "hash": "2812e4f2b125ba6710354865fa125d23761fc8f43b2a37f3e111369eae847349" + "hash": "06ba2412b030e59abcc02fc737cd6e682b3ba284a504c476707b1ae2ca4bd3c0" } diff --git a/.sqlx/query-0d0de7088b2fc8162e72a920fa97564605acefaed107003823faa04199973f1d.json b/.sqlx/query-0d0de7088b2fc8162e72a920fa97564605acefaed107003823faa04199973f1d.json new file mode 100644 index 000000000..6658d8c7b --- /dev/null +++ b/.sqlx/query-0d0de7088b2fc8162e72a920fa97564605acefaed107003823faa04199973f1d.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO model_overlays (user_id, deployed_model_id, targets, self_hosted_only)\n VALUES ('00000000-0000-0000-0000-0000000000a1', '40000000-0000-0000-0000-000000000001', NULL, false),\n ('00000000-0000-0000-0000-0000000000b1', '40000000-0000-0000-0000-000000000001', '{\"ttft_ms\": 800, \"itl_ms\": 30}', NULL)", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "0d0de7088b2fc8162e72a920fa97564605acefaed107003823faa04199973f1d" +} diff --git a/.sqlx/query-3760af261851960f785fa7318d9567dfe90150961bad41ce15f9e0c9423eefdc.json b/.sqlx/query-1b61dc7f99f119321f26b2b811b71648d7dc97559683ef1aab1ae870829d4b0f.json similarity index 79% rename from .sqlx/query-3760af261851960f785fa7318d9567dfe90150961bad41ce15f9e0c9423eefdc.json rename to .sqlx/query-1b61dc7f99f119321f26b2b811b71648d7dc97559683ef1aab1ae870829d4b0f.json index 0fa61e208..974fe3851 100644 --- a/.sqlx/query-3760af261851960f785fa7318d9567dfe90150961bad41ce15f9e0c9423eefdc.json +++ b/.sqlx/query-1b61dc7f99f119321f26b2b811b71648d7dc97559683ef1aab1ae870829d4b0f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n u.id,\n u.username,\n u.email,\n u.display_name,\n u.avatar_url,\n u.auth_source,\n u.created_at,\n u.updated_at,\n u.last_login,\n u.is_admin,\n u.password_hash,\n u.external_user_id,\n u.payment_provider_id,\n u.is_deleted,\n u.is_internal,\n u.batch_notifications_enabled,\n u.first_batch_email_sent,\n u.low_balance_notification_sent,\n u.low_balance_threshold,\n u.auto_topup_amount,\n u.auto_topup_threshold,\n u.auto_topup_monthly_limit,\n u.auto_topup_limit_notification_sent,\n u.user_type,\n u.verified,\n u.invoicing_enabled,\n u.zero_data_retention,\n u.granted_serving_classes,\n u.default_serving_class,\n u.self_hosted_only,\n ARRAY_AGG(ur.role) FILTER (WHERE ur.role IS NOT NULL) as \"roles: Vec\"\n FROM users u\n LEFT JOIN user_roles ur ON ur.user_id = u.id\n WHERE u.id = $1 AND u.id != '00000000-0000-0000-0000-000000000000' AND u.is_deleted = false\n GROUP BY u.id, u.username, u.email, u.display_name, u.avatar_url, u.auth_source, u.created_at, u.updated_at, u.last_login, u.is_admin, u.password_hash, u.external_user_id, u.payment_provider_id, u.is_deleted, u.is_internal, u.batch_notifications_enabled, u.first_batch_email_sent, u.low_balance_notification_sent, u.low_balance_threshold, u.auto_topup_amount, u.auto_topup_threshold, u.auto_topup_monthly_limit, u.auto_topup_limit_notification_sent, u.user_type, u.verified, u.invoicing_enabled, u.zero_data_retention, u.granted_serving_classes, u.default_serving_class, u.self_hosted_only\n ", + "query": "\n SELECT\n u.id,\n u.username,\n u.email,\n u.display_name,\n u.avatar_url,\n u.auth_source,\n u.created_at,\n u.updated_at,\n u.last_login,\n u.is_admin,\n u.password_hash,\n u.external_user_id,\n u.payment_provider_id,\n u.is_deleted,\n u.is_internal,\n u.batch_notifications_enabled,\n u.first_batch_email_sent,\n u.low_balance_notification_sent,\n u.low_balance_threshold,\n u.auto_topup_amount,\n u.auto_topup_threshold,\n u.auto_topup_monthly_limit,\n u.auto_topup_limit_notification_sent,\n u.user_type,\n u.verified,\n u.invoicing_enabled,\n u.zero_data_retention,\n u.self_hosted_only,\n u.toleration_preset,\n ARRAY_AGG(ur.role) FILTER (WHERE ur.role IS NOT NULL) as \"roles: Vec\"\n FROM users u\n LEFT JOIN user_roles ur ON ur.user_id = u.id\n WHERE u.id = $1 AND u.id != '00000000-0000-0000-0000-000000000000' AND u.is_deleted = false\n GROUP BY u.id, u.username, u.email, u.display_name, u.avatar_url, u.auth_source, u.created_at, u.updated_at, u.last_login, u.is_admin, u.password_hash, u.external_user_id, u.payment_provider_id, u.is_deleted, u.is_internal, u.batch_notifications_enabled, u.first_batch_email_sent, u.low_balance_notification_sent, u.low_balance_threshold, u.auto_topup_amount, u.auto_topup_threshold, u.auto_topup_monthly_limit, u.auto_topup_limit_notification_sent, u.user_type, u.verified, u.invoicing_enabled, u.zero_data_retention, u.self_hosted_only, u.toleration_preset\n ", "describe": { "columns": [ { @@ -140,21 +140,16 @@ }, { "ordinal": 27, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 28, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" }, { "ordinal": 29, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 30, "name": "roles: Vec", "type_info": { "Custom": { @@ -216,9 +211,8 @@ false, false, true, - false, null ] }, - "hash": "3760af261851960f785fa7318d9567dfe90150961bad41ce15f9e0c9423eefdc" + "hash": "1b61dc7f99f119321f26b2b811b71648d7dc97559683ef1aab1ae870829d4b0f" } diff --git a/.sqlx/query-1bc851ff9d5303a703b46ff6b9e5479fe1cc4fae59e27795364fa9db948583d9.json b/.sqlx/query-1bc851ff9d5303a703b46ff6b9e5479fe1cc4fae59e27795364fa9db948583d9.json deleted file mode 100644 index 5858047e5..000000000 --- a/.sqlx/query-1bc851ff9d5303a703b46ff6b9e5479fe1cc4fae59e27795364fa9db948583d9.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only, toleration_preset FROM users WHERE external_user_id = $1 AND id != '00000000-0000-0000-0000-000000000000' AND is_deleted = false", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 23, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "auto_topup_soft_failure_count", - "type_info": "Int4" - }, - { - "ordinal": 27, - "name": "auto_topup_retry_after", - "type_info": "Timestamptz" - }, - { - "ordinal": 28, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 29, - "name": "auto_join_enabled", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 31, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "toleration_preset", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "1bc851ff9d5303a703b46ff6b9e5479fe1cc4fae59e27795364fa9db948583d9" -} diff --git a/.sqlx/query-1f40d9f411027995c3bd37d65c316eda45bf97b6d1f5d4fef08d34563761e4f9.json b/.sqlx/query-1f40d9f411027995c3bd37d65c316eda45bf97b6d1f5d4fef08d34563761e4f9.json deleted file mode 100644 index 92f7ff963..000000000 --- a/.sqlx/query-1f40d9f411027995c3bd37d65c316eda45bf97b6d1f5d4fef08d34563761e4f9.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only, pinned_tolerations FROM users WHERE email = $1 AND id != '00000000-0000-0000-0000-000000000000' AND is_deleted = false AND user_type = 'individual'", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 23, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "auto_topup_soft_failure_count", - "type_info": "Int4" - }, - { - "ordinal": 27, - "name": "auto_topup_retry_after", - "type_info": "Timestamptz" - }, - { - "ordinal": 28, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 29, - "name": "auto_join_enabled", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 31, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "pinned_tolerations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "1f40d9f411027995c3bd37d65c316eda45bf97b6d1f5d4fef08d34563761e4f9" -} diff --git a/.sqlx/query-331d4be1b0ad65341541e9873c8b26792d4dafa8f7cc285626a6fbecd08c06ba.json b/.sqlx/query-331d4be1b0ad65341541e9873c8b26792d4dafa8f7cc285626a6fbecd08c06ba.json deleted file mode 100644 index 88a21323d..000000000 --- a/.sqlx/query-331d4be1b0ad65341541e9873c8b26792d4dafa8f7cc285626a6fbecd08c06ba.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE deployed_models\n SET serving_classes = '{\"interactive\": {\"ttft_ms\": 500, \"itl_ms\": 20, \"priority\": 200}, \"throughput\": {\"ttft_ms\": 5000, \"itl_ms\": 100}}'\n WHERE alias = 'regular-public'", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "331d4be1b0ad65341541e9873c8b26792d4dafa8f7cc285626a6fbecd08c06ba" -} diff --git a/.sqlx/query-41450c6080bae08d697bb842a9e42171937b00f011ffcaaa0aa5b83d1e303108.json b/.sqlx/query-41450c6080bae08d697bb842a9e42171937b00f011ffcaaa0aa5b83d1e303108.json deleted file mode 100644 index c3bc2086f..000000000 --- a/.sqlx/query-41450c6080bae08d697bb842a9e42171937b00f011ffcaaa0aa5b83d1e303108.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n u.id,\n u.username,\n u.email,\n u.display_name,\n u.avatar_url,\n u.auth_source,\n u.created_at,\n u.updated_at,\n u.last_login,\n u.is_admin,\n u.password_hash,\n u.external_user_id,\n u.payment_provider_id,\n u.is_deleted,\n u.is_internal,\n u.batch_notifications_enabled,\n u.first_batch_email_sent,\n u.low_balance_notification_sent,\n u.low_balance_threshold,\n u.auto_topup_amount,\n u.auto_topup_threshold,\n u.auto_topup_monthly_limit,\n u.auto_topup_limit_notification_sent,\n u.user_type,\n u.verified,\n u.invoicing_enabled,\n u.zero_data_retention,\n u.granted_serving_classes,\n u.default_serving_class,\n u.self_hosted_only,\n u.toleration_preset,\n ARRAY_AGG(ur.role) FILTER (WHERE ur.role IS NOT NULL) as \"roles: Vec\"\n FROM users u\n LEFT JOIN user_roles ur ON ur.user_id = u.id\n WHERE u.id = ANY($1) AND u.id != '00000000-0000-0000-0000-000000000000' AND u.is_deleted = false\n GROUP BY u.id, u.username, u.email, u.display_name, u.avatar_url, u.auth_source, u.created_at, u.updated_at, u.last_login, u.is_admin, u.password_hash, u.external_user_id, u.payment_provider_id, u.is_deleted, u.is_internal, u.batch_notifications_enabled, u.first_batch_email_sent, u.low_balance_notification_sent, u.low_balance_threshold, u.auto_topup_amount, u.auto_topup_threshold, u.auto_topup_monthly_limit, u.auto_topup_limit_notification_sent, u.user_type, u.verified, u.invoicing_enabled, u.zero_data_retention, u.granted_serving_classes, u.default_serving_class, u.self_hosted_only, u.toleration_preset\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 20, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 27, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 28, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 29, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "toleration_preset", - "type_info": "Text" - }, - { - "ordinal": 31, - "name": "roles: Vec", - "type_info": { - "Custom": { - "name": "user_role[]", - "kind": { - "Array": { - "Custom": { - "name": "user_role", - "kind": { - "Enum": [ - "PLATFORMMANAGER", - "REQUESTVIEWER", - "STANDARDUSER", - "BILLINGMANAGER", - "BATCHAPIUSER", - "CONNECTIONSUSER", - "BACKGROUNDINFERENCEUSER" - ] - } - } - } - } - } - } - } - ], - "parameters": { - "Left": [ - "UuidArray" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - false, - true, - false, - true, - null - ] - }, - "hash": "41450c6080bae08d697bb842a9e42171937b00f011ffcaaa0aa5b83d1e303108" -} diff --git a/.sqlx/query-41c346d978119f37f45d2ea5f542d569730c909825ce19eb056da0e8f7d50f9a.json b/.sqlx/query-41c346d978119f37f45d2ea5f542d569730c909825ce19eb056da0e8f7d50f9a.json deleted file mode 100644 index 1e3b22624..000000000 --- a/.sqlx/query-41c346d978119f37f45d2ea5f542d569730c909825ce19eb056da0e8f7d50f9a.json +++ /dev/null @@ -1,239 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE users SET\n display_name = COALESCE($2, display_name),\n avatar_url = COALESCE($3, avatar_url),\n password_hash = COALESCE($4, password_hash),\n batch_notifications_enabled = COALESCE($5, batch_notifications_enabled),\n low_balance_threshold = CASE\n WHEN $6::boolean THEN $7\n ELSE low_balance_threshold\n END,\n low_balance_notification_sent = CASE\n WHEN $6::boolean THEN false\n ELSE low_balance_notification_sent\n END,\n auto_topup_amount = CASE\n WHEN $8::boolean THEN $9\n ELSE auto_topup_amount\n END,\n auto_topup_threshold = CASE\n WHEN $10::boolean THEN $11\n ELSE auto_topup_threshold\n END,\n auto_topup_monthly_limit = CASE\n WHEN $12::boolean THEN $13\n ELSE auto_topup_monthly_limit\n END,\n auto_topup_limit_notification_sent = CASE\n WHEN $12::boolean THEN false\n ELSE auto_topup_limit_notification_sent\n END,\n auto_topup_soft_failure_count = CASE\n WHEN $8::boolean OR $10::boolean THEN 0\n ELSE auto_topup_soft_failure_count\n END,\n auto_topup_retry_after = CASE\n WHEN $8::boolean OR $10::boolean THEN NULL\n ELSE auto_topup_retry_after\n END,\n zero_data_retention = COALESCE($14, zero_data_retention),\n default_serving_class = CASE\n WHEN $15::boolean THEN $16\n ELSE default_serving_class\n END,\n self_hosted_only = COALESCE($17, self_hosted_only),\n granted_serving_classes = COALESCE($18, granted_serving_classes),\n pinned_tolerations = CASE\n WHEN $19::boolean THEN $20\n ELSE pinned_tolerations\n END,\n updated_at = NOW()\n WHERE id = $1\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only, pinned_tolerations\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 23, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "auto_topup_soft_failure_count", - "type_info": "Int4" - }, - { - "ordinal": 27, - "name": "auto_topup_retry_after", - "type_info": "Timestamptz" - }, - { - "ordinal": 28, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 29, - "name": "auto_join_enabled", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 31, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "pinned_tolerations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Text", - "Bool", - "Bool", - "Float4", - "Bool", - "Float4", - "Bool", - "Float4", - "Bool", - "Float4", - "Bool", - "Bool", - "Text", - "Bool", - "TextArray", - "Bool", - "Jsonb" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "41c346d978119f37f45d2ea5f542d569730c909825ce19eb056da0e8f7d50f9a" -} diff --git a/.sqlx/query-b26923e64d58f98e50cac53a7ab94d0b6fc105e312b9ead96336a0f20b098c8a.json b/.sqlx/query-4c623c6e65501098d3574bd73e2ecfc7e0beb139daa7944bd1a603e5db5fbe95.json similarity index 91% rename from .sqlx/query-b26923e64d58f98e50cac53a7ab94d0b6fc105e312b9ead96336a0f20b098c8a.json rename to .sqlx/query-4c623c6e65501098d3574bd73e2ecfc7e0beb139daa7944bd1a603e5db5fbe95.json index 235a92d85..7d96414fa 100644 --- a/.sqlx/query-b26923e64d58f98e50cac53a7ab94d0b6fc105e312b9ead96336a0f20b098c8a.json +++ b/.sqlx/query-4c623c6e65501098d3574bd73e2ecfc7e0beb139daa7944bd1a603e5db5fbe95.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO users (id, username, email, display_name, avatar_url, auth_source, user_type, is_admin)\n VALUES ($1, $2, $3, $4, $5, 'organization', 'organization', false)\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only\n ", + "query": "\n INSERT INTO users (id, username, email, display_name, avatar_url, auth_source, user_type, is_admin)\n VALUES ($1, $2, $3, $4, $5, 'organization', 'organization', false)\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n self_hosted_only, toleration_preset\n ", "describe": { "columns": [ { @@ -130,18 +130,13 @@ }, { "ordinal": 25, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 26, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" - }, - { - "ordinal": 27, - "name": "self_hosted_only", - "type_info": "Bool" } ], "parameters": { @@ -180,9 +175,8 @@ false, false, false, - true, - false + true ] }, - "hash": "b26923e64d58f98e50cac53a7ab94d0b6fc105e312b9ead96336a0f20b098c8a" + "hash": "4c623c6e65501098d3574bd73e2ecfc7e0beb139daa7944bd1a603e5db5fbe95" } diff --git a/.sqlx/query-4fe92a5226d820b8301a6acaa6e3659aeb359b1286b810d6845d553fa82954b4.json b/.sqlx/query-4fe92a5226d820b8301a6acaa6e3659aeb359b1286b810d6845d553fa82954b4.json deleted file mode 100644 index 8d35ff986..000000000 --- a/.sqlx/query-4fe92a5226d820b8301a6acaa6e3659aeb359b1286b810d6845d553fa82954b4.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n u.id,\n u.username,\n u.email,\n u.display_name,\n u.avatar_url,\n u.auth_source,\n u.created_at,\n u.updated_at,\n u.last_login,\n u.is_admin,\n u.password_hash,\n u.external_user_id,\n u.payment_provider_id,\n u.is_deleted,\n u.is_internal,\n u.batch_notifications_enabled,\n u.first_batch_email_sent,\n u.low_balance_notification_sent,\n u.low_balance_threshold,\n u.auto_topup_amount,\n u.auto_topup_threshold,\n u.auto_topup_monthly_limit,\n u.auto_topup_limit_notification_sent,\n u.user_type,\n u.verified,\n u.invoicing_enabled,\n u.zero_data_retention,\n u.granted_serving_classes,\n u.default_serving_class,\n u.self_hosted_only,\n u.pinned_tolerations,\n ARRAY_AGG(ur.role) FILTER (WHERE ur.role IS NOT NULL) as \"roles: Vec\"\n FROM users u\n LEFT JOIN user_roles ur ON ur.user_id = u.id\n WHERE u.id = ANY($1) AND u.id != '00000000-0000-0000-0000-000000000000' AND u.is_deleted = false\n GROUP BY u.id, u.username, u.email, u.display_name, u.avatar_url, u.auth_source, u.created_at, u.updated_at, u.last_login, u.is_admin, u.password_hash, u.external_user_id, u.payment_provider_id, u.is_deleted, u.is_internal, u.batch_notifications_enabled, u.first_batch_email_sent, u.low_balance_notification_sent, u.low_balance_threshold, u.auto_topup_amount, u.auto_topup_threshold, u.auto_topup_monthly_limit, u.auto_topup_limit_notification_sent, u.user_type, u.verified, u.invoicing_enabled, u.zero_data_retention, u.granted_serving_classes, u.default_serving_class, u.self_hosted_only, u.pinned_tolerations\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 20, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 27, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 28, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 29, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "pinned_tolerations", - "type_info": "Jsonb" - }, - { - "ordinal": 31, - "name": "roles: Vec", - "type_info": { - "Custom": { - "name": "user_role[]", - "kind": { - "Array": { - "Custom": { - "name": "user_role", - "kind": { - "Enum": [ - "PLATFORMMANAGER", - "REQUESTVIEWER", - "STANDARDUSER", - "BILLINGMANAGER", - "BATCHAPIUSER", - "CONNECTIONSUSER", - "BACKGROUNDINFERENCEUSER" - ] - } - } - } - } - } - } - } - ], - "parameters": { - "Left": [ - "UuidArray" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - false, - true, - false, - true, - null - ] - }, - "hash": "4fe92a5226d820b8301a6acaa6e3659aeb359b1286b810d6845d553fa82954b4" -} diff --git a/.sqlx/query-5124e7a1d40771d8e5ac2091a2c4857371a43a0529bb91f23e06e4d8b7b7cca5.json b/.sqlx/query-5124e7a1d40771d8e5ac2091a2c4857371a43a0529bb91f23e06e4d8b7b7cca5.json deleted file mode 100644 index 4ab9747d9..000000000 --- a/.sqlx/query-5124e7a1d40771d8e5ac2091a2c4857371a43a0529bb91f23e06e4d8b7b7cca5.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n u.id,\n u.username,\n u.email,\n u.display_name,\n u.avatar_url,\n u.auth_source,\n u.created_at,\n u.updated_at,\n u.last_login,\n u.is_admin,\n u.password_hash,\n u.external_user_id,\n u.payment_provider_id,\n u.is_deleted,\n u.is_internal,\n u.batch_notifications_enabled,\n u.first_batch_email_sent,\n u.low_balance_notification_sent,\n u.low_balance_threshold,\n u.auto_topup_amount,\n u.auto_topup_threshold,\n u.auto_topup_monthly_limit,\n u.auto_topup_limit_notification_sent,\n u.user_type,\n u.verified,\n u.invoicing_enabled,\n u.zero_data_retention,\n u.granted_serving_classes,\n u.default_serving_class,\n u.self_hosted_only,\n u.toleration_preset,\n ARRAY_AGG(ur.role) FILTER (WHERE ur.role IS NOT NULL) as \"roles: Vec\"\n FROM users u\n LEFT JOIN user_roles ur ON ur.user_id = u.id\n WHERE u.id = $1 AND u.id != '00000000-0000-0000-0000-000000000000' AND u.is_deleted = false\n GROUP BY u.id, u.username, u.email, u.display_name, u.avatar_url, u.auth_source, u.created_at, u.updated_at, u.last_login, u.is_admin, u.password_hash, u.external_user_id, u.payment_provider_id, u.is_deleted, u.is_internal, u.batch_notifications_enabled, u.first_batch_email_sent, u.low_balance_notification_sent, u.low_balance_threshold, u.auto_topup_amount, u.auto_topup_threshold, u.auto_topup_monthly_limit, u.auto_topup_limit_notification_sent, u.user_type, u.verified, u.invoicing_enabled, u.zero_data_retention, u.granted_serving_classes, u.default_serving_class, u.self_hosted_only, u.toleration_preset\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 20, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 27, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 28, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 29, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "toleration_preset", - "type_info": "Text" - }, - { - "ordinal": 31, - "name": "roles: Vec", - "type_info": { - "Custom": { - "name": "user_role[]", - "kind": { - "Array": { - "Custom": { - "name": "user_role", - "kind": { - "Enum": [ - "PLATFORMMANAGER", - "REQUESTVIEWER", - "STANDARDUSER", - "BILLINGMANAGER", - "BATCHAPIUSER", - "CONNECTIONSUSER", - "BACKGROUNDINFERENCEUSER" - ] - } - } - } - } - } - } - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - false, - true, - false, - true, - null - ] - }, - "hash": "5124e7a1d40771d8e5ac2091a2c4857371a43a0529bb91f23e06e4d8b7b7cca5" -} diff --git a/.sqlx/query-6dc1f2e8e5ee7eb2cd49a3890a46537bf6e0be92906fabe93efa6e59efda8266.json b/.sqlx/query-53031ec6629387a0a7beac8792e10430aa30f3411dfbce9b8238605ad820c115.json similarity index 82% rename from .sqlx/query-6dc1f2e8e5ee7eb2cd49a3890a46537bf6e0be92906fabe93efa6e59efda8266.json rename to .sqlx/query-53031ec6629387a0a7beac8792e10430aa30f3411dfbce9b8238605ad820c115.json index 83bfa0bf0..a5084545c 100644 --- a/.sqlx/query-6dc1f2e8e5ee7eb2cd49a3890a46537bf6e0be92906fabe93efa6e59efda8266.json +++ b/.sqlx/query-53031ec6629387a0a7beac8792e10430aa30f3411dfbce9b8238605ad820c115.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE users SET\n display_name = COALESCE($2, display_name),\n avatar_url = COALESCE($3, avatar_url),\n password_hash = COALESCE($4, password_hash),\n batch_notifications_enabled = COALESCE($5, batch_notifications_enabled),\n low_balance_threshold = CASE\n WHEN $6::boolean THEN $7\n ELSE low_balance_threshold\n END,\n low_balance_notification_sent = CASE\n WHEN $6::boolean THEN false\n ELSE low_balance_notification_sent\n END,\n auto_topup_amount = CASE\n WHEN $8::boolean THEN $9\n ELSE auto_topup_amount\n END,\n auto_topup_threshold = CASE\n WHEN $10::boolean THEN $11\n ELSE auto_topup_threshold\n END,\n auto_topup_monthly_limit = CASE\n WHEN $12::boolean THEN $13\n ELSE auto_topup_monthly_limit\n END,\n auto_topup_limit_notification_sent = CASE\n WHEN $12::boolean THEN false\n ELSE auto_topup_limit_notification_sent\n END,\n auto_topup_soft_failure_count = CASE\n WHEN $8::boolean OR $10::boolean THEN 0\n ELSE auto_topup_soft_failure_count\n END,\n auto_topup_retry_after = CASE\n WHEN $8::boolean OR $10::boolean THEN NULL\n ELSE auto_topup_retry_after\n END,\n zero_data_retention = COALESCE($14, zero_data_retention),\n default_serving_class = CASE\n WHEN $15::boolean THEN $16\n ELSE default_serving_class\n END,\n self_hosted_only = COALESCE($17, self_hosted_only),\n granted_serving_classes = COALESCE($18, granted_serving_classes),\n updated_at = NOW()\n WHERE id = $1\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only\n ", + "query": "\n UPDATE users SET\n display_name = COALESCE($2, display_name),\n avatar_url = COALESCE($3, avatar_url),\n password_hash = COALESCE($4, password_hash),\n batch_notifications_enabled = COALESCE($5, batch_notifications_enabled),\n low_balance_threshold = CASE\n WHEN $6::boolean THEN $7\n ELSE low_balance_threshold\n END,\n low_balance_notification_sent = CASE\n WHEN $6::boolean THEN false\n ELSE low_balance_notification_sent\n END,\n auto_topup_amount = CASE\n WHEN $8::boolean THEN $9\n ELSE auto_topup_amount\n END,\n auto_topup_threshold = CASE\n WHEN $10::boolean THEN $11\n ELSE auto_topup_threshold\n END,\n auto_topup_monthly_limit = CASE\n WHEN $12::boolean THEN $13\n ELSE auto_topup_monthly_limit\n END,\n auto_topup_limit_notification_sent = CASE\n WHEN $12::boolean THEN false\n ELSE auto_topup_limit_notification_sent\n END,\n auto_topup_soft_failure_count = CASE\n WHEN $8::boolean OR $10::boolean THEN 0\n ELSE auto_topup_soft_failure_count\n END,\n auto_topup_retry_after = CASE\n WHEN $8::boolean OR $10::boolean THEN NULL\n ELSE auto_topup_retry_after\n END,\n zero_data_retention = COALESCE($14, zero_data_retention),\n self_hosted_only = COALESCE($15, self_hosted_only),\n toleration_preset = CASE\n WHEN $16::boolean THEN $17\n ELSE toleration_preset\n END,\n updated_at = NOW()\n WHERE id = $1\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, self_hosted_only, toleration_preset\n ", "describe": { "columns": [ { @@ -155,18 +155,13 @@ }, { "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 31, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" } ], "parameters": { @@ -186,9 +181,8 @@ "Float4", "Bool", "Bool", - "Text", "Bool", - "TextArray" + "Text" ] }, "nullable": [ @@ -223,9 +217,8 @@ false, false, false, - true, - false + true ] }, - "hash": "6dc1f2e8e5ee7eb2cd49a3890a46537bf6e0be92906fabe93efa6e59efda8266" + "hash": "53031ec6629387a0a7beac8792e10430aa30f3411dfbce9b8238605ad820c115" } diff --git a/.sqlx/query-616cd17f9ebddac2645b215ae4280cd3fa9d69e2fe205a31ff7bd70cfa71274b.json b/.sqlx/query-616cd17f9ebddac2645b215ae4280cd3fa9d69e2fe205a31ff7bd70cfa71274b.json deleted file mode 100644 index 498873afa..000000000 --- a/.sqlx/query-616cd17f9ebddac2645b215ae4280cd3fa9d69e2fe205a31ff7bd70cfa71274b.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE users SET\n display_name = COALESCE($2, display_name),\n avatar_url = COALESCE($3, avatar_url),\n email = COALESCE($4, email),\n batch_notifications_enabled = COALESCE($5, batch_notifications_enabled),\n low_balance_threshold = CASE\n WHEN $6::boolean THEN $7\n ELSE low_balance_threshold\n END,\n low_balance_notification_sent = CASE\n WHEN $6::boolean THEN false\n ELSE low_balance_notification_sent\n END,\n zero_data_retention = COALESCE($8, zero_data_retention),\n default_serving_class = CASE\n WHEN $9::boolean THEN $10\n ELSE default_serving_class\n END,\n self_hosted_only = COALESCE($11, self_hosted_only),\n granted_serving_classes = COALESCE($12, granted_serving_classes),\n pinned_tolerations = CASE\n WHEN $13::boolean THEN $14\n ELSE pinned_tolerations\n END,\n updated_at = NOW()\n WHERE id = $1 AND user_type = 'organization' AND is_deleted = false\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only, pinned_tolerations\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 9, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 10, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 13, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 16, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 17, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 18, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 21, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 22, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 24, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 25, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "pinned_tolerations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Bool", - "Float4", - "Bool", - "Bool", - "Text", - "Bool", - "TextArray", - "Bool", - "Jsonb" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "616cd17f9ebddac2645b215ae4280cd3fa9d69e2fe205a31ff7bd70cfa71274b" -} diff --git a/.sqlx/query-727298074e8c30b6f5386a05e41e31da7e20b5a09f0e3ffe636402704a1a65e6.json b/.sqlx/query-727298074e8c30b6f5386a05e41e31da7e20b5a09f0e3ffe636402704a1a65e6.json deleted file mode 100644 index c37fb9cf1..000000000 --- a/.sqlx/query-727298074e8c30b6f5386a05e41e31da7e20b5a09f0e3ffe636402704a1a65e6.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n dm.id as deployment_id,\n dm.model_name,\n dm.alias,\n dm.hosted_on,\n dm.sanitize_responses,\n dm.trusted,\n ie.reasoning_translation as endpoint_reasoning_translation,\n dm.reasoning_translation_overrides as model_reasoning_translation_overrides,\n dm.fallback_enabled,\n dm.fallback_on_rate_limit,\n dm.fallback_on_status,\n dm.fallback_realtime_on_status,\n dm.fallback_with_replacement,\n dm.fallback_max_attempts,\n dm.backoff_enabled,\n dm.backoff_initial_ms,\n dm.backoff_max_ms,\n dm.backoff_factor,\n dm.backoff_jitter,\n dm.backoff_max_total_ms,\n dm.first_token_timeout_ms,\n dm.aimd,\n ie.id as endpoint_id,\n ie.url as \"endpoint_url!\",\n ie.api_key as endpoint_api_key,\n ie.auth_header_name,\n ie.auth_header_prefix,\n ie.accepts_scheduling_priority as endpoint_accepts_scheduling_priority,\n ie.kind as endpoint_kind,\n ak.id as \"api_key_id?\",\n ak.secret as \"api_key_secret?\",\n ak.purpose as \"api_key_purpose?\",\n ak.user_zero_data_retention as \"api_key_user_zero_data_retention?\",\n ak.user_id as \"api_key_user_id?\",\n ak.user_username as \"api_key_user_username?\",\n dm.serving_classes\n FROM deployed_models dm\n INNER JOIN inference_endpoints ie ON dm.hosted_on = ie.id\n LEFT JOIN LATERAL (\n SELECT DISTINCT\n ak.id,\n ak.secret,\n ak.purpose,\n ak.user_id,\n u.zero_data_retention as user_zero_data_retention,\n u.username as user_username\n FROM api_keys ak\n JOIN users u ON u.id = ak.user_id\n WHERE (\n -- System user always has access\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n -- OR user is in a group assigned to this model\n OR EXISTS (\n SELECT 1 FROM user_groups ug\n INNER JOIN deployment_groups dg ON ug.group_id = dg.group_id\n WHERE dg.deployment_id = dm.id\n AND ug.user_id = ak.user_id\n )\n -- OR model is in public group\n OR EXISTS (\n SELECT 1 FROM deployment_groups dg\n WHERE dg.deployment_id = dm.id\n AND dg.group_id = '00000000-0000-0000-0000-000000000000'\n )\n -- OR this is a batch API key and model is an escalation target\n OR (\n ak.purpose = 'batch'\n AND dm.alias = ANY($1::text[])\n )\n )\n -- General free-model access is preserved; a zero customer deal does not make a paid model free.\n AND (\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n -- Positive balance read directly from the total\n -- user_balance_checkpoints read model (kept current by the\n -- writers folding synchronously with each charge). The\n -- is_deleted guard mirrors the old balance CTE, which only\n -- contained non-deleted users; key deletion is not implied by\n -- user deletion, so this check is load-bearing.\n -- Keep this lookup inline so PostgreSQL can build a hashed\n -- set of enabled accounts once instead of calling a function\n -- for every model/key pair. The outer guard excludes deleted users.\n OR (u.is_deleted = false AND (EXISTS (\n SELECT 1 FROM user_feature_flags f\n WHERE f.user_id = u.id\n AND f.feature_flag = 'ALLOW_NEGATIVE_BALANCE'\n AND f.enabled\n ) OR EXISTS (\n SELECT 1 FROM user_balance_checkpoints ub\n WHERE ub.user_id = ak.user_id AND ub.balance > 0\n )))\n OR (\n -- Keep the legacy general-tariff rule; only this account's\n -- positive deal can require credit on an otherwise free model.\n NOT EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id IS NULL AND mt.serving_class IS NULL\n AND mt.valid_until IS NULL\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ) AND NOT EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id = ak.user_id\n AND mt.valid_from <= NOW() AND (mt.valid_until IS NULL OR mt.valid_until > NOW())\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n )\n )\n )\n -- Account deletion revokes access independently of key deletion.\n AND (ak.user_id = '00000000-0000-0000-0000-000000000000' OR u.is_deleted = false)\n AND ak.is_deleted = false\n -- Spending-cap gate: exclude every key of a cap scope (the capped\n -- root and its hidden batch child alike) once the scope's\n -- CALENDAR-ALIGNED (UTC, non-rolling) window spend has reached the\n -- root's limit. Guarded so the uncapped majority short-circuits on\n -- the first branch; the subquery is two PK probes. Generally free\n -- models remain usable, but zero customer deals do not bypass caps\n -- on paid models. Un-capping needs no job or traffic: the\n -- window-membership check (shared function, migration 123) turns\n -- false at the calendar boundary and the periodic fallback sync\n -- readmits the keys.\n AND (\n (ak.spend_limit IS NULL AND ak.parent_api_key_id IS NULL)\n OR NOT EXISTS (\n SELECT 1\n FROM api_keys root\n LEFT JOIN api_key_spend_checkpoints ck ON ck.api_key_id = root.id\n WHERE root.id = COALESCE(ak.parent_api_key_id, ak.id)\n AND root.spend_limit IS NOT NULL\n AND api_key_cap_window_current(ck.window_started_at, root.spend_limit_interval)\n AND ck.window_spend >= root.spend_limit\n AND (EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id IS NULL AND mt.serving_class IS NULL\n AND mt.valid_until IS NULL\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ) OR EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id = ak.user_id\n AND mt.valid_from <= NOW() AND (mt.valid_until IS NULL OR mt.valid_until > NOW())\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ))\n )\n )\n -- Inference data plane only: platform (management) keys must never\n -- enter onwards' key set. Mirrors is_inference_purpose in\n -- db::models::api_keys (SQL cannot call it). The system key is\n -- purpose 'platform' (it calls admin endpoints, see migration 071)\n -- but is used internally for onwards inference, so it is exempt.\n AND (\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n OR ak.purpose IN ('realtime', 'batch', 'playground', 'continuation')\n )\n ) ak ON true\n WHERE dm.deleted = FALSE\n AND dm.is_composite = FALSE\n ORDER BY dm.id, ak.id\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "deployment_id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "model_name", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "alias", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "hosted_on", - "type_info": "Uuid" - }, - { - "ordinal": 4, - "name": "sanitize_responses", - "type_info": "Bool" - }, - { - "ordinal": 5, - "name": "trusted", - "type_info": "Bool" - }, - { - "ordinal": 6, - "name": "endpoint_reasoning_translation", - "type_info": "Jsonb" - }, - { - "ordinal": 7, - "name": "model_reasoning_translation_overrides", - "type_info": "Jsonb" - }, - { - "ordinal": 8, - "name": "fallback_enabled", - "type_info": "Bool" - }, - { - "ordinal": 9, - "name": "fallback_on_rate_limit", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "fallback_on_status", - "type_info": "Int4Array" - }, - { - "ordinal": 11, - "name": "fallback_realtime_on_status", - "type_info": "Int4Array" - }, - { - "ordinal": 12, - "name": "fallback_with_replacement", - "type_info": "Bool" - }, - { - "ordinal": 13, - "name": "fallback_max_attempts", - "type_info": "Int4" - }, - { - "ordinal": 14, - "name": "backoff_enabled", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "backoff_initial_ms", - "type_info": "Int4" - }, - { - "ordinal": 16, - "name": "backoff_max_ms", - "type_info": "Int4" - }, - { - "ordinal": 17, - "name": "backoff_factor", - "type_info": "Float8" - }, - { - "ordinal": 18, - "name": "backoff_jitter", - "type_info": "Text" - }, - { - "ordinal": 19, - "name": "backoff_max_total_ms", - "type_info": "Int4" - }, - { - "ordinal": 20, - "name": "first_token_timeout_ms", - "type_info": "Int8" - }, - { - "ordinal": 21, - "name": "aimd", - "type_info": "Jsonb" - }, - { - "ordinal": 22, - "name": "endpoint_id", - "type_info": "Uuid" - }, - { - "ordinal": 23, - "name": "endpoint_url!", - "type_info": "Varchar" - }, - { - "ordinal": 24, - "name": "endpoint_api_key", - "type_info": "Text" - }, - { - "ordinal": 25, - "name": "auth_header_name", - "type_info": "Varchar" - }, - { - "ordinal": 26, - "name": "auth_header_prefix", - "type_info": "Varchar" - }, - { - "ordinal": 27, - "name": "endpoint_accepts_scheduling_priority", - "type_info": "Bool" - }, - { - "ordinal": 28, - "name": "endpoint_kind", - "type_info": "Text" - }, - { - "ordinal": 29, - "name": "api_key_id?", - "type_info": "Uuid" - }, - { - "ordinal": 30, - "name": "api_key_secret?", - "type_info": "Varchar" - }, - { - "ordinal": 31, - "name": "api_key_purpose?", - "type_info": "Varchar" - }, - { - "ordinal": 32, - "name": "api_key_user_zero_data_retention?", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "api_key_user_id?", - "type_info": "Uuid" - }, - { - "ordinal": 34, - "name": "api_key_user_username?", - "type_info": "Varchar" - }, - { - "ordinal": 35, - "name": "serving_classes", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "TextArray" - ] - }, - "nullable": [ - false, - false, - false, - true, - false, - false, - true, - true, - true, - true, - true, - false, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ] - }, - "hash": "727298074e8c30b6f5386a05e41e31da7e20b5a09f0e3ffe636402704a1a65e6" -} diff --git a/.sqlx/query-7906763e9250d0f7a30e0937fedcb87fa34dc8b216aabf606fc38dc4135ffdf6.json b/.sqlx/query-7906763e9250d0f7a30e0937fedcb87fa34dc8b216aabf606fc38dc4135ffdf6.json deleted file mode 100644 index c1d8219e6..000000000 --- a/.sqlx/query-7906763e9250d0f7a30e0937fedcb87fa34dc8b216aabf606fc38dc4135ffdf6.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO users (id, username, email, display_name, avatar_url, auth_source, user_type, is_admin)\n VALUES ($1, $2, $3, $4, $5, 'organization', 'organization', false)\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only, pinned_tolerations\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 9, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 10, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 13, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 18, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 20, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 22, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 26, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 28, - "name": "pinned_tolerations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Varchar", - "Varchar" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "7906763e9250d0f7a30e0937fedcb87fa34dc8b216aabf606fc38dc4135ffdf6" -} diff --git a/.sqlx/query-1e58059d2038426045c82e58c7eb452fae8f00be38bd884b57ceeef70dbcc8cf.json b/.sqlx/query-7be7944400646dcf299040f1f884afef924435367d98d56b4df9d6836f5011bf.json similarity index 92% rename from .sqlx/query-1e58059d2038426045c82e58c7eb452fae8f00be38bd884b57ceeef70dbcc8cf.json rename to .sqlx/query-7be7944400646dcf299040f1f884afef924435367d98d56b4df9d6836f5011bf.json index 89e29d6af..bede07da2 100644 --- a/.sqlx/query-1e58059d2038426045c82e58c7eb452fae8f00be38bd884b57ceeef70dbcc8cf.json +++ b/.sqlx/query-7be7944400646dcf299040f1f884afef924435367d98d56b4df9d6836f5011bf.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO users (id, username, email, display_name, avatar_url, auth_source, is_admin, password_hash, external_user_id)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only\n ", + "query": "\n INSERT INTO users (id, username, email, display_name, avatar_url, auth_source, is_admin, password_hash, external_user_id)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, self_hosted_only, toleration_preset\n ", "describe": { "columns": [ { @@ -155,18 +155,13 @@ }, { "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 31, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" } ], "parameters": { @@ -214,9 +209,8 @@ false, false, false, - true, - false + true ] }, - "hash": "1e58059d2038426045c82e58c7eb452fae8f00be38bd884b57ceeef70dbcc8cf" + "hash": "7be7944400646dcf299040f1f884afef924435367d98d56b4df9d6836f5011bf" } diff --git a/.sqlx/query-9fbf45082890e8ce04783e093ed014d5e4df6a2b52278a807fd90419e941fb64.json b/.sqlx/query-7c97dce6f302fdaf8950f299ee879fb7aa6a5ee46496a86fe1b74c21e7e09072.json similarity index 74% rename from .sqlx/query-9fbf45082890e8ce04783e093ed014d5e4df6a2b52278a807fd90419e941fb64.json rename to .sqlx/query-7c97dce6f302fdaf8950f299ee879fb7aa6a5ee46496a86fe1b74c21e7e09072.json index 2cce7a0cb..4630a601f 100644 --- a/.sqlx/query-9fbf45082890e8ce04783e093ed014d5e4df6a2b52278a807fd90419e941fb64.json +++ b/.sqlx/query-7c97dce6f302fdaf8950f299ee879fb7aa6a5ee46496a86fe1b74c21e7e09072.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE users SET\n display_name = COALESCE($2, display_name),\n avatar_url = COALESCE($3, avatar_url),\n email = COALESCE($4, email),\n batch_notifications_enabled = COALESCE($5, batch_notifications_enabled),\n low_balance_threshold = CASE\n WHEN $6::boolean THEN $7\n ELSE low_balance_threshold\n END,\n low_balance_notification_sent = CASE\n WHEN $6::boolean THEN false\n ELSE low_balance_notification_sent\n END,\n zero_data_retention = COALESCE($8, zero_data_retention),\n default_serving_class = CASE\n WHEN $9::boolean THEN $10\n ELSE default_serving_class\n END,\n self_hosted_only = COALESCE($11, self_hosted_only),\n granted_serving_classes = COALESCE($12, granted_serving_classes),\n updated_at = NOW()\n WHERE id = $1 AND user_type = 'organization' AND is_deleted = false\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only\n ", + "query": "\n UPDATE users SET\n display_name = COALESCE($2, display_name),\n avatar_url = COALESCE($3, avatar_url),\n email = COALESCE($4, email),\n batch_notifications_enabled = COALESCE($5, batch_notifications_enabled),\n low_balance_threshold = CASE\n WHEN $6::boolean THEN $7\n ELSE low_balance_threshold\n END,\n low_balance_notification_sent = CASE\n WHEN $6::boolean THEN false\n ELSE low_balance_notification_sent\n END,\n zero_data_retention = COALESCE($8, zero_data_retention),\n self_hosted_only = COALESCE($9, self_hosted_only),\n toleration_preset = CASE\n WHEN $10::boolean THEN $11\n ELSE toleration_preset\n END,\n updated_at = NOW()\n WHERE id = $1 AND user_type = 'organization' AND is_deleted = false\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n self_hosted_only, toleration_preset\n ", "describe": { "columns": [ { @@ -120,18 +120,13 @@ }, { "ordinal": 23, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 24, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" - }, - { - "ordinal": 25, - "name": "self_hosted_only", - "type_info": "Bool" } ], "parameters": { @@ -145,9 +140,8 @@ "Float4", "Bool", "Bool", - "Text", "Bool", - "TextArray" + "Text" ] }, "nullable": [ @@ -175,9 +169,8 @@ false, false, false, - true, - false + true ] }, - "hash": "9fbf45082890e8ce04783e093ed014d5e4df6a2b52278a807fd90419e941fb64" + "hash": "7c97dce6f302fdaf8950f299ee879fb7aa6a5ee46496a86fe1b74c21e7e09072" } diff --git a/.sqlx/query-85d8e79af893d8cd3f5d5ff078e7ec0b1d39c90ea88c9a258328134c7510c91c.json b/.sqlx/query-85d8e79af893d8cd3f5d5ff078e7ec0b1d39c90ea88c9a258328134c7510c91c.json new file mode 100644 index 000000000..e8f880835 --- /dev/null +++ b/.sqlx/query-85d8e79af893d8cd3f5d5ff078e7ec0b1d39c90ea88c9a258328134c7510c91c.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT auto_topup_retry_after FROM users WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "auto_topup_retry_after", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + true + ] + }, + "hash": "85d8e79af893d8cd3f5d5ff078e7ec0b1d39c90ea88c9a258328134c7510c91c" +} diff --git a/.sqlx/query-8b3461c74bef7e971ea3f822c426cd1b7afc13cf40f5e0deb61a378f7dbc50f3.json b/.sqlx/query-8b3461c74bef7e971ea3f822c426cd1b7afc13cf40f5e0deb61a378f7dbc50f3.json deleted file mode 100644 index 16b4a369b..000000000 --- a/.sqlx/query-8b3461c74bef7e971ea3f822c426cd1b7afc13cf40f5e0deb61a378f7dbc50f3.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only, pinned_tolerations FROM users WHERE external_user_id = $1 AND id != '00000000-0000-0000-0000-000000000000' AND is_deleted = false", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 23, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "auto_topup_soft_failure_count", - "type_info": "Int4" - }, - { - "ordinal": 27, - "name": "auto_topup_retry_after", - "type_info": "Timestamptz" - }, - { - "ordinal": 28, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 29, - "name": "auto_join_enabled", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 31, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "pinned_tolerations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "8b3461c74bef7e971ea3f822c426cd1b7afc13cf40f5e0deb61a378f7dbc50f3" -} diff --git a/.sqlx/query-97ed98d95b232b32298169ba2ce03b6155ff37920e710a4684695906baecdaf8.json b/.sqlx/query-97ed98d95b232b32298169ba2ce03b6155ff37920e710a4684695906baecdaf8.json new file mode 100644 index 000000000..ffd33feea --- /dev/null +++ b/.sqlx/query-97ed98d95b232b32298169ba2ce03b6155ff37920e710a4684695906baecdaf8.json @@ -0,0 +1,12 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE users SET self_hosted_only = true WHERE id = '00000000-0000-0000-0000-0000000000a1'", + "describe": { + "columns": [], + "parameters": { + "Left": [] + }, + "nullable": [] + }, + "hash": "97ed98d95b232b32298169ba2ce03b6155ff37920e710a4684695906baecdaf8" +} diff --git a/.sqlx/query-b26b5029fd3185c8a6c88768a22094fc819b814eb0adc6e8184efd31dcfce1a3.json b/.sqlx/query-9c7c89bf8db504e0a82390db6f812dbe4111e69606e91d5bf15e683eef6b882f.json similarity index 90% rename from .sqlx/query-b26b5029fd3185c8a6c88768a22094fc819b814eb0adc6e8184efd31dcfce1a3.json rename to .sqlx/query-9c7c89bf8db504e0a82390db6f812dbe4111e69606e91d5bf15e683eef6b882f.json index 871fa809a..00f3342fd 100644 --- a/.sqlx/query-b26b5029fd3185c8a6c88768a22094fc819b814eb0adc6e8184efd31dcfce1a3.json +++ b/.sqlx/query-9c7c89bf8db504e0a82390db6f812dbe4111e69606e91d5bf15e683eef6b882f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n id as composite_model_id,\n alias,\n realtime_inflight_limit,\n batch_capacity,\n lb_strategy,\n fallback_enabled,\n fallback_on_rate_limit,\n fallback_on_status,\n fallback_realtime_on_status,\n fallback_with_replacement,\n fallback_max_attempts,\n backoff_enabled,\n backoff_initial_ms,\n backoff_max_ms,\n backoff_factor,\n backoff_jitter,\n backoff_max_total_ms,\n first_token_timeout_ms,\n aimd,\n affinity,\n sanitize_responses,\n trusted,\n serving_classes\n FROM deployed_models\n WHERE is_composite = TRUE\n AND deleted = FALSE\n ", + "query": "\n SELECT\n id as composite_model_id,\n alias,\n realtime_inflight_limit,\n batch_capacity,\n lb_strategy,\n fallback_enabled,\n fallback_on_rate_limit,\n fallback_on_status,\n fallback_realtime_on_status,\n fallback_with_replacement,\n fallback_max_attempts,\n backoff_enabled,\n backoff_initial_ms,\n backoff_max_ms,\n backoff_factor,\n backoff_jitter,\n backoff_max_total_ms,\n first_token_timeout_ms,\n aimd,\n affinity,\n sanitize_responses,\n trusted\n FROM deployed_models\n WHERE is_composite = TRUE\n AND deleted = FALSE\n ", "describe": { "columns": [ { @@ -112,11 +112,6 @@ "ordinal": 21, "name": "trusted", "type_info": "Bool" - }, - { - "ordinal": 22, - "name": "serving_classes", - "type_info": "Jsonb" } ], "parameters": { @@ -144,9 +139,8 @@ true, true, false, - false, false ] }, - "hash": "b26b5029fd3185c8a6c88768a22094fc819b814eb0adc6e8184efd31dcfce1a3" + "hash": "9c7c89bf8db504e0a82390db6f812dbe4111e69606e91d5bf15e683eef6b882f" } diff --git a/.sqlx/query-a056ee03ddac4796bfa0113104fed7d1298b10b35013cc41ce79803401b538ea.json b/.sqlx/query-a056ee03ddac4796bfa0113104fed7d1298b10b35013cc41ce79803401b538ea.json deleted file mode 100644 index d5230ba84..000000000 --- a/.sqlx/query-a056ee03ddac4796bfa0113104fed7d1298b10b35013cc41ce79803401b538ea.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only, toleration_preset\n FROM users\n WHERE (username = $1 OR username LIKE $1 || '~%')\n AND user_type = 'organization'\n -- A soft-deleted workspace must never receive join requests:\n -- nobody is left to approve them, so the requester would sit on a\n -- queue no one can see.\n AND is_deleted = false\n -- Same reasoning one level down: a workspace whose owners and\n -- admins have all been deleted is still `is_deleted = false`, but\n -- there is equally nobody home to approve anything.\n --\n -- `Users::delete` no longer creates these - it hands a workspace\n -- to a successor or closes it - but it used to walk away from the\n -- departing user's `user_organizations` rows, which stranded any\n -- workspace whose only owner was deleted: still claiming the\n -- domain, still offered to every colleague who signed up,\n -- unadministrable. This covers those legacy rows, and anything\n -- else that reaches the same state by a route we have not thought\n -- of. `users` inside the subquery is the outer row - the inner one\n -- is aliased.\n AND EXISTS (\n SELECT 1\n FROM user_organizations uo\n JOIN users admin ON admin.id = uo.user_id\n WHERE uo.organization_id = users.id\n AND uo.role IN ('owner', 'admin')\n AND uo.status = 'active'\n AND admin.is_deleted = false\n )\n ORDER BY created_at ASC\n LIMIT 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 9, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 10, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 13, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 18, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 20, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 22, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 26, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 28, - "name": "toleration_preset", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "a056ee03ddac4796bfa0113104fed7d1298b10b35013cc41ce79803401b538ea" -} diff --git a/.sqlx/query-a8267e1c6bf5ae1e38c2ddb155ba103831eb7aaa02edbdbe1bdd805600ee31c3.json b/.sqlx/query-a8267e1c6bf5ae1e38c2ddb155ba103831eb7aaa02edbdbe1bdd805600ee31c3.json deleted file mode 100644 index 784736db5..000000000 --- a/.sqlx/query-a8267e1c6bf5ae1e38c2ddb155ba103831eb7aaa02edbdbe1bdd805600ee31c3.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT id, granted_serving_classes, default_serving_class, self_hosted_only\n FROM users\n WHERE is_deleted = FALSE\n AND (granted_serving_classes <> '{}' OR default_serving_class IS NOT NULL OR self_hosted_only)\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 2, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 3, - "name": "self_hosted_only", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - true, - false - ] - }, - "hash": "a8267e1c6bf5ae1e38c2ddb155ba103831eb7aaa02edbdbe1bdd805600ee31c3" -} diff --git a/.sqlx/query-a862c5bf7fb4418be2f16ccb233f61dc26f270bfb490be03ccf21a1620efcd0c.json b/.sqlx/query-a862c5bf7fb4418be2f16ccb233f61dc26f270bfb490be03ccf21a1620efcd0c.json deleted file mode 100644 index fb2949f3d..000000000 --- a/.sqlx/query-a862c5bf7fb4418be2f16ccb233f61dc26f270bfb490be03ccf21a1620efcd0c.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n dm.id as deployment_id,\n dm.model_name,\n dm.alias,\n dm.hosted_on,\n dm.sanitize_responses,\n dm.trusted,\n ie.reasoning_translation as endpoint_reasoning_translation,\n dm.reasoning_translation_overrides as model_reasoning_translation_overrides,\n dm.fallback_enabled,\n dm.fallback_on_rate_limit,\n dm.fallback_on_status,\n dm.fallback_realtime_on_status,\n dm.fallback_with_replacement,\n dm.fallback_max_attempts,\n dm.backoff_enabled,\n dm.backoff_initial_ms,\n dm.backoff_max_ms,\n dm.backoff_factor,\n dm.backoff_jitter,\n dm.backoff_max_total_ms,\n dm.first_token_timeout_ms,\n dm.aimd,\n ie.id as endpoint_id,\n ie.url as \"endpoint_url!\",\n ie.api_key as endpoint_api_key,\n ie.auth_header_name,\n ie.auth_header_prefix,\n ie.accepts_scheduling_priority as endpoint_accepts_scheduling_priority,\n ie.kind as endpoint_kind,\n ak.id as \"api_key_id?\",\n ak.secret as \"api_key_secret?\",\n ak.purpose as \"api_key_purpose?\",\n ak.user_zero_data_retention as \"api_key_user_zero_data_retention?\",\n ak.user_id as \"api_key_user_id?\",\n ak.user_username as \"api_key_user_username?\",\n ak.user_display_name as \"api_key_user_display_name?\",\n dm.serving_classes\n FROM deployed_models dm\n INNER JOIN inference_endpoints ie ON dm.hosted_on = ie.id\n LEFT JOIN LATERAL (\n SELECT DISTINCT\n ak.id,\n ak.secret,\n ak.purpose,\n ak.user_id,\n u.zero_data_retention as user_zero_data_retention,\n u.username as user_username,\n u.display_name as user_display_name\n FROM api_keys ak\n JOIN users u ON u.id = ak.user_id\n WHERE (\n -- System user always has access\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n -- OR user is in a group assigned to this model\n OR EXISTS (\n SELECT 1 FROM user_groups ug\n INNER JOIN deployment_groups dg ON ug.group_id = dg.group_id\n WHERE dg.deployment_id = dm.id\n AND ug.user_id = ak.user_id\n )\n -- OR model is in public group\n OR EXISTS (\n SELECT 1 FROM deployment_groups dg\n WHERE dg.deployment_id = dm.id\n AND dg.group_id = '00000000-0000-0000-0000-000000000000'\n )\n -- OR this is a batch API key and model is an escalation target\n OR (\n ak.purpose = 'batch'\n AND dm.alias = ANY($1::text[])\n )\n )\n -- General free-model access is preserved; a zero customer deal does not make a paid model free.\n AND (\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n -- Positive balance read directly from the total\n -- user_balance_checkpoints read model (kept current by the\n -- writers folding synchronously with each charge). The\n -- is_deleted guard mirrors the old balance CTE, which only\n -- contained non-deleted users; key deletion is not implied by\n -- user deletion, so this check is load-bearing.\n -- Keep this lookup inline so PostgreSQL can build a hashed\n -- set of enabled accounts once instead of calling a function\n -- for every model/key pair. The outer guard excludes deleted users.\n OR (u.is_deleted = false AND (EXISTS (\n SELECT 1 FROM user_feature_flags f\n WHERE f.user_id = u.id\n AND f.feature_flag = 'ALLOW_NEGATIVE_BALANCE'\n AND f.enabled\n ) OR EXISTS (\n SELECT 1 FROM user_balance_checkpoints ub\n WHERE ub.user_id = ak.user_id AND ub.balance > 0\n )))\n OR (\n -- Keep the legacy general-tariff rule; only this account's\n -- positive deal can require credit on an otherwise free model.\n NOT EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id IS NULL AND mt.serving_class IS NULL\n AND mt.valid_until IS NULL\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ) AND NOT EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id = ak.user_id\n AND mt.valid_from <= NOW() AND (mt.valid_until IS NULL OR mt.valid_until > NOW())\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n )\n )\n )\n -- Account deletion revokes access independently of key deletion.\n AND (ak.user_id = '00000000-0000-0000-0000-000000000000' OR u.is_deleted = false)\n AND ak.is_deleted = false\n -- Spending-cap gate: exclude every key of a cap scope (the capped\n -- root and its hidden batch child alike) once the scope's\n -- CALENDAR-ALIGNED (UTC, non-rolling) window spend has reached the\n -- root's limit. Guarded so the uncapped majority short-circuits on\n -- the first branch; the subquery is two PK probes. Generally free\n -- models remain usable, but zero customer deals do not bypass caps\n -- on paid models. Un-capping needs no job or traffic: the\n -- window-membership check (shared function, migration 123) turns\n -- false at the calendar boundary and the periodic fallback sync\n -- readmits the keys.\n AND (\n (ak.spend_limit IS NULL AND ak.parent_api_key_id IS NULL)\n OR NOT EXISTS (\n SELECT 1\n FROM api_keys root\n LEFT JOIN api_key_spend_checkpoints ck ON ck.api_key_id = root.id\n WHERE root.id = COALESCE(ak.parent_api_key_id, ak.id)\n AND root.spend_limit IS NOT NULL\n AND api_key_cap_window_current(ck.window_started_at, root.spend_limit_interval)\n AND ck.window_spend >= root.spend_limit\n AND (EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id IS NULL AND mt.serving_class IS NULL\n AND mt.valid_until IS NULL\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ) OR EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id = ak.user_id\n AND mt.valid_from <= NOW() AND (mt.valid_until IS NULL OR mt.valid_until > NOW())\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ))\n )\n )\n -- Inference data plane only: platform (management) keys must never\n -- enter onwards' key set. Mirrors is_inference_purpose in\n -- db::models::api_keys (SQL cannot call it). The system key is\n -- purpose 'platform' (it calls admin endpoints, see migration 071)\n -- but is used internally for onwards inference, so it is exempt.\n AND (\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n OR ak.purpose IN ('realtime', 'batch', 'playground', 'continuation')\n )\n ) ak ON true\n WHERE dm.deleted = FALSE\n AND dm.is_composite = FALSE\n ORDER BY dm.id, ak.id\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "deployment_id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "model_name", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "alias", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "hosted_on", - "type_info": "Uuid" - }, - { - "ordinal": 4, - "name": "sanitize_responses", - "type_info": "Bool" - }, - { - "ordinal": 5, - "name": "trusted", - "type_info": "Bool" - }, - { - "ordinal": 6, - "name": "endpoint_reasoning_translation", - "type_info": "Jsonb" - }, - { - "ordinal": 7, - "name": "model_reasoning_translation_overrides", - "type_info": "Jsonb" - }, - { - "ordinal": 8, - "name": "fallback_enabled", - "type_info": "Bool" - }, - { - "ordinal": 9, - "name": "fallback_on_rate_limit", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "fallback_on_status", - "type_info": "Int4Array" - }, - { - "ordinal": 11, - "name": "fallback_realtime_on_status", - "type_info": "Int4Array" - }, - { - "ordinal": 12, - "name": "fallback_with_replacement", - "type_info": "Bool" - }, - { - "ordinal": 13, - "name": "fallback_max_attempts", - "type_info": "Int4" - }, - { - "ordinal": 14, - "name": "backoff_enabled", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "backoff_initial_ms", - "type_info": "Int4" - }, - { - "ordinal": 16, - "name": "backoff_max_ms", - "type_info": "Int4" - }, - { - "ordinal": 17, - "name": "backoff_factor", - "type_info": "Float8" - }, - { - "ordinal": 18, - "name": "backoff_jitter", - "type_info": "Text" - }, - { - "ordinal": 19, - "name": "backoff_max_total_ms", - "type_info": "Int4" - }, - { - "ordinal": 20, - "name": "first_token_timeout_ms", - "type_info": "Int8" - }, - { - "ordinal": 21, - "name": "aimd", - "type_info": "Jsonb" - }, - { - "ordinal": 22, - "name": "endpoint_id", - "type_info": "Uuid" - }, - { - "ordinal": 23, - "name": "endpoint_url!", - "type_info": "Varchar" - }, - { - "ordinal": 24, - "name": "endpoint_api_key", - "type_info": "Text" - }, - { - "ordinal": 25, - "name": "auth_header_name", - "type_info": "Varchar" - }, - { - "ordinal": 26, - "name": "auth_header_prefix", - "type_info": "Varchar" - }, - { - "ordinal": 27, - "name": "endpoint_accepts_scheduling_priority", - "type_info": "Bool" - }, - { - "ordinal": 28, - "name": "endpoint_kind", - "type_info": "Text" - }, - { - "ordinal": 29, - "name": "api_key_id?", - "type_info": "Uuid" - }, - { - "ordinal": 30, - "name": "api_key_secret?", - "type_info": "Varchar" - }, - { - "ordinal": 31, - "name": "api_key_purpose?", - "type_info": "Varchar" - }, - { - "ordinal": 32, - "name": "api_key_user_zero_data_retention?", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "api_key_user_id?", - "type_info": "Uuid" - }, - { - "ordinal": 34, - "name": "api_key_user_username?", - "type_info": "Varchar" - }, - { - "ordinal": 35, - "name": "api_key_user_display_name?", - "type_info": "Varchar" - }, - { - "ordinal": 36, - "name": "serving_classes", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "TextArray" - ] - }, - "nullable": [ - false, - false, - false, - true, - false, - false, - true, - true, - true, - true, - true, - false, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - true, - false - ] - }, - "hash": "a862c5bf7fb4418be2f16ccb233f61dc26f270bfb490be03ccf21a1620efcd0c" -} diff --git a/.sqlx/query-ab1df7bfdc8d8036f568a19a39c3f100aceca853bb764fc92dc7cae23db2c014.json b/.sqlx/query-ab1df7bfdc8d8036f568a19a39c3f100aceca853bb764fc92dc7cae23db2c014.json deleted file mode 100644 index 6e45c79ed..000000000 --- a/.sqlx/query-ab1df7bfdc8d8036f568a19a39c3f100aceca853bb764fc92dc7cae23db2c014.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO users (id, username, email, display_name, avatar_url, auth_source, user_type, is_admin)\n VALUES ($1, $2, $3, $4, $5, 'organization', 'organization', false)\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only, toleration_preset\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 9, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 10, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 13, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 18, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 20, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 22, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 26, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 28, - "name": "toleration_preset", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Varchar", - "Varchar" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "ab1df7bfdc8d8036f568a19a39c3f100aceca853bb764fc92dc7cae23db2c014" -} diff --git a/.sqlx/query-ba34540c4fd715b7f949617bdda7d8fe20a3194a39ad1665aa7582d6b7f9a9eb.json b/.sqlx/query-ba34540c4fd715b7f949617bdda7d8fe20a3194a39ad1665aa7582d6b7f9a9eb.json new file mode 100644 index 000000000..9501782af --- /dev/null +++ b/.sqlx/query-ba34540c4fd715b7f949617bdda7d8fe20a3194a39ad1665aa7582d6b7f9a9eb.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT id, self_hosted_only\n FROM users\n WHERE is_deleted = FALSE\n AND self_hosted_only\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "self_hosted_only", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false + ] + }, + "hash": "ba34540c4fd715b7f949617bdda7d8fe20a3194a39ad1665aa7582d6b7f9a9eb" +} diff --git a/.sqlx/query-beca7427dfd22f328c1e31fff391acdcd34a30eda74fe691c8bb48b4cd62afe6.json b/.sqlx/query-beca7427dfd22f328c1e31fff391acdcd34a30eda74fe691c8bb48b4cd62afe6.json new file mode 100644 index 000000000..33c7337c4 --- /dev/null +++ b/.sqlx/query-beca7427dfd22f328c1e31fff391acdcd34a30eda74fe691c8bb48b4cd62afe6.json @@ -0,0 +1,232 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n dm.id as deployment_id,\n dm.model_name,\n dm.alias,\n dm.hosted_on,\n dm.sanitize_responses,\n dm.trusted,\n ie.reasoning_translation as endpoint_reasoning_translation,\n dm.reasoning_translation_overrides as model_reasoning_translation_overrides,\n dm.fallback_enabled,\n dm.fallback_on_rate_limit,\n dm.fallback_on_status,\n dm.fallback_realtime_on_status,\n dm.fallback_with_replacement,\n dm.fallback_max_attempts,\n dm.backoff_enabled,\n dm.backoff_initial_ms,\n dm.backoff_max_ms,\n dm.backoff_factor,\n dm.backoff_jitter,\n dm.backoff_max_total_ms,\n dm.first_token_timeout_ms,\n dm.aimd,\n ie.id as endpoint_id,\n ie.url as \"endpoint_url!\",\n ie.api_key as endpoint_api_key,\n ie.auth_header_name,\n ie.auth_header_prefix,\n ie.accepts_scheduling_priority as endpoint_accepts_scheduling_priority,\n ie.kind as endpoint_kind,\n ak.id as \"api_key_id?\",\n ak.secret as \"api_key_secret?\",\n ak.purpose as \"api_key_purpose?\",\n ak.user_zero_data_retention as \"api_key_user_zero_data_retention?\",\n ak.user_id as \"api_key_user_id?\",\n ak.user_username as \"api_key_user_username?\",\n ak.user_display_name as \"api_key_user_display_name?\"\n FROM deployed_models dm\n INNER JOIN inference_endpoints ie ON dm.hosted_on = ie.id\n LEFT JOIN LATERAL (\n SELECT DISTINCT\n ak.id,\n ak.secret,\n ak.purpose,\n ak.user_id,\n u.zero_data_retention as user_zero_data_retention,\n u.username as user_username,\n u.display_name as user_display_name\n FROM api_keys ak\n JOIN users u ON u.id = ak.user_id\n WHERE (\n -- System user always has access\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n -- OR user is in a group assigned to this model\n OR EXISTS (\n SELECT 1 FROM user_groups ug\n INNER JOIN deployment_groups dg ON ug.group_id = dg.group_id\n WHERE dg.deployment_id = dm.id\n AND ug.user_id = ak.user_id\n )\n -- OR model is in public group\n OR EXISTS (\n SELECT 1 FROM deployment_groups dg\n WHERE dg.deployment_id = dm.id\n AND dg.group_id = '00000000-0000-0000-0000-000000000000'\n )\n -- OR this is a batch API key and model is an escalation target\n OR (\n ak.purpose = 'batch'\n AND dm.alias = ANY($1::text[])\n )\n )\n -- General free-model access is preserved; a zero customer deal does not make a paid model free.\n AND (\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n -- Positive balance read directly from the total\n -- user_balance_checkpoints read model (kept current by the\n -- writers folding synchronously with each charge). The\n -- is_deleted guard mirrors the old balance CTE, which only\n -- contained non-deleted users; key deletion is not implied by\n -- user deletion, so this check is load-bearing.\n -- Keep this lookup inline so PostgreSQL can build a hashed\n -- set of enabled accounts once instead of calling a function\n -- for every model/key pair. The outer guard excludes deleted users.\n OR (u.is_deleted = false AND (EXISTS (\n SELECT 1 FROM user_feature_flags f\n WHERE f.user_id = u.id\n AND f.feature_flag = 'ALLOW_NEGATIVE_BALANCE'\n AND f.enabled\n ) OR EXISTS (\n SELECT 1 FROM user_balance_checkpoints ub\n WHERE ub.user_id = ak.user_id AND ub.balance > 0\n )))\n OR (\n -- Keep the legacy general-tariff rule; only this account's\n -- positive deal can require credit on an otherwise free model.\n NOT EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id IS NULL AND mt.serving_class IS NULL\n AND mt.valid_until IS NULL\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ) AND NOT EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id = ak.user_id\n AND mt.valid_from <= NOW() AND (mt.valid_until IS NULL OR mt.valid_until > NOW())\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n )\n )\n )\n -- Account deletion revokes access independently of key deletion.\n AND (ak.user_id = '00000000-0000-0000-0000-000000000000' OR u.is_deleted = false)\n AND ak.is_deleted = false\n -- Spending-cap gate: exclude every key of a cap scope (the capped\n -- root and its hidden batch child alike) once the scope's\n -- CALENDAR-ALIGNED (UTC, non-rolling) window spend has reached the\n -- root's limit. Guarded so the uncapped majority short-circuits on\n -- the first branch; the subquery is two PK probes. Generally free\n -- models remain usable, but zero customer deals do not bypass caps\n -- on paid models. Un-capping needs no job or traffic: the\n -- window-membership check (shared function, migration 123) turns\n -- false at the calendar boundary and the periodic fallback sync\n -- readmits the keys.\n AND (\n (ak.spend_limit IS NULL AND ak.parent_api_key_id IS NULL)\n OR NOT EXISTS (\n SELECT 1\n FROM api_keys root\n LEFT JOIN api_key_spend_checkpoints ck ON ck.api_key_id = root.id\n WHERE root.id = COALESCE(ak.parent_api_key_id, ak.id)\n AND root.spend_limit IS NOT NULL\n AND api_key_cap_window_current(ck.window_started_at, root.spend_limit_interval)\n AND ck.window_spend >= root.spend_limit\n AND (EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id IS NULL AND mt.serving_class IS NULL\n AND mt.valid_until IS NULL\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ) OR EXISTS (\n SELECT 1 FROM model_tariffs mt\n WHERE mt.deployed_model_id = dm.id AND mt.user_id = ak.user_id\n AND mt.valid_from <= NOW() AND (mt.valid_until IS NULL OR mt.valid_until > NOW())\n AND (mt.input_price_per_token > 0 OR mt.output_price_per_token > 0)\n ))\n )\n )\n -- Inference data plane only: platform (management) keys must never\n -- enter onwards' key set. Mirrors is_inference_purpose in\n -- db::models::api_keys (SQL cannot call it). The system key is\n -- purpose 'platform' (it calls admin endpoints, see migration 071)\n -- but is used internally for onwards inference, so it is exempt.\n AND (\n ak.user_id = '00000000-0000-0000-0000-000000000000'\n OR ak.purpose IN ('realtime', 'batch', 'playground', 'continuation')\n )\n ) ak ON true\n WHERE dm.deleted = FALSE\n AND dm.is_composite = FALSE\n ORDER BY dm.id, ak.id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "deployment_id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "model_name", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "alias", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "hosted_on", + "type_info": "Uuid" + }, + { + "ordinal": 4, + "name": "sanitize_responses", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "trusted", + "type_info": "Bool" + }, + { + "ordinal": 6, + "name": "endpoint_reasoning_translation", + "type_info": "Jsonb" + }, + { + "ordinal": 7, + "name": "model_reasoning_translation_overrides", + "type_info": "Jsonb" + }, + { + "ordinal": 8, + "name": "fallback_enabled", + "type_info": "Bool" + }, + { + "ordinal": 9, + "name": "fallback_on_rate_limit", + "type_info": "Bool" + }, + { + "ordinal": 10, + "name": "fallback_on_status", + "type_info": "Int4Array" + }, + { + "ordinal": 11, + "name": "fallback_realtime_on_status", + "type_info": "Int4Array" + }, + { + "ordinal": 12, + "name": "fallback_with_replacement", + "type_info": "Bool" + }, + { + "ordinal": 13, + "name": "fallback_max_attempts", + "type_info": "Int4" + }, + { + "ordinal": 14, + "name": "backoff_enabled", + "type_info": "Bool" + }, + { + "ordinal": 15, + "name": "backoff_initial_ms", + "type_info": "Int4" + }, + { + "ordinal": 16, + "name": "backoff_max_ms", + "type_info": "Int4" + }, + { + "ordinal": 17, + "name": "backoff_factor", + "type_info": "Float8" + }, + { + "ordinal": 18, + "name": "backoff_jitter", + "type_info": "Text" + }, + { + "ordinal": 19, + "name": "backoff_max_total_ms", + "type_info": "Int4" + }, + { + "ordinal": 20, + "name": "first_token_timeout_ms", + "type_info": "Int8" + }, + { + "ordinal": 21, + "name": "aimd", + "type_info": "Jsonb" + }, + { + "ordinal": 22, + "name": "endpoint_id", + "type_info": "Uuid" + }, + { + "ordinal": 23, + "name": "endpoint_url!", + "type_info": "Varchar" + }, + { + "ordinal": 24, + "name": "endpoint_api_key", + "type_info": "Text" + }, + { + "ordinal": 25, + "name": "auth_header_name", + "type_info": "Varchar" + }, + { + "ordinal": 26, + "name": "auth_header_prefix", + "type_info": "Varchar" + }, + { + "ordinal": 27, + "name": "endpoint_accepts_scheduling_priority", + "type_info": "Bool" + }, + { + "ordinal": 28, + "name": "endpoint_kind", + "type_info": "Text" + }, + { + "ordinal": 29, + "name": "api_key_id?", + "type_info": "Uuid" + }, + { + "ordinal": 30, + "name": "api_key_secret?", + "type_info": "Varchar" + }, + { + "ordinal": 31, + "name": "api_key_purpose?", + "type_info": "Varchar" + }, + { + "ordinal": 32, + "name": "api_key_user_zero_data_retention?", + "type_info": "Bool" + }, + { + "ordinal": 33, + "name": "api_key_user_id?", + "type_info": "Uuid" + }, + { + "ordinal": 34, + "name": "api_key_user_username?", + "type_info": "Varchar" + }, + { + "ordinal": 35, + "name": "api_key_user_display_name?", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "TextArray" + ] + }, + "nullable": [ + false, + false, + false, + true, + false, + false, + true, + true, + true, + true, + true, + false, + true, + true, + false, + false, + false, + false, + false, + true, + true, + true, + false, + false, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true + ] + }, + "hash": "beca7427dfd22f328c1e31fff391acdcd34a30eda74fe691c8bb48b4cd62afe6" +} diff --git a/.sqlx/query-5849bc1e94bb696c829b8b37f792a908da49c92f3e2b8e3dbaa3a601473d13b2.json b/.sqlx/query-bf54c1aaefa7b49b3fff8f39b39cabc0478e8c4248bd0df263cef6a671b1860a.json similarity index 64% rename from .sqlx/query-5849bc1e94bb696c829b8b37f792a908da49c92f3e2b8e3dbaa3a601473d13b2.json rename to .sqlx/query-bf54c1aaefa7b49b3fff8f39b39cabc0478e8c4248bd0df263cef6a671b1860a.json index 66a350965..9029e850a 100644 --- a/.sqlx/query-5849bc1e94bb696c829b8b37f792a908da49c92f3e2b8e3dbaa3a601473d13b2.json +++ b/.sqlx/query-bf54c1aaefa7b49b3fff8f39b39cabc0478e8c4248bd0df263cef6a671b1860a.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only\n FROM users\n WHERE (username = $1 OR username LIKE $1 || '~%')\n AND user_type = 'organization'\n -- A soft-deleted workspace must never receive join requests:\n -- nobody is left to approve them, so the requester would sit on a\n -- queue no one can see.\n AND is_deleted = false\n -- Same reasoning one level down: a workspace whose owners and\n -- admins have all been deleted is still `is_deleted = false`, but\n -- there is equally nobody home to approve anything.\n --\n -- `Users::delete` no longer creates these - it hands a workspace\n -- to a successor or closes it - but it used to walk away from the\n -- departing user's `user_organizations` rows, which stranded any\n -- workspace whose only owner was deleted: still claiming the\n -- domain, still offered to every colleague who signed up,\n -- unadministrable. This covers those legacy rows, and anything\n -- else that reaches the same state by a route we have not thought\n -- of. `users` inside the subquery is the outer row - the inner one\n -- is aliased.\n AND EXISTS (\n SELECT 1\n FROM user_organizations uo\n JOIN users admin ON admin.id = uo.user_id\n WHERE uo.organization_id = users.id\n AND uo.role IN ('owner', 'admin')\n AND uo.status = 'active'\n AND admin.is_deleted = false\n )\n ORDER BY created_at ASC\n LIMIT 1\n ", + "query": "\n SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n self_hosted_only, toleration_preset\n FROM users\n WHERE (username = $1 OR username LIKE $1 || '~%')\n AND user_type = 'organization'\n -- A soft-deleted workspace must never receive join requests:\n -- nobody is left to approve them, so the requester would sit on a\n -- queue no one can see.\n AND is_deleted = false\n -- Same reasoning one level down: a workspace whose owners and\n -- admins have all been deleted is still `is_deleted = false`, but\n -- there is equally nobody home to approve anything.\n --\n -- `Users::delete` no longer creates these - it hands a workspace\n -- to a successor or closes it - but it used to walk away from the\n -- departing user's `user_organizations` rows, which stranded any\n -- workspace whose only owner was deleted: still claiming the\n -- domain, still offered to every colleague who signed up,\n -- unadministrable. This covers those legacy rows, and anything\n -- else that reaches the same state by a route we have not thought\n -- of. `users` inside the subquery is the outer row - the inner one\n -- is aliased.\n AND EXISTS (\n SELECT 1\n FROM user_organizations uo\n JOIN users admin ON admin.id = uo.user_id\n WHERE uo.organization_id = users.id\n AND uo.role IN ('owner', 'admin')\n AND uo.status = 'active'\n AND admin.is_deleted = false\n )\n ORDER BY created_at ASC\n LIMIT 1\n ", "describe": { "columns": [ { @@ -130,18 +130,13 @@ }, { "ordinal": 25, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 26, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" - }, - { - "ordinal": 27, - "name": "self_hosted_only", - "type_info": "Bool" } ], "parameters": { @@ -176,9 +171,8 @@ false, false, false, - true, - false + true ] }, - "hash": "5849bc1e94bb696c829b8b37f792a908da49c92f3e2b8e3dbaa3a601473d13b2" + "hash": "bf54c1aaefa7b49b3fff8f39b39cabc0478e8c4248bd0df263cef6a671b1860a" } diff --git a/.sqlx/query-c427588e0f5bb4e505b588014082bc21674b2d8ccf070dcb0a03b1080adf1016.json b/.sqlx/query-c427588e0f5bb4e505b588014082bc21674b2d8ccf070dcb0a03b1080adf1016.json deleted file mode 100644 index 82bfa657a..000000000 --- a/.sqlx/query-c427588e0f5bb4e505b588014082bc21674b2d8ccf070dcb0a03b1080adf1016.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE deployed_models SET serving_classes = '{\"throughput\": {\"ttft_ms\": 5000, \"itl_ms\": 100}}' WHERE alias = 'composite-priority'", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "c427588e0f5bb4e505b588014082bc21674b2d8ccf070dcb0a03b1080adf1016" -} diff --git a/.sqlx/query-cbec4649892601b3c826cb167d906ce13114cc60859bd4d7dcc994630ef544d1.json b/.sqlx/query-cbec4649892601b3c826cb167d906ce13114cc60859bd4d7dcc994630ef544d1.json deleted file mode 100644 index 0129f33ca..000000000 --- a/.sqlx/query-cbec4649892601b3c826cb167d906ce13114cc60859bd4d7dcc994630ef544d1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE users SET granted_serving_classes = '{interactive}', default_serving_class = 'throughput', self_hosted_only = true WHERE id = '00000000-0000-0000-0000-0000000000a1'", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "cbec4649892601b3c826cb167d906ce13114cc60859bd4d7dcc994630ef544d1" -} diff --git a/.sqlx/query-d6a3bdde96679776f85e03ab9e5fd8ca33cc51f7bece450934524f28f0ec2897.json b/.sqlx/query-d6a3bdde96679776f85e03ab9e5fd8ca33cc51f7bece450934524f28f0ec2897.json deleted file mode 100644 index dcaed5bfb..000000000 --- a/.sqlx/query-d6a3bdde96679776f85e03ab9e5fd8ca33cc51f7bece450934524f28f0ec2897.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only, toleration_preset FROM users WHERE email = $1 AND id != '00000000-0000-0000-0000-000000000000' AND is_deleted = false AND user_type = 'individual'", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 23, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "auto_topup_soft_failure_count", - "type_info": "Int4" - }, - { - "ordinal": 27, - "name": "auto_topup_retry_after", - "type_info": "Timestamptz" - }, - { - "ordinal": 28, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 29, - "name": "auto_join_enabled", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 31, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "toleration_preset", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "d6a3bdde96679776f85e03ab9e5fd8ca33cc51f7bece450934524f28f0ec2897" -} diff --git a/.sqlx/query-d6d7728c78dd244939db19786d634a07da7fe1fd992bb96b1d6d3047c7a2bd18.json b/.sqlx/query-d6d7728c78dd244939db19786d634a07da7fe1fd992bb96b1d6d3047c7a2bd18.json deleted file mode 100644 index 0d9ff5bbb..000000000 --- a/.sqlx/query-d6d7728c78dd244939db19786d634a07da7fe1fd992bb96b1d6d3047c7a2bd18.json +++ /dev/null @@ -1,228 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO users (id, username, email, display_name, avatar_url, auth_source, is_admin, password_hash, external_user_id)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only, toleration_preset\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 23, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "auto_topup_soft_failure_count", - "type_info": "Int4" - }, - { - "ordinal": 27, - "name": "auto_topup_retry_after", - "type_info": "Timestamptz" - }, - { - "ordinal": 28, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 29, - "name": "auto_join_enabled", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 31, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "toleration_preset", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Text", - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "d6d7728c78dd244939db19786d634a07da7fe1fd992bb96b1d6d3047c7a2bd18" -} diff --git a/.sqlx/query-d819dfc7acfe76e845c3ce89d94d3ac5f93006462db4c72279a199db64e831e9.json b/.sqlx/query-d819dfc7acfe76e845c3ce89d94d3ac5f93006462db4c72279a199db64e831e9.json deleted file mode 100644 index 46c1a984f..000000000 --- a/.sqlx/query-d819dfc7acfe76e845c3ce89d94d3ac5f93006462db4c72279a199db64e831e9.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO model_overlays (user_id, deployed_model_id, default_serving_class, targets, self_hosted_only)\n VALUES ('00000000-0000-0000-0000-0000000000a1', '40000000-0000-0000-0000-000000000001', 'interactive', NULL, false),\n ('00000000-0000-0000-0000-0000000000b1', '40000000-0000-0000-0000-000000000001', NULL, '{\"ttft_ms\": 800, \"itl_ms\": 30}', NULL)", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "d819dfc7acfe76e845c3ce89d94d3ac5f93006462db4c72279a199db64e831e9" -} diff --git a/.sqlx/query-e5fdd0ad37f6dbfb5f9e4a752202e36dbbb886cda6a98b5407e325844e523000.json b/.sqlx/query-e5fdd0ad37f6dbfb5f9e4a752202e36dbbb886cda6a98b5407e325844e523000.json deleted file mode 100644 index e84d0f885..000000000 --- a/.sqlx/query-e5fdd0ad37f6dbfb5f9e4a752202e36dbbb886cda6a98b5407e325844e523000.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only, pinned_tolerations\n FROM users\n WHERE (username = $1 OR username LIKE $1 || '~%')\n AND user_type = 'organization'\n -- A soft-deleted workspace must never receive join requests:\n -- nobody is left to approve them, so the requester would sit on a\n -- queue no one can see.\n AND is_deleted = false\n -- Same reasoning one level down: a workspace whose owners and\n -- admins have all been deleted is still `is_deleted = false`, but\n -- there is equally nobody home to approve anything.\n --\n -- `Users::delete` no longer creates these - it hands a workspace\n -- to a successor or closes it - but it used to walk away from the\n -- departing user's `user_organizations` rows, which stranded any\n -- workspace whose only owner was deleted: still claiming the\n -- domain, still offered to every colleague who signed up,\n -- unadministrable. This covers those legacy rows, and anything\n -- else that reaches the same state by a route we have not thought\n -- of. `users` inside the subquery is the outer row - the inner one\n -- is aliased.\n AND EXISTS (\n SELECT 1\n FROM user_organizations uo\n JOIN users admin ON admin.id = uo.user_id\n WHERE uo.organization_id = users.id\n AND uo.role IN ('owner', 'admin')\n AND uo.status = 'active'\n AND admin.is_deleted = false\n )\n ORDER BY created_at ASC\n LIMIT 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 9, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 10, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 13, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 18, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 20, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 22, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 26, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 27, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 28, - "name": "pinned_tolerations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "e5fdd0ad37f6dbfb5f9e4a752202e36dbbb886cda6a98b5407e325844e523000" -} diff --git a/.sqlx/query-a341d2e54b667a7020e013cb6fdbb6bf6ec887e855399f6175330776cfe01a40.json b/.sqlx/query-e6af3350d4474eb89f8eb399def936d8c612fce4f8e6a667ddef353822847e58.json similarity index 90% rename from .sqlx/query-a341d2e54b667a7020e013cb6fdbb6bf6ec887e855399f6175330776cfe01a40.json rename to .sqlx/query-e6af3350d4474eb89f8eb399def936d8c612fce4f8e6a667ddef353822847e58.json index fe69aeca6..9d27b6e24 100644 --- a/.sqlx/query-a341d2e54b667a7020e013cb6fdbb6bf6ec887e855399f6175330776cfe01a40.json +++ b/.sqlx/query-e6af3350d4474eb89f8eb399def936d8c612fce4f8e6a667ddef353822847e58.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only FROM users WHERE external_user_id = $1 AND id != '00000000-0000-0000-0000-000000000000' AND is_deleted = false", + "query": "SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, self_hosted_only, toleration_preset FROM users WHERE email = $1 AND id != '00000000-0000-0000-0000-000000000000' AND is_deleted = false AND user_type = 'individual'", "describe": { "columns": [ { @@ -155,18 +155,13 @@ }, { "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 31, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" } ], "parameters": { @@ -206,9 +201,8 @@ false, false, false, - true, - false + true ] }, - "hash": "a341d2e54b667a7020e013cb6fdbb6bf6ec887e855399f6175330776cfe01a40" + "hash": "e6af3350d4474eb89f8eb399def936d8c612fce4f8e6a667ddef353822847e58" } diff --git a/.sqlx/query-ec12fcc8bc130c0e3ed513769eb2da866083e4af05fc89b3e7cae292f0562e1c.json b/.sqlx/query-ec12fcc8bc130c0e3ed513769eb2da866083e4af05fc89b3e7cae292f0562e1c.json deleted file mode 100644 index 192aed464..000000000 --- a/.sqlx/query-ec12fcc8bc130c0e3ed513769eb2da866083e4af05fc89b3e7cae292f0562e1c.json +++ /dev/null @@ -1,228 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO users (id, username, email, display_name, avatar_url, auth_source, is_admin, password_hash, external_user_id)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only, pinned_tolerations\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 23, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "auto_topup_soft_failure_count", - "type_info": "Int4" - }, - { - "ordinal": 27, - "name": "auto_topup_retry_after", - "type_info": "Timestamptz" - }, - { - "ordinal": 28, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 29, - "name": "auto_join_enabled", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 31, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 33, - "name": "pinned_tolerations", - "type_info": "Jsonb" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Text", - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "ec12fcc8bc130c0e3ed513769eb2da866083e4af05fc89b3e7cae292f0562e1c" -} diff --git a/.sqlx/query-ec50b8fbce7489cf6cb820d4a492b558ca638607619b84da77364766a8872cb8.json b/.sqlx/query-ec50b8fbce7489cf6cb820d4a492b558ca638607619b84da77364766a8872cb8.json deleted file mode 100644 index 8a930b318..000000000 --- a/.sqlx/query-ec50b8fbce7489cf6cb820d4a492b558ca638607619b84da77364766a8872cb8.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE users SET\n display_name = COALESCE($2, display_name),\n avatar_url = COALESCE($3, avatar_url),\n email = COALESCE($4, email),\n batch_notifications_enabled = COALESCE($5, batch_notifications_enabled),\n low_balance_threshold = CASE\n WHEN $6::boolean THEN $7\n ELSE low_balance_threshold\n END,\n low_balance_notification_sent = CASE\n WHEN $6::boolean THEN false\n ELSE low_balance_notification_sent\n END,\n zero_data_retention = COALESCE($8, zero_data_retention),\n default_serving_class = CASE\n WHEN $9::boolean THEN $10\n ELSE default_serving_class\n END,\n self_hosted_only = COALESCE($11, self_hosted_only),\n granted_serving_classes = COALESCE($12, granted_serving_classes),\n toleration_preset = CASE\n WHEN $13::boolean THEN $14\n ELSE toleration_preset\n END,\n updated_at = NOW()\n WHERE id = $1 AND user_type = 'organization' AND is_deleted = false\n RETURNING id, username, email, display_name, avatar_url, auth_source, created_at, updated_at,\n is_admin, password_hash, external_user_id, payment_provider_id,\n batch_notifications_enabled, first_batch_email_sent,\n low_balance_notification_sent, low_balance_threshold,\n auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, user_type, verified, invoicing_enabled, zero_data_retention,\n granted_serving_classes, default_serving_class, self_hosted_only, toleration_preset\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 9, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 10, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 12, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 13, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 16, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 17, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 18, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 20, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 21, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 22, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 24, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 25, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "toleration_preset", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Uuid", - "Varchar", - "Varchar", - "Varchar", - "Bool", - "Bool", - "Float4", - "Bool", - "Bool", - "Text", - "Bool", - "TextArray", - "Bool", - "Text" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - true, - false, - true - ] - }, - "hash": "ec50b8fbce7489cf6cb820d4a492b558ca638607619b84da77364766a8872cb8" -} diff --git a/.sqlx/query-3eeeff204fd4edb60c30709611619a9005bdb5fd4f1fdd8e87faa4322f295677.json b/.sqlx/query-f3cb86b0d6ff8dc0ae72958ac70940dd5296e6d8c1cf5e86ae8bf2950dcecffd.json similarity index 89% rename from .sqlx/query-3eeeff204fd4edb60c30709611619a9005bdb5fd4f1fdd8e87faa4322f295677.json rename to .sqlx/query-f3cb86b0d6ff8dc0ae72958ac70940dd5296e6d8c1cf5e86ae8bf2950dcecffd.json index 545ff6349..d935008b2 100644 --- a/.sqlx/query-3eeeff204fd4edb60c30709611619a9005bdb5fd4f1fdd8e87faa4322f295677.json +++ b/.sqlx/query-f3cb86b0d6ff8dc0ae72958ac70940dd5296e6d8c1cf5e86ae8bf2950dcecffd.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, granted_serving_classes, default_serving_class, self_hosted_only FROM users WHERE email = $1 AND id != '00000000-0000-0000-0000-000000000000' AND is_deleted = false AND user_type = 'individual'", + "query": "SELECT id, username, email, display_name, avatar_url, auth_source, created_at, updated_at, last_login, is_admin, password_hash, external_user_id, payment_provider_id, is_deleted, is_internal, batch_notifications_enabled, first_batch_email_sent, low_balance_notification_sent, low_balance_threshold, user_type, auto_topup_amount, auto_topup_threshold, auto_topup_monthly_limit, auto_topup_limit_notification_sent, verified, zero_data_retention, auto_topup_soft_failure_count, auto_topup_retry_after, invoicing_enabled, auto_join_enabled, self_hosted_only, toleration_preset FROM users WHERE external_user_id = $1 AND id != '00000000-0000-0000-0000-000000000000' AND is_deleted = false", "describe": { "columns": [ { @@ -155,18 +155,13 @@ }, { "ordinal": 30, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 31, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" - }, - { - "ordinal": 32, - "name": "self_hosted_only", - "type_info": "Bool" } ], "parameters": { @@ -206,9 +201,8 @@ false, false, false, - true, - false + true ] }, - "hash": "3eeeff204fd4edb60c30709611619a9005bdb5fd4f1fdd8e87faa4322f295677" + "hash": "f3cb86b0d6ff8dc0ae72958ac70940dd5296e6d8c1cf5e86ae8bf2950dcecffd" } diff --git a/.sqlx/query-5bee3bad4a63e4b46a016115a1776622affe52125e2c1364284f1d56a27c6b4d.json b/.sqlx/query-fb5ec1f12566c18f47242d618d3171ab66c3e337c508dbd54979be518c2eac61.json similarity index 79% rename from .sqlx/query-5bee3bad4a63e4b46a016115a1776622affe52125e2c1364284f1d56a27c6b4d.json rename to .sqlx/query-fb5ec1f12566c18f47242d618d3171ab66c3e337c508dbd54979be518c2eac61.json index 47d564325..1aefda22b 100644 --- a/.sqlx/query-5bee3bad4a63e4b46a016115a1776622affe52125e2c1364284f1d56a27c6b4d.json +++ b/.sqlx/query-fb5ec1f12566c18f47242d618d3171ab66c3e337c508dbd54979be518c2eac61.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n u.id,\n u.username,\n u.email,\n u.display_name,\n u.avatar_url,\n u.auth_source,\n u.created_at,\n u.updated_at,\n u.last_login,\n u.is_admin,\n u.password_hash,\n u.external_user_id,\n u.payment_provider_id,\n u.is_deleted,\n u.is_internal,\n u.batch_notifications_enabled,\n u.first_batch_email_sent,\n u.low_balance_notification_sent,\n u.low_balance_threshold,\n u.auto_topup_amount,\n u.auto_topup_threshold,\n u.auto_topup_monthly_limit,\n u.auto_topup_limit_notification_sent,\n u.user_type,\n u.verified,\n u.invoicing_enabled,\n u.zero_data_retention,\n u.granted_serving_classes,\n u.default_serving_class,\n u.self_hosted_only,\n ARRAY_AGG(ur.role) FILTER (WHERE ur.role IS NOT NULL) as \"roles: Vec\"\n FROM users u\n LEFT JOIN user_roles ur ON ur.user_id = u.id\n WHERE u.id = ANY($1) AND u.id != '00000000-0000-0000-0000-000000000000' AND u.is_deleted = false\n GROUP BY u.id, u.username, u.email, u.display_name, u.avatar_url, u.auth_source, u.created_at, u.updated_at, u.last_login, u.is_admin, u.password_hash, u.external_user_id, u.payment_provider_id, u.is_deleted, u.is_internal, u.batch_notifications_enabled, u.first_batch_email_sent, u.low_balance_notification_sent, u.low_balance_threshold, u.auto_topup_amount, u.auto_topup_threshold, u.auto_topup_monthly_limit, u.auto_topup_limit_notification_sent, u.user_type, u.verified, u.invoicing_enabled, u.zero_data_retention, u.granted_serving_classes, u.default_serving_class, u.self_hosted_only\n ", + "query": "\n SELECT\n u.id,\n u.username,\n u.email,\n u.display_name,\n u.avatar_url,\n u.auth_source,\n u.created_at,\n u.updated_at,\n u.last_login,\n u.is_admin,\n u.password_hash,\n u.external_user_id,\n u.payment_provider_id,\n u.is_deleted,\n u.is_internal,\n u.batch_notifications_enabled,\n u.first_batch_email_sent,\n u.low_balance_notification_sent,\n u.low_balance_threshold,\n u.auto_topup_amount,\n u.auto_topup_threshold,\n u.auto_topup_monthly_limit,\n u.auto_topup_limit_notification_sent,\n u.user_type,\n u.verified,\n u.invoicing_enabled,\n u.zero_data_retention,\n u.self_hosted_only,\n u.toleration_preset,\n ARRAY_AGG(ur.role) FILTER (WHERE ur.role IS NOT NULL) as \"roles: Vec\"\n FROM users u\n LEFT JOIN user_roles ur ON ur.user_id = u.id\n WHERE u.id = ANY($1) AND u.id != '00000000-0000-0000-0000-000000000000' AND u.is_deleted = false\n GROUP BY u.id, u.username, u.email, u.display_name, u.avatar_url, u.auth_source, u.created_at, u.updated_at, u.last_login, u.is_admin, u.password_hash, u.external_user_id, u.payment_provider_id, u.is_deleted, u.is_internal, u.batch_notifications_enabled, u.first_batch_email_sent, u.low_balance_notification_sent, u.low_balance_threshold, u.auto_topup_amount, u.auto_topup_threshold, u.auto_topup_monthly_limit, u.auto_topup_limit_notification_sent, u.user_type, u.verified, u.invoicing_enabled, u.zero_data_retention, u.self_hosted_only, u.toleration_preset\n ", "describe": { "columns": [ { @@ -140,21 +140,16 @@ }, { "ordinal": 27, - "name": "granted_serving_classes", - "type_info": "TextArray" + "name": "self_hosted_only", + "type_info": "Bool" }, { "ordinal": 28, - "name": "default_serving_class", + "name": "toleration_preset", "type_info": "Text" }, { "ordinal": 29, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 30, "name": "roles: Vec", "type_info": { "Custom": { @@ -216,9 +211,8 @@ false, false, true, - false, null ] }, - "hash": "5bee3bad4a63e4b46a016115a1776622affe52125e2c1364284f1d56a27c6b4d" + "hash": "fb5ec1f12566c18f47242d618d3171ab66c3e337c508dbd54979be518c2eac61" } diff --git a/.sqlx/query-fdb0c173dbf6c4983b907ed0100e6172ec2127149113450f699bea4329be0f12.json b/.sqlx/query-fdb0c173dbf6c4983b907ed0100e6172ec2127149113450f699bea4329be0f12.json deleted file mode 100644 index deaf81d84..000000000 --- a/.sqlx/query-fdb0c173dbf6c4983b907ed0100e6172ec2127149113450f699bea4329be0f12.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n u.id,\n u.username,\n u.email,\n u.display_name,\n u.avatar_url,\n u.auth_source,\n u.created_at,\n u.updated_at,\n u.last_login,\n u.is_admin,\n u.password_hash,\n u.external_user_id,\n u.payment_provider_id,\n u.is_deleted,\n u.is_internal,\n u.batch_notifications_enabled,\n u.first_batch_email_sent,\n u.low_balance_notification_sent,\n u.low_balance_threshold,\n u.auto_topup_amount,\n u.auto_topup_threshold,\n u.auto_topup_monthly_limit,\n u.auto_topup_limit_notification_sent,\n u.user_type,\n u.verified,\n u.invoicing_enabled,\n u.zero_data_retention,\n u.granted_serving_classes,\n u.default_serving_class,\n u.self_hosted_only,\n u.pinned_tolerations,\n ARRAY_AGG(ur.role) FILTER (WHERE ur.role IS NOT NULL) as \"roles: Vec\"\n FROM users u\n LEFT JOIN user_roles ur ON ur.user_id = u.id\n WHERE u.id = $1 AND u.id != '00000000-0000-0000-0000-000000000000' AND u.is_deleted = false\n GROUP BY u.id, u.username, u.email, u.display_name, u.avatar_url, u.auth_source, u.created_at, u.updated_at, u.last_login, u.is_admin, u.password_hash, u.external_user_id, u.payment_provider_id, u.is_deleted, u.is_internal, u.batch_notifications_enabled, u.first_batch_email_sent, u.low_balance_notification_sent, u.low_balance_threshold, u.auto_topup_amount, u.auto_topup_threshold, u.auto_topup_monthly_limit, u.auto_topup_limit_notification_sent, u.user_type, u.verified, u.invoicing_enabled, u.zero_data_retention, u.granted_serving_classes, u.default_serving_class, u.self_hosted_only, u.pinned_tolerations\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - }, - { - "ordinal": 1, - "name": "username", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "email", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "display_name", - "type_info": "Varchar" - }, - { - "ordinal": 4, - "name": "avatar_url", - "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "auth_source", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "created_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 7, - "name": "updated_at", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "last_login", - "type_info": "Timestamptz" - }, - { - "ordinal": 9, - "name": "is_admin", - "type_info": "Bool" - }, - { - "ordinal": 10, - "name": "password_hash", - "type_info": "Text" - }, - { - "ordinal": 11, - "name": "external_user_id", - "type_info": "Text" - }, - { - "ordinal": 12, - "name": "payment_provider_id", - "type_info": "Varchar" - }, - { - "ordinal": 13, - "name": "is_deleted", - "type_info": "Bool" - }, - { - "ordinal": 14, - "name": "is_internal", - "type_info": "Bool" - }, - { - "ordinal": 15, - "name": "batch_notifications_enabled", - "type_info": "Bool" - }, - { - "ordinal": 16, - "name": "first_batch_email_sent", - "type_info": "Bool" - }, - { - "ordinal": 17, - "name": "low_balance_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 18, - "name": "low_balance_threshold", - "type_info": "Float4" - }, - { - "ordinal": 19, - "name": "auto_topup_amount", - "type_info": "Float4" - }, - { - "ordinal": 20, - "name": "auto_topup_threshold", - "type_info": "Float4" - }, - { - "ordinal": 21, - "name": "auto_topup_monthly_limit", - "type_info": "Float4" - }, - { - "ordinal": 22, - "name": "auto_topup_limit_notification_sent", - "type_info": "Bool" - }, - { - "ordinal": 23, - "name": "user_type", - "type_info": "Varchar" - }, - { - "ordinal": 24, - "name": "verified", - "type_info": "Bool" - }, - { - "ordinal": 25, - "name": "invoicing_enabled", - "type_info": "Bool" - }, - { - "ordinal": 26, - "name": "zero_data_retention", - "type_info": "Bool" - }, - { - "ordinal": 27, - "name": "granted_serving_classes", - "type_info": "TextArray" - }, - { - "ordinal": 28, - "name": "default_serving_class", - "type_info": "Text" - }, - { - "ordinal": 29, - "name": "self_hosted_only", - "type_info": "Bool" - }, - { - "ordinal": 30, - "name": "pinned_tolerations", - "type_info": "Jsonb" - }, - { - "ordinal": 31, - "name": "roles: Vec", - "type_info": { - "Custom": { - "name": "user_role[]", - "kind": { - "Array": { - "Custom": { - "name": "user_role", - "kind": { - "Enum": [ - "PLATFORMMANAGER", - "REQUESTVIEWER", - "STANDARDUSER", - "BILLINGMANAGER", - "BATCHAPIUSER", - "CONNECTIONSUSER", - "BACKGROUNDINFERENCEUSER" - ] - } - } - } - } - } - } - } - ], - "parameters": { - "Left": [ - "Uuid" - ] - }, - "nullable": [ - false, - false, - false, - true, - true, - false, - false, - false, - true, - false, - true, - true, - true, - false, - false, - false, - false, - false, - true, - true, - true, - true, - false, - false, - false, - false, - false, - false, - true, - false, - true, - null - ] - }, - "hash": "fdb0c173dbf6c4983b907ed0100e6172ec2127149113450f699bea4329be0f12" -} diff --git a/dashboard/src/api/control-layer/mocks/handlers.ts b/dashboard/src/api/control-layer/mocks/handlers.ts index 043b76420..0edffd85f 100644 --- a/dashboard/src/api/control-layer/mocks/handlers.ts +++ b/dashboard/src/api/control-layer/mocks/handlers.ts @@ -2914,7 +2914,6 @@ export const handlers = [ if (!org) return HttpResponse.json({ error: "Not found" }, { status: 404 }); return HttpResponse.json({ organization_id: org.id, - granted_serving_classes: [], self_hosted_only: false, overlays: [], tariffs: [], diff --git a/dashboard/src/api/control-layer/types.ts b/dashboard/src/api/control-layer/types.ts index 2843471ce..9fd3f3aff 100644 --- a/dashboard/src/api/control-layer/types.ts +++ b/dashboard/src/api/control-layer/types.ts @@ -123,9 +123,8 @@ export type Role = export type ApiKeyPurpose = "platform" | "realtime" | "batch" | "playground"; export type TariffApiKeyPurpose = "realtime" | "batch" | "playground"; -// Serving classes (operator-only; customers only ever see the model suffix) -export type ServingClassName = "interactive" | "throughput"; -/** A model's preset for one class: the router targets its requests ask for. */ +/** An organisation's explicit targets on one model: the router targets its + * realtime requests ask for. Operator-only. */ export interface ServingPreset { ttft_ms: number; itl_ms: number; @@ -356,9 +355,6 @@ export interface Model { traffic_routing_rules?: TrafficRoutingRule[] | null; allowed_batch_completion_windows?: string[] | null; metadata?: ModelMetadata | null; - /** Serving classes the model offers, keyed by class, each a preset of router targets. - * Only present for platform managers; declared in the model catalog. */ - serving_classes?: Record; } /** One organisation's serving overrides on one model (platform managers only). */ @@ -368,7 +364,6 @@ export interface ServingOverlay { organization_display_name?: string | null; deployed_model_id: string; alias: string; - default_serving_class?: ServingClassName; targets?: ServingPreset; self_hosted_only?: boolean; provisioning_source?: string; @@ -389,8 +384,6 @@ export interface OrganizationCacheTariff { /** Everything serving-related about one organisation (platform managers only). */ export interface OrganizationServing { organization_id: string; - granted_serving_classes: ServingClassName[]; - default_serving_class?: ServingClassName; self_hosted_only: boolean; overlays: ServingOverlay[]; tariffs: ModelTariff[]; @@ -518,8 +511,6 @@ export interface User { auto_topup_monthly_limit: number | null; // Monthly spending limit for auto top-ups (null = no limit) zero_data_retention: boolean; // Account-wide zero-data-retention flag // Serving account settings (platform managers only) - granted_serving_classes?: ServingClassName[]; - default_serving_class?: ServingClassName | null; self_hosted_only?: boolean; // Scheduling-toleration preset the account is pinned to (platform managers // only). null/absent = "Default" (nothing pinned); a string is a configured @@ -697,8 +688,6 @@ export interface UserUpdateRequest { auto_topup_monthly_limit?: number | null; // Set a limit to cap, null to remove limit zero_data_retention?: boolean; // Users may update this for their own account // Serving account settings: platform managers only (dwctl rejects the whole request otherwise) - granted_serving_classes?: ServingClassName[]; - default_serving_class?: ServingClassName | null; self_hosted_only?: boolean; // Scheduling-toleration preset to pin the account to: platform managers // only. A preset id pins it; null clears the pin ("Default"). @@ -1879,8 +1868,6 @@ export interface OrganizationUpdateRequest { low_balance_threshold?: number | null; zero_data_retention?: boolean; // Account-wide zero-data-retention flag (admin-only) // Serving account settings: platform managers only - granted_serving_classes?: ServingClassName[]; - default_serving_class?: ServingClassName | null; self_hosted_only?: boolean; /** Replaces the whole set; owner-only. An empty list re-enables everything. */ disabled_modalities?: Modality[]; diff --git a/dashboard/src/components/features/models/manage/ModelPricing.test.tsx b/dashboard/src/components/features/models/manage/ModelPricing.test.tsx index 951608594..d2bc863f8 100644 --- a/dashboard/src/components/features/models/manage/ModelPricing.test.tsx +++ b/dashboard/src/components/features/models/manage/ModelPricing.test.tsx @@ -39,13 +39,11 @@ const overlay: ServingOverlay = { organization_display_name: "Example Organisation", deployed_model_id: "model", alias: "example-model", - default_serving_class: "throughput", self_hosted_only: false, updated_at: "2020-01-01", }; const serving: OrganizationServing = { organization_id: "org-a", - granted_serving_classes: ["interactive", "throughput"], self_hosted_only: true, overlays: [overlay], tariffs: [ @@ -86,10 +84,6 @@ const model: Model = { input_price_per_token: "0.000001", }), ], - serving_classes: { - interactive: { ttft_ms: 1000, itl_ms: 15, priority: 1 }, - throughput: { ttft_ms: 5000, itl_ms: 60, priority: 0 }, - }, allowed_batch_completion_windows: ["1h", "24h"], }; function mount(manager = true, initialOrganization?: string) { @@ -196,7 +190,7 @@ describe("model pricing selector", () => { const playground = within(within(container).getByRole("region", { name: "Playground prices" })); expect(playground.getByText("Bespoke · interactive · realtime fallback")).toBeInTheDocument(); expect(playground.getAllByText("$0")).toHaveLength(2); - expect(playground.getAllByText("$2.00")).toHaveLength(2); + expect(playground.getAllByText("$2.00")).toHaveLength(1); }); it("starts general then shows effective class prices and inherited batch/cache values", async () => { @@ -220,7 +214,7 @@ describe("model pricing selector", () => { const rt = within(page.getByRole("region", { name: "Realtime prices" })); expect(rt.getByText("Bespoke · interactive")).toBeInTheDocument(); expect(rt.getAllByText("$0")).toHaveLength(2); - expect(rt.getAllByText("$2.00")).toHaveLength(2); + expect(rt.getAllByText("$2.00")).toHaveLength(1); const batch = within( page.getByRole("region", { name: "Batch and flex prices" }), ); @@ -234,12 +228,12 @@ describe("model pricing selector", () => { ).not.toBeInTheDocument(); const cache = within(page.getByRole("region", { name: "Cache pricing" })); expect(cache.getByText("0.25×")).toBeInTheDocument(); - expect(cache.getAllByText("Inherited · general model")).toHaveLength(2); + expect(cache.getAllByText("Inherited · general model")).toHaveLength(1); const sections = [...container.querySelectorAll("section[aria-label]")].map( (x) => x.getAttribute("aria-label"), ); expect(sections.indexOf("Cache pricing")).toBeLessThan( - sections.indexOf("Serving classes"), + sections.indexOf("Organisation overlays"), ); await user.click(page.getByRole("combobox", { name: "Pricing for" })); await user.click( @@ -260,7 +254,6 @@ describe("model pricing selector", () => { overlays: [ { ...overlay, - default_serving_class: null, targets: { ttft_ms: 1000, itl_ms: 20, priority: 1 }, }, ], diff --git a/dashboard/src/components/features/models/manage/ModelPricing.tsx b/dashboard/src/components/features/models/manage/ModelPricing.tsx index d53c0b25c..fba3db17a 100644 --- a/dashboard/src/components/features/models/manage/ModelPricing.tsx +++ b/dashboard/src/components/features/models/manage/ModelPricing.tsx @@ -96,7 +96,6 @@ export function ModelPricing({ ? [ ...new Set([ "standard", - ...Object.keys(model.serving_classes ?? {}), ...(selectedOverlay?.targets ? ["custom"] : []), ...rows .filter((row) => row.organization_id === organization) @@ -137,20 +136,6 @@ export function ModelPricing({ : "All classes" } source={`${priceSource(row, !!organization)}${purpose !== "realtime" && row?.api_key_purpose === "realtime" ? " · realtime fallback" : ""}`} - note={ - purpose !== "batch" && - cls !== "standard" && - cls !== "custom" && - own.data - ? !model.serving_classes?.[cls] - ? "Not offered by this model" - : !own.data.granted_serving_classes.includes( - cls as "interactive" | "throughput", - ) - ? "Not granted to this organisation" - : undefined - : undefined - } /> ); }; @@ -352,31 +337,6 @@ export function ModelPricing({ )} -
-

Serving classes

- {Object.keys(model.serving_classes ?? {}).length ? ( -
- {Object.entries(model.serving_classes ?? {}).map( - ([name, preset]) => ( -
-

{name}

-

- TTFT {preset.ttft_ms} ms · ITL {preset.itl_ms} ms · - priority {preset.priority ?? 0} -

-
- ), - )} -
- ) : ( -

- None offered (standard only). -

- )} -
·{" "} - {overlay?.default_serving_class ?? - (overlay?.targets ? "custom targets" : "account defaults")} + {overlay?.targets ? "custom targets" : "account defaults"} {open && ( diff --git a/dashboard/src/components/features/organizations/EditOrganizationModal.test.tsx b/dashboard/src/components/features/organizations/EditOrganizationModal.test.tsx index 7c35c32bf..7e93a2d54 100644 --- a/dashboard/src/components/features/organizations/EditOrganizationModal.test.tsx +++ b/dashboard/src/components/features/organizations/EditOrganizationModal.test.tsx @@ -286,15 +286,16 @@ describe("serving setting authorization and cancellation", () => { render(, { wrapper: createWrapper() }); const dialog = within(screen.getByRole("dialog")); if (canEditServing) { - await user.click(dialog.getByRole("checkbox", { name: "Grant interactive" })); + expect(dialog.queryByRole("checkbox", { name: "Grant interactive" })).not.toBeInTheDocument(); await user.click(dialog.getByRole("switch", { name: "Toggle no external-provider fallback" })); } await user.click(dialog.getByRole("button", { name: /save/i })); await waitFor(() => expect(submitted).toBeDefined()); if (canEditServing) { - expect(submitted).toMatchObject({ granted_serving_classes: ["interactive"], default_serving_class: null, self_hosted_only: true }); + expect(submitted).toMatchObject({ self_hosted_only: true }); + for (const field of ["granted_serving_classes", "default_serving_class"]) expect(submitted).not.toHaveProperty(field); } else { - for (const field of ["granted_serving_classes", "default_serving_class", "self_hosted_only"]) expect(submitted).not.toHaveProperty(field); + for (const field of ["self_hosted_only", "toleration_preset"]) expect(submitted).not.toHaveProperty(field); } }); @@ -302,13 +303,13 @@ describe("serving setting authorization and cancellation", () => { const user = userEvent.setup(); const props = { onClose: vi.fn(), organization: mockOrg, canEditServing: true }; const { rerender } = render(, { wrapper: createWrapper() }); - const checkbox = within(screen.getByRole("dialog")).getByRole("checkbox", { name: "Grant interactive" }); - await user.click(checkbox); - expect(checkbox).toBeChecked(); + const toggle = within(screen.getByRole("dialog")).getByRole("switch", { name: "Toggle no external-provider fallback" }); + await user.click(toggle); + expect(toggle).toBeChecked(); await user.click(within(screen.getByRole("dialog")).getByRole("button", { name: /cancel/i })); rerender(); rerender(); - expect(within(screen.getByRole("dialog")).getByRole("checkbox", { name: "Grant interactive" })).not.toBeChecked(); + expect(within(screen.getByRole("dialog")).getByRole("switch", { name: "Toggle no external-provider fallback" })).not.toBeChecked(); }); }); diff --git a/dashboard/src/components/features/organizations/EditOrganizationModal.tsx b/dashboard/src/components/features/organizations/EditOrganizationModal.tsx index 1ad741820..8eaa9d81b 100644 --- a/dashboard/src/components/features/organizations/EditOrganizationModal.tsx +++ b/dashboard/src/components/features/organizations/EditOrganizationModal.tsx @@ -1,6 +1,6 @@ import { useState, useEffect } from "react"; import { useUpdateOrganization, useOrganization, useConfig } from "@/api/control-layer/hooks"; -import type { Organization, ServingClassName } from "@/api/control-layer/types"; +import type { Organization } from "@/api/control-layer/types"; import { SchedulingTolerations } from "@/components/features/scheduling/SchedulingTolerations"; import { Dialog, @@ -14,7 +14,6 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; -import { Checkbox } from "@/components/ui/checkbox"; import { AlertBox } from "@/components/ui/alert-box"; import { describeWaitingOn } from "./pendingEmailChange"; import { toast } from "sonner"; @@ -39,8 +38,6 @@ export function EditOrganizationModal({ const [email, setEmail] = useState(""); const [displayName, setDisplayName] = useState(""); const [zeroDataRetention, setZeroDataRetention] = useState(false); - const [grantedClasses, setGrantedClasses] = useState([]); - const [defaultClass, setDefaultClass] = useState("standard"); const [selfHostedOnly, setSelfHostedOnly] = useState(false); const [tolerationPreset, setTolerationPreset] = useState(null); const updateOrg = useUpdateOrganization(); @@ -60,8 +57,6 @@ export function EditOrganizationModal({ setEmail(organization.email || ""); setDisplayName(organization.display_name || ""); setZeroDataRetention(organization.zero_data_retention ?? false); - setGrantedClasses(organization.granted_serving_classes ?? []); - setDefaultClass(organization.default_serving_class ?? "standard"); setSelfHostedOnly(organization.self_hosted_only ?? false); setTolerationPreset(organization.toleration_preset ?? null); } @@ -98,9 +93,6 @@ export function EditOrganizationModal({ // them as anyone else fails the whole request with a 403. ...(canEditServing ? { - granted_serving_classes: grantedClasses, - default_serving_class: - defaultClass === "standard" ? null : defaultClass, self_hosted_only: selfHostedOnly, toleration_preset: tolerationPreset, } @@ -203,53 +195,6 @@ export function EditOrganizationModal({ )} {canEditServing && (
-
-
- -

- A request may name one of these classes; the model must - offer it too. Customers never edit this. -

-
- {(["interactive", "throughput"] as const).map((c) => ( - - ))} -
-
-
- -

- What requests ask for when they name no class. Applies only - where the class is held and the model offers it. -

- -
-