|
7 | 7 | #include <Utils/HttpGPTHelper.h>
|
8 | 8 | #include <HttpGPTInternalFuncs.h>
|
9 | 9 | #include <Interfaces/IPluginManager.h>
|
| 10 | +#include <Dom/JsonObject.h> |
| 11 | +#include <Serialization/JsonWriter.h> |
| 12 | +#include <Serialization/JsonReader.h> |
| 13 | +#include <Serialization/JsonSerializer.h> |
| 14 | +#include <Misc/FileHelper.h> |
10 | 15 |
|
11 | 16 | #ifdef UE_INLINE_GENERATED_CPP_BY_NAME
|
12 | 17 | #include UE_INLINE_GENERATED_CPP_BY_NAME(SHttpGPTChatView)
|
@@ -249,6 +254,13 @@ void SHttpGPTChatView::Construct([[maybe_unused]] const FArguments&)
|
249 | 254 | ]
|
250 | 255 | ]
|
251 | 256 | ];
|
| 257 | + |
| 258 | + LoadChatHistory(); |
| 259 | +} |
| 260 | + |
| 261 | +SHttpGPTChatView::~SHttpGPTChatView() |
| 262 | +{ |
| 263 | + SaveChatHistory(); |
252 | 264 | }
|
253 | 265 |
|
254 | 266 | FReply SHttpGPTChatView::HandleSendMessageButton()
|
@@ -319,9 +331,11 @@ TArray<FHttpGPTChatMessage> SHttpGPTChatView::GetChatHistory() const
|
319 | 331 | FHttpGPTChatMessage(EHttpGPTChatRole::System, GetSystemContext())
|
320 | 332 | };
|
321 | 333 |
|
322 |
| - for (const auto& Item : ChatItems) |
| 334 | + for (const SHttpGPTChatItemPtr& Item : ChatItems) |
323 | 335 | {
|
324 |
| - Output.Add(FHttpGPTChatMessage(*Item->GetRoleText(), Item->GetMessageText())); |
| 336 | + FString RoleText = Item->GetRoleText(); |
| 337 | + RoleText.RemoveFromEnd(TEXT(":")); |
| 338 | + Output.Add(FHttpGPTChatMessage(*RoleText, Item->GetMessageText())); |
325 | 339 | }
|
326 | 340 |
|
327 | 341 | return Output;
|
@@ -390,6 +404,76 @@ FString SHttpGPTChatView::GetSystemContext() const
|
390 | 404 | return FString::Format(TEXT("You are an assistant that will help with the development of projects in Unreal Engine in general.\n{0}\n{1}\n{2}\n{3}\n{4}\n{5}"), Arguments_SystemContext);
|
391 | 405 | }
|
392 | 406 |
|
| 407 | +void SHttpGPTChatView::LoadChatHistory() |
| 408 | +{ |
| 409 | + if (const FString LoadPath = GetHistoryPath(); FPaths::FileExists(LoadPath)) |
| 410 | + { |
| 411 | + FString FileContent; |
| 412 | + if (!FFileHelper::LoadFileToString(FileContent, *LoadPath)) |
| 413 | + { |
| 414 | + return; |
| 415 | + } |
| 416 | + |
| 417 | + TSharedPtr<FJsonObject> JsonParsed; |
| 418 | + TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(FileContent); |
| 419 | + if (FJsonSerializer::Deserialize(Reader, JsonParsed)) |
| 420 | + { |
| 421 | + const TArray<TSharedPtr<FJsonValue>> Data = JsonParsed->GetArrayField("Data"); |
| 422 | + for (const TSharedPtr<FJsonValue>& Item : Data) |
| 423 | + { |
| 424 | + if (const TSharedPtr<FJsonObject> MessageItObj = Item->AsObject()) |
| 425 | + { |
| 426 | + const FString RoleString = MessageItObj->GetStringField("role"); |
| 427 | + const EHttpGPTChatRole Role = UHttpGPTHelper::NameToRole(*RoleString); |
| 428 | + if (Role == EHttpGPTChatRole::System) |
| 429 | + { |
| 430 | + continue; |
| 431 | + } |
| 432 | + |
| 433 | + const FString Message = MessageItObj->GetStringField("content"); |
| 434 | + |
| 435 | + ChatItems.Add( |
| 436 | + SNew(SHttpGPTChatItem) |
| 437 | + .MessageRole(Role) |
| 438 | + .InputText(Message) |
| 439 | + ); |
| 440 | + } |
| 441 | + } |
| 442 | + } |
| 443 | + } |
| 444 | + |
| 445 | + for (const SHttpGPTChatItemPtr& Item : ChatItems) |
| 446 | + { |
| 447 | + ChatBox->AddSlot().AutoHeight()[Item.ToSharedRef()]; |
| 448 | + } |
| 449 | +} |
| 450 | + |
| 451 | +void SHttpGPTChatView::SaveChatHistory() const |
| 452 | +{ |
| 453 | + const TSharedPtr<FJsonObject> JsonRequest = MakeShared<FJsonObject>(); |
| 454 | + |
| 455 | + TArray<TSharedPtr<FJsonValue>> Data; |
| 456 | + for (const FHttpGPTChatMessage& Item : GetChatHistory()) |
| 457 | + { |
| 458 | + Data.Add(Item.GetMessage()); |
| 459 | + } |
| 460 | + |
| 461 | + JsonRequest->SetArrayField("Data", Data); |
| 462 | + |
| 463 | + FString RequestContentString; |
| 464 | + const TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&RequestContentString); |
| 465 | + |
| 466 | + if (FJsonSerializer::Serialize(JsonRequest.ToSharedRef(), Writer)) |
| 467 | + { |
| 468 | + FFileHelper::SaveStringToFile(RequestContentString, *GetHistoryPath()); |
| 469 | + } |
| 470 | +} |
| 471 | + |
| 472 | +FString SHttpGPTChatView::GetHistoryPath() const |
| 473 | +{ |
| 474 | + return FPaths::Combine(FPaths::ProjectSavedDir(), "HttpGPT", "HttpGPTChatHistory.json"); |
| 475 | +} |
| 476 | + |
393 | 477 | void SHttpGPTChatView::InitializeModelsOptions()
|
394 | 478 | {
|
395 | 479 | for (const FName& ModelName : UHttpGPTHelper::GetAvailableGPTModels())
|
|
0 commit comments