Skip to content
This repository was archived by the owner on Oct 11, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions HttpGPT.uplugin
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"FileVersion": 3,
"Version": 14,
"VersionName": "1.5.1",
"Version": 15,
"VersionName": "1.5.2",
"FriendlyName": "HttpGPT - GPT Integration",
"Description": "HttpGPT is an Unreal Engine plugin that facilitates integration with OpenAI's GPT based services (ChatGPT and DALL-E) through asynchronous REST requests, making it easy for developers to communicate with these services. HttpGPT also includes new Editor Tools to integrate Chat GPT and DALL-E image generation directly in the Engine.",
"Category": "Game Features",
Expand Down
26 changes: 20 additions & 6 deletions Source/HttpGPTChatModule/Private/Tasks/HttpGPTChatRequest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,18 @@ UHttpGPTChatRequest* UHttpGPTChatRequest::SendMessages_CustomOptions(UObject* Wo

bool UHttpGPTChatRequest::CanActivateTask() const
{
return Super::CanActivateTask() && !HttpGPT::Internal::HasEmptyParam(Messages);
if (!Super::CanActivateTask())
{
return false;
}

if (HttpGPT::Internal::HasEmptyParam(Messages))
{
UE_LOG(LogHttpGPT, Error, TEXT("%s (%d): Can't activate task: Invalid Messages."), *FString(__func__), GetUniqueID());
return false;
}

return true;
}

bool UHttpGPTChatRequest::CanBindProgress() const
Expand All @@ -83,13 +94,13 @@ const FHttpGPTChatOptions UHttpGPTChatRequest::GetChatOptions() const
return ChatOptions;
}

