Skip to content

Commit 03adc91

Browse files
authored
Merge pull request #3824 from BrentOzarULTD/3823_ai_tables
#3823 sp_BlitzCache: split AI config into two tables
2 parents c8d02fe + be5aea4 commit 03adc91

1 file changed

Lines changed: 65 additions & 18 deletions

File tree

sp_BlitzCache.sql

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,9 @@ ALTER PROCEDURE dbo.sp_BlitzCache
280280
@AIModel VARCHAR(200) = NULL, /* Defaults to gpt-4.1-mini */
281281
@AIURL VARCHAR(200) = NULL, /* Defaults to https://api.openai.com/v1/chat/completions */
282282
@AICredential VARCHAR(200) = NULL, /* Defaults to 'https://api.openai.com/' or the root of your AIURL, trailing slash included */
283-
@AIConfig NVARCHAR(500) = NULL, /* Table where AI config data is stored - can be in the format db.schema.table, schema.table, or just table. */
283+
@AIConfig NVARCHAR(500) = NULL, /* Table where AI provider config is stored - can be in the format db.schema.table, schema.table, or just table. */
284+
@AIPromptConfig NVARCHAR(500) = NULL, /* Table where AI prompt templates are stored - db.schema.table, schema.table, or just table. */
285+
@AIPromptNickname NVARCHAR(200) = NULL, /* Which prompt to use from the prompts table */
284286
@Version VARCHAR(30) = NULL OUTPUT,
285287
@VersionDate DATETIME = NULL OUTPUT,
286288
@VersionCheckMode BIT = 0,
@@ -870,22 +872,31 @@ BEGIN
870872
EXEC(@config_sql);
871873
END;
872874

873-
CREATE TABLE #ai_configuration
875+
CREATE TABLE #ai_providers
874876
(Id INT PRIMARY KEY CLUSTERED,
875877
AI_Model NVARCHAR(100) INDEX AI_Model,
878+
Nickname NVARCHAR(200),
876879
AI_URL NVARCHAR(500),
877880
AI_Database_Scoped_Credential_Name NVARCHAR(500),
878-
AI_System_Prompt_Override NVARCHAR(4000),
879881
AI_Parameters NVARCHAR(4000),
880-
Payload_Template_Override NVARCHAR(4000),
881882
Timeout_Seconds TINYINT,
882883
Context INT,
883884
DefaultModel BIT DEFAULT 0);
884885

886+
CREATE TABLE #ai_prompts
887+
(Id INT PRIMARY KEY CLUSTERED,
888+
PromptNickname NVARCHAR(200) INDEX IX_PromptNickname,
889+
AI_System_Prompt NVARCHAR(4000),
890+
Payload_Template NVARCHAR(4000),
891+
DefaultPrompt BIT DEFAULT 0);
892+
885893
DECLARE
886894
@AIConfigDatabaseName NVARCHAR(128) = CASE WHEN @AIConfig IS NULL THEN NULL ELSE PARSENAME(@AIConfig, 3) END,
887895
@AIConfigSchemaName NVARCHAR(258) = CASE WHEN @AIConfig IS NULL THEN NULL ELSE PARSENAME(@AIConfig, 2) END,
888896
@AIConfigTableName NVARCHAR(258) = CASE WHEN @AIConfig IS NULL THEN NULL ELSE PARSENAME(@AIConfig, 1) END,
897+
@AIPromptDatabaseName NVARCHAR(128) = CASE WHEN @AIPromptConfig IS NULL THEN NULL ELSE PARSENAME(@AIPromptConfig, 3) END,
898+
@AIPromptSchemaName NVARCHAR(258) = CASE WHEN @AIPromptConfig IS NULL THEN NULL ELSE PARSENAME(@AIPromptConfig, 2) END,
899+
@AIPromptTableName NVARCHAR(258) = CASE WHEN @AIPromptConfig IS NULL THEN NULL ELSE PARSENAME(@AIPromptConfig, 1) END,
889900
@AISystemPrompt NVARCHAR(4000),
890901
@AIParameters NVARCHAR(4000),
891902
@AIPayloadTemplate NVARCHAR(MAX),
@@ -894,17 +905,34 @@ DECLARE
894905
@AIContext INT;
895906

