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