mirror of
https://github.com/xtekky/gpt4free.git
synced 2025-12-24 13:07:53 +08:00
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:
@@ -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"
|
||||
|
||||
@@ -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 "<!--"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)"
|
||||
@@ -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):
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user