896907

908+
IF @AIPromptConfig IS NOT NULL AND @AIConfig IS NULL
909+
BEGIN
910+
RAISERROR('@AIPromptConfig requires @AIConfig to also be specified.', 12, 1);
911+
RETURN;
912+
END;
913+
897914
IF @AIConfig IS NOT NULL
898915
BEGIN
899-
RAISERROR(N'Reading values from AI Configuration Table', 0, 1) WITH NOWAIT;
900-
SET @config_sql = N'INSERT INTO #ai_configuration (Id, AI_Model, AI_URL, AI_Database_Scoped_Credential_Name, AI_System_Prompt_Override, AI_Parameters, Payload_Template_Override, Timeout_Seconds, Context, DefaultModel)
901-
SELECT Id, AI_Model, AI_URL, AI_Database_Scoped_Credential_Name, AI_System_Prompt_Override, AI_Parameters, Payload_Template_Override, Timeout_Seconds, Context, DefaultModel FROM '
916+
RAISERROR(N'Reading values from AI Provider Configuration Table', 0, 1) WITH NOWAIT;
917+
SET @config_sql = N'INSERT INTO #ai_providers (Id, AI_Model, Nickname, AI_URL, AI_Database_Scoped_Credential_Name, AI_Parameters, Timeout_Seconds, Context, DefaultModel)
918+
SELECT Id, AI_Model, Nickname, AI_URL, AI_Database_Scoped_Credential_Name, AI_Parameters, Timeout_Seconds, Context, DefaultModel FROM '
902919
+ CASE WHEN @AIConfigDatabaseName IS NOT NULL THEN (QUOTENAME(@AIConfigDatabaseName) + N'.') ELSE N'' END
903920
+ CASE WHEN @AIConfigSchemaName IS NOT NULL THEN (QUOTENAME(@AIConfigSchemaName) + N'.') ELSE N'' END
904921
+ QUOTENAME(@AIConfigTableName) + N' WHERE (@AIModel IS NULL AND DefaultModel = 1) OR @AIModel IN (AI_Model, Nickname) ; ';
905922
EXEC sp_executesql @config_sql, N'@AIModel NVARCHAR(100)', @AIModel;
906923
END;
907924

925+
IF @AIPromptConfig IS NOT NULL
926+
BEGIN
927+
RAISERROR(N'Reading values from AI Prompts Table', 0, 1) WITH NOWAIT;
928+
SET @config_sql = N'INSERT INTO #ai_prompts (Id, PromptNickname, AI_System_Prompt, Payload_Template, DefaultPrompt)
929+
SELECT Id, PromptNickname, AI_System_Prompt, Payload_Template, DefaultPrompt FROM '
930+
+ CASE WHEN @AIPromptDatabaseName IS NOT NULL THEN (QUOTENAME(@AIPromptDatabaseName) + N'.') ELSE N'' END
931+
+ CASE WHEN @AIPromptSchemaName IS NOT NULL THEN (QUOTENAME(@AIPromptSchemaName) + N'.') ELSE N'' END
932+
+ QUOTENAME(@AIPromptTableName) + N' WHERE (@AIPromptNickname IS NULL AND DefaultPrompt = 1) OR @AIPromptNickname = PromptNickname ; ';
933+
EXEC sp_executesql @config_sql, N'@AIPromptNickname NVARCHAR(200)', @AIPromptNickname;
934+
END;
935+
908936

909937
IF @AI > 0
910938
BEGIN
@@ -913,7 +941,10 @@ IF @AI > 0
913941
SELECT @ExpertMode = 1, @KeepCRLF = 1;
914942

