48class OPENAI_API UOpenAIProvider : public UObject
55 void SetAPI(
const TSharedPtr<OpenAI::IAPI>& API);
212 void PauseFineTuningJob(
const FString& FineTuneID,
const FOpenAIAuth& Auth);
213 void ResumeFineTuningJob(
const FString& FineTuneID,
const FOpenAIAuth& Auth);
561#define DEFINE_EVENT_GETTER(Name) \
563 FOn##Name& On##Name() { return Name; } \
569 FOnRequestError& OnRequestError() {
return RequestError; };
571#define DECLARE_HTTP_CALLBACK(Callback) virtual void Callback(FHttpRequestPtr Request, FHttpResponsePtr Response, bool WasSuccessful);
572#define DECLARE_HTTP_CALLBACK_PROGRESS(Callback) virtual void Callback(FHttpRequestPtr Request, uint64 BytesSent, uint64 BytesReceived);
574 DEFINE_EVENT_GETTER(ListModelsCompleted)
575 DEFINE_EVENT_GETTER(RetrieveModelCompleted)
576 DEFINE_EVENT_GETTER(CreateCompletionCompleted)
577 DEFINE_EVENT_GETTER(CreateCompletionStreamCompleted)
578 DEFINE_EVENT_GETTER(CreateCompletionStreamProgresses)
579 DEFINE_EVENT_GETTER(CreateChatCompletionCompleted)
580 DEFINE_EVENT_GETTER(CreateChatCompletionStreamCompleted)
581 DEFINE_EVENT_GETTER(CreateChatCompletionStreamProgresses)
582 DEFINE_EVENT_GETTER(CreateImageCompleted)
583 DEFINE_EVENT_GETTER(CreateImageEditCompleted)
584 DEFINE_EVENT_GETTER(CreateImageVariationCompleted)
585 DEFINE_EVENT_GETTER(CreateEmbeddingsCompleted)
586 DEFINE_EVENT_GETTER(CreateSpeechCompleted)
587 DEFINE_EVENT_GETTER(CreateAudioTranscriptionCompleted)
588 DEFINE_EVENT_GETTER(CreateAudioTranscriptionVerboseCompleted)
589 DEFINE_EVENT_GETTER(CreateAudioTranslationCompleted)
590 DEFINE_EVENT_GETTER(CreateVoiceCompleted)
591 DEFINE_EVENT_GETTER(ListFilesCompleted)
592 DEFINE_EVENT_GETTER(UploadFileCompleted)
593 DEFINE_EVENT_GETTER(DeleteFileCompleted)
594 DEFINE_EVENT_GETTER(RetrieveFileCompleted)
595 DEFINE_EVENT_GETTER(RetrieveFileContentCompleted)
596 DEFINE_EVENT_GETTER(CreateFineTuningJobCompleted)
597 DEFINE_EVENT_GETTER(ListFineTuningJobsCompleted)
598 DEFINE_EVENT_GETTER(ListFineTuningEventsCompleted)
599 DEFINE_EVENT_GETTER(ListFineTuningCheckpointsCompleted)
600 DEFINE_EVENT_GETTER(DeleteFineTunedModelCompleted)
601 DEFINE_EVENT_GETTER(CreateModerationsCompleted)
602 DEFINE_EVENT_GETTER(RetrieveFineTuningJobCompleted)
603 DEFINE_EVENT_GETTER(CancelFineTuningJobCompleted)
604 DEFINE_EVENT_GETTER(PauseFineTuningJobCompleted)
605 DEFINE_EVENT_GETTER(ResumeFineTuningJobCompleted)
606 DEFINE_EVENT_GETTER(ListBatchCompleted)
607 DEFINE_EVENT_GETTER(CreateBatchCompleted)
608 DEFINE_EVENT_GETTER(RetrieveBatchCompleted)
609 DEFINE_EVENT_GETTER(CancelBatchCompleted)
610 DEFINE_EVENT_GETTER(CreateUploadCompleted)
611 DEFINE_EVENT_GETTER(AddUploadPartCompleted)
612 DEFINE_EVENT_GETTER(CompleteUploadCompleted)
613 DEFINE_EVENT_GETTER(CancelUploadCompleted)
614 DEFINE_EVENT_GETTER(CreateAssistantCompleted)
615 DEFINE_EVENT_GETTER(ListAssistantsCompleted)
616 DEFINE_EVENT_GETTER(RetrieveAssistantCompleted)
617 DEFINE_EVENT_GETTER(ModifyAssistantCompleted)
618 DEFINE_EVENT_GETTER(DeleteAssistantCompleted)
619 DEFINE_EVENT_GETTER(CreateVideoCompleted)
620 DEFINE_EVENT_GETTER(RetrieveVideoCompleted)
621 DEFINE_EVENT_GETTER(ListVideosCompleted)
622 DEFINE_EVENT_GETTER(DeleteVideoCompleted)
623 DEFINE_EVENT_GETTER(RemixVideoCompleted)
624 DEFINE_EVENT_GETTER(DownloadVideoContentCompleted)
625 DEFINE_EVENT_GETTER(CreateEvalCompleted)
626 DEFINE_EVENT_GETTER(ListEvalsCompleted)
627 DEFINE_EVENT_GETTER(RetrieveEvalCompleted)
628 DEFINE_EVENT_GETTER(UpdateEvalCompleted)
629 DEFINE_EVENT_GETTER(DeleteEvalCompleted)
631 DEFINE_EVENT_GETTER(CreateVectorStoreCompleted)
632 DEFINE_EVENT_GETTER(ListVectorStoresCompleted)
633 DEFINE_EVENT_GETTER(RetrieveVectorStoreCompleted)
634 DEFINE_EVENT_GETTER(UpdateVectorStoreCompleted)
635 DEFINE_EVENT_GETTER(DeleteVectorStoreCompleted)
636 DEFINE_EVENT_GETTER(CreateVectorStoreFileCompleted)
637 DEFINE_EVENT_GETTER(ListVectorStoreFilesCompleted)
638 DEFINE_EVENT_GETTER(RetrieveVectorStoreFileCompleted)
639 DEFINE_EVENT_GETTER(DeleteVectorStoreFileCompleted)
640 DEFINE_EVENT_GETTER(CreateVectorStoreFileBatchCompleted)
641 DEFINE_EVENT_GETTER(RetrieveVectorStoreFileBatchCompleted)
642 DEFINE_EVENT_GETTER(CancelVectorStoreFileBatchCompleted)
643 DEFINE_EVENT_GETTER(SearchVectorStoreCompleted)
645 DEFINE_EVENT_GETTER(CreateChatKitSessionCompleted)
646 DEFINE_EVENT_GETTER(CancelChatKitSessionCompleted)
647 DEFINE_EVENT_GETTER(ListChatKitThreadsCompleted)
648 DEFINE_EVENT_GETTER(RetrieveChatKitThreadCompleted)
649 DEFINE_EVENT_GETTER(DeleteChatKitThreadCompleted)
650 DEFINE_EVENT_GETTER(ListChatKitThreadItemsCompleted)
652 DEFINE_EVENT_GETTER(CreateSkillCompleted)
653 DEFINE_EVENT_GETTER(ListSkillsCompleted)
654 DEFINE_EVENT_GETTER(RetrieveSkillCompleted)
655 DEFINE_EVENT_GETTER(UpdateSkillCompleted)
656 DEFINE_EVENT_GETTER(DeleteSkillCompleted)
657 DEFINE_EVENT_GETTER(RetrieveSkillContentCompleted)
658 DEFINE_EVENT_GETTER(CreateSkillVersionCompleted)
659 DEFINE_EVENT_GETTER(ListSkillVersionsCompleted)
660 DEFINE_EVENT_GETTER(RetrieveSkillVersionCompleted)
661 DEFINE_EVENT_GETTER(DeleteSkillVersionCompleted)
662 DEFINE_EVENT_GETTER(RetrieveSkillVersionContentCompleted)
664 DEFINE_EVENT_GETTER(CreateRealtimeClientSecretCompleted)
665 DEFINE_EVENT_GETTER(RealtimeAcceptCallCompleted)
666 DEFINE_EVENT_GETTER(RealtimeHangupCallCompleted)
667 DEFINE_EVENT_GETTER(RealtimeReferCallCompleted)
668 DEFINE_EVENT_GETTER(RealtimeRejectCallCompleted)
671 TSharedPtr<OpenAI::IAPI> API;
672 bool bLogEnabled{
true};
673 FOnRequestError RequestError;
675#define DECLARE_HTTP_CALLBACK(Callback) virtual void Callback(FHttpRequestPtr Request, FHttpResponsePtr Response, bool WasSuccessful);
676#define DECLARE_HTTP_CALLBACK_PROGRESS(Callback) virtual void Callback(FHttpRequestPtr Request, uint64 BytesSent, uint64 BytesReceived);
678 DECLARE_HTTP_CALLBACK(OnListModelsCompleted)
679 DECLARE_HTTP_CALLBACK(OnRetrieveModelCompleted)
680 DECLARE_HTTP_CALLBACK(OnCreateCompletionCompleted)
681 DECLARE_HTTP_CALLBACK(OnCreateCompletionStreamCompleted)
682 DECLARE_HTTP_CALLBACK_PROGRESS(OnCreateCompletionStreamProgress)
683 DECLARE_HTTP_CALLBACK(OnCreateChatCompletionCompleted)
684 DECLARE_HTTP_CALLBACK(OnCreateChatCompletionStreamCompleted)
685 DECLARE_HTTP_CALLBACK_PROGRESS(OnCreateChatCompletionStreamProgress)
686 DECLARE_HTTP_CALLBACK(OnCreateImageCompleted)
687 DECLARE_HTTP_CALLBACK(OnCreateImageEditCompleted)
688 DECLARE_HTTP_CALLBACK(OnCreateImageVariationCompleted)
689 DECLARE_HTTP_CALLBACK(OnCreateEmbeddingsCompleted)
690 DECLARE_HTTP_CALLBACK(OnCreateSpeechCompleted)
691 DECLARE_HTTP_CALLBACK(OnCreateAudioTranscriptionCompleted)
692 DECLARE_HTTP_CALLBACK(OnCreateAudioTranslationCompleted)
693 DECLARE_HTTP_CALLBACK(OnCreateVoiceCompleted)
694 DECLARE_HTTP_CALLBACK(OnListFilesCompleted)
695 DECLARE_HTTP_CALLBACK(OnUploadFileCompleted)
696 DECLARE_HTTP_CALLBACK(OnDeleteFileCompleted)
697 DECLARE_HTTP_CALLBACK(OnRetrieveFileCompleted)
698 DECLARE_HTTP_CALLBACK(OnRetrieveFileContentCompleted)
699 DECLARE_HTTP_CALLBACK(OnDeleteFineTunedModelCompleted)
700 DECLARE_HTTP_CALLBACK(OnCreateModerationsCompleted)
701 DECLARE_HTTP_CALLBACK(OnCreateFineTuningJobCompleted)
702 DECLARE_HTTP_CALLBACK(OnListFineTuningJobsCompleted)
703 DECLARE_HTTP_CALLBACK(OnListFineTuningEventsCompleted)
704 DECLARE_HTTP_CALLBACK(OnListFineTuningCheckpointsCompleted)
705 DECLARE_HTTP_CALLBACK(OnRetrieveFineTuningJobCompleted)
706 DECLARE_HTTP_CALLBACK(OnCancelFineTuningJobCompleted)
707 DECLARE_HTTP_CALLBACK(OnPauseFineTuningJobCompleted)
708 DECLARE_HTTP_CALLBACK(OnResumeFineTuningJobCompleted)
709 DECLARE_HTTP_CALLBACK(OnCreateBatchCompleted)
710 DECLARE_HTTP_CALLBACK(OnRetrieveBatchCompleted)
711 DECLARE_HTTP_CALLBACK(OnCancelBatchCompleted)
712 DECLARE_HTTP_CALLBACK(OnListBatchCompleted)
713 DECLARE_HTTP_CALLBACK(OnCreateUploadCompleted)
714 DECLARE_HTTP_CALLBACK(OnAddUploadPartCompleted)
715 DECLARE_HTTP_CALLBACK(OnCompleteUploadCompleted)
716 DECLARE_HTTP_CALLBACK(OnCancelUploadCompleted)
717 DECLARE_HTTP_CALLBACK(OnCreateAssistantCompleted)
718 DECLARE_HTTP_CALLBACK(OnListAssistantsCompleted)
719 DECLARE_HTTP_CALLBACK(OnRetrieveAssistantCompleted)
720 DECLARE_HTTP_CALLBACK(OnModifyAssistantCompleted)
721 DECLARE_HTTP_CALLBACK(OnDeleteAssistantCompleted)
722 DECLARE_HTTP_CALLBACK(OnCreateVideoCompleted)
723 DECLARE_HTTP_CALLBACK(OnRetrieveVideoCompleted)
724 DECLARE_HTTP_CALLBACK(OnListVideosCompleted)
725 DECLARE_HTTP_CALLBACK(OnDeleteVideoCompleted)
726 DECLARE_HTTP_CALLBACK(OnRemixVideoCompleted)
727 DECLARE_HTTP_CALLBACK(OnDownloadVideoContentCompleted)
728 DECLARE_HTTP_CALLBACK(OnCreateEvalCompleted)
729 DECLARE_HTTP_CALLBACK(OnListEvalsCompleted)
730 DECLARE_HTTP_CALLBACK(OnRetrieveEvalCompleted)
731 DECLARE_HTTP_CALLBACK(OnUpdateEvalCompleted)
732 DECLARE_HTTP_CALLBACK(OnDeleteEvalCompleted)
734 DECLARE_HTTP_CALLBACK(OnCreateVectorStoreCompleted)
735 DECLARE_HTTP_CALLBACK(OnListVectorStoresCompleted)
736 DECLARE_HTTP_CALLBACK(OnRetrieveVectorStoreCompleted)
737 DECLARE_HTTP_CALLBACK(OnUpdateVectorStoreCompleted)
738 DECLARE_HTTP_CALLBACK(OnDeleteVectorStoreCompleted)
739 DECLARE_HTTP_CALLBACK(OnCreateVectorStoreFileCompleted)
740 DECLARE_HTTP_CALLBACK(OnListVectorStoreFilesCompleted)
741 DECLARE_HTTP_CALLBACK(OnRetrieveVectorStoreFileCompleted)
742 DECLARE_HTTP_CALLBACK(OnDeleteVectorStoreFileCompleted)
743 DECLARE_HTTP_CALLBACK(OnCreateVectorStoreFileBatchCompleted)
744 DECLARE_HTTP_CALLBACK(OnRetrieveVectorStoreFileBatchCompleted)
745 DECLARE_HTTP_CALLBACK(OnCancelVectorStoreFileBatchCompleted)
746 DECLARE_HTTP_CALLBACK(OnSearchVectorStoreCompleted)
748 DECLARE_HTTP_CALLBACK(OnCreateChatKitSessionCompleted)
749 DECLARE_HTTP_CALLBACK(OnCancelChatKitSessionCompleted)
750 DECLARE_HTTP_CALLBACK(OnListChatKitThreadsCompleted)
751 DECLARE_HTTP_CALLBACK(OnRetrieveChatKitThreadCompleted)
752 DECLARE_HTTP_CALLBACK(OnDeleteChatKitThreadCompleted)
753 DECLARE_HTTP_CALLBACK(OnListChatKitThreadItemsCompleted)
755 DECLARE_HTTP_CALLBACK(OnCreateSkillCompleted)
756 DECLARE_HTTP_CALLBACK(OnListSkillsCompleted)
757 DECLARE_HTTP_CALLBACK(OnRetrieveSkillCompleted)
758 DECLARE_HTTP_CALLBACK(OnUpdateSkillCompleted)
759 DECLARE_HTTP_CALLBACK(OnDeleteSkillCompleted)
760 DECLARE_HTTP_CALLBACK(OnRetrieveSkillContentCompleted)
761 DECLARE_HTTP_CALLBACK(OnCreateSkillVersionCompleted)
762 DECLARE_HTTP_CALLBACK(OnListSkillVersionsCompleted)
763 DECLARE_HTTP_CALLBACK(OnRetrieveSkillVersionCompleted)
764 DECLARE_HTTP_CALLBACK(OnDeleteSkillVersionCompleted)
765 DECLARE_HTTP_CALLBACK(OnRetrieveSkillVersionContentCompleted)
767 DECLARE_HTTP_CALLBACK(OnCreateRealtimeClientSecretCompleted)
768 DECLARE_HTTP_CALLBACK(OnRealtimeAcceptCallCompleted)
769 DECLARE_HTTP_CALLBACK(OnRealtimeHangupCallCompleted)
770 DECLARE_HTTP_CALLBACK(OnRealtimeReferCallCompleted)
771 DECLARE_HTTP_CALLBACK(OnRealtimeRejectCallCompleted)
773 void ProcessRequest(FHttpRequestRef HttpRequest);
775 bool Success(FHttpResponsePtr Response,
bool WasSuccessful);
776 void Log(
const FString& Info)
const;
777 void LogResponse(FHttpResponsePtr Response)
const;
778 void LogError(
const FString& ErrorText)
const;
780 template <
typename OutStructType>
781 FString SerializeRequest(
const OutStructType& OutStruct)
const
783 TSharedPtr<FJsonObject> Json = FJsonObjectConverter::UStructToJsonObject(OutStruct);
784 UJsonFuncLib::RemoveEmptyArrays(Json);
785 FString RequestBodyStr;
786 UJsonFuncLib::JsonToString(Json, RequestBodyStr);
787 return RequestBodyStr;
790 FHttpRequestRef MakeRequestHeaders(
const FOpenAIAuth& Auth)
const;
793 template <
typename OutStructType>
794 FHttpRequestRef MakeRequest(
const OutStructType& OutStruct,
const FString& URL,
const FString& Method,
const FOpenAIAuth& Auth)
const
796 auto HttpRequest = MakeRequestHeaders(Auth);
797 HttpRequest->SetURL(URL);
798 HttpRequest->SetVerb(Method);
800 const FString Content = SerializeRequest(OutStruct);
801 Log(FString(
"Content: ").Append(Content));
803 const FString PostprocessedContent = UJsonFuncLib::RemoveOptionalValuesThatNotSet(Content);
804 Log(FString(
"Postprocessed content was set as: ").Append(PostprocessedContent));
806 HttpRequest->SetContentAsString(PostprocessedContent);
810 FHttpRequestRef MakeRequest(
const FString& URL,
const FString& Method,
const FOpenAIAuth& Auth)
const;
811 FHttpRequestRef MakeRequest(
813 FHttpRequestRef MakeRequest(
815 FHttpRequestRef MakeRequest(
const FCreateEval& CreateEval,
const FString& URL,
const FString& Method,
const FOpenAIAuth& Auth)
const;
816 FHttpRequestRef MakeRequest(
const FUpdateEval& UpdateEval,
const FString& URL,
const FString& Method,
const FOpenAIAuth& Auth)
const;
817 FHttpRequestRef MakeRequest(
819 FHttpRequestRef MakeRequest(
821 FHttpRequestRef MakeRequest(
824 FHttpRequestRef MakeRequest(
const FCreateSkill& CreateSkill,
const FString& URL,
const FString& Method,
const FOpenAIAuth& Auth)
const;
825 FHttpRequestRef MakeRequest(
828 template <
typename ParsedResponseType,
typename DelegateType>
829 void HandleResponse(FHttpResponsePtr Response,
bool WasSuccessful, DelegateType& Delegate)
831 if (!Success(Response, WasSuccessful))
return;
833 const FString Content = Response.IsValid() ? Response->GetContentAsString() : FString{};
834 const FString ResponseURL = Response.IsValid() ? Response->GetURL() : FString{};
836 ParsedResponseType ParsedResponse;
837 if (UJsonFuncLib::ParseJSONToStruct(Content, &ParsedResponse))
839 Delegate.Broadcast(ParsedResponse, GetResponseHeaders(Response));
843 LogError(FString::Format(TEXT(
"JSON deserialization error: {0}"), {Content}));
844 RequestError.Broadcast(ResponseURL, Content);
848 virtual TSharedRef<IHttpRequest, ESPMode::ThreadSafe> CreateRequest()
const {
return FHttpModule::Get().CreateRequest(); }
851 void SetOptional(TSharedPtr<FJsonObject> RequestBody,
const TOptional<FString>& Param,
const FString& ParamName);
852 void SetOptional(TSharedPtr<FJsonObject> RequestBody,
const TOptional<bool>& Param,
const FString& ParamName);
853 void SetOptional(TSharedPtr<FJsonObject> RequestBody,
const TOptional<TArray<float>>& Param,
const FString& ParamName);
855 template <
typename NumberType>
856 void SetOptional(TSharedPtr<FJsonObject> RequestBody,
const TOptional<NumberType>& Param,
const FString& ParamName)
858 if (!Param.IsSet())
return;
859 RequestBody->SetNumberField(ParamName, Param.GetValue());
863 TTuple<FString, FString> GetErrorData(FHttpRequestPtr Request, FHttpResponsePtr Response)
const;
865 template <
typename ResponseType>
866 bool ParseStreamRequest(FHttpResponsePtr Response, TArray<ResponseType>& Responses)
868 if (!Response.IsValid())
return false;
870 TArray<FString> StringArray;
871 Response->GetContentAsString().ParseIntoArrayLines(StringArray);
873 for (
auto& String : StringArray)
875 bool LastString{
false};
876 if (OpenAI::ChatParser::CleanChunkResponseString(String, LastString))
882 ResponseType ParsedResponse;
883 if (!UJsonFuncLib::ParseJSONToStruct(String, &ParsedResponse))
continue;
885 Responses.Add(ParsedResponse);
891 template <
typename ResponseType,
typename DelegateType>
892 void OnStreamProgress(FHttpRequestPtr Request, uint64 BytesSent, uint64 BytesReceived, DelegateType& Delegate)
894 const auto& Response = Request->GetResponse();
895 TArray<ResponseType> ParsedResponses;
897 if (ParseStreamRequest(Response, ParsedResponses))
899 LogResponse(Response);
900 Delegate.Broadcast(ParsedResponses, GetResponseHeaders(Response));
902 else if (Response.IsValid())
904 LogError(Response->GetContentAsString());
907 else if (BytesReceived == 0)
915 LogError(FString::Format(TEXT(
"JSON deserialization error BytesSent:{0} BytesReceived:{1}"), {BytesSent, BytesReceived}));
919 template <
typename ResponseType,
typename DelegateType>
920 void OnStreamCompleted(FHttpRequestPtr Request, FHttpResponsePtr Response,
bool WasSuccessful, DelegateType& Delegate)
924 const auto& [URL, Content] = GetErrorData(Request, Response);
926 RequestError.Broadcast(URL, Content);
930 TArray<ResponseType> ParsedResponses;
931 if (ParseStreamRequest(Response, ParsedResponses))
933 LogResponse(Response);
934 Delegate.Broadcast(ParsedResponses, GetResponseHeaders(Response));
938 const FString Content = Response.IsValid() ? Response->GetContentAsString() : FString{};
939 const FString ResponseURL = Response.IsValid() ? Response->GetURL() : FString{};
941 LogError(FString::Format(TEXT(
"JSON deserialization error: {0}"), {Content}));
943 RequestError.Broadcast(ResponseURL, Content);