1 line
32 KiB
JSON
1 line
32 KiB
JSON
{"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"}}}} |