Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/allrightsreserved093_godot-llm-rpg.json

1 line
32 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "allrightsreserved093/godot-llm-rpg", "files": {"llm_api/LLMService.cs": {"f214460982163e71e9038e2deca6d669fd6cecaa": {"t": 1785745798.2413912, "n": 4815, "h": "d81e52268e3f3632", "c": "using Godot;\nusing System;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing System.Text;\n\npublic partial class LLMService : Node2D\n{\n\t[Export(PropertyHint.MultilineText)] public string SystemMessage = \"default\";\n\t[Export] public bool KeepHistory = false;\n\n\tpublic GodotObject Receiver = null;\n\n\tpublic ChatCompletionRequest Request = new ChatCompletionRequest();\n\n\tprivate const string Url = \"https://api.deepseek.com/chat/completions\";\n\tprivate HttpRequest http;\n\n\tpublic override void _Ready()\n\t{\n\t\t// RequestJson.RequestSetUp(Request, \"deepseek-chat\", SystemMessage, 1.3);\n\n\t\tif (SystemMessage != \"default\")\n\t\t{\n\t\t\tGD.Print(\"Setting up system message in LLMService.\");\n\t\t\tRequest = RequestJson.SetSystemMessage(Request, SystemMessage);\n\t\t}\n\n\t\tGD.Print(\"LlmApi is ready.\");\n\n\t\thttp = GetNode<HttpRequest>(\"HTTPRequest\");\n\t\thttp.RequestCompleted += OnRequestCompleted;\n\t}\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ DeepSeek API Calls ≡≡≡≡≡≡≡≡≡=========---------\n\tpublic int CallDeepSeekChat(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = RequestJson.SetModel(request, \"deepseek-chat\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\tpublic int CallDeepSeekReasoner(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = RequestJson.SetModel(request, \"deepseek-reasoner\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\n\t// Core Call Logic\n\tpublic int CallDeepSeek(ChatCompletionRequest request, string userMessage)\n\t{\n\t\tif (!KeepHistory)\n\t\t{\n\t\t\t// SystemMessage = request.Messages[0].Content;\n\t\t\t// request.Messages.Clear();\n\t\t\t// request = RequestJson.SetSystemMessage(request, SystemMessage);\n\t\t}\n\n\t\trequest.Messages.Add(new ChatMessage\n\t\t{\n\t\t\tRole = \"user\",\n\t\t\tContent = userMessage\n\t\t});\n\n\t\tDeepSeekAPICall(JsonSerializer.Serialize(request));\n\t\tstring jsonRequest = RequestJson.SerializeRequest(request);\n\t\tGD.Print(jsonRequest);\n\n\t\treturn 0;\n\t}\n\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ HTTP Request ≡≡≡≡≡≡≡≡≡=========---------\n\n\tprivate int DeepSeekAPICall(string jsonRequest)\n\t{\n\t\tvar apiKey = System.Environment.GetEnvironmentVariable(\"DEEPSEEK_API_KEY\") ?? \"\";\n\n\t\tif (string.IsNullOrWhiteSpace(apiKey))\n\t\t{\n\t\t\tGD.PushError(\"Missing DEEPSEEK_API_KEY env var.\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tstring[] headers =\n\t\t{\n\t\t\t\"Content-Type: application/json\",\n\t\t\t$\"Authorization: Bearer {apiKey}\"\n\t\t};\n\n\t\t// Request(url, headers, Method.Post, bodyString)\n\t\tvar err = http.Request(Url, headers, HttpClient.Method.Post, jsonRequest);\n\t\tif (err != Error.Ok){\n\t\t\tGD.PushError($\"HTTPRequest error: {err}\");\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Placeholder for actual API call logic\n\t\treturn 0;\n\t}\n\n\n\tprivate void OnRequestCompleted(long result, long responseCode, string[] headers, byte[] body)\n\t{\n\t\tvar respText = System.Text.Encoding.UTF8.GetString(body);\n\n\t\tif (responseCode < 200 || responseCode >= 300)\n\t\t{\n\t\t\tGD.PushError($\"HTTP {responseCode}: {respText}\");\n\t\t\treturn;\n\t\t}\n\n\t\tusing var doc = JsonDocument.Parse(respText);\n\n\t\tstring content = doc.RootElement\n\t\t.GetProperty(\"choices\")[0]\n\t\t.GetProperty(\"message\")\n\t\t.GetProperty(\"content\")\n\t\t.GetString() ?? \"\";\n\n\n\n\t\tif (Receiver != null)\n\t\t{\n\t\t\tReceiver.Call(\"OnLLMResponse\", content);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGD.Print(\"No receiver set for LLMService.\");\n\t\t}\n\n\t}\n\n\n\t// async Task StreamChatAsync(string apiKey, string jsonRequest)\n\t// {\n\t// var http = new System.Net.Http.HttpClient();\n\t// var req = new HttpRequestMessage(HttpMethod.Post, \"https://api.deepseek.com/chat/completions\");\n\t// req.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", apiKey);\n\t// req.Headers.Accept.ParseAdd(\"text/event-stream\");\n\t// req.Content = new StringContent(jsonRequest, Encoding.UTF8, \"application/json\");\n\n\t// using var resp = await http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);\n\t// resp.EnsureSuccessStatusCode();\n\n\t// using var stream = await resp.Content.ReadAsStreamAsync();\n\t// using var reader = new StreamReader(stream);\n\n\t// while (!reader.EndOfStream)\n\t// {\n\t// var line = await reader.ReadLineAsync();\n\t// if (string.IsNullOrWhiteSpace(line)) continue;\n\n\t// // SSE 一般是 \"data: {...}\" 或 \"data: [DONE]\"\n\t// if (!line.StartsWith(\"data:\")) continue;\n\n\t// var data = line.Substring(\"data:\".Length).Trim();\n\t// if (data == \"[DONE]\") break;\n\n\t// // 这里的 data 通常是一个 JSON 片段(delta),按你实际返回结构解析\n\t// using var doc = JsonDocument.Parse(data);\n\n\t// // 例:如果是 OpenAI 风格 delta:choices[0].delta.content\n\t// // var delta = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"delta\").GetProperty(\"content\").GetString();\n\n\t// // 拿到 delta 后,用 CallDeferred 更新 UI\n\t// // CallDeferred(nameof(AppendText), delta);\n\t// }\n\t// }\n}\n"}, "a8926351a60c69dc1cb0b0a834a35d6565c558b8": {"t": 1785756620.776404, "n": 4815, "h": "d81e52268e3f3632", "c": "using Godot;\nusing System;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing System.Text;\n\npublic partial class LLMService : Node2D\n{\n\t[Export(PropertyHint.MultilineText)] public string SystemMessage = \"default\";\n\t[Export] public bool KeepHistory = false;\n\n\tpublic GodotObject Receiver = null;\n\n\tpublic ChatCompletionRequest Request = new ChatCompletionRequest();\n\n\tprivate const string Url = \"https://api.deepseek.com/chat/completions\";\n\tprivate HttpRequest http;\n\n\tpublic override void _Ready()\n\t{\n\t\t// RequestJson.RequestSetUp(Request, \"deepseek-chat\", SystemMessage, 1.3);\n\n\t\tif (SystemMessage != \"default\")\n\t\t{\n\t\t\tGD.Print(\"Setting up system message in LLMService.\");\n\t\t\tRequest = RequestJson.SetSystemMessage(Request, SystemMessage);\n\t\t}\n\n\t\tGD.Print(\"LlmApi is ready.\");\n\n\t\thttp = GetNode<HttpRequest>(\"HTTPRequest\");\n\t\thttp.RequestCompleted += OnRequestCompleted;\n\t}\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ DeepSeek API Calls ≡≡≡≡≡≡≡≡≡=========---------\n\tpublic int CallDeepSeekChat(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = RequestJson.SetModel(request, \"deepseek-chat\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\tpublic int CallDeepSeekReasoner(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = RequestJson.SetModel(request, \"deepseek-reasoner\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\n\t// Core Call Logic\n\tpublic int CallDeepSeek(ChatCompletionRequest request, string userMessage)\n\t{\n\t\tif (!KeepHistory)\n\t\t{\n\t\t\t// SystemMessage = request.Messages[0].Content;\n\t\t\t// request.Messages.Clear();\n\t\t\t// request = RequestJson.SetSystemMessage(request, SystemMessage);\n\t\t}\n\n\t\trequest.Messages.Add(new ChatMessage\n\t\t{\n\t\t\tRole = \"user\",\n\t\t\tContent = userMessage\n\t\t});\n\n\t\tDeepSeekAPICall(JsonSerializer.Serialize(request));\n\t\tstring jsonRequest = RequestJson.SerializeRequest(request);\n\t\tGD.Print(jsonRequest);\n\n\t\treturn 0;\n\t}\n\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ HTTP Request ≡≡≡≡≡≡≡≡≡=========---------\n\n\tprivate int DeepSeekAPICall(string jsonRequest)\n\t{\n\t\tvar apiKey = System.Environment.GetEnvironmentVariable(\"DEEPSEEK_API_KEY\") ?? \"\";\n\n\t\tif (string.IsNullOrWhiteSpace(apiKey))\n\t\t{\n\t\t\tGD.PushError(\"Missing DEEPSEEK_API_KEY env var.\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tstring[] headers =\n\t\t{\n\t\t\t\"Content-Type: application/json\",\n\t\t\t$\"Authorization: Bearer {apiKey}\"\n\t\t};\n\n\t\t// Request(url, headers, Method.Post, bodyString)\n\t\tvar err = http.Request(Url, headers, HttpClient.Method.Post, jsonRequest);\n\t\tif (err != Error.Ok){\n\t\t\tGD.PushError($\"HTTPRequest error: {err}\");\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Placeholder for actual API call logic\n\t\treturn 0;\n\t}\n\n\n\tprivate void OnRequestCompleted(long result, long responseCode, string[] headers, byte[] body)\n\t{\n\t\tvar respText = System.Text.Encoding.UTF8.GetString(body);\n\n\t\tif (responseCode < 200 || responseCode >= 300)\n\t\t{\n\t\t\tGD.PushError($\"HTTP {responseCode}: {respText}\");\n\t\t\treturn;\n\t\t}\n\n\t\tusing var doc = JsonDocument.Parse(respText);\n\n\t\tstring content = doc.RootElement\n\t\t.GetProperty(\"choices\")[0]\n\t\t.GetProperty(\"message\")\n\t\t.GetProperty(\"content\")\n\t\t.GetString() ?? \"\";\n\n\n\n\t\tif (Receiver != null)\n\t\t{\n\t\t\tReceiver.Call(\"OnLLMResponse\", content);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGD.Print(\"No receiver set for LLMService.\");\n\t\t}\n\n\t}\n\n\n\t// async Task StreamChatAsync(string apiKey, string jsonRequest)\n\t// {\n\t// var http = new System.Net.Http.HttpClient();\n\t// var req = new HttpRequestMessage(HttpMethod.Post, \"https://api.deepseek.com/chat/completions\");\n\t// req.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", apiKey);\n\t// req.Headers.Accept.ParseAdd(\"text/event-stream\");\n\t// req.Content = new StringContent(jsonRequest, Encoding.UTF8, \"application/json\");\n\n\t// using var resp = await http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);\n\t// resp.EnsureSuccessStatusCode();\n\n\t// using var stream = await resp.Content.ReadAsStreamAsync();\n\t// using var reader = new StreamReader(stream);\n\n\t// while (!reader.EndOfStream)\n\t// {\n\t// var line = await reader.ReadLineAsync();\n\t// if (string.IsNullOrWhiteSpace(line)) continue;\n\n\t// // SSE 一般是 \"data: {...}\" 或 \"data: [DONE]\"\n\t// if (!line.StartsWith(\"data:\")) continue;\n\n\t// var data = line.Substring(\"data:\".Length).Trim();\n\t// if (data == \"[DONE]\") break;\n\n\t// // 这里的 data 通常是一个 JSON 片段(delta),按你实际返回结构解析\n\t// using var doc = JsonDocument.Parse(data);\n\n\t// // 例:如果是 OpenAI 风格 delta:choices[0].delta.content\n\t// // var delta = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"delta\").GetProperty(\"content\").GetString();\n\n\t// // 拿到 delta 后,用 CallDeferred 更新 UI\n\t// // CallDeferred(nameof(AppendText), delta);\n\t// }\n\t// }\n}\n"}, "2cf1bfdcd798abf2fcbfe0ecd9e5bfdb2dee7c57": {"t": 1785756622.1158388, "n": 4821, "h": "2bf435f1365654f0", "c": "using Godot;\nusing System;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing System.Text;\n\npublic partial class LLMService : Node2D\n{\n\t[Export(PropertyHint.MultilineText)] public string SystemMessage = \"default\";\n\t[Export] public bool KeepHistory = false;\n\n\tpublic GodotObject Receiver = null;\n\n\tpublic ChatCompletionRequest Request = new ChatCompletionRequest();\n\n\tprivate const string Url = \"https://api.deepseek.com/chat/completions\";\n\tprivate HttpRequest _http;\n\n\tpublic override void _Ready()\n\t{\n\t\t// RequestJson.RequestSetUp(Request, \"deepseek-chat\", SystemMessage, 1.3);\n\n\t\tif (SystemMessage != \"default\")\n\t\t{\n\t\t\tGD.Print(\"Setting up system message in LLMService.\");\n\t\t\tRequest = RequestJson.SetSystemMessage(Request, SystemMessage);\n\t\t}\n\n\t\tGD.Print(\"LlmApi is ready.\");\n\n\t\t_http = GetNode<HttpRequest>(\"HTTPRequest\");\n\t\t_http.RequestCompleted += OnRequestCompleted;\n\t}\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ DeepSeek API Calls ≡≡≡≡≡≡≡≡≡=========---------\n\tpublic int CallDeepSeekChat(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = RequestJson.SetModel(request, \"deepseek-chat\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\tpublic int CallDeepSeekReasoner(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = RequestJson.SetModel(request, \"deepseek-reasoner\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\n\t// Core Call Logic\n\tpublic int CallDeepSeek(ChatCompletionRequest request, string userMessage)\n\t{\n\t\tif (!KeepHistory)\n\t\t{\n\t\t\t// SystemMessage = request.Messages[0].Content;\n\t\t\t// request.Messages.Clear();\n\t\t\t// request = RequestJson.SetSystemMessage(request, SystemMessage);\n\t\t}\n\n\t\trequest.Messages.Add(new ChatMessage\n\t\t{\n\t\t\tRole = \"user\",\n\t\t\tContent = userMessage\n\t\t});\n\n\t\tDeepSeekAPICall(JsonSerializer.Serialize(request));\n\t\tstring json_request = RequestJson.SerializeRequest(request);\n\t\tGD.Print(json_request);\n\n\t\treturn 0;\n\t}\n\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ HTTP Request ≡≡≡≡≡≡≡≡≡=========---------\n\n\tprivate int DeepSeekAPICall(string jsonRequest)\n\t{\n\t\tvar apiKey = System.Environment.GetEnvironmentVariable(\"DEEPSEEK_API_KEY\") ?? \"\";\n\n\t\tif (string.IsNullOrWhiteSpace(apiKey))\n\t\t{\n\t\t\tGD.PushError(\"Missing DEEPSEEK_API_KEY env var.\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tstring[] headers =\n\t\t{\n\t\t\t\"Content-Type: application/json\",\n\t\t\t$\"Authorization: Bearer {apiKey}\"\n\t\t};\n\n\t\t// Request(url, headers, Method.Post, bodyString)\n\t\tvar err = _http.Request(Url, headers, HttpClient.Method.Post, jsonRequest);\n\t\tif (err != Error.Ok){\n\t\t\tGD.PushError($\"HTTPRequest error: {err}\");\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Placeholder for actual API call logic\n\t\treturn 0;\n\t}\n\n\n\tprivate void OnRequestCompleted(long result, long responseCode, string[] headers, byte[] body)\n\t{\n\t\tvar respText = System.Text.Encoding.UTF8.GetString(body);\n\n\t\tif (responseCode < 200 || responseCode >= 300)\n\t\t{\n\t\t\tGD.PushError($\"HTTP {responseCode}: {respText}\");\n\t\t\treturn;\n\t\t}\n\n\t\tusing var doc = JsonDocument.Parse(respText);\n\n\t\tstring content = doc.RootElement\n\t\t.GetProperty(\"choices\")[0]\n\t\t.GetProperty(\"message\")\n\t\t.GetProperty(\"content\")\n\t\t.GetString() ?? \"\";\n\n\n\n\t\tif (Receiver != null)\n\t\t{\n\t\t\tReceiver.Call(\"OnLLMResponse\", content);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGD.Print(\"No receiver set for LLMService.\");\n\t\t}\n\n\t}\n\n\n\t// async Task StreamChatAsync(string apiKey, string jsonRequest)\n\t// {\n\t// var http = new System.Net.Http.HttpClient();\n\t// var req = new HttpRequestMessage(HttpMethod.Post, \"https://api.deepseek.com/chat/completions\");\n\t// req.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", apiKey);\n\t// req.Headers.Accept.ParseAdd(\"text/event-stream\");\n\t// req.Content = new StringContent(jsonRequest, Encoding.UTF8, \"application/json\");\n\n\t// using var resp = await http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);\n\t// resp.EnsureSuccessStatusCode();\n\n\t// using var stream = await resp.Content.ReadAsStreamAsync();\n\t// using var reader = new StreamReader(stream);\n\n\t// while (!reader.EndOfStream)\n\t// {\n\t// var line = await reader.ReadLineAsync();\n\t// if (string.IsNullOrWhiteSpace(line)) continue;\n\n\t// // SSE 一般是 \"data: {...}\" 或 \"data: [DONE]\"\n\t// if (!line.StartsWith(\"data:\")) continue;\n\n\t// var data = line.Substring(\"data:\".Length).Trim();\n\t// if (data == \"[DONE]\") break;\n\n\t// // 这里的 data 通常是一个 JSON 片段(delta),按你实际返回结构解析\n\t// using var doc = JsonDocument.Parse(data);\n\n\t// // 例:如果是 OpenAI 风格 delta:choices[0].delta.content\n\t// // var delta = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"delta\").GetProperty(\"content\").GetString();\n\n\t// // 拿到 delta 后,用 CallDeferred 更新 UI\n\t// // CallDeferred(nameof(AppendText), delta);\n\t// }\n\t// }\n}\n"}, "83b3f40cb67ee91a8150979d99210a1842d5ec9d": {"t": 1785756623.5392227, "n": 4827, "h": "3ebc6cc6bc9485a5", "c": "using Godot;\nusing System;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing System.Text;\n\npublic partial class LLMService : Node2D\n{\n\t[Export(PropertyHint.MultilineText)] public string SystemMessage = \"default\";\n\t[Export] public bool KeepHistory = false;\n\n\tpublic GodotObject Receiver = null;\n\n\tpublic ChatCompletionRequest Request = new ChatCompletionRequest();\n\n\tprivate const string Url = \"https://api.deepseek.com/chat/completions\";\n\tprivate HttpRequest _http;\n\n\tpublic override void _Ready()\n\t{\n\t\t// DeepSeekJson.RequestSetUp(Request, \"deepseek-chat\", SystemMessage, 1.3);\n\n\t\tif (SystemMessage != \"default\")\n\t\t{\n\t\t\tGD.Print(\"Setting up system message in LLMService.\");\n\t\t\tRequest = DeepSeekJson.SetSystemMessage(Request, SystemMessage);\n\t\t}\n\n\t\tGD.Print(\"LlmApi is ready.\");\n\n\t\t_http = GetNode<HttpRequest>(\"HTTPRequest\");\n\t\t_http.RequestCompleted += OnRequestCompleted;\n\t}\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ DeepSeek API Calls ≡≡≡≡≡≡≡≡≡=========---------\n\tpublic int CallDeepSeekChat(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = DeepSeekJson.SetModel(request, \"deepseek-chat\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\tpublic int CallDeepSeekReasoner(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = DeepSeekJson.SetModel(request, \"deepseek-reasoner\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\n\t// Core Call Logic\n\tpublic int CallDeepSeek(ChatCompletionRequest request, string userMessage)\n\t{\n\t\tif (!KeepHistory)\n\t\t{\n\t\t\t// SystemMessage = request.Messages[0].Content;\n\t\t\t// request.Messages.Clear();\n\t\t\t// request = DeepSeekJson.SetSystemMessage(request, SystemMessage);\n\t\t}\n\n\t\trequest.Messages.Add(new ChatMessage\n\t\t{\n\t\t\tRole = \"user\",\n\t\t\tContent = userMessage\n\t\t});\n\n\t\tDeepSeekAPICall(JsonSerializer.Serialize(request));\n\t\tstring json_request = DeepSeekJson.SerializeRequest(request);\n\t\tGD.Print(json_request);\n\n\t\treturn 0;\n\t}\n\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ HTTP Request ≡≡≡≡≡≡≡≡≡=========---------\n\n\tprivate int DeepSeekAPICall(string jsonRequest)\n\t{\n\t\tvar apiKey = System.Environment.GetEnvironmentVariable(\"DEEPSEEK_API_KEY\") ?? \"\";\n\n\t\tif (string.IsNullOrWhiteSpace(apiKey))\n\t\t{\n\t\t\tGD.PushError(\"Missing DEEPSEEK_API_KEY env var.\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tstring[] headers =\n\t\t{\n\t\t\t\"Content-Type: application/json\",\n\t\t\t$\"Authorization: Bearer {apiKey}\"\n\t\t};\n\n\t\t// Request(url, headers, Method.Post, bodyString)\n\t\tvar err = _http.Request(Url, headers, HttpClient.Method.Post, jsonRequest);\n\t\tif (err != Error.Ok){\n\t\t\tGD.PushError($\"HTTPRequest error: {err}\");\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Placeholder for actual API call logic\n\t\treturn 0;\n\t}\n\n\n\tprivate void OnRequestCompleted(long result, long responseCode, string[] headers, byte[] body)\n\t{\n\t\tvar respText = System.Text.Encoding.UTF8.GetString(body);\n\n\t\tif (responseCode < 200 || responseCode >= 300)\n\t\t{\n\t\t\tGD.PushError($\"HTTP {responseCode}: {respText}\");\n\t\t\treturn;\n\t\t}\n\n\t\tusing var doc = JsonDocument.Parse(respText);\n\n\t\tstring content = doc.RootElement\n\t\t.GetProperty(\"choices\")[0]\n\t\t.GetProperty(\"message\")\n\t\t.GetProperty(\"content\")\n\t\t.GetString() ?? \"\";\n\n\n\n\t\tif (Receiver != null)\n\t\t{\n\t\t\tReceiver.Call(\"OnLLMResponse\", content);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGD.Print(\"No receiver set for LLMService.\");\n\t\t}\n\n\t}\n\n\n\t// async Task StreamChatAsync(string apiKey, string jsonRequest)\n\t// {\n\t// var http = new System.Net.Http.HttpClient();\n\t// var req = new HttpRequestMessage(HttpMethod.Post, \"https://api.deepseek.com/chat/completions\");\n\t// req.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", apiKey);\n\t// req.Headers.Accept.ParseAdd(\"text/event-stream\");\n\t// req.Content = new StringContent(jsonRequest, Encoding.UTF8, \"application/json\");\n\n\t// using var resp = await http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);\n\t// resp.EnsureSuccessStatusCode();\n\n\t// using var stream = await resp.Content.ReadAsStreamAsync();\n\t// using var reader = new StreamReader(stream);\n\n\t// while (!reader.EndOfStream)\n\t// {\n\t// var line = await reader.ReadLineAsync();\n\t// if (string.IsNullOrWhiteSpace(line)) continue;\n\n\t// // SSE 一般是 \"data: {...}\" 或 \"data: [DONE]\"\n\t// if (!line.StartsWith(\"data:\")) continue;\n\n\t// var data = line.Substring(\"data:\".Length).Trim();\n\t// if (data == \"[DONE]\") break;\n\n\t// // 这里的 data 通常是一个 JSON 片段(delta),按你实际返回结构解析\n\t// using var doc = JsonDocument.Parse(data);\n\n\t// // 例:如果是 OpenAI 风格 delta:choices[0].delta.content\n\t// // var delta = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"delta\").GetProperty(\"content\").GetString();\n\n\t// // 拿到 delta 后,用 CallDeferred 更新 UI\n\t// // CallDeferred(nameof(AppendText), delta);\n\t// }\n\t// }\n}\n"}, "5944c0dd78006c90ccfe8b74c094954a99086884": {"t": 1785756625.0097365, "n": 4818, "h": "064defea694ad2e5", "c": "using Godot;\nusing System;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing System.Text;\n\npublic partial class LLMService : Node2D\n{\n\t[Export(PropertyHint.MultilineText)] public string SystemMessage = \"default\";\n\t[Export] public bool KeepHistory = false;\n\n\tpublic GodotObject Receiver = null;\n\n\tpublic ChatCompletionRequest Request = new ChatCompletionRequest();\n\n\tprivate const string Url = \"https://api.deepseek.com/chat/completions\";\n\tprivate HttpRequest _http;\n\n\tpublic override void _Ready()\n\t{\n\t\t// DeepSeekJson.RequestSetUp(Request, \"deepseek-chat\", SystemMessage, 1.3);\n\n\t\tif (SystemMessage != \"default\")\n\t\t{\n\t\t\tGD.Print(\"Setting up system message in LLMService.\");\n\t\t\tRequest = DeepSeekJson.SetSystemMessage(Request, SystemMessage);\n\t\t}\n\n\t\tGD.Print(\"LlmApi is ready.\");\n\n\t\t_http = GetNode<HttpRequest>(\"HTTPRequest\");\n\t\t_http.RequestCompleted += OnRequestCompleted;\n\t}\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ DeepSeek API Calls ≡≡≡≡≡≡≡≡≡=========---------\n\tpublic int CallDeepSeekChat(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = DeepSeekJson.SetModel(request, \"deepseek-chat\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\tpublic int CallDeepSeekReasoner(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = DeepSeekJson.SetModel(request, \"deepseek-reasoner\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\n\t// Core Call Logic\n\tpublic int CallDeepSeek(ChatCompletionRequest request, string userMessage)\n\t{\n\t\tif (!KeepHistory)\n\t\t{\n\t\t\tSystemMessage = request.Messages[0].Content;\n\t\t\trequest.Messages.Clear();\n\t\t\trequest = DeepSeekJson.SetSystemMessage(request, SystemMessage);\n\t\t}\n\n\t\trequest.Messages.Add(new ChatMessage\n\t\t{\n\t\t\tRole = \"user\",\n\t\t\tContent = userMessage\n\t\t});\n\n\t\tDeepSeekAPICall(JsonSerializer.Serialize(request));\n\t\tstring json_request = DeepSeekJson.SerializeRequest(request);\n\t\tGD.Print(json_request);\n\n\t\treturn 0;\n\t}\n\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ HTTP Request ≡≡≡≡≡≡≡≡≡=========---------\n\n\tprivate int DeepSeekAPICall(string jsonRequest)\n\t{\n\t\tvar apiKey = System.Environment.GetEnvironmentVariable(\"DEEPSEEK_API_KEY\") ?? \"\";\n\n\t\tif (string.IsNullOrWhiteSpace(apiKey))\n\t\t{\n\t\t\tGD.PushError(\"Missing DEEPSEEK_API_KEY env var.\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tstring[] headers =\n\t\t{\n\t\t\t\"Content-Type: application/json\",\n\t\t\t$\"Authorization: Bearer {apiKey}\"\n\t\t};\n\n\t\t// Request(url, headers, Method.Post, bodyString)\n\t\tvar err = _http.Request(Url, headers, HttpClient.Method.Post, jsonRequest);\n\t\tif (err != Error.Ok){\n\t\t\tGD.PushError($\"HTTPRequest error: {err}\");\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Placeholder for actual API call logic\n\t\treturn 0;\n\t}\n\n\n\tprivate void OnRequestCompleted(long result, long responseCode, string[] headers, byte[] body)\n\t{\n\t\tvar respText = System.Text.Encoding.UTF8.GetString(body);\n\n\t\tif (responseCode < 200 || responseCode >= 300)\n\t\t{\n\t\t\tGD.PushError($\"HTTP {responseCode}: {respText}\");\n\t\t\treturn;\n\t\t}\n\n\t\tusing var doc = JsonDocument.Parse(respText);\n\n\t\tstring content = doc.RootElement\n\t\t.GetProperty(\"choices\")[0]\n\t\t.GetProperty(\"message\")\n\t\t.GetProperty(\"content\")\n\t\t.GetString() ?? \"\";\n\n\n\n\t\tif (Receiver != null)\n\t\t{\n\t\t\tReceiver.Call(\"OnLLMResponse\", content);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGD.Print(\"No receiver set for LLMService.\");\n\t\t}\n\n\t}\n\n\n\t// async Task StreamChatAsync(string apiKey, string jsonRequest)\n\t// {\n\t// var http = new System.Net.Http.HttpClient();\n\t// var req = new HttpRequestMessage(HttpMethod.Post, \"https://api.deepseek.com/chat/completions\");\n\t// req.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", apiKey);\n\t// req.Headers.Accept.ParseAdd(\"text/event-stream\");\n\t// req.Content = new StringContent(jsonRequest, Encoding.UTF8, \"application/json\");\n\n\t// using var resp = await http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);\n\t// resp.EnsureSuccessStatusCode();\n\n\t// using var stream = await resp.Content.ReadAsStreamAsync();\n\t// using var reader = new StreamReader(stream);\n\n\t// while (!reader.EndOfStream)\n\t// {\n\t// var line = await reader.ReadLineAsync();\n\t// if (string.IsNullOrWhiteSpace(line)) continue;\n\n\t// // SSE 一般是 \"data: {...}\" 或 \"data: [DONE]\"\n\t// if (!line.StartsWith(\"data:\")) continue;\n\n\t// var data = line.Substring(\"data:\".Length).Trim();\n\t// if (data == \"[DONE]\") break;\n\n\t// // 这里的 data 通常是一个 JSON 片段(delta),按你实际返回结构解析\n\t// using var doc = JsonDocument.Parse(data);\n\n\t// // 例:如果是 OpenAI 风格 delta:choices[0].delta.content\n\t// // var delta = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"delta\").GetProperty(\"content\").GetString();\n\n\t// // 拿到 delta 后,用 CallDeferred 更新 UI\n\t// // CallDeferred(nameof(AppendText), delta);\n\t// }\n\t// }\n}\n"}, "abbb8d419d57ef6edd6f15c3c4e12c72f574bcd7": {"t": 1785756626.3634527, "n": 4364, "h": "a99f0af05e3f2d07", "c": "using Godot;\nusing System;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing System.Text;\n\npublic partial class LLMService : Node2D\n{\n\t[Export(PropertyHint.MultilineText)] public string SystemMessage = \"default\";\n\t[Export] public bool KeepHistory = false;\n\n\tpublic ChatCompletionRequest Request = new ChatCompletionRequest();\n\n\tprivate const string Url = \"https://api.deepseek.com/chat/completions\";\n\tprivate HttpRequest _http;\n\n\tpublic override void _Ready()\n\t{\n\t\t// DeepSeekJson.RequestSetUp(Request, \"deepseek-chat\", SystemMessage, 1.3);\n\n\t\tif (SystemMessage != \"default\")\n\t\t{\n\t\t\tRequest = DeepSeekJson.SetSystemMessage(Request, SystemMessage);\n\t\t}\n\n\t\tGD.Print(\"LlmApi is ready.\");\n\n\t\t_http = GetNode<HttpRequest>(\"HTTPRequest\");\n\t\t_http.RequestCompleted += OnRequestCompleted;\n\t}\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ DeepSeek API Calls ≡≡≡≡≡≡≡≡≡=========---------\n\tpublic int CallDeepSeekChat(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = DeepSeekJson.SetModel(request, \"deepseek-chat\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\tpublic int CallDeepSeekReasoner(ChatCompletionRequest request, string userMessage)\n\t{\n\t\trequest = DeepSeekJson.SetModel(request, \"deepseek-reasoner\");\n\t\tCallDeepSeek(request, userMessage);\n\n\t\treturn 0;\n\t}\n\n\n\t// Core Call Logic\n\tpublic int CallDeepSeek(ChatCompletionRequest request, string userMessage)\n\t{\n\t\tif (!KeepHistory)\n\t\t{\n\t\t\trequest.Messages.Clear();\n\t\t\trequest = DeepSeekJson.SetSystemMessage(request, SystemMessage);\n\t\t}\n\n\t\trequest.Messages.Add(new ChatMessage\n\t\t{\n\t\t\tRole = \"user\",\n\t\t\tContent = userMessage\n\t\t});\n\n\t\tDeepSeekAPICall(JsonSerializer.Serialize(request));\n\n\t\treturn 0;\n\t}\n\n\t\n\t// ---------=========≡≡≡≡≡≡≡≡≡ HTTP Request ≡≡≡≡≡≡≡≡≡=========---------\n\n\tprivate int DeepSeekAPICall(string jsonRequest)\n\t{\n\t\tvar apiKey = System.Environment.GetEnvironmentVariable(\"DEEPSEEK_API_KEY\") ?? \"\";\n\n\t\tif (string.IsNullOrWhiteSpace(apiKey))\n\t\t{\n\t\t\tGD.PushError(\"Missing DEEPSEEK_API_KEY env var.\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tstring[] headers =\n\t\t{\n\t\t\t\"Content-Type: application/json\",\n\t\t\t$\"Authorization: Bearer {apiKey}\"\n\t\t};\n\n\t\t// Request(url, headers, Method.Post, bodyString)\n\t\tvar err = _http.Request(Url, headers, HttpClient.Method.Post, jsonRequest);\n\t\tif (err != Error.Ok){\n\t\t\tGD.PushError($\"HTTPRequest error: {err}\");\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Placeholder for actual API call logic\n\t\treturn 0;\n\t}\n\n\tprivate void OnRequestCompleted(long result, long responseCode, string[] headers, byte[] body)\n\t{\n\t\tvar respText = System.Text.Encoding.UTF8.GetString(body);\n\n\t\tif (responseCode < 200 || responseCode >= 300)\n\t\t{\n\t\t\tGD.PushError($\"HTTP {responseCode}: {respText}\");\n\t\t\treturn;\n\t\t}\n\n\t\tGD.Print(respText); // 这里就是 DeepSeek 返回的 JSON 字符串\n\t\t// 你可以在这里调用你写的 JsonHandler.GetDeepSeekContent(respText)\n\t}\n\n\n\t// async Task StreamChatAsync(string apiKey, string jsonRequest)\n\t// {\n\t// var http = new System.Net.Http.HttpClient();\n\t// var req = new HttpRequestMessage(HttpMethod.Post, \"https://api.deepseek.com/chat/completions\");\n\t// req.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", apiKey);\n\t// req.Headers.Accept.ParseAdd(\"text/event-stream\");\n\t// req.Content = new StringContent(jsonRequest, Encoding.UTF8, \"application/json\");\n\n\t// using var resp = await http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);\n\t// resp.EnsureSuccessStatusCode();\n\n\t// using var stream = await resp.Content.ReadAsStreamAsync();\n\t// using var reader = new StreamReader(stream);\n\n\t// while (!reader.EndOfStream)\n\t// {\n\t// var line = await reader.ReadLineAsync();\n\t// if (string.IsNullOrWhiteSpace(line)) continue;\n\n\t// // SSE 一般是 \"data: {...}\" 或 \"data: [DONE]\"\n\t// if (!line.StartsWith(\"data:\")) continue;\n\n\t// var data = line.Substring(\"data:\".Length).Trim();\n\t// if (data == \"[DONE]\") break;\n\n\t// // 这里的 data 通常是一个 JSON 片段(delta),按你实际返回结构解析\n\t// using var doc = JsonDocument.Parse(data);\n\n\t// // 例:如果是 OpenAI 风格 delta:choices[0].delta.content\n\t// // var delta = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"delta\").GetProperty(\"content\").GetString();\n\n\t// // 拿到 delta 后,用 CallDeferred 更新 UI\n\t// // CallDeferred(nameof(AppendText), delta);\n\t// }\n\t// }\n}\n"}}}}