from flask import Flask, request, jsonify, render_template_string from sentence_transformers import SentenceTransformer, util import logging import sys import signal # 初始化 Flask 应用 app = Flask(__name__) # 配置日志,级别设为 INFO logging.basicConfig(level=logging.INFO) app.logger = logging.getLogger("CodeSearchAPI") # 预定义代码片段 CODE_SNIPPETS = [ "Console.WriteLine(\"Hello, World!\");", """int Sum(int a,int b){ return a+b; }""", "var rnd = new Random().Next();", """bool IsEven(int n){ return n % 2 == 0; }""", "int len = str.Length;", "DateTime today = DateTime.Today;", "bool exists = File.Exists(path);", "string content = File.ReadAllText(path);", "File.WriteAllText(path, content);", "DateTime now = DateTime.Now;", "string upper = s.ToUpper();", "string lower = s.ToLower();", """string Reverse(string s){ return new string(s.Reverse().ToArray()); }""", "int count = list.Count;", "var max = list.Max();", "var min = list.Min();", "list.Sort();", "var merged = list1.Concat(list2).ToList();", "list.Remove(item);", "bool empty = !list.Any();", """int CountChar(string s, char c){ return s.Count(x => x == c); }""", "bool contains = s.Contains(sub);", "string s2 = num.ToString();", "int n2 = int.Parse(s);", """bool IsNumber(string s){ return int.TryParse(s, out ); }""", "int idx = list.IndexOf(item);", "list.Clear();", "list.Reverse();", "var unique = list.Distinct().ToList();", "bool has = list.Contains(item);", "var dict = new Dictionary();", "dict[key] = value;", "dict.Remove(key);", "var keys = dict.Keys;", "var values = dict.Values;", "var mergedDict = dict1.Concat(dict2).ToDictionary(kv => kv.Key, kv => kv.Value);", "bool dictEmpty = dict.Count == 0;", "var v = dict[key];", "bool hasKey = dict.ContainsKey(key);", "dict.Clear();", "int lines = File.ReadAllLines(path).Length;", "File.WriteAllLines(path, list);", "var list2 = File.ReadAllLines(path).ToList();", "int words = File.ReadAllText(path).Split().Length;", """bool IsLeap(int y){ return DateTime.IsLeapYear(y); }""", "string timeStr = DateTime.Now.ToString("HH:mm:ss");", """int DaysBetween(DateTime a, DateTime b){ return (int)(b - a).TotalDays; }""", "string cwd = Directory.GetCurrentDirectory();", "var files = Directory.GetFiles(path);", "Directory.CreateDirectory(path);", "Directory.Delete(path);", "bool isFile = File.Exists(path);", "bool isDir = Directory.Exists(path);", "long size = new FileInfo(path).Length;", "File.Move(oldPath, newPath);", "File.Copy(src, dest);", "File.Move(src, dest);", "File.Delete(path);", "string env = Environment.GetEnvironmentVariable(name);", "Environment.SetEnvironmentVariable(name, value);", "Process.Start(new ProcessStartInfo(url){ UseShellExecute = true });", "var response = await new HttpClient().GetAsync(url);", "dynamic obj = JsonConvert.DeserializeObject(json);", "File.WriteAllText(path, JsonConvert.SerializeObject(data));", "var data = JsonConvert.DeserializeObject(File.ReadAllText(path));", "string s3 = string.Join("", list);", "var list3 = s.ToCharArray().ToList();", "string s4 = string.Join(",", list);", "string s5 = string.Join(Environment.NewLine, list);", "var parts1 = s.Split(' ');", "var parts2 = s.Split(delimiter);", "var chars = s.ToCharArray();", "string r2 = s.Replace(oldValue, newValue);", "string r3 = s.Replace(" ","");", """string RemovePunct(string s){ return new string(s.Where(c => !char.IsPunctuation(c)).ToArray()); }""", "bool strEmpty = string.IsNullOrEmpty(s);", """bool IsPal(string s){ var r = new string(s.Reverse().ToArray()); return s == r; }""", "File.WriteAllLines(path, rows);", "var rows = File.ReadAllLines(path).Select(line => line.Split(',')).ToList();", "int csvLines = File.ReadAllLines(path).Length;", """void Shuffle(List l){ var r = new Random(); for(int i = l.Count - 1; i > 0; i--){ int j = r.Next(i + 1); var t = l[i]; l[i] = l[j]; l[j] = t; } }""", "var e = list[new Random().Next(list.Count)];", "var items = list.OrderBy(x => Guid.NewGuid()).Take(n).ToList();", "int dice = new Random().Next(1, 7);", "string coin = new Random().Next(2) == 0 ? "Heads" : "Tails";", """string RandPwd(int l){ const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var r = new Random(); return new string(Enumerable.Range(0, l).Select( => chars[r.Next(chars.Length)]).ToArray()); }""", """string RandColor(){ var r = new Random(); return $"#{r.Next(0x1000000):X6}"; }""", "string id = Guid.NewGuid().ToString();", """class MyClass{}""", "var obj2 = new MyClass();", """class MyClass2{ public void MyMethod(){} }""", """class MyClass3{ public int MyProperty { get; set; } }""", """class SubClass : MyClass2{}""", """class SubClass2 : MyClass2{ public override void MyMethod(){} }""", "obj2.MyMethod();", "MyClass2.StaticMethod();", "bool isType = obj2 is MyClass2;", "var val2 = obj2.MyProperty;", "obj2.MyProperty = value;", """((IDictionary)obj2).Remove("MyProperty");"", "try { SomeMethod(); } catch(Exception ex) { Console.WriteLine(ex.Message); }", """public class MyException:Exception{public MyException(string m):base(m){}} throw new MyException("error");""", "string message = ex.Message;", "File.AppendAllText("error.log", ex.ToString());", """var sw=new System.Diagnostics.Stopwatch(); sw.Start();""", "sw.Stop(); var elapsed = sw.Elapsed;", """for(int i=0;i<=100;i++) { Console.Write($"\r[{new string('#',i/10).PadRight(10,' ')}] {i}%"); }""", "System.Threading.Thread.Sleep(1000);", "Func square = x => x * x;", "var mapped = list.Select(x => x * x);", "var filtered = list.Where(x => x % 2 == 0);", "var reduced = list.Aggregate((a, b) => a + b);", "var listComp = (from x in list select x * x).ToList();", "var dictComp = list.ToDictionary(x => x, x => x.ToString());", "var setComp = new HashSet(list.Select(x => x));", "var intersection = set1.Intersect(set2);", "var union = set1.Union(set2);", "var difference = set1.Except(set2);", "var noNulls = list.Where(x => x != null).ToList();", """try { using(var fs=File.Open(path,FileMode.Open)){} } catch{}""", "if(obj is string) { /* type is string / }", "bool b = bool.Parse(s);", "if(x > 0) Console.WriteLine(x);", "while(condition) DoWork();", "foreach(var item in list) Console.WriteLine(item);", "foreach(var kv in dict) Console.WriteLine(kv.Key + ":" + kv.Value);", "foreach(var c in str) Console.Write(c);", "for(int i=0;i<10;i++){ if(i==5) break; }", "for(int i=0;i<10;i++){ if(i%2==0) continue; Console.Write(i); }", "int Add(int a,int b){return a+b;}", "int Mul(int a,int b=2){return ab;}", "(int min,int max) GetMinMax(int[] a){return (a.Min(),a.Max());}", "int Sum(params int[] a){return a.Sum();}", """void Foo(int x,int y){} Foo(y:2,x:1);""", """T Timed(Func fn) { var sw=new System.Diagnostics.Stopwatch(); sw.Start(); var result=fn(); sw.Stop(); Console.WriteLine(sw.Elapsed); return result; }""", """Func memoized = null; var cache = new Dictionary(); memoized = x => cache.ContainsKey(x)?cache[x]:(cache[x]=x* x);""", """IEnumerable Gen() { for(int i=0;i<10;i++) yield return i; }""", "var e = Gen().GetEnumerator(); e.MoveNext(); var first = e.Current;", """class MyCollection : IEnumerable { int[] data={1,2,3}; public IEnumerator GetEnumerator(){foreach(var i in data)yield return i;} IEnumerator IEnumerable.GetEnumerator()=>GetEnumerator(); }""", """var enumerator = list.GetEnumerator(); while(enumerator.MoveNext()) Console.WriteLine(enumerator.Current);""", "foreach(var t in list.Select((v,i)=>new{v,i})) Console.WriteLine(t.i+":"+t.v);", "var zipped = list1.Zip(list2,(a,b)=>(a,b));", "var toDict = list1.Zip(list2,(a,b)=>new{a,b}).ToDictionary(x=>x.a,x=>x.b);", "bool eqList = list1.SequenceEqual(list2);", "bool eqDict = dict1.Count==dict2.Count && !dict1.Except(dict2).Any();", "bool eqSet = set1.SetEquals(set2);", "var unique = list.Distinct().ToList();", "set.Clear();", "bool isEmpty = set.Count==0;", "set.Add(item);", "set.Remove(item);", "bool contains = set.Contains(item);", "int count = set.Count;", "bool hasOverlap = set1.Overlaps(set2);", "bool isSubset = new HashSet(list1).IsSupersetOf(list2);", "bool isSubstring = str.Contains(sub);", "char first = str[0];", "char last = str[^1];", "bool isText = Path.GetExtension(path)==\".txt\";", "bool isImage = new[]{\".png\",\".jpg\",\".jpeg\",\".gif\"}.Contains(Path.GetExtension(path));", "double rounded = Math.Round(d);", "double up = Math.Ceiling(d);", "double down = Math.Floor(d);", "string formatted = d.ToString(\"F2\");", """var rnd=new Random(); var s=new string(Enumerable.Range(0,8).Select(_=>"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[rnd.Next(26)]).ToArray());""", "bool exists = File.Exists(path)||Directory.Exists(path);", "var files = Directory.GetFiles(dir, "", SearchOption.AllDirectories);", "string ext = Path.GetExtension(path);", "string name = Path.GetFileName(path);", "string full = Path.GetFullPath(path);", """var p=new Process{ StartInfo=new ProcessStartInfo("python","--version"){ RedirectStandardOutput=true } }; p.Start(); string version=p.StandardOutput.ReadToEnd();""", "string osInfo = Environment.OSVersion.ToString();", "int cores = Environment.ProcessorCount;", "ulong mem = new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;", """var usage = DriveInfo.GetDrives() .Select(d=>new{d.Name,d.TotalSize,d.AvailableFreeSpace});""", "var ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList.First(a=>a.AddressFamily==System.Net.Sockets.AddressFamily.InterNetwork);", "bool online = new System.Net.NetworkInformation.Ping().Send("8.8.8.8").Status==System.Net.NetworkInformation.IPStatus.Success;", "new WebClient().DownloadFile(url,path);", "Console.WriteLine(\"Uploading \"+path);", "var response=await new HttpClient().PostAsync(url,new StringContent(data));", "var getResponse=await new HttpClient().GetAsync(url+"?"+query);", "var client=new HttpClient(); client.DefaultRequestHeaders.Add("Header","Value");", """var doc=new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html);""", "string title=doc.DocumentNode.SelectSingleNode(\"//title\").InnerText;", "var links=doc.DocumentNode.SelectNodes(\"//a[@href]\").Select(n=>n.Attributes[\"href\"].Value);", """foreach(var img in links.Where(u=>u.EndsWith(".png")||u.EndsWith(".jpg"))) new WebClient().DownloadFile(img,Path.GetFileName(img));""", """var freq=text.Split() .GroupBy(w=>w) .ToDictionary(g=>g.Key,g=>g.Count());""", """var loginResponse=await client.PostAsync(loginUrl,new FormUrlEncodedContent(new[]{new KeyValuePair("user",u),("pass",p)})); var content=await loginResponse.Content.ReadAsStringAsync();""", "string plain=Regex.Replace(html,\"<.?>\"," ");", "var emails=Regex.Matches(text,\"[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}\");", "var phones=Regex.Matches(text,"\d{3}-\d{4}-\d{4}");", "var numbers=Regex.Matches(text,"\d+");", "string replaced=Regex.Replace(text,"old","new");", "bool isMatch=Regex.IsMatch(text,pattern);", "string noTags=Regex.Replace(html,\"<.*?>\"," ");", "string encoded=System.Net.WebUtility.HtmlEncode(s);", "string decoded=System.Net.WebUtility.HtmlDecode(s);", """var form=new System.Windows.Forms.Form(); System.Windows.Forms.Application.Run(form);""", "var button = new Button { Text = \"Click Me\" }; window.Controls.Add(button);", "button.Click += (sender, e) => { MessageBox.Show(\"Button Clicked!\"); };", "MessageBox.Show(\"This is a popup message!\");", "var input = textBox.Text;", "window.Text = \"New Window Title\";", "window.Size = new Size(800, 600);", "window.StartPosition = FormStartPosition.CenterScreen;", "var menuStrip = new MenuStrip(); window.Controls.Add(menuStrip);", "var comboBox = new ComboBox(); window.Controls.Add(comboBox);", "var radioButton = new RadioButton { Text = \"Option 1\" }; window.Controls.Add(radioButton);", "var checkBox = new CheckBox { Text = \"Check Me\" }; window.Controls.Add(checkBox);", "var pictureBox = new PictureBox { Image = Image.FromFile(\"image.jpg\") }; window.Controls.Add(pictureBox);", "var player = new SoundPlayer(\"audio.wav\"); player.Play();", "var player = new AxWMPLib.AxWindowsMediaPlayer(); player.URL = \"video.mp4\"; window.Controls.Add(player);", "var currentTime = player.Ctlcontrols.currentPosition;", "var bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); var g = Graphics.FromImage(bmp); g.CopyFromScreen(0, 0, 0, 0, bmp.Size); bmp.Save(\"screenshot.png\");", "var recorder = new ScreenRecorder(); recorder.StartRecording(); Thread.Sleep(5000); recorder.StopRecording();", "var mousePos = Cursor.Position;", "SendKeys.Send(\"Hello World\");", "Cursor.Position = new Point(100, 100); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);", "var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();", "var date = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;", "var timestamp = new DateTimeOffset(date).ToUnixTimeSeconds();", "var dayOfWeek = DateTime.Now.DayOfWeek;", "var daysInMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);", "var firstDayOfYear = new DateTime(DateTime.Now.Year, 1, 1);", "var lastDayOfYear = new DateTime(DateTime.Now.Year, 12, 31);", "var firstDayOfMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);", "var lastDayOfMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));", "var isWeekday = DateTime.Now.DayOfWeek != DayOfWeek.Saturday && DateTime.Now.DayOfWeek != DayOfWeek.Sunday;", "var isWeekend = DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday;", "var currentHour = DateTime.Now.Hour;", "var currentMinute = DateTime.Now.Minute;", "var currentSecond = DateTime.Now.Second;", "Thread.Sleep(1000);", "var millisTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();", "var formattedTime = DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\");", "var parsedTime = DateTime.Parse(\"2023-10-01 12:00:00\");", "var thread = new Thread(() => { }); thread.Start();", "Thread.Sleep(1000);", "Parallel.Invoke(() => { }, () => { });", "var threadName = Thread.CurrentThread.Name;", "thread.IsBackground = true;", "var lockObj = new object(); lock (lockObj) { }", "var process = Process.Start(\"notepad.exe\");", "var pid = process.Id;", "var isAlive = !process.HasExited;", "Parallel.Invoke(() => { }, () => { });", "var queue = new Queue(); queue.Enqueue(1); var value = queue.Dequeue();", "var pipe = new AnonymousPipeServerStream();", "Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1;", "var process = Process.Start(\"cmd.exe\", \"/c dir\");", "var output = process.StandardOutput.ReadToEnd();", "var exitCode = process.ExitCode;", "var isSuccess = exitCode == 0;", "var scriptPath = System.Reflection.Assembly.GetExecutingAssembly().Location;", "var args = Environment.GetCommandLineArgs();", "var parser = new ArgumentParser(); var args = parser.ParseArgs();", "var help = parser.PrintHelp();", "var modules = AppDomain.CurrentDomain.GetAssemblies();", "Process.Start(\"pip\", \"install package_name\").WaitForExit();", "Process.Start(\"pip\", \"uninstall package_name\").WaitForExit();", "var version = Assembly.GetExecutingAssembly().GetName().Version;", "Process.Start(\"python\", \"-m venv venv\").WaitForExit();", "var packages = Process.Start(\"pip\", \"list\").StandardOutput.ReadToEnd();", "Process.Start(\"pip\", \"install --upgrade package_name\").WaitForExit();", "var connection = new SqlConnection(\"Server=localhost;Database=test;User Id=sa;Password=password;\"); connection.Open();", "var command = new SqlCommand(\"SELECT * FROM table\", connection); var reader = command.ExecuteReader();", "var command = new SqlCommand(\"INSERT INTO table (column) VALUES ('value')\", connection); command.ExecuteNonQuery();", "var command = new SqlCommand(\"DELETE FROM table WHERE id = 1\", connection); command.ExecuteNonQuery();", "var command = new SqlCommand(\"UPDATE table SET column = 'value' WHERE id = 1\", connection); command.ExecuteNonQuery();", "var command = new SqlCommand(\"SELECT * FROM table\", connection); var reader = command.ExecuteReader(); while (reader.Read()) { }", "var command = new SqlCommand(\"SELECT * FROM table WHERE column = @value\", connection); command.Parameters.AddWithValue(\"@value\", \"value\"); var reader = command.ExecuteReader();", "connection.Close();", "var command = new SqlCommand(\"CREATE TABLE table (id INT PRIMARY KEY, column VARCHAR(255))\", connection); command.ExecuteNonQuery();", "var command = new SqlCommand(\"DROP TABLE table\", connection); command.ExecuteNonQuery();", "var exists = connection.GetSchema(\"Tables\").Rows.Cast().Any(row => row[\"TABLE_NAME\"].ToString() == \"table\");", "var tables = connection.GetSchema(\"Tables\").Rows.Cast().Select(row => row[\"TABLE_NAME\"].ToString()).ToList();", "var context = new DbContext(); context.Table.Add(new Model { Column = \"value\" }); context.SaveChanges();", "var data = context.Table.Where(x => x.Column == \"value\").ToList();", "var entity = context.Table.First(x => x.Id == 1); context.Table.Remove(entity); context.SaveChanges();", "var entity = context.Table.First(x => x.Id == 1); entity.Column = \"new_value\"; context.SaveChanges();", "public class Model { public int Id { get; set; } public string Column { get; set; } }", "public class DerivedModel : Model { public string NewColumn { get; set; } }", "public class Model { [Key] public int Id { get; set; } }", "public class Model { [Unique] public string Column { get; set; } }", "public class Model { public string Column { get; set; } = \"default_value\"; }", "File.WriteAllLines(\"data.csv\", data.Select(x => string.Join(\",\", x)));", "var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add(\"Sheet1\"); worksheet.Cell(1, 1).Value = \"Data\"; workbook.SaveAs(\"data.xlsx\");", "var json = JsonConvert.SerializeObject(data); File.WriteAllText(\"data.json\", json);", "var workbook = new XLWorkbook(\"data.xlsx\"); var worksheet = workbook.Worksheet(1); var data = worksheet.Rows().Select(row => row.Cell(1).Value.ToString()).ToList();", "var mergedWorkbook = new XLWorkbook(); foreach (var file in files) { var workbook = new XLWorkbook(file); mergedWorkbook.AddWorksheet(workbook.Worksheet(1)); } mergedWorkbook.SaveAs(\"merged.xlsx\");", "var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add(\"NewSheet\"); workbook.SaveAs(\"data.xlsx\");", "var workbook = new XLWorkbook(\"data.xlsx\"); var worksheet = workbook.Worksheet(1); var style = worksheet.Cell(1, 1).Style; worksheet.Cell(2, 2).Style = style; workbook.SaveAs(\"data.xlsx\");", "var workbook = new XLWorkbook(\"data.xlsx\"); var worksheet = workbook.Worksheet(1); worksheet.Cell(1, 1).Style.Fill.BackgroundColor = XLColor.Red; workbook.SaveAs(\"data.xlsx\");", "var workbook = new XLWorkbook(\"data.xlsx\"); var worksheet = workbook.Worksheet(1); worksheet.Cell(1, 1).Style.Font.FontColor = XLColor.Blue; workbook.SaveAs(\"data.xlsx\");", "var workbook = new XLWorkbook(\"data.xlsx\"); var worksheet = workbook.Worksheet(1); var content = worksheet.Cell(1, 1).Value.ToString();", "var workbook = new XLWorkbook(\"data.xlsx\"); var worksheet = workbook.Worksheet(1); worksheet.Cell(1, 1).Value = \"New Content\"; workbook.SaveAs(\"data.xlsx\");", "var image = Image.FromFile(\"image.jpg\"); var width = image.Width; var height = image.Height;", "var image = Image.FromFile(\"image.jpg\"); var resizedImage = new Bitmap(image, new Size(100, 100)); resizedImage.Save(\"resized.jpg\");" ] # 全局服务状态 service_ready = False # 优雅关闭处理 def handle_shutdown(signum, frame): app.logger.info("收到终止信号,开始关闭...") sys.exit(0) signal.signal(signal.SIGTERM, handle_shutdown) signal.signal(signal.SIGINT, handle_shutdown) # 初始化模型和预计算编码 try: app.logger.info("开始加载模型...") model = SentenceTransformer( "flax-sentence-embeddings/st-codesearch-distilroberta-base", cache_folder="/model-cache" ) # 预计算代码片段的编码(强制使用 CPU) code_emb = model.encode(CODE_SNIPPETS, convert_to_tensor=True, device="cpu") service_ready = True app.logger.info("服务初始化完成") except Exception as e: app.logger.error("初始化失败: %s", str(e)) raise # Hugging Face 健康检查端点,必须响应根路径 @app.route('/') def hf_health_check(): # 如果请求接受 HTML,则返回一个简单的 HTML 页面(包含测试链接) if request.accept_mimetypes.accept_html: html = """

