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

XFEstudio/gpt4free

fix: update provider integrations, recipient logic, and auth handling

- In **FreeRouter.py**, change the `working` flag from `False` to `True`. - In **LMArenaProvider.py**, replace the `.rstrip("▌")` call with a manual check that, if the content ends with `▌`, slices off the trailing characters. - In **hf_space/__init__.py**, update the async generator call to pass the `media` parameter instead of `images`. - In **OpenaiChat.py**: - Modify the citation replacement regex to use `[0-9]+` (supporting any turn number) instead of a hardcoded `0`. - Replace `fields.is_recipient` boolean checks with comparisons against `fields.recipient == "all"` for processing text and metadata. - Add a new branch to process `/message/metadata/content_references` for adding source links. - Update the conversation initialization by replacing `self.is_recipient` with setting `self.recipient` to `"all"`. - Change the auth check from using `cls._api_key` to checking `cls.request_config.access_token`. - In **chat.v1.js**, adjust the QR code URL assignment to use `window.conversation_id` if available, else default to `/qrcode`. - In **raise_for_status.py**, update error handling by replacing `ResponseStatusError` with `MissingAuthError` for 403 responses detected as OpenAI Bot.

90ef8703
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

6 个文件 +20 -14
Modified g4f/Provider/FreeRouter.py +1 -1
@@ -6,4 +6,4 @@ class FreeRouter(OpenaiTemplate):
6 6 label = "CablyAI FreeRouter"
7 7 url = "https://freerouter.cablyai.com"
8 8 api_base = "https://freerouter.cablyai.com/v1"
9 working = False
9 working = True
Modified g4f/Provider/hf_space/LMArenaProvider.py +3 -1
@@ -229,7 +229,9 @@ class LMArenaProvider(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin)
229 229 if len(data) > 2:
230 230 if isinstance(data[2], list):
231 231 data[2] = data[2][-1]
232 content = data[2][text_position:].rstrip("▌")
232 content = data[2][text_position:]
233 if content.endswith("▌"):
234 content = content[:-2]
233 235 if content:
234 236 count += 1
235 237 yield count, content
Modified g4f/Provider/hf_space/__init__.py +1 -1
@@ -88,7 +88,7 @@ class HuggingSpace(AsyncGeneratorProvider, ProviderModelMixin):
88 88 for provider in cls.providers:
89 89 if model in provider.get_models():
90 90 try:
91 async for chunk in provider.create_async_generator(model, messages, images=images, **kwargs):
91 async for chunk in provider.create_async_generator(model, messages, media=media, **kwargs):
92 92 is_started = True
93 93 yield chunk
94 94 if is_started:
Modified g4f/Provider/needs_auth/OpenaiChat.py +12 -8
@@ -447,7 +447,7 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
447 447 link = sources.list[int(match.group(1))]["url"]
448 448 return f"[[{int(match.group(1))+1}]]({link})"
449 449 return f" [{int(match.group(1))+1}]"
450 buffer = re.sub(r'(?:cite\nturn0search|cite\nturn0news|turn0news)(\d+)', replacer, buffer)
450 buffer = re.sub(r'(?:cite\nturn[0-9]+search|cite\nturn[0-9]+news|turn[0-9]+news|turn[0-9]+search)(\d+)', replacer, buffer)
451 451 else:
452 452 continue
453 453 yield buffer
@@ -501,23 +501,27 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
501 501 return
502 502 if "v" in line:
503 503 v = line.get("v")
504 if isinstance(v, str) and fields.is_recipient:
504 if isinstance(v, str) and fields.recipient == "all":
505 505 if "p" not in line or line.get("p") == "/message/content/parts/0":
506 506 yield Reasoning(token=v) if fields.is_thinking else v
507 507 elif isinstance(v, list):
508 508 for m in v:
509 if m.get("p") == "/message/content/parts/0" and fields.is_recipient:
509 if m.get("p") == "/message/content/parts/0" and fields.recipient == "all":
510 510 yield m.get("v")
511 511 elif m.get("p") == "/message/metadata/search_result_groups":
512 512 for entry in [p.get("entries") for p in m.get("v")]:
513 513 for link in entry:
514 514 sources.add_source(link)
515 elif m.get("p") == "/message/metadata/content_references":
516 for entry in m.get("v"):
517 for link in entry.get("sources", []):
518 sources.add_source(link)
515 519 elif m.get("p") and re.match(r"^/message/metadata/content_references/\d+$", m.get("p")):
516 520 sources.add_source(m.get("v"))
517 521 elif m.get("p") == "/message/metadata/finished_text":
518 522 fields.is_thinking = False
519 523 yield Reasoning(status=m.get("v"))
520 elif m.get("p") == "/message/metadata":
524 elif m.get("p") == "/message/metadata" and fields.recipient == "all":
521 525 fields.finish_reason = m.get("v", {}).get("finish_details", {}).get("type")
522 526 break
523 527 elif isinstance(v, dict):
@@ -525,8 +529,8 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
525 529 fields.conversation_id = v.get("conversation_id")
526 530 debug.log(f"OpenaiChat: New conversation: {fields.conversation_id}")
527 531 m = v.get("message", {})
528 fields.is_recipient = m.get("recipient", "all") == "all"
529 if fields.is_recipient:
532 fields.recipient = m.get("recipient", fields.recipient)
533 if fields.recipient == "all":
530 534 c = m.get("content", {})
531 535 if c.get("content_type") == "text" and m.get("author", {}).get("role") == "tool" and "initial_text" in m.get("metadata", {}):
532 536 fields.is_thinking = True
@@ -598,7 +602,7 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
598 602 raise NoValidHarFileError(f"Access token is not valid: {cls.request_config.access_token}")
599 603 except NoValidHarFileError:
600 604 if has_nodriver:
601 if cls._api_key is None:
605 if cls.request_config.access_token is None:
602 606 yield RequestLogin(cls.label, os.environ.get("G4F_LOGIN_URL", ""))
603 607 await cls.nodriver_auth(proxy)
604 608 else:
@@ -717,7 +721,7 @@ class Conversation(JsonConversation):
717 721 self.conversation_id = conversation_id
718 722 self.message_id = message_id
719 723 self.finish_reason = finish_reason
720 self.is_recipient = False
724 self.recipient = "all"
721 725 self.parent_message_id = message_id if parent_message_id is None else parent_message_id
722 726 self.user_id = user_id
723 727 self.is_thinking = is_thinking
Modified g4f/gui/client/static/js/chat.v1.js +1 -1
@@ -469,7 +469,7 @@ const register_message_buttons = async () => {
469 469 el.dataset.click = true;
470 470 const message_el = get_message_el(el);
471 471 el.addEventListener("click", async () => {
472 iframe.src = `/qrcode/${window.conversation_id}#${message_el.dataset.index}`;
472 iframe.src = window.conversation_id ? `/qrcode/${window.conversation_id}#${message_el.dataset.index}` : '/qrcode';
473 473 iframe_container.classList.remove("hidden");
474 474 });
475 475 });
Modified g4f/requests/raise_for_status.py +2 -2
@@ -44,7 +44,7 @@ async def raise_for_status_async(response: Union[StreamResponse, ClientResponse]
44 44 if response.status == 403 and is_cloudflare(message):
45 45 raise CloudflareError(f"Response {response.status}: Cloudflare detected")
46 46 elif response.status == 403 and is_openai(message):
47 raise ResponseStatusError(f"Response {response.status}: OpenAI Bot detected")
47 raise MissingAuthError(f"Response {response.status}: OpenAI Bot detected")
48 48 elif response.status == 502:
49 49 raise ResponseStatusError(f"Response {response.status}: Bad Gateway")
50 50 elif response.status == 504:
@@ -71,7 +71,7 @@ def raise_for_status(response: Union[Response, StreamResponse, ClientResponse, R
71 71 if response.status_code == 403 and is_cloudflare(response.text):
72 72 raise CloudflareError(f"Response {response.status_code}: Cloudflare detected")
73 73 elif response.status_code == 403 and is_openai(response.text):
74 raise ResponseStatusError(f"Response {response.status_code}: OpenAI Bot detected")
74 raise MissingAuthError(f"Response {response.status_code}: OpenAI Bot detected")
75 75 elif response.status_code == 502:
76 76 raise ResponseStatusError(f"Response {response.status_code}: Bad Gateway")
77 77 elif response.status_code == 504: