2025-03-19 16:30:27 +01:00
using BeWo.ServiceProxy ;
using BS.Shared.DataContracts ;
2025-04-02 16:01:21 +02:00
using BS.Shared.DataContracts.Feature.AI ;
2025-03-19 16:30:27 +01:00
using BS.Shared.Extensions ;
using ChatController.Utilities.Extensions ;
using DevExpress.Mvvm ;
using DevExpress.XtraPrinting.Native ;
using System ;
using System.Collections.Generic ;
using System.Collections.ObjectModel ;
2025-04-03 16:47:50 +02:00
using System.Diagnostics ;
2025-03-19 16:30:27 +01:00
using System.Linq ;
2025-03-28 10:05:29 +01:00
using System.Runtime.Remoting.Contexts ;
2025-03-19 16:30:27 +01:00
using System.Text ;
using System.Threading.Tasks ;
2025-04-02 16:01:21 +02:00
using System.Windows.Markup ;
2025-03-19 16:30:27 +01:00
using System.Windows.Threading ;
namespace BeWo.ViewModel.ListViewModel
{
public class AiConversationListVM : AbstractDCListMapperVM < AiConversationDC , AiConversationVM >
{
2025-03-28 10:05:29 +01:00
private string _MessageInput ;
private string _ContextInput ;
2025-03-19 16:30:27 +01:00
private AiModelDC _SelectedModel ;
2025-04-08 16:57:55 +02:00
private AiConfigVM _Config ;
2025-03-19 16:30:27 +01:00
public AiConversationListVM ( ) : this ( null )
{
2025-04-03 16:47:50 +02:00
if ( BeWoApp . IsInDesignMode )
{
InitDesigner ( ) ;
}
2025-03-19 16:30:27 +01:00
}
2025-04-03 16:47:50 +02:00
2025-03-19 16:30:27 +01:00
public AiConversationListVM ( List < AiConversationDC > pDCs ) : base ( pDCs )
{
Models = new ObservableSortCollection < AiModelDC > ( ) ;
2025-03-28 10:05:29 +01:00
SendNewMessageCommand = new DelegateCommand ( SendNewMessage , CanSendNewMessage ) ;
RequestNewConversationCommand = new DelegateCommand ( RequestNewConversation ) ;
TestCommand = new DelegateCommand ( Test ) ;
2025-04-08 16:57:55 +02:00
ReloadConfigCommand = new DelegateCommand ( ReloadConfig ) ;
ReloadConversationsCommand = new DelegateCommand ( ReloadConversations ) ;
ReloadModelsCommand = new DelegateCommand ( ReloadModels ) ;
2025-03-19 16:30:27 +01:00
}
2025-03-28 10:05:29 +01:00
public DelegateCommand SendNewMessageCommand { get ; set ; }
public DelegateCommand RequestNewConversationCommand { get ; set ; }
public DelegateCommand TestCommand { get ; set ; }
2025-04-08 16:57:55 +02:00
public DelegateCommand ReloadConfigCommand { get ; set ; }
public DelegateCommand ReloadConversationsCommand { get ; set ; }
public DelegateCommand ReloadModelsCommand { get ; set ; }
2025-03-28 10:05:29 +01:00
2025-03-19 16:30:27 +01:00
public ObservableCollection < AiModelDC > Models { get ; set ; }
2025-04-08 16:57:55 +02:00
public AiModelDC SelectedModel
{
get { return _SelectedModel ; }
2025-03-19 16:30:27 +01:00
set
{
if ( _SelectedModel = = value )
return ;
_SelectedModel = value ;
FirePropertyChanged ( nameof ( SelectedModel ) ) ;
}
}
2025-04-08 16:57:55 +02:00
public AiConfigVM Config
{
get { return _Config ; }
set
{
if ( Config = = value )
return ;
_Config = value ;
FirePropertyChanged ( nameof ( Config ) ) ;
}
}
2025-04-02 16:01:21 +02:00
2025-03-28 10:05:29 +01:00
public string MessageInput
{
get { return _MessageInput ; }
set
{
if ( MessageInput = = value )
return ;
_MessageInput = value ;
FirePropertyChanged ( nameof ( MessageInput ) ) ;
}
}
public string ContextInput
{
get { return _ContextInput ; }
set
{
if ( ContextInput = = value )
return ;
_ContextInput = value ;
FirePropertyChanged ( nameof ( ContextInput ) ) ;
}
}
2025-04-02 16:01:21 +02:00
public int UIContext { get ; set ; }
public List < Tuple < long , long > > ContextBeWoObjects { get ; set ; }
public void RequestNewConversation ( )
{
2025-04-08 16:57:55 +02:00
ServiceFacade . DoOperationsEnhancedServiceAsnyc ( x = > x . CreateAiConversation ( UIContext , Config . SelectedModel . Oid . Value , ContextBeWoObjects ) , dc = > {
2025-04-02 16:01:21 +02:00
var vm = new AiConversationVM ( dc ) ;
VMList . Insert ( 0 , vm ) ;
2025-04-03 16:47:50 +02:00
SelectedVM = vm ;
2025-04-02 16:01:21 +02:00
} , true , null ) ;
}
2025-03-28 10:05:29 +01:00
public void SendNewMessage ( )
{
2025-04-02 16:01:21 +02:00
var conv = SelectedVM ;
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
var msg_dc = new AiConversationMessageDC ( ) ;
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
msg_dc . Message = MessageInput ;
msg_dc . Role = BS . Shared . AiConversationMessageRole . User ;
msg_dc . Created = DateTime . Now ;
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
var msg_vm = new AiConversationMessageVM ( msg_dc ) ;
conv . Messages . VMList . Add ( msg_vm ) ;
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
ServiceFacade . DoOperationsEnhancedServiceAsnyc ( x = > x . SendNewMessage ( conv . DataContract . Oid . Value , MessageInput ) , ( messages ) = >
{
if ( messages . Count ! = 2 )
throw new InvalidOperationException ( "message count: " + messages . Count ) ;
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
msg_vm . DataContract = messages [ 0 ] ;
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
conv . Messages . VMList . Add ( new AiConversationMessageVM ( messages [ 1 ] ) ) ;
} ) ;
2025-03-28 10:05:29 +01:00
}
public void Test ( )
{
2025-04-02 16:01:21 +02:00
throw new NotImplementedException ( ) ;
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
//var limit = 5;
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
//var models = ServiceFacade.DoOperationsEnhancedServiceSnyc(x => x.GetAiModels());
//Models.MakeEqualTo(models);
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
//VMList.Clear();
//foreach (var vm in Models)
//{
// var dc = new AiConversationDC();
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
// dc.Created = DateTime.Now;
// dc.Displayname = "Example";
// dc.Modell = vm.ToString();
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
// var pvm = new AiConversationVM(dc);
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
// VMList.Add(pvm);
//}
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
//var msg = "Wie alt ist Frau Müller?";
//var context = "Frau Müller wurde am 1.1.1950 geboren. Aktuelle haben wir folgende Universalzeit: " + DateTime.Now.ToUniversalTime();
2025-03-28 10:05:29 +01:00
2025-04-02 16:01:21 +02:00
//for (var i = 0; i < limit; i++)
//{
// foreach (var vm in VMList)
// {
// ServiceFacade.DoOperationsEnhancedServiceAsnyc(x => x.SendNewMessage(vm.CommitToDataContract(), context, msg), (message) =>
// {
// vm.Messages.VMList.Add(new AiConversationMessageVM(message));
// });
// }
//}
2025-03-28 10:05:29 +01:00
}
2025-04-08 16:57:55 +02:00
private void ReloadConfig ( )
{
ServiceFacade . DoOperationsEnhancedServiceAsnyc ( x = > x . GetAiConfig ( ) , ( x ) = >
{
if ( Config is null )
Config = new AiConfigVM ( x ) ;
else
Config . Update ( x ) ;
} ) ;
}
public void UpdateConfig ( )
{
if ( ! Config . IsDirty )
return ;
ServiceFacade . DoOperationsEnhancedServiceAsnyc ( x = > x . UpdateAiConfig ( Config . CommitToDataContract ( ) ) , ( x ) = >
{
Config . Update ( x ) ;
} ) ;
}
private void ReloadModels ( )
{
ServiceFacade . DoOperationsEnhancedServiceAsnyc ( x = > x . GetAiModels ( ) , ( x ) = >
{
Models . MakeEqualTo ( x ) ;
if ( Config . SelectedModel is null & & Models . Any ( ) )
Config . SelectedModel = Models . First ( ) ;
} ) ;
}
private void ReloadConversations ( )
{
var ui_context = UIContext ;
ServiceFacade . DoOperationsEnhancedServiceAsnyc ( x = > x . GetAiConversations ( ui_context ) , ( x ) = >
{
x . Reverse ( ) ;
var vms = new AiConversationListVM ( x ) ;
VMList . MakeEqualTo ( vms . VMList ) ;
} ) ;
}
2025-03-28 10:05:29 +01:00
private bool CanSendNewMessage ( )
{
return SelectedVM is object ;
}
2025-04-03 16:47:50 +02:00
2025-04-08 16:57:55 +02:00
#region Designer
2025-04-03 16:47:50 +02:00
private void InitDesigner ( )
{
2025-04-08 12:58:12 +02:00
var model = new AiModelDC ( )
{
ModelName = "A llama3.2"
} ;
2025-04-03 16:47:50 +02:00
var message_dc = new AiConversationMessageDC ( )
{
Created = DateTime . Now ,
2025-04-08 10:22:22 +02:00
Message = "Du bist eine intelligente Einheit mit ganz ganz vielen Eingaben: value1, value2, value3, value4\r\nTest" ,
2025-04-03 16:47:50 +02:00
Role = BS . Shared . AiConversationMessageRole . System
} ;
var message_dc2 = new AiConversationMessageDC ( )
{
Created = DateTime . Now ,
2025-04-08 10:22:22 +02:00
Message = "Dies ist eine Design Frage: Du sollst ganz viele Sachen machen. Dabei sollst du auf ganz viele Sachen achten: Zum Beispiel:\r\nSache 1\r\nSchritt 2" ,
2025-04-03 16:47:50 +02:00
Role = BS . Shared . AiConversationMessageRole . User
} ;
var message_dc3 = new AiConversationMessageDC ( )
{
Created = DateTime . Now ,
2025-04-08 10:22:22 +02:00
Message = "Antwort. Dies ist eine Design Antwort. Du hast ganz viele Sachen angefragt. Dabei soll ich auf ganz viele Sachen achten. Wie Test, test, tEst und tesT.\r\nTest\r\nTest\r\nTest" ,
2025-04-08 12:58:12 +02:00
Role = BS . Shared . AiConversationMessageRole . Assistent ,
ModelName = model . ModelName ,
Duration = 10 ,
2025-04-03 16:47:50 +02:00
} ;
var messages_dc = new List < AiConversationMessageDC > ( )
{
message_dc ,
message_dc2 ,
2025-04-08 12:58:12 +02:00
message_dc3 ,
message_dc2 ,
message_dc3 ,
message_dc2 ,
message_dc3 ,
message_dc2 ,
message_dc3 ,
2025-04-03 16:47:50 +02:00
} ;
2025-04-08 12:58:12 +02:00
2025-04-03 16:47:50 +02:00
var conversation_dc = new AiConversationDC ( )
{
Created = DateTime . Now ,
2025-04-08 10:22:22 +02:00
Displayname = "Displayname Megamegalange Deluxe Op 3000" ,
2025-04-03 16:47:50 +02:00
Messages = messages_dc ,
Modell = model ,
UIContext = 19 ,
Updated = DateTime . Now ,
} ;
var conversation_vm = new AiConversationVM ( conversation_dc ) ;
VMList . Add ( conversation_vm ) ;
2025-04-08 10:22:22 +02:00
InitDummyConversations ( 10 ) ;
2025-04-03 16:47:50 +02:00
SelectedVM = conversation_vm ;
}
2025-04-08 10:22:22 +02:00
private void InitDummyConversations ( int count )
{
var model = new AiModelDC ( )
{
ModelName = "llama3.2"
} ;
for ( int i = 0 ; i < count ; i + + )
{
var conversation_dc2 = new AiConversationDC ( )
{
Created = DateTime . Now ,
Displayname = "Dummy Num " + i . ToString ( ) ,
Modell = model ,
UIContext = 19 ,
Updated = DateTime . Now ,
} ;
var conversation_vm2 = new AiConversationVM ( conversation_dc2 ) ;
VMList . Add ( conversation_vm2 ) ;
}
}
2025-04-08 16:57:55 +02:00
#endregion
2025-03-19 16:30:27 +01:00
}
}