انتقل إلى المحتوى

++C قسم - أدوات مساعدة

يقدم هذا المستند شرحًا للأدوات التي يوفرها AIChatPlus، بما في ذلك وظائف مثل معالجة JSON ومعالجة الصور ومعالجة الصوت وغيرها من الوظائف.

الاستعدادات

في ملف .Build.cs الخاص بالمشروع، أضف تبعيات الوحدة:

PublicDependencyModuleNames.AddRange(new string[]
{
    "AIChatPlusCommon"
});

يشمل ملفات الرأس اللازمة:

#include "Common/AIChatPlus_Util.h"
#include "Common/Json/AIChatPlus_JsonObject.h"
#include "Common/Json/AIChatPlus_JsonArray.h"

عمليات JSON

يقدم AIChatPlus فئة عمليات JSON صديقة لـ Blueprint، تدعم الاستدعاءات المتسلسلة والعمليات الآمنة للنوع.

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"));  // تغطية الاسم

// الدمج (كتابة فوق الحقول الموجودة إذا كانت 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()
{
// دمج سلسلتين 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
// الجودة: 0 = PNG، 100-1 = جودة 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      // العلامات
    );

    // الإصدار الأزرق (مع العلامة الافتراضية)
    UTexture2D* BPCopy = UAIChatPlus_Util::CopyTexture2DInBlueprint(Original);
}

الحصول على الصور من الرابط

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()
{
سلسلة نصية نصية64 = 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* الصوت = /* الحصول على الصوت */;

    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"));
    }
}

نسخ SoundWave

void UMyClass::CopySoundWave()
{
    USoundWave* Original = UAIChatPlus_Util::LoadSoundWav(TEXT("D:/audio.wav"));

// نسخ الصوت
    USoundWave* Copy = UAIChatPlus_Util::CopySoundWave(
        Original,
        nullptr,    // Outer
الاسم
    );
}

الحصول على بيانات 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
}

وظائف مساعدة لمُغلِّف الاستجابة

عند التعامل مع الاستجابة في رد الاتصال، يجب تحويل 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"));

// نموذج جيميني
    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"));
    }

    // التحقق من دعم وحدة معالجة الرسومات
    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()
{
// الحصول على قائمة ملفات 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/ar

This post is protected by CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

هذه المشاركة مترجمة باستخدام ChatGPT، يُرجى تقديم ملاحظاتكم في قسم الملاحظاتأشير إلى أي نقص موجود.