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

XFEstudio/gpt4free

refactor: replace see_stream with sse_stream and update md2html output logic

- Replaced all imports and usages of `see_stream` with `sse_stream` across: - `g4f/Provider/Kimi.py` - `g4f/Provider/hf_space/BlackForestLabs_Flux1KontextDev.py` - `g4f/Provider/needs_auth/PuterJS.py` - `g4f/Provider/template/OpenaiTemplate.py` - `g4f/requests/__init__.py` (renamed function `see_stream` to `sse_stream`) - Modified `g4f/Provider/needs_auth/GeminiPro.py`: - Updated `default_model` from `gemini-2.5-flash-preview-04-17` to `gemini-2.5-flash` - Removed `gemini-2.5-flash-preview-04-17` from `fallback_models` - Updated `etc/tool/md2html.py`: - Added `re` import - Changed `process_single_file_with_output` to check if output file exists - If exists, uses regex to update `<title>` and `itemprop="text">` content instead of writing full template - If not, generates HTML using the template as before

499dcc01
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

7 个文件 +24 -20
Modified etc/tool/md2html.py +12 -6
@@ -44,6 +44,7 @@ License: MIT
44 44 """
45 45
46 46 import os
47 import re
47 48 import sys
48 49 import requests
49 50 import time
@@ -411,14 +412,19 @@ def process_single_file_with_output(file_path: Path, template: str, output_path:
411 412
412 413 # Create output directory if needed
413 414 output_path.parent.mkdir(parents=True, exist_ok=True)
414
415 # Generate final HTML
416 final_html = template.replace("{{ article }}", html).replace("{{ title }}", title)
417
415
416 # If output file exists, read and replace title and content
417 if output_path.is_file():
418 output = output_path.read_text()
419 output = re.sub(r"<title>([\S\s]+?)</title>", f"<title>{title}</title>", output)
420 output = re.sub(r'itemprop="text">[\S\s]+?</article>', f'itemprop="text">{html}</article>', output)
421 else:
422 # If output file does not exist, create it with template
423 output = template.replace("{{ article }}", html).replace("{{ title }}", title)
418 424 # Write output file
419 425 with open(output_path, 'w', encoding='utf-8') as f:
420 f.write(final_html)
421
426 f.write(output)
427
422 428 print(f"✓ Created: {output_path}")
423 429 return True
424 430
Modified g4f/Provider/Kimi.py +2 -2
@@ -5,7 +5,7 @@ from typing import AsyncIterator
5 5
6 6 from .base_provider import AsyncAuthedProvider, ProviderModelMixin
7 7 from ..providers.helper import get_last_user_message
8 from ..requests import StreamSession, see_stream, raise_for_status
8 from ..requests import StreamSession, sse_stream, raise_for_status
9 9 from ..providers.response import AuthResult, TitleGeneration, JsonConversation, FinishReason
10 10 from ..typing import AsyncResult, Messages
11 11
@@ -90,7 +90,7 @@ class Kimi(AsyncAuthedProvider, ProviderModelMixin):
90 90 json=data
91 91 ) as response:
92 92 await raise_for_status(response)
93 async for line in see_stream(response):
93 async for line in sse_stream(response):
94 94 if line.get("event") == "cmpl":
95 95 yield line.get("text")
96 96 elif line.get("event") == "rename":
Modified g4f/Provider/hf_space/BlackForestLabs_Flux1KontextDev.py +3 -4
@@ -1,11 +1,10 @@
1 1 from __future__ import annotations
2 2
3 import json
4 3 import uuid
5 4
6 5 from ...typing import AsyncResult, Messages, MediaListType
7 from ...providers.response import ImageResponse, ImagePreview, JsonConversation, Reasoning
8 from ...requests import StreamSession, FormData, see_stream
6 from ...providers.response import ImageResponse, JsonConversation, Reasoning
7 from ...requests import StreamSession, FormData, sse_stream
9 8 from ...tools.media import merge_media
10 9 from ...image import to_bytes, is_accepted_format
11 10 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
@@ -131,7 +130,7 @@ class BlackForestLabs_Flux1KontextDev(AsyncGeneratorProvider, ProviderModelMixin
131 130 # GET the event stream to receive updates and results asynchronously
132 131 async with cls.run("get", session, conversation) as event_response:
133 132 await raise_for_status(event_response)
134 async for chunk in see_stream(event_response.iter_lines()):
133 async for chunk in sse_stream(event_response):
135 134 if chunk.get("msg") == "process_starts":
136 135 yield Reasoning(label="Processing started")
137 136 elif chunk.get("msg") == "progress":
Modified g4f/Provider/needs_auth/GeminiPro.py +1 -2
@@ -28,14 +28,13 @@ class GeminiPro(AsyncGeneratorProvider, ProviderModelMixin):
28 28 supports_system_message = True
29 29 needs_auth = True
30 30
31 default_model = "gemini-2.5-flash-preview-04-17"
31 default_model = "gemini-2.5-flash"
32 32 default_vision_model = default_model
33 33 fallback_models = [
34 34 "gemini-2.0-flash",
35 35 "gemini-2.0-flash-lite",
36 36 "gemini-2.0-flash-thinking-exp",
37 37 "gemini-2.5-flash",
38 "gemini-2.5-flash-preview-04-17",
39 38 "gemma-3-1b-it",
40 39 "gemma-3-12b-it",
41 40 "gemma-3-27b-it",
Modified g4f/Provider/needs_auth/PuterJS.py +2 -2
@@ -9,7 +9,7 @@ from ...typing import AsyncResult, Messages, MediaListType
9 9 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
10 10 from ...providers.response import FinishReason, Usage, Reasoning, ToolCalls
11 11 from ...tools.media import render_messages
12 from ...requests import see_stream, raise_for_status
12 from ...requests import sse_stream, raise_for_status
13 13 from ...errors import ResponseError, ModelNotFoundError, MissingAuthError
14 14 from ..helper import format_media_prompt
15 15 from .. import debug
@@ -405,7 +405,7 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
405 405 return
406 406 elif mime_type.startswith("text/event-stream"):
407 407 reasoning = False
408 async for result in see_stream(response.content):
408 async for result in sse_stream(response.content):
409 409 if "error" in result:
410 410 raise ResponseError(result["error"].get("message", result["error"]))
411 411 choices = result.get("choices", [{}])
Modified g4f/Provider/template/OpenaiTemplate.py +3 -3
@@ -5,12 +5,12 @@ import requests
5 5 from ..helper import filter_none, format_media_prompt
6 6 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin, RaiseErrorMixin
7 7 from ...typing import Union, AsyncResult, Messages, MediaListType
8 from ...requests import StreamSession, StreamResponse, raise_for_status, see_stream
8 from ...requests import StreamSession, StreamResponse, raise_for_status, sse_stream
9 9 from ...image import use_aspect_ratio
10 10 from ...image.copy_images import save_response_media
11 11 from ...providers.response import FinishReason, ToolCalls, Usage, ImageResponse, ProviderInfo, AudioResponse, Reasoning
12 12 from ...tools.media import render_messages
13 from ...errors import MissingAuthError, ResponseError
13 from ...errors import MissingAuthError
14 14 from ... import debug
15 15
16 16 class OpenaiTemplate(AsyncGeneratorProvider, ProviderModelMixin, RaiseErrorMixin):
@@ -178,7 +178,7 @@ async def read_response(response: StreamResponse, stream: bool, prompt: str, pro
178 178 reasoning = False
179 179 first = True
180 180 model_returned = False
181 async for data in see_stream(response):
181 async for data in sse_stream(response):
182 182 OpenaiTemplate.raise_error(data)
183 183 model = data.get("model")
184 184 if not model_returned and model:
Modified g4f/requests/__init__.py +1 -1
@@ -215,7 +215,7 @@ async def get_nodriver(
215 215 BrowserConfig.stop_browser = on_stop
216 216 return browser, on_stop
217 217
218 async def see_stream(iter_lines: Iterator[bytes]) -> AsyncIterator[dict]:
218 async def sse_stream(iter_lines: Iterator[bytes]) -> AsyncIterator[dict]:
219 219 if hasattr(iter_lines, "content"):
220 220 iter_lines = iter_lines.content
221 221 elif hasattr(iter_lines, "iter_lines"):