CodeSearch API

服务状态:{{ status }}

你可以在地址栏输入 /search?query=你的查询 来测试接口

""" status = "ready" if service_ready else "initializing" return render_template_string(html, status=status) # 否则返回 JSON 格式的健康检查 if service_ready: return jsonify({"status": "ready"}), 200 else: return jsonify({"status": "initializing"}), 503 # 搜索 API 端点,同时支持 GET 和 POST 请求 @app.route('/search', methods=['GET', 'POST']) def handle_search(): if not service_ready: app.logger.info("服务未就绪") return jsonify({"error": "服务正在初始化"}), 503 try: # 根据请求方法提取查询内容 if request.method == 'GET': query = request.args.get('query', '').strip() else: data = request.get_json() or {} query = data.get('query', '').strip() if not query: app.logger.info("收到空的查询请求") return jsonify({"error": "查询不能为空"}), 400 # 记录接收到的查询 app.logger.info("收到查询请求: %s", query) # 对查询进行编码,并进行语义搜索 query_emb = model.encode(query, convert_to_tensor=True, device="cpu") hits = util.semantic_search(query_emb, code_emb, top_k=1)[0] best = hits[0] result = { "code": CODE_SNIPPETS[best['corpus_id']], "score": round(float(best['score']), 4) } # 记录返回结果 app.logger.info("返回结果: %s", result) return jsonify(result) except Exception as e: app.logger.error("请求处理失败: %s", str(e)) return jsonify({"error": "服务器内部错误"}), 500 if __name__ == "__main__": # 本地测试用,Hugging Face Spaces 通常通过 gunicorn 启动 app.run(host='0.0.0.0', port=7860)