915943
IF @Debug = 2
916-
SELECT N'ai_configuration' AS TableLabel, * FROM #ai_configuration;
944+
BEGIN
945+
SELECT N'ai_providers' AS TableLabel, * FROM #ai_providers;
946+
SELECT N'ai_prompts' AS TableLabel, * FROM #ai_prompts;
947+
END
917948

918949
IF @AI = 1 AND NOT EXISTS(SELECT * FROM sys.all_objects WHERE name = 'sp_invoke_external_rest_endpoint')
919950
BEGIN
@@ -924,28 +955,38 @@ IF @AI > 0
924955
RAISERROR(N'@AI was set to 1, but sp_invoke_external_rest_endpoint does not exist here, so we can''t call AI services. Setting @AI to 2 instead to just generate prompts.', 0, 1) WITH NOWAIT;
925956
END
926957

958+
/* Check the providers table */
927959
IF @AIModel IS NULL
928-
/* Check the config table */
929960
SELECT TOP 1 @AIModel = AI_Model, @AIURL = AI_URL,
930961
@AICredential = AI_Database_Scoped_Credential_Name,
931-
@AISystemPrompt = AI_System_Prompt_Override,
932962
@AIParameters = AI_Parameters,
933963
@AITimeoutSeconds = COALESCE(Timeout_Seconds, 230),
934-
@AIContext = Context,
935-
@AIPayloadTemplate = Payload_Template_Override
936-
FROM #ai_configuration
964+
@AIContext = Context
965+
FROM #ai_providers
937966
WHERE DefaultModel = 1
938967
ORDER BY Id;
939968
ELSE
940-
SELECT TOP 1 @AIModel = AI_Model,
969+
SELECT TOP 1 @AIModel = AI_Model,
941970
@AIURL = COALESCE(@AIURL, AI_URL),
942971
@AICredential = COALESCE(@AICredential, AI_Database_Scoped_Credential_Name),
943-
@AISystemPrompt = AI_System_Prompt_Override,
944972
@AIParameters = AI_Parameters,
945973
@AITimeoutSeconds = COALESCE(Timeout_Seconds, 230),
946-
@AIContext = Context,
947-
@AIPayloadTemplate = Payload_Template_Override
948-
FROM #ai_configuration
974+
@AIContext = Context
975+
FROM #ai_providers
976+
ORDER BY Id;
977+
978+
/* Check the prompts table */
979+
IF @AIPromptNickname IS NULL
980+
SELECT TOP 1 @AISystemPrompt = AI_System_Prompt,
981+
@AIPayloadTemplate = Payload_Template
982+
FROM #ai_prompts
983+
WHERE DefaultPrompt = 1
984+
ORDER BY Id;
985+
ELSE
986+
SELECT TOP 1 @AISystemPrompt = AI_System_Prompt,
987+
@AIPayloadTemplate = Payload_Template
988+
FROM #ai_prompts
989+
WHERE PromptNickname = @AIPromptNickname
949990
ORDER BY Id;
950991

951992
IF @AIModel IS NULL
@@ -1003,6 +1044,12 @@ IF @AI > 0
10031044
@AISystemPrompt AS AISystemPrompt, @AIPayloadTemplate AS AIPayloadTemplate;
10041045
END;
10051046

1047+
IF @AIPromptNickname IS NOT NULL AND NOT EXISTS (SELECT 1 FROM #ai_prompts WHERE PromptNickname = @AIPromptNickname)
1048+
BEGIN
1049+
RAISERROR('@AIPromptNickname was specified but no matching prompt was found in the prompts table.',12,1);
1050+
RETURN;
1051+
END;
1052+
10061053
IF @AI = 1 AND (@AIModel IS NULL OR @AIURL IS NULL OR @AISystemPrompt IS NULL OR @AICredential IS NULL OR @AIPayloadTemplate IS NULL)
10071054
BEGIN
10081055
RAISERROR('@AI is set to 1, but not all of the necessary configuration is included.',12,1);

0 commit comments

Comments
 (0)