Update app.py
Browse files
app.py
CHANGED
|
@@ -4,24 +4,19 @@
|
|
| 4 |
# 2) Websearch β structured DuckDuckGo search via LangChain tool (JSON)
|
| 5 |
# 3) Unstructured DDG β raw DuckDuckGo list[dict] rendered into a Textbox
|
| 6 |
# 4) DDG (Concise) β ultra-succinct DuckDuckGo search that emits JSONL with short keys to minimize tokens
|
| 7 |
-
#
|
| 8 |
-
# Launched with mcp_server=True so all functions are available as MCP tools.
|
| 9 |
|
| 10 |
from __future__ import annotations
|
| 11 |
|
| 12 |
-
import re
|
| 13 |
-
import json
|
| 14 |
from typing import List, Dict, Literal, Tuple
|
| 15 |
|
| 16 |
-
import gradio as gr
|
| 17 |
-
import requests
|
| 18 |
-
from bs4 import BeautifulSoup
|
| 19 |
-
from readability import Document
|
| 20 |
-
from urllib.parse import urljoin, urldefrag, urlparse
|
| 21 |
-
|
| 22 |
-
# Structured search via LangChain community tool
|
| 23 |
from langchain_community.tools import DuckDuckGoSearchResults
|
| 24 |
-
# Native DDG client (used by Unstructured + Concise tabs)
|
| 25 |
from duckduckgo_search import DDGS
|
| 26 |
|
| 27 |
|
|
@@ -246,7 +241,7 @@ def _format_markdown(
|
|
| 246 |
return "\n\n".join(lines).strip()
|
| 247 |
|
| 248 |
|
| 249 |
-
def
|
| 250 |
url: str,
|
| 251 |
verbosity: str = "Standard",
|
| 252 |
include_metadata: bool = True,
|
|
@@ -256,7 +251,7 @@ def extract_relevant( # <-- MCP tool #1 (Fetch)
|
|
| 256 |
max_links: int = 20,
|
| 257 |
) -> str:
|
| 258 |
"""
|
| 259 |
-
|
| 260 |
"""
|
| 261 |
if not url or not url.strip():
|
| 262 |
return "Please enter a valid URL."
|
|
@@ -314,7 +309,7 @@ def extract_relevant( # <-- MCP tool #1 (Fetch)
|
|
| 314 |
# Websearch: DuckDuckGo tool
|
| 315 |
# ==========================
|
| 316 |
|
| 317 |
-
def
|
| 318 |
input_query: str,
|
| 319 |
max_results: int = 5,
|
| 320 |
) -> List[Dict[Literal["snippet", "title", "link"], str]]:
|
|
@@ -336,7 +331,7 @@ def web_search( # <-- MCP tool #2 (Structured DDG)
|
|
| 336 |
# Unstructured DDG: raw list into Textbox
|
| 337 |
# ========================================
|
| 338 |
|
| 339 |
-
def
|
| 340 |
query: str,
|
| 341 |
) -> list[dict]:
|
| 342 |
"""
|
|
@@ -353,7 +348,7 @@ def ddg_unstructured( # <-- MCP tool #3 (Unstructured DDG)
|
|
| 353 |
# Concise DDG: ultra-succinct JSONL for tokens
|
| 354 |
# ============================================
|
| 355 |
|
| 356 |
-
def
|
| 357 |
query: str,
|
| 358 |
max_results: int = 5,
|
| 359 |
include_snippets: bool = False,
|
|
|
|
| 4 |
# 2) Websearch β structured DuckDuckGo search via LangChain tool (JSON)
|
| 5 |
# 3) Unstructured DDG β raw DuckDuckGo list[dict] rendered into a Textbox
|
| 6 |
# 4) DDG (Concise) β ultra-succinct DuckDuckGo search that emits JSONL with short keys to minimize tokens
|
|
|
|
|
|
|
| 7 |
|
| 8 |
from __future__ import annotations
|
| 9 |
|
| 10 |
+
import re
|
| 11 |
+
import json
|
| 12 |
from typing import List, Dict, Literal, Tuple
|
| 13 |
|
| 14 |
+
import gradio as gr
|
| 15 |
+
import requests
|
| 16 |
+
from bs4 import BeautifulSoup
|
| 17 |
+
from readability import Document
|
| 18 |
+
from urllib.parse import urljoin, urldefrag, urlparse
|
|
|
|
|
|
|
| 19 |
from langchain_community.tools import DuckDuckGoSearchResults
|
|
|
|
| 20 |
from duckduckgo_search import DDGS
|
| 21 |
|
| 22 |
|
|
|
|
| 241 |
return "\n\n".join(lines).strip()
|
| 242 |
|
| 243 |
|
| 244 |
+
def Fetch_Webpage( # <-- MCP tool #1 (Fetch)
|
| 245 |
url: str,
|
| 246 |
verbosity: str = "Standard",
|
| 247 |
include_metadata: bool = True,
|
|
|
|
| 251 |
max_links: int = 20,
|
| 252 |
) -> str:
|
| 253 |
"""
|
| 254 |
+
Given a URL, return a tight Markdown summary: title, key metadata, readable text, and links.
|
| 255 |
"""
|
| 256 |
if not url or not url.strip():
|
| 257 |
return "Please enter a valid URL."
|
|
|
|
| 309 |
# Websearch: DuckDuckGo tool
|
| 310 |
# ==========================
|
| 311 |
|
| 312 |
+
def Search_Structured( # <-- MCP tool #2 (Structured DDG)
|
| 313 |
input_query: str,
|
| 314 |
max_results: int = 5,
|
| 315 |
) -> List[Dict[Literal["snippet", "title", "link"], str]]:
|
|
|
|
| 331 |
# Unstructured DDG: raw list into Textbox
|
| 332 |
# ========================================
|
| 333 |
|
| 334 |
+
def Search_Raw( # <-- MCP tool #3 (Unstructured DDG)
|
| 335 |
query: str,
|
| 336 |
) -> list[dict]:
|
| 337 |
"""
|
|
|
|
| 348 |
# Concise DDG: ultra-succinct JSONL for tokens
|
| 349 |
# ============================================
|
| 350 |
|
| 351 |
+
def Search_Concise( # <-- MCP tool #4 (Concise DDG)
|
| 352 |
query: str,
|
| 353 |
max_results: int = 5,
|
| 354 |
include_snippets: bool = False,
|