Files
Vision/VisionAsist/Models/Selector.cs
Egor ae0994409a
Some checks failed
Mirror to Gitea / git-sync (push) Has been cancelled
Yess
2026-03-28 00:26:55 +02:00

116 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Threading.Tasks;
using System.Linq;
namespace VisionAsist.Models;
public class Selector
{
private static List<OllamaMessage> _chatHistory = new();
public static string CurrentModel = "qwen3.5:4b";
public static event Action<string>? OnLogUpdate;
private static void UpdateUI(string text) => OnLogUpdate?.Invoke(text);
public static async Task<string> selector(string text)
{
try
{
UpdateUI($"\n[Вы]: {text}\n");
_chatHistory.Add(new OllamaMessage { role = "user", content = text });
while (true)
{
string toolsJson = Core.GetToolsManifestJson();
string fullContent = "";
string toolCallsRaw = "";
bool isThinking = false;
bool hasStartedContent = false;
UpdateUI("\n[ИИ]: ");
await foreach (var line in OllamaService.SendChatStreamAsync(CurrentModel, _chatHistory, toolsJson))
{
using var doc = JsonDocument.Parse(line);
var root = doc.RootElement;
if (!root.TryGetProperty("message", out var message)) continue;
// 1. ОБРАБОТКА 'thinking' (если есть в этом чанке)
if (message.TryGetProperty("thinking", out var thinkingEl))
{
string thinkPart = thinkingEl.GetString() ?? "";
if (!string.IsNullOrEmpty(thinkPart))
{
if (!isThinking)
{
UpdateUI("\n[Мысли]: ");
isThinking = true;
}
UpdateUI(thinkPart);
}
}
// 2. ОБРАБОТКА 'content' (если есть в этом чанке)
if (message.TryGetProperty("content", out var contentEl))
{
string part = contentEl.GetString() ?? "";
if (!string.IsNullOrEmpty(part))
{
// Если мы только что "думали", переключаемся на ответ
if (isThinking)
{
isThinking = false;
hasStartedContent = true;
UpdateUI("\n[Ответ]: ");
}
else if (!hasStartedContent && !string.IsNullOrWhiteSpace(part))
{
UpdateUI("\n[Ответ]: ");
hasStartedContent = true;
}
fullContent += part;
UpdateUI(part);
}
}
// 3. ОБРАБОТКА 'tool_calls' (если есть в этом чанке)
if (message.TryGetProperty("tool_calls", out var toolsEl))
{
toolCallsRaw = toolsEl.GetRawText();
}
}
_chatHistory.Add(new OllamaMessage { role = "assistant", content = fullContent });
// 4. ВЫПОЛНЕНИЕ ИНСТРУМЕНТОВ (после завершения стрима)
if (!string.IsNullOrEmpty(toolCallsRaw))
{
using var toolDoc = JsonDocument.Parse(toolCallsRaw);
foreach (var call in toolDoc.RootElement.EnumerateArray())
{
string toolName = call.GetProperty("function").GetProperty("name").GetString() ?? "";
string argsJson = call.GetProperty("function").GetProperty("arguments").GetRawText();
UpdateUI($"\n\n[ДЕЙСТВИЕ]: {toolName}\n[АРГУМЕНТЫ]: {argsJson}");
string result = Core.CallTool(toolName, argsJson);
UpdateUI($"\n[РЕЗУЛЬТАТ]: {result}\n");
_chatHistory.Add(new OllamaMessage { role = "tool", content = result });
}
continue; // Снова к ИИ с результатами инструментов
}
return fullContent;
}
}
catch (Exception ex)
{
UpdateUI($"\n[ОШИБКА]: {ex.Message}");
return ex.Message;
}
}
public static void ClearHistory() => _chatHistory.Clear();
}