@@ -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);
871873END ;
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+
885893DECLARE
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+
897914IF @AIConfig IS NOT NULL
898915BEGIN
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;
906923END ;
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
909937IF @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