mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
chore: add user details to aibridge interception list endpoint (#20397)
- Adds FK from `aibridge_interceptions.initiator_id` to `users.id`
- This is enforced by deleting any rows that don't have any users. Since
this is an experimental feature AND coder never deletes user rows I
think this is acceptable.
- Adds `name` as a property on `codersdk.MinimalUser`
- This matches the `visible_users` view in the database. I'm unsure why
`name` wasn't already included given that `username` is.
- Adds a new `initiator` field to `codersdk.AIBridgeInterception` which
contains `codersdk.MinimalUser` (ID, username, name, avatar URL)
- Removes `initiator_id` from `codersdk.AIBridgeInterception`
- Should be fine since we're still in early access
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
-- We didn't add an FK as a premature optimization when the aibridge tables were
|
||||
-- added, but for the initiator_id it's pretty annoying not having a strong
|
||||
-- reference.
|
||||
--
|
||||
-- Since the aibridge feature is still in early access, we're going to add the
|
||||
-- FK and drop any rows that violate it (which should be none). This isn't a
|
||||
-- very efficient migration, but since the feature is behind an experimental
|
||||
-- flag, it shouldn't have any impact on deployments that aren't using the
|
||||
-- feature.
|
||||
|
||||
-- Step 1: Add FK without validating it
|
||||
ALTER TABLE aibridge_interceptions
|
||||
ADD CONSTRAINT aibridge_interceptions_initiator_id_fkey
|
||||
FOREIGN KEY (initiator_id)
|
||||
REFERENCES users(id)
|
||||
-- We can't:
|
||||
-- - Cascade delete because this is an auditing feature, and it also
|
||||
-- wouldn't delete related aibridge rows since we don't FK them.
|
||||
-- - Set null because you can't correlate to the original user ID if the
|
||||
-- user somehow gets deleted.
|
||||
--
|
||||
-- So we just use the default and don't do anything. This will result in a
|
||||
-- deferred constraint violation error when the user is deleted.
|
||||
--
|
||||
-- In Coder, we don't delete user rows ever, so this should never happen
|
||||
-- unless an admin manually deletes a user with SQL.
|
||||
ON DELETE NO ACTION
|
||||
-- Delay validation of existing data until after we've dropped rows that
|
||||
-- violate the FK.
|
||||
NOT VALID;
|
||||
|
||||
-- Step 2: Drop existing interceptions that violate the FK.
|
||||
DELETE FROM aibridge_interceptions
|
||||
WHERE initiator_id NOT IN (SELECT id FROM users);
|
||||
|
||||
-- Step 3: Drop existing rows from other tables that no longer have a valid
|
||||
-- interception in the database.
|
||||
DELETE FROM aibridge_token_usages
|
||||
WHERE interception_id NOT IN (SELECT id FROM aibridge_interceptions);
|
||||
|
||||
DELETE FROM aibridge_user_prompts
|
||||
WHERE interception_id NOT IN (SELECT id FROM aibridge_interceptions);
|
||||
|
||||
DELETE FROM aibridge_tool_usages
|
||||
WHERE interception_id NOT IN (SELECT id FROM aibridge_interceptions);
|
||||
|
||||
-- Step 4: Validate the FK
|
||||
ALTER TABLE aibridge_interceptions
|
||||
VALIDATE CONSTRAINT aibridge_interceptions_initiator_id_fkey;
|
||||
@@ -8,7 +8,7 @@ INSERT INTO
|
||||
)
|
||||
VALUES (
|
||||
'be003e1e-b38f-43bf-847d-928074dd0aa8',
|
||||
'30095c71-380b-457a-8995-97b8ee6e5307',
|
||||
'30095c71-380b-457a-8995-97b8ee6e5307', -- admin@coder.com, from 000022_initial_v0.6.6.up.sql
|
||||
'openai',
|
||||
'gpt-5',
|
||||
'2025-09-15 12:45:13.921148+00'
|
||||
@@ -77,3 +77,82 @@ VALUES (
|
||||
'{}',
|
||||
'2025-09-15 12:45:21.674335+00'
|
||||
);
|
||||
|
||||
-- For a later migration, we'll add an invalid interception without a valid
|
||||
-- initiator_id.
|
||||
INSERT INTO
|
||||
aibridge_interceptions (
|
||||
id,
|
||||
initiator_id,
|
||||
provider,
|
||||
model,
|
||||
started_at
|
||||
)
|
||||
VALUES (
|
||||
'c6d29c6e-26a3-4137-bb2e-9dfeef3c1c26',
|
||||
'cab8d56a-8922-4999-81a9-046b43ac1312', -- user does not exist
|
||||
'openai',
|
||||
'gpt-5',
|
||||
'2025-09-15 12:45:13.921148+00'
|
||||
);
|
||||
INSERT INTO
|
||||
aibridge_token_usages (
|
||||
id,
|
||||
interception_id,
|
||||
provider_response_id,
|
||||
input_tokens,
|
||||
output_tokens,
|
||||
metadata,
|
||||
created_at
|
||||
)
|
||||
VALUES (
|
||||
'5650db6c-0b7c-49e3-bb26-9b2ba0107e11',
|
||||
'c6d29c6e-26a3-4137-bb2e-9dfeef3c1c26',
|
||||
'chatcmpl-CG2s28QlpKIoooUtXuLTmGbdtyS1k',
|
||||
10950,
|
||||
118,
|
||||
'{}',
|
||||
'2025-09-15 12:45:21.674413+00'
|
||||
);
|
||||
INSERT INTO
|
||||
aibridge_user_prompts (
|
||||
id,
|
||||
interception_id,
|
||||
provider_response_id,
|
||||
prompt,
|
||||
metadata,
|
||||
created_at
|
||||
)
|
||||
VALUES (
|
||||
'1e76cb5b-7c34-4160-b604-a4256f856169',
|
||||
'c6d29c6e-26a3-4137-bb2e-9dfeef3c1c26',
|
||||
'chatcmpl-CG2s28QlpKIoooUtXuLTmGbdtyS1k',
|
||||
'how many workspaces do i have',
|
||||
'{}',
|
||||
'2025-09-15 12:45:21.674335+00'
|
||||
);
|
||||
INSERT INTO
|
||||
aibridge_tool_usages (
|
||||
id,
|
||||
interception_id,
|
||||
provider_response_id,
|
||||
tool,
|
||||
server_url,
|
||||
input,
|
||||
injected,
|
||||
invocation_error,
|
||||
metadata,
|
||||
created_at
|
||||
)
|
||||
VALUES (
|
||||
'351b440f-d605-4f37-8ceb-011f0377b695',
|
||||
'c6d29c6e-26a3-4137-bb2e-9dfeef3c1c26',
|
||||
'chatcmpl-CG2s28QlpKIoooUtXuLTmGbdtyS1k',
|
||||
'coder_list_workspaces',
|
||||
'http://localhost:3000/api/experimental/mcp/http',
|
||||
'{}',
|
||||
true,
|
||||
NULL,
|
||||
'{}',
|
||||
'2025-09-15 12:45:21.674413+00'
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user