From 16b3f5455a358d28c24b9dbe8603dd23e80b48ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Van=20Canneyt?= Date: Sat, 4 Jan 2025 15:37:32 +0100 Subject: [PATCH] * AI assistant functonality for Lazarus --- components/aissist/Readme.md | 34 + components/aissist/api/aiclient.pas | 617 ++++++++++ components/aissist/api/aissist.lpk | 40 + components/aissist/api/aissist.pas | 21 + components/aissist/api/fpasyncwebclient.pas | 117 ++ components/aissist/api/janai/janai.lpk | 42 + components/aissist/api/janai/janai.pas | 21 + components/aissist/api/janai/janai_v1.pas | 1008 +++++++++++++++++ .../aissist/api/janai/janaiprotocol.pas | 137 +++ .../aissist/demos/console/testaissist.lpi | 61 + .../aissist/demos/console/testaissist.lpr | 94 ++ components/aissist/demos/gui/frmmain.lfm | 162 +++ components/aissist/demos/gui/frmmain.pas | 225 ++++ components/aissist/demos/gui/uiassist.ico | Bin 0 -> 133345 bytes components/aissist/demos/gui/uiassist.lpi | 84 ++ components/aissist/demos/gui/uiassist.lpr | 26 + components/aissist/demos/gui/uiassist.res | Bin 0 -> 135460 bytes components/aissist/ide/aissistcontroller.pas | 168 +++ components/aissist/ide/fraaissistconfig.lfm | 146 +++ components/aissist/ide/fraaissistconfig.pas | 173 +++ components/aissist/ide/frmaissistchat.lfm | 85 ++ components/aissist/ide/frmaissistchat.pas | 209 ++++ components/aissist/ide/frmaixplain.lfm | 121 ++ components/aissist/ide/frmaixplain.pas | 198 ++++ components/aissist/ide/laz_aissist.lpk | 71 ++ components/aissist/ide/laz_aissist.pas | 22 + components/aissist/ide/reglazaissist.pas | 122 ++ components/aissist/ide/straissist.pas | 57 + components/aissist/lazaissist.lpg | 26 + 29 files changed, 4087 insertions(+) create mode 100644 components/aissist/Readme.md create mode 100644 components/aissist/api/aiclient.pas create mode 100644 components/aissist/api/aissist.lpk create mode 100644 components/aissist/api/aissist.pas create mode 100644 components/aissist/api/fpasyncwebclient.pas create mode 100644 components/aissist/api/janai/janai.lpk create mode 100644 components/aissist/api/janai/janai.pas create mode 100644 components/aissist/api/janai/janai_v1.pas create mode 100644 components/aissist/api/janai/janaiprotocol.pas create mode 100644 components/aissist/demos/console/testaissist.lpi create mode 100644 components/aissist/demos/console/testaissist.lpr create mode 100644 components/aissist/demos/gui/frmmain.lfm create mode 100644 components/aissist/demos/gui/frmmain.pas create mode 100644 components/aissist/demos/gui/uiassist.ico create mode 100644 components/aissist/demos/gui/uiassist.lpi create mode 100644 components/aissist/demos/gui/uiassist.lpr create mode 100644 components/aissist/demos/gui/uiassist.res create mode 100644 components/aissist/ide/aissistcontroller.pas create mode 100644 components/aissist/ide/fraaissistconfig.lfm create mode 100644 components/aissist/ide/fraaissistconfig.pas create mode 100644 components/aissist/ide/frmaissistchat.lfm create mode 100644 components/aissist/ide/frmaissistchat.pas create mode 100644 components/aissist/ide/frmaixplain.lfm create mode 100644 components/aissist/ide/frmaixplain.pas create mode 100644 components/aissist/ide/laz_aissist.lpk create mode 100644 components/aissist/ide/laz_aissist.pas create mode 100644 components/aissist/ide/reglazaissist.pas create mode 100644 components/aissist/ide/straissist.pas create mode 100644 components/aissist/lazaissist.lpg diff --git a/components/aissist/Readme.md b/components/aissist/Readme.md new file mode 100644 index 0000000000..dc02442f45 --- /dev/null +++ b/components/aissist/Readme.md @@ -0,0 +1,34 @@ +# Lazarus AI assistant - AIssist + +This directory contains an implementation of a Lazarus AI assistent. +There are several directories and packages. + +To install, install the following packages in the correct order: + +- In the components/chatcontrol directory, install the lazchatctrl package. + This package contains the lazarus chat controls, needed in some of the + forms and demos. + +- Install the aissist package in the api dir. + This package contains an abstract 'AI assistant' client. It relies on API + providers to implement actual APIs + +- Install the janai package in the api/janai dir + This package contains a Jan AI API. It is compatible to the ChatGPT API, + and should be usable for communicating with ChatGPT. (but you need a + license key) + +- Install the laz_aissist package. + This package contains the actual integration of the AI client in the Lazarus IDE. + It registers the following things: + - a menu entry in the 'View' menu called 'AIssist chat'. + - A settings page in the tools - options menu: the 'AI Assistant options' page. + Here you must set : + - The protocol to use (currently only the JanAI/ChatGPT API is supported) + - The URL where the AI requests must be sent + - The model you wish to use. + - The maximum lengt of the AI replies + +The Demos directory contains a console and GUI demo of the AIClient class. +They serve to demonstrate the API and can be used separately from the IDE. + diff --git a/components/aissist/api/aiclient.pas b/components/aissist/api/aiclient.pas new file mode 100644 index 0000000000..aa5feb5e0c --- /dev/null +++ b/components/aissist/api/aiclient.pas @@ -0,0 +1,617 @@ +{ + This file is part of the Free Component Library (FCL) + Copyright (c) 2024 by Michael Van Canneyt + + AI server communication implementation + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit AIClient; + +{$mode objfpc}{$H+} +{$modeswitch advancedrecords} + +interface + +uses + Classes, SysUtils, fpjson, fpwebclient, fpasyncwebclient; + +Type + EAIServer = Class(Exception); + { TAIServerSettings } + + TAIServerSettings = class(TPersistent) + private + FBaseURL: String; + FDefaultMaxLength: Integer; + FDefaultModel: String; + FOnProtocolChange: TNotifyEvent; + FProtocol: String; + procedure SetBaseURL(AValue: String); + procedure SetProtocol(AValue: String); + protected + Property OnProtocolChange : TNotifyEvent Read FOnProtocolChange Write FOnProtocolChange; + public + procedure Assign(Source: TPersistent); override; + Published + Property BaseURL : String Read FBaseURL Write SetBaseURL; + Property DefaultModel : String Read FDefaultModel Write FDefaultModel; + Property DefaultMaxLength : Integer Read FDefaultMaxLength Write FDefaultMaxLength; + Property Protocol : String Read FProtocol Write SetProtocol; + end; + + TModelData = Record + // Just ID and Human-readable name for the time being + ID : String; // To be used as model identifier in prompts. + Name : string; + end; + TModelDataArray = Array of TModelData; + + TPromptResponse = record + // For now only response text ? + Response : string; + end; + TPromptResponseArray = Array of TPromptResponse; + + TAIRequestErrorData = record + Error : String; + ErrorClass : String; + Method : String; + URL : String; + RequestBody : String; + end; + + TModelsResponseCallBack = Procedure (Sender : TObject; aModels : TModelDataArray) of object; + TPromptResponseCallBack = Procedure (Sender : TObject; aResponses : TPromptResponseArray) of object; + TAIRequestErrorHandler = procedure (Sender : TObject; aErrorData : TAIRequestErrorData) of object; + + TCustomAIClient = Class; + TAIProtocol = Class; + + TAiUrl = (auListModels,auPrompt); + TAiUrls = Set of TAiUrl; + + { TAIProtocol } + + TAIProtocol = Class(TObject) + private + FClient: TCustomAIClient; + public + constructor Create(aClient : TCustomAIClient); virtual; + // Convert responses to user data + Function ResponseToModels(aResponse : TJSONData; out Models: TModelDataArray) : boolean; virtual; abstract; + Function ResponseToPromptResponses(aResponse : TJSONData; out Responses: TPromptResponseArray) : boolean; virtual; abstract; + function CreatePromptRequest(const aModel,aPrompt : string; aMaxResponseLength : Cardinal) : TJSONData; virtual; abstract; + // All URLS are relative to the base URL, they MUST NOT start with / + function GetAIURL(aURL : TAiUrl) : String; virtual; abstract; + class function protocolname : string; virtual; + class function DefaultURL : String; virtual; + property Client : TCustomAIClient Read FClient; + end; + TAIProtocolClass = Class of TAIProtocol; + + { TCustomAIClient } + + TCustomAIClient = class(TComponent) + Private type + THTTPRequestResponse = Record + Response : TWebClientResponse; + UserCallbackMethod : TMethod; + end; + THTTPResultHandler = procedure (const aResponse : THTTPRequestResponse) of object; + class var + _protocols : Array of TAIProtocolClass; + _protocolcount : integer; + class function IndexOfProtocol(const aName: string): Integer; + private + FOnError: TAIRequestErrorHandler; + FProtocol: TAIProtocol; + FSettings: TAIServerSettings; + FSynchronizeCallBacks: Boolean; + FWebClient : TAbstractWebClient; + procedure ProtocolChange(Sender: TObject); + procedure SetSettings(AValue: TAIServerSettings); + Protected + procedure CheckProtocol; + procedure CheckServerURL; + function CreateSettings : TAIServerSettings; virtual; + // Async response handling + procedure HandleModelsResponse(const aResponse: THTTPRequestResponse); + procedure HandlePromptResponse(const aResponse: THTTPRequestResponse); + Property Protocol : TAIProtocol Read FProtocol; + // HTTP Request handling + procedure ErrorHandler(aException: Exception; aContext : TAsyncRequestContext); + procedure ServerRequest(const aMethod, aURL: String; aResultHandler: THTTPResultHandler; aUserCallback: TMethod); + procedure ServerDataRequest(const aMethod, aURL: String; aJSON: TJSONData; aResultHandler: THTTPResultHandler; aUserCallback: TMethod); + // Protocol management + Public + class Procedure RegisterAIProtocol(aClass : TAIProtocolClass); + class Procedure UnRegisterAIProtocol(const aProtocol : String); + class function GetProtocolClass(const aName : string) : TAIProtocolClass; + class function FindProtocolClass(const aName: string): TAIProtocolClass; + class function GetProtocolList(aList : TStrings) : Integer; + public + constructor Create(aOwner : TComponent); override; + destructor Destroy; override; + + // Get a list of available model descriptions + procedure GetModels(aCallBack : TModelsResponseCallBack); + // Send a prompt to the AI. + procedure SendPrompt(aCallBack: TPromptResponseCallBack; const aPrompt: string; aModel : String = ''; aMaxLength: Cardinal = 0); + // AI server settings + property Settings : TAIServerSettings Read FSettings Write SetSettings; + // Should callbacks be executed in the main thread ? + property SynchronizeCallBacks : Boolean Read FSynchronizeCallBacks Write FSynchronizeCallBacks; + // Error handler + property OnError : TAIRequestErrorHandler Read FOnError Write FOnError; + end; + + TAIClient = Class(TCustomAIClient) + property Settings; + property OnError; + end; + +Procedure RegisterAIProtocol(aClass : TAIProtocolClass); + +implementation + +uses httpprotocol, fphttpwebclient; + +Type + + { TAIRequestData } + + TAIRequestData = Class(TAsyncRequestData) + UserCallbackMethod : TMethod; + ResultHandler : TCustomAIClient.THTTPResultHandler; + procedure HandleWebResponse(aResponse: TWebClientResponse; aUserData: TObject); + end; + +procedure RegisterAIProtocol(aClass: TAIProtocolClass); +begin + TCustomAIClient.RegisterAIProtocol(aClass); +end; + +{ TAIServerSettings } + +procedure TAIServerSettings.SetBaseURL(AValue: String); +begin + if FBaseURL=AValue then Exit; + FBaseURL:=AValue; + if FBaseURL<>'' then + FBaseURL:=IncludeHTTPPathDelimiter(FBaseURL); +end; + +procedure TAIServerSettings.SetProtocol(AValue: String); +begin + if FProtocol=AValue then Exit; + FProtocol:=AValue; + If Assigned(FOnProtocolChange) then + FOnProtocolChange(Self); +end; + +procedure TAIServerSettings.Assign(Source: TPersistent); +var + aSource: TAIServerSettings absolute Source; +begin + if Source is TAIServerSettings then + begin + FDefaultModel:=aSource.FDefaultModel; + FDefaultMaxLength:=aSource.FDefaultMaxLength; + FBaseURL:=aSource.BaseURL; + Protocol:=aSource.FProtocol; // trigger onchange + end else + inherited Assign(Source); +end; + +{ TAIProtocol } + +constructor TAIProtocol.Create(aClient: TCustomAIClient); +begin + FClient:=aClient; +end; + +class function TAIProtocol.protocolname: string; +begin + Result:=ClassName; +end; + +class function TAIProtocol.DefaultURL: String; +begin + Result:=''; +end; + +{ TCustomAIClient } + +procedure TCustomAIClient.SetSettings(AValue: TAIServerSettings); +begin + if FSettings=AValue then Exit; + FSettings.Assign(AValue); +end; + +function TCustomAIClient.CreateSettings: TAIServerSettings; +begin + Result:=TAIServerSettings.Create; +end; + +constructor TCustomAIClient.Create(aOwner: TComponent); +begin + inherited Create(aOwner); + FSettings:=CreateSettings; + FSettings.OnProtocolChange:=@ProtocolChange; + FWebClient:=DefaultWebClientClass.Create(Self); +end; + +destructor TCustomAIClient.Destroy; +begin + FreeAndNil(FWebClient); + FreeAndNil(FSettings); + inherited Destroy; +end; + +Type + + { TModelsResponseCallbackHandler } + + TModelsResponseCallbackHandler = Class(TObject) + Private + FCallBack : TModelsResponseCallBack; + FList : TModelDataArray; + FSender : TObject; + Public + constructor Create(aSender : TObject; aCallBack : TModelsResponseCallback; aList :TModelDataArray); + procedure Execute; + end; + +{ TModelsResponseCallbackHandler } + +constructor TModelsResponseCallbackHandler.Create(aSender : TObject; aCallBack: TModelsResponseCallback; aList: TModelDataArray); +begin + FCallBack:=aCallBack; + FList:=aList; + FSender:=aSender; +end; + +procedure TModelsResponseCallbackHandler.Execute; +begin + try + FCallBack(Fsender,FList); + finally + Free; + end; +end; + +procedure TCustomAIClient.HandleModelsResponse(const aResponse: THTTPRequestResponse); + +var + CallBack : TModelsResponseCallback; + handler : TModelsResponseCallbackHandler; + aList : TModelDataArray; + JSON : TJSONData; + +begin + CheckProtocol; + json:=Nil; + try + JSON:=GetJSON(aResponse.Response.GetContentAsString); + if Protocol.ResponseToModels(JSON,aList) then + begin + Callback:=TModelsResponseCallback(aResponse.UserCallbackMethod); + handler:=TModelsResponseCallbackHandler.Create(Self,CallBack,aList); + if SynchronizeCallBacks then + TThread.Synchronize(TThread.CurrentThread,@Handler.Execute) + else + Handler.Execute; + end; + finally + JSON.Free; + end; +end; + +procedure TAIRequestData.HandleWebResponse(aResponse : TWebClientResponse; aUserData : TObject); + +var + Res : TCustomAIClient.THTTPRequestResponse; + +begin + Res.Response:=aResponse; + Res.UserCallbackMethod:=Self.UserCallbackMethod; + if Assigned(Self.ResultHandler) then + ResultHandler(Res); +end; + +procedure TCustomAIClient.ServerRequest(const aMethod,aURL : String; aResultHandler : THTTPResultHandler; aUserCallback : TMethod); + +var + Context : TAsyncRequestContext; + Data : TAIRequestData; + +begin + Context.Client:=FWebClient; + Context.Request:=FWebClient.CreateRequest; + Context.Method:=aMethod; + Context.URL:=aURL; + Data:=TAIRequestData.Create(Context); + // AI specific + Data.UserCallbackMethod:=aUserCallBack; + Data.OnResponse:=@Data.HandleWebResponse; + Data.ResultHandler:=aResultHandler; + THTTPRequestThread.create(Data); +end; + +Type + + { TErrorCallBackHandler } + + TErrorCallBackHandler = class(TObject) + FServer : TCustomAIClient; + FData : TAIRequestErrorData; + constructor create(aServer : TCustomAIClient; aData :TAIRequestErrorData); + procedure Execute; + end; + +{ TErrorCallBackHandler } + +constructor TErrorCallBackHandler.create(aServer: TCustomAIClient; aData: TAIRequestErrorData); +begin + FServer:=aServer; + FData:=aData; +end; + +procedure TErrorCallBackHandler.Execute; +begin + try + if Assigned(FServer.FOnError) then + FServer.FOnError(FServer,FData); + finally + Free; + end; +end; + +procedure TCustomAIClient.ErrorHandler(aException: Exception; aContext : TAsyncRequestContext); + +var + AIContext: TAIRequestErrorData; + Handler : TErrorCallBackHandler; +begin + if Assigned(FOnError) then + begin + AIContext.Error:=aException.Message; + AIContext.ErrorClass:=aException.ClassName; + AIContext.URL:=aContext.URL; + AIContext.Method:=aContext.Method; + AIContext.RequestBody:=aContext.Request.GetContentAsString; + Handler:=TErrorCallBackHandler.Create(Self,AICOntext); + if SynchronizeCallBacks then + TThread.Synchronize(TThread.CurrentThread,@Handler.Execute) + else + Handler.Execute; + end; +end; + +procedure TCustomAIClient.ProtocolChange(Sender: TObject); + +var + aClass : TAIProtocolClass; + +begin + aClass:=GetProtocolClass(FSettings.Protocol); + FreeAndNil(FProtocol); + FProtocol:=aClass.Create(Self); +end; + +procedure TCustomAIClient.ServerDataRequest(const aMethod,aURL : String; aJSON : TJSONData; aResultHandler : THTTPResultHandler; aUserCallback : TMethod); + +var + Data : TAIRequestData; + Context : TAsyncRequestContext; + +begin + Context.Client:=FWebClient; + Context.Request:=FWebClient.CreateRequest; + Context.Request.SetContentFromString(aJSON.AsJSON); +// Writeln('Request: ',Context.Request.GetContentAsString); + + Context.Request.Headers.Values['Content-Type']:='application/json'; + Context.Method:=aMethod; + Context.URL:=aURL; + Data:=TAIRequestData.Create(Context); + // AI specific + Data.UserCallbackMethod:=aUserCallBack; + Data.OnResponse:=@Data.HandleWebResponse; + Data.ResultHandler:=aResultHandler; + Data.OnError:=@ErrorHandler; + THTTPRequestThread.create(Data); +end; + +procedure TCustomAIClient.GetModels(aCallBack: TModelsResponseCallBack); + +var + RequestURL : String; + +begin + CheckProtocol; + CheckServerURL; + RequestURL:=Settings.BaseURL+Protocol.GetAIURL(auListModels); + ServerRequest('GET',RequestURL,@HandleModelsResponse,TMethod(aCallBack)); +end; + +Type + + { TPromptResponseHandler } + + TPromptResponseHandler = class(TObject) + Private + FSender : TObject; + FCallBack :TPromptResponseCallback; + FResponses : TPromptResponseArray; + Public + Constructor Create(aSender : TObject; aCallBack :TPromptResponseCallback; aResponses : TPromptResponseArray); + procedure Execute; + end; + +{ TPromptResponseHandler } + +constructor TPromptResponseHandler.Create(aSender: TObject; aCallBack: TPromptResponseCallback; aResponses: TPromptResponseArray); +begin + FSender:=aSender; + FCallBack:=aCallBack; + FResponses:=aResponses; +end; + +procedure TPromptResponseHandler.Execute; +begin + try + FCallBack(FSender,FResponses); + finally + Free; + end; +end; + +procedure TCustomAIClient.HandlePromptResponse(const aResponse: THTTPRequestResponse); + +var + CallBack : TPromptResponseCallback; + lResponses : TPromptResponseArray; + Handler : TPromptResponseHandler; + JSON : TJSONData; + +begin + CheckProtocol; + CheckServerURL; + json:=Nil; + try +// Writeln('Response: ',aResponse.Response.GetContentAsString); + JSON:=GetJSON(aResponse.Response.GetContentAsString); + if Protocol.ResponseToPromptResponses(JSON,lResponses) then + begin + Callback:=TPromptResponseCallback(aResponse.UserCallbackMethod); + Handler:=TPromptResponseHandler.Create(Self,CallBack,lResponses); + if SynchronizeCallBacks then + TThread.Synchronize(TThread.CurrentThread,@Handler.Execute) + else + Handler.Execute; + end; + finally + JSON.Free; + end; +end; + +class procedure TCustomAIClient.RegisterAIProtocol(aClass: TAIProtocolClass); + +var + Len : Integer; + +begin + Len:=Length(_protocols); + If _protocolcount=len then + SetLength(_protocols,len+10); + _protocols[_protocolcount]:=aClass; + inc(_protocolcount); +end; + +class procedure TCustomAIClient.UnRegisterAIProtocol(const aProtocol: String); + +var + Idx : Integer; + +begin + Idx:=IndexOfProtocol(aProtocol); + if Idx=_protocolcount-1 then + _protocols[idx]:=nil + else + begin + _Protocols[Idx]:=_Protocols[_protocolCount-1]; + _Protocols[_protocolCount]:=nil; + end; + Dec(_protocolcount); +end; + +class function TCustomAIClient.IndexOfProtocol(const aName: string): Integer; + +begin + Result:=_protocolcount-1; + While (Result>=0) and Not SameText(_protocols[Result].protocolname,aName) do + Dec(Result); +end; + +procedure TCustomAIClient.CheckProtocol; +begin + If FProtocol=Nil then + Raise EAIServer.Create('No protocol assigned'); +end; + +procedure TCustomAIClient.CheckServerURL; +begin + if Settings.BaseURL='' then + Raise EAIServer.Create('Server URL is not set'); +end; + +class function TCustomAIClient.FindProtocolClass(const aName: string): TAIProtocolClass; + +var + Idx : integer; +begin + Idx:=IndexOfProtocol(aName); + if Idx=-1 then + Result:=Nil + else + Result:=_protocols[Idx] +end; + +class function TCustomAIClient.GetProtocolList(aList: TStrings): Integer; + +var + i : Integer; + +begin + For I:=0 to _protocolcount-1 do + aList.Add(_protocols[i].protocolname); + Result:=_protocolcount +end; + +class function TCustomAIClient.GetProtocolClass(const aName: string): TAIProtocolClass; +var + Idx : integer; +begin + Result:=FindProtocolClass(aName); + if (Result=Nil) then + Raise EAIServer.CreateFmt('Unknown AI protocol: "%s"',[aName]); +end; + +procedure TCustomAIClient.SendPrompt(aCallBack: TPromptResponseCallBack; const aPrompt: string; aModel: String; aMaxLength: Cardinal + ); + +var + JSON : TJSONData; + lModel,RequestURL : String; + lMaxLen : Cardinal; + +begin + CheckProtocol; + RequestURL:=Settings.BaseURL+Protocol.GetAIURL(auPrompt); + lMaxLen:=aMaxLength; + if lMaxLen=0 then + lMaxLen:=Settings.DefaultMaxLength; + lModel:=aModel; + if lModel='' then + lModel:=Settings.DefaultModel; + JSON:=Protocol.CreatePromptRequest(lModel,aPrompt,lMaxLen); + try + ServerDataRequest('POST',RequestURL,JSON,@HandlePromptResponse,TMethod(aCallBack)); + finally + JSON.Free; + end; +end; + +initialization + if DefaultWebClientClass=Nil then + DefaultWebClientClass:=TFPHTTPWebClient; +end. + diff --git a/components/aissist/api/aissist.lpk b/components/aissist/api/aissist.lpk new file mode 100644 index 0000000000..30fa980698 --- /dev/null +++ b/components/aissist/api/aissist.lpk @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/aissist/api/aissist.pas b/components/aissist/api/aissist.pas new file mode 100644 index 0000000000..3f6eae53b8 --- /dev/null +++ b/components/aissist/api/aissist.pas @@ -0,0 +1,21 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit aissist; + +{$warn 5023 off : no warning about unused units} +interface + +uses + aiclient, fpasyncwebclient, LazarusPackageIntf; + +implementation + +procedure Register; +begin +end; + +initialization + RegisterPackage('aissist', @Register); +end. diff --git a/components/aissist/api/fpasyncwebclient.pas b/components/aissist/api/fpasyncwebclient.pas new file mode 100644 index 0000000000..013bf45cc9 --- /dev/null +++ b/components/aissist/api/fpasyncwebclient.pas @@ -0,0 +1,117 @@ +{ + This file is part of the Free Component Library (FCL) + Copyright (c) 2024 by Michael Van Canneyt + + ASync HTTP request execution + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit fpasyncwebclient; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, fpwebclient; + +type + TAsyncRequestContext = record + Method,URL : String; + Request : TWebClientRequest; + Client : TAbstractWebClient; + UserData : TObject; + end; + + TWebResponseEvent = procedure (aResponse : TWebClientResponse; aUserData : TObject) of object; + TWebRequestErrorEvent = procedure (aException : Exception; aContext : TAsyncRequestContext) of object; + + { TAsyncRequestData } + + TAsyncRequestData = class + FContext : TAsyncRequestContext; + OnResponse : TWebResponseEvent; + OnError : TWebRequestErrorEvent; + constructor create(const aContext : TAsyncRequestContext); + destructor destroy; override; + procedure ExecuteRequest; + end; + + { THTTPRequestThread } + + THTTPRequestThread = class(TThread) + Private + FData : TAsyncRequestData; + protected + Procedure Execute; override; + public + // Thread will destroy aData and itself. + constructor create(aData : TAsyncRequestData); reintroduce; + end; + + +implementation + + +{ THTTPRequestThread } + +constructor THTTPRequestThread.Create(aData : TAsyncRequestData); + +begin + FData:=AData; + FreeOnTerminate:=True; + Inherited Create(False); +end; + +procedure THTTPRequestThread.Execute; + +begin + try + FData.ExecuteRequest; + finally + FData.Free; + end; +end; + + +{ TAsyncRequestData } + +constructor TAsyncRequestData.create(const aContext: TAsyncRequestContext); +begin + FContext:=aContext; +end; + +destructor TAsyncRequestData.destroy; +begin + FContext.Request.Free; +end; + +procedure TAsyncRequestData.ExecuteRequest; + +var + Res : TWebClientResponse; + +begin + With FContext do + try + begin + Res:=Client.ExecuteRequest(Method,Url,Request); + if Assigned(OnResponse) then + OnResponse(Res,UserData); + end; + except + On E : Exception do + If Assigned(OnError) then + OnError(E,FContext); + end; +end; + + +end. + diff --git a/components/aissist/api/janai/janai.lpk b/components/aissist/api/janai/janai.lpk new file mode 100644 index 0000000000..6677a3fa45 --- /dev/null +++ b/components/aissist/api/janai/janai.lpk @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/aissist/api/janai/janai.pas b/components/aissist/api/janai/janai.pas new file mode 100644 index 0000000000..6ec336bfdd --- /dev/null +++ b/components/aissist/api/janai/janai.pas @@ -0,0 +1,21 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit janai; + +{$warn 5023 off : no warning about unused units} +interface + +uses + janai_v1, janaiprotocol, LazarusPackageIntf; + +implementation + +procedure Register; +begin +end; + +initialization + RegisterPackage('janai', @Register); +end. diff --git a/components/aissist/api/janai/janai_v1.pas b/components/aissist/api/janai/janai_v1.pas new file mode 100644 index 0000000000..fff292fdb1 --- /dev/null +++ b/components/aissist/api/janai/janai_v1.pas @@ -0,0 +1,1008 @@ +{ + This file is part of the Free Component Library (FCL) + Copyright (c) 2024 by Michael Van Canneyt + + JAN AI server API implementation + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit janai_v1; + +{$mode objfpc}{$H+} + +interface + +uses SysUtils, Classes, fpJSON; + + +Type + + + { ----------------------------------------------------------------------- + TMessageItem + -----------------------------------------------------------------------} + + TMessageItem = class(TObject) + Private + Fcontent : String; + Frole : String; + Public + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Function SaveToJSON : TJSONObject; overload; + Procedure SaveToJSON(AJSON : TJSONObject); overload; virtual; + Property content : String Read Fcontent Write Fcontent; + Property role : String Read Frole Write Frole; + end; + + Tmessages = Array of TMessageItem; + +Procedure ClearArray(var anArray : Tmessages); overload; +Function CreateTmessages(AJSON : TJSONData) : Tmessages; +Procedure SaveTmessagesToJSON(AnArray : Tmessages; AJSONArray : TJSONArray); overload; +Function SaveTmessagesToJSON(AnArray : Tmessages) : TJSONArray; overload; + + +Type + Tstop = Array of String; + +Function CreateTstop(AJSON : TJSONData) : Tstop; +Procedure SaveTstopToJSON(AnArray : Tstop; AJSONArray : TJSONArray); overload; +Function SaveTstopToJSON(AnArray : Tstop) : TJSONArray; overload; + + +Type + + + { ----------------------------------------------------------------------- + TCompletionRequest + -----------------------------------------------------------------------} + + TCompletionRequest = class(TObject) + Private + Fmessages : Tmessages; + Fmodel : String; + Fstream : Boolean; + Fmax_tokens : Integer; + Fstop : Tstop; + Ffrequency_penalty : Integer; + Fpresence_penalty : Integer; + Ftemperature : Double; + Ftop_p : Double; + Public + Destructor Destroy; override; + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Function SaveToJSON : TJSONObject; overload; + Procedure SaveToJSON(AJSON : TJSONObject); overload; virtual; + Property messages : Tmessages Read Fmessages Write Fmessages; + Property model : String Read Fmodel Write Fmodel; + Property stream : Boolean Read Fstream Write Fstream; + Property max_tokens : Integer Read Fmax_tokens Write Fmax_tokens; + Property stop : Tstop Read Fstop Write Fstop; + Property frequency_penalty : Integer Read Ffrequency_penalty Write Ffrequency_penalty; + Property presence_penalty : Integer Read Fpresence_penalty Write Fpresence_penalty; + Property temperature : Double Read Ftemperature Write Ftemperature; + Property top_p : Double Read Ftop_p Write Ftop_p; + end; + + { ----------------------------------------------------------------------- + TchoicesItemmessage + -----------------------------------------------------------------------} + + TchoicesItemmessage = class(TObject) + Private + Fcontent : String; + Frole : String; + Public + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Function SaveToJSON : TJSONObject; overload; + Procedure SaveToJSON(AJSON : TJSONObject); overload; virtual; + Property content : String Read Fcontent Write Fcontent; + Property role : String Read Frole Write Frole; + end; + + + { ----------------------------------------------------------------------- + TchoicesItem + -----------------------------------------------------------------------} + + TchoicesItem = class(TObject) + Private + Ffinish_reason : string; + Findex : Integer; + Fmessage : TchoicesItemmessage; + Public + Destructor Destroy; override; + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Function SaveToJSON : TJSONObject; overload; + Procedure SaveToJSON(AJSON : TJSONObject); overload; virtual; + Property finish_reason : string Read Ffinish_reason Write Ffinish_reason; + Property index : Integer Read Findex Write Findex; + Property message : TchoicesItemmessage Read Fmessage Write Fmessage; + end; + + Tchoices = Array of TchoicesItem; + +Procedure ClearArray(var anArray : Tchoices); overload; +Function CreateTchoices(AJSON : TJSONData) : Tchoices; +Procedure SaveTchoicesToJSON(AnArray : Tchoices; AJSONArray : TJSONArray); overload; +Function SaveTchoicesToJSON(AnArray : Tchoices) : TJSONArray; overload; + + +Type + + + { ----------------------------------------------------------------------- + Tusage + -----------------------------------------------------------------------} + + Tusage = class(TObject) + Private + Fcompletion_tokens : Integer; + Fprompt_tokens : Integer; + Ftotal_tokens : Integer; + Public + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Function SaveToJSON : TJSONObject; overload; + Procedure SaveToJSON(AJSON : TJSONObject); overload; virtual; + Property completion_tokens : Integer Read Fcompletion_tokens Write Fcompletion_tokens; + Property prompt_tokens : Integer Read Fprompt_tokens Write Fprompt_tokens; + Property total_tokens : Integer Read Ftotal_tokens Write Ftotal_tokens; + end; + + + { ----------------------------------------------------------------------- + TCompletionsResponse + -----------------------------------------------------------------------} + + TCompletionsResponse = class(TObject) + Private + Fchoices : Tchoices; + Fcreated : Integer; + Fid : String; + Fmodel : String; + F_object : String; + Fsystem_fingerprint : String; + Fusage : Tusage; + Public + Destructor Destroy; override; + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Function SaveToJSON : TJSONObject; overload; + Procedure SaveToJSON(AJSON : TJSONObject); overload; virtual; + Property choices : Tchoices Read Fchoices Write Fchoices; + Property created : Integer Read Fcreated Write Fcreated; + Property id : String Read Fid Write Fid; + Property model : String Read Fmodel Write Fmodel; + Property _object : String Read F_object Write F_object; + Property system_fingerprint : String Read Fsystem_fingerprint Write Fsystem_fingerprint; + Property usage : Tusage Read Fusage Write Fusage; + end; + + + + { ----------------------------------------------------------------------- + TdataItemsettings + -----------------------------------------------------------------------} + + TdataItemsettings = class(TObject) + Private + Fctx_len : Integer; + Fprompt_template : String; + Public + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Property ctx_len : Integer Read Fctx_len Write Fctx_len; + Property prompt_template : String Read Fprompt_template Write Fprompt_template; + end; + + TdataItemparametersstop = Array of String; + +Function CreateTdataItemparametersstop(AJSON : TJSONData) : TdataItemparametersstop; + + +Type + + + { ----------------------------------------------------------------------- + TdataItemparameters + -----------------------------------------------------------------------} + + TdataItemparameters = class(TObject) + Private + Ftemperature : Double; + Ftop_p : Double; + Fstream : Boolean; + Fmax_tokens : Integer; + Fstop : TdataItemparametersstop; + Ffrequency_penalty : Integer; + Fpresence_penalty : Integer; + Public + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Property temperature : Double Read Ftemperature Write Ftemperature; + Property top_p : Double Read Ftop_p Write Ftop_p; + Property stream : Boolean Read Fstream Write Fstream; + Property max_tokens : Integer Read Fmax_tokens Write Fmax_tokens; + Property stop : TdataItemparametersstop Read Fstop Write Fstop; + Property frequency_penalty : Integer Read Ffrequency_penalty Write Ffrequency_penalty; + Property presence_penalty : Integer Read Fpresence_penalty Write Fpresence_penalty; + end; + + + { ----------------------------------------------------------------------- + TDataItem + -----------------------------------------------------------------------} + + TDataItem = class(TObject) + Private + Fsource_url : String; + Fid : String; + F_object : String; + Fname : String; + Fversion : String; + Fdescription : String; + Fformat : String; + Fsettings : TDataItemsettings; + Fparameters : TDataItemparameters; + Fmetadata : String; + Fengine : String; + Public + Destructor Destroy; override; + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Property source_url : String Read Fsource_url Write Fsource_url; + Property id : String Read Fid Write Fid; + Property _object : String Read F_object Write F_object; + Property name : String Read Fname Write Fname; + Property version : String Read Fversion Write Fversion; + Property description : String Read Fdescription Write Fdescription; + Property format : String Read Fformat Write Fformat; + Property settings : TDataItemsettings Read Fsettings Write Fsettings; + Property parameters : TDataItemparameters Read Fparameters Write Fparameters; + Property metadata : String Read Fmetadata Write Fmetadata; + Property engine : String Read Fengine Write Fengine; + end; + + Tdata = Array of TDataItem; + +Procedure ClearArray(var anArray : Tdata); overload; +Function CreateTdata(AJSON : TJSONData) : Tdata; + + +Type + + + { ----------------------------------------------------------------------- + TModelsListResponse + -----------------------------------------------------------------------} + + TModelsListResponse = class(TObject) + Private + F_object : String; + Fdata : Tdata; + Public + Destructor Destroy; override; + Constructor CreateFromJSON(AJSON : TJSONData); virtual; + Procedure LoadFromJSON(AJSON : TJSONData); virtual; + Property _object : String Read F_object Write F_object; + Property data : Tdata Read Fdata Write Fdata; + end; + + + +implementation + + +{ ----------------------------------------------------------------------- + TMessageItem + -----------------------------------------------------------------------} + + +Constructor TMessageItem.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure TMessageItem.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'content': + content:=E.Value.AsString; + 'role': + role:=E.Value.AsString; + end; + end; +end; +Function TMessageItem.SaveToJSON : TJSONObject; +begin + Result:=TJSONObject.Create; + Try + SaveToJSON(Result); + except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure TMessageItem.SaveToJSON(AJSON : TJSONObject); + +begin + AJSON.Add('content',content); + AJSON.Add('role',role); +end; + + +Procedure ClearArray(Var anArray : Tmessages); + +var + I : integer; + +begin + For I:=0 to Length(anArray)-1 do + FreeAndNil(anArray[I]); + SetLength(anArray,0); +End; + + +Function CreateTmessages(AJSON : TJSONData) : Tmessages; + +var + I : integer; + +begin + Result:=[]; + SetLength(Result,AJSON.Count); + For I:=0 to AJSON.Count-1 do + Result[i]:=TMessageItem.CreateFromJSON(AJSON.Items[i]); +End; + + +Function SaveTmessagesToJSON(AnArray : Tmessages) : TJSONArray; +begin + Result:=TJSONArray.Create; + Try + SaveTmessagesToJSON(AnArray,Result); + Except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure SaveTmessagesToJSON(AnArray : Tmessages; AJSONArray : TJSONArray); + +var + I : integer; + +begin + For I:=0 to Length(AnArray)-1 do + AJSONArray.Add(AnArray[i].SaveToJSON); +end; + + + + +Function CreateTstop(AJSON : TJSONData) : Tstop; + +var + I : integer; + +begin + Result:=[]; + SetLength(Result,AJSON.Count); + For I:=0 to AJSON.Count-1 do + Result[i]:=AJSON.Items[i].AsString; +End; + + +Function SaveTstopToJSON(AnArray : Tstop) : TJSONArray; +begin + Result:=TJSONArray.Create; + Try + SaveTstopToJSON(AnArray,Result); + Except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure SaveTstopToJSON(AnArray : Tstop; AJSONArray : TJSONArray); + +var + I : integer; + +begin + For I:=0 to Length(AnArray)-1 do + AJSONArray.Add(AnArray[i]); +end; + + + +{ ----------------------------------------------------------------------- + TCompletionRequest + -----------------------------------------------------------------------} + +Destructor TCompletionRequest.Destroy; + +begin + ClearArray(Fmessages); + + inherited; +end; + + +Constructor TCompletionRequest.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + if assigned(aJSON) then + LoadFromJSON(AJSON); +end; + +Procedure TCompletionRequest.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'messages': + messages:=CreateTmessages(E.Value); + 'model': + model:=E.Value.AsString; + 'stream': + stream:=E.Value.AsBoolean; + 'max_tokens': + max_tokens:=E.Value.AsInteger; + 'stop': + stop:=CreateTstop(E.Value); + 'frequency_penalty': + frequency_penalty:=E.Value.AsInteger; + 'presence_penalty': + presence_penalty:=E.Value.AsInteger; + 'temperature': + temperature:=E.Value.AsFloat; + 'top_p': + top_p:=E.Value.AsFloat; + end; + end; +end; +Function TCompletionRequest.SaveToJSON : TJSONObject; +begin + Result:=TJSONObject.Create; + Try + SaveToJSON(Result); + except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure TCompletionRequest.SaveToJSON(AJSON : TJSONObject); + +begin + AJSON.Add('messages',SaveTmessagesToJSON(messages)); + AJSON.Add('model',model); + AJSON.Add('stream',stream); + AJSON.Add('max_tokens',max_tokens); + AJSON.Add('stop',SaveTstopToJSON(stop)); + AJSON.Add('frequency_penalty',frequency_penalty); + AJSON.Add('presence_penalty',presence_penalty); + AJSON.Add('temperature',temperature); + AJSON.Add('top_p',top_p); +end; + +{ ----------------------------------------------------------------------- + TchoicesItemmessage + -----------------------------------------------------------------------} + + +Constructor TchoicesItemmessage.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure TchoicesItemmessage.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'content': + content:=E.Value.AsString; + 'role': + role:=E.Value.AsString; + end; + end; +end; +Function TchoicesItemmessage.SaveToJSON : TJSONObject; +begin + Result:=TJSONObject.Create; + Try + SaveToJSON(Result); + except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure TchoicesItemmessage.SaveToJSON(AJSON : TJSONObject); + +begin + AJSON.Add('content',content); + AJSON.Add('role',role); +end; + + +{ ----------------------------------------------------------------------- + TchoicesItem + -----------------------------------------------------------------------} + +Destructor TchoicesItem.Destroy; + +begin + FreeAndNil(Fmessage); + inherited; +end; + + +Constructor TchoicesItem.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure TchoicesItem.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + if E.Value.JSONType=jtNull then + continue; + case E.Key of + 'finish_reason': + finish_reason:=E.Value.AsString; + 'index': + index:=E.Value.AsInteger; + 'message': + message:=TchoicesItemmessage.CreateFromJSON(E.Value); + end; + end; +end; +Function TchoicesItem.SaveToJSON : TJSONObject; +begin + Result:=TJSONObject.Create; + Try + SaveToJSON(Result); + except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure TchoicesItem.SaveToJSON(AJSON : TJSONObject); + +begin + AJSON.Add('finish_reason',finish_reason); + AJSON.Add('index',index); + If Assigned(message) then + AJSON.Add('message',message.SaveToJSON); +end; + + +Procedure ClearArray(Var anArray : Tchoices); + +var + I : integer; + +begin + For I:=0 to Length(anArray)-1 do + FreeAndNil(anArray[I]); + SetLength(anArray,0); +End; + + +Function CreateTchoices(AJSON : TJSONData) : Tchoices; + +var + I : integer; + +begin + Result:=[]; + SetLength(Result,AJSON.Count); + For I:=0 to AJSON.Count-1 do + Result[i]:=TchoicesItem.CreateFromJSON(AJSON.Items[i]); +End; + + +Function SaveTchoicesToJSON(AnArray : Tchoices) : TJSONArray; +begin + Result:=TJSONArray.Create; + Try + SaveTchoicesToJSON(AnArray,Result); + Except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure SaveTchoicesToJSON(AnArray : Tchoices; AJSONArray : TJSONArray); + +var + I : integer; + +begin + For I:=0 to Length(AnArray)-1 do + AJSONArray.Add(AnArray[i].SaveToJSON); +end; + + + + +{ ----------------------------------------------------------------------- + Tusage + -----------------------------------------------------------------------} + + +Constructor Tusage.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure Tusage.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'completion_tokens': + completion_tokens:=E.Value.AsInteger; + 'prompt_tokens': + prompt_tokens:=E.Value.AsInteger; + 'total_tokens': + total_tokens:=E.Value.AsInteger; + end; + end; +end; +Function Tusage.SaveToJSON : TJSONObject; +begin + Result:=TJSONObject.Create; + Try + SaveToJSON(Result); + except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure Tusage.SaveToJSON(AJSON : TJSONObject); + +begin + AJSON.Add('completion_tokens',completion_tokens); + AJSON.Add('prompt_tokens',prompt_tokens); + AJSON.Add('total_tokens',total_tokens); +end; + + +{ ----------------------------------------------------------------------- + TCompletionsResponse + -----------------------------------------------------------------------} + +Destructor TCompletionsResponse.Destroy; + +begin + ClearArray(Fchoices); + FreeAndNil(Fusage); + inherited; +end; + + +Constructor TCompletionsResponse.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure TCompletionsResponse.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'choices': + choices:=CreateTchoices(E.Value); + 'created': + created:=E.Value.AsInteger; + 'id': + id:=E.Value.AsString; + 'model': + model:=E.Value.AsString; + 'object': + _object:=E.Value.AsString; + 'system_fingerprint': + system_fingerprint:=E.Value.AsString; + 'usage': + usage:=Tusage.CreateFromJSON(E.Value); + end; + end; +end; + +Function TCompletionsResponse.SaveToJSON : TJSONObject; +begin + Result:=TJSONObject.Create; + Try + SaveToJSON(Result); + except + FreeAndNil(Result); + Raise; + end; +end; + + +Procedure TCompletionsResponse.SaveToJSON(AJSON : TJSONObject); + +begin + AJSON.Add('choices',SaveTchoicesToJSON(choices)); + AJSON.Add('created',created); + AJSON.Add('id',id); + AJSON.Add('model',model); + AJSON.Add('object',_object); + AJSON.Add('system_fingerprint',system_fingerprint); + If Assigned(usage) then + AJSON.Add('usage',usage.SaveToJSON); +end; + + + + +{ ----------------------------------------------------------------------- + TDataItemsettings + -----------------------------------------------------------------------} + + +Constructor TDataItemsettings.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure TDataItemsettings.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'ctx_len': + ctx_len:=E.Value.AsInteger; + 'prompt_template': + prompt_template:=E.Value.AsString; + end; + end; +end; + + + + +Function CreateTDataItemparametersstop(AJSON : TJSONData) : TDataItemparametersstop; + +var + I : integer; + +begin + Result:=[]; + SetLength(Result,AJSON.Count); + For I:=0 to AJSON.Count-1 do + Result[i]:=AJSON.Items[i].AsString; +End; + + + +{ ----------------------------------------------------------------------- + TDataItemparameters + -----------------------------------------------------------------------} + + +Constructor TDataItemparameters.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure TDataItemparameters.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'temperature': + temperature:=E.Value.AsFloat; + 'top_p': + top_p:=E.Value.AsFloat; + 'stream': + stream:=E.Value.AsBoolean; + 'max_tokens': + max_tokens:=E.Value.AsInteger; + 'stop': + stop:=CreateTDataItemparametersstop(E.Value); + 'frequency_penalty': + frequency_penalty:=E.Value.AsInteger; + 'presence_penalty': + presence_penalty:=E.Value.AsInteger; + end; + end; +end; + + +{ ----------------------------------------------------------------------- + TDataItem + -----------------------------------------------------------------------} + +Destructor TDataItem.Destroy; + +begin + FreeAndNil(Fsettings); + FreeAndNil(Fparameters); + inherited; +end; + + +Constructor TDataItem.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure TDataItem.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'source_url': + source_url:=E.Value.AsString; + 'id': + id:=E.Value.AsString; + 'object': + _object:=E.Value.AsString; + 'name': + name:=E.Value.AsString; + 'version': + version:=E.Value.AsString; + 'description': + description:=E.Value.AsString; + 'format': + format:=E.Value.AsString; + 'settings': + settings:=TDataItemsettings.CreateFromJSON(E.Value); + 'parameters': + parameters:=TDataItemparameters.CreateFromJSON(E.Value); + 'metadata': + metadata:=E.Value.AsJSON; + 'engine': + engine:=E.Value.AsString; + end; + end; +end; + + +Procedure ClearArray(Var anArray : Tdata); + +var + I : integer; + +begin + For I:=0 to Length(anArray)-1 do + FreeAndNil(anArray[I]); + SetLength(anArray,0); +End; + + +Function CreateTdata(AJSON : TJSONData) : Tdata; + +var + I : integer; + +begin + Result:=[]; + SetLength(Result,AJSON.Count); + For I:=0 to AJSON.Count-1 do + Result[i]:=TDataItem.CreateFromJSON(AJSON.Items[i]); +End; + + + +{ ----------------------------------------------------------------------- + TModelsListResponse + -----------------------------------------------------------------------} + +Destructor TModelsListResponse.Destroy; + +begin + ClearArray(Fdata); + inherited; +end; + + +Constructor TModelsListResponse.CreateFromJSON(AJSON : TJSONData); + +begin + Create(); + LoadFromJSON(AJSON); +end; + +Procedure TModelsListResponse.LoadFromJSON(AJSON : TJSONData); + +var + E : TJSONEnum; + +begin + for E in AJSON do + begin + case E.Key of + 'object': + _object:=E.Value.AsString; + 'data': + data:=CreateTdata(E.Value); + end; + end; +end; + +end. diff --git a/components/aissist/api/janai/janaiprotocol.pas b/components/aissist/api/janai/janaiprotocol.pas new file mode 100644 index 0000000000..df796eb8c5 --- /dev/null +++ b/components/aissist/api/janai/janaiprotocol.pas @@ -0,0 +1,137 @@ +{ + This file is part of the Free Component Library (FCL) + Copyright (c) 2024 by Michael Van Canneyt + + AI Server - JAN AI server protocol implementation + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit JanAIProtocol; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, aiclient, fpjson; + +type + + { TJanAIServer } + + { TJanAIServerProtocol } + + TJanAIServerProtocol = Class(TAIProtocol) + public + function CreatePromptRequest(const aModel, aPrompt: string; aMaxResponseLength: Cardinal): TJSONData; override; + function ResponseToPromptResponses(aResponse: TJSONData; out Responses: TPromptResponseArray): boolean; override; + function ResponseToModels(aResponse: TJSONData; out Models: TModelDataArray): boolean; override; + function GetAIURL(aURL: TAIURL): String; override; + class function protocolname : string; override; + class function DefaultURL : String; override; + end; + +implementation + +uses janai_v1; + +{ TJanAIServerProtocol } + + +class function TJanAIServerProtocol.protocolname: string; +begin + Result:='JanAI'; +end; + +class function TJanAIServerProtocol.DefaultURL: String; +begin + Result:='http://localhost:1337/v1/'; +end; + + +function TJanAIServerProtocol.ResponseToModels(aResponse: TJSONData; out Models: TModelDataArray): boolean; + +var + Response : TModelsListResponse; + Item : TDataItem; + Idx : Integer; + + +begin + Models:=[]; + Response:=TModelsListResponse.CreateFromJSON(aResponse); + try + SetLength(Models,Length(Response.data)); + Idx:=0; + For Item in Response.data do + begin + Models[Idx].Name:=Item.Name; + Models[Idx].ID:=Item.id; + Inc(Idx); + end; + Result:=True; + finally + Response.Free; + end; +end; + +function TJanAIServerProtocol.GetAIURL(aURL: TAIURL): String; +begin + case aURL of + auListModels : Result:='models'; + auPrompt : Result:='chat/completions'; + end; +end; + +function TJanAIServerProtocol.CreatePromptRequest(const aModel, aPrompt: string; aMaxResponseLength: Cardinal): TJSONData; + +var + Prompt : TCompletionRequest; + Msgs : TMessages; + Item : TMessageItem; + +begin + Prompt:=TCompletionRequest.CreateFromJSON(Nil); + try + Msgs:=[]; + SetLength(Msgs,1); + Item:=TMessageItem.Create; + Item.content:=aPrompt; + Item.Role:='user'; + Msgs[0]:=Item; + Prompt.messages:=Msgs; + Prompt.max_tokens:=aMaxResponseLength; + Prompt.model:=aModel; + Result:=Prompt.SaveToJSON; + finally + Prompt.Free; + end; +end; + +function TJanAIServerProtocol.ResponseToPromptResponses(aResponse: TJSONData; out Responses: TPromptResponseArray): boolean; + +var + Resp : TCompletionsResponse; + Item : TchoicesItem; + Idx : Integer; + +begin + Responses:=[]; + Resp:=TCompletionsResponse.CreateFromJSON(aResponse); + SetLength(Responses,Length(Resp.choices)); + Idx:=0; + For Item in Resp.Choices do + Responses[Idx].Response:=Item.message.content; + Result:=True; +end; + +initialization + RegisterAIProtocol(TJANAIServerProtocol); +end. + diff --git a/components/aissist/demos/console/testaissist.lpi b/components/aissist/demos/console/testaissist.lpi new file mode 100644 index 0000000000..0fef9824ab --- /dev/null +++ b/components/aissist/demos/console/testaissist.lpi @@ -0,0 +1,61 @@ + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="janai"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="testaissist.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <Target> + <Filename Value="testaissist"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/components/aissist/demos/console/testaissist.lpr b/components/aissist/demos/console/testaissist.lpr new file mode 100644 index 0000000000..4544ea99d1 --- /dev/null +++ b/components/aissist/demos/console/testaissist.lpr @@ -0,0 +1,94 @@ +program testaissist; + +uses cthreads, sysutils, classes, custapp, aiclient, fpwebclient, jsonparser, janaiprotocol; + +Type + + { TApp } + + { TMyApp } + + TMyApp = Class(TCustomApplication) + FClient : TAIClient; + constructor create(aOwner : TComponent); override; + Procedure Run; + private + procedure DoError(Sender: TObject; aErrorData : TAIRequestErrorData); + procedure HandleModels(Sender: TObject; aModels: TModelDataArray); + procedure HandlePrompt(Sender: TObject; aResponses: TPromptResponseArray); + end; + +{ TMyApp } + +constructor TMyApp.create(aOwner: TComponent); +begin + inherited create(aOwner); + FClient:=TAIClient.Create(Self); + FClient.Settings.BaseURL:='http://localhost:1337/v1'; + FClient.Settings.DefaultModel:='mistral-ins-7b-q4'; + FClient.Settings.DefaultMaxLength:=2048; + FClient.Settings.Protocol:=TJANAIServerProtocol.protocolname; + FClient.OnError:=@DoError; +end; + +procedure TMyApp.Run; + +begin + FClient.GetModels(@HandleModels); + While not Terminated do + begin + CheckSynchronize; + Sleep(100); + end; +end; + +procedure TMyApp.DoError(Sender: TObject; aErrorData : TAIRequestErrorData); +begin + With aErrorData do + begin + Writeln('Got error ',ErrorClass,' during AI request : ',Error); + Writeln('Request details: ',METHOD,' ',URL); + if RequestBody<>'' then + begin + Writeln('Request body:'); + Writeln(RequestBody); + end; + end; + Terminate; +end; + +procedure TMyApp.HandleModels(Sender: TObject; aModels: TModelDataArray); + +var + Model : TModelData; + +begin + Writeln('Received model list (',Length(aModels),' entries) : '); + For Model in aModels do + Writeln(Model.id,' : ',Model.Name); + Writeln('Asking for hello world program...'); + FClient.SendPrompt(@HandlePrompt,'Please create a "hello, world!" program in pascal'); + Writeln('The AI is thinking. Waiting for reply...'); +end; + +procedure TMyApp.HandlePrompt(Sender: TObject; aResponses: TPromptResponseArray); + +var + Resp : TPromptResponse; + +begin + Writeln('Got ',Length(aResponses),' replies: '); + For Resp in aResponses do + Writeln(Resp.Response); + Terminate; +end; + +begin + With TMyApp.Create(nil) do + try + Run; + finally + Free; + end; +end. + diff --git a/components/aissist/demos/gui/frmmain.lfm b/components/aissist/demos/gui/frmmain.lfm new file mode 100644 index 0000000000..f2da2ca761 --- /dev/null +++ b/components/aissist/demos/gui/frmmain.lfm @@ -0,0 +1,162 @@ +object MainChatForm: TMainChatForm + Left = 425 + Height = 623 + Top = 278 + Width = 1073 + Caption = 'AI Chat demo' + ClientHeight = 623 + ClientWidth = 1073 + SessionProperties = 'Left;Top;Width;Height;pnlPrompt.Height' + LCLVersion = '3.99.0.0' + OnCreate = FormCreate + object Button1: TButton + Left = 16 + Height = 25 + Top = 552 + Width = 75 + Caption = 'Button1' + TabOrder = 0 + OnClick = handleConnect + end + object GBChat: TGroupBox + Left = 0 + Height = 433 + Top = 42 + Width = 1073 + Align = alClient + Caption = 'AI Chat' + Constraints.MinWidth = 200 + TabOrder = 1 + end + object Panel1: TPanel + Left = 0 + Height = 42 + Top = 0 + Width = 1073 + Align = alTop + BevelOuter = bvNone + ClientHeight = 42 + ClientWidth = 1073 + TabOrder = 2 + object edtURL: TEdit + Left = 144 + Height = 28 + Top = 8 + Width = 376 + Anchors = [akTop, akLeft, akRight] + TabOrder = 0 + TextHint = 'Enter base URL for AI server API' + OnChange = edtURLChange + end + object lblURL: TLabel + AnchorSideTop.Control = edtURL + AnchorSideRight.Control = edtURL + AnchorSideBottom.Control = edtURL + AnchorSideBottom.Side = asrBottom + Left = 34 + Height = 28 + Top = 8 + Width = 110 + Anchors = [akTop, akLeft, akBottom] + AutoSize = False + BorderSpacing.Right = 8 + Caption = 'Server API URL' + Layout = tlCenter + end + object cbModels: TComboBox + AnchorSideTop.Control = edtURL + AnchorSideBottom.Control = edtURL + AnchorSideBottom.Side = asrBottom + Left = 684 + Height = 28 + Top = 8 + Width = 324 + Anchors = [akTop, akRight, akBottom] + ItemHeight = 0 + TabOrder = 1 + OnChange = cbModelsChange + end + object lblModel: TLabel + AnchorSideTop.Control = edtURL + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = edtURL + AnchorSideBottom.Side = asrBottom + Left = 632 + Height = 28 + Top = 8 + Width = 39 + Anchors = [akTop, akRight, akBottom] + Caption = 'Model' + Layout = tlCenter + end + object btnConnect: TButton + AnchorSideLeft.Control = edtURL + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = edtURL + AnchorSideBottom.Control = edtURL + AnchorSideBottom.Side = asrBottom + Left = 528 + Height = 28 + Top = 8 + Width = 75 + Anchors = [akTop, akLeft, akBottom] + BorderSpacing.Left = 8 + Caption = '&Connect' + TabOrder = 2 + OnClick = handleConnect + end + end + object pnlPrompt: TPanel + Left = 0 + Height = 143 + Top = 480 + Width = 1073 + Align = alBottom + ClientHeight = 143 + ClientWidth = 1073 + TabOrder = 3 + object Label1: TLabel + Left = 30 + Height = 16 + Top = 17 + Width = 79 + Caption = 'Your prompt:' + end + object mPrompt: TMemo + Left = 128 + Height = 112 + Top = 16 + Width = 832 + Anchors = [akTop, akLeft, akRight, akBottom] + TabOrder = 0 + end + object btnPrompt: TButton + Left = 976 + Height = 25 + Top = 17 + Width = 88 + Anchors = [akTop, akRight] + Caption = 'Prompt AI' + TabOrder = 1 + OnClick = handlePrompt + end + end + object Splitter1: TSplitter + Cursor = crVSplit + Left = 0 + Height = 5 + Top = 475 + Width = 1073 + Align = alBottom + ResizeAnchor = akBottom + ResizeStyle = rsPattern + end + object psAI: TIniPropStorage + StoredValues = <> + Active = False + OnSaveProperties = psAISaveProperties + OnRestoreProperties = psAIRestoreProperties + Left = 421 + Top = 110 + end +end diff --git a/components/aissist/demos/gui/frmmain.pas b/components/aissist/demos/gui/frmmain.pas new file mode 100644 index 0000000000..dadab8e8f1 --- /dev/null +++ b/components/aissist/demos/gui/frmmain.pas @@ -0,0 +1,225 @@ +unit frmmain; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, IniPropStorage, chatcontrol, aiclient, + janaiprotocol; + +type + TChatState = (csDisconnected,csConnected,csWaiting,csAIThinking); + { TMainChatForm } + + TMainChatForm = class(TForm) + Button1: TButton; + btnConnect: TButton; + btnPrompt: TButton; + cbModels: TComboBox; + edtURL: TEdit; + GBChat: TGroupBox; + psAI: TIniPropStorage; + Label1: TLabel; + lblURL: TLabel; + lblModel: TLabel; + mPrompt: TMemo; + Panel1: TPanel; + pnlPrompt: TPanel; + Splitter1: TSplitter; + procedure cbModelsChange(Sender: TObject); + procedure edtURLChange(Sender: TObject); + procedure handleConnect(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure handlePrompt(Sender: TObject); + procedure psAIRestoreProperties(Sender: TObject); + procedure psAISaveProperties(Sender: TObject); + private + FChat : TChatControl; + FAIClient : TAIClient; + FChatState : TChatState; + procedure HandleAIAnswer(Sender: TObject; aResponses: TPromptResponseArray); + procedure HandleRequestError(Sender: TObject; aErrorData: TAIRequestErrorData); + procedure SetState(aState : TChatState); + Procedure CheckState; + function ExtractModelID(S: String): string; + procedure HandleGetModels(Sender: TObject; aModels: TModelDataArray); + property State : TChatState Read FChatState Write SetState; + public + + end; + +var + MainChatForm: TMainChatForm; + +implementation + +{$R *.lfm} + +{ TMainChatForm } + +procedure TMainChatForm.FormCreate(Sender: TObject); +begin + FChat:=TChatControl.Create(Self); + FChat.Parent:=GBChat; + FChat.Align:=alClient; + FChat.Width:=ClientWidth div 2; + FAIClient:=TAIClient.Create(Self); + FAIClient.Settings.Protocol:=TJanAIServerProtocol.protocolname; + FAIClient.OnError:=@HandleRequestError; + FAIClient.SynchronizeCallBacks:=True; + FAIClient.Settings.DefaultMaxLength:=2048; + psAI.IniFileName:=GetAppConfigFile(False); + psAI.Active:=True; + mPrompt.Text:=FAIClient.Settings.DefaultModel; + SetState(csDisconnected); +end; + +procedure TMainChatForm.handlePrompt(Sender: TObject); + +var + S : String; + +begin + if State<>csWaiting then exit; + S:=mPrompt.Text; + FChat.AddText(S,tsRight); + FChat.LeftTyping:=True; + FAIClient.SendPrompt(@HandleAIAnswer,mPrompt.Text); + State:=csAIThinking; +end; + +procedure TMainChatForm.psAIRestoreProperties(Sender: TObject); +begin + FAIClient.Settings.BaseURL:=psAI.ReadString('URL',''); + FAIClient.Settings.DefaultModel:=psAI.ReadString('model',''); + edtURL.Text:=FAIClient.Settings.BaseURL; +end; + +procedure TMainChatForm.psAISaveProperties(Sender: TObject); +begin + psAI.WriteString('URL',FAIClient.Settings.BaseURL); + psAI.WriteString('model',FAIClient.Settings.DefaultModel); +end; + +procedure TMainChatForm.SetState(aState: TChatState); +begin + if aState=FChatState then exit; + FChatState:=aState; + CheckState; +end; + +procedure TMainChatForm.HandleRequestError(Sender: TObject; aErrorData: TAIRequestErrorData); + +var + Msg : TStrings; + +begin + Msg:=TStringList.Create; + try + Msg.Add('Drat!'); + Msg.Add('An error occurred while talking to the AI!'); + Msg.Add('Here is the error we got: '+aErrorData.Error); + Msg.Add('This is what we were trying to do: '+aErrorData.Method+' '+aErrorData.URL); + if aErrorData.RequestBody<>'' then + begin + Msg.Add('And this is what we were saying:'); + Msg.Add(aErrorData.RequestBody); + end; + FChat.AddText(Msg.Text,tsLeft); + FChat.LeftTyping:=False; + if State=csAIThinking then + State:=csWaiting + else + State:=csDisconnected; + finally + Msg.Free; + end; +end; + +procedure TMainChatForm.HandleAIAnswer(Sender: TObject; aResponses: TPromptResponseArray); +begin + FChat.LeftTyping:=False; + State:=csWaiting; + if Length(aResponses)=0 then + FChat.AddText('No answer from AI, try refining your prompt',tsLeft) + else + FChat.AddText(aResponses[0].Response,tsLeft); +end; + +procedure TMainChatForm.CheckState; +begin + pnlPrompt.Enabled:=(State=csWaiting); + if State<csConnected then + begin + cbModels.Clear; + cbModels.Items.Clear; + end; +end; + +procedure TMainChatForm.HandleGetModels(Sender: TObject; aModels: TModelDataArray); + +var + aModel : TModelData; + Idx,I : Integer; +begin + Idx:=-1; + With cbModels.Items do + begin + BeginUpdate; + For aModel in aModels do + begin + I:=Add('['+aModel.ID+'] '+aModel.Name); + if aModel.ID=FAIClient.Settings.DefaultModel then + Idx:=I; + end; + EndUpdate; + end; + cbModels.ItemIndex:=Idx; + FChat.LeftTyping:=False; + if Idx>=0 then + State:=csWaiting + else + State:=csConnected; +end; + +procedure TMainChatForm.handleConnect(Sender: TObject); +begin + FAIClient.Settings.BaseURL:=edtURL.Text; + FAIClient.GetModels(@HandleGetModels); + FChat.LeftTyping:=True; +end; + +procedure TMainChatForm.edtURLChange(Sender: TObject); +begin + State:=csDisconnected; +end; + +function TMainChatForm.ExtractModelID(S : String) : string; + +var + P1,P2 : Integer; + +begin + P1:=Pos('[',S); + P2:=Pos(']',S); + if (P1>0) and (P2>P1) then + Result:=Copy(S,P1+1,P2-P1-1) + else + Result:=S; +end; + +procedure TMainChatForm.cbModelsChange(Sender: TObject); + +var + mID : String; + +begin + mID:=ExtractModelID(cbModels.Text); + FAIClient.Settings.DefaultModel:=mID; + if mID<>'' then + State:=csWaiting; +end; + +end. + diff --git a/components/aissist/demos/gui/uiassist.ico b/components/aissist/demos/gui/uiassist.ico new file mode 100644 index 0000000000000000000000000000000000000000..10c5fc1a3d8d9ff264229f4ff1cf99ebc83f167f GIT binary patch literal 133345 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 literal 0 HcmV?d00001 diff --git a/components/aissist/demos/gui/uiassist.lpi b/components/aissist/demos/gui/uiassist.lpi new file mode 100644 index 0000000000..dfdd761ad8 --- /dev/null +++ b/components/aissist/demos/gui/uiassist.lpi @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="12"/> + <General> + <SessionStorage Value="InProjectDir"/> + <Title Value="uiassist"/> + <Scaled Value="True"/> + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <XPManifest> + <DpiAware Value="True"/> + </XPManifest> + <Icon Value="0"/> + </General> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="chatctrls"/> + </Item> + <Item> + <PackageName Value="janai"/> + </Item> + <Item> + <PackageName Value="aissist"/> + </Item> + <Item> + <PackageName Value="LCL"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="uiassist.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="frmmain.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="MainChatForm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <Target> + <Filename Value="uiassist"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/components/aissist/demos/gui/uiassist.lpr b/components/aissist/demos/gui/uiassist.lpr new file mode 100644 index 0000000000..8fe24320cb --- /dev/null +++ b/components/aissist/demos/gui/uiassist.lpr @@ -0,0 +1,26 @@ +program uiassist; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX} + cthreads, + {$ENDIF} + {$IFDEF HASAMIGA} + athreads, + {$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, frmmain, chatcontrol, typingindicator + { you can add units after this }; + +{$R *.res} + +begin + RequireDerivedFormResource:=True; + Application.Scaled:=True; + Application.{%H-}MainFormOnTaskbar:=True; + Application.Initialize; + Application.CreateForm(TMainChatForm, MainChatForm); + Application.Run; +end. + diff --git a/components/aissist/demos/gui/uiassist.res b/components/aissist/demos/gui/uiassist.res new file mode 100644 index 0000000000000000000000000000000000000000..bb86af9234e2d748f6f066c82b1d3c4fb3eacd19 GIT binary patch literal 135460 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 literal 0 HcmV?d00001 diff --git a/components/aissist/ide/aissistcontroller.pas b/components/aissist/ide/aissistcontroller.pas new file mode 100644 index 0000000000..9f53b4e199 --- /dev/null +++ b/components/aissist/ide/aissistcontroller.pas @@ -0,0 +1,168 @@ +{ Copyright (C) 2024 + + ***************************************************************************** + See the file COPYING.modifiedLGPL.txt, included in this distribution, + for details about the license. + ***************************************************************************** + + Author: Michael Van Canneyt + + Abstract: AI Assistant controller +} +unit AIssistController; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, AIClient, JanAIProtocol, SrcEditorIntf, IDEOptionsIntf, IDEOptEditorIntf, BaseIDEIntf; + +Type + TAIState = (csDisconnected,csConnected,csWaiting,csAIThinking); + + { TAIssistController } + TAIssistController = Class(TComponent) + private + FConfigFrame: TAbstractIDEOptionsEditorClass; + FSettings: TAIServerSettings; + class var _Instance: TAIssistController; + Public + class constructor Init; + class destructor done; + Class property Instance : TAIssistController Read _Instance; + Public + constructor create(aOwner : TComponent); override; + Destructor destroy; override; + procedure HandleShowConfig(Sender : TObject); + function ShowConfig: Boolean; + Procedure LoadConfig; + Procedure SaveConfig; + Function CreateAIClient : TAIClient; + Function ExplainCurrentSelection (aEdit : TSourceEditorInterface): Boolean; + Function Configured : Boolean; + Property Settings : TAIServerSettings Read FSettings; + Property ConfigFrame : TAbstractIDEOptionsEditorClass Read FConfigFrame Write FConfigFrame; + end; + +Function AIController : TAIssistController; + +implementation + +uses LazIDEintf, StrAIssist, LazConfigStorage, forms, frmaixplain; + +const + DefaultMaxLength = 2048; + +function AIController: TAIssistController; +begin + Result:=TAIssistController.Instance; +end; + +{ TAIssistController } + +class constructor TAIssistController.Init; +begin + _Instance:=TAIssistController.Create(nil); +end; + +class destructor TAIssistController.done; +begin + FreeAndNil(_Instance); +end; + +constructor TAIssistController.create(aOwner: TComponent); +begin + inherited create(aOwner); + FSettings:=TAIServerSettings.Create; + FSettings.Protocol:=TJanAIServerProtocol.protocolname; +end; + +destructor TAIssistController.destroy; +begin + FreeAndNil(FSettings); + inherited destroy; +end; + +procedure TAIssistController.HandleShowConfig(Sender: TObject); +begin + ShowConfig; +end; + +function TAIssistController.ShowConfig : Boolean; +begin + Result:=LazarusIDE.DoOpenIDEOptions(ConfigFrame); +end; + +procedure TAIssistController.LoadConfig; +var + Storage : TConfigStorage; +begin + Storage:=GetIDEConfigStorage(SConfigFile, True); + with Storage do + try + Settings.Protocol := GetValue(KeyProtocol,Settings.Protocol); + Settings.BaseURL := GetValue(KeyServerURL,''); + Settings.DefaultModel:= GetValue(KeyDefaultModel,''); + Settings.DefaultMaxLength:= GetValue(KeyDefaultMaxLength,DefaultMaxLength); + finally + Free; + end; +end; + +procedure TAIssistController.SaveConfig; +var + Storage : TConfigStorage; +begin + Storage:=GetIDEConfigStorage(SConfigFile, True); + with Storage do + try + SetDeleteValue(KeyServerURL,Settings.BaseURL,''); + SetDeleteValue(KeyProtocol,Settings.Protocol,TJanAIServerProtocol.protocolname); + SetDeleteValue(KeyDefaultModel,Settings.DefaultModel,''); + SetDeleteValue(KeyDefaultMaxLength,Settings.DefaultMaxLength, DefaultMaxLength); + finally + Free; + end; +end; + +function TAIssistController.CreateAIClient: TAIClient; +begin + Result:=Nil; + If Not Configured then exit; + Result:=TAIClient.Create(Self); + Result.Settings:=Self.Settings; +end; + +function TAIssistController.ExplainCurrentSelection(aEdit : TSourceEditorInterface): Boolean; + +var + frm : TAIxplainForm; + Clnt : TAIClient; + lPos,Caret : TPoint; + +begin + // todo: show messages + if Not Assigned(aEdit) then exit(False); + if not Configured then exit(False); + + frm:=TAIxplainForm.Create(Application); + Caret:=aEdit.CursorScreenXY; + lPos:=aEdit.EditorControl.ClientToScreen(aEdit.ScreenToPixelPosition(Caret)); + Frm.Top:=lPos.Y; + Frm.Left:=lPos.X; + Clnt:=CreateAIClient; + Frm.Explain(aEdit,Clnt); + frm.Show; +end; + +function TAIssistController.Configured: Boolean; +begin + Result:=(Settings.BaseURL<>''); + Result:=Result and ((Settings.Protocol<>'') and (TAIClient.FindProtocolClass(Settings.Protocol)<>Nil)); + Result:=Result and (Settings.DefaultModel<>''); + Result:=Result and (Settings.DefaultMaxLength>500); +end; + +end. + diff --git a/components/aissist/ide/fraaissistconfig.lfm b/components/aissist/ide/fraaissistconfig.lfm new file mode 100644 index 0000000000..091c0b55db --- /dev/null +++ b/components/aissist/ide/fraaissistconfig.lfm @@ -0,0 +1,146 @@ +object AIAssistentConfigFrame: TAIAssistentConfigFrame + Left = 0 + Height = 239 + Top = 0 + Width = 445 + ClientHeight = 239 + ClientWidth = 445 + TabOrder = 0 + DesignLeft = 530 + DesignTop = 419 + object CBProtocol: TComboBox + AnchorSideTop.Control = Owner + Left = 120 + Height = 28 + Top = 8 + Width = 227 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 8 + ItemHeight = 0 + TabOrder = 0 + Text = 'CBProtocol' + OnChange = CBProtocolChange + end + object lblProtocol: TLabel + AnchorSideTop.Control = CBProtocol + AnchorSideRight.Control = CBProtocol + AnchorSideBottom.Control = CBProtocol + AnchorSideBottom.Side = asrBottom + Left = 56 + Height = 28 + Top = 8 + Width = 56 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight, akBottom] + AutoSize = False + BorderSpacing.Right = 8 + Caption = 'Protocol' + Layout = tlCenter + end + object edtURL: TEdit + AnchorSideTop.Control = CBProtocol + AnchorSideTop.Side = asrBottom + Left = 120 + Height = 28 + Top = 44 + Width = 307 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 8 + TabOrder = 1 + TextHint = 'Enter AI API Server URL' + end + object lblURL: TLabel + AnchorSideTop.Control = edtURL + AnchorSideRight.Control = edtURL + AnchorSideBottom.Control = edtURL + AnchorSideBottom.Side = asrBottom + Left = 43 + Height = 28 + Top = 44 + Width = 69 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight, akBottom] + AutoSize = False + BorderSpacing.Right = 8 + Caption = 'Server URL' + Layout = tlCenter + end + object cbModel: TComboBox + AnchorSideTop.Control = edtURL + AnchorSideTop.Side = asrBottom + Left = 120 + Height = 28 + Top = 80 + Width = 227 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 8 + ItemHeight = 0 + TabOrder = 2 + end + object lblModel: TLabel + AnchorSideTop.Control = cbModel + AnchorSideRight.Control = cbModel + AnchorSideBottom.Control = cbModel + AnchorSideBottom.Side = asrBottom + Left = 16 + Height = 28 + Top = 80 + Width = 96 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight, akBottom] + AutoSize = False + BorderSpacing.Right = 8 + Caption = 'Default model' + Layout = tlCenter + end + object edtMaxResponseLength: TLazIntegerEdit + AnchorSideTop.Control = cbModel + AnchorSideTop.Side = asrBottom + Left = 120 + Height = 28 + Top = 116 + Width = 80 + Value = 0 + MinValue = -9223372036854775808 + MaxValue = 9223372036854775807 + SetDecimalKeys = '#' + HexIndicator = '$' + ToggleHexKeys = '$x' + OctIndicator = '&' + ToggleOctKeys = '&' + BinIndicator = '%' + ToggleBinKeys = '%' + BorderSpacing.Top = 8 + TabOrder = 3 + Text = '0' + end + object lblMaxLength: TLabel + AnchorSideTop.Control = edtMaxResponseLength + AnchorSideRight.Control = edtMaxResponseLength + AnchorSideBottom.Control = edtMaxResponseLength + AnchorSideBottom.Side = asrBottom + Left = 34 + Height = 28 + Top = 116 + Width = 78 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight, akBottom] + AutoSize = False + BorderSpacing.Right = 8 + Caption = 'Max. Length' + Layout = tlCenter + end + object btnRefresh: TButton + AnchorSideTop.Control = cbModel + AnchorSideBottom.Control = cbModel + AnchorSideBottom.Side = asrBottom + Left = 352 + Height = 28 + Top = 80 + Width = 75 + Anchors = [akTop, akRight, akBottom] + Caption = 'Refresh' + TabOrder = 4 + OnClick = HandleRefreshClick + end +end diff --git a/components/aissist/ide/fraaissistconfig.pas b/components/aissist/ide/fraaissistconfig.pas new file mode 100644 index 0000000000..5b9ff20317 --- /dev/null +++ b/components/aissist/ide/fraaissistconfig.pas @@ -0,0 +1,173 @@ +{ Copyright (C) 2024 + + ***************************************************************************** + See the file COPYING.modifiedLGPL.txt, included in this distribution, + for details about the license. + ***************************************************************************** + + Author: Michael Van Canneyt + + Abstract: AI Assistant configuration frame +} +unit fraAIssistConfig; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, StdCtrls, AIClient, + IDEOptionsIntf, IDEOptEditorIntf, IDEUtils, IDEDialogs, LazNumEdit; + +type + + { TAIAssistentConfigFrame } + + TAIAssistentConfigFrame = class(TAbstractIDEOptionsEditor) + btnRefresh: TButton; + CBProtocol: TComboBox; + cbModel: TComboBox; + edtURL: TEdit; + lblProtocol: TLabel; + lblModel: TLabel; + edtMaxResponseLength: TLazIntegerEdit; + lblMaxLength: TLabel; + lblURL: TLabel; + procedure CBProtocolChange(Sender: TObject); + procedure HandleRefreshClick(Sender: TObject); + private + FBusy : Boolean; + FClient : TAIClient; + procedure CheckURL; + function ExtractModelID(const S: String): string; + procedure GetModelNames; + procedure HandleModels(Sender: TObject; aModels: TModelDataArray); + public + function GetTitle: String; override; + procedure Setup({%H-}ADialog: TAbstractOptionsEditorDialog); override; + procedure ReadSettings({%H-}AOptions: TAbstractIDEOptions); override; + procedure WriteSettings({%H-}AOptions: TAbstractIDEOptions); override; + class function SupportedOptionsClass: TAbstractIDEOptionsClass; override; + + end; + +implementation + +uses StrAIssist, AIssistController; + +{$R *.lfm} + +{ TAIAssistentConfigFrame } + +procedure TAIAssistentConfigFrame.HandleModels(Sender: TObject; aModels: TModelDataArray); + +var + aModel : TModelData; + Idx,I : Integer; +begin + FBusy:=False; + Idx:=-1; + With cbModel.Items do + begin + BeginUpdate; + Clear; + For aModel in aModels do + begin + I:=Add('['+aModel.ID+'] '+aModel.Name); + if SameText(aModel.ID,AIController.Settings.DefaultModel) then + Idx:=I; + end; + EndUpdate; + end; + if CBModel.Text='' then + cbModel.ItemIndex:=Idx; +end; + +function TAIAssistentConfigFrame.GetTitle: String; +begin + Result:=SConfigTitle; +end; + +procedure TAIAssistentConfigFrame.Setup(ADialog: TAbstractOptionsEditorDialog); +begin + if ADialog<>Nil then ; // Silence compiler warning + TAIClient.GetProtocolList(CBProtocol.Items); +end; + +procedure TAIAssistentConfigFrame.ReadSettings(AOptions: TAbstractIDEOptions); +begin + CBProtocol.ItemIndex:=CBProtocol.Items.IndexOf(AIController.Settings.Protocol); + EdtURL.Text:=AIController.Settings.BaseURL; + CheckURL; + cbModel.Text:=AIController.Settings.DefaultModel; + edtMaxResponseLength.Value:=AIController.Settings.DefaultMaxLength; + if AIController.Configured then + GetModelNames; +end; + +procedure TAIAssistentConfigFrame.HandleRefreshClick(Sender: TObject); +begin + GetModelNames; +end; + +procedure TAIAssistentConfigFrame.CBProtocolChange(Sender: TObject); + +begin + CheckURL; +end; + +procedure TAIAssistentConfigFrame.CheckURL; + +var + lClass : TAIProtocolClass; + +begin + if edtURL.Text<>'' then + exit; + lClass:=TAIClient.FindProtocolClass(CBProtocol.Text); + if lClass<>Nil then + edtURL.Text:=lClass.DefaultURL; +end; + +procedure TAIAssistentConfigFrame.GetModelNames; +begin + if FBusy then exit; + if not Assigned(FClient) then + FClient:=TAIClient.Create(Self); + FClient.Settings.Protocol:=cbProtocol.Text; + FClient.Settings.BaseURL:=edtURL.Text; + FClient.SynchronizeCallBacks:=True; + FBusy:=True; + FClient.GetModels(@HandleModels); +end; + +function TAIAssistentConfigFrame.ExtractModelID(const S : String) : string; + +var + P1,P2 : Integer; + +begin + P1:=Pos('[',S); + P2:=Pos(']',S); + if (P1>0) and (P2>P1) then + Result:=Copy(S,P1+1,P2-P1-1) + else + Result:=S; +end; + +procedure TAIAssistentConfigFrame.WriteSettings(AOptions: TAbstractIDEOptions); +begin + AIController.Settings.Protocol:=cbProtocol.Text; + AIController.Settings.BaseURL := EdtURL.Text; + AIController.Settings.DefaultModel := ExtractModelID(cbModel.Text); + AIController.Settings.DefaultMaxLength := edtMaxResponseLength.Value; + AIController.SaveConfig; +end; + +class function TAIAssistentConfigFrame.SupportedOptionsClass: TAbstractIDEOptionsClass; +begin + Result:=IDEEditorGroups.GetByIndex(GroupEnvironment)^.GroupClass; +end; + +end. + diff --git a/components/aissist/ide/frmaissistchat.lfm b/components/aissist/ide/frmaissistchat.lfm new file mode 100644 index 0000000000..a2154687e7 --- /dev/null +++ b/components/aissist/ide/frmaissistchat.lfm @@ -0,0 +1,85 @@ +object AIssistChatForm: TAIssistChatForm + Left = 544 + Height = 477 + Top = 278 + Width = 786 + Caption = 'AI Assistent conversation form' + ClientHeight = 477 + ClientWidth = 786 + LCLVersion = '4.99.0.0' + OnCreate = FormCreate + object pnlPrompt: TPanel + Left = 0 + Height = 143 + Top = 334 + Width = 786 + Align = alBottom + ClientHeight = 143 + ClientWidth = 786 + TabOrder = 0 + object lblPrompt: TLabel + Left = 30 + Height = 16 + Top = 17 + Width = 79 + Caption = 'Your prompt:' + end + object mPrompt: TMemo + Left = 128 + Height = 112 + Top = 16 + Width = 545 + Anchors = [akTop, akLeft, akRight, akBottom] + TabOrder = 0 + end + object btnPrompt: TButton + Left = 689 + Height = 25 + Top = 17 + Width = 88 + Anchors = [akTop, akRight] + Caption = 'Prompt AI' + TabOrder = 1 + OnClick = HandlePrompt + end + object btnConfigure: TButton + Left = 689 + Height = 25 + Top = 103 + Width = 88 + Anchors = [akRight, akBottom] + Caption = 'Configure...' + TabOrder = 2 + OnClick = HandleConfigureClick + end + end + object GBChat: TGroupBox + Left = 0 + Height = 329 + Top = 0 + Width = 786 + Align = alClient + Caption = 'AI Conversation' + Constraints.MinWidth = 200 + TabOrder = 1 + end + object Splitter1: TSplitter + Cursor = crVSplit + Left = 0 + Height = 5 + Top = 329 + Width = 786 + Align = alBottom + ResizeAnchor = akBottom + ResizeStyle = rsPattern + end + object pmChat: TPopupMenu + OnPopup = pmChatPopup + Left = 107 + Top = 82 + object MICopy: TMenuItem + Caption = '&Copy' + OnClick = MICopyClick + end + end +end diff --git a/components/aissist/ide/frmaissistchat.pas b/components/aissist/ide/frmaissistchat.pas new file mode 100644 index 0000000000..990894b310 --- /dev/null +++ b/components/aissist/ide/frmaissistchat.pas @@ -0,0 +1,209 @@ +{ Copyright (C) 2024 + + ***************************************************************************** + See the file COPYING.modifiedLGPL.txt, included in this distribution, + for details about the license. + ***************************************************************************** + + Author: Michael Van Canneyt + + Abstract: AI Assistant conversation window +} +unit frmaissistchat; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ChatControl, TypingIndicator, + LCLType, StdCtrls, ExtCtrls, Menus, AIClient; + +type + + { TAIssistChatForm } + TChatState = (csUnconfigured,csWaiting,csAIThinking); + + TAIssistChatForm = class(TForm) + btnPrompt: TButton; + btnConfigure: TButton; + GBChat: TGroupBox; + lblPrompt: TLabel; + MICopy: TMenuItem; + mPrompt: TMemo; + pnlPrompt: TPanel; + pmChat: TPopupMenu; + Splitter1: TSplitter; + procedure FormCreate(Sender: TObject); + procedure HandleConfigureClick(Sender: TObject); + procedure HandlePrompt(Sender: TObject); + procedure MICopyClick(Sender: TObject); + procedure pmChatPopup(Sender: TObject); + private + FChat : TChatControl; + FAIClient : TAIClient; + FChatState : TChatState; + FOnConfigure: TNotifyEvent; + procedure CheckState; + procedure ConfigureServer; + procedure CreateServer; + procedure HandleAIAnswer(Sender: TObject; aResponses: TPromptResponseArray); + procedure HandleRequestError(Sender: TObject; aErrorData: TAIRequestErrorData); + procedure SetState(AValue: TChatState); + public + { public declarations } + property State : TChatState Read FChatState Write SetState; + property OnConfigure : TNotifyEvent Read FOnConfigure Write FOnConfigure; + end; + + + +implementation + +uses ClipBrd,StrAIssist, AIssistController; + +{$R *.lfm} + +{ TAIssistChatForm } + +procedure TAIssistChatForm.HandleAIAnswer(Sender: TObject; aResponses: TPromptResponseArray); +begin + FChat.LeftTyping:=False; + State:=csWaiting; + if Length(aResponses)=0 then + FChat.AddText(SErrNoAnswer,tsLeft) + else + FChat.AddText(aResponses[0].Response,tsLeft); +end; + +procedure TAIssistChatForm.HandleRequestError(Sender: TObject; aErrorData: TAIRequestErrorData); + +var + Msg : TStrings; + +begin + Msg:=TStringList.Create; + try + Msg.Add(SErrorTitle); + Msg.Add(SErrorIntro); + Msg.Add(SErrorInfo,[aErrorData.Error]); + Msg.Add(SErrorContext,[aErrorData.Method,aErrorData.URL]); + if aErrorData.RequestBody<>'' then + begin + Msg.Add(SErrorBody); + Msg.Add(aErrorData.RequestBody); + end; + FChat.AddText(Msg.Text,tsLeft); + FChat.LeftTyping:=False; + if State=csAIThinking then + State:=csWaiting + else + State:=csUnconfigured; + finally + Msg.Free; + end; +end; + +procedure TAIssistChatForm.SetState(AValue: TChatState); +begin + if FChatState=AValue then Exit; + FChatState:=AValue; + CheckState; +end; + +procedure TAIssistChatForm.FormCreate(Sender: TObject); +begin + FChat:=TChatControl.Create(Self); + FChat.Parent:=GBChat; + FChat.Align:=alClient; + FChat.Width:=ClientWidth div 2; + FChat.PopupMenu:=pmChat; + CreateServer; +end; + +procedure TAIssistChatForm.CreateServer; + +begin + FAIClient:=AIController.CreateAIClient; + if Assigned(FAIClient) then + ConfigureServer + else + FChat.AddText(SErrPleaseConfigure,tsLeft); +end; + +procedure TAIssistChatForm.HandleConfigureClick(Sender: TObject); +begin + if Assigned(FOnConfigure) then + FOnConfigure(Self); + FreeAndNil(FAIClient); + State:=csUnconfigured; + CreateServer; +end; + +procedure TAIssistChatForm.CheckState; + +begin + pnlPrompt.Enabled:=(State=csWaiting); +end; + +procedure TAIssistChatForm.ConfigureServer; + +begin + FAIClient.OnError:=@HandleRequestError; + FAIClient.SynchronizeCallBacks:=True; + State:=csWaiting; +end; + +procedure TAIssistChatForm.HandlePrompt(Sender: TObject); +var + S : String; + +begin + Case State of + csUnconfigured : FChat.AddText(SErrPleaseConfigure,tsLeft); + csAIThinking : FChat.AddText(SErrAIWaiting,tsLeft); + end; + if State<>csWaiting then + exit; + S:=mPrompt.Text; + if S='' then + begin + FChat.AddText(SErrPleaseEnterPrompt,tsLeft); + exit; + end; + FChat.AddText(S,tsRight); + FChat.LeftTyping:=True; + FAIClient.SendPrompt(@HandleAIAnswer,S); + State:=csAIThinking; +end; + +procedure TAIssistChatForm.MICopyClick(Sender: TObject); + +var + lPt : TPoint; + Item : TChatItem; + +begin + lPt:=pmChat.PopupPoint; + lpt:=FChat.ScreenToClient(lpt); + Item:=FChat.GetItemAt(lPt.X,lPt.Y); + if Item<>Nil then + Clipboard.AsText:=Item.Text; +end; + +procedure TAIssistChatForm.pmChatPopup(Sender: TObject); +var + lPt : TPoint; + Item : TChatItem; + HaveItem : Boolean; + +begin + lPt:=pmChat.PopupPoint; + lpt:=FChat.ScreenToClient(lpt); + Item:=FChat.GetItemAt(lPt.X,lPt.Y); + HaveItem:=Item<>Nil; + MICopy.Enabled:=HaveItem; +end; + +end. + diff --git a/components/aissist/ide/frmaixplain.lfm b/components/aissist/ide/frmaixplain.lfm new file mode 100644 index 0000000000..0a9ec9802e --- /dev/null +++ b/components/aissist/ide/frmaixplain.lfm @@ -0,0 +1,121 @@ +object AIxplainForm: TAIxplainForm + Left = 681 + Height = 481 + Top = 256 + Width = 643 + BorderStyle = bsSizeToolWin + Caption = 'AI Code explainer' + ClientHeight = 481 + ClientWidth = 643 + FormStyle = fsStayOnTop + ShowInTaskBar = stNever + LCLVersion = '3.99.0.0' + OnClose = FormClose + OnCreate = FormCreate + object pnlThinking: TPanel + Left = 0 + Height = 26 + Top = 0 + Width = 643 + Align = alTop + BevelOuter = bvNone + Caption = 'AI is thinking about it... ' + TabOrder = 0 + OnClick = pnlThinkingClick + end + object nbExplain: TNotebook + Left = 0 + Height = 405 + Top = 26 + Width = 643 + PageIndex = 0 + Align = alClient + TabOrder = 2 + object PPrompt: TPage + object mPrompt: TMemo + Left = 0 + Height = 405 + Top = 0 + Width = 643 + Align = alClient + ScrollBars = ssAutoBoth + TabOrder = 0 + WordWrap = False + end + end + object PReply: TPage + object mExplain: TMemo + Left = 0 + Height = 405 + Top = 0 + Width = 643 + Align = alClient + ReadOnly = True + ScrollBars = ssAutoBoth + TabOrder = 0 + end + end + end + object bpExplain: TButtonPanel + Left = 6 + Height = 38 + Top = 437 + Width = 631 + OKButton.Name = 'OKButton' + OKButton.DefaultCaption = True + HelpButton.Name = 'HelpButton' + HelpButton.DefaultCaption = True + CloseButton.Name = 'CloseButton' + CloseButton.DefaultCaption = True + CancelButton.Name = 'CancelButton' + CancelButton.DefaultCaption = True + TabOrder = 1 + ShowButtons = [pbClose] + object SBRefresh: TSpeedButton + Left = 4 + Height = 28 + Top = 6 + Width = 140 + Align = alLeft + BorderSpacing.Around = 4 + Caption = 'Edit prompt' + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF80293EFF7F2AB1FF7F2ADFFF80 + 2AF4FF7F2AC9FF802B66FF550003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF7F + 2AABFF802C46FFFFFF00FF802008FF802BA2FF7F2AFFFF7F2AE5FF7F2A9DFF7F + 2A8DFF802ACAFF7F2AFFFF802BC0FF792813FFFFFF00FFFFFF00FFFFFF00FF7F + 2AFFFF802A80FF6D2407FF802AC2FF7F2AFDFF7E2B7DFF6D2407FFFFFF00FFFF + FF00FFFFFF00FF802A5CFF802BF6FF7F2AC9FF80330AFFFFFF00FFFFFF00FF7F + 2AFFFF802A80FF8029A0FF7F2AFDFF7E2957FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FF7E2B4DFF7F2AFDFF7F2A97FFFFFF00FFFFFF00FF7F + 2AFFFF7F29A7FF7F2AFFFF7E2B7DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FF7F2B83FF7F2AE3FFFFFF00FFFFFF00FF7F + 2AFFFF7F29F7FF802BEAFF802B8AFF802988FF802C46FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF802B06FFFFFF00FFFFFF00FF7F + 2AFFFF7F2AFFFF7F2AFFFF7F2AFFFF7F2AFFFF7F2AABFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + FFAB0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFF00FFFFFF000000 + FF06FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + FF450000FF770000FF790000FFE70000FFF60000FFFFFFFFFF00FFFFFF000000 + FFE30000FF82FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000FF7D0000FFFF0000FFA70000FFFFFFFFFF00FFFFFF000000 + FF990000FFFC0000FF49FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000FF570000FFFD0000FFA00000FF800000FFFFFFFFFF00FFFFFF000000 + FF0B0000FFCC0000FFF50000FF56FFFFFF00FFFFFF00FFFFFF000000FF070000 + FF7C0000FFFD0000FFC20000FF070000FF800000FFFFFFFFFF00FFFFFF00FFFF + FF000000FF150000FFC50000FFFF0000FFC60000FF8A0000FF9B0000FFE40000 + FFFF0000FFA30000FF08FFFFFF000000FF460000FFABFFFFFF00FFFFFF00FFFF + FF00FFFFFF000000FF040000FF6A0000FFCD0000FFF70000FFE00000FFB10000 + FF3FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + OnClick = SBRefreshClick + end + end +end diff --git a/components/aissist/ide/frmaixplain.pas b/components/aissist/ide/frmaixplain.pas new file mode 100644 index 0000000000..0b96fac888 --- /dev/null +++ b/components/aissist/ide/frmaixplain.pas @@ -0,0 +1,198 @@ +unit frmaixplain; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, ButtonPanel, ComCtrls, Buttons, + typingindicator, SrcEditorIntf, AIClient; + +type + + { TAIxplainForm } + + TAIxplainForm = class(TForm) + bpExplain: TButtonPanel; + mExplain: TMemo; + mPrompt: TMemo; + nbExplain: TNotebook; + PPrompt: TPage; + PReply: TPage; + pnlThinking: TPanel; + SBRefresh: TSpeedButton; + procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure pnlThinkingClick(Sender: TObject); + procedure SBRefreshClick(Sender: TObject); + private + FTyping : TTypingIndicator; + FEditor: TSourceEditorInterface; + FAIClient: TAIClient; + FBusy : Boolean; + procedure ActivateResponse; + procedure CreatePrompt; + function GetPrompt: string; + procedure HandleAIError(Sender: TObject; aErrorData: TAIRequestErrorData); + procedure HandleAIResponse(Sender: TObject; aResponses: TPromptResponseArray); + procedure SendPrompt; + public + procedure Explain(aEditor: TSourceEditorInterface; aAIClient: TAIClient); + end; + +var + AIxplainForm: TAIxplainForm; + +implementation + +uses StrAIssist; + +{$R *.lfm} + +const + piPrompt = 0; + piReply = 1; + +{ TAIxplainForm } + +procedure TAIxplainForm.FormCreate(Sender: TObject); +begin + FTyping:=TTypingIndicator.Create(Self); + FTyping.Parent:=PReply; + FTyping.Visible:=False; + FTyping.Width:=80; + FTyping.Height:=40; + FTyping.Top:=mExplain.Top+24; + FTyping.Left:=mExplain.left+24; + pnlThinking.Visible:=False; + nbExplain.PageIndex:=piReply; + sbRefresh.Caption:=EditPromptCaption; +end; + +procedure TAIxplainForm.pnlThinkingClick(Sender: TObject); +begin + +end; + +procedure TAIxplainForm.SBRefreshClick(Sender: TObject); +begin + if nbExplain.PageIndex=piReply then + begin + nbExplain.PageIndex:=piPrompt; + sbRefresh.Caption:=SendPromptCaption; + end + else if nbExplain.PageIndex=piPrompt then + begin + nbExplain.PageIndex:=piReply; + SendPrompt; + sbRefresh.Caption:=EditPromptCaption; + end; +end; + +procedure TAIxplainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction); +begin + CloseAction:=caFree; +end; + +procedure TAIxplainForm.ActivateResponse; + +begin + FTyping.Visible:=False; + nbExplain.PageIndex:=piReply; + mExplain.Clear; + mExplain.Visible:=True; + SBRefresh.Visible:=True; + pnlThinking.Visible:=False; + sbRefresh.Caption:=EditPromptCaption; +end; + +procedure TAIxplainForm.HandleAIResponse(Sender: TObject; aResponses: TPromptResponseArray); + +var + S : TStrings; + +begin + FBusy:=False; + ActivateResponse; + if (Length(AResponses)=0) then + begin + mExplain.Lines.Add(SNoExplanation); + end + else + begin + mExplain.Lines.Add(SAIExplanation); + S:=TStringList.Create; + try + S.Text:=aResponses[0].Response; + mExplain.Lines.AddStrings(S); + finally + S.Free; + end; + end; +end; + +procedure TAIxplainForm.HandleAIError(Sender: TObject; aErrorData: TAIRequestErrorData); +begin + ActivateResponse; + FBusy:=False; + mExplain.Lines.Add(SErrorTitle); + mExplain.Lines.Add(SErrorIntro); + mExplain.Lines.Add(SErrorInfo,[aErrorData.Error]); + mExplain.Lines.Add(SErrorContext,[aErrorData.Method,aErrorData.URL]); + // Body ? +end; + +procedure TAIxplainForm.Explain(aEditor: TSourceEditorInterface; aAIClient: TAIClient); +begin + FEditor:=aEditor; + FAIClient:=aAIClient; + FAIClient.OnError:=@HandleAIError; + FAIClient.SynchronizeCallBacks:=True; + CreatePrompt; + SendPrompt; +end; + +function TAIxplainForm.GetPrompt : string; + +begin + Result:=mPrompt.Text; +end; + +procedure TAIxplainForm.SendPrompt; + +begin + if FBusy then + exit; + FBusy:=True; + FAIClient.SendPrompt(@HandleAIResponse,GetPrompt); + mExplain.Clear; + mExplain.Visible:=False; + SBRefresh.Visible:=False; + nbExplain.PageIndex:=piReply; + pnlThinking.Visible:=True; + FTyping.Visible:=True; +end; + +procedure TAIxplainForm.CreatePrompt; + +var + S : String; + Src : TStrings; + +begin + Src:=TStringList.Create; + try + S:=Feditor.GetText(True); + if S='' then + S:=Feditor.GetText(False); + Src.Text:=S; + MPrompt.Lines.Add(SExplainPrompt); + MPrompt.Lines.Add(''); + MPrompt.Lines.AddStrings(Src); + finally + Src.Free; + end; +end; + +end. + diff --git a/components/aissist/ide/laz_aissist.lpk b/components/aissist/ide/laz_aissist.lpk new file mode 100644 index 0000000000..49f153a803 --- /dev/null +++ b/components/aissist/ide/laz_aissist.lpk @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <Package Version="5"> + <Name Value="laz_aissist"/> + <Type Value="DesignTime"/> + <Author Value="Michael Van Canneyt"/> + <CompilerOptions> + <Version Value="11"/> + <SearchPaths> + <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + </CompilerOptions> + <Description Value="A simple interface to a local/remote AI model, using a REST API"/> + <License Value="Modified LGPL"/> + <Version Minor="9" Release="1"/> + <Files> + <Item> + <Filename Value="frmaissistchat.pas"/> + <UnitName Value="frmaissistchat"/> + </Item> + <Item> + <Filename Value="reglazaissist.pas"/> + <HasRegisterProc Value="True"/> + <UnitName Value="RegLazAIssist"/> + </Item> + <Item> + <Filename Value="aissistcontroller.pas"/> + <UnitName Value="AIssistController"/> + </Item> + <Item> + <Filename Value="straissist.pas"/> + <UnitName Value="StrAIssist"/> + </Item> + <Item> + <Filename Value="fraaissistconfig.pas"/> + <UnitName Value="fraAIssistConfig"/> + </Item> + <Item> + <Filename Value="frmaixplain.pas"/> + <UnitName Value="frmaixplain"/> + </Item> + </Files> + <RequiredPkgs> + <Item> + <PackageName Value="lazchatctrl"/> + </Item> + <Item> + <PackageName Value="LazControlDsgn"/> + </Item> + <Item> + <PackageName Value="janai"/> + </Item> + <Item> + <PackageName Value="aissist"/> + </Item> + <Item> + <PackageName Value="IDEIntf"/> + </Item> + <Item> + <PackageName Value="FCL"/> + </Item> + </RequiredPkgs> + <UsageOptions> + <UnitPath Value="$(PkgOutDir)"/> + </UsageOptions> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + </Package> +</CONFIG> diff --git a/components/aissist/ide/laz_aissist.pas b/components/aissist/ide/laz_aissist.pas new file mode 100644 index 0000000000..158e5064e5 --- /dev/null +++ b/components/aissist/ide/laz_aissist.pas @@ -0,0 +1,22 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit laz_aissist; + +{$warn 5023 off : no warning about unused units} +interface + +uses + frmaissistchat, RegLazAIssist, AIssistController, StrAIssist, fraAIssistConfig, frmaixplain, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('RegLazAIssist', @RegLazAIssist.Register); +end; + +initialization + RegisterPackage('laz_aissist', @Register); +end. diff --git a/components/aissist/ide/reglazaissist.pas b/components/aissist/ide/reglazaissist.pas new file mode 100644 index 0000000000..ac5380458e --- /dev/null +++ b/components/aissist/ide/reglazaissist.pas @@ -0,0 +1,122 @@ +{ Copyright (C) 2024 + + ***************************************************************************** + See the file COPYING.modifiedLGPL.txt, included in this distribution, + for details about the license. + ***************************************************************************** + + Author: Michael Van Canneyt + + Abstract: AI Assistant registration +} +unit RegLazAIssist; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LazLoggerBase, FileUtil, IDECommands, IDEWindowIntf, LazIDEIntf, MenuIntf, frmaissistchat; + +var + AIssistChatForm: TAIssistChatForm; + AIssistChatFormCreator: TIDEWindowCreator; // set by Register procedure + AIssistOptionsFrameID: integer = 3000; + +procedure ShowAIssistChatForm(Sender: TObject); +procedure Register; // Check the "Register Unit" of this unit in the package editor.implementation + +implementation + +uses + IDEOptionsIntf, IDEOptEditorIntf, AIssistController,SrcEditorIntf, + fraAIssistConfig, Forms, StrAIssist; + +procedure ShowAIssistChatForm(Sender: TObject); +begin + IDEWindowCreators.ShowForm(AIssistChatFormCreator.FormName, true); +end; + +procedure CreateAIssistChatForm(Sender: TObject; aFormName: string; + var AForm: TCustomForm; DoDisableAutoSizing: boolean); +begin + // sanity check to avoid clashing with another package that has registered a window with the same name + if CompareText(aFormName, SAISSistChatForm)<>0 then begin + DebugLn(['ERROR: CreateAIssistChatForm: there is already a form with this name']); + exit; + end; + IDEWindowCreators.CreateForm(AForm, TAIssistChatForm, DoDisableAutoSizing, + LazarusIDE.OwningComponent); + AForm.Name:=aFormName; + AIssistChatForm:=AForm as TAIssistChatForm; + AIssistChatForm.OnConfigure:=@AIController.HandleShowConfig; +end; + +procedure ShowAIxplainForm(Sender : TObject); + +begin + AIController.ExplainCurrentSelection(SourceEditorManagerIntf.ActiveEditor); +end; + +procedure RegisterAIChatWindow; + +var + CmdCatViewMenu: TIDECommandCategory; + ViewAIssistChatFormCommand: TIDECommand; + +begin + // search shortcut category + CmdCatViewMenu:=IDECommandList.FindCategoryByName(CommandCategoryViewName); + // register shortcut + ViewAIssistChatFormCommand:=RegisterIDECommand(CmdCatViewMenu, + SCMDViewAIssistChatForm, + SAIssistChatMenuCaption, + IDEShortCut(Ord('I'), [ssctrl,ssAlt],Ord('C'), [ssctrl,ssAlt]), // <- set here your default shortcut + CleanIDEShortCut, nil, @ShowAIssistChatForm); + // register menu item in View menu + RegisterIDEMenuCommand(itmViewMainWindows, + SCMDViewAIssistChatForm, + SAIssistChatMenuCaption, nil, nil, ViewAIssistChatFormCommand); + + // register dockable Window + AIssistChatFormCreator:=IDEWindowCreators.Add( + 'AIssistChatForm', + @CreateAIssistChatForm, nil, + '100', '100', '900', '700' // default place at left=100, top=100, right=300, bottom=300 + // you can also define percentage values of screen or relative positions, see wiki + ); + // add IDE options frame + AIssistOptionsFrameID:=RegisterIDEOptionsEditor(GroupEnvironment,TAIAssistentConfigFrame, + AIssistOptionsFrameID)^.Index; +end; + +procedure RegisterExplainCommand; + +var + CatTextEditing: TIDECommandCategory; + AIExplainSelectionCommand: TIDECommand; + +begin + CatTextEditing:=IDECommandList.FindCategoryByName(CommandCategoryTextEditingName); + // register shortcut + AIExplainSelectionCommand:=RegisterIDECommand(CatTextEditing, + SCMDExplainSelectedCode, + SAIExplainSelectedCodeCaption, + IDEShortCut(Ord('I'), [ssctrl,ssAlt],Ord('E'), [ssctrl,ssAlt]), // <- set here your default shortcut + CleanIDEShortCut, nil, @ShowAIxplainForm); + // register menu item in View menu + RegisterIDEMenuCommand(itmSourceCodeToolChecks, + SCMDExplainSelectedCode, + SAIExplainSelectedCodeCaption, nil, nil, AIExplainSelectionCommand); +end; + +procedure Register; +begin + AIController.LoadConfig; + AIController.ConfigFrame:=TAIAssistentConfigFrame; + RegisterAIChatWindow; + RegisterExplainCommand; +end; + +end. + diff --git a/components/aissist/ide/straissist.pas b/components/aissist/ide/straissist.pas new file mode 100644 index 0000000000..6ead35fbcf --- /dev/null +++ b/components/aissist/ide/straissist.pas @@ -0,0 +1,57 @@ +{ Copyright (C) 2024 + + ***************************************************************************** + See the file COPYING.modifiedLGPL.txt, included in this distribution, + for details about the license. + ***************************************************************************** + + Author: Michael Van Canneyt + + Abstract: Strings for AI Assistant +} +unit StrAIssist; + +{$mode objfpc}{$H+} + +interface + +const + SAISSistChatForm = 'AIssistChatForm'; + SCMDViewAIssistChatForm = 'ViewAIssistChatForm'; + SCMDExplainSelectedCode = 'AIExplainSelectedCode'; + + SConfigFile = 'aissist.xml'; + KeyServerURL = 'ServerURL'; + KeyProtocol = 'Protocol'; + KeyDefaultModel = 'DefaultModel'; + KeyDefaultMaxLength = 'DefaultMaxLength'; + +Resourcestring + SAIssistChatMenuCaption = 'AIssist chat'; + SAIExplainSelectedCodeCaption = 'AI Explain Selected Code'; + SConfigTitle = 'AI Assistant options'; + + SErrorTitle = 'Drat!'; + SErrorIntro = 'An error occurred while talking to the AI!'; + SErrorInfo = 'Here is the error we got: %s'; + SErrorContext = 'This is what we were trying to do: %s %s'; + SErrorBody = 'And this is what we were saying:'; + + SErrPleaseConfigure = 'No AI server has been configured.'+sLineBreak+ + 'Use the "Configure" button to enter IDE options and configure an AI server'; + SErrPleaseEnterPrompt = 'Please enter an AI prompt such as:'+sLineBreak+ + '"generate a ''Hello,World!'' program in Pascal".'; + SErrAIWaiting = 'The AI engine is still answering your previous prompt.'+ + 'Please wait for it to finish.'; + SErrNoAnswer = 'No answer from AI, try refining your prompt'; + SExplainPrompt = 'Explain the following Object Pascal code:'; + SNoExplanation = 'The AI could not explain. Maybe ask a different question?'; + SAIExplanation = 'This is what the AI thinks of the selected code:'; + + SendPromptCaption = 'Send AI prompt'; + EditPromptCaption = 'Edit AI prompt'; + +implementation + +end. + diff --git a/components/aissist/lazaissist.lpg b/components/aissist/lazaissist.lpg new file mode 100644 index 0000000000..2e58460af8 --- /dev/null +++ b/components/aissist/lazaissist.lpg @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectGroup FileVersion="2"> + <Targets> + <Target FileName="api/aissist.lpk"/> + <Target FileName="api/janai/janai.lpk"/> + <Target FileName="ctrls/chatctrls.lpk"/> + <Target FileName="ide/laz_aissist.lpk"/> + <Target FileName="gui/uiassist.lpi"> + <BuildModes> + <Mode Name="Default"/> + </BuildModes> + </Target> + <Target FileName="testaissist.lpi"> + <BuildModes> + <Mode Name="Default"/> + </BuildModes> + </Target> + <Target FileName="ctrls/demo/chatdemo.lpi"> + <BuildModes> + <Mode Name="Default"/> + </BuildModes> + </Target> + </Targets> + </ProjectGroup> +</CONFIG>