rastadidi commited on
Commit
bbd0966
·
verified ·
1 Parent(s): 64bef38

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -11
app.py CHANGED
@@ -58,11 +58,16 @@ for (_, row), tokens in zip(df.iterrows(), corpus_tokens):
58
  keywords_by_id[str(row["id"])] = top_keywords(tokens)
59
 
60
 
 
 
61
  def encode_query(text: str):
 
62
  try:
63
  vec = model.encode(text, normalize_embeddings=True)
 
64
  return np.array(vec, dtype=np.float32)
65
- except Exception:
 
66
  return None
67
 
68
 
@@ -296,8 +301,8 @@ BANNER_KEYWORDS = """
296
  <div style="display:flex;align-items:center;gap:8px;padding:10px 14px;margin-bottom:10px;
297
  background:#431407;border:1px solid #f97316;border-radius:10px;font-size:13px">
298
  <span style="font-size:16px">⚠️</span>
299
- <span style="color:#fed7aa"><strong style="color:#fff">Mode mots-clés</strong> — le modèle d'embedding n'a pas pu encoder la requête,
300
- les résultats sont filtrés par présence de mots (pas de classement par pertinence)</span>
301
  </div>"""
302
 
303
  BANNER_EMPTY = ""
@@ -341,7 +346,7 @@ def _search(query: str, threshold: float = 50) -> str:
341
  df2 = df.copy()
342
  df2["_s"] = df2.apply(score_row, axis=1)
343
  df2 = df2[df2["_s"] > 0].sort_values("_s", ascending=False)
344
- return render_cards(df2, qwords=qwords), "", BANNER_KEYWORDS
345
 
346
 
347
  def on_card_click(job_id):
@@ -515,12 +520,23 @@ def search_avps(query: str, threshold: float = 50) -> str:
515
 
516
 
517
 
518
- # Exposition explicite de search_avps comme outil MCP dans le demo
519
- with demo:
520
- mcp_in_query = gr.Textbox(visible=False, label="Profil ou mots-clés")
521
- mcp_in_threshold = gr.Slider(minimum=0, maximum=100, value=50, visible=False, label="Score minimum (%)")
522
- mcp_out = gr.Textbox(visible=False, label="Résultats JSON")
523
- mcp_in_query.submit(fn=search_avps, inputs=[mcp_in_query, mcp_in_threshold], outputs=mcp_out, api_name="search_avps")
 
 
 
 
 
 
 
 
 
 
 
524
 
525
  if __name__ == "__main__":
526
- demo.launch(mcp_server=True)
 
58
  keywords_by_id[str(row["id"])] = top_keywords(tokens)
59
 
60
 
61
+ _model_ready = False
62
+
63
  def encode_query(text: str):
64
+ global _model_ready
65
  try:
66
  vec = model.encode(text, normalize_embeddings=True)
67
+ _model_ready = True
68
  return np.array(vec, dtype=np.float32)
69
+ except Exception as e:
70
+ print(f"encode_query error: {e}")
71
  return None
72
 
73
 
 
301
  <div style="display:flex;align-items:center;gap:8px;padding:10px 14px;margin-bottom:10px;
302
  background:#431407;border:1px solid #f97316;border-radius:10px;font-size:13px">
303
  <span style="font-size:16px">⚠️</span>
304
+ <span style="color:#fed7aa"><strong style="color:#fff">Mode mots-clés</strong> — le modèle sémantique est en cours de chargement ou indisponible.
305
+ Résultats filtrés par mots-clés, relancez la recherche dans quelques secondes pour activer la recherche sémantique.</span>
306
  </div>"""
307
 
308
  BANNER_EMPTY = ""
 
346
  df2 = df.copy()
347
  df2["_s"] = df2.apply(score_row, axis=1)
348
  df2 = df2[df2["_s"] > 0].sort_values("_s", ascending=False)
349
+ return render_cards(df2, scores=df2["_s"].tolist(), qwords=qwords), "", BANNER_KEYWORDS
350
 
351
 
352
  def on_card_click(job_id):
 
520
 
521
 
522
 
523
+ # Interface MCP exposée comme outil Gradio natif
524
+ mcp_interface = gr.Interface(
525
+ fn=search_avps,
526
+ inputs=[
527
+ gr.Textbox(label="Profil ou mots-clés"),
528
+ gr.Slider(minimum=0, maximum=100, value=50, step=5, label="Score minimum (%)"),
529
+ ],
530
+ outputs=gr.Textbox(label="Résultats JSON"),
531
+ api_name="search_avps",
532
+ flagging_mode="never",
533
+ )
534
+
535
+ app = gr.TabbedInterface(
536
+ [demo, mcp_interface],
537
+ ["App", "API"],
538
+ title="AVPs OPT-NC",
539
+ )
540
 
541
  if __name__ == "__main__":
542
+ app.launch(mcp_server=True)