codesearchBase / app.py
Forrest99's picture
Update app.py
4be9e6e verified
raw
history blame
23 kB
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<string, object>();",
"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<string, object>)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<int,int> 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<int,int> memoized = null;
var cache = new Dictionary<int,int>();
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<string,string>("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<int>(); 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<DataRow>().Any(row => row[\"TABLE_NAME\"].ToString() == \"table\");",
"var tables = connection.GetSchema(\"Tables\").Rows.Cast<DataRow>().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 = """
<h2>CodeSearch API</h2>
<p>服务状态:{{ status }}</p>
<p>你可以在地址栏输入 /search?query=你的查询 来测试接口</p>
"""
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)