Forge
csharpdeeb25a2
1using System.Runtime.CompilerServices;
2
3namespace CascadeIDE.Services;
4
5/// <summary>Возвращает провайдер и модель для данного ключа (Ollama, Anthropic, OpenAI, DeepSeek).</summary>
6public delegate (IAiChatProvider? Provider, string Model) AiProviderResolver(string providerKey);
7
8/// <summary>Единая точка входа для чата: минимизация контекста (диагностики + сигнатуры) и вызов выбранного провайдера.</summary>
9public sealed class AiProviderManager
10{
11 private readonly ContextMinimizer _minimizer;
12 private readonly AiProviderResolver _resolveProvider;
13
14 public AiProviderManager(ContextMinimizer minimizer, AiProviderResolver resolveProvider)
15 {
16 _minimizer = minimizer;
17 _resolveProvider = resolveProvider;
18 }
19
20 /// <summary>Стримит ответ от выбранного провайдера. При useMinimizedContext для .cs файла подмешивает блок диагностик и сигнатур.</summary>
21 public async IAsyncEnumerable<string> StreamChatAsync(
22 string providerKey,
23 IReadOnlyList<ChatMessage> messages,
24 string? currentFilePath,
25 string? currentSourceText,
26 bool useMinimizedContext,
27 [EnumeratorCancellation] CancellationToken cancellationToken = default,
28 ChatTurnUsageCollector? usageCollector = null)
29 {
30 var (provider, model) = _resolveProvider(providerKey ?? "Ollama");
31 if (provider is null)
32 {
33 yield return "[Error: provider not configured or API key missing.]";
34 yield break;
35 }
36
37 var list = messages.AsEnumerable().ToList();
38 if (useMinimizedContext && !string.IsNullOrEmpty(currentFilePath) && !string.IsNullOrEmpty(currentSourceText))
39 {
40 var minimized = _minimizer.Minimize(currentFilePath, currentSourceText, cancellationToken);
41 if (!string.IsNullOrEmpty(minimized))
42 {
43 var contextMessage = "Контекст текущего файла (только диагностики и сигнатуры):\n\n" + minimized;
44 list = [new ChatMessage("user", contextMessage), .. list];
45 }
46 }
47
48 await foreach (var token in provider.StreamChatAsync(model, list, cancellationToken, usageCollector))
49 yield return token;
50 }
51}
52
View only · write via MCP/CIDE