C++編 - Utils
このドキュメントでは、AIChatPlusが提供するツール類について説明します。これにはJSON操作、画像処理、音声処理などの機能が含まれます。
準備作業
プロジェクトの .Build.cs ファイルにモジュール依存関係を追加する:
必要なヘッダーファイルをインクルードする:
#include "Common/AIChatPlus_Util.h"
#include "Common/Json/AIChatPlus_JsonObject.h"
#include "Common/Json/AIChatPlus_JsonArray.h"
JSON 操作
AIChatPlusはBlueprintに優しいJSON操作クラスを提供し、チェーン式呼び出しとタイプセーフ操作をサポートしています。
UAIChatPlus_JsonObject - JSONオブジェクト
作成と解析
#include "Common/Json/AIChatPlus_JsonObject.h"
void UMyClass::JsonObjectBasics()
{
// 空のJSONオブジェクトを作成する
UAIChatPlus_JsonObject* JsonObj = UAIChatPlus_JsonObject::Create();
// 文字列から解析
FString JsonString = TEXT(R"({"name": "John", "age": 30, "active": true})");
bool bSuccess;
FString ErrorMessage;
UAIChatPlus_JsonObject* ParsedObj = UAIChatPlus_JsonObject::Parse(JsonString, bSuccess, ErrorMessage);
if (bSuccess)
{
UE_LOG(LogTemp, Display, TEXT("Parsed successfully"));
}
else
{
UE_LOG(LogTemp, Error, TEXT("Parse error: %s"), *ErrorMessage);
}
}
フィールドを設定する(メソッドチェーン)
void UMyClass::SetJsonFields()
{
UAIChatPlus_JsonObject* JsonObj = UAIChatPlus_JsonObject::Create();
// チェーン式でフィールドを設定
JsonObj->SetStringField(TEXT("name"), TEXT("John"))
->SetIntegerField(TEXT("age"), 30)
->SetBooleanField(TEXT("active"), true)
->SetNumberField(TEXT("score"), 95.5f)
->SetNullField(TEXT("extra"));
// ネストされたオブジェクトを設定する
UAIChatPlus_JsonObject* AddressObj = UAIChatPlus_JsonObject::Create();
AddressObj->SetStringField(TEXT("city"), TEXT("Tokyo"))
->SetStringField(TEXT("country"), TEXT("Japan"));
JsonObj->SetObjectField(TEXT("address"), AddressObj);
// 出力
FString Result = JsonObj->ToString(true); // true = 整形された出力
UE_LOG(LogTemp, Display, TEXT("%s"), *Result);
}
フィールドを取得する
void UMyClass::GetJsonFields()
{
FString JsonString = TEXT(R"({"name": "John", "age": 30, "scores": [85, 90, 95]})");
bool bParseSuccess;
FString ErrorMessage;
UAIChatPlus_JsonObject* JsonObj = UAIChatPlus_JsonObject::Parse(JsonString, bParseSuccess, ErrorMessage);
if (!bParseSuccess) return;
bool bSuccess;
// 文字列フィールドを取得する
FString Name = JsonObj->GetStringField(TEXT("name"), TEXT("Unknown"), bSuccess);
if (bSuccess)
{
UE_LOG(LogTemp, Display, TEXT("Name: %s"), *Name);
}
// 整数フィールドを取得
int32 Age = JsonObj->GetIntegerField(TEXT("age"), 0, bSuccess);
// ブールフィールドを取得する
bool bActive = JsonObj->GetBooleanField(TEXT("active"), false, bSuccess);
// 配列フィールドを取得
UAIChatPlus_JsonArray* Scores = JsonObj->GetArrayField(TEXT("scores"), bSuccess);
if (bSuccess && Scores)
{
for (int32 i = 0; i < Scores->Length(); ++i)
{
int32 Score = Scores->GetInteger(i, 0, bSuccess);
UE_LOG(LogTemp, Display, TEXT("Score[%d]: %d"), i, Score);
}
}
// ネストされたオブジェクトのフィールドを取得
UAIChatPlus_JsonObject* AddressObj = JsonObj->GetObjectField(TEXT("address"), bSuccess);
if (bSuccess && AddressObj)
{
FString City = AddressObj->GetStringField(TEXT("city"), TEXT(""), bSuccess);
}
}
フィールドチェックと管理
void UMyClass::ManageJsonFields()
{
UAIChatPlus_JsonObject* JsonObj = UAIChatPlus_JsonObject::Create();
JsonObj->SetStringField(TEXT("name"), TEXT("John"))
->SetIntegerField(TEXT("age"), 30);
// フィールドが存在するかどうかを確認
if (JsonObj->HasField(TEXT("name")))
{
UE_LOG(LogTemp, Display, TEXT("Field 'name' exists"));
}
// フィールドタイプを取得する
EAIChatPlus_JsonValueType FieldType = JsonObj->GetFieldType(TEXT("age"));
// FieldType == EAIChatPlus_JsonValueType::Number
// 全てのフィールド名を取得
TArray<FString> FieldNames = JsonObj->GetFieldNames();
for (const FString& Name : FieldNames)
{
UE_LOG(LogTemp, Display, TEXT("Field: %s"), *Name);
}
// フィールドを削除
JsonObj->RemoveField(TEXT("age"));
// すべてのフィールドをクリア
JsonObj->Clear();
}
パスクエリ(ネストされたアクセス)
void UMyClass::PathQuery()
{
FString JsonString = TEXT(R"({
"player": {
"inventory": {
"gold": 1000,
"items": ["sword", "shield"]
}
}
})");
bool bParseSuccess;
FString ErrorMessage;
UAIChatPlus_JsonObject* JsonObj = UAIChatPlus_JsonObject::Parse(JsonString, bParseSuccess, ErrorMessage);
// パスから値を取得
FAIChatPlus_JsonQueryResult Result;
FString Gold = JsonObj->GetStringByPath(TEXT("player.inventory.gold"), TEXT("0"), Result);
// Gold = "1000"
// パスを介して値を設定する
FAIChatPlus_JsonPathOptions PathOptions;
JsonObj->SetStringByPath(TEXT("player.inventory.gold"), TEXT("2000"), PathOptions);
}
統合と複製
void UMyClass::MergeAndDuplicate()
{
UAIChatPlus_JsonObject* Obj1 = UAIChatPlus_JsonObject::Create();
Obj1->SetStringField(TEXT("name"), TEXT("John"));
UAIChatPlus_JsonObject* Obj2 = UAIChatPlus_JsonObject::Create();
Obj2->SetIntegerField(TEXT("age"), 30)
->SetStringField(TEXT("name"), TEXT("Jane")); // nameを上書き
// 結合(bOverwrite = true の場合、既存のフィールドを上書き)
Obj1->Merge(Obj2, true);
// Obj1 は現在 {"name": "Jane", "age": 30} を含んでいます
// ディープコピー
UAIChatPlus_JsonObject* Copy = Obj1->Duplicate();
}
UStruct との相互変換
USTRUCT(BlueprintType)
struct FMyData
{
GENERATED_BODY()
UPROPERTY()
FString Name;
UPROPERTY()
int32 Age;
};
void UMyClass::StructConversion()
{
// UStruct を JsonObject に変換
FMyData Data;
Data.Name = TEXT("John");
Data.Age = 30;
UAIChatPlus_JsonObject* JsonObj = UAIChatPlus_JsonObject::FromStruct(Data);
// JsonObjectからUStructへの変換
FMyData OutData;
bool bSuccess = JsonObj->ToStruct(OutData);
if (bSuccess)
{
UE_LOG(LogTemp, Display, TEXT("Name: %s, Age: %d"), *OutData.Name, OutData.Age);
}
}
UAIChatPlus_JsonArray - JSON配列
作成と操作
#include "Common/Json/AIChatPlus_JsonArray.h"
void UMyClass::JsonArrayBasics()
{
// 空の配列を作成する
UAIChatPlus_JsonArray* JsonArray = UAIChatPlus_JsonArray::Create();
// 要素の追加(チェーンメソッドコール)
JsonArray->AddString(TEXT("apple"))
->AddString(TEXT("banana"))
->AddInteger(42)
->AddBoolean(true)
->AddNull();
// オブジェクト要素を追加する
UAIChatPlus_JsonObject* ItemObj = UAIChatPlus_JsonObject::Create();
ItemObj->SetStringField(TEXT("name"), TEXT("sword"));
JsonArray->AddObject(ItemObj);
// 入れ子配列を追加
UAIChatPlus_JsonArray* NestedArray = UAIChatPlus_JsonArray::Create();
NestedArray->AddInteger(1)->AddInteger(2)->AddInteger(3);
JsonArray->AddArray(NestedArray);
// 出力
FString Result = JsonArray->ToString(true);
UE_LOG(LogTemp, Display, TEXT("%s"), *Result);
}
要素を取得する
void UMyClass::GetArrayElements()
{
FString JsonString = TEXT(R"(["apple", "banana", 42, true, {"name": "item"}])");
bool bParseSuccess;
FString ErrorMessage;
UAIChatPlus_JsonArray* JsonArray = UAIChatPlus_JsonArray::Parse(JsonString, bParseSuccess, ErrorMessage);
if (!bParseSuccess) return;
bool bSuccess;
// 文字列要素を取得
FString Fruit = JsonArray->GetString(0, TEXT(""), bSuccess); // "apple"
// 整数要素を取得する
int32 Number = JsonArray->GetInteger(2, 0, bSuccess); // 42
// ブール要素を取得
bool bValue = JsonArray->GetBoolean(3, false, bSuccess); // true
// オブジェクト要素を取得する
UAIChatPlus_JsonObject* Obj = JsonArray->GetObject(4, bSuccess);
if (bSuccess && Obj)
{
FString Name = Obj->GetStringField(TEXT("name"), TEXT(""), bSuccess);
}
// 配列を走査する
for (int32 i = 0; i < JsonArray->Length(); ++i)
{
EAIChatPlus_JsonValueType Type = JsonArray->GetElementType(i);
UE_LOG(LogTemp, Display, TEXT("Element[%d] type: %d"), i, static_cast<int32>(Type));
}
}
配列操作
void UMyClass::ArrayOperations()
{
UAIChatPlus_JsonArray* JsonArray = UAIChatPlus_JsonArray::Create();
JsonArray->AddString(TEXT("a"))
->AddString(TEXT("b"))
->AddString(TEXT("c"));
// 長さを取得する
int32 Len = JsonArray->Length(); // 3
// インデックスが有効かどうかをチェック
bool bValid = JsonArray->IsValidIndex(1); // true
// 要素を設定する
bool bSuccess;
JsonArray->SetString(1, TEXT("B"), bSuccess);
// 要素を削除
JsonArray->RemoveAt(0, bSuccess);
// 配列を空にする
JsonArray->Clear();
// ディープコピー
UAIChatPlus_JsonArray* Copy = JsonArray->Duplicate();
}
一括変換
void UMyClass::BatchConversion()
{
// 文字列配列から作成
TArray<FString> StringArray = {TEXT("a"), TEXT("b"), TEXT("c")};
UAIChatPlus_JsonArray* JsonArray = UAIChatPlus_JsonArray::FromStringArray(StringArray);
// 文字列配列に変換する
bool bSuccess;
TArray<FString> OutArray = JsonArray->ToStringArray(bSuccess);
// 整数配列から作成
TArray<int32> IntArray = {1, 2, 3, 4, 5};
UAIChatPlus_JsonArray* IntJsonArray = UAIChatPlus_JsonArray::FromIntegerArray(IntArray);
// 整数配列に変換する
TArray<int32> OutIntArray = IntJsonArray->ToIntegerArray(bSuccess);
}
UAIChatPlus_Util - JSON ヘルパー関数
void UMyClass::JsonUtilFunctions()
{
// 2つのJSON文字列を統合する
FString Json1 = TEXT(R"({"name": "John"})");
FString Json2 = TEXT(R"({"age": 30, "name": "Jane"})");
FString Merged = UAIChatPlus_Util::MergeJsonObjects(Json1, Json2);
// Merged = {"name": "Jane", "age": 30}
// JSON文字列をオブジェクトとして読み込む
TSharedPtr<FJsonObject> JsonObj = UAIChatPlus_Util::LoadJsonString(Json1);
// オブジェクトを文字列に変換
FString JsonString = UAIChatPlus_Util::ToJsonString(JsonObj);
}
画像ツール
画像の読み込みと保存
#include "Common/AIChatPlus_Util.h"
void UMyClass::ImageLoadSave()
{
// ファイルから画像をロード
FString ImagePath = FPaths::ProjectContentDir() / TEXT("Images/sample.png");
UTexture2D* Texture = UAIChatPlus_Util::LoadImage(ImagePath, true); // true = 完成コンパイル
if (Texture)
{
UE_LOG(LogTemp, Display, TEXT("Image loaded: %dx%d"),
Texture->GetSizeX(), Texture->GetSizeY());
}
// 画像をファイルに保存する
FString SavePath = FPaths::ProjectSavedDir() / TEXT("output.png");
bool bSaved = UAIChatPlus_Util::SaveImage(Texture, SavePath);
if (bSaved)
{
UE_LOG(LogTemp, Display, TEXT("Image saved to: %s"), *SavePath);
}
}
画像をBase64に変換
void UMyClass::ImageToBase64()
{
UTexture2D* Texture = UAIChatPlus_Util::LoadImage(TEXT("D:/image.png"));
// Base64 文字列に変換する
// InQuality: 0 = PNG, 1-100 = JPEG 画質
FString B64String = UAIChatPlus_Util::ImageToB64(Texture, 0); // PNGフォーマット
UE_LOG(LogTemp, Display, TEXT("Base64 length: %d"), B64String.Len());
}
画像をコピー
void UMyClass::CopyTexture()
{
UTexture2D* Original = UAIChatPlus_Util::LoadImage(TEXT("D:/image.png"));
// テクスチャをコピー
UTexture2D* Copy = UAIChatPlus_Util::CopyTexture2D(
Original,
nullptr, // 外側(nullptr = GetTransientPackage())
NAME_None, // 名称
RF_NoFlags // フラグなし
);
// Blueprintバージョン(デフォルトフラグ付き)
UTexture2D* BPCopy = UAIChatPlus_Util::CopyTexture2DInBlueprint(Original);
}
URLから画像を取得
void UMyClass::GetImageFromUrl()
{
FString ImageUrl = TEXT("https://example.com/image.png");
UAIChatPlus_Util::GetImageFromUrl(ImageUrl,
UAIChatPlus_Util::OnImageCreated::CreateLambda([](UTexture2D* Texture, const FString& Error)
{
if (Texture)
{
UE_LOG(LogTemp, Display, TEXT("Image downloaded: %dx%d"),
Texture->GetSizeX(), Texture->GetSizeY());
}
else
{
UE_LOG(LogTemp, Error, TEXT("Download failed: %s"), *Error);
}
}));
}
Base64から画像を取得する
void UMyClass::GetImageFromBase64()
{
FString B64String = TEXT("iVBORw0KGgoAAAANSUhEUg..."); // Base64データ
UAIChatPlus_Util::GetImageFromB64(B64String,
UAIChatPlus_Util::OnImageCreated::CreateLambda([](UTexture2D* Texture, const FString& Error)
{
if (Texture)
{
UE_LOG(LogTemp, Display, TEXT("Image decoded successfully"));
}
else
{
UE_LOG(LogTemp, Error, TEXT("Decode failed: %s"), *Error);
}
}));
}
画像をクリップボードにコピー
void UMyClass::CopyToClipboard()
{
UTexture2D* Texture = UAIChatPlus_Util::LoadImage(TEXT("D:/image.png"));
// サポートされているか確認
if (UAIChatPlus_Util::IsCanCopyTexture2DToClipboard())
{
UAIChatPlus_Util::CopyTexture2DToClipboard(Texture);
UE_LOG(LogTemp, Display, TEXT("Image copied to clipboard"));
}
}
オーディオツール
WAVファイルをロード
void UMyClass::LoadWavFile()
{
FString WavPath = FPaths::ProjectContentDir() / TEXT("Audio/sample.wav");
USoundWave* Sound = UAIChatPlus_Util::LoadSoundWav(WavPath);
if (Sound)
{
UE_LOG(LogTemp, Display, TEXT("Sound loaded: Duration=%.2f, Channels=%d, SampleRate=%d"),
Sound->Duration,
Sound->NumChannels,
Sound->GetSampleRateForCurrentPlatform());
}
}
音声をWAVファイルとして保存
void UMyClass::SaveWavFile()
{
// Sound は既存の USoundWave であると仮定します
USoundWave* Sound = /* サウンドを取得 */;
FString SavePath = FPaths::ProjectSavedDir() / TEXT("output.wav");
bool bSaved = UAIChatPlus_Util::SaveSoundWav(Sound, SavePath);
if (bSaved)
{
UE_LOG(LogTemp, Display, TEXT("Sound saved to: %s"), *SavePath);
}
}
音声をBase64に変換
void UMyClass::SoundToBase64()
{
USoundWave* Sound = UAIChatPlus_Util::LoadSoundWav(TEXT("D:/audio.wav"));
// Base64 文字列に変換
FString B64String = UAIChatPlus_Util::SoundToB64(Sound);
UE_LOG(LogTemp, Display, TEXT("Audio Base64 length: %d"), B64String.Len());
}
WAVデータをSoundWaveに変換
void UMyClass::WavDataToSound()
{
// ファイルから生データを読み込む
TArray<uint8> RawData;
FFileHelper::LoadFileToArray(RawData, TEXT("D:/audio.wav"));
// SoundWave に変換
USoundWave* Sound = UAIChatPlus_Util::WavDataToSoundWave(
RawData,
false, // bIsAmbiX
false // bIsFuMa
);
if (Sound)
{
UE_LOG(LogTemp, Display, TEXT("Sound created from data"));
}
}
「サウンドウェーブ」をコピー
void UMyClass::CopySoundWave()
{
USoundWave* Original = UAIChatPlus_Util::LoadSoundWav(TEXT("D:/audio.wav"));
// オーディオをコピー
USoundWave* Copy = UAIChatPlus_Util::CopySoundWave(
Original,
nullptr, // Outer
NAME_なし // 名称
);
}
オリジナルPCMデータを取得する
void UMyClass::GetPCMData()
{
USoundWave* Sound = UAIChatPlus_Util::LoadSoundWav(TEXT("D:/audio.wav"));
// 元のPCMデータを取得する
TArray<uint8> PCMData = UAIChatPlus_Util::GetSoundWavePCMData(Sound);
UE_LOG(LogTemp, Display, TEXT("PCM data size: %d bytes"), PCMData.Num());
}
録音データからSoundWaveを作成
void UMyClass::RecorderDataToSound()
{
// Audio Captureから取得した録音データを仮定します
TArray<float> RecorderData; // オーディオサンプルデータ
int32 NumChannels = 1; // モノラル
int32 SampleRate = 16000; // サンプリングレート
USoundWave* Sound = UAIChatPlus_Util::RecorderDataToSoundWave(
RecorderData,
NumChannels,
SampleRate
);
if (Sound)
{
UE_LOG(LogTemp, Display, TEXT("Sound created from recorder data"));
}
}
ログ制御
void UMyClass::ControlLogging()
{
// 内部ログレベルを設定する
UAIChatPlus_Util::SetInternalLogVerbosity(EAIChatPlus_LogVerbosityType::Verbose);
// 利用可能なレベル:
// - NoLogging
// - Fatal
// - Error
// - Warning
// - Display
// - Log
// - Verbose
// - VeryVerbose
}
{
"translation": "レスポンスラッパーヘルパー関数" }
コールバックでレスポンスを処理する際には、FAIChatPlus_PointerWrapper を具体的な型に変換する必要があります:
void UMyClass::HandleCallbackResponse()
{
// OnFinished コールバック内で
Request->OnFinishedListeners.AddLambda([](const FAIChatPlus_PointerWrapper& ResponseWrapper)
{
// レスポンスメッセージを取得
FString Message = UAIChatPlus_Util::GetResponseWrapperMessage(ResponseWrapper);
UE_LOG(LogTemp, Display, TEXT("Message: %s"), *Message);
// または基本レスポンスタイプに変換
FAIChatPlus_ChatResponseBodyBase& Response = UAIChatPlus_Util::CastWrapperToResponse(ResponseWrapper);
});
// OnFailed コールバック内で
Request->OnFailedListeners.AddLambda([](const FAIChatPlus_PointerWrapper& ErrorWrapper)
{
// エラーの説明を取得する
FString ErrorDesc = UAIChatPlus_Util::GetErrorWrapperDescription(ErrorWrapper);
UE_LOG(LogTemp, Error, TEXT("Error: %s"), *ErrorDesc);
// またはエラータイプに変換する
FAIChatPlus_ResponseErrorBase& Error = UAIChatPlus_Util::CastWrapperToError(ErrorWrapper);
});
}
模型情報照会
void UMyClass::QueryModelInfo()
{
// OpenAIのデフォルトモデルリストを取得する
const TArray<FName>& OpenAIModels = UAIChatPlus_Util::GetOpenAIChatDefaultModels();
// 特定モデルの情報を取得
FAIChatPlus_ChatModelInfo ModelInfo = UAIChatPlus_Util::GetOpenAIChatModelInfo(TEXT("gpt-4o"));
UE_LOG(LogTemp, Display, TEXT("Model: %s, MaxTokens: %d, SupportImage: %s"),
*ModelInfo.Name.ToString(),
ModelInfo.MaxTokens,
ModelInfo.IsSupportSendImage ? TEXT("Yes") : TEXT("No"));
// Claude モデル
const TArray<FName>& ClaudeModels = UAIChatPlus_Util::GetClaudeChatDefaultModels();
FAIChatPlus_ChatModelInfo ClaudeInfo = UAIChatPlus_Util::GetClaudeChatModelInfo(TEXT("claude-3-5-sonnet"));
// Gemini モデル
const TArray<FName>& GeminiModels = UAIChatPlus_Util::GetGeminiChatDefaultModels();
FAIChatPlus_ChatModelInfo GeminiInfo = UAIChatPlus_Util::GetGeminiChatModelInfo(TEXT("gemini-1.5-pro"));
}
Cllama ヘルパー関数
void UMyClass::CllamaUtilities()
{
// Cllamaが利用可能かどうかをチェックする
if (UAIChatPlus_Util::Cllama_IsValid())
{
UE_LOG(LogTemp, Display, TEXT("Cllama is available"));
}
// GPUサポートを確認する
if (UAIChatPlus_Util::Cllama_IsSupportGpu())
{
UE_LOG(LogTemp, Display, TEXT("GPU acceleration supported"));
}
// サポートされているバックエンドを取得する
TArray<FString> Backends = UAIChatPlus_Util::Cllama_GetSupportBackends();
for (const FString& Backend : Backends)
{
UE_LOG(LogTemp, Display, TEXT("Backend: %s"), *Backend);
}
// Pak内のモデルパスを準備する
FString ModelPath = TEXT("Models/my_model.gguf");
FString ActualPath = UAIChatPlus_Util::Cllama_PrepareModelPathFromPak(ModelPath);
// モデルがPak内にある場合、一時ディレクトリに解凍され新しいパスが返されます
}
ファイルヘルパー関数
void UMyClass::FileUtilities()
{
// プラグインのベースディレクトリを取得
FString PluginDir = UAIChatPlus_Util::GetPluginBaseDir(TEXT("AIChatPlus"));
UE_LOG(LogTemp, Display, TEXT("Plugin dir: %s"), *PluginDir);
// ディレクトリのコピー
FString SourceDir = FPaths::ProjectContentDir() / TEXT("Source");
FString DestDir = FPaths::ProjectSavedDir() / TEXT("Backup");
bool bCopied = UAIChatPlus_Util::CopyDirectory(SourceDir, DestDir, true); // true = 上書き
}
プロンプトテンプレート
void UMyClass::PromptTemplates()
{
// Prompt テンプレート JSON ファイルリストを取得
TArray<FDirectoryPath> ExtraDirs; // 追加検索ディレクトリ(オプション)
TArray<FFilePath> TemplateFiles = UAIChatPlus_Util::GetPromptTemplateJsonFiles(ExtraDirs);
// プロンプトテンプレートを読み込む
TArray<FAIChatPlus_PromptTemplate> Templates = UAIChatPlus_Util::GetPromptTemplates(TemplateFiles);
for (const FAIChatPlus_PromptTemplate& Template : Templates)
{
UE_LOG(LogTemp, Display, TEXT("Template: %s"), *Template.Name);
}
}
Original: https://wiki.disenone.site/ja
This post is protected by CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.
Visitors. Total Visits. Page Visits.
この投稿はChatGPTを使用して翻訳されましたので、フィードバック以下のテキストを日本語に翻訳してください:
中指出任何遗漏之处。
中指摘した箇所があればご指摘ください。