diff options
| author | Roy Ben Shabat <roy.mail.net@gmail.com> | 2025-09-04 14:45:35 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <roy.mail.net@gmail.com> | 2025-09-04 14:45:35 +0300 |
| commit | da102bf068b5a0734008cc576a20aef97ae0495b (patch) | |
| tree | 4a7a5c3ddf4ec725f744aa931c6166409d3e5bea /Software | |
| parent | 72d2d9316e27f623456574dd854da064611254a1 (diff) | |
| download | Tango-da102bf068b5a0734008cc576a20aef97ae0495b.tar.gz Tango-da102bf068b5a0734008cc576a20aef97ae0495b.zip | |
OpenAI query fallback to Claude.
Diffstat (limited to 'Software')
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/", |
