aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
Diffstat (limited to 'Software')
-rw-r--r--Software/Visual_Studio_22/Tango.Portal.Chat.Web/Controllers/ChatController.cs36
-rw-r--r--Software/Visual_Studio_22/Tango.Portal.Chat.Web/Models/Contracts.cs2
-rw-r--r--Software/Visual_Studio_22/Tango.Portal.Chat.Web/Services/LlmClient.cs7
-rw-r--r--Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.Development.json2
-rw-r--r--Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.json4
5 files changed, 34 insertions, 17 deletions
diff --git a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Controllers/ChatController.cs b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Controllers/ChatController.cs
index da91d31e0..a13b6a47a 100644
--- a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Controllers/ChatController.cs
+++ b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Controllers/ChatController.cs
@@ -19,7 +19,6 @@ namespace Tango.Portal.Chat.Web.Controllers
private readonly KqlGuard _guard;
private readonly KustoQueryService _adx;
private readonly LlmClient _llm;
- private static readonly string[] AllowTables = new[] { "JobRunsTable", "JobStatusTable", "TelemetryTable", "MachinesTable" };
public ChatController(SchemaRegistry schema, KqlGuard guard, KustoQueryService adx, LlmClient llm)
{
@@ -30,7 +29,7 @@ namespace Tango.Portal.Chat.Web.Controllers
}
[HttpPost("ask")]
- public async Task<ActionResult<ChatResponse>> Ask([FromBody] ChatRequest req, CancellationToken ct)
+ public async Task<ActionResult<ChatResponse>> Ask([FromBody] ChatRequest req, CancellationToken ct, LlmProvider? provider = null)
{
try
{
@@ -39,13 +38,19 @@ namespace Tango.Portal.Chat.Web.Controllers
var plotySample = _schema.GetPlotySample();
// 1) Ask the model for KQL
- var plan = await _llm.ProposeKqlAsync(plannerPrompt, plotySample, req.Question, schemaJson, req.History, ct);
- if (plan.Assistant == "data")
+ ProposeKqlResult? plan = null;
+
+ if (provider == LlmProvider.Claude)
{
- return await AnswerWithDataAssistant(req, plan, ct);
+ plan = await _llm.ProposeKqlWithClaudeAsync(plannerPrompt, plotySample, req.Question, schemaJson, req.History, ct);
+ }
+ else
+ {
+ plan = await _llm.ProposeKqlAsync(plannerPrompt, plotySample, req.Question, schemaJson, req.History, ct);
}
- else if (plan.Assistant == "ploty")
+
+ if (plan.Assistant == "data" || plan.Assistant == "ploty")
{
return await AnswerWithDataAssistant(req, plan, ct);
}
@@ -118,13 +123,20 @@ namespace Tango.Portal.Chat.Web.Controllers
}
catch (Exception ex)
{
- // Return error to the client so they can iterate
- return new ChatResponse
+ if (plan.Provider == LlmProvider.OpenAI)
{
- Answer = $"Seems like my kusto query ran into some issue..\n{ex.Message}",
- ThreadId = req.ThreadId,
- UsedKql = plan.Kql
- };
+ return await Ask(req, ct, LlmProvider.Claude);
+ }
+ else
+ {
+ // Return error to the client so they can iterate
+ return new ChatResponse
+ {
+ Answer = $"Seems like my kusto query ran into some issue..\n{ex.Message}",
+ ThreadId = req.ThreadId,
+ UsedKql = plan.Kql
+ };
+ }
}
if (table.Columns.Contains("ploty") && table.Rows.Count > 0)
diff --git a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Models/Contracts.cs b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Models/Contracts.cs
index 413583f2f..d044de7b9 100644
--- a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Models/Contracts.cs
+++ b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Models/Contracts.cs
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
+using Tango.Portal.Chat.Web.Services;
namespace Tango.Portal.Chat.Web.Models
{
@@ -27,6 +28,7 @@ namespace Tango.Portal.Chat.Web.Models
[JsonPropertyName("conversation")]
public string ConversationAnswer { get; set; } = String.Empty;
+ public LlmProvider Provider { get; set; }
}
public sealed class ChatMessage
diff --git a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Services/LlmClient.cs b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Services/LlmClient.cs
index 7b2d8c3ef..fb34c183b 100644
--- a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Services/LlmClient.cs
+++ b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/Services/LlmClient.cs
@@ -34,12 +34,15 @@ namespace Tango.Portal.Chat.Web.Services
public async Task<ProposeKqlResult> ProposeKqlAsync(String plannerPrompt, String plotySample,
string question, string schemaJson, IEnumerable<ChatMessage>? history, CancellationToken ct = default)
{
- return _opt.Provider switch
+ var plan = _opt.Provider switch
{
LlmProvider.Claude => await ProposeKqlWithClaudeAsync(plannerPrompt, plotySample, question, schemaJson, history, ct),
LlmProvider.OpenAI => await ProposeKqlWithOpenAIAsync(plannerPrompt, plotySample, question, schemaJson, history, ct),
_ => await ProposeKqlWithOpenAIAsync(plannerPrompt, plotySample, question, schemaJson, history, ct) // Default to OpenAI
};
+
+ plan.Provider = _opt.Provider;
+ return plan;
}
private async Task<ProposeKqlResult> ProposeKqlWithOpenAIAsync(String plannerPrompt, String plotySample,
@@ -84,7 +87,7 @@ namespace Tango.Portal.Chat.Web.Services
return result;
}
- private async Task<ProposeKqlResult> ProposeKqlWithClaudeAsync(String plannerPrompt, String plotySample,
+ public async Task<ProposeKqlResult> ProposeKqlWithClaudeAsync(String plannerPrompt, String plotySample,
string question, string schemaJson, IEnumerable<ChatMessage>? history, CancellationToken ct)
{
var messages = new List<object>();
diff --git a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.Development.json b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.Development.json
index 62f61e974..b5e4ef0fd 100644
--- a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.Development.json
+++ b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.Development.json
@@ -1,6 +1,6 @@
{
"OpenAI": {
- "Provider": "Claude",
+ "Provider": "OpenAI",
"Endpoint": "https://api.openai.com/v1/chat/completions",
"ApiKey": "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",
"Model": "gpt-4o",
diff --git a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.json b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.json
index 4ea92d050..70f38ae11 100644
--- a/Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.json
+++ b/Software/Visual_Studio_22/Tango.Portal.Chat.Web/appsettings.json
@@ -14,9 +14,9 @@
"AnswererAssistantId": "asst_JRKGFqWUYG2rP6CptUgyVcJk",
"DocsAssistantId": "asst_HQ0C8tsdtzjENITM4qq6kFpz",
"ClaudeApiKey": "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",
- "ClaudeModel": "claude-3-5-sonnet-4",
+ "ClaudeModel": "claude-sonnet-4-20250514",
"ClaudeEndpoint": "https://api.anthropic.com/v1/messages",
- "MaxTokens": 4000
+ "MaxTokens": 10000
},
"ADX": {
"ClusterUri": "https://adx-twine.westeurope.kusto.windows.net/",