Upload app.py
Browse files
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
|
| 300 |
-
|
| 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 |
-
#
|
| 519 |
-
|
| 520 |
-
|
| 521 |
-
|
| 522 |
-
|
| 523 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 524 |
|
| 525 |
if __name__ == "__main__":
|
| 526 |
-
|
|
|
|
| 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)
|