XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/gpt4free

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"

933b2e15
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

8 个文件 +29 -28
Modified g4f/Provider/ApiAirforce.py +1 -1
@@ -4,7 +4,7 @@ from .template import OpenaiTemplate
4 4 from ..config import DEFAULT_MODEL
5 5
6 6 class ApiAirforce(OpenaiTemplate):
7 parent = "Api.Airforce"
7 label = "Api.Airforce"
8 8 url = "https://api.airforce"
9 9 login_url = "https://panel.api.airforce/dashboard"
10 10 api_base = "https://api.airforce/v1"
Modified g4f/Provider/EasyChat.py +2 -0
@@ -145,6 +145,8 @@ class EasyChat(OpenaiTemplate, AuthFileMixin):
145 145 continue
146 146 raise e
147 147 break
148 if not args:
149 raise ValueError("Failed to retrieve arguments for EasyChat.")
148 150 if os.getenv("G4F_SHARE_AUTH"):
149 151 yield "\n" * 10
150 152 yield "<!--"
Modified g4f/Provider/SearXNG.py +11 -13
@@ -5,9 +5,11 @@ from ..typing import Messages, AsyncResult
5 5 from ..providers.base_provider import AsyncGeneratorProvider
6 6 from ..providers.response import FinishReason
7 7 from ..tools.web_search import fetch_and_scrape
8 from .helper import format_media_prompt
9 from .. import debug
8 10
9 11 class SearXNG(AsyncGeneratorProvider):
10 default_url = os.environ.get("SEARXNG_URL", "http://searxng:8080")
12 url = os.environ.get("SEARXNG_URL", "http://searxng:8080")
11 13 label = "SearXNG"
12 14
13 15 @classmethod
@@ -15,34 +17,30 @@ class SearXNG(AsyncGeneratorProvider):
15 17 cls,
16 18 model: str,
17 19 messages: Messages,
20 prompt: str = None,
18 21 proxy: str = None,
19 22 timeout: int = 30,
23 language: str = "it",
20 24 max_results: int = 5,
21 25 max_words: int = 2500,
22 26 add_text: bool = True,
23 27 **kwargs
24 28 ) -> AsyncResult:
25 url = cls.default_url
26 query = messages[-1]["content"] if isinstance(messages[-1], dict) else getattr(messages[-1], "content", "")
27
29 prompt = format_media_prompt(messages, prompt)
28 30
29 31 async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=timeout)) as session:
30 32 params = {
31 "q": query,
33 "q": prompt,
32 34 "format": "json",
33 "language": "it",
35 "language": language,
34 36 "safesearch": 0,
35 37 "categories": "general",
36 38 }
37
38 async with session.get(f"{url}/search", params=params) as resp:
39 print(f"Request URL on SearXNG: {resp.url}")
39 async with session.get(f"{cls.url}/search", params=params, proxy=proxy) as resp:
40 debug.log(f"Request URL on SearXNG: {resp.url}")
40 41 data = await resp.json()
41 42 results = data.get("results", [])
42
43 43 if not results:
44 yield "Nessun risultato trovato."
45 yield FinishReason("stop")
46 44 return
47 45
48 46 if add_text:
@@ -56,7 +54,7 @@ class SearXNG(AsyncGeneratorProvider):
56 54 formatted = ""
57 55 used_words = 0
58 56 for i, r in enumerate(results[:max_results]):
59 title = r.get("title", "Senza titolo")
57 title = r.get("title")
60 58 url = r.get("url", "#")
61 59 content = r.get("text") or r.get("snippet") or ""
62 60 formatted += f"Title: {title}\n\n{content}\n\nSource: [[{i}]]({url})\n\n"
Modified g4f/Provider/__init__.py +4 -3
@@ -32,16 +32,17 @@ try:
32 32 except ImportError as e:
33 33 debug.error("Audio providers not loaded:", e)
34 34
35 from .deprecated.ARTA import ARTA
35 from .deprecated.ARTA import ARTA
36 from .deprecated.DuckDuckGo import DuckDuckGo
37 from .deprecated.Free2GPT import Free2GPT
38
36 39 from .ApiAirforce import ApiAirforce
37 40 from .Blackbox import Blackbox
38 41 from .Chatai import Chatai
39 42 from .Cloudflare import Cloudflare
40 43 from .Copilot import Copilot
41 44 from .DeepInfraChat import DeepInfraChat
42 from .DuckDuckGo import DuckDuckGo
43 45 from .EasyChat import EasyChat
44 from .Free2GPT import Free2GPT
45 46 from .GLM import GLM
46 47 from .GptOss import GptOss
47 48 from .ImageLabs import ImageLabs
Renamed g4f/Provider/deprecated/DuckDuckGo.py +3 -3
@@ -8,9 +8,9 @@ try:
8 8 except ImportError:
9 9 has_requirements = False
10 10
11 from ..typing import CreateResult, Messages
12 from .base_provider import AbstractProvider, ProviderModelMixin
13 from .helper import get_last_user_message
11 from ...typing import CreateResult, Messages
12 from ..base_provider import AbstractProvider, ProviderModelMixin
13 from ..helper import get_last_user_message
14 14
15 15 class DuckDuckGo(AbstractProvider, ProviderModelMixin):
16 16 label = "Duck.ai (duckduckgo_search)"
Renamed g4f/Provider/deprecated/Free2GPT.py +5 -5
@@ -5,11 +5,11 @@ from hashlib import sha256
5 5
6 6 from aiohttp import BaseConnector, ClientSession
7 7
8 from ..errors import RateLimitError
9 from ..requests import raise_for_status
10 from ..requests.aiohttp import get_connector
11 from ..typing import AsyncResult, Messages
12 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8 from ...errors import RateLimitError
9 from ...requests import raise_for_status
10 from ...requests.aiohttp import get_connector
11 from ...typing import AsyncResult, Messages
12 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
13 13
14 14
15 15 class Free2GPT(AsyncGeneratorProvider, ProviderModelMixin):
Modified g4f/Provider/needs_auth/DeepSeekAPI.py +1 -1
@@ -20,7 +20,7 @@ except ImportError:
20 20 class DeepSeekAPI(AsyncAuthedProvider, ProviderModelMixin):
21 21 label = "DeepSeek"
22 22 url = "https://chat.deepseek.com"
23 working = has_dsk
23 working = False
24 24 active_by_default = False
25 25 needs_auth = True
26 26 use_nodriver = True
Modified g4f/Provider/needs_auth/You.py +2 -2
@@ -17,7 +17,7 @@ from ... import debug
17 17 class You(AsyncGeneratorProvider, ProviderModelMixin):
18 18 label = "You.com"
19 19 url = "https://you.com"
20 working = True
20 working = False
21 21 needs_auth = True
22 22 default_model = "gpt-4o-mini"
23 23 default_vision_model = "agent"
@@ -103,7 +103,7 @@ class You(AsyncGeneratorProvider, ProviderModelMixin):
103 103 upload = json.dumps([upload_file])
104 104 headers = {
105 105 "Accept": "text/event-stream",
106 "Referer": f"{cls.url}/search?fromSearchBar=true&tbm=youchat",
106 "Referer": f"{cls.url}/api/streamingSearch",
107 107 }
108 108 data = {
109 109 "userFiles": upload,