void UHttpGPTChatRequest::SetRequestContent()
FString UHttpGPTChatRequest::SetRequestContent()
{
FScopeLock Lock(&Mutex);

if (!HttpRequest.IsValid())
{
return;
return FString();
}

UE_LOG(LogHttpGPT_Internal, Display, TEXT("%s (%d): Mounting content"), *FString(__func__), GetUniqueID());
Expand All @@ -100,9 +111,9 @@ void UHttpGPTChatRequest::SetRequestContent()
JsonRequest->SetNumberField("temperature", GetChatOptions().Temperature);
JsonRequest->SetNumberField("top_p", GetChatOptions().TopP);
JsonRequest->SetNumberField("n", GetChatOptions().Choices);
JsonRequest->SetBoolField("stream", GetChatOptions().bStream);
JsonRequest->SetNumberField("presence_penalty", GetChatOptions().PresencePenalty);
JsonRequest->SetNumberField("frequency_penalty", GetChatOptions().FrequencyPenalty);
JsonRequest->SetBoolField("stream", GetChatOptions().bStream);

if (!HttpGPT::Internal::HasEmptyParam(GetCommonOptions().User))
{
Expand All @@ -123,9 +134,9 @@ void UHttpGPTChatRequest::SetRequestContent()
if (!HttpGPT::Internal::HasEmptyParam(GetChatOptions().LogitBias))
{
TSharedPtr<FJsonObject> LogitBiasJson = MakeShareable(new FJsonObject());
for (auto Iterator = GetChatOptions().LogitBias.CreateConstIterator(); Iterator; ++Iterator)
for (const TPair<int32, float>& Iterator : GetChatOptions().LogitBias)
{
LogitBiasJson->SetNumberField(FString::FromInt(Iterator.Key()), Iterator.Value());
LogitBiasJson->SetNumberField(FString::FromInt(Iterator.Key), Iterator.Value);
}

JsonRequest->SetObjectField("logit_bias", LogitBiasJson);
Expand All @@ -134,6 +145,7 @@ void UHttpGPTChatRequest::SetRequestContent()
if (UHttpGPTHelper::ModelSupportsChat(GetChatOptions().Model))
{
UE_LOG(LogHttpGPT_Internal, Display, TEXT("%s (%d): Selected model supports Chat API. Mounting section history."), *FString(__func__), GetUniqueID());

TArray<TSharedPtr<FJsonValue>> MessagesJson;
for (const FHttpGPTChatMessage& Iterator : Messages)
{
Expand All @@ -153,6 +165,8 @@ void UHttpGPTChatRequest::SetRequestContent()
FJsonSerializer::Serialize(JsonRequest.ToSharedRef(), Writer);

HttpRequest->SetContentAsString(RequestContentString);

return RequestContentString;
}

void UHttpGPTChatRequest::OnProgressUpdated(const FString& Content, int32 BytesSent, int32 BytesReceived)
Expand Down
2 changes: 1 addition & 1 deletion Source/HttpGPTChatModule/Public/Tasks/HttpGPTChatRequest.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class HTTPGPTCHATMODULE_API UHttpGPTChatRequest : public UHttpGPTBaseTask
virtual bool CanBindProgress() const override;
virtual FString GetEndpointURL() const override;

virtual void SetRequestContent() override;
virtual FString SetRequestContent() override;
virtual void OnProgressUpdated(const FString& Content, int32 BytesSent, int32 BytesReceived) override;
virtual void OnProgressCompleted(const FString& Content, const bool bWasSuccessful) override;

Expand Down
11 changes: 9 additions & 2 deletions Source/HttpGPTCommonModule/Private/Tasks/HttpGPTBaseTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,13 @@ void UHttpGPTBaseTask::PrePIEEnded(bool bIsSimulating)

bool UHttpGPTBaseTask::CanActivateTask() const
{
return !HttpGPT::Internal::HasEmptyParam(GetCommonOptions().APIKey);
if (HttpGPT::Internal::HasEmptyParam(GetCommonOptions().APIKey))
{
UE_LOG(LogHttpGPT, Error, TEXT("%s (%d): Can't activate task: Invalid API Key."), *FString(__func__), GetUniqueID());
return false;
}

return true;
}

bool UHttpGPTBaseTask::CanBindProgress() const
Expand Down Expand Up @@ -214,7 +220,7 @@ void UHttpGPTBaseTask::SendRequest()
FScopeLock Lock(&Mutex);

InitializeRequest();
SetRequestContent();
const FString ContentString = SetRequestContent();
BindRequestCallbacks();

if (!HttpRequest.IsValid())
Expand All @@ -237,6 +243,7 @@ void UHttpGPTBaseTask::SendRequest()
if (HttpRequest->ProcessRequest())
{
UE_LOG(LogHttpGPT, Display, TEXT("%s (%d): Request sent"), *FString(__func__), GetUniqueID());
UE_LOG(LogHttpGPT_Internal, Display, TEXT("%s (%d): Request content body:\n%s"), *FString(__func__), GetUniqueID(), *ContentString);

AsyncTask(ENamedThreads::GameThread,
[this]
Expand Down
2 changes: 1 addition & 1 deletion Source/HttpGPTCommonModule/Public/Tasks/HttpGPTBaseTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class HTTPGPTCOMMONMODULE_API UHttpGPTBaseTask : public UBlueprintAsyncActionBas
void InitializeRequest();
void BindRequestCallbacks();

virtual void SetRequestContent() {};
virtual FString SetRequestContent() { return FString(); };
virtual void OnProgressUpdated(const FString& Content, int32 BytesSent, int32 BytesReceived) {};
virtual void OnProgressCompleted(const FString& Content, const bool bWasSuccessful) {};

Expand Down
5 changes: 3 additions & 2 deletions Source/HttpGPTEditorModule/Private/SHttpGPTChatView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,10 +339,11 @@ FString SHttpGPTChatView::GetSystemContext() const
EngineVersion,
PluginShortName,
PluginInterface->GetDescriptor().VersionName,
PluginInterface->GetDescriptor().CreatedBy
PluginInterface->GetDescriptor().CreatedBy,
PluginInterface->GetDescriptor().Description
};

const FString PluginInformation = FString::Format(TEXT("You are in the Unreal Engine {0} plugin {1} version {2}, which was developed by {3}."), Arguments_PluginInfo);
const FString PluginInformation = FString::Format(TEXT("You are in the Unreal Engine {0} plugin {1} version {2}, which was developed by {3}. The description of HttpGPT is: \"{4}\""), Arguments_PluginInfo);

const FStringFormatOrderedArguments Arguments_SupportInfo{
PluginInterface->GetDescriptor().DocsURL,
Expand Down
19 changes: 16 additions & 3 deletions Source/HttpGPTImageModule/Private/Tasks/HttpGPTImageRequest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,18 @@ const FString UHttpGPTImageRequest::GetPrompt() const

bool UHttpGPTImageRequest::CanActivateTask() const
{
return Super::CanActivateTask() && !HttpGPT::Internal::HasEmptyParam(Prompt);
if (!Super::CanActivateTask())
{
return false;
}

if (HttpGPT::Internal::HasEmptyParam(Prompt))
{
UE_LOG(LogHttpGPT, Error, TEXT("%s (%d): Can't activate task: Invalid Prompt."), *FString(__func__), GetUniqueID());
return false;
}

return true;
}

bool UHttpGPTImageRequest::CanBindProgress() const
Expand All @@ -81,13 +92,13 @@ FString UHttpGPTImageRequest::GetEndpointURL() const
return "https://api.openai.com/v1/images/generations";
}

void UHttpGPTImageRequest::SetRequestContent()
FString UHttpGPTImageRequest::SetRequestContent()
{
FScopeLock Lock(&Mutex);

if (!HttpRequest.IsValid())
{
return;
return FString();
}

UE_LOG(LogHttpGPT_Internal, Display, TEXT("%s (%d): Mounting content"), *FString(__func__), GetUniqueID());
Expand All @@ -108,6 +119,8 @@ void UHttpGPTImageRequest::SetRequestContent()
FJsonSerializer::Serialize(JsonRequest.ToSharedRef(), Writer);

HttpRequest->SetContentAsString(RequestContentString);

return RequestContentString;
}

void UHttpGPTImageRequest::OnProgressCompleted(const FString& Content, const bool bWasSuccessful)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class HTTPGPTIMAGEMODULE_API UHttpGPTImageRequest : public UHttpGPTBaseTask
virtual bool CanBindProgress() const override;
virtual FString GetEndpointURL() const override;

virtual void SetRequestContent() override;
virtual FString SetRequestContent() override;
virtual void OnProgressCompleted(const FString& Content, const bool bWasSuccessful) override;

void DeserializeResponse(const FString& Content);
Expand Down