You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 line
4.4KB

  1. using System.Collections.ObjectModel;
  2. using System.ComponentModel;
  3. using System.Runtime.CompilerServices;
  4. using System.Windows.Input;
  5. using System.Xml.Linq;
  6. namespace MaUI;
  7. public class ChatRoom_VM : BindableObject
  8. {
  9. // === PROPRIÉTÉS ===
  10. private string _newMessage = "";
  11. public string NewMessage
  12. {
  13. get => _newMessage;
  14. set { _newMessage = value; OnPropertyChanged(); }
  15. }
  16. public ObservableCollection<Conversation> Conversations { get; } = new();
  17. public ObservableCollection<ChatMessage> CurrentMessages { get; } = new();
  18. private Conversation? _selectedConversation;
  19. public Conversation? SelectedConversation
  20. {
  21. get => _selectedConversation;
  22. set { _selectedConversation = value; OnPropertyChanged(); }
  23. }
  24. public ObservableCollection<string> SelectedDocumentsListe { get; } = new();
  25. public List<ModelInfo> InstalledModels { get; } = new()
  26. {
  27. new ModelInfo { Name = "gemma3:12b" },
  28. new ModelInfo { Name = "llama3.1:8b" }
  29. };
  30. private ModelInfo? _selectedModel;
  31. public ModelInfo? SelectedModel
  32. {
  33. get => _selectedModel;
  34. set { _selectedModel = value; OnPropertyChanged(); }
  35. }
  36. public bool IsApiExterne { get; set; }
  37. public bool IsRAG { get; set; }
  38. public bool IsGenerateImg { get; set; }
  39. public bool IsWithAssistant { get; set; }
  40. public bool IsCODER { get; set; }
  41. // === COMMANDES ===
  42. public ICommand DeleteConversationCommand { get; }
  43. public ICommand NewConversationCommand { get; }
  44. public ICommand AddDocumentsCommand { get; }
  45. public ICommand ClearDocumentsCommand { get; }
  46. public ICommand SendMessageCommand { get; }
  47. private readonly ApiService _apiService;
  48. // === CONSTRUCTEUR ===
  49. public ChatRoom_VM()
  50. {
  51. DeleteConversationCommand = new Command(DeleteConversation);
  52. NewConversationCommand = new Command(NewConversation);
  53. AddDocumentsCommand = new Command(AddDocuments);
  54. ClearDocumentsCommand = new Command(ClearDocuments);
  55. SendMessageCommand = new Command(async () => await SendMessageAsync());
  56. _apiService = new ApiService();
  57. }
  58. // === MÉTHODES ===
  59. private async void DeleteConversation()
  60. {
  61. if (SelectedConversation != null)
  62. {
  63. Conversations.Remove(SelectedConversation);
  64. SelectedConversation = null;
  65. CurrentMessages.Clear();
  66. await Application.Current.MainPage.DisplayAlert("Info", "Conversation supprimée", "OK");
  67. }
  68. }
  69. private void NewConversation()
  70. {
  71. var conv = new Conversation { Title = $"Conversation {Conversations.Count + 1}" };
  72. Conversations.Add(conv);
  73. SelectedConversation = conv;
  74. CurrentMessages.Clear();
  75. }
  76. private async void AddDocuments()
  77. {
  78. // Ici tu pourras brancher le FilePicker MAUI
  79. var result = await FilePicker.Default.PickAsync();
  80. if (result != null)
  81. {
  82. SelectedDocumentsListe.Add(result.FullPath);
  83. }
  84. }
  85. private void ClearDocuments()
  86. {
  87. SelectedDocumentsListe.Clear();
  88. }
  89. private async Task SendMessageAsync()
  90. {
  91. if (string.IsNullOrWhiteSpace(NewMessage))
  92. return;
  93. var userMsg = new ChatMessage { Role = "user", Content = NewMessage };
  94. CurrentMessages.Add(userMsg);
  95. NewMessage = "";
  96. try
  97. {
  98. // Appel API (à brancher avec ton ApiService)
  99. var dto = new ChatRequest { Requete = userMsg.Content };
  100. var response = await _apiService.EnvoiRequete<string>(
  101. "api/ChatRoom/llm",
  102. userMsg.Content
  103. );
  104. if (response != null)
  105. {
  106. var assistantMsg = new ChatMessage { Role = "assistant", Content = response };
  107. CurrentMessages.Add(assistantMsg);
  108. }
  109. }
  110. catch (Exception ex)
  111. {
  112. await Application.Current.MainPage.DisplayAlert("Erreur", ex.Message, "OK");
  113. }
  114. }
  115. }
  116. // === CLASSES D’APPUIS ===
  117. public class Conversation
  118. {
  119. public string Title { get; set; } = "";
  120. }
  121. public class ChatMessage
  122. {
  123. public string Role { get; set; } = "";
  124. public string Content { get; set; } = "";
  125. }
  126. public class ModelInfo
  127. {
  128. public string Name { get; set; } = "";
  129. }
  130. public class ChatRequest
  131. {
  132. public string Requete { get; set; } = "";
  133. }