├── .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 |
frmDemoOpenAI
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 | --------------------------------------------------------------------------------