From 793581060aefcf66bd1b3fc011ef49bad61d1128 Mon Sep 17 00:00:00 2001 From: rezonated <37521206+rezonated@users.noreply.github.com> Date: Sat, 21 Jan 2023 04:01:10 +0700 Subject: [PATCH] Added function to convert base64 Created functional test for completion, edits and embeddings TODO: functional test for files, fine tune, image and moderations --- Config/DefaultUnrealOpenAI.ini | 4 +- Content/Maps/_Sandbox/BP_SandboxPawn.uasset | Bin 220092 -> 267675 bytes Content/Test/BP_FunctionalTestPawn.uasset | Bin 0 -> 22763 bytes Content/Test/BP_TestMapGameMode.uasset | Bin 0 -> 19342 bytes Content/Test/TestMap.umap | Bin 0 -> 17786 bytes .../Private/Proxies/CompletionProxies.cpp | 2 +- .../Private/Proxies/EmbeddingsProxies.cpp | 1 - .../ChatbotDemo/ChatbotDemoWidget.cpp | 4 +- .../Tests/Actors/FunctionalTestPawn.cpp | 184 ++++++++++++++++++ .../CompletionFunctionalTest.cpp | 25 +++ .../FunctionalTests/EditsFunctionalTest.cpp | 26 +++ .../EmbeddingsFunctionalTest.cpp | 29 +++ .../OpenAIFunctionalTestBase.cpp | 71 +++++++ .../Private/Utils/UnrealOpenAIUtils.cpp | 12 +- .../Public/DataTypes/CommonDataTypes.h | 27 ++- .../Public/DataTypes/CompletionDataTypes.h | 4 +- .../Public/DataTypes/EditsDataTypes.h | 4 +- .../Public/DataTypes/EmbeddingsDataTypes.h | 2 +- .../Public/DataTypes/FilesDataTypes.h | 4 +- .../Public/DataTypes/FineTuneDataTypes.h | 14 +- .../Public/DataTypes/ImageDataTypes.h | 4 +- .../Public/DataTypes/ModerationDataTypes.h | 2 +- .../Public/Tests/Actors/FunctionalTestPawn.h | 68 +++++++ .../CompletionFunctionalTest.h | 25 +++ .../FunctionalTests/EditsFunctionalTest.h | 25 +++ .../EmbeddingsFunctionalTest.h | 22 +++ .../OpenAIFunctionalTestBase.h | 39 ++++ .../Public/Utils/UnrealOpenAIUtils.h | 3 + Source/UnrealOpenAI/Public/Utils/Utils.h | 3 +- Source/UnrealOpenAI/UnrealOpenAI.Build.cs | 2 +- 30 files changed, 576 insertions(+), 30 deletions(-) create mode 100644 Content/Test/BP_FunctionalTestPawn.uasset create mode 100644 Content/Test/BP_TestMapGameMode.uasset create mode 100644 Content/Test/TestMap.umap create mode 100644 Source/UnrealOpenAI/Private/Tests/Actors/FunctionalTestPawn.cpp create mode 100644 Source/UnrealOpenAI/Private/Tests/FunctionalTests/CompletionFunctionalTest.cpp create mode 100644 Source/UnrealOpenAI/Private/Tests/FunctionalTests/EditsFunctionalTest.cpp create mode 100644 Source/UnrealOpenAI/Private/Tests/FunctionalTests/EmbeddingsFunctionalTest.cpp create mode 100644 Source/UnrealOpenAI/Private/Tests/FunctionalTests/OpenAIFunctionalTestBase.cpp create mode 100644 Source/UnrealOpenAI/Public/Tests/Actors/FunctionalTestPawn.h create mode 100644 Source/UnrealOpenAI/Public/Tests/FunctionalTests/CompletionFunctionalTest.h create mode 100644 Source/UnrealOpenAI/Public/Tests/FunctionalTests/EditsFunctionalTest.h create mode 100644 Source/UnrealOpenAI/Public/Tests/FunctionalTests/EmbeddingsFunctionalTest.h create mode 100644 Source/UnrealOpenAI/Public/Tests/FunctionalTests/OpenAIFunctionalTestBase.h diff --git a/Config/DefaultUnrealOpenAI.ini b/Config/DefaultUnrealOpenAI.ini index 69bb390..21700ca 100644 --- a/Config/DefaultUnrealOpenAI.ini +++ b/Config/DefaultUnrealOpenAI.ini @@ -3,4 +3,6 @@ +FunctionRedirects=(OldName="/Script/UnrealOpenAI.ListFineTuneEventsResultsProxy.ListFineTuneEventsResults",NewName="/Script/UnrealOpenAI.ListFineTuneEventsProxy.ListFineTuneEvents") +ClassRedirects=(OldName="/Script/UnrealOpenAI.ListFineTuneEventsResultsProxy",NewName="/Script/UnrealOpenAI.ListFineTuneEventsProxy") +ClassRedirects=(OldName="/Script/UnrealOpenAI.DeleteFineTuneModelResultsProxy",NewName="/Script/UnrealOpenAI.DeleteFineTuneModelProxy") -+FunctionRedirects=(OldName="/Script/UnrealOpenAI.UnrealOpenAIUtils.ConvertToTexture2D",NewName="/Script/UnrealOpenAI.UnrealOpenAIUtils.ConvertBytesToTexture2D") \ No newline at end of file ++FunctionRedirects=(OldName="/Script/UnrealOpenAI.UnrealOpenAIUtils.ConvertToTexture2D",NewName="/Script/UnrealOpenAI.UnrealOpenAIUtils.ConvertBytesToTexture2D") ++PropertyRedirects=(OldName="/Script/UnrealOpenAI.FunctionalTestPawn.CompletionFunctionalTest",NewName="/Script/UnrealOpenAI.FunctionalTestPawn.CreateCompletionFunctionalTest") ++FunctionRedirects=(OldName="/Script/UnrealOpenAI.FunctionalTestPawn.StartCompletionTest",NewName="/Script/UnrealOpenAI.FunctionalTestPawn.StartCreateCompletionTest") \ No newline at end of file diff --git a/Content/Maps/_Sandbox/BP_SandboxPawn.uasset b/Content/Maps/_Sandbox/BP_SandboxPawn.uasset index ffa4d23811a107baf807abaff1a12b513290a019..9d0707c8558b074b22113f1c140646d38620138e 100644 GIT binary patch literal 267675 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%0A5W=r#d1 zgl*O6twGxO^tr5Fhuh<{ zIRZYHIEEjJrlZ=za&W*Nz$DcUv*~n^=Djktv@|(vQb%gjll};t&LO}ccpsI+gtmnn3Ipnf=>SJ zXfGHhE{`%OUnq@z4vH6a74}I0B%-H#Nx&1bukFvNC zyU!Vp1Vh1K$VFBrMBcyMABl7i=O2dzzq#QP+a6!98h`HBi|+W-nhT!6T4HTGTi-8s zJ9+-~8y|Y`85dN4S9$+|LqMC{GGpi8;RyR2;fTv=w>#Y)PtfilTO9F)$is3{K6(S$ zbHjW`zT5Avy&nH%+=4B3+op1}z7C@@L+2mo8#B&-#_un-#Rl(yI%yxhPSHw>f6G9C zNx%mPZ+%extp2+nGV0FFTK@F!AATRh<=?OU=f|^V-xj#;v$kKZ{&dAxTt2w>%pd=8 z`_i%J)W5Uix!azd;PR&17asEZl^>3~ZvH`2*4*Lsa{1mTygL7=>5Io)c*H9|wGN!~ z3zx5cpMCtJ$jD$`{wq3WjcogD%uT1PSa8wmPmbgE zo7(=h>gfK~sym0@zQ5Pkx0%a(C7jD{ta^6LUtE{?&RTJ@I2S7x^tvxr4c%s!$fD@N zubO_W5RYgZ2?v)M(bTA{8*VAm)}bpH3DTjopxx;Y+WmenZAJw`PMhE7vwN&1MLjmV zFB0-u!%lxF;`Q4jVSm`^4Fp^vhnHfju=jtor6`s*M}Bz;!4kP2w9gd@qq1%o%!X~Q zaKLG!05%i|y6rBfpEiiXevc#U@mPJ4(zX;mHajJ7h*$iMkl!A#TkQd-16D8Wj@Uys z&;Kx(EoEtQwHjdLmVKb(iEfgo2-B{g-4pRT>5MHU7kz$T$mX?qDUc1iZM4x_lEixH zEI}|xhhRc(n~P4x*sLCGNt1;RI=z0kTR1QBq)2mxKdptdm#73PXqyUF=qQ`}HDk26 zqLk&$HBNw$TlNhPK=*F4ybfO|V)xL|ExX<0_Ibme5FJi(`T`-V+ZpkBBPA`blcb;W z&@Lx!JCj28dICW|9nuc_Y;-i)WA%vTo!H(?do>%%^5*&&Sl-;SZg|$i>+*#oPN&C7 zF0j`XwE1iyf5cBKVWndNp-5@=))TQ=UEzqGQkOPLulwjUejw=d*<2AikMFeE{�R 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 diff --git a/Content/Test/BP_FunctionalTestPawn.uasset b/Content/Test/BP_FunctionalTestPawn.uasset new file mode 100644 index 0000000000000000000000000000000000000000..bca6d7bed166ba0f2400a62bc15be66048b77d1f GIT binary patch literal 22763 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 literal 0 HcmV?d00001 diff --git a/Content/Test/BP_TestMapGameMode.uasset b/Content/Test/BP_TestMapGameMode.uasset new file mode 100644 index 0000000000000000000000000000000000000000..8ac10b257bceca33b8f0847f7c7545f040dfaa2a GIT binary patch literal 19342 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 O4tVjY3_hWN{Qm)jZ*`>r literal 0 HcmV?d00001 diff --git a/Source/UnrealOpenAI/Private/Proxies/CompletionProxies.cpp b/Source/UnrealOpenAI/Private/Proxies/CompletionProxies.cpp index 5c4c05a..223f358 100644 --- a/Source/UnrealOpenAI/Private/Proxies/CompletionProxies.cpp +++ b/Source/UnrealOpenAI/Private/Proxies/CompletionProxies.cpp @@ -63,7 +63,7 @@ void UCreateCompletionRequestProxy::Activate() OnFailure.Broadcast(FCreateCompletionResponse(), ResponseString, ErrorMessage); return; } - + FCreateCompletionResponse CreateCompletionResponse; if (FJsonObjectConverter::JsonObjectStringToUStruct(ResponseString, &CreateCompletionResponse, 0, 0)) { diff --git a/Source/UnrealOpenAI/Private/Proxies/EmbeddingsProxies.cpp b/Source/UnrealOpenAI/Private/Proxies/EmbeddingsProxies.cpp index cddd2c0..ed40bcb 100644 --- a/Source/UnrealOpenAI/Private/Proxies/EmbeddingsProxies.cpp +++ b/Source/UnrealOpenAI/Private/Proxies/EmbeddingsProxies.cpp @@ -32,7 +32,6 @@ void UCreateEmbeddingsRequestProxy::Activate() OnFailure.Broadcast(FCreateEmbeddingsResponse(), TEXT(""), TEXT("Input is empty")); return; } - FString JSONPayload; FCreateEmbeddingsRequest RequestPayload; diff --git a/Source/UnrealOpenAI/Private/SampleContent/ChatbotDemo/ChatbotDemoWidget.cpp b/Source/UnrealOpenAI/Private/SampleContent/ChatbotDemo/ChatbotDemoWidget.cpp index 469bfc0..02f7e21 100644 --- a/Source/UnrealOpenAI/Private/SampleContent/ChatbotDemo/ChatbotDemoWidget.cpp +++ b/Source/UnrealOpenAI/Private/SampleContent/ChatbotDemo/ChatbotDemoWidget.cpp @@ -131,8 +131,8 @@ void UChatbotDemoWidget::SetInstruction(FString NewInstruction) void UChatbotDemoWidget::OnCompletionResponse(FCreateCompletionResponse Response, FString JSONString, FString Error) { - AddAIResponse(Response.choices.text); - Instruction += Response.choices.text + LINE_TERMINATOR + "Q: "; + AddAIResponse(Response.choices[0].text); + Instruction += Response.choices[0].text + LINE_TERMINATOR + "Q: "; ToggleUserInput(true); } diff --git a/Source/UnrealOpenAI/Private/Tests/Actors/FunctionalTestPawn.cpp b/Source/UnrealOpenAI/Private/Tests/Actors/FunctionalTestPawn.cpp new file mode 100644 index 0000000..fd237d0 --- /dev/null +++ b/Source/UnrealOpenAI/Private/Tests/Actors/FunctionalTestPawn.cpp @@ -0,0 +1,184 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + +#include "Tests/Actors/FunctionalTestPawn.h" + +#include "Enums/CompletionEnums.h" +#include "Proxies/CompletionProxies.h" +#include "Proxies/EditsProxies.h" +#include "Proxies/EmbeddingsProxies.h" +#include "Tests/FunctionalTests/CompletionFunctionalTest.h" +#include "Tests/FunctionalTests/EditsFunctionalTest.h" +#include "Tests/FunctionalTests/EmbeddingsFunctionalTest.h" + + +AFunctionalTestPawn::AFunctionalTestPawn() +{ + PrimaryActorTick.bCanEverTick = false; +} + + +void AFunctionalTestPawn::StartCreateCompletionTest(FString Prompt) +{ + if (!CreateCompletionFunctionalTest) + return; + + if (Prompt.IsEmpty() || Prompt.Len() <= 0 || Prompt == TEXT("")) + { + CreateCompletionFunctionalTest->FailTest(TEXT("Prompt is empty")); + } + + const auto Proxy = UCreateCompletionRequestProxy::CreateCompletion(this, Prompt, ECompletionModel::ECM_Davinci); + + if (!Proxy) + { + CreateCompletionFunctionalTest->FailTest(TEXT("Failed to create completion request proxy")); + return; + } + + Proxy->OnSuccess.AddDynamic(this, &AFunctionalTestPawn::OnCompletionSuccess); + + Proxy->OnFailure.AddDynamic(this, &AFunctionalTestPawn::OnCompletionFailure); + + Proxy->Activate(); +} + +void AFunctionalTestPawn::OnCompletionSuccess(FCreateCompletionResponse Response, FString JSONString, FString Error) +{ + if (JSONString.IsEmpty()) + { + CreateCompletionFunctionalTest->FailTest(TEXT("No JSON String returned")); + return; + } + + if (!Error.IsEmpty()) + { + CreateCompletionFunctionalTest->FailTest(TEXT("Error returned")); + return; + } + + if (Response.choices[0].text.IsEmpty()) + { + CreateCompletionFunctionalTest->FailTest(TEXT("No response text returned")); + return; + } + + CreateCompletionFunctionalTest->PassTest(FString::Printf(TEXT("Response text returned %s"), *Response.choices[0].text)); +} + +void AFunctionalTestPawn::OnCompletionFailure(FCreateCompletionResponse Response, FString JSONString, FString Error) +{ + CreateCompletionFunctionalTest->FailTest(TEXT("Should not fire failure delegate")); +} + +void AFunctionalTestPawn::StartCreateEditsTest(FString Input, FString Instruction) +{ + if (!CreateEditsFunctionalTest) + return; + + if (Input.IsEmpty() || Input.Len() <= 0 || Input == TEXT("")) + { + CreateEditsFunctionalTest->FailTest(TEXT("Input is empty")); + return; + } + + if (Instruction.IsEmpty() || Instruction.Len() <= 0 || Instruction == TEXT("")) + { + CreateEditsFunctionalTest->FailTest(TEXT("Instruction is empty")); + return; + } + + const auto Proxy = UCreateEditsRequestProxy::CreateEdits(this, Input, Instruction); + + if (!Proxy) + { + CreateEditsFunctionalTest->FailTest(TEXT("Failed to create edits request proxy")); + return; + } + + Proxy->OnSuccess.AddDynamic(this, &AFunctionalTestPawn::OnEditsSuccess); + Proxy->OnFailure.AddDynamic(this, &AFunctionalTestPawn::OnEditsFailure); + + Proxy->Activate(); +} + +void AFunctionalTestPawn::OnEditsSuccess(FCreateEditsResponse Response, FString JSONString, FString Error) +{ + if (JSONString.IsEmpty()) + { + CreateEditsFunctionalTest->FailTest(TEXT("No JSON String returned")); + return; + } + + if (!Error.IsEmpty()) + { + CreateEditsFunctionalTest->FailTest(TEXT("Error returned")); + return; + } + if (Response.choices[0].text.IsEmpty()) + { + CreateEditsFunctionalTest->FailTest(TEXT("No response text returned")); + return; + } + + CreateEditsFunctionalTest->PassTest(FString::Printf(TEXT("Response text returned %s"), *Response.choices[0].text)); +} + +void AFunctionalTestPawn::OnEditsFailure(FCreateEditsResponse Response, FString JSONString, FString Error) +{ + CreateEditsFunctionalTest->FailTest(TEXT("Should not fire failure delegate")); +} + +void AFunctionalTestPawn::StartCreateEmbeddingsTest(FString Input) +{ + if (!CreateEmbeddingsFunctionalTest) + { + return; + } + + if (Input.IsEmpty() || Input.Len() <= 0 || Input == TEXT("")) + { + CreateEmbeddingsFunctionalTest->FailTest(TEXT("Input is empty")); + return; + } + + const auto Proxy = UCreateEmbeddingsRequestProxy::CreateEmbeddings(this, Input); + + if (!Proxy) + { + CreateEmbeddingsFunctionalTest->FailTest(TEXT("Failed to create embeddings request proxy")); + return; + } + + Proxy->OnSuccess.AddDynamic(this, &AFunctionalTestPawn::OnEmbeddingsSuccess); + Proxy->OnFailure.AddDynamic(this, &AFunctionalTestPawn::OnEmbeddingsFailure); + + Proxy->Activate(); +} + +void AFunctionalTestPawn::OnEmbeddingsSuccess(FCreateEmbeddingsResponse Response, FString JSONString, FString Error) +{ + if (JSONString.IsEmpty()) + { + CreateEmbeddingsFunctionalTest->FailTest(TEXT("No JSON String returned")); + return; + } + + if (!Error.IsEmpty()) + { + CreateEmbeddingsFunctionalTest->FailTest(TEXT("Error returned")); + return; + } + + if (Response.data.Num() < 0) + { + CreateEmbeddingsFunctionalTest->FailTest(TEXT("No response data returned")); + return; + } + + CreateEmbeddingsFunctionalTest->PassTest(FString::Printf(TEXT("Response data returned with length of %d"), Response.data.Num())); +} + +void AFunctionalTestPawn::OnEmbeddingsFailure(FCreateEmbeddingsResponse Response, FString JSONString, FString Error) +{ + CreateEmbeddingsFunctionalTest->FailTest(TEXT("Should not fire failure delegate")); +} diff --git a/Source/UnrealOpenAI/Private/Tests/FunctionalTests/CompletionFunctionalTest.cpp b/Source/UnrealOpenAI/Private/Tests/FunctionalTests/CompletionFunctionalTest.cpp new file mode 100644 index 0000000..2a2185d --- /dev/null +++ b/Source/UnrealOpenAI/Private/Tests/FunctionalTests/CompletionFunctionalTest.cpp @@ -0,0 +1,25 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + + +#include "Tests/FunctionalTests/CompletionFunctionalTest.h" + +#include "Tests/Actors/FunctionalTestPawn.h" + +ACreateCompletionFunctionalTest::ACreateCompletionFunctionalTest() +{ + PrimaryActorTick.bCanEverTick = false; +} + +void ACreateCompletionFunctionalTest::OnTestStartHandler() +{ + Super::OnTestStartHandler(); + if (!TestPawn) + { + FailTest(TEXT("TestPawn is not set")); + return; + } + + TestPawn->CreateCompletionFunctionalTest = this; + + TestPawn->StartCreateCompletionTest("Say this is a test"); +} \ No newline at end of file diff --git a/Source/UnrealOpenAI/Private/Tests/FunctionalTests/EditsFunctionalTest.cpp b/Source/UnrealOpenAI/Private/Tests/FunctionalTests/EditsFunctionalTest.cpp new file mode 100644 index 0000000..8281b79 --- /dev/null +++ b/Source/UnrealOpenAI/Private/Tests/FunctionalTests/EditsFunctionalTest.cpp @@ -0,0 +1,26 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + + +#include "Tests/FunctionalTests/EditsFunctionalTest.h" + +#include "Tests/Actors/FunctionalTestPawn.h" + +ACreateEditsFunctionalTest::ACreateEditsFunctionalTest() +{ + PrimaryActorTick.bCanEverTick = false; +} + +void ACreateEditsFunctionalTest::OnTestStartHandler() +{ + Super::OnTestStartHandler(); + + if (!TestPawn) + { + FailTest("TestPawn is not set"); + return; + } + + TestPawn->CreateEditsFunctionalTest = this; + + TestPawn->StartCreateEditsTest("What day of the wek is it?", "Fix the spelling mistakes"); +} diff --git a/Source/UnrealOpenAI/Private/Tests/FunctionalTests/EmbeddingsFunctionalTest.cpp b/Source/UnrealOpenAI/Private/Tests/FunctionalTests/EmbeddingsFunctionalTest.cpp new file mode 100644 index 0000000..193a21f --- /dev/null +++ b/Source/UnrealOpenAI/Private/Tests/FunctionalTests/EmbeddingsFunctionalTest.cpp @@ -0,0 +1,29 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + + +#include "Tests/FunctionalTests/EmbeddingsFunctionalTest.h" + +#include "Tests/Actors/FunctionalTestPawn.h" + + +ACreateEmbeddingsFunctionalTest::ACreateEmbeddingsFunctionalTest() +{ + PrimaryActorTick.bCanEverTick = false; +} + +void ACreateEmbeddingsFunctionalTest::OnTestStartHandler() +{ + Super::OnTestStartHandler(); + + if (!TestPawn) + { + FailTest("TestPawn is not set"); + return; + } + + TestPawn->CreateEmbeddingsFunctionalTest = this; + + TestPawn->StartCreateEmbeddingsTest(TEXT("The food was delicious and the waiter...")); +} + + diff --git a/Source/UnrealOpenAI/Private/Tests/FunctionalTests/OpenAIFunctionalTestBase.cpp b/Source/UnrealOpenAI/Private/Tests/FunctionalTests/OpenAIFunctionalTestBase.cpp new file mode 100644 index 0000000..809d325 --- /dev/null +++ b/Source/UnrealOpenAI/Private/Tests/FunctionalTests/OpenAIFunctionalTestBase.cpp @@ -0,0 +1,71 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + + +#include "Tests/FunctionalTests/OpenAIFunctionalTestBase.h" + +#include "Kismet/GameplayStatics.h" +#include "Kismet/KismetSystemLibrary.h" +#include "Utils/Utils.h" + +AOpenAIFunctionalTestBase::AOpenAIFunctionalTestBase() +{ + PrimaryActorTick.bCanEverTick = true; +} + +void AOpenAIFunctionalTestBase::OnTestPrepareHandler() +{ + PrintDebugLogAndOnScreen("OnTestPrepareHandler"); + + StartTest(); +} + +void AOpenAIFunctionalTestBase::BeginPlay() +{ + Super::BeginPlay(); + + PrintDebugLogAndOnScreen("BeginPlay"); + + OnTestPrepare.AddDynamic(this, &AOpenAIFunctionalTestBase::OnTestPrepareHandler); + + OnTestStart.AddDynamic(this, &AOpenAIFunctionalTestBase::OnTestStartHandler); +} + +void AOpenAIFunctionalTestBase::OnTestStartHandler() +{ + PrintDebugLogAndOnScreen("Test started"); +} + +void AOpenAIFunctionalTestBase::PrepareTest() +{ + Super::PrepareTest(); + + PrintDebugLogAndOnScreen("PrepareTest"); +} + +bool AOpenAIFunctionalTestBase::IsReady_Implementation() +{ + return true; +} + +void AOpenAIFunctionalTestBase::StartTest() +{ + Super::StartTest(); + + PrintDebugLogAndOnScreen("StartTest"); +} + +void AOpenAIFunctionalTestBase::FailTest(FString Message) +{ + FinishTest(EFunctionalTestResult::Failed, Message); + + UKismetSystemLibrary::QuitGame(GetWorld(), UGameplayStatics::GetPlayerController(GetWorld(), 0), EQuitPreference::Quit, false); +} + +void AOpenAIFunctionalTestBase::PassTest(FString Message) +{ + FinishTest(EFunctionalTestResult::Succeeded, Message); + + UKismetSystemLibrary::QuitGame(GetWorld(), UGameplayStatics::GetPlayerController(GetWorld(), 0), EQuitPreference::Quit, false); +} + + diff --git a/Source/UnrealOpenAI/Private/Utils/UnrealOpenAIUtils.cpp b/Source/UnrealOpenAI/Private/Utils/UnrealOpenAIUtils.cpp index 85f3c8a..115e2c6 100644 --- a/Source/UnrealOpenAI/Private/Utils/UnrealOpenAIUtils.cpp +++ b/Source/UnrealOpenAI/Private/Utils/UnrealOpenAIUtils.cpp @@ -164,11 +164,21 @@ bool UUnrealOpenAIUtils::ConvertBase64ToTexture2D(FString Base64Data, UTexture2D if(Base64Data.IsEmpty()) return false; TArray FileData; - if(!FBase64::Decode(Base64Data, FileData)) return false; + + if (!ConvertBase64ToBytes(Base64Data, FileData)) + return false; return ConvertBytesToTexture2D(FileData, OutTexture); } +bool UUnrealOpenAIUtils::ConvertBase64ToBytes(FString Base64Data, TArray& OutBytes) +{ + OutBytes.Empty(); + if(Base64Data.IsEmpty()) return false; + + return FBase64::Decode(Base64Data, OutBytes); +} + void UUnrealOpenAIUtilsGetImageFromURL::OnProcessRequestComplete( TSharedPtr HttpRequest, TSharedPtr HttpResponse, bool bSuccessful) diff --git a/Source/UnrealOpenAI/Public/DataTypes/CommonDataTypes.h b/Source/UnrealOpenAI/Public/DataTypes/CommonDataTypes.h index 7aef961..6b91bd4 100644 --- a/Source/UnrealOpenAI/Public/DataTypes/CommonDataTypes.h +++ b/Source/UnrealOpenAI/Public/DataTypes/CommonDataTypes.h @@ -5,6 +5,23 @@ #include "CoreMinimal.h" #include "CommonDataTypes.generated.h" +USTRUCT(BlueprintType) +struct FLogprobs +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Logprobs") + TArray tokens; + + UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Logprobs") + TArray token_logprobs; + + TArray> top_logprobs; + + UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Logprobs") + TArray text_offset; +}; + USTRUCT(BlueprintType) struct FChoice { @@ -13,10 +30,10 @@ struct FChoice FString text; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Choice") - int index; + int index {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Choice") - int logprobs; + FLogprobs logprobs; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Choice") FString finish_reason; @@ -48,10 +65,10 @@ struct FOpenAIFile FString object; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | File") - int32 bytes; + int32 bytes {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | File") - int32 created_at; + int32 created_at {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | File") FString filename; @@ -90,7 +107,7 @@ struct FDeleteResponse FString object; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Delete Response") - bool deleted; + bool deleted {false}; }; USTRUCT(BlueprintType) diff --git a/Source/UnrealOpenAI/Public/DataTypes/CompletionDataTypes.h b/Source/UnrealOpenAI/Public/DataTypes/CompletionDataTypes.h index 6f2cca8..95d81c9 100644 --- a/Source/UnrealOpenAI/Public/DataTypes/CompletionDataTypes.h +++ b/Source/UnrealOpenAI/Public/DataTypes/CompletionDataTypes.h @@ -70,13 +70,13 @@ struct FCreateCompletionResponse FString object; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "OpenAI | Create Completion Response") - int32 created; + int32 created {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "OpenAI | Create Completion Response") FString model; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "OpenAI | Create Completion Response") - FChoice choices; + TArray choices; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "OpenAI | Create Completion Response") FUsage usage; diff --git a/Source/UnrealOpenAI/Public/DataTypes/EditsDataTypes.h b/Source/UnrealOpenAI/Public/DataTypes/EditsDataTypes.h index 2c518aa..19c1ac7 100644 --- a/Source/UnrealOpenAI/Public/DataTypes/EditsDataTypes.h +++ b/Source/UnrealOpenAI/Public/DataTypes/EditsDataTypes.h @@ -37,10 +37,10 @@ struct FCreateEditsResponse FString object; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Create Edits Response") - int32 created; + int32 created {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Create Edits Response") - FChoice choices; + TArray choices; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Create Edits Response") FUsage usage; diff --git a/Source/UnrealOpenAI/Public/DataTypes/EmbeddingsDataTypes.h b/Source/UnrealOpenAI/Public/DataTypes/EmbeddingsDataTypes.h index 64b0505..42dbb61 100644 --- a/Source/UnrealOpenAI/Public/DataTypes/EmbeddingsDataTypes.h +++ b/Source/UnrealOpenAI/Public/DataTypes/EmbeddingsDataTypes.h @@ -18,7 +18,7 @@ struct FEmbeddingData TArray embedding; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Embedding Data") - int index; + int index {0}; }; diff --git a/Source/UnrealOpenAI/Public/DataTypes/FilesDataTypes.h b/Source/UnrealOpenAI/Public/DataTypes/FilesDataTypes.h index 045887c..52127ae 100644 --- a/Source/UnrealOpenAI/Public/DataTypes/FilesDataTypes.h +++ b/Source/UnrealOpenAI/Public/DataTypes/FilesDataTypes.h @@ -44,10 +44,10 @@ struct FFileResponse FString object; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | File Response") - int32 bytes; + int32 bytes {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | File Response") - int32 created_at; + int32 created_at {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | File Response") FString filename; diff --git a/Source/UnrealOpenAI/Public/DataTypes/FineTuneDataTypes.h b/Source/UnrealOpenAI/Public/DataTypes/FineTuneDataTypes.h index 2f27b1a..7dd0a09 100644 --- a/Source/UnrealOpenAI/Public/DataTypes/FineTuneDataTypes.h +++ b/Source/UnrealOpenAI/Public/DataTypes/FineTuneDataTypes.h @@ -15,7 +15,7 @@ struct FFineTuneEvent FString object; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Fine Tune Event") - int32 created_at; + int32 created_at {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Fine Tune Event") FString level; @@ -36,10 +36,10 @@ struct FFineTune FString object; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Fine Tune") - int32 created_at; + int32 created_at {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Fine Tune") - int32 updated_at; + int32 updated_at {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Fine Tune") FString model; @@ -83,16 +83,16 @@ struct FCreateFineTuneRequest FString model; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Create Fine Tune Request") - int n_epochs = 4; + int n_epochs {4}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Create Fine Tune Request") - int batch_size; + int batch_size {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Create Fine Tune Request") - float learning_rate_multiplier; + float learning_rate_multiplier {1.0f}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Open AI | Create Fine Tune Request") - float prompt_loss_weight; + float prompt_loss_weight {.01f}; TOptional compute_classification_metrics = false; diff --git a/Source/UnrealOpenAI/Public/DataTypes/ImageDataTypes.h b/Source/UnrealOpenAI/Public/DataTypes/ImageDataTypes.h index 3f2d8f9..7339100 100644 --- a/Source/UnrealOpenAI/Public/DataTypes/ImageDataTypes.h +++ b/Source/UnrealOpenAI/Public/DataTypes/ImageDataTypes.h @@ -81,7 +81,7 @@ struct FCreateImageResponseURL GENERATED_BODY() UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Create Image Response URL") - int32 created; + int32 created {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Create Image Response URL") TArray data; @@ -93,7 +93,7 @@ struct FCreateImageResponseBase64JSON GENERATED_BODY() UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Create Image Response Base64 JSON") - int32 created; + int32 created {0}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Create Image Response Base64 JSON") TArray data; diff --git a/Source/UnrealOpenAI/Public/DataTypes/ModerationDataTypes.h b/Source/UnrealOpenAI/Public/DataTypes/ModerationDataTypes.h index 1c70e94..1757e63 100644 --- a/Source/UnrealOpenAI/Public/DataTypes/ModerationDataTypes.h +++ b/Source/UnrealOpenAI/Public/DataTypes/ModerationDataTypes.h @@ -13,7 +13,7 @@ struct FModerationResult GENERATED_BODY() UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Moderation Result") - bool flagged; + bool flagged {false}; UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="Open AI | Moderation Result") TMap categories; diff --git a/Source/UnrealOpenAI/Public/Tests/Actors/FunctionalTestPawn.h b/Source/UnrealOpenAI/Public/Tests/Actors/FunctionalTestPawn.h new file mode 100644 index 0000000..ec9d936 --- /dev/null +++ b/Source/UnrealOpenAI/Public/Tests/Actors/FunctionalTestPawn.h @@ -0,0 +1,68 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + +#pragma once + +#include "CoreMinimal.h" +#include "DataTypes/CompletionDataTypes.h" +#include "DataTypes/EditsDataTypes.h" +#include "DataTypes/EmbeddingsDataTypes.h" +#include "GameFramework/Pawn.h" +#include "FunctionalTestPawn.generated.h" + +UCLASS() +class UNREALOPENAI_API AFunctionalTestPawn : public APawn +{ + GENERATED_BODY() + +public: + // Sets default values for this pawn's properties + AFunctionalTestPawn(); + +#pragma region Completion + + UPROPERTY() + class ACreateCompletionFunctionalTest* CreateCompletionFunctionalTest; + + UFUNCTION() + void StartCreateCompletionTest(FString Prompt); + + UFUNCTION() + void OnCompletionSuccess(FCreateCompletionResponse Response, FString JSONString, FString Error); + + UFUNCTION() + void OnCompletionFailure(FCreateCompletionResponse Response, FString JSONString, FString Error); + +#pragma endregion + +#pragma region Edits + + UPROPERTY() + class ACreateEditsFunctionalTest* CreateEditsFunctionalTest; + + UFUNCTION() + void StartCreateEditsTest(FString Input, FString Instruction); + + UFUNCTION() + void OnEditsSuccess(FCreateEditsResponse Response, FString JSONString, FString Error); + + UFUNCTION() + void OnEditsFailure(FCreateEditsResponse Response, FString JSONString, FString Error); + +#pragma endregion + +#pragma region Embeddings + + UPROPERTY() + class ACreateEmbeddingsFunctionalTest* CreateEmbeddingsFunctionalTest; + + UFUNCTION() + void StartCreateEmbeddingsTest(FString Input); + UFUNCTION() + void OnEmbeddingsSuccess(FCreateEmbeddingsResponse Response, FString JSONString, FString Error); + UFUNCTION() + void OnEmbeddingsFailure(FCreateEmbeddingsResponse Response, FString JSONString, FString Error); + + +#pragma endregion + +}; diff --git a/Source/UnrealOpenAI/Public/Tests/FunctionalTests/CompletionFunctionalTest.h b/Source/UnrealOpenAI/Public/Tests/FunctionalTests/CompletionFunctionalTest.h new file mode 100644 index 0000000..b04542b --- /dev/null +++ b/Source/UnrealOpenAI/Public/Tests/FunctionalTests/CompletionFunctionalTest.h @@ -0,0 +1,25 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + +#pragma once + +#include "CoreMinimal.h" +#include "OpenAIFunctionalTestBase.h" +#include "CompletionFunctionalTest.generated.h" + +/** + * + */ +UCLASS() +class UNREALOPENAI_API ACreateCompletionFunctionalTest : public AOpenAIFunctionalTestBase +{ + GENERATED_BODY() + +public: + + ACreateCompletionFunctionalTest(); + + virtual void OnTestStartHandler() override; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Open AI - Completion") + class AFunctionalTestPawn* TestPawn; +}; diff --git a/Source/UnrealOpenAI/Public/Tests/FunctionalTests/EditsFunctionalTest.h b/Source/UnrealOpenAI/Public/Tests/FunctionalTests/EditsFunctionalTest.h new file mode 100644 index 0000000..85ac740 --- /dev/null +++ b/Source/UnrealOpenAI/Public/Tests/FunctionalTests/EditsFunctionalTest.h @@ -0,0 +1,25 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + +#pragma once + +#include "CoreMinimal.h" +#include "OpenAIFunctionalTestBase.h" +#include "UObject/Object.h" +#include "EditsFunctionalTest.generated.h" + +/** + * + */ +UCLASS() +class UNREALOPENAI_API ACreateEditsFunctionalTest : public AOpenAIFunctionalTestBase +{ + GENERATED_BODY() + +public: + ACreateEditsFunctionalTest(); + + virtual void OnTestStartHandler() override; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Open AI - Edits") + class AFunctionalTestPawn* TestPawn; +}; diff --git a/Source/UnrealOpenAI/Public/Tests/FunctionalTests/EmbeddingsFunctionalTest.h b/Source/UnrealOpenAI/Public/Tests/FunctionalTests/EmbeddingsFunctionalTest.h new file mode 100644 index 0000000..18a09d6 --- /dev/null +++ b/Source/UnrealOpenAI/Public/Tests/FunctionalTests/EmbeddingsFunctionalTest.h @@ -0,0 +1,22 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + +#pragma once + +#include "CoreMinimal.h" +#include "OpenAIFunctionalTestBase.h" +#include "GameFramework/Actor.h" +#include "EmbeddingsFunctionalTest.generated.h" + +UCLASS() +class UNREALOPENAI_API ACreateEmbeddingsFunctionalTest : public AOpenAIFunctionalTestBase +{ + GENERATED_BODY() + +public: + ACreateEmbeddingsFunctionalTest(); + + virtual void OnTestStartHandler() override; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Open AI - Edits") + class AFunctionalTestPawn* TestPawn; +}; diff --git a/Source/UnrealOpenAI/Public/Tests/FunctionalTests/OpenAIFunctionalTestBase.h b/Source/UnrealOpenAI/Public/Tests/FunctionalTests/OpenAIFunctionalTestBase.h new file mode 100644 index 0000000..2320b36 --- /dev/null +++ b/Source/UnrealOpenAI/Public/Tests/FunctionalTests/OpenAIFunctionalTestBase.h @@ -0,0 +1,39 @@ +// Created, maintained by Vanan A. - rezonated @ github.com + +#pragma once + +#include "CoreMinimal.h" +#include "FunctionalTest.h" +#include "OpenAIFunctionalTestBase.generated.h" + +/** + * + */ +UCLASS() +class UNREALOPENAI_API AOpenAIFunctionalTestBase : public AFunctionalTest +{ + GENERATED_BODY() + +public: + AOpenAIFunctionalTestBase(); + + UFUNCTION() + void OnTestPrepareHandler(); + virtual void BeginPlay() override; + + UFUNCTION() + virtual void OnTestStartHandler(); + + virtual void PrepareTest() override; + + virtual bool IsReady_Implementation() override; + + virtual void StartTest() override; + + UFUNCTION() + virtual void FailTest(FString Message); + + UFUNCTION() + virtual void PassTest(FString Message); + +}; diff --git a/Source/UnrealOpenAI/Public/Utils/UnrealOpenAIUtils.h b/Source/UnrealOpenAI/Public/Utils/UnrealOpenAIUtils.h index b961caf..3781354 100644 --- a/Source/UnrealOpenAI/Public/Utils/UnrealOpenAIUtils.h +++ b/Source/UnrealOpenAI/Public/Utils/UnrealOpenAIUtils.h @@ -30,6 +30,9 @@ class UNREALOPENAI_API UUnrealOpenAIUtils : public UObject UFUNCTION(BlueprintCallable, Category = "UnrealOpenAIUtils", meta=(ExpandBoolAsExecs="ReturnValue")) static bool ConvertBase64ToTexture2D(FString Base64Data, UTexture2D*& OutTexture); + + UFUNCTION(BlueprintCallable, Category = "UnrealOpenAIUtils", meta=(ExpandBoolAsExecs="ReturnValue")) + static bool ConvertBase64ToBytes(FString Base64Data, TArray& OutBytes); }; diff --git a/Source/UnrealOpenAI/Public/Utils/Utils.h b/Source/UnrealOpenAI/Public/Utils/Utils.h index fb9a9aa..b9cda3e 100644 --- a/Source/UnrealOpenAI/Public/Utils/Utils.h +++ b/Source/UnrealOpenAI/Public/Utils/Utils.h @@ -5,6 +5,7 @@ #include "Engine/Classes/Engine/Texture2D.h" #include "Engine/Public/ImageUtils.h" #include "HttpModule.h" +#include "JsonObjectConverter.h" #include "UnrealOpenAI.h" #include "Config/UnrealOpenAIConfig.h" #include "Constants/UtilsConstants.h" @@ -21,7 +22,7 @@ static void PrintDebugOnScreen(const FString& Message, const float Duration = 2. static void PrintDebugLog(const FString& Message) { - UE_LOG(LogTypeOpenAI, Warning, TEXT("%s"), *Message); + UE_LOG(LogTypeOpenAI, Display, TEXT("%s"), *Message); } static void PrintDebugLogAndOnScreen(const FString& Message, const float Duration = 2.f, const FColor& Color = FColor::White) diff --git a/Source/UnrealOpenAI/UnrealOpenAI.Build.cs b/Source/UnrealOpenAI/UnrealOpenAI.Build.cs index e20241d..9a08213 100644 --- a/Source/UnrealOpenAI/UnrealOpenAI.Build.cs +++ b/Source/UnrealOpenAI/UnrealOpenAI.Build.cs @@ -25,7 +25,7 @@ public UnrealOpenAI(ReadOnlyTargetRules Target) : base(Target) PublicDependencyModuleNames.AddRange( new string[] { - "Core", "Engine", "Json", "JsonUtilities", "HTTP", "CoreUObject", "Sockets", "Networking", "UMG" + "Core", "Engine", "Json", "JsonUtilities", "HTTP", "CoreUObject", "Sockets", "Networking", "UMG", "FunctionalTesting" // ... add other public dependencies that you statically link with here ... } );