From 380f04b6e4f7196f116931b182bd989cb25c60e7 Mon Sep 17 00:00:00 2001 From: HemulGM Date: Wed, 31 Jul 2024 22:48:48 +0500 Subject: [PATCH] History for console quick chat, icons for components --- Media/openai.bmp | Bin 0 -> 2358 bytes Media/openai.png | Bin 0 -> 3132 bytes Media/openai_chat.bmp | Bin 0 -> 2358 bytes Media/openai_chat.png | Bin 0 -> 3365 bytes Media/openai_func.bmp | Bin 0 -> 2358 bytes Media/openai_func.png | Bin 0 -> 3557 bytes OpenAI.Utils.ChatHistory.pas | 1 + OpenAI.pas | 22 +++++++++++++- OpenAIPackage.dpk | 19 ++++++------ OpenAIPackage.dproj | 46 +++++++++--------------------- Samples/Chat/Chat.Main.fmx | 10 ++++--- Samples/Chat/Chat.Main.pas | 14 ++++----- Samples/Chat/SimpleChat.dproj | 38 ++++-------------------- Samples/QuickChat/QuickChat.dpr | 2 +- Samples/QuickChat/QuickChat.dproj | 23 +++------------ hIcons.dcr | Bin 0 -> 14252 bytes 16 files changed, 68 insertions(+), 107 deletions(-) create mode 100644 Media/openai.bmp create mode 100644 Media/openai.png create mode 100644 Media/openai_chat.bmp create mode 100644 Media/openai_chat.png create mode 100644 Media/openai_func.bmp create mode 100644 Media/openai_func.png create mode 100644 hIcons.dcr diff --git a/Media/openai.bmp b/Media/openai.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0f77def85570f94b4c6db81f354da444c0d6b048 GIT binary patch literal 2358 zcmd5-Nl2ba5KVq?7Z+SIh#NDagNmZT{i4A{5SKZK;EGE?!GpM?8F6sC$SfWdR0wei zE+Fc~gW_%kC0<11DI^;AgL=@5sBh{ODnDWd85o#`(!cxbdiCmcb@hwHP>UxzLgnwz zVn5v2(;F9fWQZ+_-Hs*sk@as`i?1L3#d5{oEG#S_Dk=(srxp+9?2>FL4Sw{Owd*a$Z_H^jumps=tI+1c6f_V(5|t*x!H9qo_7mwg`R z=jUi?X@Q4_hx(hEn%;5l?(Qa5pIG+dsvS?}n?ZD^yigsZV-( zI{NzhFflO!`X?qP!p6o%F&7v07@El?GBOg*&d#@54GK>5Lvdt1oBZS(ii?YJad9C_ zs5v+|z{$x8h}G5Ag=f#6!OqSO_4W1q{@3{UxcZowm>@MZ6<@x5;d-)h44Er;awMP2 z%S-N=Zfa_RySqCa9UW0yTg$bN-@biAWo0F(+s@7oR#sMEZEdZb{QdnA7Z->9{eA9r zyNw~gZBI{65gs0nf`S4}PEP7sGMAj39L&znA~rS_&!0cn^S-{mMqpqds1wc7(h_TH zYZx9L)?BKqtBK!igs=Sb^YdYAYYQtYD+C7zV|sd8bJ^bBMrdfL=Hln)r`SP3L8`_4 z{5%W>1E!{?RMVuSB)GV^5P#PQ-;Mm^e}Ak9(XU9=jiAtF@G;DE!8KIc8>N!1_y0PS)C%eP506zp~yF5)w4W)zww4#s2<&Y;0^O7BPt}_9J64 zrmL%~{wEi5A~$k;K!44tq@;uxe=uh=Gc!SE zL5-=k4CDIQ<(aTPS@+~`VPS!}xj8*Uo+ZzloIO1~5fT!Dt*tH9gEhdqVomT~d)xV*kL6$H>{dqTehU6mS zjz8nb{Fl$4KO-e2MLBVacVEVz?4S1b_KHcJ*(<0qdxwl)sVRF3eQtVSHZkuH+53XA zhlYl<&ydgA*%>jKmX?-~m6fIUj~v# zSBa0+_weqo%igDqF*Y`)=O*7Z7T-wLl#DlGd^`Du`rY?`>|A^^#XgAL4n8g!kM;kr G_x%m0JqF$Y literal 0 HcmV?d00001 diff --git a/Media/openai.png b/Media/openai.png new file mode 100644 index 0000000000000000000000000000000000000000..f78745d04f48a7b3c296ca7bcf592fe34686e312 GIT binary patch literal 3132 zcmbVO2~-nV77gG6iVF@0ZM8ARRv3pQm4%QL1_TlWB@s2KC@Pgyg_ILJ4WFvaIw<)1nMai#uU?O7Ln~9PN59Bipv%o z7EAnK1)*UeC?Urf5gHwcrch?MN9YhmC}yC_u@GDB2~LPjXbj#MGDu(;D<3 zmen7tQxOJ2uOhwz-T(Tt1VCDeq(8?OYtd->Q|Jxia6qF^kS|8-Wsy3JIUmy#VWa{R zhl4VwnAqrGFA_rx1Sum3^~Z(s|5!4W4Omkh7vWlzFzWv~U;-vW449C{hS*#>%yzaVEAf_g(G1d1yozZA;h!Cc;Fp};aIVnF_9Fsgu+1gSv)VO)cRU`(Ah zghuU`5%wa~1PKy@>No?(eZ9Q=NkWOM!HZr$&Y$H;bp)Q__Y#vxU|+4?fM^w%uSiG( z+Awe&g)!8Hg>YGNx{E-7(RmP;O_xJThz=<^a*iD1LwtddA{1dJ2bkvfHUmm1 z0LG{41Of!(ATBJrLcmAp3MJQtj_@!5$>*@;EH0u@qM+)Y<%j2zIOs=2JrLDY6$%g) zYzX7X`50ZvgE(}hlIu+8qb@FVmXeL393EH6f>4v|KV_C-5e7db5+n6}?c|As^xdiP z0s8gCND&Q?Nj6Zwo^cb1X`BgWGEE)S3&Q+LnqD40xE>fRvM<>JY}KcHKyV>VNfH_=qSL8y1!CgL4A-K4-l?HsAKe`Ki@lCh=TMc;V->fh# zfF{9KWbv(J4uvw<+E?Tu^GPg7U8dS*w5^=G@nA~Pez|;dUXpslMgmvOe&@rq^%(5? zm?1i`Yj%O-(s;AY;SGu9%psWJT-$+LJJb9hB?avB%s!M>%Y0kJ8YWJfhNnd#7S3lZ zJDYAZPAtpa^Q_Y1L$SVApP{e)Ab@9<>~D83f4JJ_^-@v9hauwg9~v#AFIAe?nQ3+~ zmYuuTie}E6XJelnUr5|GPcI64 zWY_ewrd)pX&Wk9k`10p3Uyd0Td*IL^u}HOYrDr|&)>y$mD6cwRKYOUYaRNVeE+fM} z`s%%^58t{Dfqu-LZl65#@HN+% z3ft1^)>frxQ*Es@EB;bfPUnQ30wl$7b{ z6nJb?ZtnEuXQE<%!k>3{F9-}wtVT1B9NDtR)mR%0z4-O5d&J0{x;w^mpCeq(QMcV;;g2(0Gq4mwGS z87oShT*Duawy|m*6?hmQ@3wbTa#c)jF6EtrH2p_VLSDm#yXEm_9S&oxMo#3<^zbmN zMz^l+?qIEdzXq5QEJyx|vl%HVHqjN6W>>rnh7uA+TMqi=0ZAEJ-_BJi6zK85+H`>z zXo}d_*ond@+dIj?h(yAvzq6zAi33J@YKEp4>T%Fs}&SWi=%jEwJky#^3? zyUsl(CWhj0ywM4Cm3Xt=s;(AsG$Z&$&Xp@EHA)=E!BSk>a(~9;;bvu^Us}5Vu(3IJ z7b-oxH%v#_mhjd#$$S0kSHJH&kUJfi?M72mMY~}(jvw^%^ZNzZ5LKysqTucP?oC0y#Yi#DCO0oHr!gOhl}pz|BimmkD}P^qd6f0j!#AT=lseq| eY3cLq$CKhbH*A0JT2Ns6fA1@nivHsnyz##%yUDWv literal 0 HcmV?d00001 diff --git a/Media/openai_chat.bmp b/Media/openai_chat.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f6026dfd21d3bbbdcbb7652b5e4a7fbb9cd3218d GIT binary patch literal 2358 zcmcIlOGs5=5H3MQE@+}+2$$PJuoM)9QgoAd;X)Jw1=Cb2L7^66AQvsL$fOc#WuOc3 ziRMlM5rsm{8%h?U7J`pZd|WAYp$kp@ns2&C4yP+Upn*B(Kl9IgGylx|bDY_if=(%2 zlIMBhvtB-Z>YS|podDbtekHsu+$Zc7wi0De{??1w5c?PUw&B6l_&ZF#dyB8@Yv%n) z`MB^qKcW*STqOKa7*FrqM&89(+%GLg<<%>=aXA?e%C6(#t(&^0?9;?JRY~84efki& zP1rR(J&m@uHtg-~$tQ62VjQ-=eZ_~jL-_phJ&ul!RBk-R-wdjs{+FGGXwrHH*>LRc z?xMcF9u9{CvXB1$e${8(#5U95;2;(j7LG;C6VGKj$8kMG$?x#+5H6QXaSI9x(9zL> z?QND6niIxtrqTU%V#4aBM1x(#PIMi*4Eavr+7C=jLn!2toaG^fvV{W{u6&C zDk=)>Pxd|I4+;vx(9jST7Z;J3n24O5oa1xQn7LqIS?AmG@-n=!_?hrE|8&KitgNgc zJUkpc2RR`jL2X)ETC`V~Gb^z_*w@L)$=KT3;`SL6zI}Cd6&V>Bh>3|ob#*nu!on~% zHU`GSTvb+9VrglKcJFIyY7ieEkG#A*c<-Q_J;A%l8d~G0AF;bKKR=J$++3{%MSXqz zmEd`8Z7o7WLlF@Xfu^P=a0W8o_4Re`-(yZWQ)t6`AyiCED~a4m-#tA&h>VQXc)Wf6 z$nAEcsHjNqA7kw7?8Lypfc7zGpa@1xhhOKfZ>;aTOP ydzwCadwVrc^g~WdOVgf`y}QCUg!vDRv)cdZx7Zd6{~UC(5aQsy_NVs$Tki*3PE7Cs literal 0 HcmV?d00001 diff --git a/Media/openai_chat.png b/Media/openai_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..b318771ce623845056b361a9df1b01f5bedf7b27 GIT binary patch literal 3365 zcmbVO3se)=799{lsajfFP(g`7iwgNCpB2tQIMG>`VMN3gDsI|O86+|hDzjwn=?9#rjm$fFDxpVH`=j^-By-Ah% zdQLQ-W)4BnM5&j%9Q;l(T;oi^cUzSBF$5X$)e?!!4Z##BMeezfGKVD;3g$x4oXni9 zwce*>A8e|%_Bg%!<8im!^!CeSnyV+%rK>hm0!k%W2c?o6#rwLl#D0q{y6HhT)*0J- zo^*RKK7P#UlJ$}e6UL^sJ}PJx+B6y!DVhs5F5CDppfs{6v#kAmiBdLPL=JZRPV`Ge_CdBwrfl%%T~jmUiERsftudL7vlGtAELTlp5qocimd|OqIc61 z{in>&?o`z4r%vjEWBrh7zP{4vol1|RD?jV8be@z5oj9}f`NQR|XMvLA^%d7Dt!I`uZtjBa}jf>gqyqjurs`ElR?aXst#^h@!>R0bCKdHw-hV zlz|X3LQEZ8&;TD9MS|fdg-3UyDOp?rg)gMDoVZMmlOu)AWCPKL8#E?utFh(@2XRzo@LrDXHh;k%OzZTaF zkRwV4szJ4=jwC=VYa~`5j*%D05{`(c=7c%fv&DO1>>YRa4yY8`?_5pzdPK;2;y z6;s(vHkZca(>N?YHe19Jh&UVvCQrm<4u<+*h*}l%rce%F#A3e|3M_-bB>X>v5v53l z;aV6Jtk%L|C_}Fcqf$m>6iF}*h67@d9cT2o6l^Rwrc!Ibi@$F$1KIlch@?7#gmp?( z>Mo`NZRlz>A`%J}TvVk{(fC3khsJ@qLYffaqcjC7;3`xwQ>aiWhUdFu%C!au80HT) z1A-|5#;feOFpJMp2@#q=$yLy}Dz1R05b^~y6k!Pj3O=8wL!~5gH$1DcKwr3l<8M2G_r0_Cuq|C2$Oi6GQE^5Dpu< z)2K)3HxT0sYk^FDqxBmYH-H$%8DJ*E&_RPBjJMDX*jVJHCV;_WhRBwqYhKX~I9CKK z4IL?_Dh*ad5h`VHSpA08_*Zog&5sI40q8$ibdZL?RAdy4qi$hf<%Yc>ds_<_DmN4k zH2Yifm@X2h9*}m0FP#>~%G2N_}m6aZXCr-p1T1U#r^W<>cgF|4_`k z{MinQ*QI-KPXJwE8}-QPQDvFj#`kJeP;_2vvL0M&^(XA86k%x zohEth@sXMB84Mcs*9qd`-M+-*7yF*9OT5?${paO`JC=>xy!)5GU)o~-M=6a1U0X6X z6w24#{64isGs&{O`_?Ie&7>q-BL|sjaZPF2%zzuA%mc2Mu3WkD=w2Qt>`3CvguB1} zHiylY_jR>4*VSz}cm90Nwr$1b4mFSSy$?QEv%@>$+llgP0i1r_AJ4*)TeAVv_%~MIHRzzP_`*J zI2g*M2OT?c|JUl&w6r@NS4$tqyL`WzF=MM)+t+vRqK!MnX|ps=)+b7OO>8e-xS;>- z?0a&#eBZ%?vp@Q1hRRG(}xy$WVGF`BHA zLz;qfXKx&5*~CQGGK`2__X=UMfbluLw(YWBj~m4Lh$qz;Wi- z>d1SAH8ll*TGp=Rf7j4hq3D|W3zHgm5o)RW_?nJ1+g&v=%3{V0UxMH`I5-?RdNeCP z-&?7)gT|~cLfTh0rz_W8h_wV0*-XK-4IL7CPi)NxmX_31hZSYzM~>7zd*(cO@?^-y zp=8op7e0T}^?R$cOS{Gbf_m@$>rEQl4sGAEd9z%hC@d^0@(&CwNlrEvM|Ur1XlUrU zAijDaY}weVz^vjYPhzTq=)uS10}BcY@T#DmC-GUu$u}H9nRoNz=1D_LK6H<(S&ifP z90sFaSDBrg>zRh2z&CcU5Wz7rF9zuX4lnw$zS$sKLN#Xx!h28UWR*ApLNKt{@=r5p9V$LV3i!9 zuxj@9jUtHpY5uKSaQ^n~F})ohLh8WTjxN2Iueaa68KN{X{nhxd({8;9Od-O%_S@bb>(s@k4gt(aM|Ml7f;FK(#k z^gJB{s<0Oj(*9NQ)Z%Ytm8;I0e>J(=I5>$||D-jvx3l)SRg-oD5o_F#VE7j<_3(8s ITNs-BU-A(#f&c&j literal 0 HcmV?d00001 diff --git a/Media/openai_func.bmp b/Media/openai_func.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5ba0a3aef1ac5fc246259e62cfdb9ae50a0c79b1 GIT binary patch literal 2358 zcmcIlTTGl)5N=7JA!|TxQjry7NDz3SAZZ9h5gvFTkfOm06wrnT9&AL2WXnQA2~3BX1X9DC2fpOGXI%#&dfJ+ zX6BqfI{v8R0imPxeTn$6jSn7pfu#S202CAJh+BwH5+5PXBEH1qzx6`4$BE6vk0UK9 zxIWGg=>!s|5}zQ>Ga8LF0H)zSe3ur9AF|)Z?=4@!x^WNJG+*NK2XA1>@Q3KoXPWqt zK4@J*tkUcCsIRX_O-&6(Mn-7qAsMvos0>kH;PX6mpGw2GuOESVaSqozG^mMw9=vZO z-QF|Mx{ujxMrmm&e0+RB`|$Vo7xm2t7F>KU3ip;5VH)bi*RLGL{nb0TdiE50KgkxI z_@^GUV7Ixs36)AExXH=M&}cN6n3xdVu}kOCnf2DT9WI|tz|FoN zad*~;hPZ&8bv_5@%0_M5XP|jnU0t1EXJ%%?VzID_dShclRNFIRVf^`u$XgUg=ZA0N z#+5d(TpjTYHtsIV-lp{ds>9u3wcM9EP}}$zQ)>Wd5V^I!f$= zCw((KJPao%Cp0xRVRUp9g@uKp&OOniJ|XA0(R~qrYQM+1SD%%><-66L`>qXE20ddl z@r;M8EPkeNwy&=bhYlS=Z*MPVXJ_H=?k+NKGV%T5H-U+3!FTqW<_p~F?~=9k^>rSV z0{#%+ literal 0 HcmV?d00001 diff --git a/Media/openai_func.png b/Media/openai_func.png new file mode 100644 index 0000000000000000000000000000000000000000..762f57a5e9cbd19ab28587675c6198ffe528d745 GIT binary patch literal 3557 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 KkHZTi*8dlh)QOS+ literal 0 HcmV?d00001 diff --git a/OpenAI.Utils.ChatHistory.pas b/OpenAI.Utils.ChatHistory.pas index 213b11c..5e9de29 100644 --- a/OpenAI.Utils.ChatHistory.pas +++ b/OpenAI.Utils.ChatHistory.pas @@ -53,6 +53,7 @@ implementation constructor TChatHistory.Create; begin inherited; + FAutoTrim := False; FMaxTokensForQuery := DEFULT_MAX_TOKENS; FMaxTokensOfModel := DEFULT_MODEL_TOKENS_LIMIT; end; diff --git a/OpenAI.pas b/OpenAI.pas index 1184e5e..a8df0d2 100644 --- a/OpenAI.pas +++ b/OpenAI.pas @@ -501,6 +501,9 @@ procedure print(const Text: string; const NewLine: Boolean = True); implementation +uses + OpenAI.Utils.ChatHistory; + procedure print(const Text: string; const NewLine: Boolean); begin if NewLine then @@ -515,19 +518,31 @@ function input(const Print: string): string; readln(Result); end; +var + ConsoleHistory: TChatHistory = nil; + function chat(const Token, Prompt: string; const Model: string): string; begin + if ConsoleHistory = nil then + begin + ConsoleHistory := TChatHistory.Create; + ConsoleHistory.AutoTrim := True; + end; try + ConsoleHistory.New(TMessageRole.User, Prompt, TGUID.NewGuid.ToString); var API: IOpenAI := TOpenAI.Create(Token); var Chat := API.Chat.Create( procedure(Params: TChatParams) begin Params.Model(Model); - Params.Messages([TChatMessageBuild.User(Prompt)]); + Params.Messages(ConsoleHistory.ToArray); end); try if Length(Chat.Choices) > 0 then + begin Result := Chat.Choices[0].Message.Content; + ConsoleHistory.New(TMessageRole.Assistant, Result, TGUID.NewGuid.ToString); + end; finally Chat.Free; end; @@ -1022,5 +1037,10 @@ procedure TOpenAIComponent.THTTPHeader.SetValue(const Value: string); FValue := Value; end; +initialization + +finalization + ConsoleHistory.Free; + end. diff --git a/OpenAIPackage.dpk b/OpenAIPackage.dpk index 916aec4..b8c083a 100644 --- a/OpenAIPackage.dpk +++ b/OpenAIPackage.dpk @@ -1,6 +1,7 @@ package OpenAIPackage; {$R *.res} +{$R 'hIcons.dcr'} {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} @@ -32,15 +33,16 @@ requires RESTComponents; contains - OpenAI.API.Params in 'OpenAI.API.Params.pas', + OpenAI in 'OpenAI.pas', + OpenAI.Types in 'OpenAI.Types.pas', OpenAI.API in 'OpenAI.API.pas', + OpenAI.API.Params in 'OpenAI.API.Params.pas', + OpenAI.Assistants in 'OpenAI.Assistants.pas', OpenAI.Audio in 'OpenAI.Audio.pas', + OpenAI.Chat in 'OpenAI.Chat.pas', OpenAI.Chat.Functions in 'OpenAI.Chat.Functions.pas', OpenAI.Chat.Functions.Samples in 'OpenAI.Chat.Functions.Samples.pas', - OpenAI.Chat in 'OpenAI.Chat.pas', OpenAI.Completions in 'OpenAI.Completions.pas', - OpenAI.Component.Chat in 'OpenAI.Component.Chat.pas', - OpenAI.Component.Reg in 'OpenAI.Component.Reg.pas', OpenAI.Edits in 'OpenAI.Edits.pas', OpenAI.Embeddings in 'OpenAI.Embeddings.pas', OpenAI.Engines in 'OpenAI.Engines.pas', @@ -51,13 +53,12 @@ contains OpenAI.Images in 'OpenAI.Images.pas', OpenAI.Models in 'OpenAI.Models.pas', OpenAI.Moderations in 'OpenAI.Moderations.pas', - OpenAI in 'OpenAI.pas', + OpenAI.Utils.Base64 in 'OpenAI.Utils.Base64.pas', OpenAI.Utils.ChatHistory in 'OpenAI.Utils.ChatHistory.pas', + OpenAI.Utils.ObjectHolder in 'OpenAI.Utils.ObjectHolder.pas', + OpenAI.Component.Chat in 'OpenAI.Component.Chat.pas', OpenAI.Component.Functions in 'OpenAI.Component.Functions.pas', - OpenAI.Assistants in 'OpenAI.Assistants.pas', - OpenAI.Types in 'OpenAI.Types.pas', - OpenAI.Utils.Base64 in 'OpenAI.Utils.Base64.pas', - OpenAI.Utils.ObjectHolder in 'OpenAI.Utils.ObjectHolder.pas'; + OpenAI.Component.Reg in 'OpenAI.Component.Reg.pas'; end. diff --git a/OpenAIPackage.dproj b/OpenAIPackage.dproj index ef16381..e2051ac 100644 --- a/OpenAIPackage.dproj +++ b/OpenAIPackage.dproj @@ -2,7 +2,7 @@ {AEF0734F-C1E6-4A7A-BC68-D170EF3FE99F} OpenAIPackage.dpk - 20.1 + 20.2 None True Debug @@ -164,17 +164,19 @@ MainSource + - + + + + + - - - @@ -185,13 +187,12 @@ - - - - - + + + + Base @@ -213,7 +214,7 @@ OpenAIPackage.dpk - + true @@ -229,12 +230,7 @@ true - - - OpenAIPackage.bpl - true - - + 1 @@ -243,16 +239,6 @@ 0 - - - classes - 64 - - - classes - 64 - - res\xml @@ -263,12 +249,6 @@ 1 - - - library\lib\armeabi-v7a - 1 - - library\lib\armeabi diff --git a/Samples/Chat/Chat.Main.fmx b/Samples/Chat/Chat.Main.fmx index 9c7ec6c..8c729e2 100644 --- a/Samples/Chat/Chat.Main.fmx +++ b/Samples/Chat/Chat.Main.fmx @@ -80,7 +80,8 @@ object FormChat: TFormChat Viewport.Width = 501.000000000000000000 Viewport.Height = 92.000000000000000000 end - object Button1: TButton + object ButtonAttach: TButton + Hint = 'Attach file' Position.X = 521.000000000000000000 Position.Y = 233.000000000000000000 Size.Width = 24.000000000000000000 @@ -89,9 +90,10 @@ object FormChat: TFormChat TabOrder = 12 Text = '+' TextSettings.Trimming = None - OnClick = Button1Click + OnClick = ButtonAttachClick end - object Button2: TButton + object ButtonRemoveAttach: TButton + Hint = 'Remove attach' Position.X = 521.000000000000000000 Position.Y = 265.000000000000000000 Size.Width = 24.000000000000000000 @@ -9145,7 +9147,7 @@ object FormChat: TFormChat 'ype": "string", "description": "The city and state, e.g. San Fra' + 'ncisco, CA"},'#13#10' "unit": {"type": "string", "enum": ["celsiu' + 's", "fahrenheit"]}'#13#10' },'#13#10' "required": ["location"]'#13#10'}' - OnFunctionExecute = OpenAIChatFunctions1Items0FunctionExecute + OnFunctionExecute = FuncGetCurrentWeather end> Left = 384 Top = 104 diff --git a/Samples/Chat/Chat.Main.pas b/Samples/Chat/Chat.Main.pas index cf9f21b..00d9e49 100644 --- a/Samples/Chat/Chat.Main.pas +++ b/Samples/Chat/Chat.Main.pas @@ -21,8 +21,8 @@ TFormChat = class(TForm) AniIndicatorBusy: TAniIndicator; OpenAIChatFunctions1: TOpenAIChatFunctions; ListBox1: TListBox; - Button1: TButton; - Button2: TButton; + ButtonAttach: TButton; + ButtonRemoveAttach: TButton; StyleBook1: TStyleBook; OpenDialogImg: TOpenDialog; procedure FormCreate(Sender: TObject); @@ -33,8 +33,8 @@ TFormChat = class(TForm) procedure OpenAIChat1BeginWork(Sender: TObject); procedure OpenAIChat1ChatDelta(Sender: TObject; Event: TChat; IsDone: Boolean); procedure OpenAIChat1EndWork(Sender: TObject); - procedure OpenAIChatFunctions1Items0FunctionExecute(Sender: TObject; const Args: string; out Result: string); - procedure Button1Click(Sender: TObject); + procedure FuncGetCurrentWeather(Sender: TObject; const Args: string; out Result: string); + procedure ButtonAttachClick(Sender: TObject); private { Private declarations } public @@ -51,7 +51,7 @@ implementation {$R *.fmx} -procedure TFormChat.Button1Click(Sender: TObject); +procedure TFormChat.ButtonAttachClick(Sender: TObject); begin if OpenDialogImg.Execute then begin @@ -90,8 +90,6 @@ procedure TFormChat.ButtonStreamSendClick(Sender: TObject); procedure TFormChat.FormCreate(Sender: TObject); begin - // - //OpenAIClient1.Assistants.Retrieve('') OpenAIClient1.Token := {$INCLUDE token.txt}; end; @@ -132,7 +130,7 @@ procedure TFormChat.OpenAIChat1Error(Sender: TObject; Error: Exception); MemoMessages.Lines.Add(''); end; -procedure TFormChat.OpenAIChatFunctions1Items0FunctionExecute(Sender: TObject; const Args: string; out Result: string); +procedure TFormChat.FuncGetCurrentWeather(Sender: TObject; const Args: string; out Result: string); var JSON: TJSONObject; Location: string; diff --git a/Samples/Chat/SimpleChat.dproj b/Samples/Chat/SimpleChat.dproj index 76b7637..98cc96e 100644 --- a/Samples/Chat/SimpleChat.dproj +++ b/Samples/Chat/SimpleChat.dproj @@ -1,7 +1,7 @@  {BFDEE0F1-0647-4DC4-B516-5699A40BC0F4} - 20.1 + 20.2 FMX True Debug @@ -116,7 +116,7 @@ fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;FrameStandPackage_11_1;IndyProtocols;Skia.Package.RTL;RadiantShapesFmx_Design;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;FMXAudioHGM;fmxase;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;Skia.Package.FMX;CustomIPTransport;DBXInterBaseDriver;IndySystem;RadiantShapesFmx;bindcomp;FireDACCommon;VLCPlayer;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=;minSdkVersion=23;targetSdkVersion=34 Debug true $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png @@ -138,7 +138,7 @@ fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;FrameStandPackage_11_1;IndyProtocols;Skia.Package.RTL;RadiantShapesFmx_Design;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;FMXAudioHGM;DzHTMLText_FMX;dbrtl;FireDACDBXDriver;Skia.Package.FMX;CustomIPTransport;DBXInterBaseDriver;IndySystem;RadiantShapesFmx;bindcomp;FireDACCommon;VLCPlayer;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=;minSdkVersion=23;targetSdkVersion=34 Debug true $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png @@ -331,7 +331,7 @@ SimpleChat.dpr - + true @@ -347,18 +347,8 @@ true - - - SimpleChat.exe - true - - - - - .\ - true - - + + 1 @@ -371,16 +361,6 @@ 0 - - - classes - 64 - - - classes - 64 - - res\xml @@ -391,12 +371,6 @@ 1 - - - library\lib\armeabi-v7a - 1 - - library\lib\armeabi diff --git a/Samples/QuickChat/QuickChat.dpr b/Samples/QuickChat/QuickChat.dpr index 0be4419..06c828c 100644 --- a/Samples/QuickChat/QuickChat.dpr +++ b/Samples/QuickChat/QuickChat.dpr @@ -1,5 +1,5 @@ uses OpenAI; begin - repeat print('GPT: ' + chat('insert token', input('You: '))) until False; + repeat print('GPT: ' + chat('token', input('You: '))) until False; end. diff --git a/Samples/QuickChat/QuickChat.dproj b/Samples/QuickChat/QuickChat.dproj index 728861c..4621693 100644 --- a/Samples/QuickChat/QuickChat.dproj +++ b/Samples/QuickChat/QuickChat.dproj @@ -1,10 +1,10 @@  {CA4B4F68-709F-4719-9D8D-8C7CA0A49C0F} - 20.1 + 20.2 None True - Debug + Release Win32 QuickChat 1 @@ -235,7 +235,7 @@ Microsoft Office XP Sample Automation Server Wrapper Components - + true @@ -251,12 +251,7 @@ true - - - QuickChat.exe - true - - + 1 @@ -269,16 +264,6 @@ 0 - - - classes - 64 - - - classes - 64 - - res\xml diff --git a/hIcons.dcr b/hIcons.dcr new file mode 100644 index 0000000000000000000000000000000000000000..220811724690413af7cf9dbb743c328af5fdd451 GIT binary patch literal 14252 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 It^KS213P_@T>t<8 literal 0 HcmV?d00001