From efa6dbd9d67f325bb5da96a74664bbb65283fdf4 Mon Sep 17 00:00:00 2001 From: akashskypatel Date: Thu, 13 Aug 2026 18:35:52 -0700 Subject: [PATCH 1/6] Fix UE 5.8 JSON shared-string key conversion --- Source/Private/Core/N2CSerializer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Private/Core/N2CSerializer.cpp b/Source/Private/Core/N2CSerializer.cpp index 02f56b7..3f1e759 100644 --- a/Source/Private/Core/N2CSerializer.cpp +++ b/Source/Private/Core/N2CSerializer.cpp @@ -751,7 +751,7 @@ bool FN2CSerializer::ParseFlowsFromJson(const TSharedPtr& JsonObjec { if (DataFlow.Value->Type == EJson::String) { - OutFlows.Data.Add(DataFlow.Key, DataFlow.Value->AsString()); + OutFlows.Data.Add(FString(DataFlow.Key.ToView()), DataFlow.Value->AsString()); } } @@ -921,4 +921,4 @@ bool FN2CSerializer::ParseEnumFromJson(const TSharedPtr& JsonObject } return true; -} +} \ No newline at end of file From c6c168fbcf8750bee71e1e42dede2699b57783b4 Mon Sep 17 00:00:00 2001 From: akashskypatel Date: Thu, 13 Aug 2026 18:37:23 -0700 Subject: [PATCH 2/6] Fix UE 5.8 JSON shared-string key conversion --- Source/Private/Core/N2CSerializer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Private/Core/N2CSerializer.cpp b/Source/Private/Core/N2CSerializer.cpp index 02f56b7..afab0e7 100644 --- a/Source/Private/Core/N2CSerializer.cpp +++ b/Source/Private/Core/N2CSerializer.cpp @@ -751,7 +751,7 @@ bool FN2CSerializer::ParseFlowsFromJson(const TSharedPtr& JsonObjec { if (DataFlow.Value->Type == EJson::String) { - OutFlows.Data.Add(DataFlow.Key, DataFlow.Value->AsString()); + OutFlows.Data.Add(FString(DataFlow.Key.ToView()), DataFlow.Value->AsString()); } } From f0c8bb70090ee0b76f80b185f0781997fed1b03c Mon Sep 17 00:00:00 2001 From: akashskypatel Date: Thu, 13 Aug 2026 19:11:50 -0700 Subject: [PATCH 3/6] Add Ollama Cloud API key setting --- Source/Public/LLM/N2COllamaConfig.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/Public/LLM/N2COllamaConfig.h b/Source/Public/LLM/N2COllamaConfig.h index c469603..6960771 100644 --- a/Source/Public/LLM/N2COllamaConfig.h +++ b/Source/Public/LLM/N2COllamaConfig.h @@ -20,6 +20,12 @@ struct FN2COllamaConfig ToolTip="The base endpoint to use for the Ollama API. Defaults to http:localhost:11434")) FString OllamaEndpoint = "http://localhost:11434"; + /** Optional API key for authenticated Ollama endpoints such as Ollama Cloud. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, Category = "Cloud", + meta=(DisplayName="API Key", PasswordField=true, + ToolTip="API key for authenticated Ollama endpoints such as Ollama Cloud. Leave empty for local Ollama servers.")) + FString ApiKey; + /** Whether to use system prompts with Ollama models */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "General", meta=(DisplayName="Use System Prompts", From bd7eecbc006fc749575127f8b2b7f666ae7c1401 Mon Sep 17 00:00:00 2001 From: akashskypatel Date: Thu, 13 Aug 2026 19:11:59 -0700 Subject: [PATCH 4/6] Store Ollama API key in user secrets --- Source/Public/Core/N2CUserSecrets.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Public/Core/N2CUserSecrets.h b/Source/Public/Core/N2CUserSecrets.h index 0c007ca..033cde2 100644 --- a/Source/Public/Core/N2CUserSecrets.h +++ b/Source/Public/Core/N2CUserSecrets.h @@ -44,6 +44,10 @@ class NODETOCODE_API UN2CUserSecrets : public UObject /** DeepSeek API Key */ UPROPERTY(EditAnywhere, Category = "Node to Code | API Keys") FString DeepSeek_API_Key; + + /** Ollama API Key */ + UPROPERTY(EditAnywhere, Category = "Node to Code | API Keys") + FString Ollama_API_Key; private: /** Ensure the secrets directory exists */ From 1153965b89fa10532d666f500ac7b8bf7f85d02a Mon Sep 17 00:00:00 2001 From: akashskypatel Date: Thu, 13 Aug 2026 19:12:12 -0700 Subject: [PATCH 5/6] Persist Ollama API key in user secrets --- Source/Private/Core/N2CUserSecrets.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Private/Core/N2CUserSecrets.cpp b/Source/Private/Core/N2CUserSecrets.cpp index 593b83a..1674e00 100644 --- a/Source/Private/Core/N2CUserSecrets.cpp +++ b/Source/Private/Core/N2CUserSecrets.cpp @@ -71,6 +71,7 @@ void UN2CUserSecrets::LoadSecrets() Anthropic_API_Key = JsonObject->GetStringField(TEXT("Anthropic_API_Key")); Gemini_API_Key = JsonObject->GetStringField(TEXT("Gemini_API_Key")); DeepSeek_API_Key = JsonObject->GetStringField(TEXT("DeepSeek_API_Key")); + JsonObject->TryGetStringField(TEXT("Ollama_API_Key"), Ollama_API_Key); FN2CLogger::Get().Log( FString::Printf(TEXT("Successfully loaded secrets from: %s"), *SecretsFilePath), @@ -88,6 +89,7 @@ void UN2CUserSecrets::SaveSecrets() JsonObject->SetStringField(TEXT("Anthropic_API_Key"), Anthropic_API_Key); JsonObject->SetStringField(TEXT("Gemini_API_Key"), Gemini_API_Key); JsonObject->SetStringField(TEXT("DeepSeek_API_Key"), DeepSeek_API_Key); + JsonObject->SetStringField(TEXT("Ollama_API_Key"), Ollama_API_Key); // Serialize to string FString JsonString; From ea217c4dca6d87840968797fa146a49901114bf5 Mon Sep 17 00:00:00 2001 From: akashskypatel Date: Thu, 13 Aug 2026 19:12:53 -0700 Subject: [PATCH 6/6] Wire Ollama API key through settings --- Source/Private/Core/N2CSettings.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Source/Private/Core/N2CSettings.cpp b/Source/Private/Core/N2CSettings.cpp index c89f014..50a4634 100644 --- a/Source/Private/Core/N2CSettings.cpp +++ b/Source/Private/Core/N2CSettings.cpp @@ -44,6 +44,7 @@ UN2CSettings::UN2CSettings() Anthropic_API_Key_UI = UserSecrets->Anthropic_API_Key; Gemini_API_Key_UI = UserSecrets->Gemini_API_Key; DeepSeek_API_Key_UI = UserSecrets->DeepSeek_API_Key; + OllamaConfig.ApiKey = UserSecrets->Ollama_API_Key; // Initialize token estimate EstimatedReferenceTokens = GetReferenceFilesTokenEstimate(); @@ -80,6 +81,8 @@ FString UN2CSettings::GetActiveApiKey() const return UserSecrets->Gemini_API_Key; case EN2CLLMProvider::DeepSeek: return UserSecrets->DeepSeek_API_Key; + case EN2CLLMProvider::Ollama: + return UserSecrets->Ollama_API_Key; case EN2CLLMProvider::LMStudio: return "lm-studio"; // LM Studio just requires a dummy API key for its OpenAI endpoint default: @@ -269,6 +272,17 @@ void UN2CSettings::PostEditChangeProperty(FPropertyChangedEvent& PropertyChanged UserSecrets->SaveSecrets(); return; } + if (PropertyName == GET_MEMBER_NAME_CHECKED(FN2COllamaConfig, ApiKey)) + { + if (!UserSecrets) + { + UserSecrets = NewObject(); + UserSecrets->LoadSecrets(); + } + UserSecrets->Ollama_API_Key = OllamaConfig.ApiKey; + UserSecrets->SaveSecrets(); + return; + } // Update logger severity when MinSeverity changes if (PropertyName == GET_MEMBER_NAME_CHECKED(UN2CSettings, MinSeverity))