Forge
csharpdeeb25a2
1using CommunityToolkit.Mvvm.ComponentModel;
2
3namespace CascadeIDE.ViewModels;
4
5/// <summary>Часть <see cref="MainWindowViewModel.ShellState"/>: режим ИИ и облачные ключи привязаны к нижнему приложению/чату.</summary>
6public partial class MainWindowViewModel
7{
8 /// <summary>ADR 0083: <c>local</c> | <c>acp</c> | <c>mcp_only</c> | <c>cloud</c>.</summary>
9 [ObservableProperty]
10 [NotifyPropertyChangedFor(nameof(ActiveAiProvider))]
11 [NotifyPropertyChangedFor(nameof(ChatMcpOnly))]
12 [NotifyPropertyChangedFor(nameof(IsOllamaSelected))]
13 [NotifyPropertyChangedFor(nameof(IsAnthropicSelected))]
14 [NotifyPropertyChangedFor(nameof(IsOpenAiSelected))]
15 [NotifyPropertyChangedFor(nameof(IsDeepSeekSelected))]
16 [NotifyPropertyChangedFor(nameof(IsCursorAcpSelected))]
17 [NotifyPropertyChangedFor(nameof(CurrentModelDisplay))]
18 [NotifyPropertyChangedFor(nameof(IsAiCloudMode))]
19 private string _aiMode = "local";
20
21 /// <summary>Для <c>mode = cloud</c>: <c>anthropic</c> | <c>openai</c> | <c>deepseek</c>.</summary>
22 [ObservableProperty]
23 [NotifyPropertyChangedFor(nameof(ActiveAiProvider))]
24 [NotifyPropertyChangedFor(nameof(IsAnthropicSelected))]
25 [NotifyPropertyChangedFor(nameof(IsOpenAiSelected))]
26 [NotifyPropertyChangedFor(nameof(IsDeepSeekSelected))]
27 [NotifyPropertyChangedFor(nameof(CurrentModelDisplay))]
28 private string _cloudActiveProvider = "anthropic";
29
30 /// <summary>Совместимость с чатом и <see cref="ResolveProvider"/> — вывод из <c>mode</c> и облака.</summary>
31 public string ActiveAiProvider => _settings.Ai.ResolveEffectiveProviderUiKey();
32
33 public bool ChatMcpOnly => string.Equals(AiMode, "mcp_only", StringComparison.OrdinalIgnoreCase);
34
35 public bool IsOllamaSelected =>
36 string.Equals(AiMode, "local", StringComparison.OrdinalIgnoreCase)
37 && string.Equals(_settings.Ai.Local.Backend, "ollama", StringComparison.OrdinalIgnoreCase);
38
39 public bool IsAnthropicSelected =>
40 string.Equals(AiMode, "cloud", StringComparison.OrdinalIgnoreCase)
41 && string.Equals(CloudActiveProvider, "anthropic", StringComparison.OrdinalIgnoreCase);
42
43 public bool IsOpenAiSelected =>
44 string.Equals(AiMode, "cloud", StringComparison.OrdinalIgnoreCase)
45 && string.Equals(CloudActiveProvider, "openai", StringComparison.OrdinalIgnoreCase);
46
47 public bool IsDeepSeekSelected =>
48 string.Equals(AiMode, "cloud", StringComparison.OrdinalIgnoreCase)
49 && string.Equals(CloudActiveProvider, "deepseek", StringComparison.OrdinalIgnoreCase);
50
51 public bool IsCursorAcpSelected => string.Equals(AiMode, "acp", StringComparison.OrdinalIgnoreCase);
52
53 public bool IsAiCloudMode => string.Equals(AiMode, "cloud", StringComparison.OrdinalIgnoreCase);
54
55 /// <summary>Отображаемое имя модели (для облачных — из настроек).</summary>
56 public string CurrentModelDisplay => ActiveAiProvider switch
57 {
58 "Anthropic" => _settings.Ai.Cloud.Anthropic.Model,
59 "OpenAI" => _settings.Ai.Cloud.OpenAi.Model,
60 "DeepSeek" => _settings.Ai.Cloud.DeepSeek.Model,
61 "CursorACP" => "Cursor ACP",
62 _ => SelectedOllamaModel ?? _settings.Ai.Local.Ollama.Model ?? ""
63 };
64
65 [ObservableProperty]
66 private string _anthropicApiKey = "";
67
68 [ObservableProperty]
69 private string _openAiApiKey = "";
70
71 [ObservableProperty]
72 private string _deepSeekApiKey = "";
73}
74
View only · write via MCP/CIDE