// OpenAI ServiceSample, Copyright LifeEXE. All Rights Reserved. #include "Sample/Services/QuestService.h" #include "Funclib/OpenAIFuncLib.h" DEFINE_LOG_CATEGORY_STATIC(LogQuestService, All, All); FString UQuestService::FunctionName() const { return "get_alien_rampage_saga_characters_info"; } FString UQuestService::Description() const { return "Get information about characters from my Alien Rampage Saga game."; } FString UQuestService::MakeFunction() const { /* "parameters": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the character of my Alien Rampage Saga.", }, "ability": { "type": "boolean", "description": "Set this to true if you want to know what skills the character has.", }, }, "required": ["name"], } */ TSharedPtr ParamsObj = MakeShareable(new FJsonObject()); ParamsObj->SetStringField("type", "object"); TSharedPtr PropsObj = MakeShareable(new FJsonObject()); // character name TSharedPtr NameObj = MakeShareable(new FJsonObject()); NameObj->SetStringField("type", "string"); NameObj->SetStringField("description", "Name of the character of my Alien Rampage Saga."); PropsObj->SetObjectField("name", NameObj); // ability TSharedPtr AbilityObj = MakeShareable(new FJsonObject()); AbilityObj->SetStringField("type", "boolean"); AbilityObj->SetStringField("description", "Set this to true if you want to know what skills the character has."); PropsObj->SetObjectField("ability", AbilityObj); ParamsObj->SetObjectField("properties", PropsObj); TArray> RequiredArray; RequiredArray.Add(MakeShareable(new FJsonValueString("name"))); ParamsObj->SetArrayField("required", RequiredArray); return UOpenAIFuncLib::MakeFunctionsString(ParamsObj); } void UQuestService::Call(const TSharedPtr& Args, const FString& InToolID) { Super::Call(Args, InToolID); FString ArgsStr; if (!UOpenAIFuncLib::JsonToString(Args, ArgsStr)) { UE_LOG(LogQuestService, Display, TEXT("Can't convert JSON to string")); } FAlienRampageGameProps Props; if (!UOpenAIFuncLib::ParseJSONToStruct(ArgsStr, &Props)) { UE_LOG(LogQuestService, Error, TEXT("Can't parse args")); ServiceDataError.Broadcast("QuestService can't parse args from OpenAI."); return; } struct FCharacterInfo { FString Description; FString Abilities; }; using CharacterName = FString; const TMap Info // {{"voidwalker", {"The main character fighting for the future of the Universe", "Adept at crafting nasty jokes, has a penchant for donuts, and is mesmerized by the Aurora Borealis"}}, {"galaxor", {"A formidable antagonist intent on the Universe's destruction", "Capable of unicorn riding, boasts the ability to sleep for 20 hours straight, and possesses knowledge of all " "credit card PIN codes"}}}; FString InfoToOpenAI{}; const FString Name = Props.Name.ToLower(); if (Info.Contains(Name)) { InfoToOpenAI = Props.Ability ? Info[Name].Abilities : Info[Name].Description; } else { InfoToOpenAI = "Character with such a name doesn't exist in the game."; } ServiceDataRecieved.Broadcast(MakeMessage(InfoToOpenAI)); }