refactor: move DuckDuckGo/Free2GPT to deprecated; SearXNG updates

- g4f/Provider/ApiAirforce.py: replace class attr parent="Api.Airforce" with label="Api.Airforce"
- g4f/Provider/EasyChat.py: add guard after loop to raise ValueError("Failed to retrieve arguments for EasyChat.") when args is falsy
- g4f/Provider/SearXNG.py:
  - add imports: from .helper import format_media_prompt; from .. import debug
  - rename class attr default_url to url (SEARXNG_URL) and use cls.url in requests
  - create(): add parameters prompt: str = None and language: str = "it"
  - build prompt via format_media_prompt(messages, prompt); remove previous query extraction
  - request params: set q to prompt and language to provided language
  - pass proxy to session.get(...); replace print(...) with debug.log(...)
  - on empty results, return early (remove "Nessun risultato trovato." and FinishReason("stop") yields)
  - result formatting: use r.get("title") without default fallback
- g4f/Provider/__init__.py: import DuckDuckGo and Free2GPT from .deprecated.DuckDuckGo and .deprecated.Free2GPT
- g4f/Provider/deprecated/DuckDuckGo.py: update relative imports to ...typing, ..base_provider, ..helper
- g4f/Provider/deprecated/Free2GPT.py: update relative imports to ...errors, ...requests, ...typing, ..base_provider
- g4f/Provider/needs_auth/DeepSeekAPI.py: set working = False (was has_dsk)
- g4f/Provider/needs_auth/You.py: set working = False (was True); update headers["Referer"] to f"{cls.url}/api/streamingSearch"
This commit is contained in:
hlohaus
2025-08-11 00:42:18 +02:00
parent 05148d2b30
commit 933b2e15d1
8 changed files with 29 additions and 28 deletions

View File

@@ -4,7 +4,7 @@ from .template import OpenaiTemplate
from ..config import DEFAULT_MODEL
class ApiAirforce(OpenaiTemplate):
parent = "Api.Airforce"
label = "Api.Airforce"
url = "https://api.airforce"
login_url = "https://panel.api.airforce/dashboard"
api_base = "https://api.airforce/v1"

View File

@@ -145,6 +145,8 @@ class EasyChat(OpenaiTemplate, AuthFileMixin):
continue
raise e
break
if not args:
raise ValueError("Failed to retrieve arguments for EasyChat.")
if os.getenv("G4F_SHARE_AUTH"):
yield "\n" * 10
yield "<!--"

View File

@@ -5,9 +5,11 @@ from ..typing import Messages, AsyncResult
from ..providers.base_provider import AsyncGeneratorProvider
from ..providers.response import FinishReason
from ..tools.web_search import fetch_and_scrape
from .helper import format_media_prompt
from .. import debug
class SearXNG(AsyncGeneratorProvider):
default_url = os.environ.get("SEARXNG_URL", "http://searxng:8080")
url = os.environ.get("SEARXNG_URL", "http://searxng:8080")
label = "SearXNG"
@classmethod
@@ -15,34 +17,30 @@ class SearXNG(AsyncGeneratorProvider):
cls,
model: str,
messages: Messages,
prompt: str = None,
proxy: str = None,
timeout: int = 30,
language: str = "it",
max_results: int = 5,
max_words: int = 2500,
add_text: bool = True,
**kwargs
) -> AsyncResult:
url = cls.default_url
query = messages[-1]["content"] if isinstance(messages[-1], dict) else getattr(messages[-1], "content", "")
prompt = format_media_prompt(messages, prompt)
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=timeout)) as session:
params = {
"q": query,
"q": prompt,
"format": "json",
"language": "it",
"language": language,
"safesearch": 0,
"categories": "general",
}
async with session.get(f"{url}/search", params=params) as resp:
print(f"Request URL on SearXNG: {resp.url}")
async with session.get(f"{cls.url}/search", params=params, proxy=proxy) as resp:
debug.log(f"Request URL on SearXNG: {resp.url}")
data = await resp.json()
results = data.get("results", [])
if not results:
yield "Nessun risultato trovato."
yield FinishReason("stop")
return
if add_text:
@@ -56,7 +54,7 @@ class SearXNG(AsyncGeneratorProvider):
formatted = ""
used_words = 0
for i, r in enumerate(results[:max_results]):
title = r.get("title", "Senza titolo")
title = r.get("title")
url = r.get("url", "#")
content = r.get("text") or r.get("snippet") or ""
formatted += f"Title: {title}\n\n{content}\n\nSource: [[{i}]]({url})\n\n"

View File

@@ -32,16 +32,17 @@ try:
except ImportError as e:
debug.error("Audio providers not loaded:", e)
from .deprecated.ARTA import ARTA
from .deprecated.ARTA import ARTA
from .deprecated.DuckDuckGo import DuckDuckGo
from .deprecated.Free2GPT import Free2GPT
from .ApiAirforce import ApiAirforce
from .Blackbox import Blackbox
from .Chatai import Chatai
from .Cloudflare import Cloudflare
from .Copilot import Copilot
from .DeepInfraChat import DeepInfraChat
from .DuckDuckGo import DuckDuckGo
from .EasyChat import EasyChat
from .Free2GPT import Free2GPT
from .GLM import GLM
from .GptOss import GptOss
from .ImageLabs import ImageLabs

View File

@@ -8,9 +8,9 @@ try:
except ImportError:
has_requirements = False
from ..typing import CreateResult, Messages
from .base_provider import AbstractProvider, ProviderModelMixin
from .helper import get_last_user_message
from ...typing import CreateResult, Messages
from ..base_provider import AbstractProvider, ProviderModelMixin
from ..helper import get_last_user_message
class DuckDuckGo(AbstractProvider, ProviderModelMixin):
label = "Duck.ai (duckduckgo_search)"

View File

@@ -5,11 +5,11 @@ from hashlib import sha256
from aiohttp import BaseConnector, ClientSession
from ..errors import RateLimitError
from ..requests import raise_for_status
from ..requests.aiohttp import get_connector
from ..typing import AsyncResult, Messages
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
from ...errors import RateLimitError
from ...requests import raise_for_status
from ...requests.aiohttp import get_connector
from ...typing import AsyncResult, Messages
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
class Free2GPT(AsyncGeneratorProvider, ProviderModelMixin):

View File

@@ -20,7 +20,7 @@ except ImportError:
class DeepSeekAPI(AsyncAuthedProvider, ProviderModelMixin):
label = "DeepSeek"
url = "https://chat.deepseek.com"
working = has_dsk
working = False
active_by_default = False
needs_auth = True
use_nodriver = True

View File

@@ -17,7 +17,7 @@ from ... import debug
class You(AsyncGeneratorProvider, ProviderModelMixin):
label = "You.com"
url = "https://you.com"
working = True
working = False
needs_auth = True
default_model = "gpt-4o-mini"
default_vision_model = "agent"
@@ -103,7 +103,7 @@ class You(AsyncGeneratorProvider, ProviderModelMixin):
upload = json.dumps([upload_file])
headers = {
"Accept": "text/event-stream",
"Referer": f"{cls.url}/search?fromSearchBar=true&tbm=youchat",
"Referer": f"{cls.url}/api/streamingSearch",
}
data = {
"userFiles": upload,