Преглед изворни кода

feat(mode_workflow): 达标格醒目高亮(琥珀填充+胶囊分数) + 改写词搜索/原组合词入 query 列表(--query-text)

刘文武 пре 6 дана
родитељ
комит
5979c7176d

+ 8 - 7
examples/mode_workflow/index.html

@@ -2100,9 +2100,9 @@
       .qr-c.t0 { background:#fafafa; color:#bbb; } .qr-c.t1 { background:#f1f8f1; }
       .qr-c.t2 { background:#d8ecd8; } .qr-c.t3 { background:#b9ddb9; }
       .qr-c.dead { color:#ccc; }
-      .qr-c.keep { outline:2px solid #2563eb; outline-offset:-2px; cursor:pointer; font-weight:600; }
-      .qr-c.keep:hover { background:#dbe7ff; }
-      .qr-bd { display:inline-block; margin-left:4px; font-style:normal; font-size:9px; font-weight:700; color:#2563eb; }
+      .qr-c.keep { background:#fff3bf !important; box-shadow:inset 0 0 0 2px #f59e0b; color:#111; font-weight:700; cursor:pointer; }
+      .qr-c.keep:hover { background:#ffe066 !important; }
+      .qr-bd { display:inline-block; margin-left:5px; font-style:normal; font-size:11px; font-weight:800; color:#fff; background:#f59e0b; padding:0 6px; border-radius:9px; }
       .qr-pop { position:fixed; z-index:60; width:300px; background:#fff; border:1px solid #e2e2e2;
                 border-radius:11px; box-shadow:0 8px 30px rgba(0,0,0,.18); padding:13px 15px; font-size:12.5px; color:#333; }
       .qr-pop .q { font-size:13.5px; font-weight:600; color:#1a1a1a; margin-bottom:2px; word-break:break-all; }
@@ -3892,8 +3892,9 @@
         if (r.cached) { await qrLoadScores(r.sel); return; }
         showTask("Query 评分 · 643 格", r.task_id, async () => { await qrLoadScores(r.sel); });
       };
-      async function qrRunSearch(query) {
-        const body = { query, platforms: "xhs,gzh", max_count: 20 };   // 方向无关,标签自动路由
+      async function qrRunSearch(query, label) {
+        const body = { query, platforms: "xhs,gzh", max_count: 20 };   // 用改写词搜索,方向无关
+        if (label && label !== query) body.query_text = label;          // query 列表存原始组合词
         const r = await api("/api/run_search", { method: "POST", body: JSON.stringify(body) });
         return r;   // {task_id, query_id}
       }
@@ -3919,7 +3920,7 @@
         pop.style.top = Math.max(10, top) + "px";
         $("#qr-pop-go").onclick = async () => {
           qrClosePop();
-          try { const rr = await qrRunSearch(query); showTask(`搜索 · ${rr.query_id} ${query}`, rr.task_id, null); }
+          try { const rr = await qrRunSearch(query, v.query); showTask(`搜索 · ${rr.query_id} ${query}`, rr.task_id, null); }
           catch (err) { toast("搜索启动失败:" + (err.body?.error || err.status), "error"); }
         };
         $("#qr-pop-copy").onclick = () => { navigator.clipboard && navigator.clipboard.writeText(query); toast("已复制", "info", 1200); };
@@ -3968,7 +3969,7 @@
         const items = [];
         for (const [, v] of keeps) {
           const q = v.rewrite || v.query;
-          try { const r = await qrRunSearch(q); if (r.task_id) items.push({ query: q, query_id: r.query_id, task_id: r.task_id }); }
+          try { const r = await qrRunSearch(q, v.query); if (r.task_id) items.push({ query: q, query_id: r.query_id, task_id: r.task_id }); }
           catch (e) { /* 单格失败不阻断 */ }
         }
         if (!items.length) return toast("全部发起失败", "error");

+ 2 - 0
examples/mode_workflow/server.py

@@ -623,6 +623,8 @@ class Handler(BaseHTTPRequestHandler):
                 qid = payload.get("query_id") or _next_query_id()
                 cmd = [sys.executable, "stages/search_eval.py",
                        "--query-id", qid, "--query", query]
+                if payload.get("query_text"):   # 用改写词搜索,但 query 列表存原始组合词
+                    cmd += ["--query-text", payload["query_text"]]
                 if payload.get("synonyms"):
                     cmd += ["--synonyms", payload["synonyms"]]
                 if payload.get("mode_type") in ("工序", "工具"):

+ 4 - 2
examples/mode_workflow/stages/search_eval.py

@@ -156,7 +156,7 @@ async def run(args):
     total = 0
     for t, group in routed.items():
         if group:
-            n = db.upsert_search_posts(args.query_id, args.query, group, table=t)
+            n = db.upsert_search_posts(args.query_id, args.query_text or args.query, group, table=t)
             total += n
             print(f"🗄️  {t} 入库 {n} 行")
     print(f"📊 评估成本 ${cost:.4f} · 共写 {total} 行(双表含同帖重复)")
@@ -173,7 +173,9 @@ async def run(args):
 def main():
     p = argparse.ArgumentParser(description="搜索+评估 → search_process/search_tools")
     p.add_argument("--query-id", required=True, help="如 q0004(server 自动分配)")
-    p.add_argument("--query", required=True, help="基准 query(评估锚点)")
+    p.add_argument("--query", required=True, help="基准 query(搜索词 + 评估锚点)")
+    p.add_argument("--query-text", default=None,
+                   help="存库/列表显示用的 query 标签(默认=--query);用于「改写词搜索、原组合词入列表」")
     p.add_argument("--synonyms", default="", help="逗号分隔的同义措辞(可选)")
     p.add_argument("--mode-type", default="", choices=["", "工序", "工具"],
                    help="(兼容保留,已不决定路由)落表现由评估的 知识类型 标签自动路由")