├── .gitignore
├── Demo
├── DemoOpenAI.dpr
├── DemoOpenAI.dproj
├── DemoOpenAI.res
├── Res
│ ├── Icon.ico
│ ├── Icon.png
│ ├── Icon2.ico
│ ├── Icon2.png
│ └── Logo.png
├── uDemoOpenAI.fmx
├── uDemoOpenAI.pas
└── uDemoOpenAI.vlb
├── Lib
├── MLOpenAI.ChatGPT.pas
├── MLOpenAI.Classifications.pas
├── MLOpenAI.Completions.pas
├── MLOpenAI.Core.pas
├── MLOpenAI.Files.pas
├── MLOpenAI.Finetunes.pas
├── MLOpenAI.Images.pas
└── MLOpenAI.Types.pas
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Uncomment these types if you want even more clean repository. But be careful.
2 | # It can make harm to an existing project source. Read explanations below.
3 | #
4 | # Resource files are binaries containing manifest, project icon and version info.
5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files.
6 | #*.res
7 | #
8 | # Type library file (binary). In old Delphi versions it should be stored.
9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored.
10 | #*.tlb
11 | #
12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7.
13 | # Uncomment this if you are not using diagrams or use newer Delphi version.
14 | #*.ddp
15 | #
16 | # Visual LiveBindings file. Added in Delphi XE2.
17 | # Uncomment this if you are not using LiveBindings Designer.
18 | #*.vlb
19 | #
20 | # Deployment Manager configuration file for your project. Added in Delphi XE2.
21 | # Uncomment this if it is not mobile development and you do not use remote debug feature.
22 | #*.deployproj
23 | #
24 | # C++ object files produced when C/C++ Output file generation is configured.
25 | # Uncomment this if you are not using external objects (zlib library for example).
26 | #*.obj
27 | #
28 |
29 | # Delphi compiler-generated binaries (safe to delete)
30 | *.exe
31 | *.dll
32 | *.bpl
33 | *.bpi
34 | *.dcp
35 | *.so
36 | *.apk
37 | *.drc
38 | *.map
39 | *.dres
40 | *.rsm
41 | *.tds
42 | *.dcu
43 | *.lib
44 | *.a
45 | *.o
46 | *.ocx
47 |
48 | # Delphi autogenerated files (duplicated info)
49 | *.cfg
50 | *.hpp
51 | *Resource.rc
52 |
53 | # Delphi local files (user-specific info)
54 | *.local
55 | *.identcache
56 | *.projdata
57 | *.tvsconfig
58 | *.dsk
59 |
60 | # Delphi history and backups
61 | __history/
62 | __recovery/
63 | *.~*
64 |
65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi)
66 | *.stat
67 |
68 | modules/
69 | Win32/
70 | Bin/
--------------------------------------------------------------------------------
/Demo/DemoOpenAI.dpr:
--------------------------------------------------------------------------------
1 | program DemoOpenAI;
2 |
3 | uses
4 | System.StartUpCopy,
5 | FMX.Forms,
6 | //Skia.FMX,
7 | uDemoOpenAI in 'uDemoOpenAI.pas' {frmDemoOpenAI} ,
8 | MLOpenAI.Completions in '..\Lib\MLOpenAI.Completions.pas',
9 | MLOpenAI.Core in '..\Lib\MLOpenAI.Core.pas',
10 | MLOpenAI.Types in '..\Lib\MLOpenAI.Types.pas',
11 | MLOpenAI.Files in '..\Lib\MLOpenAI.Files.pas',
12 | MLOpenAI.Finetunes in '..\Lib\MLOpenAI.Finetunes.pas',
13 | MLOpenAI.Images in '..\Lib\MLOpenAI.Images.pas';
14 |
15 | {$R *.res}
16 |
17 | begin
18 | //GlobalUseSkia := True;
19 | Application.Initialize;
20 | Application.CreateForm(TfrmDemoOpenAI, frmDemoOpenAI);
21 | Application.Run;
22 |
23 | end.
24 |
--------------------------------------------------------------------------------
/Demo/DemoOpenAI.dproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | {B74B029C-0C01-4AFC-8E1A-F57F358153D8}
4 | 19.3
5 | FMX
6 | DemoOpenAI.dpr
7 | True
8 | Debug
9 | Win32
10 | 32787
11 | Application
12 |
13 |
14 | true
15 |
16 |
17 | true
18 | Base
19 | true
20 |
21 |
22 | true
23 | Base
24 | true
25 |
26 |
27 | true
28 | Base
29 | true
30 |
31 |
32 | true
33 | Base
34 | true
35 |
36 |
37 | true
38 | Base
39 | true
40 |
41 |
42 | true
43 | Cfg_1
44 | true
45 | true
46 |
47 |
48 | true
49 | Cfg_1
50 | true
51 | true
52 |
53 |
54 | true
55 | Base
56 | true
57 |
58 |
59 | true
60 | Cfg_2
61 | true
62 | true
63 |
64 |
65 | true
66 | Cfg_2
67 | true
68 | true
69 |
70 |
71 | .\$(Platform)\$(Config)
72 | .\$(Platform)\$(Config)
73 | false
74 | false
75 | false
76 | false
77 | false
78 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
79 | true
80 | true
81 | true
82 | true
83 | true
84 | true
85 | true
86 | true
87 | $(BDS)\bin\delphi_PROJECTICON.ico
88 | $(BDS)\bin\delphi_PROJECTICNS.icns
89 | DemoOpenAI
90 |
91 |
92 | DBXSqliteDriver;bindcompdbx;IndyIPCommon;RESTComponents;DBXInterBaseDriver;IndyIPServer;RestDatawareCORE;IndySystem;tethering;FMXTMSFNCCorePkgDXE12;fmxFireDAC;FireDAC;FMXTMSFNCUIPackPkgDXE12;bindcompfmx;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;FireDACIBDriver;fmx;xmlrtl;soapmidas;RadiantShapesFmx;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;MobilePermissions;SampleListViewMultiDetailAppearancePackage;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;RadiantShapesFmx_Design;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage)
93 | 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=
94 | Debug
95 | true
96 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
97 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
98 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
99 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
100 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
101 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
102 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
103 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
104 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
105 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
106 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
107 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
108 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
109 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
110 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
111 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png
112 |
113 |
114 | DBXSqliteDriver;bindcompdbx;IndyIPCommon;RESTComponents;DBXInterBaseDriver;IndyIPServer;RestDatawareCORE;IndySystem;NLDJoystick70;tethering;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;FireDACIBDriver;fmx;xmlrtl;soapmidas;RadiantShapesFmx;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;MobilePermissions;SampleListViewMultiDetailAppearancePackage;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;RadiantShapesFmx_Design;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage)
115 | 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=
116 | Debug
117 | true
118 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
119 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
120 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
121 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
122 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
123 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
124 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
125 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
126 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
127 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
128 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
129 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
130 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
131 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
132 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
133 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png
134 |
135 |
136 | DBXSqliteDriver;bindcompdbx;IndyIPCommon;RESTComponents;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;RestDatawareCORE;vclFireDAC;IndySystem;NLDJoystick70;tethering;svnui;dsnapcon;FireDACADSDriver;FMXTMSFNCCorePkgDXE12;FireDACMSAccDriver;fmxFireDAC;vclimg;TeeDB;FireDAC;FMXTMSFNCUIPackPkgDXE12;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;SMSAlefmidia;ProjectLanguages;FireDACIBDriver;fmx;fmxdae;xmlrtl;soapmidas;Tee;fmxobj;vclwinx;RadiantShapesFmx;rtl;ActiveX;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;RESTDWDriverFD;MobilePermissions;vclx;SampleListViewMultiDetailAppearancePackage;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;ComponenteBase;bindcompvcl;VCLTMSFNCUIPackPkgDXE12;RESTBackendComponents;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;KernowSoftwareFMX;adortl;RadiantShapesFmx_Design;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;inetdbxpress;IndyProtocols;PanelRefresh;GLibWMI;FireDACCommonODBC;FireDACCommonDriver;VCLTMSFNCCorePkgDXE12;LockBoxDR;inet;fmxase;$(DCC_UsePackage)
137 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
138 | Debug
139 | true
140 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
141 | 1033
142 | $(BDS)\bin\default_app.manifest
143 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
144 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
145 |
146 |
147 | DBXSqliteDriver;bindcompdbx;IndyIPCommon;RESTComponents;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;RestDatawareCORE;vclFireDAC;IndySystem;tethering;dsnapcon;FireDACADSDriver;FMXTMSFNCCorePkgDXE12;FireDACMSAccDriver;fmxFireDAC;vclimg;TeeDB;FireDAC;FMXTMSFNCUIPackPkgDXE12;vcltouch;vcldb;bindcompfmx;FireDACSqliteDriver;FireDACPgDriver;inetdb;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;xmlrtl;soapmidas;Tee;fmxobj;vclwinx;RadiantShapesFmx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;RESTDWDriverFD;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;VCLTMSFNCUIPackPkgDXE12;RESTBackendComponents;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;RadiantShapesFmx_Design;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;inetdbxpress;IndyProtocols;FireDACCommonODBC;FireDACCommonDriver;VCLTMSFNCCorePkgDXE12;LockBoxDR;inet;fmxase;$(DCC_UsePackage)
148 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
149 | Debug
150 | true
151 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
152 | 1033
153 | $(BDS)\bin\default_app.manifest
154 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
155 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
156 |
157 |
158 | DEBUG;$(DCC_Define)
159 | true
160 | false
161 | true
162 | true
163 | true
164 |
165 |
166 | false
167 | true
168 | PerMonitorV2
169 | .\Bin
170 | true
171 | 1033
172 | Res\Icon2.ico
173 | Res\Icon2.png
174 | Res\Logo.png
175 |
176 |
177 | true
178 | PerMonitorV2
179 | true
180 | 1033
181 |
182 |
183 | false
184 | RELEASE;$(DCC_Define)
185 | 0
186 | 0
187 |
188 |
189 | true
190 | PerMonitorV2
191 |
192 |
193 | true
194 | PerMonitorV2
195 |
196 |
197 |
198 | MainSource
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 | Cfg_2
211 | Base
212 |
213 |
214 | Base
215 |
216 |
217 | Cfg_1
218 | Base
219 |
220 |
221 |
222 | Delphi.Personality.12
223 | Application
224 |
225 |
226 |
227 | DemoOpenAI.dpr
228 |
229 |
230 | Microsoft Office 2000 Sample Automation Server Wrapper Components
231 | Microsoft Office XP Sample Automation Server Wrapper Components
232 |
233 |
234 |
235 |
236 |
237 | Assets\
238 | Logo150x150.png
239 | true
240 |
241 |
242 |
243 |
244 | Assets\
245 | Logo44x44.png
246 | true
247 |
248 |
249 |
250 |
251 | true
252 |
253 |
254 |
255 |
256 | true
257 |
258 |
259 |
260 |
261 | true
262 |
263 |
264 |
265 |
266 | DemoOpenAI.exe
267 | true
268 |
269 |
270 |
271 |
272 | 1
273 |
274 |
275 | Contents\MacOS
276 | 1
277 |
278 |
279 | 0
280 |
281 |
282 |
283 |
284 | classes
285 | 64
286 |
287 |
288 | classes
289 | 64
290 |
291 |
292 |
293 |
294 | classes
295 | 1
296 |
297 |
298 | classes
299 | 1
300 |
301 |
302 |
303 |
304 | res\xml
305 | 1
306 |
307 |
308 | res\xml
309 | 1
310 |
311 |
312 |
313 |
314 | library\lib\armeabi-v7a
315 | 1
316 |
317 |
318 |
319 |
320 | library\lib\armeabi
321 | 1
322 |
323 |
324 | library\lib\armeabi
325 | 1
326 |
327 |
328 |
329 |
330 | library\lib\armeabi-v7a
331 | 1
332 |
333 |
334 |
335 |
336 | library\lib\mips
337 | 1
338 |
339 |
340 | library\lib\mips
341 | 1
342 |
343 |
344 |
345 |
346 | library\lib\armeabi-v7a
347 | 1
348 |
349 |
350 | library\lib\arm64-v8a
351 | 1
352 |
353 |
354 |
355 |
356 | library\lib\armeabi-v7a
357 | 1
358 |
359 |
360 |
361 |
362 | res\drawable
363 | 1
364 |
365 |
366 | res\drawable
367 | 1
368 |
369 |
370 |
371 |
372 | res\values
373 | 1
374 |
375 |
376 | res\values
377 | 1
378 |
379 |
380 |
381 |
382 | res\values-v21
383 | 1
384 |
385 |
386 | res\values-v21
387 | 1
388 |
389 |
390 |
391 |
392 | res\values
393 | 1
394 |
395 |
396 | res\values
397 | 1
398 |
399 |
400 |
401 |
402 | res\drawable
403 | 1
404 |
405 |
406 | res\drawable
407 | 1
408 |
409 |
410 |
411 |
412 | res\drawable-xxhdpi
413 | 1
414 |
415 |
416 | res\drawable-xxhdpi
417 | 1
418 |
419 |
420 |
421 |
422 | res\drawable-xxxhdpi
423 | 1
424 |
425 |
426 | res\drawable-xxxhdpi
427 | 1
428 |
429 |
430 |
431 |
432 | res\drawable-ldpi
433 | 1
434 |
435 |
436 | res\drawable-ldpi
437 | 1
438 |
439 |
440 |
441 |
442 | res\drawable-mdpi
443 | 1
444 |
445 |
446 | res\drawable-mdpi
447 | 1
448 |
449 |
450 |
451 |
452 | res\drawable-hdpi
453 | 1
454 |
455 |
456 | res\drawable-hdpi
457 | 1
458 |
459 |
460 |
461 |
462 | res\drawable-xhdpi
463 | 1
464 |
465 |
466 | res\drawable-xhdpi
467 | 1
468 |
469 |
470 |
471 |
472 | res\drawable-mdpi
473 | 1
474 |
475 |
476 | res\drawable-mdpi
477 | 1
478 |
479 |
480 |
481 |
482 | res\drawable-hdpi
483 | 1
484 |
485 |
486 | res\drawable-hdpi
487 | 1
488 |
489 |
490 |
491 |
492 | res\drawable-xhdpi
493 | 1
494 |
495 |
496 | res\drawable-xhdpi
497 | 1
498 |
499 |
500 |
501 |
502 | res\drawable-xxhdpi
503 | 1
504 |
505 |
506 | res\drawable-xxhdpi
507 | 1
508 |
509 |
510 |
511 |
512 | res\drawable-xxxhdpi
513 | 1
514 |
515 |
516 | res\drawable-xxxhdpi
517 | 1
518 |
519 |
520 |
521 |
522 | res\drawable-small
523 | 1
524 |
525 |
526 | res\drawable-small
527 | 1
528 |
529 |
530 |
531 |
532 | res\drawable-normal
533 | 1
534 |
535 |
536 | res\drawable-normal
537 | 1
538 |
539 |
540 |
541 |
542 | res\drawable-large
543 | 1
544 |
545 |
546 | res\drawable-large
547 | 1
548 |
549 |
550 |
551 |
552 | res\drawable-xlarge
553 | 1
554 |
555 |
556 | res\drawable-xlarge
557 | 1
558 |
559 |
560 |
561 |
562 | res\values
563 | 1
564 |
565 |
566 | res\values
567 | 1
568 |
569 |
570 |
571 |
572 | 1
573 |
574 |
575 | Contents\MacOS
576 | 1
577 |
578 |
579 | 0
580 |
581 |
582 |
583 |
584 | Contents\MacOS
585 | 1
586 | .framework
587 |
588 |
589 | Contents\MacOS
590 | 1
591 | .framework
592 |
593 |
594 | 0
595 |
596 |
597 |
598 |
599 | 1
600 | .dylib
601 |
602 |
603 | 1
604 | .dylib
605 |
606 |
607 | 1
608 | .dylib
609 |
610 |
611 | Contents\MacOS
612 | 1
613 | .dylib
614 |
615 |
616 | Contents\MacOS
617 | 1
618 | .dylib
619 |
620 |
621 | 0
622 | .dll;.bpl
623 |
624 |
625 |
626 |
627 | 1
628 | .dylib
629 |
630 |
631 | 1
632 | .dylib
633 |
634 |
635 | 1
636 | .dylib
637 |
638 |
639 | Contents\MacOS
640 | 1
641 | .dylib
642 |
643 |
644 | Contents\MacOS
645 | 1
646 | .dylib
647 |
648 |
649 | 0
650 | .bpl
651 |
652 |
653 |
654 |
655 | 0
656 |
657 |
658 | 0
659 |
660 |
661 | 0
662 |
663 |
664 | 0
665 |
666 |
667 | 0
668 |
669 |
670 | Contents\Resources\StartUp\
671 | 0
672 |
673 |
674 | Contents\Resources\StartUp\
675 | 0
676 |
677 |
678 | 0
679 |
680 |
681 |
682 |
683 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
684 | 1
685 |
686 |
687 |
688 |
689 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
690 | 1
691 |
692 |
693 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
694 | 1
695 |
696 |
697 |
698 |
699 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
700 | 1
701 |
702 |
703 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
704 | 1
705 |
706 |
707 |
708 |
709 | 1
710 |
711 |
712 | 1
713 |
714 |
715 | 1
716 |
717 |
718 |
719 |
720 | 1
721 |
722 |
723 | 1
724 |
725 |
726 | 1
727 |
728 |
729 |
730 |
731 | 1
732 |
733 |
734 | 1
735 |
736 |
737 | 1
738 |
739 |
740 |
741 |
742 | 1
743 |
744 |
745 | 1
746 |
747 |
748 | 1
749 |
750 |
751 |
752 |
753 | 1
754 |
755 |
756 | 1
757 |
758 |
759 | 1
760 |
761 |
762 |
763 |
764 | 1
765 |
766 |
767 | 1
768 |
769 |
770 | 1
771 |
772 |
773 |
774 |
775 | 1
776 |
777 |
778 | 1
779 |
780 |
781 | 1
782 |
783 |
784 |
785 |
786 | 1
787 |
788 |
789 | 1
790 |
791 |
792 | 1
793 |
794 |
795 |
796 |
797 | 1
798 |
799 |
800 | 1
801 |
802 |
803 | 1
804 |
805 |
806 |
807 |
808 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
809 | 1
810 |
811 |
812 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
813 | 1
814 |
815 |
816 |
817 |
818 | 1
819 |
820 |
821 | 1
822 |
823 |
824 | 1
825 |
826 |
827 |
828 |
829 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
830 | 1
831 |
832 |
833 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
834 | 1
835 |
836 |
837 |
838 |
839 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
840 | 1
841 |
842 |
843 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
844 | 1
845 |
846 |
847 |
848 |
849 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
850 | 1
851 |
852 |
853 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
854 | 1
855 |
856 |
857 |
858 |
859 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
860 | 1
861 |
862 |
863 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
864 | 1
865 |
866 |
867 |
868 |
869 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
870 | 1
871 |
872 |
873 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
874 | 1
875 |
876 |
877 |
878 |
879 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
880 | 1
881 |
882 |
883 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
884 | 1
885 |
886 |
887 |
888 |
889 | 1
890 |
891 |
892 | 1
893 |
894 |
895 | 1
896 |
897 |
898 |
899 |
900 | 1
901 |
902 |
903 | 1
904 |
905 |
906 | 1
907 |
908 |
909 |
910 |
911 | 1
912 |
913 |
914 | 1
915 |
916 |
917 | 1
918 |
919 |
920 |
921 |
922 | 1
923 |
924 |
925 | 1
926 |
927 |
928 | 1
929 |
930 |
931 |
932 |
933 | 1
934 |
935 |
936 | 1
937 |
938 |
939 | 1
940 |
941 |
942 |
943 |
944 | 1
945 |
946 |
947 | 1
948 |
949 |
950 | 1
951 |
952 |
953 |
954 |
955 | 1
956 |
957 |
958 | 1
959 |
960 |
961 | 1
962 |
963 |
964 |
965 |
966 | 1
967 |
968 |
969 | 1
970 |
971 |
972 | 1
973 |
974 |
975 |
976 |
977 | 1
978 |
979 |
980 | 1
981 |
982 |
983 | 1
984 |
985 |
986 |
987 |
988 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
989 | 1
990 |
991 |
992 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
993 | 1
994 |
995 |
996 |
997 |
998 | 1
999 |
1000 |
1001 | 1
1002 |
1003 |
1004 | 1
1005 |
1006 |
1007 |
1008 |
1009 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1010 | 1
1011 |
1012 |
1013 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1014 | 1
1015 |
1016 |
1017 |
1018 |
1019 | 1
1020 |
1021 |
1022 | 1
1023 |
1024 |
1025 | 1
1026 |
1027 |
1028 |
1029 |
1030 | 1
1031 |
1032 |
1033 | 1
1034 |
1035 |
1036 | 1
1037 |
1038 |
1039 |
1040 |
1041 | 1
1042 |
1043 |
1044 | 1
1045 |
1046 |
1047 | 1
1048 |
1049 |
1050 |
1051 |
1052 | 1
1053 |
1054 |
1055 | 1
1056 |
1057 |
1058 | 1
1059 |
1060 |
1061 |
1062 |
1063 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1064 | 1
1065 |
1066 |
1067 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1068 | 1
1069 |
1070 |
1071 |
1072 |
1073 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1074 | 1
1075 |
1076 |
1077 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
1078 | 1
1079 |
1080 |
1081 |
1082 |
1083 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1084 | 1
1085 |
1086 |
1087 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1088 | 1
1089 |
1090 |
1091 |
1092 |
1093 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1094 | 1
1095 |
1096 |
1097 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1098 | 1
1099 |
1100 |
1101 |
1102 |
1103 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1104 | 1
1105 |
1106 |
1107 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1108 | 1
1109 |
1110 |
1111 |
1112 |
1113 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1114 | 1
1115 |
1116 |
1117 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1118 | 1
1119 |
1120 |
1121 |
1122 |
1123 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1124 | 1
1125 |
1126 |
1127 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1128 | 1
1129 |
1130 |
1131 |
1132 |
1133 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1134 | 1
1135 |
1136 |
1137 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1138 | 1
1139 |
1140 |
1141 |
1142 |
1143 | 1
1144 |
1145 |
1146 | 1
1147 |
1148 |
1149 |
1150 |
1151 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
1152 | 1
1153 |
1154 |
1155 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
1156 | 1
1157 |
1158 |
1159 |
1160 |
1161 | 1
1162 |
1163 |
1164 | 1
1165 |
1166 |
1167 |
1168 |
1169 | ..\
1170 | 1
1171 |
1172 |
1173 | ..\
1174 | 1
1175 |
1176 |
1177 |
1178 |
1179 | 1
1180 |
1181 |
1182 | 1
1183 |
1184 |
1185 | 1
1186 |
1187 |
1188 |
1189 |
1190 | ..\$(PROJECTNAME).launchscreen
1191 | 64
1192 |
1193 |
1194 | ..\$(PROJECTNAME).launchscreen
1195 | 64
1196 |
1197 |
1198 |
1199 |
1200 | 1
1201 |
1202 |
1203 | 1
1204 |
1205 |
1206 | 1
1207 |
1208 |
1209 |
1210 |
1211 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
1212 | 1
1213 |
1214 |
1215 |
1216 |
1217 | ..\
1218 | 1
1219 |
1220 |
1221 | ..\
1222 | 1
1223 |
1224 |
1225 |
1226 |
1227 | Contents
1228 | 1
1229 |
1230 |
1231 | Contents
1232 | 1
1233 |
1234 |
1235 |
1236 |
1237 | Contents\Resources
1238 | 1
1239 |
1240 |
1241 | Contents\Resources
1242 | 1
1243 |
1244 |
1245 |
1246 |
1247 | library\lib\armeabi-v7a
1248 | 1
1249 |
1250 |
1251 | library\lib\arm64-v8a
1252 | 1
1253 |
1254 |
1255 | 1
1256 |
1257 |
1258 | 1
1259 |
1260 |
1261 | 1
1262 |
1263 |
1264 | 1
1265 |
1266 |
1267 | Contents\MacOS
1268 | 1
1269 |
1270 |
1271 | Contents\MacOS
1272 | 1
1273 |
1274 |
1275 | 0
1276 |
1277 |
1278 |
1279 |
1280 | library\lib\armeabi-v7a
1281 | 1
1282 |
1283 |
1284 |
1285 |
1286 | 1
1287 |
1288 |
1289 | 1
1290 |
1291 |
1292 |
1293 |
1294 | Assets
1295 | 1
1296 |
1297 |
1298 | Assets
1299 | 1
1300 |
1301 |
1302 |
1303 |
1304 | Assets
1305 | 1
1306 |
1307 |
1308 | Assets
1309 | 1
1310 |
1311 |
1312 |
1313 |
1314 |
1315 |
1316 |
1317 |
1318 |
1319 |
1320 |
1321 |
1322 |
1323 |
1324 |
1325 | True
1326 | True
1327 | True
1328 | True
1329 |
1330 |
1331 | 12
1332 |
1333 |
1334 |
1335 |
1336 |
1337 |
--------------------------------------------------------------------------------
/Demo/DemoOpenAI.res:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/magnolima/OpenAI-Delphi/f296b0cff4b3b9db04d05f6245b00f23a67b400f/Demo/DemoOpenAI.res
--------------------------------------------------------------------------------
/Demo/Res/Icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/magnolima/OpenAI-Delphi/f296b0cff4b3b9db04d05f6245b00f23a67b400f/Demo/Res/Icon.ico
--------------------------------------------------------------------------------
/Demo/Res/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/magnolima/OpenAI-Delphi/f296b0cff4b3b9db04d05f6245b00f23a67b400f/Demo/Res/Icon.png
--------------------------------------------------------------------------------
/Demo/Res/Icon2.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/magnolima/OpenAI-Delphi/f296b0cff4b3b9db04d05f6245b00f23a67b400f/Demo/Res/Icon2.ico
--------------------------------------------------------------------------------
/Demo/Res/Icon2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/magnolima/OpenAI-Delphi/f296b0cff4b3b9db04d05f6245b00f23a67b400f/Demo/Res/Icon2.png
--------------------------------------------------------------------------------
/Demo/Res/Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/magnolima/OpenAI-Delphi/f296b0cff4b3b9db04d05f6245b00f23a67b400f/Demo/Res/Logo.png
--------------------------------------------------------------------------------
/Demo/uDemoOpenAI.fmx:
--------------------------------------------------------------------------------
1 | object frmDemoOpenAI: TfrmDemoOpenAI
2 | Left = 0
3 | Top = 0
4 | Caption = 'Demo OpenAI - Generative Pre-trained Transformer 3 '
5 | ClientHeight = 638
6 | ClientWidth = 928
7 | FormFactor.Width = 320
8 | FormFactor.Height = 480
9 | FormFactor.Devices = [Desktop]
10 | OnCreate = FormCreate
11 | OnDestroy = FormDestroy
12 | OnShow = FormShow
13 | DesignerMasterStyle = 0
14 | object ToolBar1: TToolBar
15 | Size.Width = 928.000000000000000000
16 | Size.Height = 40.000000000000000000
17 | Size.PlatformDefault = False
18 | TabOrder = 0
19 | object SpeedButton1: TSpeedButton
20 | Align = Left
21 | Hint =
22 | 'Engines describe and provide access to the various models availa' +
23 | 'ble in the API'
24 | Size.Width = 121.000000000000000000
25 | Size.Height = 40.000000000000000000
26 | Size.PlatformDefault = False
27 | ParentShowHint = False
28 | ShowHint = True
29 | Text = 'List Engines'
30 | OnClick = SpeedButton1Click
31 | end
32 | object SpeedButton2: TSpeedButton
33 | Align = Left
34 | Hint =
35 | 'Given a prompt, the model will return one or more predicted comp' +
36 | 'letions, and can also return the probabilities of alternative to' +
37 | 'kens at each position.'
38 | Position.X = 242.000000000000000000
39 | Size.Width = 121.000000000000000000
40 | Size.Height = 40.000000000000000000
41 | Size.PlatformDefault = False
42 | ParentShowHint = False
43 | ShowHint = True
44 | Text = 'Completions'
45 | OnClick = SpeedButton2Click
46 | end
47 | object SpeedButton3: TSpeedButton
48 | Align = Left
49 | ClipParent = True
50 | Position.X = 363.000000000000000000
51 | Size.Width = 121.000000000000000000
52 | Size.Height = 40.000000000000000000
53 | Size.PlatformDefault = False
54 | ParentShowHint = False
55 | ShowHint = True
56 | Text = 'Images'
57 | OnClick = SpeedButton3Click
58 | end
59 | object Image1: TImage
60 | MultiResBitmap.Height = 82
61 | MultiResBitmap.Width = 320
62 | MultiResBitmap = <
63 | item
64 | Width = 320
65 | Height = 82
66 | PNG = {
67 | 89504E470D0A1A0A0000000D494844520000014000000052080600000025F90D
68 | 8E000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
69 | 313549444154785EED9D077C13651BC0EF2EB9EC3469D34D29A350368AEC257B
70 | 28A8800C9529605985B2CA865A3648192DAB501450501004451011644A652F05
71 | 4A8152BA47DAEC7597BBEF2EBEF46BC8A54DD21601EFCFEF7E7D9F27694893BB
72 | E7DEF7799F01B1B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0
73 | B0B0B0BC46C0E0E74BC3BAA875F2B4879961168CE82CF3F16A5054A082208280
74 | E43E3228EB69F6051F5F8591C7B19E8A3B12A784619804BFC6C2C2C2E2362F85
75 | 018C898941CCA9F0D09C27D9832D98B6AB598788C0438CF0F8280491D02F521F
76 | E9EF4DDA3539386559441A7888858585C565FE5503B87FFF7ECE85DD5787E4E7
77 | 15C55A74C63A40ED16180217F9FB78ADEFFA71FB8D43270E2D066A1616169672
78 | F9D70CE098AE53021082FCBA28BFB80749567C252B140952FD6AF84D5CFFC3CA
79 | 9340C5C2C2C252261CF0F385327FD892764F1F651D346A0D6D80CA0118862194
80 | 8742048F5BECE525D66216BD0946B82267C612C7708551691CFA61DFC19AB337
81 | 4FFD09D42C2C2C2C4E79E133C0B19DC6B75116197F8571DC0BA84A50C2994435
82 | 51DD14998FF4106630FDD0B84D632CA865B3D42143DA196362F6F3F22F5DAE8F
83 | 19CDE104611DAD2D5677B55A213EF8D51228A3490AA4C2A8760DDFDC8AFBA181
84 | 8FEFA73586A8270A44427D414A4672F3E6CDA188C4089CDD4061616179A10670
85 | 79C4EAB65792EF1D87718B83F1A38CDE1D542818BDEDE4FAAB40552693BA4F0A
86 | 56692C0B3193793C8E5981F61FE8D9A3D45B0AE9357AC88A83C7A8BF14455148
87 | 281142384EDCE470A043BEC18107E20EC4DEFDE7092C2C2CFF355E98011CD469
88 | A2842CD42553B3B7C6406503B11286C0B0A0658A56D2D5B1B1B13850BB04B51C
89 | 86237BCDE85E90AB3C412D8181D67560038C0B82F89972B9D7DC4DC7D7EDA354
90 | ECAC9085E53FC40BF301B6086CB6C46C32F707A20DD28CE8C57251BFA4739B76
91 | 9D3D7B96006A97E1E5491A3F4DCD9C6231634D80CA3D5008C1CDB85CAF310C6C
92 | 56BD458F2E6F75BD75293539073CCAC2C2F29AF342668073062E6CFBF84AFA39
93 | 5C64E5021584701052E22DEDBFF3FCE61F81CA6536AFD8E37DF9E88569858F32
94 | E6F0E43214A82B8C45A5C66A36AB3733E1D89A0418627D842C2CAF3B2FC4008E
95 | EA30E11B8D5233148836BCBCBDE2765EDC3213882E71FAF469EEA135BF0CCDCA
96 | CAFF9C34633581DA019E40A8158AD13FA53269B24EA3BDCC17F091FCCC025550
97 | CD808E9A627D53CC84B5339BCDD5C1D3EDA0FD87DE013E49DB4F6F88608D200B
98 | CBEB4D951BC08498A4E00B872FA461168C07541097CB497FAB6DC337E66C9BA3
99 | 06AA7299FD514CD72729198B70B3A593B3501889B7385DC817CE0D0C951F8ADD
100 | 156B026A07122312D1EB0FFFEEAC531B16984CA6B749C2FEF56823185A27785B
101 | DB612D260E1E3CD87E87858585E5B5A1CA0C604CD43AB92A3DBF6B5156E178BD
102 | CED003A86D04D50888DE747CED1A2096C992D14B6ADCBFFD7461A6F9C1A70A3C
103 | 04016A3B787C5E964C215DFE5687463BC7C58E330075B9EC1FB49F73A2F0CC87
104 | 8579C56B1112A906D436100481826B068D8A3FBA7A1750B1B0B0BC6654BA011C
105 | DAEAD386429168A3566D6886992C72A02E4129CE243A37EAA788DD354D05548C
106 | 6C9CB85172E3EF7B938B959AE99095F0056A3BAC1C9D4926F1DF5CAB4EF0AAD8
107 | 6F62F381DA6D62C62E0F7F70EBF141B3CE68B743CD1358B5FE21B5EAC61F5991
108 | 07542C2C2CAF1195660027F79E15525450B4C66C320D219E5B529646EA2D39BB
109 | EB626267203232F5FD3943339EE4CE2731AC0150D9412F51E50AAF9341750267
110 | 2EFD6AD12DA0AE10EB166CAE77EBF49D539A228DDD4C502815FDB0E7F2F60F81
111 | F852F243C20F8A4B176F3578FCF763A849CB469D600446491826B3D3736F1026
112 | 5351DB9EED0B3F9D3FF43E783A0B0B0BA0520CE0CC01F367DD7DF074A1C04A48
113 | 80CA29DE013E313BCE242C06A21D511FCC7C33E789728515C37A3BF3F3215CE4
114 | 4A50CDE0651D8737FFB9B2FD73D10317D47BF4E069328459BD810A420C081ED6
115 | B646AB55DF2DBD0154FF3A74F51C430AD437372DA7338F8BF637180CC1D4E7C5
116 | 63FCCCA86F18B1C056911FC76236C287E47EF23356887B60CBD1956CE188FF38
117 | 53FA464F140A05EF00D101898F57DCC2C4E83340AC10B3062F5C0F93501810AB
118 | 04C48A44AFF821D6AD1B7D850C200991F0B8EE518B8A728B63082BE1D26B356A
119 | DD70E1929DF39702B184A83EB37A65A4657F039124E37217E2700B03837D56E2
120 | 4A7DFCB66BDB30A075CA989ED37C70B399B7EBECE65CA0728991ED268CD7166B
121 | B600D1868FBFCFDEA4B30976BBD8FF06B45BE0DEA3C7111AB5761266C26A3BBB
122 | 4994071725D422A9FC40ADB01AABE725CD7C00D42CFF21A89B28EFFEB1AC3CC8
123 | 8239B8A99EE1E5E3B56FFBE9848F80582186BC31E21A656EDE026295401250DB
124 | FD7776B95507807153C11568E337AAFD84054539C59F3F6FFCA8152AC4E5218F
125 | 650AD95EA02A21EB61563218DAA12ED6443319BFFB30C72A960AE39B756CF2D6
126 | E613EBE2CA337E316357860C6B3966BD2627E789E1892E6358EB881F62862E6B
127 | 081E2E17BED9BA83CBE73F06A20D6586EA83B91F2D0B00E2BFC2F8AE533B5EBA
128 | 74F35261AE32CE62B4786CFC68700C91514BFD31772FDEBB39AAEDB828EA6228
129 | 89CF64F96FA0BD837D5296F1A3D1280DDD6386C638A4ADBE4E786C00A7F79B37
130 | D4A0362C2608FB040E928368826B578B1ED8EFBD06A1E121747A991DC5856A3D
131 | 18DA219270DF00431BB49F4F2415FDD1AB5E4887AF2F27452DDC3233033CC4C8
132 | BEB87DC2B19D264F7E70EE568A41678AB2E21CA95564E51A34FAFE7FDFBCF3E7
133 | A71DC67FB17DEEF6728D186D60C562C16620DA80F984D8A0570F00E20B6754BB
134 | 88E95A8DF69C05C75C36E4AE80A1B8D06830AD4F3F957B62588F1962A066F90F
135 | 50985354FEF90CE38AACF4C2B781F45AE291019C3D3C26343F3337DE6AB577C1
136 | A142FECD806A3EAD127E5EBD6670EC600BE47E7AAE0D2E1F795CAD56C0C7EFCF
137 | ECD169DDA1E5654E69A999103CA1C7D4F70E7CFDCB1F45F945F1668E63356982
138 | E048D54AEDCC53BF5CBC32A1E78C08A0764AF38ECD7E5422997696BD20A7D0B3
139 | 74BB0A32BAC3841546BD798D27B9CEAE62D49ABA6079854787351DC61AC1FF00
140 | 3163627CD2F17B7D80582624024D05C3D7128F0C60DEC39C04A3DE52B2514083
141 | 723977452271CFADBF6E48012A8F110A0553E28FC67D57DE26C7BC4F62DE1CD3
142 | 61D2C9821CE54F5633D60CA8E9343BEAEE05845258CC96EAF999795B47B61E77
143 | 71FEC8254E77A223577EF630585C3B138836602EF76D7AF301882F84E1ADC646
144 | 3FD2DE9D450DCBF5AF723042EDE52DCC8411780F7553D8491F325FE96D0EC4C9
145 | A5631ACB05863A913CEE91984131E56E64B1BCDA3CBD9FDF3FD052D3A573D990
146 | 5BD436FAA3986020BE76B87D414FEF3FB7479A3AA52F106D70095C155A2F74C0
147 | 5717120A80AA42C00862014346964D591F30BA5364E2EDD3D72EAB8AD45D09EB
148 | 3F9335EA42272572E96FD5EB566F1B14E23F9AC7471D7A85D03346AD46D736E5
149 | EAFDE39F7698B86778B7490AF0901D322F2FFB3259B8B511FF31DFCEE85725B3
150 | 3E5AD8C76A25560542CE4FD45CE809211209CF2802BD8734EED22A6CFB99ADD5
151 | BFBBB173D8FEDBBB3FA58F6DA736BED16962EBD090B090CE02217F03CA43CBFC
152 | 5C718CECF2243B6F31FD190115CB6B06FDDD9210CCB80AE270395F8161098490
153 | 272ACE53BA345B2C1BF843C40A35707690A4B5BC15D60AA6DF2B7D1062BDDB21
154 | 716E9DE8B68D8F7613CE688BB5767E8190DAC153E38F7EB1018825C48C58FEFE
155 | 9D2B7FDB153B2049A8EDA1FB7B1C96B5137B4616E46614DB3641BC7C243D77FE
156 | 91F89BED8152D0296C571FFE35D2A055AD31EA081950DB108904A9BE21BE33D6
157 | FFB8EA085041896BF6F8261F3C3FB550AD8FE491F6CF2F818716D7A815B471DD
158 | E115319454B2B330ACD5D8C506AD71211021948F42BE35037D371D5EA904AA2A
159 | 23222202C5EE908F0C060B63BEB20D1EAA0A0AF2FB6CFD4F2B0E004DB92C1EB3
160 | B241DA83F4ED068DA13D5039405D045040F580CED4E77116A8585E23168C5E5C
161 | 2FED76FAFDE75D2A1C2E725B28144FD4E9B4179E2F0A475D8F7F6D3FBDA94A5D
162 | 4011CD2350356E767E8326C8A9FBEEEC76B03115C5AD19E08A896BC3B42A7BE3
163 | C71309EE7AB7106D02629531A9CFF45EE76F5EBAADCC29DA5EDAF8915CBEC62F
164 | 483139AC6F48E3D2C68F66DCCCA1853B93B72E68D5B1714B6F3FD961FAE276C0
165 | 8279A7A73C5D38B4D5E854FAFF005AEA0387FEB51C60FC2EE7B3B28C1F8AF08B
166 | C2DF08EBEE8EF1A359B463CEBDE65D1BF596FBC94F0395037401D9829C02C638
167 | 4D96579FCC94AC014CFE646A62F8CD8E0B1B2F9230920A542568F3F40D160C59
168 | CC9894F0AAE396017C9AFAB4FFF37707BF00EFADEE16327587B903631A8EEE38
169 | E1485E7AC12F06ADB93E5097101020DBFAC107BDB753EFC1E9DD6351E2ECD461
170 | 5D060D0A0E0DEC2D9608AE03B51D46AD39ECAF27D78E7DD679F2E9297DA2EB4A
171 | BCC576FD4A381C0E2495567D44404C44A2C86CB54403D1010EC6B1CA82A51F2E
172 | 499A7B0DA8DC22323652E7151AFC81C44BECD4579B6149ED3077686C3720B2BC
173 | 26242626A298011F04C4FF8351377B94384C8D4884247EF847F97F4894E4E4E6
174 | E50F06E26B855B4BE04F3B4E4C5617AA4B0C031FE61B5BF46AA498B16E8611A8
175 | ECA8C812B849ABF06B3793EF476A0CF973399844607B92132432F1F990B0A059
176 | 681DE8326508CB2CACBAFB8BDDE2334792475A0A2D6B0CA44908D476D055AAAD
177 | 3897A4C35F808AFA3F8477FB4EEFD9B4AAABC38CED12D9555BA43D054407F87C
178 | 5EC2EECBDBA700D163A6BE37B37D6E46E105D2493CA1502CD8B6F362E2382056
179 | 9895112B6579B9C55D0992EC9E9BFE4F6AB540C2877C037C3526A3F17270DD9A
180 | 17E62744558A0FF979D64EDD1A94F138AD0DF5C5D5D3176BABEB402496225001
181 | 59CCA62B35C26B66E216FD85B22A085516312363040847D4565958D8D462B084
182 | 17E7FF9312EF5FCD0F32E84CE79A76687427A89922A52ACEB3B94316767C929A
183 | 79EE99CFBC0492BCB5EFF6EE37E9E1C03746B4E240F0259BBE145C01EFEF3ABD
184 | 839B96777D79CABFB50476D90026265E454F6CDE788FB46025E92C308C1C3D78
185 | F76BBB0D91D2786A00A55EA26F318BB9ABC964B58BDBE38B0459622FD174CC64
186 | E9A1CF368C22444449002F17E54222A9706758D33A8BCA8B19A48999B83AF0E9
187 | 9D27D1DABCE2F10443E8CCF38825A26D5F5FD95E6906C11923DB4624980CE648
188 | 20DA4177C9AB5927307CE9B74B1D9629EEF28F3F77FC0993DED41DA8ECE0F2D1
189 | 823D9793FC8168C7BE0DFBFC4E1C3C7F44A3D602CDFFF15248A1AE037BBF3374
190 | 625F5BAADD9AE99BAA3FB8797F619ED23C5C00999DDEC8B82A08E7060B7E93C8
191 | C5EB36FDB2D6C1FFEB2E1B266FE0A73ECA18A5CA570DA0FED61ED4B2AFCC739D
192 | 3A7F0A7802DEB1E0D0E02F97ED5D780EA8CB25E6D3A553EE5E4FFD0488767020
193 | 68C977B7761DA5C73386CD10E7A6A8C79108146D356181B6273040AF345011EF
194 | 8297976459C2B135C781BA5218D97EFC5A93CE380D88FF878462F6DDDE65737B
195 | 0C6A388887A0223A9DAC162D9726FCCDF00E4B76CDFF038895CA4BEF03D4DC38
196 | ED2DE471ED72F9E47EF27430AC54B41AC3C7A58D1F8F9A9129027DA2DFF9A853
197 | BDA4D309FB7725277ED6A073FDCE12A9F822780ADD1613D21469475D397BE35A
198 | 4497C8E8FD89FB99373D00B19B67E57E757EF38CDA4DC3DA4865921374E07559
199 | F025FC4AC9892C0F8203390D50E589F8172BC3F8D1D0C55E511E6F27101DB05A
200 | 70BFD8B1CB3A02D10E2BC24761046A4D9D3C0E07357B684D193A5B95EE990317
201 | 7C72EDCCC56B6AA5E6B3B28C1F0D2E87B82683E99DC26CE5AF9F7618FFD3B481
202 | F3EC8A52B8C3ACC10B3EBA7EEDDEC382AC82AD1886F52CCFF8D150CFF133680D
203 | 231FDD7D74E6B32E53BE9FDC7BB21F78A86C483294E973A00F2BFC4F15A3A1ED
204 | C6D7CB4FD13EC02D585C59C68F868EAD35698D1D0AB20B8F4DEC31ED20F53E1C
205 | 3A1F7AC24F893F89A8EF7420104BA0CF7B2F1F51C986D7F777BFB770B9DC92EB
206 | AA34F9193923C0F0B581FA9E5CC3C2857D4C463390FE81C0B14AB9189DA1E465
207 | 12D4526C6BBD6E4D9B6C3F9DB06644F488922C12FA4ED4BC75A3AE01D5FD4772
208 | B99C9290152E09F915E616AF3E94F8CB1F93DF9DF901503B65F581A577DA7DFA
209 | 59DF1A75ABF7E70BB87F01B52324E1729D414F5939796588B508771A6A23958A
210 | 2BD508D7A8137A519FAF644C2DA497C6CA6C95C73B7F23DB8C1B9A7525631761
211 | E5BA6648FE0F6CD01ADFCB7990FD1BB51C73D708C2633A4D5A96F9307BAF496F
212 | 0C013AB7A0C3443445EA819A42FD5F51FDE6B4056A8F8919B9AC3EA1D1FF6EB1
213 | 98DD8AA5A3DF8732BF684091D2B8B7328CE0D913C9BD2923EFB0B1462D87D355
214 | 7E8517806803E1420E29AC347A95F6DD6903E318DD46AF2A2E1BC08C949C227A
215 | 7A5E9A80EA55931E4BDF952472C9F55675DA75DE7375C784D82D73ED72739F11
216 | 951065DE7262DD6EA10FDCDC2FD837AE749C9BD9686974EA49EEC1612D461F59
217 | 3C7A4533FA84020F39306E5C0B6CED8F2B0EB7E9F0567B9F409FD574FE3178A8
218 | 04BDCE183F7BD0EC32679515E5EE8D741F2B6A757A8299CD66BB13B5A22C4C8A
219 | 4E53D40C64F4DFD2E4E71478F405DFB9FEB08712CFFA8AA0667540E536244C36
220 | 4020E4E4D45E538380AA3CE0E1AD3E5BAC53E9E651B328975D3BCE3061567F65
221 | 66DED198914B9D36EF2F0F98E4224F1F65C6131CC4E340626AD638C062819700
222 | D16394D9C50398FCBD08073EF8FDF7DFDB9DEF26ADE624F50538847B61562844
223 | AB4CABF04DE165C265031810160871507B035898530846958B5F906243AD9E81
224 | ADBF38B8E23C5095C9AEB3BB4C89A736CC0CAD1BD2D48A9025D55FEA9324C7A0
225 | 37F7FDFB5ACAF5319D23D7977727A50CAA865A62CFEE1E16D00FE220767F9C59
226 | 6F09CDCD56576975E85A75AB975927B17DEFB6955EC28A5A063F024307E4BEB2
227 | 5660E832981983325353378B3145859B55C110595F8BE187E8CADD40E594713D
228 | A24662166C01101D2009384720E66F0E6B546B1EC2E5B616CA846F07D70A9A27
229 | 918B0ED1CDF4C1D3ECC030C23BFD61E6B7DBE3F6F900955B0844BCBE46BDD1AE
230 | 1ABA27E8B586E8E563D78403D16D060D1AC43199B0F7816807C2E13AECFAD2CB
231 | 60CA7ADB7C97CFC3E1C093C1F0B5C075031820A67B79000940228C0EF48A5298
232 | A73EEA4968CD170796A6A004EC50199ABA302055BE6A4A76A6EAF1B8EED3227F
233 | DDFD6B9939AFF147BEF8D937C0E77D9E816BF71EF42AFD0791EF4CEF07C44A47
234 | 9957768CF54F3B0E3286F054044D91FE09183A60B1E06EC7FD18744648ABC24A
235 | 7E8F9ECD5386E0B2974236D3BFBA5FAFBEA37BF7AAD5B8662F895C3A1C15F069
236 | E3039EC98C4EA96D7D4E77B9CC526493BA4D52E85545EB9966383472857C6FD7
237 | 21DD9AEFBAB86DD2F2BD9FAFF8F6DA8ECB3BCF6D3DBFEEF0CA153BCE6E1950A3
238 | 5E8D309158C4E8DC37EA8C35CF7FFFBB47F9B066836940E97E337A8112937A4B
239 | AF52EBDBD5F4E1E52B3D86F2B88CAB9BD2D0E7EFD3B40CC7CD0B17A941868F25
240 | 095C0AC4FF43424F8BD4A2AB40B207760C87A151A90C9DE95C6220BEF2B86C00
241 | F3A0BC42A319FB1B88364C2693C78EEA1741B59AC1C9220952D27889B412C185
242 | D905095F6F3A7861E680F9651AEF6DA736244B6A49C797DE1CA12BDFA88BD5AB
243 | 376C3856298EE9E729CCAE9A19B5A798B44E57C72E618250934F807CC4AEE4ED
244 | 6DB6FF1E1F97F0F39A13C3A33E3EB1724FEC891D67377EF3CDA56D037C43FC9B
245 | 235CB4CC14A6C27CE584B24A76A9B5E669980561744F48BD245F27FEBE61E8F8
246 | 05C39DF67B5EF6CDC2B4A62DC3FB8AA422C6D84A9DC51239A7DF1CC694495730
247 | 412A936FB022BE6DE3B6D593CE6C6CB9EFF6EED9F4B1FDD4C63E6135431A0456
248 | F7FF882F84CAFCF2755A7D1F3A8406886E41ADD41837D610183E76FC6182BD63
249 | 1F502DC4EF0F46FF3086CBF3B334EF02E995C7650348C7FF48A542BB4D82EB3A
250 | 7393E8010BEA02D101BE90EF308BF3F693BF30A359AD6E506283C6F5EB0AC582
251 | 551C2E64FBA2E9598241A37FF3CAF9F4A323DA8EDBBF2C628D4370F533AA7552
252 | ECE20B51BBEC1283C65C37E7E29F5513145A2511569E83E19EC7B7231862AC53
253 | C77FC0E65FD77F4D89CC53338AF587965FF70BF6EB0573B9F6B9D7A5B1926DCC
254 | 0FA1AE40B283368C24669A00443B1091C5D0B8595DA741E5A599B6619A2A20D4
255 | 771CF5BE1DFCBFA895F05616E98600D12D600486AA05D68AD8F4CBDAA8F93BE6
256 | 3BF49689FD3ED6B2E1E72FF6F9060777E4F1201D503B805BF0EA10C2AB0D4497
257 | 99D13FC61F33638CAE159E183D09860EACFD796DA134D0973163C86AB1327EDE
258 | AF222E1B401AB15462971F5A9FB4727233F2187D0B3439E94F4EF1E1FFCFC068
259 | 746AE557633A4E5C183328A6A44D665532FFABF9057BAEEE9853BB41ADD6281F
260 | DDFF2CF251E14BF2742ADDA05B7FDEB930FEEDC92595644A432FC3657E8A05A5
261 | 377F68039AF128A71310599C20F5132F8E3BB8FC17209609DD742A20C47792AD
262 | 8A0F03F4679EF33887F1222EBC6CE88D131CC625196A956C9D1A3FD5E586562B
263 | F72EB926F41331BA194C66CCA37A904221FF30B80994C9DA1F56DC97FBFBC701
264 | D101FA33484FC9747B575E5D5C3808C7AC0ED71A8C116A08B530FAF94A20E13D
265 | 60648756A56DB164D412E779EAAF106E19C0DB3AE1760ED76A17FD6A254C0B97
266 | 4D5EC618EA90703CC12C0FF0EE26F1923C052A08C738D2E242F5E2078F1EA7CD
267 | 1AB2E885DD4956ED5F7A6BDFCD9D43AAD50CEA87F2B825775A1CC31566DCB208
268 | 880E6C39BEE63687677FA78411680C7D760091E53904225413DEBC4912105D62
269 | C38FABCEF0043CA70518480466BCE918B53AA71B473EFE3EEE870D5909C62C1C
270 | 8BD1FA66E2CA44B7A20068F7894FA07C1D10CB05369AB79820C469368A542EAA
271 | 09862E83630475AE3A42A2C8317AF310888C907CE4570B0439143026AC04EF49
272 | 5A8ED304885709B70CE0D9B3B1B8C4C7D76E49683210B2A7F7721380E8C096D3
273 | F1D764DEBCF0A01A814BD052B341B391087E74E7F1A6911D265C89EC33AB95D1
274 | 5A7A87A5CA528BA184636B7EC42D563B9F9346A52FD3A9EBED2F3F0486360C5A
275 | 039DE552A5D5315E651018FD71E6DA716E3B34B93C94D1F14E63D29BEB80A11D
276 | 386E65DCA9A66B209A4DA6874074199F001FBB3A90CF403856C595A377DC72FE
277 | 9308A26ADDABB9CB259AE27F8FCF132256A7C9055E3E52C6CFC0197307C7344E
278 | 33DDB5ABB4FE0C18469C7ED6CFF8EED28E3C94241983A2091299F4A2EB635605
279 | 6EFF0142317F9E89C3B1F35564FD9D366042EF69C380E8003D13DC743C6E9177
280 | 35FF702F6FC9368B4A6D73AE52D37A58ABD4B4C8CFC8BBA4CD539604000BC455
281 | B2C7E03141217E67E9980C20DAD068B56586ACFC97C171DCA3806D1ECA75DAD1
282 | 8B6F411507127FB2F3D7D2172041C08CAB0FBAF24F8DBA6E4F98A08C07998CEF
283 | C1D6FA8124DD0AED110910D3E07183ED5C40E521F571DCACF594FCBCC28181B8
284 | 633D497A73835F4CFC0CC43241053CC6EFD2A8D135B2A6731A01F195C56D03B8
285 | F9585CBA9F97682B106DF0E43234E356EA97D306CC65CC897CC6D6DFE2F2E904
286 | FBD066F55BF145C292A5069DC6563A419B368C60E816FB63F6F3B87CB4F2CE20
287 | C0A2A4397F4B20B1DD1685516B7EA977C0FF4DBC14328F8A0AB4EED11A8C1C81
288 | BD608E0537DBF9B25AFBB446653E62C64D2C7AF33E333DB3DD903746F474E790
289 | F8889DC6ED356AD7C02DDFAF44EC7E870189A4F24E5F9DDAC8E8B79457F3FF73
290 | 577AD9CBDF670804E8A1D29110CFA07D92990FB33DF28BBE4C783485E5FB1031
291 | 7C01EF0A106DD046F0FAC38B5F8FEB1135B7BCA9F1E6636B6E7E7B2DA9BB6F35
292 | DF0F4512D4213C01375BE3C6BC3DC9AD00D219FD67F81FFAF9F82A0CC31D92B8
293 | 2B0301F5AF340459F95BB67CE10BD9177219A1C4B3AC27B1D8A3680D88CF772F
294 | 7124F561AA2DEE90098B19830AB20A932853F8AB3B874EA59F0D5EC281E7FA7F
295 | 950B22F8F75632F3872FE90EC304A39B8620499703FA779CDB728F5AFA5C06A2
296 | 1D044E7C525678D2AB80470670DBCFDB0C41B50247601CB808A86C28B010A430
297 | 4BB9FCE1B1AC23312397DACAEB94C5B6931B7E086B58A3B6CCDB2BA6F4C60466
298 | C11B3F2CFCEBF8C8B6E3CF47F69CEE344C852626224614D17DCA9CAC27858FCC
299 | 06F3D4D281A755096E29B735B1DBF804971D6AD6FDBDEE2F340F53287CB95C11
300 | 8C5033111647729E64DB0561978041462ECA73ABCA0C02438CFE42B3C91C8EA7
301 | 40AF74D7388F0C208DB409EF8184C7750831A0A7C6469DF1DD7B371E9C1FDF3D
302 | 2A7EEBBCAD65E672D235D8BEBAB865719DFA210D65BEF2AF110362DB01519021
303 | 8856A5ED9091FDE8C6E88EE3D7467D1065D7C3944E8F1AD932A2DBC39B19B729
304 | A3BBC262C2ABB4990F46FDAB6A643E5E65866C18706B3B30AC34243E32A7E5F1
305 | 091CBF07862CAF10C7361CE3EB8C46C68C259807E79A0CA68E839B8EFCC8D5C3
306 | 6A2598ED04655F7372941EC547BE2C786C002D29163F92849D96C9C631AB243F
307 | AB70F2D9A397AF8FEB3AA5DCB09165FB96657C757ED308DF06BE1D05127EC9CE
308 | 13C72A11A80AB5D372D3340FA7BE3F7B0EBDBC8E19B5F4ADA399A74EE90C8693
309 | 742567F054BAA61BC9E1722A7D4AB071CEF63A5A4467F75905850654FAFF9393
310 | 9673870E9C75C683DBA91E67233041D70434A8F39DCE2A319CC8024396578873
311 | C99707C018C938F1A02628B56018FAD6BD035E0E7EDD014C6FE847573107E22B
312 | 87C706D064E134B7989CD72F7C86D9620E2CC851268D6815716DF647318CD1FC
313 | A5D97A7CDD9F7BAF7CD9DE37D8F7232E97531212806116C5D3D4CC15F70E3F4E
314 | BD7F23F59A56A5EBF46C8A4F1B0D815878B879D7375A400872C7A6AC44AE27DF
315 | 6A4C58093BCB949B91EFB46AB3A7B47FA76F3A69459C2604E3385EA93BCFF386
316 | 2DEE0E4102A75E77914CE251EE31F55D81917B1415B9B5616AC359F0F43F0572
317 | 4589D405BFACB20E18266F80977FA9C9C9C87D619B1316CCEA9FF6D7D50E407C
318 | E5F0D800EA8AD47617236C250CDEFEF2E5288A325EC03AADA1D9C3E447BF0E6F
319 | 1371604D647C997E3D9A6DA736EC6B50BF5663EA229C4DBF365043B885A88D59
320 | 409C206592787CDEF5C6AD1A0CDA7B3569C0ECF5D3A90BB6CC89A6476026737F
321 | 30B4C1E3A3504817E634A18A3022BA975E281738ADCE82990DBDE3A6555E3DB6
322 | BCF4BC4ED4850D247BE894B0662D9BDAE57EBB4A76BA433D0A9748FBCBBDB0BD
323 | BA75EA420211F3860B6D003B7FF8F686FDB7772FA8AC63FA1793990B07BC4444
324 | BF1F2D35992C5552A4C41902BEE095AD10E3B101C430CC3EFE8ACB51EF38BB69
325 | 7E8B1E2D9AFBF8CBBFB472740EDBECA488E4EAD5FA0FAF9CBF78797C8FA9B1D3
326 | 064E2BF3628EFD3E561F5AA75A2EC4E3FED338A114280FCDF50FF19F53AF6E68
327 | DBD8AFE6D3DDD12A7D494A13376D631DCC8C7D04441B6289F8B427D56A5C8103
328 | 237641D7A5311AF06AF76F3E61ACD2EC2E7462BDC564180D440704DEBC3B9FC5
329 | 8E703B9098C6DBD7B95FB12C8C268B53978AD960516AB945763EC977A6BC6351
330 | E51531EE50D2A155A9D7ABB45EEF4B8905863F8170AB9DBFBCAA31E419BA2D9F
331 | 9450A9EE991785C706F0F9C47D04F8AEA2E322D393CE6E1AD3A07153BA64BD43
332 | 00310D66E148F3330B16653D56DE9BF5F122BAD287C3FB58307C71834FDB4FF8
333 | 25E5FA835D741517A08650986B15CB44AB6A8607D4DF7A62DD2A3A991C3C5425
334 | 3CBE9B36D762C6ECE2534888FC160C2B1DBF40C50F4EFD9894D668342FA71B3B
335 | 018DC714E66AE66016663F118D50223A08866E633218BBD0FE4520BA8CBE58EF
336 | 7489CFF712E2E3C68DB3DB8982A935A9D4DF9B319E8D36806683D15692FEBF84
337 | B640FD3118BE303014173EFA2BE51D20BE52786E009FFB4DABD5BEAACECAEF96
338 | 5CDA7D795B6789DCAB1B4F88A601B51DB8D15AE3E1CD479B9F9E2C383FEBC3F9
339 | B61DCED98356CA46B48E58F5E0DCA3DBEA224DAF674B343AB5492C971CF70FF5
340 | 6DFAF59FDBE7ACFA7E95FB0E233799357861AFD4A7B97627145FC8CF6AD7F6AD
341 | EF8058E9ACDC17FB808322C780E8006634373F7BE412DDC4DD63A6F59BDB4999
342 | 573403880E5850AE5EE62DD80E44B731192C0D227BCDE809449798D0737A7593
343 | 81B941930D2BC6E873E5C090535FAC5AA5FD4F15AD98D6675E35A5DEC2184D8E
344 | 70902CDF60C5D28A1C622FF136F0720E50376D8F6A26FEDB786C00B97CD4AEF3
345 | 1A8F2F0E5C376B93C31266F7C52DA7DF1BD4A37940F580A5101F65AC68AC2E52
346 | B7BB7BF1D699916DC6FD9AF1F06E8A4EA39F858BF092004B8190F777FDE6F587
347 | EF4EDEFA6EC2F138E765932A91D98366873E7D90B145424D8680CA86DC4FBE76
348 | EC17631DDBA155224289E47367CE7D1ABD563F734CE749ABA9A1DBB3AC191FCC
349 | EE9C93AE3C42DD579C860DC905E89615DFAD70B98ACAF3D0372D55916AD3C036
350 | 035DF257464444A046BD3EA9ACF784A27CC6CA25BEC181C77291278C21CA980E
351 | FF6C5FDC3EB77DA6633B45EE1FD126E2D4AC81F3DCAE88FD6FA2D6160F144004
352 | A3535428151FDDF4CBDA851539AABF592F9AC32518271EDA624DF32513BFA801
353 | C457068F0DA097B77D692C8BD9023F4949670C8A1C3A7768F196136B170629C4
354 | 7515410A7A6BDDA108239D49A255EB7A96EE06C717C04535C2436315FE92E64B
355 | 77CFFF86EE64061E62647ABF39E1840973DA54C855A60F995F3DFD89F214B5F4
356 | B5CB2A912964D79A776DE8F1CCC855124FAEBB2657C89C2E4149828475C5BAE8
357 | 91ED227E19DF634663A02E13DA393EBE7BD4AAECD4FC63246176BAF32B10090A
358 | EBBF51CBE50A26CEC02DD630442FFC3E66E48A321372E97691E6DBF09746BDC9
359 | E98CD1427034021FE9AF40B423F6CBD95743D1308736AB34069331F4CCAF7FCE
360 | 7575391E3371A364789BB11BB42AED20B3D1DCF5E9DDEC33A3DA8CDFB672CAFA
361 | 50F094971AC26A75DAB6552C165678D5129B10A5E10BC58C336E3A95F5F1AD47
362 | 769B85AF021E6F99CEFD686E405A4A6E8EC56429790DA158B865CFD5A4894074
363 | CAB0B6E31B73117887A648D392121DDE03DD94A8B5429A2817F216AE3BB1CE2E
364 | DB848935D3137D6F5DB81AA52F364D82B84489016CD5A3F9A839F1D31DD27E3E
365 | 6C30EC0275519438EA61183E77F0EE37F48E283C63E0A2AE69294FB6C256C2AE
366 | F20687C0554D3A36EB40E705035595B265DE966A177FBB71B9BC6E627462BB77
367 | 68E03999AFFC2C5FC8BB1EDEA8C69D437BFEB2CDDE7AF7AFD7EDF1DDF410AD5A
368 | DFC96C30F5B05AAD657668431084F4F693BFBBF9C4BA323305F6261C0EFEFDE0
369 | C92C6D71F913612E0F2A1488246BEB340CDB27AACFC99A32658A253E3E9EC7CD
370 | E7FAFF7529754071B13682C4F186E0E98C504679EDAEE444A74BF6D11D27F434
371 | 688DC7E9EF0FA84AE0503369A9B7645E60079F55CE9A7AD30672CEC79FB7CF7E
372 | 94B1CA62760C36A77B06078607B68CDBBBCCA1524BCCA8256BEEDF78C8F8DE02
373 | 430372371C59ED6A53271BD33E98733FFB494E3D20DA51A749ADA465DF7CFE19
374 | 10ED98357041938CBB9937089474E89FC281B8B97B6FED70EB7D3863F6A0F993
375 | 9E3CC8DC08443BF852D1ADF6C3C7B4A49B8C015509439A0E9F4E4288F34E7D30
376 | 9D70024501C9018220CEC0305266181235B18ADF776B97D3160F4C786C006986
377 | B71C775BAFD395E41BA2062E5EA74B9DDACB762E2CB73139CDF40FE68DCACCC8
378 | 5A821B71DB0743275D8B64923335C36BCC5CB26B2E6379F2D25C4DBC8A7EF9C3
379 | DEA1EAA282F5461D6157AB8D7A29A86D8FD6FD676E987218A84AF8A0C1D00BD4
380 | 5952620009023AD7AA57CB99F7FEBC3BD164308DA27BB396867E5F9461F824E9
381 | ECC62ADBFC6062688BD1F57083F51484422FA2F0028970E0886FAFEF2CB78E5F
382 | 7906908ECB7C3E0D8BFE0C65BE3248A7D6DF90CAC4CD54856ADB52B93C043C48
383 | D7B0558B7AB3374DCE062A46C6BE3DE9676A05D107880EF085E82D0E979B28F1
384 | 12DD6AD7A72D84197128F9C445EACBE7B4D4EBF57D3013DEC356F1850189B7F4
385 | BB61311F0EEFD2A58BC3CEFFCB62003FEB12B95253A465CC6396F848BFDB717A
386 | 63A56C8E2C1BB32CE05EF2E3347AE303A84AA0BFF7DAF56AB45CFE5DAC43B8D0
387 | 90374650D733FC1610AB049280DAEEBFB38B7135E00CCF374128BC14E2DD6068
388 | 0313E1DCDC27F90B81582E6B7F5CBE530EF36B7BFB7B4FA62E8E04FF10BFAEB5
389 | 7B067473C5F8450F59D82D6157E2F5BC8CFCAF9E377E34D4C99E99F144E950CA
390 | 87F609A9FC33ED5AFB1523991DBE39793559AFD53B183F253793F0F69745BE68
391 | E347B3E7EA9729560EA71B89408C35EA2A0B1883E93E92E35C317EAE50AD56F0
392 | CFCFFB306D7EC102159D43DDAC98FAE98AF1E372392441F0DF29CFF8D1207A6C
393 | B040C4779ABA6736626F50B3C4CD05D9457F1CF9F2973F8E7FFBDB1FC5F9DA3F
394 | 8A0A8AD79B0D16A7C64F2C15DD6FD7A3E31426E3F7B240CF602D262B63E1537A
395 | 8A23F7913A0DAD7217BAAC3F4FC1676C2045DFF47232F35EA90A31153280357D
396 | 83B670857CBBA8D7874AF5C8A8BEAE3794DE766D1BB6E3ECC68D5F9DDF3C65CB
397 | 8975747C1DF399085815B5AEDEB0966377A4DF4BFF4D5B6C68CC742171F982C7
398 | A1E1A18337FC18EB103FF867722654DD186EF7772BA010846EA109C412300B54
399 | 54D7EF8D814967366D02AA17CE813B5FA604F9FB771708D12A09C2C5AC50A17F
400 | 98FF98EF6EEDAA34DF268A72F7CBFD641BE9599FA7D03D4542C243E67E7D6D9B
401 | 4BBD90A9F3C850AF51783F94C7B1AB52F43CF4F962C5ADB6A33C232C94886F08
402 | 7D24DDC6CC1F5200542F25733FF9BC9BC960600CF98161541BD6A2F16F40AC14
403 | 4452A153838A19B181AEB4317D59A890018CFE265A8F72913540B4A1C0ADBCFC
404 | FCBCEF6246C6546A30E6AAE824E9E80E13E75D3C73FBA641671C8D638ECDAF49
405 | 014FEF1BA498DFB25BFDA66B0E2C49066A3B78027DB8495F7E293489C22B2520
406 | C4A74FD2EFF19576F7F4940DBF7E91D2B87DBDCEDE7EB2F9163EEA50A2DC13E8
407 | 9D534580CF2F35C342DE8A3FB2BA52FB1D1356C2EADF461615101AB0D9D90E6D
408 | 59C01C384DE22F7867D5B78B5701954BCC4B9AF94044703B2B02BDF731353772
409 | 955CCE13829AF96DD21717B4D9F4D317E5CE3EFF6D0AB30A9D2E6FA572C1EF13
410 | E70EADD47ED28A9A013FE4A2CCDF2B6EB5D6BDCEFDBB17105F7A2A640069EAD4
411 | AD9628914BEC4226CC5A4BE8DDEB8FF6F56D1E512949D293FB440FBD76E2C265
412 | 9552BD8C63B1386CF3D3D57F6572AF5DD54302C3B6FD1EBF3C3A2EDAA991C879
413 | 94D5D9D97287064585CAA09A0191BB2F6C69907436C12D7F425542FF4D5B4FC6
414 | 2F6FD1A45698DC573E4FEA2D75C9CFFA3C1C88932BF2126E6FDFB047FBCD27D6
415 | BDBBF6C7651EBD4E79D033F90D3FAD9AF45668DBF7F822A16BA14B029ECACB5B
416 | B2B47DCFE62DB79FD9E2B43F4859D033C1CDBFAEFFC8A786BC99402CFC1646CC
417 | 2E872C71A9153ACA4777F56ED5B7C79717B644DA1A84BFE4D0D9549A22BDD320
418 | 640E8994DB90C95D6237CFCAADC1A9C738ABA467D5F94FF35F99DD60CFD728A5
419 | 18FDF6A4B69A74CD3982BAFD02950D81407043AA100F493C19EF514ED2FCE14B
420 | 3A64A765AEA5BEE0964CCB15DBA689987F49EA231D439DF4E5EECEC6C49CE63E
421 | FE6DFF5D7DB1C6AE95271DA82D968A2FFA0478EF15919C93559D5D52199CA6FE
422 | 96C3374E85E955C59DF47A63538118EDAC2B324132425A1FF6A7EC1C85416B7C
423 | 0291849E2FE6DFA33EAB3B7C3EEF0C5E644CA6DD0EB617F190F236416AD4AD3E
424 | 74F581A57B81682B5D7646F547139D563F402A97F62FCA53C13846405C1481BC
425 | 64128D05C72E7BC9A567E442D1B1CAFEEC070D8AE1059A8CFD0C1A433B2E82D4
426 | D3194DD52DBA7FA2B024DE02882F14166306CB35AE907FB6661DFF3373B7CC75
427 | 6BB6F4D5EAFD8108696901443B480E9C336AE6D072FDD9A5D9B97A6F53982418
428 | C36E1092BC397CCE703B7F706262222A50899DCEB8045CF4D49019432AD6E099
429 | 81A4555FD7432198B1252ED3DFFDE5AAAF3B7220D8ADA652EEC225E03FE8903B
430 | 20BA44A518409A69EFCF4D7CFA2823E2F9DD3F0EC7AA95F9F8AE6CD42C6C33DD
431 | 7B15A8CB24F2BDF9B5D4F9F9332C5ACB788CC419FD095C2137D33FD06FA125A4
432 | EE9E6DDBEC53A49C31E99DE8BE794F738F949E017A077A5F08F155747B158C9E
433 | 2BFCB8FDC700DC8ADB66F642B3B0E8DDA877191B5F5704770D200BCBCB4AA519
434 | 40BA3476CE1FC58985594AC6047B542C500979DCFD72852C5E460AD31A8D6864
435 | 1E3C78B0CD4F93189188665B7552557E5E67656E717FBDD2D41FE6138CF9AE28
436 | 0FB578794B57D7A91DB27AF697B35D5EDE1C4E3A2C3DB8FDE7F37A8DB1A44B16
437 | BD6DEF1FECDB6BCB6FEB4F00158B0BB00690E575A1D20C200D5DD420E7826A6D
438 | 4AEECDC90A22C4A97F912E61C4E3A10F082B696B9D68B5E2C16693A56659BE39
439 | DACF27958B0FC9BCBC27AF3BBADCED429DE3BA4FDD50905530058836442241EA
440 | 7B9FF47CA32A9608AF33AC0164795DA8F026486968C7F7B6531BA6B6086B3704
441 | E6719CE6929A0C2648A3D286EBB4BA76F4613498CA347E622FE12D914CDC62C7
442 | B9CD1F7A62FC3E6E31FAC3F3D98593806883C3E14001D583E6B0C68F85E5BF4B
443 | A51AC067C4FDB4E240CDDA7E4D15013E5BB928B742BE35BAB660EDDED55AEDBA
444 | B0E51A0C979D0BFC3C83060DE28CEF316D41B6D1B2F7F9383F948FEE91BCC171
445 | C812616161F9EF5025069026EE505CFEF6330913AAD709090FAE19B40A15A097
446 | 959C4CE7D33C272833B443B2CE158F72B7FDDEAA29EBEB0A33E47BA865EF1205
447 | 41DAD5F39329BCF2518924B2BCA06B161696D79B4AF5019647CCD8D56FEA35EA
448 | 8ED98F7264D4ECF06DBDCEC8A3DF0087836871DC7A892FE20517642927946E92
449 | FE0CBE48788B2FE0AE7EF7E3AE3F0D8E1C5CD242F379E60C5ED852AB3644E53C
450 | CE7FB774618467E0305450B75E68D7B8432BFE022A1637617D802CAF0B2FD400
451 | BAC2CC810BA766A466ACC39CF4DDA50B2E088285D7100E72C6A437E573795C88
452 | 832032CA78B62C2E5635B49A885092A12A088DC04B98EBE525EBB1F5B738D6F8
453 | 5500D600B2BC2E54D912D853D61C58B23EAC49ED715C18612CBC48175CD0AAB4
454 | ADD54AF56CB3C91CA7D7E8E3342AEDA2826CE53B74856967C68F2FE69F57780B
455 | 9BB2C68F8585E5192F9D01A459FECDA26DC1B5AABDE51DA838791F863DCEE9A4
456 | E1C1A8512A9746B6EFF3D6BB09C7135EEAA4F65705DC245453779949244C301F
457 | 045466410216969785976E09FC3CD3072CE8575C50B440AFD637A71BDDB80A0A
458 | A359B240D97E2F857CF59AEF6373819A858585A58497DE00D2D0CBDA35933685
459 | 3E4D7FDA5FAFD60D50A934521846F862B1A081C9608638028BC1AC461EA0623E
460 | E4A3F04AD6E94C3F0A9B34FBDDD51439161696FF26AF84016462FFFEFD9CA77F
461 | 167B3FB8960235E8DC049F16FBA94B79C62C2C2C2C2C2C2C2C2C2C2C2C2C2C2C
462 | 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2CAF1F10F43F89B44BD90026692C00
463 | 00000049454E44AE426082}
464 | FileName = 'E:\DEVELOPER\FONTES\OpenAi\Teste\Logo.png'
465 | end>
466 | Align = Right
467 | Position.X = 703.000000000000000000
468 | Size.Width = 225.000000000000000000
469 | Size.Height = 40.000000000000000000
470 | Size.PlatformDefault = False
471 | end
472 | object SpeedButton4: TSpeedButton
473 | Align = Left
474 | ClipParent = True
475 | Position.X = 484.000000000000000000
476 | Size.Width = 121.000000000000000000
477 | Size.Height = 40.000000000000000000
478 | Size.PlatformDefault = False
479 | ParentShowHint = False
480 | ShowHint = True
481 | Text = 'Files'
482 | OnClick = SpeedButton4Click
483 | end
484 | object SpeedButton5: TSpeedButton
485 | Align = Left
486 | ClipParent = True
487 | Position.X = 121.000000000000000000
488 | Size.Width = 121.000000000000000000
489 | Size.Height = 40.000000000000000000
490 | Size.PlatformDefault = False
491 | ParentShowHint = False
492 | ShowHint = True
493 | Text = 'ChatGPT'
494 | OnClick = SpeedButton5Click
495 | end
496 | end
497 | object Panel1: TPanel
498 | Align = Top
499 | Position.Y = 40.000000000000000000
500 | Size.Width = 928.000000000000000000
501 | Size.Height = 227.000000000000000000
502 | Size.PlatformDefault = False
503 | TabOrder = 10
504 | object Label2: TLabel
505 | Align = Top
506 | AutoSize = True
507 | ControlType = Platform
508 | StyledSettings = [Family, FontColor]
509 | Margins.Left = 4.000000000000000000
510 | Margins.Right = 4.000000000000000000
511 | Position.X = 4.000000000000000000
512 | Size.Width = 920.000000000000000000
513 | Size.Height = 22.000000000000000000
514 | Size.PlatformDefault = False
515 | TextSettings.Font.Size = 16.000000000000000000
516 | TextSettings.Font.StyleExt = {00070000000000000004000000}
517 | Text = 'Engines'
518 | TabOrder = 0
519 | end
520 | object Label1: TLabel
521 | Align = Top
522 | StyledSettings = [Family, Size, FontColor]
523 | Margins.Left = 4.000000000000000000
524 | Margins.Top = 2.000000000000000000
525 | Position.X = 4.000000000000000000
526 | Position.Y = 24.000000000000000000
527 | Size.Width = 924.000000000000000000
528 | Size.Height = 17.000000000000000000
529 | Size.PlatformDefault = False
530 | TextSettings.Font.StyleExt = {00070000000000000004000000}
531 | Text = 'Parameteres'
532 | TabOrder = 2
533 | end
534 | object btSubmit: TButton
535 | Position.X = 728.000000000000000000
536 | Position.Y = 190.000000000000000000
537 | Size.Width = 80.000000000000000000
538 | Size.Height = 30.000000000000000000
539 | Size.PlatformDefault = False
540 | TabOrder = 5
541 | Text = 'Submit'
542 | OnClick = btSubmitClick
543 | end
544 | object TabControl1: TTabControl
545 | Align = Top
546 | Position.Y = 60.000000000000000000
547 | Size.Width = 928.000000000000000000
548 | Size.Height = 122.000000000000000000
549 | Size.PlatformDefault = False
550 | TabIndex = 0
551 | TabOrder = 6
552 | TabPosition = None
553 | Sizes = (
554 | 928s
555 | 122s
556 | 928s
557 | 122s
558 | 928s
559 | 122s
560 | 928s
561 | 122s)
562 | object TabItem1: TTabItem
563 | CustomIcon = <
564 | item
565 | end>
566 | IsSelected = True
567 | Size.Width = 8.000000000000000000
568 | Size.Height = 8.000000000000000000
569 | Size.PlatformDefault = False
570 | StyleLookup = ''
571 | TabOrder = 0
572 | Text = 'TabItem1'
573 | ExplicitSize.cx = 8.000000000000000000
574 | ExplicitSize.cy = 8.000000000000000000
575 | object rbTextAda001: TRadioButton
576 | Tag = 7
577 | StyledSettings = [Family, Size]
578 | GroupName = 'Engine'
579 | Position.X = 457.000000000000000000
580 | Position.Y = 32.000000000000000000
581 | Size.Width = 105.000000000000000000
582 | Size.Height = 19.000000000000000000
583 | Size.PlatformDefault = False
584 | TabOrder = 0
585 | Text = 'Ada (fastest)'
586 | TextSettings.Font.StyleExt = {00070000000000000004000000}
587 | TextSettings.FontColor = claFirebrick
588 | OnClick = rbTextDavinci002Click
589 | end
590 | object rbTextDavinci001: TRadioButton
591 | Tag = 2
592 | StyledSettings = [Family, Size]
593 | GroupName = 'Engine'
594 | Position.X = 185.000000000000000000
595 | Position.Y = 33.000000000000000000
596 | Size.Width = 96.000000000000000000
597 | Size.Height = 19.000000000000000000
598 | Size.PlatformDefault = False
599 | TabOrder = 4
600 | Text = 'Davinci'
601 | TextSettings.Font.StyleExt = {00070000000000000004000000}
602 | TextSettings.FontColor = claFirebrick
603 | OnClick = rbTextDavinci002Click
604 | end
605 | object rbTextCurie001: TRadioButton
606 | Tag = 5
607 | StyledSettings = [Family, Size]
608 | GroupName = 'Engine'
609 | Position.X = 273.000000000000000000
610 | Position.Y = 33.000000000000000000
611 | Size.Width = 72.000000000000000000
612 | Size.Height = 19.000000000000000000
613 | Size.PlatformDefault = False
614 | TabOrder = 2
615 | Text = 'Curie'
616 | TextSettings.Font.StyleExt = {00070000000000000004000000}
617 | TextSettings.FontColor = claFirebrick
618 | OnClick = rbTextDavinci002Click
619 | end
620 | object rbTextBabbage001: TRadioButton
621 | Tag = 6
622 | StyledSettings = [Family, Size]
623 | GroupName = 'Engine'
624 | Position.X = 353.000000000000000000
625 | Position.Y = 33.000000000000000000
626 | Size.Width = 104.000000000000000000
627 | Size.Height = 17.000000000000000000
628 | Size.PlatformDefault = False
629 | TabOrder = 1
630 | Text = 'Babbage'
631 | TextSettings.Font.StyleExt = {00070000000000000004000000}
632 | TextSettings.FontColor = claFirebrick
633 | OnClick = rbTextDavinci002Click
634 | end
635 | object rbTextDavinci002: TRadioButton
636 | Tag = 1
637 | StyledSettings = [Family, Size]
638 | GroupName = 'Engine'
639 | IsChecked = True
640 | Position.X = 17.000000000000000000
641 | Position.Y = 33.000000000000000000
642 | Size.Width = 153.000000000000000000
643 | Size.Height = 19.000000000000000000
644 | Size.PlatformDefault = False
645 | TabOrder = 3
646 | Text = 'Davinci (InstructGPT)'
647 | TextSettings.Font.StyleExt = {00070000000000000004000000}
648 | TextSettings.FontColor = claFirebrick
649 | OnClick = rbTextDavinci002Click
650 | end
651 | end
652 | object TabItem2: TTabItem
653 | CustomIcon = <
654 | item
655 | end>
656 | IsSelected = False
657 | Size.Width = 8.000000000000000000
658 | Size.Height = 8.000000000000000000
659 | Size.PlatformDefault = False
660 | StyleLookup = ''
661 | TabOrder = 0
662 | Text = 'TabItem2'
663 | ExplicitSize.cx = 8.000000000000000000
664 | ExplicitSize.cy = 8.000000000000000000
665 | object Edit1: TEdit
666 | Touch.InteractiveGestures = [LongTap, DoubleTap]
667 | TabOrder = 10
668 | Position.X = 464.000000000000000000
669 | Position.Y = 24.000000000000000000
670 | Size.Width = 174.000000000000000000
671 | Size.Height = 22.000000000000000000
672 | Size.PlatformDefault = False
673 | end
674 | object Label8: TLabel
675 | AutoSize = True
676 | Position.X = 464.000000000000000000
677 | Position.Y = 5.000000000000000000
678 | Size.Width = 173.000000000000000000
679 | Size.Height = 16.000000000000000000
680 | Size.PlatformDefault = False
681 | TextSettings.WordWrap = False
682 | Text = 'Stops (separate with semi-colon)'
683 | TabOrder = 4
684 | end
685 | object nbMaxTokens: TTrackBar
686 | CanParentFocus = True
687 | Frequency = 1.000000000000000000
688 | Max = 2048.000000000000000000
689 | Min = 1.000000000000000000
690 | Orientation = Horizontal
691 | Position.X = 8.000000000000000000
692 | Position.Y = 24.000000000000000000
693 | TabOrder = 17
694 | Value = 1024.000000000000000000
695 | ParentShowHint = False
696 | ShowHint = False
697 | OnChange = nbMaxTokensChange
698 | end
699 | object Label12: TLabel
700 | AutoSize = True
701 | StyledSettings = [Family, Style, FontColor]
702 | Position.X = 8.000000000000000000
703 | Position.Y = 40.000000000000000000
704 | Size.Width = 97.000000000000000000
705 | Size.Height = 15.000000000000000000
706 | Size.PlatformDefault = False
707 | TextSettings.Font.Size = 11.000000000000000000
708 | TextSettings.HorzAlign = Center
709 | Text = '1024'
710 | TabOrder = 9
711 | end
712 | object nbTemperature: TTrackBar
713 | CanParentFocus = True
714 | Frequency = 0.009999999776482582
715 | Max = 1.000000000000000000
716 | Orientation = Horizontal
717 | Position.X = 120.000000000000000000
718 | Position.Y = 24.000000000000000000
719 | TabOrder = 18
720 | Value = 0.699999988079071000
721 | OnChange = nbTemperatureChange
722 | end
723 | object Label13: TLabel
724 | AutoSize = True
725 | StyledSettings = [Family, Style, FontColor]
726 | Position.X = 120.000000000000000000
727 | Position.Y = 40.000000000000000000
728 | Size.Width = 105.000000000000000000
729 | Size.Height = 15.000000000000000000
730 | Size.PlatformDefault = False
731 | TextSettings.Font.Size = 11.000000000000000000
732 | TextSettings.HorzAlign = Center
733 | Text = '0.7'
734 | TabOrder = 5
735 | end
736 | object nbTopP: TTrackBar
737 | CanParentFocus = True
738 | Frequency = 0.009999999776482582
739 | Max = 1.000000000000000000
740 | Orientation = Horizontal
741 | Position.X = 240.000000000000000000
742 | Position.Y = 24.000000000000000000
743 | Size.Width = 100.000000000000000000
744 | Size.Height = 19.000000000000000000
745 | Size.PlatformDefault = False
746 | TabOrder = 16
747 | Value = 1.000000000000000000
748 | OnChange = nbTopPChange
749 | end
750 | object Label14: TLabel
751 | AutoSize = True
752 | StyledSettings = [Family, Style, FontColor]
753 | Position.X = 240.000000000000000000
754 | Position.Y = 40.000000000000000000
755 | Size.Width = 105.000000000000000000
756 | Size.Height = 15.000000000000000000
757 | Size.PlatformDefault = False
758 | TextSettings.Font.Size = 11.000000000000000000
759 | TextSettings.HorzAlign = Center
760 | Text = '1'
761 | TabOrder = 3
762 | end
763 | object Label4: TLabel
764 | AutoSize = True
765 | Position.X = 8.000000000000000000
766 | Position.Y = 8.000000000000000000
767 | Size.Width = 89.000000000000000000
768 | Size.Height = 16.000000000000000000
769 | Size.PlatformDefault = False
770 | Text = 'Completion len'
771 | TabOrder = 6
772 | end
773 | object Label5: TLabel
774 | AutoSize = True
775 | Position.X = 120.000000000000000000
776 | Position.Y = 8.000000000000000000
777 | Size.Width = 81.000000000000000000
778 | Size.Height = 16.000000000000000000
779 | Size.PlatformDefault = False
780 | Text = 'Temperature'
781 | TabOrder = 8
782 | end
783 | object Label6: TLabel
784 | AutoSize = True
785 | Position.X = 240.000000000000000000
786 | Position.Y = 8.000000000000000000
787 | Size.Width = 81.000000000000000000
788 | Size.Height = 16.000000000000000000
789 | Size.PlatformDefault = False
790 | Text = 'Top P'
791 | TabOrder = 7
792 | end
793 | object nbLogProb: TTrackBar
794 | CanParentFocus = True
795 | Frequency = 1.000000000000000000
796 | Max = 5.000000000000000000
797 | Orientation = Horizontal
798 | Position.X = 352.000000000000000000
799 | Position.Y = 24.000000000000000000
800 | Size.Width = 100.000000000000000000
801 | Size.Height = 19.000000000000000000
802 | Size.PlatformDefault = False
803 | TabOrder = 15
804 | OnChange = nbLogProbChange
805 | end
806 | object Label15: TLabel
807 | AutoSize = True
808 | StyledSettings = [Family, Style, FontColor]
809 | Position.X = 352.000000000000000000
810 | Position.Y = 40.000000000000000000
811 | Size.Width = 105.000000000000000000
812 | Size.Height = 15.000000000000000000
813 | Size.PlatformDefault = False
814 | TextSettings.Font.Size = 11.000000000000000000
815 | TextSettings.HorzAlign = Center
816 | Text = '0'
817 | TabOrder = 2
818 | end
819 | object Label7: TLabel
820 | AutoSize = True
821 | Position.X = 352.000000000000000000
822 | Position.Y = 8.000000000000000000
823 | Size.Width = 81.000000000000000000
824 | Size.Height = 16.000000000000000000
825 | Size.PlatformDefault = False
826 | Text = 'Log Prob'
827 | TabOrder = 1
828 | end
829 | object Memo1: TMemo
830 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
831 | DataDetectorTypes = []
832 | MaxLength = 400
833 | Align = Bottom
834 | Margins.Left = 4.000000000000000000
835 | Margins.Top = 4.000000000000000000
836 | Margins.Right = 4.000000000000000000
837 | Margins.Bottom = 4.000000000000000000
838 | Position.X = 4.000000000000000000
839 | Position.Y = 61.000000000000000000
840 | Size.Width = 920.000000000000000000
841 | Size.Height = 57.000000000000000000
842 | Size.PlatformDefault = False
843 | TabOrder = 0
844 | Viewport.Width = 916.000000000000000000
845 | Viewport.Height = 53.000000000000000000
846 | end
847 | object PanelChatGPT: TPanel
848 | Anchors = [akLeft, akTop, akRight]
849 | Position.X = 648.000000000000000000
850 | Position.Y = 8.000000000000000000
851 | Size.Width = 271.000000000000000000
852 | Size.Height = 49.000000000000000000
853 | Size.PlatformDefault = False
854 | TabOrder = 19
855 | object RadioButton6: TRadioButton
856 | IsChecked = True
857 | Position.X = 8.000000000000000000
858 | Position.Y = 16.000000000000000000
859 | Size.Width = 57.000000000000000000
860 | Size.Height = 19.000000000000000000
861 | Size.PlatformDefault = False
862 | TabOrder = 2
863 | Text = 'User'
864 | OnChange = RadioButton6Change
865 | end
866 | object RadioButton7: TRadioButton
867 | Tag = 1
868 | Position.X = 88.000000000000000000
869 | Position.Y = 16.000000000000000000
870 | Size.Width = 81.000000000000000000
871 | Size.Height = 19.000000000000000000
872 | Size.PlatformDefault = False
873 | TabOrder = 1
874 | Text = 'Assistant'
875 | OnChange = RadioButton6Change
876 | end
877 | object RadioButton8: TRadioButton
878 | Tag = 2
879 | Position.X = 192.000000000000000000
880 | Position.Y = 16.000000000000000000
881 | Size.Width = 73.000000000000000000
882 | Size.Height = 19.000000000000000000
883 | Size.PlatformDefault = False
884 | TabOrder = 0
885 | Text = 'System'
886 | OnChange = RadioButton6Change
887 | end
888 | end
889 | end
890 | object TabItem3: TTabItem
891 | CustomIcon = <
892 | item
893 | end>
894 | IsSelected = False
895 | Size.Width = 8.000000000000000000
896 | Size.Height = 8.000000000000000000
897 | Size.PlatformDefault = False
898 | StyleLookup = ''
899 | TabOrder = 0
900 | Text = 'TabItem3'
901 | ExplicitSize.cx = 8.000000000000000000
902 | ExplicitSize.cy = 8.000000000000000000
903 | object Memo3: TMemo
904 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
905 | DataDetectorTypes = []
906 | MaxLength = 400
907 | Align = Bottom
908 | Margins.Left = 4.000000000000000000
909 | Margins.Top = 4.000000000000000000
910 | Margins.Right = 4.000000000000000000
911 | Margins.Bottom = 4.000000000000000000
912 | Position.X = 4.000000000000000000
913 | Position.Y = 62.000000000000000000
914 | Size.Width = 920.000000000000000000
915 | Size.Height = 56.000000000000000000
916 | Size.PlatformDefault = False
917 | TabOrder = 1
918 | Viewport.Width = 916.000000000000000000
919 | Viewport.Height = 52.000000000000000000
920 | end
921 | object Label16: TLabel
922 | AutoSize = True
923 | Position.X = 5.000000000000000000
924 | Position.Y = 20.000000000000000000
925 | Size.Width = 89.000000000000000000
926 | Size.Height = 16.000000000000000000
927 | Size.PlatformDefault = False
928 | Text = 'Image size'
929 | TabOrder = 8
930 | end
931 | object cbImageSize: TComboBox
932 | Items.Strings = (
933 | '256 x 256'
934 | '512 x 512'
935 | '1024 x 1024')
936 | ItemIndex = 1
937 | Position.X = 5.000000000000000000
938 | Position.Y = 39.000000000000000000
939 | TabOrder = 9
940 | end
941 | object Label17: TLabel
942 | AutoSize = True
943 | Position.X = 117.000000000000000000
944 | Position.Y = 23.000000000000000000
945 | Size.Width = 121.000000000000000000
946 | Size.Height = 16.000000000000000000
947 | Size.PlatformDefault = False
948 | Text = 'Images to generate: 1'
949 | TabOrder = 7
950 | end
951 | object tbNumberOfImages: TTrackBar
952 | CanParentFocus = True
953 | Frequency = 1.000000000000000000
954 | Max = 10.000000000000000000
955 | Min = 1.000000000000000000
956 | Orientation = Horizontal
957 | Position.X = 117.000000000000000000
958 | Position.Y = 41.000000000000000000
959 | TabOrder = 18
960 | Value = 1.000000000000000000
961 | ParentShowHint = False
962 | ShowHint = False
963 | OnChange = tbNumberOfImagesChange
964 | end
965 | object Label18: TLabel
966 | Align = Top
967 | AutoSize = True
968 | ControlType = Platform
969 | StyledSettings = [Family, FontColor]
970 | Margins.Left = 4.000000000000000000
971 | Margins.Right = 4.000000000000000000
972 | Position.X = 4.000000000000000000
973 | Size.Width = 920.000000000000000000
974 | Size.Height = 22.000000000000000000
975 | Size.PlatformDefault = False
976 | TextSettings.Font.Size = 16.000000000000000000
977 | TextSettings.Font.StyleExt = {00070000000000000004000000}
978 | Text = 'DALL-E'
979 | TabOrder = 0
980 | end
981 | end
982 | object TabItem4: TTabItem
983 | ClipParent = True
984 | CustomIcon = <
985 | item
986 | end>
987 | IsSelected = False
988 | Size.Width = 8.000000000000000000
989 | Size.Height = 8.000000000000000000
990 | Size.PlatformDefault = False
991 | StyleLookup = ''
992 | TabOrder = 0
993 | Text = 'TabItem4'
994 | ExplicitSize.cx = 8.000000000000000000
995 | ExplicitSize.cy = 8.000000000000000000
996 | object Label9: TLabel
997 | Anchors = [akLeft, akTop, akRight]
998 | Position.X = 347.000000000000000000
999 | Position.Y = 8.000000000000000000
1000 | Size.Width = 646.000000000000000000
1001 | Size.Height = 17.000000000000000000
1002 | Size.PlatformDefault = False
1003 | Text = 'File'
1004 | TabOrder = 2
1005 | end
1006 | object btOpenFile: TButton
1007 | Position.X = 344.000000000000000000
1008 | Position.Y = 31.000000000000000000
1009 | Size.Width = 80.000000000000000000
1010 | Size.Height = 26.000000000000000000
1011 | Size.PlatformDefault = False
1012 | TabOrder = 7
1013 | Text = 'Choose file'
1014 | OnClick = btOpenFileClick
1015 | end
1016 | object RadioButton1: TRadioButton
1017 | Position.X = 8.000000000000000000
1018 | Position.Y = 34.000000000000000000
1019 | Size.Width = 81.000000000000000000
1020 | Size.Height = 19.000000000000000000
1021 | Size.PlatformDefault = False
1022 | TabOrder = 11
1023 | Text = 'Answer'
1024 | OnClick = RadioButton1Click
1025 | end
1026 | object RadioButton2: TRadioButton
1027 | Position.X = 88.000000000000000000
1028 | Position.Y = 34.000000000000000000
1029 | Size.Width = 81.000000000000000000
1030 | Size.Height = 19.000000000000000000
1031 | Size.PlatformDefault = False
1032 | TabOrder = 10
1033 | Text = 'Search'
1034 | OnChange = RadioButton2Change
1035 | end
1036 | object RadioButton3: TRadioButton
1037 | Position.X = 160.000000000000000000
1038 | Position.Y = 34.000000000000000000
1039 | Size.Width = 105.000000000000000000
1040 | Size.Height = 19.000000000000000000
1041 | Size.PlatformDefault = False
1042 | TabOrder = 9
1043 | Text = 'Classification'
1044 | OnChange = RadioButton3Change
1045 | end
1046 | object Label10: TLabel
1047 | Position.X = 8.000000000000000000
1048 | Position.Y = 8.000000000000000000
1049 | Size.Width = 81.000000000000000000
1050 | Size.Height = 17.000000000000000000
1051 | Size.PlatformDefault = False
1052 | Text = 'Purpose'
1053 | TabOrder = 0
1054 | end
1055 | object Label11: TLabel
1056 | Position.X = 429.000000000000000000
1057 | Position.Y = 36.000000000000000000
1058 | Size.Width = 234.000000000000000000
1059 | Size.Height = 17.000000000000000000
1060 | Size.PlatformDefault = False
1061 | Text = 'Ref.: https://jsonlines.org/examples/'
1062 | TabOrder = 1
1063 | end
1064 | object RadioButton4: TRadioButton
1065 | Position.X = 264.000000000000000000
1066 | Position.Y = 34.000000000000000000
1067 | Size.Width = 81.000000000000000000
1068 | Size.Height = 19.000000000000000000
1069 | Size.PlatformDefault = False
1070 | TabOrder = 8
1071 | Text = 'Fine-tune'
1072 | OnChange = RadioButton4Change
1073 | end
1074 | end
1075 | end
1076 | object Label3: TLabel
1077 | Align = Top
1078 | StyledSettings = [Family, Size, FontColor]
1079 | Margins.Left = 4.000000000000000000
1080 | Margins.Top = 2.000000000000000000
1081 | Position.X = 4.000000000000000000
1082 | Position.Y = 43.000000000000000000
1083 | Size.Width = 924.000000000000000000
1084 | Size.Height = 17.000000000000000000
1085 | Size.PlatformDefault = False
1086 | TextSettings.Font.StyleExt = {00070000000000000004000000}
1087 | Text = 'Prompt (max len 400 characters)'
1088 | TabOrder = 1
1089 | end
1090 | object btClear: TButton
1091 | Anchors = [akTop, akRight]
1092 | Position.X = 840.000000000000000000
1093 | Position.Y = 190.000000000000000000
1094 | Size.Width = 80.000000000000000000
1095 | Size.Height = 30.000000000000000000
1096 | Size.PlatformDefault = False
1097 | TabOrder = 3
1098 | Text = 'Clear'
1099 | OnClick = btClearClick
1100 | end
1101 | object AniIndicator1: TAniIndicator
1102 | Align = Center
1103 | Size.Width = 36.000000000000000000
1104 | Size.Height = 36.000000000000000000
1105 | Size.PlatformDefault = False
1106 | Style = Circular
1107 | end
1108 | object BtAddMessage: TButton
1109 | Position.X = 8.000000000000000000
1110 | Position.Y = 189.000000000000000000
1111 | Size.Width = 105.000000000000000000
1112 | Size.Height = 30.000000000000000000
1113 | Size.PlatformDefault = False
1114 | TabOrder = 4
1115 | Text = 'Add Message'
1116 | OnClick = BtAddMessageClick
1117 | end
1118 | end
1119 | object OpenDialog1: TOpenDialog
1120 | Filter =
1121 | 'JSON Lines file|*.jsonl|Compressed JSON Lines|*.jsonl.gz;*.jsonl' +
1122 | '.bz2'
1123 | Left = 128
1124 | Top = 320
1125 | end
1126 | object ToolBar2: TToolBar
1127 | Align = Bottom
1128 | Position.Y = 598.000000000000000000
1129 | Size.Width = 928.000000000000000000
1130 | Size.Height = 40.000000000000000000
1131 | Size.PlatformDefault = False
1132 | TabOrder = 30
1133 | object lbEngine: TLabel
1134 | Align = Client
1135 | Margins.Left = 8.000000000000000000
1136 | Margins.Top = 4.000000000000000000
1137 | Margins.Right = 8.000000000000000000
1138 | Margins.Bottom = 4.000000000000000000
1139 | Size.Width = 912.000000000000000000
1140 | Size.Height = 32.000000000000000000
1141 | Size.PlatformDefault = False
1142 | TabOrder = 0
1143 | end
1144 | end
1145 | object Panel2: TPanel
1146 | Align = Client
1147 | Size.Width = 928.000000000000000000
1148 | Size.Height = 331.000000000000000000
1149 | Size.PlatformDefault = False
1150 | TabOrder = 39
1151 | object Memo2: TMemo
1152 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
1153 | DataDetectorTypes = []
1154 | TextSettings.WordWrap = True
1155 | Align = Client
1156 | Size.Width = 550.000000000000000000
1157 | Size.Height = 331.000000000000000000
1158 | Size.PlatformDefault = False
1159 | TabOrder = 14
1160 | Viewport.Width = 546.000000000000000000
1161 | Viewport.Height = 327.000000000000000000
1162 | end
1163 | object Panel3: TPanel
1164 | Align = Right
1165 | Position.X = 559.000000000000000000
1166 | Size.Width = 369.000000000000000000
1167 | Size.Height = 331.000000000000000000
1168 | Size.PlatformDefault = False
1169 | TabOrder = 15
1170 | object ImageDallE: TImage
1171 | MultiResBitmap = <
1172 | item
1173 | end>
1174 | Align = Client
1175 | Size.Width = 369.000000000000000000
1176 | Size.Height = 296.000000000000000000
1177 | Size.PlatformDefault = False
1178 | end
1179 | object Panel4: TPanel
1180 | Align = Bottom
1181 | Position.Y = 296.000000000000000000
1182 | Size.Width = 369.000000000000000000
1183 | Size.Height = 35.000000000000000000
1184 | Size.PlatformDefault = False
1185 | TabOrder = 1
1186 | object sbPrevImage: TSpeedButton
1187 | Align = Left
1188 | Size.Width = 80.000000000000000000
1189 | Size.Height = 35.000000000000000000
1190 | Size.PlatformDefault = False
1191 | StyleLookup = 'priortoolbutton'
1192 | OnClick = sbPrevImageClick
1193 | end
1194 | object sbNextImage: TSpeedButton
1195 | Align = Left
1196 | Position.X = 80.000000000000000000
1197 | Size.Width = 80.000000000000000000
1198 | Size.Height = 35.000000000000000000
1199 | Size.PlatformDefault = False
1200 | StyleLookup = 'nexttoolbutton'
1201 | OnClick = sbNextImageClick
1202 | end
1203 | end
1204 | end
1205 | object Splitter1: TSplitter
1206 | Align = Right
1207 | Cursor = crHSplit
1208 | MinSize = 20.000000000000000000
1209 | Position.X = 550.000000000000000000
1210 | Size.Width = 9.000000000000000000
1211 | Size.Height = 331.000000000000000000
1212 | Size.PlatformDefault = False
1213 | end
1214 | end
1215 | object FDMemTable1: TFDMemTable
1216 | FetchOptions.AssignedValues = [evMode]
1217 | FetchOptions.Mode = fmAll
1218 | ResourceOptions.AssignedValues = [rvSilentMode]
1219 | ResourceOptions.SilentMode = True
1220 | UpdateOptions.AssignedValues = [uvCheckRequired, uvAutoCommitUpdates]
1221 | UpdateOptions.CheckRequired = False
1222 | UpdateOptions.AutoCommitUpdates = True
1223 | Left = 120
1224 | Top = 400
1225 | end
1226 | object DataSource1: TDataSource
1227 | DataSet = FDMemTable1
1228 | Left = 120
1229 | Top = 344
1230 | end
1231 | object BindingsList1: TBindingsList
1232 | Methods = <>
1233 | OutputConverters = <>
1234 | Left = 24
1235 | Top = 304
1236 | end
1237 | object RESTRequest1: TRESTRequest
1238 | Client = RESTClient1
1239 | Params = <>
1240 | Response = RESTResponse1
1241 | Left = 32
1242 | Top = 344
1243 | end
1244 | object RESTResponse1: TRESTResponse
1245 | Left = 32
1246 | Top = 400
1247 | end
1248 | object RESTClient1: TRESTClient
1249 | Params = <>
1250 | Left = 32
1251 | Top = 464
1252 | end
1253 | object NetHTTPClient1: TNetHTTPClient
1254 | UserAgent = 'Embarcadero URI Client/1.0'
1255 | OnRequestCompleted = NetHTTPClient1RequestCompleted
1256 | OnReceiveData = NetHTTPClient1ReceiveData
1257 | Left = 120
1258 | Top = 464
1259 | end
1260 | end
1261 |
--------------------------------------------------------------------------------
/Demo/uDemoOpenAI.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2021-2023 Magno Lima - www.MagnumLabs.com.br
3 |
4 | THIS IS A TEST FILE TO USE WITH OPENAI GPT-3 API
5 | ** YOU WILL NEED YOUR OWN KEY TO BE ABLE TO USE THIS SOFTWARE **
6 |
7 | Delphi libraries for using OpenAI's GPT-3 api
8 |
9 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
10 | which means that this a public dedication tool, which allows creators to
11 | give up their copyright and put their works into the worldwide public domain.
12 | You're allowed to distribute, remix, adapt, and build upon the material
13 | in any medium or format, with no conditions.
14 |
15 | Feel free to open a push request if there's anything you want
16 | to contribute.
17 |
18 | https://platform.openai.com/docs/introduction/overview
19 |
20 | *)
21 | unit uDemoOpenAI;
22 |
23 | interface
24 |
25 | uses
26 | System.SysUtils, System.Types, System.UITypes, System.Classes,
27 | System.Variants, System.StrUtils,
28 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.IOUtils,
29 | FMX.StdCtrls, FMX.Controls.Presentation, FireDAC.Stan.Intf,
30 | FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
31 | FireDAC.Phys.Intf, FireDAC.DApt.Intf, System.Rtti, FMX.Grid.Style,
32 | Data.Bind.EngExt, FMX.Bind.DBEngExt, FMX.Bind.Grid, System.Bindings.Outputs,
33 | FMX.Bind.Editors, Data.Bind.Components, Data.Bind.Grid, Data.Bind.DBScope,
34 | Data.DB, FMX.Grid, FireDAC.Comp.DataSet, FireDAC.Comp.Client, FMX.ScrollBox,
35 | FMX.Memo, FMX.Edit, Data.Bind.ObjectScope, REST.Client, REST.Response.Adapter,
36 | FMX.Objects, FMX.TabControl, FMX.EditBox, FMX.NumberBox, FMX.Memo.Types,
37 | REST.Types, System.Generics.Collections, FMX.ListBox, Skia, Skia.FMX,
38 | System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent,
39 | MLOpenAI.Types, MLOpenAI.Completions, MLOpenAI.Core, MLOpenAI.Images,
40 | MLOpenAI.Files, MLOpenAI.ChatGPT;
41 |
42 | const
43 | APIKey_Filename = '.\openai.key';
44 | OpenAI_PATH = 'https://api.openai.com/v1';
45 |
46 | type
47 | TfrmDemoOpenAI = class(TForm)
48 | ToolBar1: TToolBar;
49 | SpeedButton1: TSpeedButton;
50 | FDMemTable1: TFDMemTable;
51 | DataSource1: TDataSource;
52 | BindingsList1: TBindingsList;
53 | Image1: TImage;
54 | SpeedButton2: TSpeedButton;
55 | Label1: TLabel;
56 | SpeedButton3: TSpeedButton;
57 | btSubmit: TButton;
58 | Label2: TLabel;
59 | Panel1: TPanel;
60 | AniIndicator1: TAniIndicator;
61 | TabControl1: TTabControl;
62 | TabItem1: TTabItem;
63 | TabItem2: TTabItem;
64 | TabItem3: TTabItem;
65 | Label3: TLabel;
66 | TabItem4: TTabItem;
67 | Label7: TLabel;
68 | rbTextAda001: TRadioButton;
69 | Edit1: TEdit;
70 | Label8: TLabel;
71 | rbTextDavinci001: TRadioButton;
72 | rbTextCurie001: TRadioButton;
73 | rbTextBabbage001: TRadioButton;
74 | RESTClient1: TRESTClient;
75 | RESTRequest1: TRESTRequest;
76 | RESTResponse1: TRESTResponse;
77 | btClear: TButton;
78 | SpeedButton4: TSpeedButton;
79 | Label9: TLabel;
80 | btOpenFile: TButton;
81 | OpenDialog1: TOpenDialog;
82 | RadioButton1: TRadioButton;
83 | RadioButton2: TRadioButton;
84 | RadioButton3: TRadioButton;
85 | Label10: TLabel;
86 | Label11: TLabel;
87 | RadioButton4: TRadioButton;
88 | ToolBar2: TToolBar;
89 | lbEngine: TLabel;
90 | rbTextDavinci002: TRadioButton;
91 | nbMaxTokens: TTrackBar;
92 | Label12: TLabel;
93 | nbTemperature: TTrackBar;
94 | Label13: TLabel;
95 | nbTopP: TTrackBar;
96 | Label14: TLabel;
97 | Label4: TLabel;
98 | Label5: TLabel;
99 | Label6: TLabel;
100 | nbLogProb: TTrackBar;
101 | Label15: TLabel;
102 | Memo1: TMemo;
103 | Memo3: TMemo;
104 | Label16: TLabel;
105 | cbImageSize: TComboBox;
106 | Label17: TLabel;
107 | tbNumberOfImages: TTrackBar;
108 | NetHTTPClient1: TNetHTTPClient;
109 | Label18: TLabel;
110 | Panel2: TPanel;
111 | Memo2: TMemo;
112 | ImageDallE: TImage;
113 | Panel3: TPanel;
114 | Panel4: TPanel;
115 | sbNextImage: TSpeedButton;
116 | sbPrevImage: TSpeedButton;
117 | Splitter1: TSplitter;
118 | SpeedButton5: TSpeedButton;
119 | PanelChatGPT: TPanel;
120 | RadioButton6: TRadioButton;
121 | RadioButton7: TRadioButton;
122 | RadioButton8: TRadioButton;
123 | BtAddMessage: TButton;
124 | procedure FormCreate(Sender: TObject);
125 | procedure FormDestroy(Sender: TObject);
126 | procedure SpeedButton1Click(Sender: TObject);
127 | procedure SpeedButton2Click(Sender: TObject);
128 | procedure btSubmitClick(Sender: TObject);
129 | procedure SpeedButton3Click(Sender: TObject);
130 | procedure FormShow(Sender: TObject);
131 | procedure btClearClick(Sender: TObject);
132 | procedure SpeedButton4Click(Sender: TObject);
133 | procedure RadioButton1Click(Sender: TObject);
134 | procedure RadioButton2Change(Sender: TObject);
135 | procedure RadioButton3Change(Sender: TObject);
136 | procedure btOpenFileClick(Sender: TObject);
137 | procedure RadioButton4Change(Sender: TObject);
138 | procedure nbMaxTokensChange(Sender: TObject);
139 | procedure nbTemperatureChange(Sender: TObject);
140 | procedure nbTopPChange(Sender: TObject);
141 | procedure nbLogProbChange(Sender: TObject);
142 | procedure NetHTTPClient1ReceiveData(const Sender: TObject; AContentLength, AReadCount: Int64; var AAbort: Boolean);
143 | procedure NetHTTPClient1RequestCompleted(const Sender: TObject; const AResponse: IHTTPResponse);
144 | procedure sbPrevImageClick(Sender: TObject);
145 | procedure sbNextImageClick(Sender: TObject);
146 | procedure tbNumberOfImagesChange(Sender: TObject);
147 | procedure SpeedButton5Click(Sender: TObject);
148 | procedure BtAddMessageClick(Sender: TObject);
149 | procedure RadioButton6Change(Sender: TObject);
150 | procedure rbTextDavinci002Click(Sender: TObject);
151 | private
152 | FEngine: TOAIEngine;
153 | FOpenAI: TOpenAI;
154 | procedure InitCompletions;
155 | procedure InitFile;
156 | procedure OnOpenAIError(Sender: TObject);
157 | procedure Submit;
158 | procedure InitImages;
159 | procedure LoadImage(const filename: string);
160 | procedure DownloadImage(const uri: string);
161 | procedure InitChatGPT;
162 | { Private declarations }
163 | public
164 | { Public declarations }
165 | procedure OnOpenAIResponse(Sender: TObject);
166 | end;
167 |
168 | var
169 | frmDemoOpenAI: TfrmDemoOpenAI;
170 | OpenAIKey: String;
171 | MessageRole: TMessageRole;
172 | EngineIndex: Integer;
173 | NameOfEngines: TArray;
174 | FilePurpose: TFilePurpose;
175 | FileStream: TFileStream;
176 | FContentLength: Boolean;
177 | FImageFileName: String;
178 | FRootDir: String;
179 | FImageIndex: Integer;
180 | ListOfImages: TArray;
181 |
182 | implementation
183 |
184 | uses
185 | System.JSON;
186 |
187 | {$R *.fmx}
188 |
189 | function SliceString(const AString: string; const ADelimiter: string): TArray;
190 | var
191 | I: Integer;
192 | PLine, PStart: PChar;
193 | s: String;
194 | begin
195 |
196 | I := 1;
197 | PLine := PChar(AString);
198 |
199 | PStart := PLine;
200 | inc(PLine);
201 |
202 | while (I < length(AString)) do
203 | begin
204 | while (PLine^ <> #0) and (PLine^ <> ADelimiter) do
205 | begin
206 | inc(PLine);
207 | inc(I);
208 | end;
209 |
210 | SetString(s, PStart, PLine - PStart);
211 | SetLength(Result, length(Result) + 1);
212 | Result[length(Result) - 1] := s;
213 | inc(PLine);
214 | inc(I);
215 | PStart := PLine;
216 | end;
217 |
218 | end;
219 |
220 | function GetStops(Text: String): TArray;
221 | begin
222 | Result := SliceString(Text, ';');
223 | end;
224 |
225 | procedure TfrmDemoOpenAI.OnOpenAIError(Sender: TObject);
226 | begin
227 | if (FOpenAI.StatusCode = 400) and (FOpenAI.RequestType = TOAIRequests.orImages) then
228 | begin
229 | Memo2.Lines.Add('Bad request. Your prompt contains non acceptable worlds, please your prompt.');
230 | exit;
231 | end;
232 |
233 | Memo2.Lines.Add('Error ' + FOpenAI.StatusCode.ToString + ' - ' + FOpenAI.ErrorMessage);
234 | end;
235 |
236 | procedure TfrmDemoOpenAI.FormCreate(Sender: TObject);
237 | begin
238 | ReportMemoryLeaksOnShutdown := true;
239 | TabControl1.ActiveTab := TabItem1;
240 | NameOfEngines := TOAIEngineName;
241 |
242 | // Store your key safely. Never share or expose it!
243 | FOpenAI := TOpenAI.Create(FDMemTable1, APIKey_Filename);
244 |
245 | FOpenAI.Endpoint := OpenAI_PATH;
246 | FOpenAI.Engine := TOAIEngine.egTextDavinci003;
247 | FOpenAI.OnResponse := OnOpenAIResponse;
248 | FOpenAI.OnError := OnOpenAIError;
249 | EngineIndex := Ord(FOpenAI.Engine);
250 | FEngine := FOpenAI.Engine;
251 | FRootDir := ExtractFilePath(ParamStr(0));
252 | TDirectory.CreateDirectory(FRootDir + 'images');
253 |
254 | end;
255 |
256 | procedure TfrmDemoOpenAI.FormDestroy(Sender: TObject);
257 | begin
258 | FOpenAI.Free;
259 | end;
260 |
261 | procedure TfrmDemoOpenAI.btClearClick(Sender: TObject);
262 | begin
263 | Memo2.Lines.Clear;
264 | end;
265 |
266 | procedure TfrmDemoOpenAI.btOpenFileClick(Sender: TObject);
267 | var
268 | AFileDescription: TFileDescription;
269 | begin
270 | if OpenDialog1.Execute then
271 | begin
272 | Label9.Text := OpenDialog1.filename;
273 | AFileDescription.filename := OpenDialog1.filename;
274 | AFileDescription.Purpose := FilePurpose;
275 | FOpenAI.FileDescription := AFileDescription;
276 | FOpenAI.Upload;
277 | end;
278 | end;
279 |
280 | procedure TfrmDemoOpenAI.BtAddMessageClick(Sender: TObject);
281 | var
282 | lRole: TMessageRole;
283 | I: Integer;
284 | begin
285 | if (FOpenAI.RequestType = orImages) and (Memo3.Text.IsEmpty) then
286 | exit;
287 |
288 | Memo2.Lines.Clear;
289 | FOpenAI.Chat.AddMessage(Memo1.Lines.Text, MessageRole);
290 | for I := 0 to FOpenAI.Chat.Messages.Count - 1 do
291 | Memo2.Lines.Add('role: "' + FOpenAI.Chat.Messages.KeyNames[I] + '", content: "' + FOpenAI.Chat.Messages.Values
292 | [FOpenAI.Chat.Messages.KeyNames[I]] + '"');
293 | Memo1.Lines.Clear;
294 | end;
295 |
296 | procedure TfrmDemoOpenAI.FormShow(Sender: TObject);
297 | begin
298 | FOpenAI.RequestType := orEngines;
299 | lbEngine.Text := 'Engine: ' + NameOfEngines[Ord(EngineIndex)];
300 | end;
301 |
302 | function IfThen(const Test: Boolean; IsTrue, IsFalse: String): String;
303 | begin
304 | if Test then
305 | Result := IsTrue
306 | else
307 | Result := IsFalse;
308 | end;
309 |
310 | procedure TfrmDemoOpenAI.OnOpenAIResponse(Sender: TObject);
311 | var
312 | field: TField;
313 | Engine: TPair;
314 | Text, SanitizedResponse: String;
315 | responses: TArray;
316 | begin
317 |
318 | btSubmit.Enabled := true;
319 | AniIndicator1.Enabled := False;
320 |
321 | if FOpenAI.RequestType = TOAIRequests.orChat then
322 | begin
323 | responses := FOpenAI.GetChatResult;
324 | FDMemTable1.Open;
325 | while not FDMemTable1.Eof do
326 | begin
327 | Memo2.Lines.Add('tem coisa');
328 | FDMemTable1.Next;
329 | end;
330 |
331 | for Text in responses do
332 | Memo2.Lines.Add('> ' + Text + #13);
333 | Memo2.Lines.Add('');
334 | exit;
335 | end;
336 |
337 | // We can get the response directly using GetChoicesResult property as text
338 | // or, we can read from the memtable
339 | //
340 | if FOpenAI.RequestType = TOAIRequests.orCompletions then
341 | begin
342 | Memo2.Lines.Add(Trim(FOpenAI.GetChoicesResult));
343 | Memo2.Lines.Add(StringOfChar('-', 40));
344 |
345 | // Let's sanitize this result for better readability
346 | SanitizedResponse := TOpenAI.Sanitize(GetStops(Edit1.Text), FOpenAI.GetChoicesResult);
347 | // FOpenAI.SaveToFile('.\response.txt');
348 | Memo2.Lines.Add(SanitizedResponse);
349 | Memo2.Lines.Add(StringOfChar('-', 40));
350 | end;
351 |
352 | if FOpenAI.RequestType = TOAIRequests.orImages then
353 | begin
354 |
355 | if FOpenAI.Images.ResponseFormat = TResponseFormat.rfUrl then
356 | Memo2.Lines.Clear;
357 |
358 | for field in FDMemTable1.Fields do
359 | begin
360 | if FOpenAI.Images.ResponseFormat = TResponseFormat.rfUrl then
361 | begin
362 | if field.AsString.Contains('url') then
363 | begin
364 | Text := field.AsString;
365 | Text := Copy(Text, Pos('"url":"', Text) + 7);
366 | Memo2.Lines.Add('Downloading image, wait');
367 | DownloadImage(Text);
368 | end;
369 | end
370 | end;
371 |
372 | if FOpenAI.Images.ResponseFormat = TResponseFormat.rfB64Json then
373 | ListOfImages := FOpenAI.Images.DecodeJsonToFile(FRootDir + 'images\');
374 |
375 | if length(ListOfImages) > 0 then
376 | begin
377 | FImageIndex := 0;
378 | LoadImage(ListOfImages[FImageIndex]);
379 | end;
380 | exit;
381 | end;
382 |
383 | if FOpenAI.RequestType = TOAIRequests.orEngines then
384 | begin
385 | for Engine in FOpenAI.AvailableEngines do
386 | Memo2.Lines.Add(Engine.Key + ' = ' + Trim(Engine.value))
387 | end
388 | else
389 | begin
390 | Memo2.Lines.Add('Record count = ' + FDMemTable1.RecordCount.ToString);
391 | while not FDMemTable1.Eof do
392 | begin
393 | Memo2.Lines.Add('{');
394 | for field in FDMemTable1.Fields do
395 | Memo2.Lines.Add(field.FieldName + ': "' + Trim(field.AsString) + '"' + IfThen(field.Index = FDMemTable1.Fields.Count - 1,
396 | '', ','));
397 | Memo2.Lines.Add('}');
398 | FDMemTable1.Next;
399 | end;
400 | end;
401 |
402 | end;
403 |
404 | procedure TfrmDemoOpenAI.RadioButton1Click(Sender: TObject);
405 | begin
406 | FilePurpose := TFilePurpose.fpAnswer;
407 | end;
408 |
409 | procedure TfrmDemoOpenAI.RadioButton2Change(Sender: TObject);
410 | begin
411 | FilePurpose := TFilePurpose.fpSearch;
412 | end;
413 |
414 | procedure TfrmDemoOpenAI.RadioButton3Change(Sender: TObject);
415 | begin
416 | FilePurpose := TFilePurpose.fpClassification;
417 | end;
418 |
419 | procedure TfrmDemoOpenAI.RadioButton4Change(Sender: TObject);
420 | begin
421 | FilePurpose := TFilePurpose.fpFineTune;
422 | end;
423 |
424 | procedure TfrmDemoOpenAI.RadioButton6Change(Sender: TObject);
425 | begin
426 | case (Sender as TRadioButton).Tag of
427 | 0:
428 | MessageRole := TMessageRole.mrUser;
429 | 1:
430 | MessageRole := TMessageRole.mrAssistant;
431 | 2:
432 | MessageRole := TMessageRole.mrSystem;
433 | end;
434 | end;
435 |
436 | procedure TfrmDemoOpenAI.rbTextDavinci002Click(Sender: TObject);
437 | begin
438 | EngineIndex := (Sender as TRadioButton).Tag;
439 |
440 | FOpenAI.Engine := TOAIEngine(Ord(EngineIndex));
441 |
442 | lbEngine.Text := 'Engine: ' + NameOfEngines[Ord(EngineIndex)];
443 | end;
444 |
445 | procedure TfrmDemoOpenAI.SpeedButton1Click(Sender: TObject);
446 | begin
447 | Label2.Text := 'Engines';
448 | FOpenAI.RequestType := orEngines;
449 | TabControl1.TabIndex := 0;
450 | end;
451 |
452 | // Ref: https://platform.openai.com/docs/api-reference/completions
453 | procedure TfrmDemoOpenAI.SpeedButton2Click(Sender: TObject);
454 | begin
455 | Label2.Text := 'Completions';
456 | PanelChatGPT.Visible := False;
457 | BtAddMessage.Visible := False;
458 | FOpenAI.RequestType := orCompletions;
459 | TabControl1.TabIndex := 1;
460 | end;
461 |
462 | procedure TfrmDemoOpenAI.SpeedButton3Click(Sender: TObject);
463 | begin
464 | Label2.Text := 'Images';
465 | TabControl1.TabIndex := 2;
466 | FOpenAI.RequestType := orImages;
467 | lbEngine.Text := 'Engine: DALL-E';
468 | end;
469 |
470 | procedure TfrmDemoOpenAI.SpeedButton4Click(Sender: TObject);
471 | begin
472 | Label2.Text := 'Files';
473 | TabControl1.TabIndex := 3;
474 | FOpenAI.RequestType := orFiles;
475 | end;
476 |
477 | procedure TfrmDemoOpenAI.SpeedButton5Click(Sender: TObject);
478 | begin
479 | Label2.Text := 'ChatGPT';
480 | lbEngine.Text := 'Engine: gpt-3.5-turbo';
481 | PanelChatGPT.Visible := true;
482 | BtAddMessage.Visible := True;
483 | FOpenAI.RequestType := orChat;
484 | MessageRole := TMessageRole.mrUser;
485 | TabControl1.TabIndex := 1;
486 | end;
487 |
488 | procedure TfrmDemoOpenAI.sbNextImageClick(Sender: TObject);
489 | begin
490 | if FImageIndex = length(ListOfImages) - 1 then
491 | exit;
492 | inc(FImageIndex);
493 | LoadImage(ListOfImages[FImageIndex]);
494 | end;
495 |
496 | procedure TfrmDemoOpenAI.sbPrevImageClick(Sender: TObject);
497 | begin
498 | if FImageIndex = 0 then
499 | exit;
500 | Dec(FImageIndex);
501 | LoadImage(ListOfImages[FImageIndex]);
502 | end;
503 |
504 | procedure TfrmDemoOpenAI.InitImages;
505 | var
506 | sPrompt: String;
507 | begin
508 |
509 | sPrompt := Memo3.Text.Trim;
510 |
511 | FOpenAI.Images.ResponseFormat := TResponseFormat.rfB64Json;
512 | FOpenAI.RequestType := orImages;
513 | FOpenAI.Endpoint := OpenAI_PATH;
514 | FOpenAI.Images.Prompt := sPrompt;
515 | FOpenAI.Images.User := 'OpenAIDemo';
516 | FOpenAI.Images.NumberOfImages := Round(tbNumberOfImages.value);
517 | case cbImageSize.ItemIndex of
518 | 0:
519 | FOpenAI.Images.Size := TImageSize.is256x256;
520 | 1:
521 | FOpenAI.Images.Size := TImageSize.is512x512;
522 | 2:
523 | FOpenAI.Images.Size := TImageSize.is1024x1024;
524 | end;
525 | end;
526 |
527 | procedure TfrmDemoOpenAI.InitChatGPT;
528 | begin
529 |
530 | if FOpenAI.Chat.Messages.Count = 0 then
531 | begin
532 | ShowMessage('A prompt text must be supplied');
533 | exit;
534 | end;
535 | FOpenAI.Engine := TOAIEngine.egGPT3_5Turbo;
536 | FOpenAI.RequestType := orChat;
537 | FOpenAI.Endpoint := OAI_ENDPOINT;
538 | FOpenAI.Chat.MaxTokens := 1024;
539 | FOpenAI.Chat.TopP := 1;
540 | FOpenAI.Chat.Temperature := 0.7;
541 | FOpenAI.Chat.Model := cmGPT3_5Turbo;
542 | end;
543 |
544 | procedure TfrmDemoOpenAI.InitCompletions;
545 | var
546 | sPrompt: String;
547 | begin
548 |
549 | sPrompt := Memo1.Text.Trim;
550 |
551 | if sPrompt.IsEmpty then
552 | begin
553 | ShowMessage('A prompt text must be supplied');
554 | exit;
555 | end;
556 | FOpenAI.Engine := FEngine;
557 | FOpenAI.RequestType := orCompletions;
558 | FOpenAI.Endpoint := OpenAI_PATH + '/engines/' + FEngine.ToString;
559 | FOpenAI.Completions.MaxTokens := Round(nbMaxTokens.value);
560 | FOpenAI.Completions.SamplingTemperature := nbTemperature.value;
561 | FOpenAI.Completions.TopP := nbTopP.value;
562 | FOpenAI.Completions.Stop := GetStops(Edit1.Text);
563 | FOpenAI.Completions.Prompt := sPrompt;
564 | FOpenAI.Completions.LogProbabilities := -1; // -1 will set as null default
565 | FOpenAI.Completions.User := 'Delphi-OpenAIDemo';
566 | end;
567 |
568 | procedure TfrmDemoOpenAI.InitFile;
569 | begin
570 | // WIP
571 | end;
572 |
573 | procedure TfrmDemoOpenAI.nbLogProbChange(Sender: TObject);
574 | begin
575 | Label15.Text := Round(nbLogProb.value).ToString;
576 | end;
577 |
578 | procedure TfrmDemoOpenAI.nbMaxTokensChange(Sender: TObject);
579 | begin
580 | Label12.Text := Round(nbMaxTokens.value).ToString;
581 | end;
582 |
583 | procedure TfrmDemoOpenAI.nbTemperatureChange(Sender: TObject);
584 | begin
585 | Label13.Text := Format('%0.2f', [nbTemperature.value]);
586 | end;
587 |
588 | procedure TfrmDemoOpenAI.nbTopPChange(Sender: TObject);
589 | begin
590 | Label14.Text := Format('%0.2f', [nbTopP.value]);
591 | end;
592 |
593 | procedure TfrmDemoOpenAI.NetHTTPClient1ReceiveData(const Sender: TObject; AContentLength, AReadCount: Int64; var AAbort: Boolean);
594 | begin
595 | if AContentLength > 0 then
596 | begin
597 | AniIndicator1.Visible := true;
598 | AniIndicator1.Enabled := true;
599 | FContentLength := true;
600 | end;
601 | end;
602 |
603 | procedure TfrmDemoOpenAI.DownloadImage(const uri: string);
604 | var
605 | lImageFileName: TImageFileName;
606 | begin
607 |
608 | TThread.CreateAnonymousThread(
609 | procedure
610 | begin
611 | AniIndicator1.Enabled := true;
612 | AniIndicator1.Visible := true;
613 | lImageFileName := TImages.ExtractImageFileName(uri);
614 | FImageFileName := FRootDir + 'images\' + lImageFileName.filename;
615 | DeleteFile(FImageFileName);
616 | FileStream := TFileStream.Create(FImageFileName, fmCreate);
617 | try
618 | FContentLength := False;
619 | NetHTTPClient1.Get(lImageFileName.SanitizedUrl, FileStream);
620 | except
621 | // ASyncService.ShowMessageAsync(DM.TranslateDialog('sDownloadFailed'));
622 | FileStream.Free;
623 | end;
624 | end).Start;
625 | end;
626 |
627 | procedure TfrmDemoOpenAI.LoadImage(const filename: string);
628 | begin
629 |
630 | ImageDallE.Bitmap := nil;
631 | try
632 | ImageDallE.Bitmap.LoadFromFile(filename);
633 | Except
634 | on E: Exception do
635 | ShowMessage(E.Message);
636 | end;
637 |
638 | end;
639 |
640 | procedure TfrmDemoOpenAI.NetHTTPClient1RequestCompleted(const Sender: TObject; const AResponse: IHTTPResponse);
641 | begin
642 | if Assigned(FileStream) then
643 | FileStream.Free;
644 |
645 | Memo2.Lines.Add('Image is ready: ' + FImageFileName);
646 |
647 | FContentLength := False;
648 |
649 | AniIndicator1.Visible := False;
650 | AniIndicator1.Enabled := False;
651 |
652 | end;
653 |
654 | procedure TfrmDemoOpenAI.btSubmitClick(Sender: TObject);
655 | begin
656 | Submit;
657 | end;
658 |
659 | procedure TfrmDemoOpenAI.Submit;
660 | begin
661 | if FOpenAI.APIKey.IsEmpty then
662 | begin
663 | Memo2.Lines.Add('API key is missing');
664 | exit;
665 | end;
666 |
667 | if (FOpenAI.RequestType = orFiles) and (OpenDialog1.filename = '') then
668 | begin
669 | Memo2.Lines.Add('Choose a file to upload');
670 | exit;
671 | end;
672 |
673 | if (FOpenAI.RequestType = orCompletions) and (Memo1.Text.IsEmpty) then
674 | begin
675 | Memo2.Lines.Add('Nothing to do here...');
676 | exit;
677 | end;
678 |
679 | if (FOpenAI.RequestType = orChat) and (FOpenAI.Chat.Messages.Count = 0) then
680 | begin
681 | Memo2.Lines.Add('Nothing to do here...');
682 | exit;
683 | end;
684 |
685 | if FOpenAI.RequestType = orNone then
686 | begin
687 | Memo2.Lines.Add('Choose a request type.');
688 | exit;
689 | end;
690 |
691 | if (FOpenAI.RequestType = orImages) and (Memo3.Text.IsEmpty) then
692 | exit;
693 |
694 | btSubmit.Enabled := False;
695 | AniIndicator1.Enabled := true;
696 | AniIndicator1.Visible := true;
697 |
698 | TThread.CreateAnonymousThread(
699 | procedure
700 | begin
701 |
702 | try
703 | case FOpenAI.RequestType of
704 | orEngines:
705 | begin
706 | FOpenAI.Endpoint := OpenAI_PATH;
707 | FOpenAI.GetEngines();
708 | exit;
709 | end;
710 | orChat:
711 | InitChatGPT();
712 | orCompletions:
713 | InitCompletions();
714 | orFiles:
715 | InitFile();
716 | orImages:
717 | begin
718 | InitImages();
719 | Memo2.Text := 'Generating the image, please wait...';
720 | end;
721 | end;
722 |
723 | try
724 | FOpenAI.Execute;
725 | except
726 | on E: Exception do
727 | Memo2.Lines.Add(E.Message)
728 | end;
729 |
730 | finally
731 | btSubmit.Enabled := true;
732 | AniIndicator1.Enabled := False;
733 | AniIndicator1.Visible := False;
734 | end;
735 |
736 | end).Start;
737 | end;
738 |
739 | procedure TfrmDemoOpenAI.tbNumberOfImagesChange(Sender: TObject);
740 | begin
741 | Label17.Text := 'Images to generate: ' + IntToStr(Round(tbNumberOfImages.value))
742 | end;
743 |
744 | end.
745 |
--------------------------------------------------------------------------------
/Demo/uDemoOpenAI.vlb:
--------------------------------------------------------------------------------
1 | [ToolBar1]
2 | Coordinates=66,146,58,33
3 |
4 | [SpeedButton1]
5 | Coordinates=119,10,84,51
6 |
7 | [DataSource1]
8 | Coordinates=99,77,77,33
9 |
10 | [FDMemTable1]
11 | Coordinates=270,80,84,51
12 |
13 | []
14 | Coordinates=504,232,49,51
15 | Visible=True
16 |
17 | [BindingsList1]
18 | Coordinates=265,1,82,33
19 |
20 | [TabItem2]
21 | Coordinates=504,309,59,33
22 |
23 | [TabItem4]
24 | Coordinates=504,364,59,33
25 |
26 | [SpeedButton2]
27 | Coordinates=0,0,84,51
28 |
29 | [rbTextDavinci001]
30 | Coordinates=275,174,99,33
31 |
32 | [Label7]
33 | Coordinates=177,269,46,51
34 |
35 | [TabControl1]
36 | Coordinates=644,56,74,33
37 |
38 | [Label3]
39 | Coordinates=148,173,46,51
40 |
41 | [TabItem1]
42 | Coordinates=425,365,59,33
43 |
44 | [Label1]
45 | Coordinates=394,251,46,51
46 |
47 | [rbTextBabbage001]
48 | Coordinates=19,205,106,33
49 |
50 | [Panel1]
51 | Coordinates=366,365,47,33
52 |
53 | [TabItem3]
54 | Coordinates=228,365,59,33
55 |
56 | [rbTextAda001]
57 | Coordinates=644,111,82,33
58 |
59 | [rbTextCurie001]
60 | Coordinates=644,166,89,33
61 |
62 | [Edit1]
63 | Coordinates=207,173,40,51
64 |
65 | [AniIndicator1]
66 | Coordinates=644,221,80,33
67 |
68 | [SpeedButton3]
69 | Coordinates=236,269,84,51
70 |
71 | [Label8]
72 | Coordinates=394,174,46,51
73 |
74 | [Label2]
75 | Coordinates=504,155,46,51
76 |
77 | [Image1]
78 | Coordinates=39,269,49,51
79 |
80 | [btSubmit]
81 | Coordinates=30,77,53,51
82 |
83 |
--------------------------------------------------------------------------------
/Lib/MLOpenAI.ChatGPT.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2021-2023 Magno Lima - www.MagnumLabs.com.br - Version 1.0
3 |
4 | Delphi libraries for using OpenAI's GPT-3 api
5 |
6 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
7 | which means that this a public dedication tool, which allows creators to
8 | give up their copyright and put their works into the worldwide public domain.
9 | You're allowed to distribute, remix, adapt, and build upon the material
10 | in any medium or format, with no conditions.
11 |
12 | Feel free if there's anything you want to contribute.
13 |
14 | https://platform.openai.com/docs/api-reference/chat
15 | *)
16 |
17 | unit MLOpenAI.ChatGPT;
18 |
19 | interface
20 |
21 | uses
22 | System.SysUtils, System.Generics.Collections, System.Classes, REST.Client, REST.Types,
23 | System.JSON, MLOpenAI.Types;
24 |
25 | type
26 | TMessageRole = (mrSystem, mrUser, mrAssistant);
27 |
28 | type
29 | TChatGPT = class
30 | private
31 | FModel: TOAChatModel;
32 | FMaxTokens: Integer;
33 | FSamplingTemperature: Single;
34 | FTopP: Single;
35 | FNumberOfCompletions: Integer;
36 | FStream: Boolean;
37 | FStop: TArray;
38 | FFrequencyPenalty: Single;
39 | FPresencePenalty: Single;
40 | FMessages: TStringList;
41 | FUser: String;
42 | procedure SetMaxTokens(const Value: Integer);
43 | procedure SetModel(const Value: TOAChatModel);
44 | procedure SetSamplingTemperature(const Value: Single);
45 | procedure SetNucleusSampling(const Value: Single);
46 | procedure SetNumberOfCompletions(const Value: Integer);
47 | procedure SetStop(const Value: TArray);
48 | procedure SetPresencePenalty(const Value: Single);
49 | procedure SetFrequencyPenalty(const Value: Single);
50 | procedure SetUser(const Value: String);
51 | public
52 | constructor Create(AEngine: TOAIEngine);
53 | destructor Destroy; override;
54 | procedure AddMessage(const Text: String; const Role: TMessageRole);
55 | procedure ClearMessages;
56 | procedure CreateChat(var ABody: String);
57 | property Model: TOAChatModel write SetModel;
58 | property MaxTokens: Integer read FMaxTokens write SetMaxTokens;
59 | property Temperature: Single read FSamplingTemperature write SetSamplingTemperature;
60 | property TopP: Single read FTopP write SetNucleusSampling;
61 | property NumberOfCompletions: Integer read FNumberOfCompletions write SetNumberOfCompletions;
62 | property Stream: Boolean read FStream write FStream;
63 | property Stop: TArray read FStop write SetStop;
64 | property FrequencyPenalty: Single read FFrequencyPenalty write SetFrequencyPenalty;
65 | property PresencePenalty: Single read FPresencePenalty write SetPresencePenalty;
66 | property User: String read FUser write SetUser;
67 | property Messages: TStringList read FMessages;
68 | end;
69 |
70 | implementation
71 |
72 | uses
73 | MLOpenAI.Core;
74 |
75 | { TChatGPT }
76 |
77 | (* logit_bias and stream are not yet implemented *)
78 |
79 | procedure TChatGPT.SetMaxTokens(const Value: Integer);
80 | begin
81 | FMaxTokens := Value;
82 | end;
83 |
84 | procedure TChatGPT.SetNucleusSampling(const Value: Single);
85 | begin
86 | FTopP := Value;
87 | end;
88 |
89 | procedure TChatGPT.SetNumberOfCompletions(const Value: Integer);
90 | begin
91 | FNumberOfCompletions := Value;
92 | end;
93 |
94 | procedure TChatGPT.SetPresencePenalty(const Value: Single);
95 | begin
96 | FPresencePenalty := Value;
97 | end;
98 |
99 | procedure TChatGPT.SetSamplingTemperature(const Value: Single);
100 | begin
101 | FSamplingTemperature := Value;
102 | end;
103 |
104 | procedure TChatGPT.SetStop(const Value: TArray);
105 | begin
106 | FStop := Value;
107 | end;
108 |
109 | procedure TChatGPT.SetUser(const Value: String);
110 | begin
111 | FUser := Value;
112 | end;
113 |
114 | procedure TChatGPT.SetModel(const Value: TOAChatModel);
115 | begin
116 | FModel := Value;
117 | end;
118 |
119 | procedure TChatGPT.SetFrequencyPenalty(const Value: Single);
120 | begin
121 | FFrequencyPenalty := Value;
122 | end;
123 |
124 | procedure TChatGPT.AddMessage(const Text: string; const Role: TMessageRole);
125 | var
126 | lRole: string;
127 | i: Integer;
128 | begin
129 | case Role of
130 | mrSystem:
131 | lRole := 'system';
132 | mrUser:
133 | lRole := 'user';
134 | mrAssistant:
135 | lRole := 'assistant';
136 | end;
137 | FMessages.AddPair(lRole, Text);
138 | end;
139 |
140 | procedure TChatGPT.ClearMessages;
141 | begin
142 | FMessages.Clear;
143 | end;
144 |
145 | constructor TChatGPT.Create(AEngine: TOAIEngine);
146 | begin
147 | // Using OpenAI Playground's default
148 | Self.MaxTokens := 1024;
149 | Self.TopP := 1;
150 | Self.Temperature := 0.7;
151 | Self.FrequencyPenalty := 0.0;
152 | Self.PresencePenalty := 0.0;
153 | FMessages := TStringList.Create;
154 | end;
155 |
156 | procedure TChatGPT.CreateChat(var ABody: String);
157 | var
158 | AJSONObject, AMSGObject: TJSONObject;
159 | JSONArray: TJSONArray;
160 | Stop, lMessageRole: String;
161 | i: Integer;
162 | begin
163 | AJSONObject := TJSONObject.Create;
164 | AMSGObject := TJSONObject.Create;
165 | JSONArray := TJSONArray.Create;
166 | try
167 | AJSONObject.AddPair(TJSONPair.Create('max_tokens', TJSONNumber.Create(FMaxTokens)));
168 |
169 | AJSONObject.AddPair(TJSONPair.Create('temperature', TJSONNumber.Create(Trunc(FSamplingTemperature * 100) / 100)));
170 | AJSONObject.AddPair(TJSONPair.Create('top_p', TJSONNumber.Create(FTopP)));
171 | AJSONObject.AddPair(TJSONPair.Create('frequency_penalty', TJSONNumber.Create(Trunc(FFrequencyPenalty * 100) / 100)));
172 | AJSONObject.AddPair(TJSONPair.Create('presence_penalty', TJSONNumber.Create(Trunc(FPresencePenalty * 100) / 100)));
173 |
174 | AJSONObject.AddPair('model', TOAI_CHAT_MODEL[Ord(Self.FModel)]);
175 |
176 | for i := 0 to FMessages.Count - 1 do
177 | begin
178 | AMSGObject.AddPair('role', FMessages.KeyNames[i]);
179 | AMSGObject.AddPair('content', FMessages.Values[FMessages.KeyNames[i]]);
180 | JSONArray.Add(AMSGObject);
181 | end;
182 | AJSONObject.AddPair('messages', JSONArray);
183 |
184 | if not FUser.IsEmpty then
185 | AJSONObject.AddPair(TJSONPair.Create('user', FUser));
186 |
187 | if Length(FStop) > 0 then
188 | begin
189 | JSONArray := TJSONArray.Create;
190 | for Stop in FStop do
191 | if not Stop.IsEmpty then
192 | JSONArray.Add(Stop);
193 | AJSONObject.AddPair(TJSONPair.Create('stop', JSONArray));
194 | end;
195 |
196 | ABody := UTF8ToString(AJSONObject.ToJSON);
197 | finally
198 | AJSONObject.Free;
199 | AJSONObject := nil;
200 | JSONArray := nil;
201 | end;
202 | end;
203 |
204 | destructor TChatGPT.Destroy;
205 | begin
206 | FStop := nil;
207 | FMessages.Free;
208 | inherited;
209 | end;
210 |
211 | end.
212 |
--------------------------------------------------------------------------------
/Lib/MLOpenAI.Classifications.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2021 Magno Lima - www.MagnumLabs.com.br - Version 1.0
3 |
4 | Delphi libraries for using OpenAI's GPT-3 api
5 |
6 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
7 | which means that this a public dedication tool, which allows creators to
8 | give up their copyright and put their works into the worldwide public domain.
9 | You're allowed to distribute, remix, adapt, and build upon the material
10 | in any medium or format, with no conditions.
11 |
12 | Feel free to open a push request if there's anything you want
13 | to contribute.
14 |
15 | https://beta.openai.com/docs/api-reference/completions/create
16 | *)
17 |
18 | unit MLOpenAI.Classifications;
19 |
20 | interface
21 |
22 | uses
23 | System.SysUtils, REST.Client, REST.Types, System.JSON;
24 |
25 | type
26 | TClassifications = class
27 | private
28 | FEngine, FPrompt: String;
29 | FMaxTokens: Integer;
30 | FSamplingTemperature: Single;
31 | FTopP: Single;
32 | FNumberOfCompletions: Integer;
33 | FLogProbabilities: Integer;
34 | FEcho: Boolean;
35 | FStop: TArray;
36 | FFrequencyPenalty: Single;
37 | FPresencePenalty: Single;
38 | FBestOf: Integer;
39 | public
40 | constructor Create(EngineIndex: Integer);
41 | procedure CreateClassification(var ABody: String);
42 | end;
43 |
44 | implementation
45 |
46 | uses
47 | MLOpenAI.Core;
48 |
49 | { TClassifications }
50 |
51 |
52 | constructor TClassifications.Create(EngineIndex: Integer);
53 | begin
54 | { TODO : }
55 | // Set defaults
56 | FEngine := TOAIEngineName[EngineIndex];
57 | FPrompt := '';
58 | FMaxTokens := 16;
59 | FSamplingTemperature := 1;
60 | FNumberOfCompletions := 1;
61 | FLogProbabilities := 1;
62 | FEcho := false;
63 | FStop := nil;
64 | FPresencePenalty := 0;
65 | FFrequencyPenalty := 0;
66 | FBestOf := 1;
67 | end;
68 |
69 | procedure TClassifications.CreateClassification(var ABody: String);
70 | var
71 | AJSONObject: TJSONObject;
72 | AJSONPair: TJSONPair;
73 | Value, Stop: String;
74 | begin
75 | { TODO : }
76 | AJSONObject := TJSONObject.Create;
77 |
78 | AJSONObject.AddPair(TJSONPair.Create('', ''));
79 |
80 | ABody := AJSONObject.ToJSON;
81 | AJSONObject.Free;
82 |
83 | end;
84 |
85 | end.
86 |
--------------------------------------------------------------------------------
/Lib/MLOpenAI.Completions.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2021-2023 Magno Lima - www.MagnumLabs.com.br - Version 1.0
3 |
4 | Delphi libraries for using OpenAI's GPT-3 api
5 |
6 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
7 | which means that this a public dedication tool, which allows creators to
8 | give up their copyright and put their works into the worldwide public domain.
9 | You're allowed to distribute, remix, adapt, and build upon the material
10 | in any medium or format, with no conditions.
11 |
12 | Feel free if there's anything you want to contribute.
13 |
14 | https://platform.openai.com/docs/api-reference/chat
15 | *)
16 |
17 | unit MLOpenAI.Completions;
18 |
19 | interface
20 |
21 | uses
22 | System.SysUtils, System.Generics.Collections, REST.Client, REST.Types,
23 | System.JSON, MLOpenAI.Types;
24 |
25 | type
26 | TCompletions = class
27 | private
28 | FEngine, FPrompt: String;
29 | FMaxTokens: Integer;
30 | FSamplingTemperature: Single;
31 | FTopP: Single;
32 | FNumberOfCompletions: Integer;
33 | FLogProbabilities: Integer;
34 | FEcho: Boolean;
35 | FStop: TArray;
36 | FFrequencyPenalty: Single;
37 | FPresencePenalty: Single;
38 | FBestOf: Integer;
39 | FUser: String;
40 | FUserParameters: TDictionary;
41 | procedure SetMaxTokens(const Value: Integer);
42 | procedure SetEngine(const Value: String);
43 | procedure SetPrompt(const Value: String);
44 | procedure SetSamplingTemperature(const Value: Single);
45 | procedure SetNucleusSampling(const Value: Single);
46 | procedure SetNumberOfCompletions(const Value: Integer);
47 | procedure SetLogProbabilities(const Value: Integer);
48 | procedure SetEcho(const Value: Boolean);
49 | procedure SetStop(const Value: TArray);
50 | procedure SetPresencePenalty(const Value: Single);
51 | procedure SetFrequencyPenalty(const Value: Single);
52 | procedure SetBestOf(const Value: Integer);
53 | procedure SetUser(const Value: String);
54 | public
55 | constructor Create(AEngine: TOAIEngine);
56 | destructor Destroy; override;
57 | property Engine: String write SetEngine;
58 | property Prompt: String read FPrompt write SetPrompt;
59 | property MaxTokens: Integer read FMaxTokens write SetMaxTokens;
60 | property SamplingTemperature: Single read FSamplingTemperature write SetSamplingTemperature;
61 | property TopP: Single read FTopP write SetNucleusSampling;
62 | property NumberOfCompletions: Integer read FNumberOfCompletions write SetNumberOfCompletions;
63 | property LogProbabilities: Integer read FLogProbabilities write SetLogProbabilities;
64 | property Echo: Boolean read FEcho write SetEcho;
65 | property Stop: TArray read FStop write SetStop;
66 | property FrequencyPenalty: Single read FFrequencyPenalty write SetFrequencyPenalty;
67 | property PresencePenalty: Single read FPresencePenalty write SetPresencePenalty;
68 | property BestOf: Integer read FBestOf write SetBestOf;
69 | property User: String read FUser write SetUser;
70 | procedure CreateCompletion(var ABody: String);
71 | procedure AddStringParameter(const Name: String; Value: String);
72 | end;
73 |
74 | implementation
75 |
76 | uses
77 | MLOpenAI.Core;
78 |
79 | { TCompletion }
80 |
81 | (* logit_bias and stream are not yet implemented *)
82 |
83 | procedure TCompletions.SetMaxTokens(const Value: Integer);
84 | begin
85 | FMaxTokens := Value;
86 | end;
87 |
88 | procedure TCompletions.SetNucleusSampling(const Value: Single);
89 | begin
90 | FTopP := Value;
91 | end;
92 |
93 | procedure TCompletions.SetNumberOfCompletions(const Value: Integer);
94 | begin
95 | FNumberOfCompletions := Value;
96 | end;
97 |
98 | procedure TCompletions.SetPresencePenalty(const Value: Single);
99 | begin
100 | FPresencePenalty := Value;
101 | end;
102 |
103 | procedure TCompletions.SetPrompt(const Value: String);
104 | begin
105 | FPrompt := Value;
106 | end;
107 |
108 | procedure TCompletions.SetSamplingTemperature(const Value: Single);
109 | begin
110 | FSamplingTemperature := Value;
111 | end;
112 |
113 | procedure TCompletions.SetStop(const Value: TArray);
114 | begin
115 | FStop := Value;
116 | end;
117 |
118 | procedure TCompletions.SetUser(const Value: String);
119 | begin
120 | FUser := Value;
121 | end;
122 |
123 | procedure TCompletions.SetLogProbabilities(const Value: Integer);
124 | begin
125 | FLogProbabilities := Value;
126 | end;
127 |
128 | procedure TCompletions.SetEcho(const Value: Boolean);
129 | begin
130 | FEcho := Value;
131 | end;
132 |
133 | procedure TCompletions.SetEngine(const Value: String);
134 | begin
135 | FEngine := Value;
136 | end;
137 |
138 | procedure TCompletions.SetFrequencyPenalty(const Value: Single);
139 | begin
140 | FFrequencyPenalty := Value;
141 | end;
142 |
143 | procedure TCompletions.SetBestOf(const Value: Integer);
144 | begin
145 | FBestOf := Value;
146 | end;
147 |
148 | procedure TCompletions.AddStringParameter(const Name: String; Value: String);
149 | begin
150 | FUserParameters.TryAdd(Name, Value);
151 | end;
152 |
153 | constructor TCompletions.Create(AEngine: TOAIEngine);
154 | begin
155 | FMaxTokens := 16;
156 | FSamplingTemperature := 0.5;
157 | FNumberOfCompletions := 1;
158 | FLogProbabilities := -1;
159 | FBestOf := 1;
160 | FUserParameters := TDictionary.Create;
161 | end;
162 |
163 | procedure TCompletions.CreateCompletion(var ABody: String);
164 | var
165 | AJSONObject: TJSONObject;
166 | JSONArray: TJSONArray;
167 | Value, Stop: String;
168 | begin
169 | AJSONObject := TJSONObject.Create;
170 | JSONArray := nil;
171 | try
172 | AJSONObject.AddPair(TJSONPair.Create('prompt', FPrompt));
173 | AJSONObject.AddPair(TJSONPair.Create('temperature', TJSONNumber.Create(Trunc(FSamplingTemperature * 100) / 100)));
174 | AJSONObject.AddPair(TJSONPair.Create('max_tokens', TJSONNumber.Create(FMaxTokens)));
175 | AJSONObject.AddPair(TJSONPair.Create('top_p', TJSONNumber.Create(FTopP)));
176 | AJSONObject.AddPair(TJSONPair.Create('frequency_penalty', TJSONNumber.Create(Trunc(FFrequencyPenalty * 100) / 100)));
177 | AJSONObject.AddPair(TJSONPair.Create('presence_penalty', TJSONNumber.Create(Trunc(FPresencePenalty * 100) / 100)));
178 |
179 | for Value in FUserParameters.Keys do
180 | AJSONObject.AddPair(TJSONPair.Create(Value, FUserParameters[Value]));
181 |
182 | if not FUser.IsEmpty then
183 | AJSONObject.AddPair(TJSONPair.Create('user', FUser));
184 |
185 | if Length(FStop) > 0 then
186 | begin
187 | JSONArray := TJSONArray.Create;
188 | for Stop in FStop do
189 | if not Stop.IsEmpty then JSONArray.Add(Stop);
190 | AJSONObject.AddPair(TJSONPair.Create('stop', JSONArray));
191 | end;
192 |
193 | if FNumberOfCompletions <> 1 then
194 | AJSONObject.AddPair(TJSONPair.Create('n', TJSONNumber.Create(FNumberOfCompletions)));
195 |
196 | {$REGION "TODO: soon"}
197 | // if FLogProbabilities = -1 then
198 | // AJSONObject.AddPair(TJSONPair.Create('logprobs', 'null'))
199 | // else
200 | // AJSONObject.AddPair(TJSONPair.Create('logprobs', TJSONNumber.Create(FLogProbabilities)));
201 | {$ENDREGION}
202 | ABody := UTF8ToString(AJSONObject.ToJSON);
203 |
204 | finally
205 | AJSONObject.Free;
206 | AJSONObject := nil;
207 | JSONArray := nil;
208 | end;
209 |
210 | end;
211 |
212 | destructor TCompletions.Destroy;
213 | begin
214 | FStop := nil;
215 | FUserParameters.Free;
216 | inherited;
217 | end;
218 |
219 | end.
220 |
--------------------------------------------------------------------------------
/Lib/MLOpenAI.Core.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2021-2023 Magno Lima - www.MagnumLabs.com.br - Version 1.0
3 |
4 | Delphi libraries for using OpenAI's GPT-3 api
5 |
6 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
7 | which means that this a public dedication tool, which allows creators to
8 | give up their copyright and put their works into the worldwide public domain.
9 | You're allowed to distribute, remix, adapt, and build upon the material
10 | in any medium or format, with no conditions.
11 |
12 | Feel free if there's anything you want to contribute.
13 |
14 | https://platform.openai.com/docs/api-reference/engines
15 | *)
16 |
17 | unit MLOpenAI.Core;
18 |
19 | interface
20 |
21 | uses
22 | System.Diagnostics, System.Classes, System.SysUtils, Data.Bind.Components,
23 | Data.Bind.ObjectScope, REST.Client, REST.Types,
24 | FireDAC.Stan.Intf,
25 | FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error,
26 | REST.Response.Adapter,
27 | FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, System.StrUtils,
28 | System.Generics.Collections,
29 | Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, System.Types,
30 | System.IOUtils, System.TypInfo, System.JSON,
31 | MLOpenAI.Types, MLOpenAI.Completions,
32 | MLOpenAI.Files, MLOpenAI.Finetunes,
33 | MLOpenAI.Images, MLOpenAI.ChatGPT;
34 |
35 | type
36 | TRESTRequestOAI = class(TRESTRequest)
37 | private
38 | FRequestType: TOAIRequests;
39 | property RequestType: TOAIRequests read FRequestType write FRequestType;
40 | end;
41 |
42 | type
43 | TOpenAI = class
44 | private
45 | FAcceptType: String;
46 | FContentType: String;
47 | FEndpoint: String;
48 | FResource: String;
49 | FErrorMessage: String;
50 | FBodyContent: String;
51 | FEngine: TOAIEngine;
52 | FRequestType: TOAIRequests;
53 | FEnginesList: TDictionary;
54 | FOnResponse: TNotifyEvent;
55 | FOnError: TNotifyEvent;
56 | FAPIKey: String;
57 | FOrganization: String;
58 | FFileDescription: TFileDescription;
59 | FRESTRequest: TRESTRequestOAI;
60 | FRESTClient: TRESTClient;
61 | FRESTResponse: TRESTResponse;
62 | FMemtable: TFDMemTable;
63 | FCompletions: TCompletions;
64 | FStatusCode: Integer;
65 | FFilePurpose: TFilePurpose;
66 | FImages: TImages;
67 | FChatGPT: TChatGPT;
68 | procedure readEngines;
69 | procedure SetEndPoint(const Value: String);
70 | procedure SetApiKey(const Value: string);
71 | procedure SetOrganization(const Value: String);
72 | procedure SetEngine(const Value: TOAIEngine);
73 | procedure CreateRESTRespose;
74 | procedure CreateRESTClient;
75 | procedure CreateRESTRequest;
76 | procedure ExecuteCompletions;
77 | procedure HttpRequestError(Sender: TCustomRESTRequest);
78 | procedure HttpClientError(Sender: TCustomRESTClient);
79 | procedure SetFileDescription(const Value: TFileDescription);
80 | procedure SetAuthorization;
81 | procedure ExecuteImages;
82 | procedure readB64Json;
83 | procedure ExecuteChat;
84 | public
85 | constructor Create(var MemTable: TFDMemTable; const APIFileName: String = '');
86 | destructor Destroy; Override;
87 | property ErrorMessage: String read FErrorMessage;
88 | class function Sanitize(const Stops: TArray; Text: String): String; static;
89 | published
90 | procedure Execute;
91 | procedure ExecuteAsync(pProcEndExec: TProc; pProcError: TProc);
92 | procedure Stop;
93 | procedure GetEngines;
94 | function GetChoicesResult: String;
95 | function GetChatResult: TArray;
96 | function GetPersonChoicesResult: string;
97 | procedure AfterExecute(Sender: TCustomRESTRequest);
98 | procedure Upload;
99 | property OnResponse: TNotifyEvent read FOnResponse write FOnResponse;
100 | property OnError: TNotifyEvent read FOnError write FOnError;
101 | property StatusCode: Integer read FStatusCode;
102 | property Engine: TOAIEngine read FEngine write SetEngine;
103 | property Endpoint: String read FEndpoint write SetEndPoint;
104 | property Organization: String read FOrganization write SetOrganization;
105 | property APIKey: String read FAPIKey write SetApiKey;
106 | property AvailableEngines: TDictionary read FEnginesList;
107 | property RequestType: TOAIRequests read FRequestType write FRequestType;
108 | property Completions: TCompletions read FCompletions;
109 | property Chat: TChatGPT read FChatGPT;
110 | property Images: TImages read FImages;
111 | property BodyContent: String read FBodyContent;
112 | property FileDescription: TFileDescription read FFileDescription write SetFileDescription;
113 | property FilePurpose: TFilePurpose read FFilePurpose write FFilePurpose;
114 | procedure SaveToFile(const Filename: String);
115 | end;
116 |
117 | implementation
118 |
119 | { TOpenAI }
120 |
121 | function SliceString(const AString: string; const ADelimiter: string): TArray;
122 | var
123 | I: Integer;
124 | PLine, PStart: PChar;
125 | s: String;
126 | begin
127 |
128 | I := 1;
129 | PLine := PChar(AString);
130 |
131 | PStart := PLine;
132 | inc(PLine);
133 |
134 | while (I < Length(AString)) do
135 | begin
136 | while (PLine^ <> #0) and (PLine^ <> ADelimiter) do
137 | begin
138 | inc(PLine);
139 | inc(I);
140 | end;
141 |
142 | SetString(s, PStart, PLine - PStart);
143 | SetLength(Result, Length(Result) + 1);
144 | Result[Length(Result) - 1] := s;
145 | inc(PLine);
146 | inc(I);
147 | PStart := PLine;
148 | end;
149 |
150 | end;
151 |
152 | class function TOpenAI.Sanitize(const Stops: TArray; Text: String): String;
153 | var
154 | Temp, Stop: String;
155 | Lines: TArray;
156 | begin
157 | if Text.IsEmpty then
158 | Exit;
159 |
160 | Temp := StringReplace(Text, #10#10, #13, [rfReplaceAll]);
161 | for Stop in Stops do
162 | Temp := StringReplace(Temp, trim(Stop), '', [rfIgnoreCase]);
163 | Lines := Temp.Split([#10#10, #13]);
164 |
165 | Temp := '';
166 | Result := '';
167 | if Length(Lines) > 1 then
168 | for Temp in Lines do
169 | begin
170 | if trim(Temp).Length > 1 then
171 | begin
172 | {$IF DEFINE(ANDROID)}
173 | if Temp[0] in [',', '.', ';'] then
174 | {$ELSE}
175 | if Temp[1] in [',', '.', ';'] then
176 | {$ENDIF}
177 | Result := trim(Temp.Substring(2))
178 | else
179 | Result := Result + trim(Temp) + #10;
180 | end;
181 | end
182 | else
183 | Result := Lines[0];
184 |
185 | Result := trim(Result);
186 | end;
187 |
188 | procedure TOpenAI.SaveToFile(const Filename: String);
189 | var
190 | SanitizedResponse: String;
191 | begin
192 | SanitizedResponse := TOpenAI.Sanitize([''], Self.GetChoicesResult);
193 | Tfile.WriteAllText(Filename, SanitizedResponse);
194 | end;
195 |
196 | procedure TOpenAI.CreateRESTRespose;
197 | begin
198 | FAcceptType := 'application/json';
199 | FContentType := 'application/json';
200 | //
201 | FRESTResponse := TRESTResponse.Create(nil);
202 | FRESTResponse.Name := '_restresponse';
203 | FRESTResponse.ContentType := FContentType;
204 | end;
205 |
206 | procedure TOpenAI.CreateRESTClient;
207 | begin
208 | FRESTClient := TRESTClient.Create(nil);
209 | FRESTClient.AcceptCharset := 'UTF-8';
210 | FRESTClient.UserAgent := 'MagnumLabsOAIClient';
211 | FRESTClient.Accept := FAcceptType;
212 | FRESTClient.ContentType := FContentType;
213 | FRESTClient.OnHTTPProtocolError := HttpClientError;
214 | end;
215 |
216 | procedure TOpenAI.CreateRESTRequest;
217 | begin
218 | FRESTRequest := TRESTRequestOAI.Create(nil);
219 | FRESTRequest.AcceptCharset := 'UTF-8';
220 | FRESTRequest.Accept := FAcceptType;
221 | FRESTRequest.Method := TRESTRequestMethod.rmPOST;
222 | FRESTRequest.Params.Clear;
223 | FRESTRequest.Body.ClearBody;
224 | FRESTRequest.Response := FRESTResponse;
225 | FRESTRequest.Client := FRESTClient;
226 | FRESTRequest.OnAfterExecute := AfterExecute;
227 | FRESTRequest.FRequestType := TOAIRequests.orNone;
228 | FRESTRequest.OnHTTPProtocolError := HttpRequestError;
229 | end;
230 |
231 | constructor TOpenAI.Create(var MemTable: TFDMemTable; const APIFileName: String = '');
232 | begin
233 | FErrorMessage := '';
234 | FOnResponse := nil;
235 | FMemtable := MemTable;
236 |
237 | FChatGPT := TChatGPT.Create(TOAIEngine.egGPT3_5Turbo);
238 | FCompletions := TCompletions.Create(FEngine);
239 | FImages := TImages.Create('');
240 |
241 | CreateRESTRespose();
242 | CreateRESTClient();
243 | CreateRESTRequest();
244 |
245 | if not APIFileName.IsEmpty and FileExists(APIFileName) then
246 | begin
247 | FAPIKey := Tfile.ReadAllText(APIFileName);
248 | SetApiKey(FAPIKey);
249 | end;
250 |
251 | end;
252 |
253 | destructor TOpenAI.Destroy;
254 | begin
255 | FCompletions.Free;
256 | FImages.Free;
257 | FChatGPT.Free;
258 | FRESTResponse.Free;
259 | FRESTRequest.Free;
260 | FRESTClient.Free;
261 | FCompletions := nil;
262 | if Assigned(FEnginesList) then
263 | FEnginesList.Free;
264 | inherited Destroy;
265 | end;
266 |
267 | procedure TOpenAI.HttpRequestError(Sender: TCustomRESTRequest);
268 | begin
269 | FRESTRequest.FRequestType := orNone;
270 | FStatusCode := FRESTRequest.Response.StatusCode;
271 | FErrorMessage := FRESTRequest.Response.ErrorMessage;
272 | FOnError(Self);
273 | end;
274 |
275 | procedure TOpenAI.HttpClientError(Sender: TCustomRESTClient);
276 | begin
277 | FRESTRequest.FRequestType := orNone;
278 | FErrorMessage := FRESTRequest.Response.ErrorMessage;
279 | FOnError(Self);
280 | end;
281 |
282 | procedure TOpenAI.SetEndPoint(const Value: String);
283 | begin
284 | FEndpoint := Value;
285 | FRESTClient.BaseURL := Value;
286 | end;
287 |
288 | procedure TOpenAI.SetEngine(const Value: TOAIEngine);
289 | begin
290 | FEngine := Value;
291 | end;
292 |
293 | procedure TOpenAI.SetFileDescription(const Value: TFileDescription);
294 | begin
295 | FFileDescription := Value;
296 | end;
297 |
298 | procedure TOpenAI.SetOrganization(const Value: String);
299 | begin
300 | FOrganization := Value;
301 | end;
302 |
303 | procedure TOpenAI.Stop;
304 | begin
305 | FRESTRequest.FRequestType := orNone;
306 | end;
307 |
308 | function TOpenAI.GetChatResult: TArray;
309 | var
310 | JSonObject: TJSONObject;
311 | JSonValue: TJSonValue;
312 | JsonArray: TJSONArray;
313 | ArrayElement: TJSonValue;
314 | I: Integer;
315 | s: string;
316 | begin
317 |
318 | try
319 | JSonValue := TJSONObject.ParseJSONValue(FBodyContent);
320 | JsonArray := JSonValue.GetValue('choices');
321 | SetLength(Result, JsonArray.Count);
322 |
323 | I := 0;
324 | for ArrayElement in JsonArray do
325 | begin
326 | Result[I] := Trim(TJSONObject(TJSONObject(ArrayElement).GetValue('message')).GetValue('content'));
327 | inc(I);
328 | end;
329 |
330 | finally
331 | JSonValue.Free;
332 | end;
333 |
334 | end;
335 |
336 | function TOpenAI.GetChoicesResult: String;
337 | var
338 | JSonValue: TJSonValue;
339 | JsonArray: TJSONArray;
340 | ArrayElement: TJSonValue;
341 | begin
342 | Result := '';
343 |
344 | JSonValue := TJSONObject.ParseJSONValue(FBodyContent);
345 | JsonArray := JSonValue.GetValue('choices');
346 | for ArrayElement in JsonArray do
347 | Result := Result + ArrayElement.GetValue('message');
348 | JSonValue.Free;
349 | end;
350 |
351 | function TOpenAI.GetPersonChoicesResult: string;
352 | var
353 | lJSonValue: TJSonValue;
354 | lJsonArray: TJSONArray;
355 | lArrayElement: TJSonValue;
356 |
357 | lText: TStringList;
358 | lNewTexto: string;
359 | lPos: Integer;
360 | lFind: boolean;
361 | begin
362 | Result := '';
363 | lFind := False;
364 | lJSonValue := TJSONObject.ParseJSONValue(FBodyContent);
365 | lJsonArray := lJSonValue.GetValue('choices');
366 | for lArrayElement in lJsonArray do
367 | Result := Result + lArrayElement.GetValue('text');
368 |
369 | lText := TStringList.Create;
370 | lText.Text := Result;
371 | try
372 | lNewTexto := '';
373 | for var li := 0 to lText.Count - 1 do
374 | begin
375 | if (Pos(':', lText[li]) > 0) then
376 | begin
377 | if not lFind then
378 | lFind := True
379 | else
380 | Break;
381 | end;
382 |
383 | if lFind then
384 | lNewTexto := lNewTexto + sLineBreak + lText[li];
385 | end;
386 |
387 | lPos := Pos(':', lNewTexto);
388 | lNewTexto := Copy(lNewTexto, lPos + 1, lNewTexto.Length);
389 |
390 | if lNewTexto.trim <> '' then
391 | Result := lNewTexto;
392 | finally
393 | lText.Free;
394 | lJSonValue.Free;
395 | end;
396 |
397 | end;
398 |
399 | procedure TOpenAI.readEngines();
400 | begin
401 | if not Assigned(FEnginesList) then
402 | FEnginesList := TDictionary.Create;
403 |
404 | FEnginesList.Clear;
405 | while not FMemtable.Eof do
406 | begin
407 | FEnginesList.Add(FMemtable.FieldByName('id').AsString, FMemtable.FieldByName('ready').AsString);
408 | FMemtable.Next;
409 | end;
410 |
411 | end;
412 |
413 | procedure TOpenAI.readB64Json;
414 | begin
415 |
416 | Images.ImageB64Json := FBodyContent;
417 |
418 | end;
419 |
420 | procedure TOpenAI.AfterExecute(Sender: TCustomRESTRequest);
421 | var
422 | LStatusCode: Integer;
423 | FRESTResponseDataSetAdapter: TRESTResponseDataSetAdapter;
424 | begin
425 |
426 | LStatusCode := FRESTResponse.StatusCode;
427 |
428 | if FStatusCode = 0 then
429 | FStatusCode := LStatusCode;
430 |
431 | if not(FStatusCode in [200, 201]) then
432 | Exit;
433 |
434 | FBodyContent := FRESTResponse.Content;
435 |
436 | case FRequestType of
437 | orEngines:
438 | FRESTResponse.RootElement := 'data';
439 | orCompletions:
440 | FRESTResponse.RootElement := 'choices';
441 | orSearch:
442 | ;
443 | rClassifications:
444 | ;
445 | orAnswers:
446 | ;
447 | orFiles:
448 | ;
449 | orImages:
450 | begin
451 | if (FRequestType = orImages) and (Images.ResponseFormat = TResponseFormat.rfB64Json) then
452 | readB64Json();
453 | FRESTRequest.FRequestType := orNone;
454 | if Assigned(FOnResponse) then
455 | FOnResponse(Self);
456 | Exit;
457 | end;
458 | orChat:
459 | FRESTResponse.RootElement := 'choices';
460 |
461 | end;
462 |
463 | if not FMemtable.IsEmpty then
464 | FMemtable.EmptyDataSet;
465 |
466 | FRESTResponseDataSetAdapter := TRESTResponseDataSetAdapter.Create(nil);
467 | try
468 | FRESTResponseDataSetAdapter.DataSet := FMemtable;
469 | FRESTResponseDataSetAdapter.Response := FRESTResponse;
470 | FMemtable.First;
471 | finally
472 | FRESTResponseDataSetAdapter.Free;
473 | end;
474 |
475 | case FRequestType of
476 | orNone:
477 | ;
478 | rAuth:
479 | ;
480 | orEngines:
481 | readEngines();
482 | orCompletions:
483 | ;
484 | orSearch:
485 | ;
486 | rClassifications:
487 | ;
488 | orAnswers:
489 | ;
490 | orFiles:
491 | ;
492 | orImages:
493 | if (FRequestType = orImages) and (Images.ResponseFormat = TResponseFormat.rfB64Json) then
494 | readB64Json();
495 | end;
496 |
497 | FRESTRequest.FRequestType := orNone;
498 | if Assigned(FOnResponse) then
499 | FOnResponse(Self);
500 | end;
501 |
502 | procedure TOpenAI.SetAuthorization;
503 | begin
504 | FRESTRequest.Params.Clear;
505 | FRESTRequest.Params.AddHeader('Authorization', 'Bearer ' + FAPIKey);
506 | FRESTRequest.Params.ParameterByName('Authorization').Options := [poDoNotEncode];
507 | end;
508 |
509 | procedure TOpenAI.SetApiKey(const Value: string);
510 | begin
511 | FAPIKey := Value;
512 | end;
513 |
514 | procedure TOpenAI.Execute;
515 | begin
516 | case FRequestType of
517 | orCompletions:
518 | ExecuteCompletions();
519 | orImages:
520 | ExecuteImages();
521 | orChat:
522 | ExecuteChat();
523 | end;
524 | end;
525 |
526 | procedure TOpenAI.ExecuteAsync(pProcEndExec: TProc; pProcError: TProc);
527 | begin
528 | TThread.CreateAnonymousThread(
529 | procedure
530 | begin
531 | try
532 | try
533 | Execute;
534 | except
535 | on E: Exception do
536 | begin
537 | if Assigned(pProcError) then
538 | TThread.Synchronize(nil,
539 | procedure
540 | begin
541 | pProcError(E.Message);
542 | end);
543 | end;
544 | end;
545 | finally
546 | if Assigned(pProcEndExec) then
547 | TThread.Synchronize(nil,
548 | procedure
549 | begin
550 | pProcEndExec;
551 | end);
552 | end;
553 | end).Start;
554 | end;
555 |
556 | procedure TOpenAI.GetEngines;
557 | begin
558 | SetAuthorization();
559 | FRESTRequest.RequestType := orEngines;
560 | FRESTRequest.ClearBody;
561 | FRESTRequest.FRequestType := orEngines;
562 | FRESTRequest.Method := TRESTRequestMethod.rmGET;
563 | FRESTRequest.Resource := OAI_GET_ENGINES;
564 | FRESTRequest.Execute;
565 | end;
566 |
567 | procedure TOpenAI.ExecuteCompletions;
568 | var
569 | ABody: String;
570 | begin
571 | SetAuthorization();
572 | FRESTRequest.RequestType := orCompletions;
573 | FRESTRequest.ClearBody;
574 | FRESTRequest.Resource := OAI_GET_COMPLETION;
575 | FRESTRequest.Method := TRESTRequestMethod.rmPOST;
576 | FCompletions.CreateCompletion(ABody);
577 | FRESTRequest.Body.Add(ABody, TRESTContentType.ctAPPLICATION_JSON);
578 | FRESTRequest.Execute;
579 | end;
580 |
581 | procedure TOpenAI.ExecuteChat;
582 | var
583 | ABody: String;
584 | begin
585 | SetAuthorization();
586 | FRESTRequest.RequestType := orChat;
587 | FRESTRequest.ClearBody;
588 | FRESTRequest.Resource := OAI_GET_CHAT;
589 | FRESTRequest.Method := TRESTRequestMethod.rmPOST;
590 | FChatGPT.CreateChat(ABody);
591 | FRESTRequest.Body.Add(ABody, TRESTContentType.ctAPPLICATION_JSON);
592 | FRESTRequest.Execute;
593 | end;
594 |
595 | procedure TOpenAI.ExecuteImages;
596 | var
597 | ABody: String;
598 | begin
599 | SetAuthorization();
600 | FRESTRequest.RequestType := orImages;
601 | FRESTRequest.ClearBody;
602 | FRESTRequest.Resource := OAI_IMAGES;
603 | FRESTRequest.Method := TRESTRequestMethod.rmPOST;
604 | FImages.GenerateImages(ABody);
605 | FRESTRequest.Body.Add(ABody, TRESTContentType.ctAPPLICATION_JSON);
606 | FRESTRequest.Execute;
607 | end;
608 |
609 | procedure TOpenAI.Upload;
610 | begin
611 | // WIP
612 | SetAuthorization();
613 | FRESTRequest.RequestType := orFiles;
614 | FRESTRequest.AddFile(FileDescription.Filename);
615 | FRESTRequest.AddBody('', ctMULTIPART_FORM_DATA);
616 | FRESTRequest.AddParameter('purpose', TFilePurposeName[Ord(FileDescription.Purpose)]);
617 | // FRESTRequest.Execute;
618 | end;
619 |
620 |
621 | end.
622 |
--------------------------------------------------------------------------------
/Lib/MLOpenAI.Files.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2022 Magno Lima - www.MagnumLabs.com.br - Version 1.0
3 |
4 | Delphi libraries for using OpenAI's GPT-3 api
5 |
6 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
7 | which means that this a public dedication tool, which allows creators to
8 | give up their copyright and put their works into the worldwide public domain.
9 | You're allowed to distribute, remix, adapt, and build upon the material
10 | in any medium or format, with no conditions.
11 |
12 | Feel free to open a push request if there's anything you want
13 | to contribute.
14 |
15 | https://beta.openai.com/docs/api-reference/files
16 | //
17 | Ref to JSON Lines
18 | *******************
19 | WIP WIP WIP WIP WIP
20 | *******************
21 | *)
22 | unit MLOpenAI.Files;
23 |
24 | interface
25 |
26 | uses
27 | System.SysUtils, REST.Client, REST.Types, System.JSON, MLOpenAI.Types;
28 |
29 | type
30 | TFiles = class
31 | private
32 | FFileName: String;
33 | FPurpose: TFilePurpose;
34 | FFileId: String;
35 | procedure SetFileId(const Value: String);
36 | public
37 | property FileId: String read FFileId write FFileId;
38 | property FileName: String read FFileName write FFilename;
39 | property Purpose: TFilePurpose read FPurpose write FPurpose;
40 | procedure UploadFile(Const FileName: String);
41 | procedure DeleteFile(Const FileId: String);
42 | function ListFiles: TJSONArray;
43 | function RetrieveInformation(Const FileId: String): TArray;
44 | function RetrieveFileContent(Const FileId: String): TArray;
45 | end;
46 |
47 | implementation
48 |
49 | { TFiles }
50 |
51 | procedure TFiles.DeleteFile(const FileId: String);
52 | begin
53 |
54 | end;
55 |
56 | function TFiles.ListFiles: TJSONArray;
57 | begin
58 |
59 | end;
60 |
61 | function TFiles.RetrieveFileContent(const FileId: String): TArray;
62 | begin
63 |
64 | end;
65 |
66 | function TFiles.RetrieveInformation(const FileId: String): TArray;
67 | begin
68 |
69 | end;
70 |
71 | procedure TFiles.SetFileId(const Value: String);
72 | begin
73 | FFileId := Value;
74 | end;
75 |
76 | procedure TFiles.UploadFile(const FileName: String);
77 | var
78 | AId: String;
79 | begin
80 | SetFileId(AId);
81 | end;
82 |
83 | end.
84 |
--------------------------------------------------------------------------------
/Lib/MLOpenAI.Finetunes.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2021-2022 Magno Lima - www.MagnumLabs.com.br - Version 1.0
3 |
4 | Delphi libraries for using OpenAI's GPT-3 api
5 |
6 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
7 | which means that this a public dedication tool, which allows creators to
8 | give up their copyright and put their works into the worldwide public domain.
9 | You're allowed to distribute, remix, adapt, and build upon the material
10 | in any medium or format, with no conditions.
11 |
12 | Feel free to open a push request if there's anything you want
13 | to contribute.
14 |
15 | https://beta.openai.com/docs/api-reference/fine-tunes/create
16 |
17 | *************************************************
18 | TODO: We can't go on until Files are ready (WIP)
19 | *************************************************
20 | *)
21 | unit MLOpenAI.Finetunes;
22 |
23 | interface
24 |
25 | uses
26 | System.SysUtils, REST.Client, REST.Types, System.JSON, MLOpenAI.Files, MLOpenAI.Types;
27 |
28 | type
29 | TArrayOfSingle = Array of Single;
30 |
31 | type
32 | TFinetunes = class
33 |
34 | private
35 | FTrainingFile: String;
36 | FValidationFile: String;
37 | FModel: String;
38 | FEpochs: Integer;
39 | FBatchSize: Integer;
40 | FNEpochs: Integer;
41 | FLearningRateMultiplier: Single;
42 | FPromptLossWeight: Single;
43 | FComputeClassificationMetrics: Single;
44 | FClassificationNClasses: Integer;
45 | FClassificationBetas: TArrayOfSingle;
46 | FClassificationPositiveClass: String;
47 | FSuffix: String;
48 | property TrainingFile: String read FTrainingFile write FTrainingFile;
49 | property ValidationFile: String read FValidationFile write FValidationFile;
50 | property Model: String read FModel write FModel;
51 | property NEpochs: Integer read FNEpochs write FNEpochs;
52 | property BatchSize: Integer read FBatchSize write FBatchSize;
53 | property LearningRateMultiplier: Single read FLearningRateMultiplier write FLearningRateMultiplier;
54 | property PromptLossWeight: Single read FPromptLossWeight write FPromptLossWeight;
55 | property ComputeClassificationMetrics: Single read FComputeClassificationMetrics write FComputeClassificationMetrics;
56 | property ClassificationNClasses: Integer read FClassificationNClasses write FClassificationNClasses;
57 | property ClassificationPositiveClass: String read FClassificationPositiveClass write FClassificationPositiveClass;
58 | property ClassificationBetas: TArrayOfSingle read FClassificationBetas write FClassificationBetas;
59 | property Suffix: String read FSuffix write FSuffix;
60 | end;
61 |
62 | implementation
63 |
64 | end.
65 |
--------------------------------------------------------------------------------
/Lib/MLOpenAI.Images.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2023 Magno Lima - www.MagnumLabs.com.br - Version 1.0
3 |
4 | Delphi libraries for using OpenAI's GPT-3 api
5 |
6 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
7 | which means that this a public dedication tool, which allows creators to
8 | give up their copyright and put their works into the worldwide public domain.
9 | You're allowed to distribute, remix, adapt, and build upon the material
10 | in any medium or format, with no conditions.
11 |
12 | Feel free if there's anything you want to contribute.
13 |
14 | https://platform.openai.com/docs/api-reference/images
15 |
16 | *)
17 | unit MLOpenAI.Images;
18 |
19 | {$DEFINE FMX}
20 |
21 | interface
22 |
23 | uses
24 | System.SysUtils, REST.Client, REST.Types, System.JSON, System.Classes,
25 | System.NetEncoding,
26 | {$IFDEF FMX}
27 | FMX.Objects,
28 | {$ELSE}
29 | Vcl.ExtCtrls,
30 | {$IFEND}
31 | FMX.Surfaces, FMX.Graphics,
32 | MLOpenAI.Types;
33 |
34 | type
35 | TDecodedImage = record
36 | FileName: String;
37 | B64Json: String;
38 | end;
39 |
40 | type
41 | TImageSize = (is256x256, is512x512, is1024x1024);
42 |
43 | type
44 | TResponseFormat = (rfUrl, rfB64Json);
45 |
46 | type
47 | TImageFileName = record
48 | FileName: String;
49 | SanitizedUrl: String;
50 | end;
51 |
52 | type
53 | TImages = class
54 | private
55 | FFileName: String;
56 | FPurpose: TFilePurpose;
57 | FFileId: String;
58 | FUser: String;
59 | FPrompt: String;
60 | FResponseFormat: TResponseFormat;
61 | FSize: TImageSize;
62 | FNumberOfImages: Integer;
63 | FImageB64Json: String;
64 | procedure SetFileId(const Value: String);
65 | procedure SetUser(const Value: String);
66 | procedure SetPrompt(const Value: String);
67 | procedure SetResponseFormat(const Value: TResponseFormat);
68 | procedure SetImageSize(const Value: TImageSize);
69 | procedure SetNumberOfImages(const Value: Integer);
70 | procedure SetImageB64Json(const Value: String);
71 | function ExtractImageMeta: TArray;
72 | class procedure DecodeToFile(const ASource, AFileName: string); static;
73 | public
74 | destructor Destroy; override;
75 | constructor Create(AUser: String);
76 | property Prompt: String read FPrompt write SetPrompt;
77 | property NumberOfImages: Integer read FNumberOfImages write SetNumberOfImages;
78 | property Size: TImageSize read FSize write SetImageSize;
79 | property ResponseFormat: TResponseFormat read FResponseFormat write SetResponseFormat;
80 | property User: String read FUser write SetUser;
81 | property ImageB64Json: String read FImageB64Json write SetImageB64Json;
82 | procedure GenerateImages(var ABody: String);
83 | class function ExtractImageFileName(url: String): TImageFileName; static;
84 | function DecodeJsonToFile(const Path: String): TArray;
85 | end;
86 |
87 | implementation
88 |
89 | { TImages }
90 |
91 | function TImages.ExtractImageMeta: TArray;
92 | var
93 | jso: TJSONObject;
94 | jsa: TJSONArray;
95 | s, Data: string;
96 | I: Integer;
97 | begin
98 | jso := TJSONObject.ParseJSONValue(FImageB64Json) as TJSONObject;
99 | if jso <> nil then
100 | try
101 | s := jso.GetValue('created');
102 | jsa := jso.GetValue('data') as TJSONArray;
103 | if jsa <> nil then
104 | begin
105 | if jsa.Count > 0 then
106 | begin
107 | SetLength(Result, jsa.Count);
108 | for I := 0 to jsa.Count - 1 do
109 | begin
110 | Result[I].FileName := Format('%s_%d.png', [s, I + 1]);
111 | Result[I].B64Json := jso.GetValue('data[' + I.ToString + '].b64_json');
112 | end;
113 |
114 | end;
115 | end;
116 | finally
117 | jso.Free;
118 | end;
119 | end;
120 |
121 | class function TImages.ExtractImageFileName(url: String): TImageFileName;
122 | var
123 | tmp, Value: String;
124 | I: Integer;
125 | values: TArray;
126 | begin
127 | tmp := StringReplace(url, '\/', '/', [rfReplaceAll]);
128 | Result.SanitizedUrl := tmp;
129 |
130 | values := tmp.Split(['?']);
131 | for Value in values do
132 | begin
133 | if Value.Contains('.png') then
134 | tmp := Value;
135 | end;
136 | I := LastDelimiter('/', tmp);
137 |
138 | Result.FileName := tmp.Substring(I);
139 | end;
140 |
141 | class procedure TImages.DecodeToFile(const ASource, AFileName: string);
142 | var
143 | LStream: TMemoryStream;
144 | LBytes: TBytes;
145 | begin
146 | LStream := TMemoryStream.Create;
147 | try
148 | LBytes := TNetEncoding.Base64.DecodeStringToBytes(ASource);
149 | LStream.Write(LBytes, Length(LBytes));
150 | LStream.SaveToFile(AFileName);
151 | finally
152 | LStream.Free;
153 | end;
154 | end;
155 |
156 | function TImages.DecodeJsonToFile(const Path: String): TArray;
157 | var
158 | i: integer;
159 | DecodedImage: TDecodedImage;
160 | ListDecodedImage: TArray;
161 | begin
162 | ListDecodedImage := ExtractImageMeta();
163 | SetLength(Result, Length(ListDecodedImage));
164 | i := 0;
165 | for DecodedImage in ListDecodedImage do
166 | begin
167 | Result[i] := Path + DecodedImage.FileName;
168 | DecodeToFile(DecodedImage.B64Json, Path + DecodedImage.FileName);
169 | inc(i);
170 | end;
171 | end;
172 |
173 | procedure TImages.SetFileId(const Value: String);
174 | begin
175 | FFileId := Value;
176 | end;
177 |
178 | procedure TImages.SetImageB64Json(const Value: String);
179 | begin
180 | FImageB64Json := Value;
181 | end;
182 |
183 | procedure TImages.SetImageSize(const Value: TImageSize);
184 | begin
185 | FSize := Value;
186 | end;
187 |
188 | procedure TImages.SetNumberOfImages(const Value: Integer);
189 | var
190 | lValue: Integer;
191 | begin
192 | lValue := Value;
193 | if (Value < 0) or (Value > 10) then
194 | lValue := 1;
195 | FNumberOfImages := lValue;
196 | end;
197 |
198 | procedure TImages.SetPrompt(const Value: String);
199 | begin
200 | if Value.Length > 1000 then
201 | raise Exception.Create('Prompt is limited to 1000 characters');
202 | FPrompt := Value;
203 | end;
204 |
205 | procedure TImages.SetResponseFormat(const Value: TResponseFormat);
206 | begin
207 | FResponseFormat := Value;
208 | end;
209 |
210 | procedure TImages.SetUser(const Value: String);
211 | begin
212 | FUser := Value;
213 | end;
214 |
215 | procedure TImages.GenerateImages(var ABody: String);
216 | var
217 | AJSONObject: TJSONObject;
218 | JSONArray: TJSONArray;
219 | Value, Stop: String;
220 |
221 | function getSize: String;
222 | begin
223 | case FSize of
224 | is256x256:
225 | Result := '512x512';
226 | is512x512:
227 | Result := '512x512';
228 | is1024x1024:
229 | Result := '1024x1024';
230 | end;
231 | end;
232 |
233 | begin
234 | AJSONObject := TJSONObject.Create;
235 | JSONArray := nil;
236 | try
237 | AJSONObject.AddPair(TJSONPair.Create('prompt', FPrompt));
238 | AJSONObject.AddPair(TJSONPair.Create('n', TJSONNumber.Create(FNumberOfImages)));
239 | AJSONObject.AddPair(TJSONPair.Create('size', getSize()));
240 |
241 | case ResponseFormat of
242 | rfUrl:
243 | AJSONObject.AddPair(TJSONPair.Create('response_format', 'url'));
244 | rfB64Json:
245 | AJSONObject.AddPair(TJSONPair.Create('response_format', 'b64_json'));
246 | end;
247 |
248 | AJSONObject.AddPair(TJSONPair.Create('user', FUser));
249 |
250 | ABody := UTF8ToString(AJSONObject.ToJSON);
251 |
252 | finally
253 | AJSONObject.Free;
254 | AJSONObject := nil;
255 | JSONArray := nil;
256 | end;
257 |
258 | end;
259 |
260 | constructor TImages.Create(AUser: String);
261 | begin
262 | FPrompt := '';
263 | FNumberOfImages := 1;
264 | FSize := is256x256;
265 | FResponseFormat := TResponseFormat.rfB64Json;
266 | FUser := AUser;
267 | end;
268 |
269 | destructor TImages.Destroy;
270 | begin
271 | inherited;
272 | end;
273 |
274 | end.
275 |
--------------------------------------------------------------------------------
/Lib/MLOpenAI.Types.pas:
--------------------------------------------------------------------------------
1 | (*
2 | (C)2021-2023 Magno Lima - www.MagnumLabs.com.br - Version 1.0
3 |
4 | Delphi libraries for using OpenAI's GPT-3 api
5 |
6 | This library is licensed under Creative Commons CC-0 (aka CC Zero),
7 | which means that this a public dedication tool, which allows creators to
8 | give up their copyright and put their works into the worldwide public domain.
9 | You're allowed to distribute, remix, adapt, and build upon the material
10 | in any medium or format, with no conditions.
11 |
12 | Feel free if there's anything you want to contribute.
13 | *)
14 | {$DEFINE USE_ALL_ENGINES}
15 | unit MLOpenAi.Types;
16 |
17 | interface
18 |
19 | const
20 | OAI_ENDPOINT = 'https://api.openai.com/v1';
21 | OAI_GET_ENGINES = '/engines';
22 | OAI_GET_COMPLETION = '/completions';
23 | OAI_GET_CHAT = '/chat/completions';
24 | OAI_SEARCH = '/search';
25 | OAI_CLASSIFICATIONS = '/classifications';
26 | OAI_ANSWER = '/answers';
27 | OAI_FILES = '/files';
28 | OAI_FINETUNES = '/fine-tunes';
29 | OAI_IMAGES = '/images/generations';
30 | TFilePurposeName: TArray = ['answer', 'search', 'classification', 'finetune'];
31 | TOAI_CHAT_MODEL: TArray = ['gpt-3.5-turbo', 'gpt-3.5-turbo-0301'];
32 | {$IFDEF USE_ALL_ENGINES}
33 | TOAIEngineName: TArray = ['gpt-3.5-turbo', 'text-davinci-003', 'text-davinci-002', 'code-davinci-002', 'text-davinci-001',
34 | 'text-curie-001', 'text-babbage-001', 'text-ada-001'];
35 | {$ELSE}
36 | TOAIEngineName: TArray = ['gpt-3.5-turbo', 'text-davinci-003', 'text-davinci-002', 'code-davinci-002'];
37 | {$ENDIF}
38 |
39 | type
40 | {$IFDEF USE_ALL_ENGINES}
41 | TOAIEngine = (egGPT3_5Turbo = 0, egTextDavinci003 = 1, egTextDavinci002 = 2, egCodeDavinci002 = 3, egTextDavinci001 = 4,
42 | egTextCurie001 = 5, egTextBabbage001 = 6, egTextAda001 = 7);
43 | {$ELSE}
44 | TOAIEngine = (egGPT3_5Turbo = 0, egTextDavinci003 = 1, egTextDavinci002 = 2, egCodeDavinci002 = 3);
45 | {$ENDIF}
46 | TOAChatModel = (cmGPT3_5Turbo = 0, cmGPT3_5Turbo_0301 = 1);
47 |
48 | TOAIEngineHelper = record Helper for TOAIEngine
49 | function ToString: string;
50 | end;
51 |
52 | TOAIRequests = (orNone, rAuth, orEngines, orCompletions, orSearch, rClassifications, orAnswers, orFiles, orFinetunes, orImages, orChat);
53 | TFilePurpose = (fpAnswer = 0, fpSearch = 1, fpClassification = 2, fpFineTune = 3);
54 |
55 | TFileDescription = record
56 | Id: Integer;
57 | Filename: String;
58 | Purpose: TFilePurpose;
59 | end;
60 |
61 | implementation
62 |
63 | { TOAIEngineHelper }
64 |
65 | function TOAIEngineHelper.ToString: string;
66 | begin
67 | Result := TOAIEngineName[ord(Self)];
68 | end;
69 |
70 | end.
71 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OpenAI-Delphi
2 | **A simple wrapper for the GPT-3 OpenAI API using Delphi.**
3 |
4 | **2023-10-03 - Demo is now working with ChatGPT**
5 |
6 | This library should wrapper all the API requests. All the returning data will be translated into a memory table/dataset for easly of handling.
7 |
8 | We are going to cover the following requests:
9 |
10 | 1. Engines ✓
11 | 2. Completions ✓
12 | 3. Search
13 | 4. Classifications
14 | 5. Answers
15 | 6. Files
16 | 7. Images ✓
17 | 8. Chat ✓
18 |
19 | The demo provided still doesn't have the Chat API yet, so follow the lib, it's a bit similar the Completions.
20 |
21 | **IMPORTANT**: to use GPT-3 you'll need to have your own API key. Please go to https://www.openai.com/.
22 |
23 | Understand that I am not an AI (even GPT-3) expert. This work was done so I could learn about. Please follow the OpenAI documentation for doubts. Eventually Not all the features/attributes could be available througout the requests.
24 |
25 | Simple example of use:
26 |
27 | Initialize the wrapper:
28 | ```delphi
29 | // Store your key safely. Never share or expose it!
30 | procedure TfrmDemoOpenAI.InitOpenAI;
31 | begin
32 | OpenAIKey := TFile.ReadAllText(API_KEY);
33 | OpenAI := TOpenAI.Create(FDMemTable1);
34 | OpenAI.APIKey := OpenAIKey;
35 | OpenAI.Endpoint := OpenAI_PATH;
36 | OpenAI.Engine := TOAIEngine.egTextDavinci002;
37 | OpenAI.OnResponse := OnOpenAIResponse;
38 | end;
39 | ```
40 |
41 | Example on how to use ChatGPT:
42 | See: https://platform.openai.com/docs/guides/chat/introduction
43 | ```delphi
44 | procedure TfrmDemoOpenAI.CreateChatGPT;
45 | begin
46 | OpenAI.Engine := TOAIEngine.egGPT3_5Turbo;
47 | OpenAI.RequestType := orChat;
48 |
49 | OpenAI.Chat.ClearMessages;
50 |
51 | OpenAI.Chat.AddMessage('You are a helpful assistant.', TMessageRole.mrSystem);
52 | OpenAI.Chat.AddMessage('Who won the world series in 2020?', TMessageRole.mrUser);
53 | OpenAI.Chat.AddMessage('The Los Angeles Dodgers won the World Series in 2020.', TMessageRole.mrAssistant);
54 |
55 | TThread.CreateAnonymousThread(
56 | procedure
57 | begin
58 | OpenAI.Execute;
59 | end).Start;
60 | end;
61 |
62 | procedure TfrmDemoOpenAI.OnOpenAIResponse(Sender: TObject);
63 | var
64 | lResponses: TArray;
65 | text: String;
66 | begin
67 | lResponses := OpenAI.GetChatResult;
68 | for texto in lResponses do
69 | Memo1.lines.add(Texto + #13);
70 | Memo1.lines.add('');
71 | end;
72 | ```
73 |
74 | Example on how to create an completion:
75 | ```delphi
76 | procedure TfrmDemoOpenAI.CreateCompletions;
77 | var
78 | Completions: TCompletions;
79 | begin
80 | Completions := TCompletions.Create;
81 | Completions.Prompt := 'Once upon a time';
82 | Completions.MaxTokens := 64;
83 | Completions.SamplingTemperature := 1; // Default 1
84 | Completions.NucleusSampling := 1; // top_p
85 |
86 | // Do the job!
87 | OpenAI.RequestType := rCompletions;
88 | OpenAI.Execute;
89 | end;
90 | ````
91 |
92 | Quite easy, right? Well, feel free to open a push request if there's anything you want to contribute.
93 |
94 | -----------
95 | This library is licensed under Creative Commons CC-0 (aka CC Zero), which means that this a public dedication tool, which allows creators to give up their copyright and put their works into the worldwide public domain. You're allowed to distribute, remix, adapt, and build upon the material in any medium or format, with no conditions.
96 |
--------------------------------------------------------------------------------