Skip to content

Commit

Permalink
Merge tag 'browser-version' into refactor-v3
Browse files Browse the repository at this point in the history
  • Loading branch information
lss233 committed Sep 8, 2023
2 parents a2f16cd + 8288978 commit afd46d7
Show file tree
Hide file tree
Showing 19 changed files with 242 additions and 59 deletions.
@@ -1,7 +1,7 @@
@ECHO OFF
@CHCP 65001

setx /M PATH "%cd%\ffmpeg\bin;%PATH%"
SET PATH="%cd%\ffmpeg\bin;%PATH%"

TITLE [ChatGPT for QQ] ChatGPT 端正在运行...
cd chatgpt && ..\python3.11\python.exe bot.py
Expand Down
Expand Up @@ -3,7 +3,7 @@

TITLE [ChatGPT for QQ] go-cqhttp 端正在运行...

setx /M PATH "%cd%\ffmpeg\bin;%PATH%"
SET PATH="%cd%\ffmpeg\bin;%PATH%"

cd go-cqhttp && go-cqhttp -faststart
TITLE [ChatGPT for QQ] go-cqhttp 端已停止运行
Expand Down
Expand Up @@ -3,7 +3,7 @@

TITLE [ChatGPT for QQ] ChatGPT 端正在运行...

setx /M PATH "%cd%\ffmpeg\bin;%PATH%"
SET PATH="%cd%\ffmpeg\bin;%PATH%"

cd chatgpt && ..\python3.11\python.exe bot.py
TITLE [ChatGPT for QQ] ChatGPT 端已停止运行
Expand Down
2 changes: 1 addition & 1 deletion .github/quickstarts/windows/mirai/scripts/启动Mirai.cmd
Expand Up @@ -3,7 +3,7 @@

TITLE [ChatGPT for QQ] Mirai 端正在运行...

setx /M PATH "%cd%\ffmpeg\bin;%PATH%"
SET PATH="%cd%\ffmpeg\bin;%PATH%"

cd mirai && mcl
TITLE [ChatGPT for QQ] Mirai 端已停止运行
Expand Down
5 changes: 3 additions & 2 deletions Dockerfile
Expand Up @@ -5,9 +5,8 @@ ENV DEBIAN_FRONTEND=noninteractive
COPY ./fonts/sarasa-mono-sc-regular.ttf /usr/share/fonts/

RUN apt-get update && \
apt install --no-install-recommends xvfb binutils qtbase5-dev wkhtmltopdf ffmpeg -yq && \
apt install --no-install-recommends xvfb binutils build-essential qtbase5-dev wkhtmltopdf ffmpeg -yq && \
(strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 || true) && \
apt-get remove --purge -yq binutils && \
apt-get clean && \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && \
rm -rf /var/lib/apt/lists/*
Expand All @@ -20,6 +19,8 @@ RUN pip install --no-cache-dir -r requirements.txt && \
pip cache purge && \
python -c "from pycloudflared import try_cloudflare; try_cloudflare(-1)" || true

RUN apt-get remove --purge -yq binutils

COPY . /app

CMD ["/bin/bash", "/app/docker/start.sh"]
15 changes: 15 additions & 0 deletions README.md
Expand Up @@ -79,6 +79,21 @@

如果你是手机党,可以看这个纯用手机的部署教程(使用 Linux 服务器):https://www.bilibili.com/video/av949514538


<details>
<summary>AidLux: 仅使用旧安卓手机进行部署</summary>
执行下面这行命令启动自动安装脚本。

```bash
bash -c "$(wget -O- https://gist.githubusercontent.com/B17w153/f77c2726c4eca4e05b488f9af58823a5/raw/4410356eba091d3259c48506fb68112e68db729b/install_bot_aidlux.sh)"
```
[部署教程](https://github.com/lss233/chatgpt-for-bot-docs/tree/main/bu-shu-jiao-cheng/kuai-su-bu-shu-jiao-cheng/linux-yi-jian-bu-shu-jiao-cheng.md)


</details>



<details>
<summary>Linux: 通过快速部署脚本部署 (新人推荐)</summary>
执行下面这行命令启动自动部署脚本。
Expand Down
122 changes: 122 additions & 0 deletions adapter/xunfei/xinghuo.py
@@ -0,0 +1,122 @@
from io import BytesIO

from typing import Generator

from adapter.botservice import BotAdapter
from config import XinghuoCookiePath
from constants import botManager
from exceptions import BotOperationNotSupportedException
from loguru import logger
import httpx
import base64
from PIL import Image


class XinghuoAdapter(BotAdapter):
"""
Credit: https://github.com/dfvips/xunfeixinghuo
"""
account: XinghuoCookiePath
client: httpx.AsyncClient

def __init__(self, session_id: str = ""):
super().__init__(session_id)
self.session_id = session_id
self.account = botManager.pick('xinghuo-cookie')
self.client = httpx.AsyncClient(proxies=self.account.proxy)
self.__setup_headers(self.client)
self.conversation_id = None
self.parent_chat_id = ''

async def delete_conversation(self, session_id):
return await self.client.post("https://xinghuo.xfyun.cn/iflygpt/u/chat-list/v1/del-chat-list", json={
'chatListId': session_id
})

async def rollback(self):
raise BotOperationNotSupportedException()

async def on_reset(self):
await self.client.aclose()
self.client = httpx.AsyncClient(proxies=self.account.proxy)
self.__setup_headers(self.client)
self.conversation_id = None
self.parent_chat_id = 0

def __setup_headers(self, client):
client.headers['Cookie'] = f"ssoSessionId={self.account.ssoSessionId};"
client.headers[
'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
client.headers['Sec-Fetch-User'] = '?1'
client.headers['Sec-Fetch-Mode'] = 'navigate'
client.headers['Sec-Fetch-Site'] = 'none'
client.headers['Sec-Ch-Ua-Platform'] = '"Windows"'
client.headers['Sec-Ch-Ua-Mobile'] = '?0'
client.headers['Sec-Ch-Ua'] = '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"'
client.headers['Origin'] = 'https://xinghuo.xfyun.cn'
client.headers['Referer'] = 'https://xinghuo.xfyun.cn/desk'
client.headers['Connection'] = 'keep-alive'
client.headers['X-Requested-With'] = 'XMLHttpRequest'

async def new_conversation(self):
req = await self.client.post(
url="https://xinghuo.xfyun.cn/iflygpt/u/chat-list/v1/create-chat-list",
json={}
)
req.raise_for_status()
self.__check_response(req.json())
self.conversation_id = req.json()['data']['id']
self.parent_chat_id = 0

async def ask(self, prompt) -> Generator[str, None, None]:
if not self.conversation_id:
await self.new_conversation()

full_response = ''
async with self.client.stream(
"POST",
url="https://xinghuo.xfyun.cn/iflygpt-chat/u/chat_message/chat",
data={
'fd': self.account.fd,
'chatId': self.conversation_id,
'text': prompt,
'GtToken': self.account.GtToken,
'sid': self.account.sid,
'clientType': '1',
'isBot':'0'
},
) as req:
async for line in req.aiter_lines():
if not line:
continue
if line == 'data:<end>':
break
if line == 'data:[geeError]':
yield "错误:出现验证码,请到星火网页端发送一次消息再试。"
break
encoded_data = line[len("data:"):]
missing_padding = len(encoded_data) % 4
if missing_padding != 0:
encoded_data += '=' * (4 - missing_padding)
decoded_data = base64.b64decode(encoded_data).decode('utf-8')
if encoded_data != 'zw':
decoded_data = decoded_data.replace('\n\n', '\n')
full_response += decoded_data
yield full_response

logger.debug(f"[Xinghuo] {self.conversation_id} - {full_response}")

async def preset_ask(self, role: str, text: str):
if role.endswith('bot') or role in {'assistant', 'xinghuo'}:
logger.debug(f"[预设] 响应:{text}")
yield text
else:
logger.debug(f"[预设] 发送:{text}")
item = None
async for item in self.ask(text): ...
if item:
logger.debug(f"[预设] Chatbot 回应:{item}")

def __check_response(self, resp):
if int(resp['code']) != 0:
raise Exception(resp['msg'])
3 changes: 1 addition & 2 deletions bot.py
Expand Up @@ -16,8 +16,6 @@
import constants
import threading

hook()

loop = creart.create(AbstractEventLoop)


Expand Down Expand Up @@ -99,5 +97,6 @@ async def setup_web_service():

bots.append(setup_web_service())

hook()
loop.run_until_complete(asyncio.gather(*bots))
loop.run_forever()
28 changes: 26 additions & 2 deletions config.py
Expand Up @@ -99,6 +99,7 @@ class HttpService(BaseModel):
)



class WecomBot(BaseModel):
corp_id: str = Field(
title="企业 ID",
Expand Down Expand Up @@ -172,7 +173,7 @@ class OpenAIAuths(BaseModel):
api_endpoint: Optional[str] = None
"""自定义 OpenAI API 的接入点"""

gpt3_params: OpenAIGPT3Params = OpenAIGPT3Params()
gpt_params: OpenAIParams = OpenAIParams()

accounts: List[Union[OpenAIEmailAuth, OpenAISessionTokenAuth, OpenAIAccessTokenAuth, OpenAIAPIKey]] = []

Expand Down Expand Up @@ -281,7 +282,7 @@ class BingAuths(BaseModel):
"""Bing 的会话创建接入点"""
accounts: List[BingCookiePath] = []
"""Bing 的账号列表"""
max_messages: int = 20
max_messages: int = 30
"""Bing 的最大消息数,仅展示用"""


Expand All @@ -301,11 +302,30 @@ class YiyanCookiePath(BaseModel):
"""可选的代理地址,留空则检测系统代理"""


class XinghuoCookiePath(BaseModel):
ssoSessionId: str
"""星火 Cookie 中的 ssoSessionId 字段"""
fd: Optional[str] = ""
"""星火请求中的 fd 字段"""
GtToken: Optional[
str] = "R0VFAAYyNDAzOTU0YzM5Y2M0ZTRlNDY2MTE2MDA4ZGZlYjZjMGQzNGMyMGY0YjQ1NTA1NDg3OWQ0ZWJlOTk0NzQxNGI1MWUzM2IzZDUyZTEyMGM3MWYxNjlmNWY2YmYwMWMxNDI2YzIxOTlmZjMzYTI5YmY3YjQ1M2RjZGQwZWNjMDdiYjMzMmY4OTE2OTRhYTk1OWIyZWVlNzFjNmI5ZWFmY2MxNDFkNjk2MWYzYWQ3ZDAyYjZkM2U0YTllYWZlOTM0Njc4NmMyZmQ4NTRiYWViMTI2NjhlZmFhMWRiNmRmMDc5MzQxN2EyYzMzZDhiN2M4NzJjMzQ3YTYwNDFiMGZkZjkxN2Q2OTRlOWFiZWMwN2U0ZTg3Y2UwM2UxNDlmODBjMzA0MmE4NTAyNzhiNjU0MTU3ZjBlMmMzN2UxMTQ0MjA3ZWE0MDIzZTMyNDRiMjJmMjcwYjE5NGZiMWJhMmFlNGQ4YzkxMWNmZmQ0OGQzYzBlYmQxMTk1ZjE5MDJmMTVjNWUyMDI3ZmNmMDI0ODIxYWJiMWZhNzc3MTExOTBiZmZhMWRhYmRlYzVhYTkwMGRlMjU2YjFhNGQ4ZGYwYzQ0ZjI4MGJiNzcyNGIyOTlkYjU0ZGMyYjllY2U1NjNlYjQzZWE5MzhkMmQ3NTFjMTVkMGY0NDNkYjdhNzdlMmQ4NzM1NTQ3NDI0ZDBjNzRmMTA0NzY4NmI2M2UwZWRiMDM0ZjNhODc1NGZkYjgxMDBlNDA0MmZlZDYzZmFlYmYyNTExMTI5NTIyOTg0ZDMzN2UxYTBhN2NiZWZlZGMxOTVjOWQ2MGVhOTMyY2E5M2VhYmZkODI1YjBiMzU0ZDViYzUzMmM5YzI5NjA2ZWU3MmFmNGYwNGRkNTlhNDEzYzJiZmYyODllZjBkNWJlNWU5ZjZkZWVlMjk4MDUyMTU2OTQwNzE3ZDQ5M2NlM2E4YmIwN2YyZjE4MzgzZmEwNjQxNGZlYmFlNzdmN2QwNTZlYTQ3NDEwMmNlZjU1YmZhNjNjMDM2MmI5OTU2NjBkZjg4YzFjYzA2MmY0NjU2OTE0ZGIwMWE3ODQxNjA2YjdlZWE3ZDJjZTM4NjE5YTcwYjg0MmVkZTBmM2Y1MzI3ZGI2YmU5M2ZjYTNiMzg4OTJkOGQ3NWI4Y2M4YjQ3NjBkNDExZmQ3ZmFlNGIxY2YwMGE5ZDk2MmM2ZDYzMWE1YmRjNmYzMmU0Y2U5MDYwOGNiMDMzMTlkZGE2ZDlkMGU4OGUwMzUwMDkwZTQ5MGRhMmY5ODU1MGU4ZmQ1ODc3NmQ0Yjg5MDM1Y2FiNTg3MjMyMGMwOTJmOTUyODkwYmQ3YjIwYTMzODI5Y2MwY2VlZTE0MWY5N2FiN2IzYmJjNDg3MWM0M2E3ZTViYWNjZWZiZjg4MjM1ZDRiNWMzMjBjM2IxNGM2ZWE2NWVkZjc0OWI0ZDNlNzZjOWYyMTkwZDM0ZTVkYTZkNjM1NjFmZWNmMWYyODIxMTMyNjIyOGFjMWU0MTA2NjY1OWQ4Y2JlZTRmMjIwYzI2NjNmNzYxYzBhZGEyY2VkZjkyNDkzZWExNzFhN2NhZThiNTMxNDNmNzEzM2RhY2UyOWNmYjQ4ZTk5YzE2YjcyM2ZmZTJjZDk5MjU0NGM5OWNhOTFlMDRlMWNiNTQ5ZjU4MGQxY2I4YWU5MWU0MDlmZDZmYjhjNGYzYTRmODA2ZWFiZjRlMDI3OWJmOTM4NmQwN2I5MTBmYzlkYzNjMGM2ODIzYjg4OWFjNWZkZjBhYWNjYzNhYmU0MDRmMTg3Y2Q0MGNmMjcyNWFmY2VkYzAzYmVjZGY2MmMzNWRkNzQ5MGExYjQ1MDdlNTczNDI1OTliYTJhMjNmM2FmNDg1NGM3ODZkYzBiZWIzYTllMGEwYWUyMTllNmZhNzYyN2YyNTI5ZDc3YzQ3MGY1YzIxNzI1NzhhM2EwYzM3NzM0NTM4MTlhYjE3ODJiNmRmOGM1NTI2YjQzZjUzNTZlNDVhM2Q5MDc4N2IwZGNkZTdmYmYzM2ZkMWQ2NGY2NjdmOWYzNDIzZjJkMmU2NzgyMTY5ZWM3MTE1Y2E3MDdlYWRhOGJmNzI0OTJmMGM3Y2QxNjJjMDI4NmFjOThmNDhmOWEyYWQzZDAwYzg5YmViYzA3NTA4ZjYwYzE1OGVmYjk5ZjBkOGY4MzQ1ODI5Yzg4Yzc0YTA3OGQyZjU5NTFjNmQzNTc1N2QyNjI0NWVjNTk0Y2JkMzc2YmVhMGNiZmEzMWYwZTA5MGRhYzhlYzNlYjQ0ZGIxN2M4MWE5NWY4MTE4MDAwNDJkMjQ2MmMzMjk2ODU5Yjg3ZjRhZmI1MDYxM2MxY2FiYTZkZDI0ODdiZDQ3MmVmNzBjMzFkN2YwNjZmZTMxOThiYzFhOWFlZjIwZTQzY2FlNDBkMDkxZWEzMmNiYTBhNDM0YmQ2ZDU2NDQ3YTU4YTNjODZjYTk0NjQ3MGNiZjM4ZjM3ZjU2YTZkZmQ4MDY0OWEyZGU3MzllN2EyZWE3M2RlNDE5NDljNmI4ODU2YmE5ZTM4Njc2YmRhNzA1MWE5MjlmMWU1YTczZjEwYTg2ZjgwNDJjZDQxZTMwYjVjMTA1ODYzNzlhMGY3NmRlOWExODZiZmU2N2Y5NzZhOTY3MTg0ZjNkYmFhYWU0YjdmNmFlMjM5MTlkNDljNDNiODc4MzRjMjA0MzY4YThkOGEyYzRkNjc3MzhkMTU0NmFiNTVjMWE0YTQ0Y2M3MzE5OGM4Y2YzOTAxZGI0ZGY1MzFmNGY5NTI4MDE5MjZjN2I2MDg1YjQzODI0YmFiMTQ3NTIxZTYwNWQzYzhmZjljYjNmOTRlNzg3MDJiYzc1MzE4NTRhN2M3ZDE2OWQyMzcyYjUzMDBhNGQzNzhhYWNjOTk3ZDM1ZTZjODYwZGQwMWNlYTMwZjU1YTFlMjQxMTMxMTQwZjQwMWJmZGJkNWU3NzA4OWE5YzljNDIzY2E2ODk3OGE2ODMwYWEzYTlkZGJiZmMyYTE3NGZhOTc4NmI3ZTYyYmIzNTZlNjRiMzBiYzI4ZDMyYTVjMDMxYzgxZjZlOGEyMGMwNWFlNjJlYWM2ZWExNDY5OTFiZjk1Yzc4NzQzMjMwYTIyNzk1MWRlMzI4NjFjYjU5ZGQ3N2QxOWQ5MTMxNDgwYmY2ZTgyYTkwNzgwMTBlYjAzMzIzYjcxNGY0NzM5NDNmY2MwNTM3ODJmOTIwMGFkNzlmNzZiNjkxNDdmZGQwOTdhZTUwMTk1YjE4M2Q2YWM5NjVmN2NkNDNhMGI3MTEwOTNkZTM5NGM3OTYwNjNlNTBhMDAyNzNkOTE2MzQzODY2MzFkZThkMzViYTUxNmI4MTIyZWZjNzE5MTU0OTQ2NTIyYzc0YjhmNTY2OTMwZDM3YmIwZjJkM2Q4ODgyZGQwZTU0YTcyODM1NmYyZDk2ZWVlNzZiYmZlYjI1YTFjM2ZhNTg5OGY5OTM0YTc4NTBjYzRlNjY4NjE5YWMzOTg2MmE5NDhjMDVhMTc0MzE0MjIwOGFhMjk5OGY2ZmIwMmZlZWI2YTk0M2Q1NzcyN2JhZWU4ZmY5NGFmZjgzZGVjMTUyZmYxOWVkYmM1Y2RiZDkzYzBiNDc1OTEzMjFhYTY4MjI1MDA4ODhmYWJhMzAzNjdlZmRjYmJjNzhjYzE5MWI1MDViNTlmMjBhY2RiYTYzMzQyYzE1YTI2M2NiOGE1NDQ3NzQ4ODU3YWYxMzllMDJlMzY0ODlkNjRlNTRiMTc5YTgwOGRmMWU5YTk1ODY2YzE2YTYzM2EyZmUyYjA2MzM4OTI5YTc4MmRlMGFkZDgwZDZiYWU3Y2M1ZjljMWEzYzA5MGU4MTVlNjc2MGJjMzA0ZWU3ZmY1MDM5OGRiNDc0YTJkNWMzYWVhNTMxZjc0ZDU3NGNhZGNhZTIzZmZiZjcyY2FhNmU5YTNjNjFhYzNiMDJjNDdjYzQzZGJhYjA2NTgwNTkyZmE5YjMyNGMxMGJhMGRjNjgzZWIyYzRiNDg4NzFiMjk2YmIxNDBhMWUyZWRlOTE0NmY3MThkZTE4ZWU0M2QwZTk4NWY3NWQ1YWYyYjlkNjU5ODM5YzQwZWFiMzg2"
"""星火请求中的 GtToken 字段"""
sid: Optional[str] = ""
"""星火请求中的 sid 字段"""
proxy: Optional[str] = None
"""可选的代理地址,留空则检测系统代理"""


class YiyanAuths(BaseModel):
accounts: List[YiyanCookiePath] = []
"""文心一言的账号列表"""


class XinghuoAuths(BaseModel):
accounts: List[XinghuoCookiePath] = []
"""讯飞星火大模型的账号列表"""


class ChatGLMAPI(BaseModel):
api_endpoint: str
"""自定义 ChatGLM API 的接入点"""
Expand Down Expand Up @@ -715,6 +735,9 @@ class System(BaseModel):
default=False
)

auto_reset_timeout_seconds: int = 8 * 3600
"""会话闲置多长时间后会重置, -1 不重置"""


class BaiduCloud(BaseModel):
check: bool = Field(
Expand Down Expand Up @@ -900,6 +923,7 @@ class Config(BaseModel):
chatglm: ChatGLMAuths = ChatGLMAuths()
poe: PoeAuths = PoeAuths()
slack: SlackAuths = SlackAuths()
xinghuo: XinghuoAuths = XinghuoAuths()

# === Response Settings ===
text_to_image: TextToImage = TextToImage()
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.go-cqhttp.yaml
@@ -1,7 +1,7 @@
version: '3.4'
services:
gocqhttp:
image: ghcr.io/mrs4s/go-cqhttp:master
image: silicer/go-cqhttp:latest
restart: always
environment:
LANG: 'C.UTF-8'
Expand Down
2 changes: 2 additions & 0 deletions framework/chatbot/chatgpt.py
Expand Up @@ -41,6 +41,8 @@ def refresh_accessed_at(self):
current_time = datetime.datetime.now()
while len(self.accessed_at) > 0 and current_time - self.accessed_at[0] > datetime.timedelta(hours=1):
self.accessed_at.pop(0)
if len(self.accessed_at) == 0:
self.accessed_at.append(current_time)

async def delete_conversation(self, conversation_id):
await self.bot.delete_conversation(conversation_id)
Expand Down
4 changes: 4 additions & 0 deletions framework/drawing/sdwebui.py
Expand Up @@ -50,6 +50,10 @@ async def text_to_img(self, prompt):
return [Image(base64=i) for i in r.get('images', [])]

async def img_to_img(self, init_images: List[Image], prompt=''):
# 需要调用get_bytes方法,才能获取到base64字段内容
for x in init_images: await x.get_bytes()
# 消息链显示字符串中有“[图片]”字样,需要过滤
prompt = prompt.replace("[图片]", "")
payload = {
'init_images': [x.base64 for x in init_images],
'enable_hr': 'false',
Expand Down
30 changes: 21 additions & 9 deletions framework/llm/microsoft/bing.py
Expand Up @@ -4,9 +4,10 @@
from typing import Generator, List

import aiohttp
import re
import asyncio
from EdgeGPT import Chatbot as EdgeChatbot, ConversationStyle, NotAllowedToAccess
from ImageGen import ImageGenAsync
from EdgeGPT.ImageGen import ImageGenAsync
from framework.llm.llm import Llm
from graia.ariadne.message.element import Image as GraiaImage
from loguru import logger
Expand Down Expand Up @@ -55,6 +56,7 @@ async def ask(self, prompt: str) -> Generator[str, None, None]:
async for final, response in self.bot.ask_stream(prompt=prompt,
conversation_style=self.conversation_style,
wss_link=constants.config.bing.wss_link):
locale="zh-cn"):
if not response:
continue

Expand Down Expand Up @@ -87,9 +89,11 @@ async def ask(self, prompt: str) -> Generator[str, None, None]:
return
else:
# 生成中的消息
parsed_content = re.sub(r"\[\^\d+\^]", "", response)
if constants.config.bing.show_references:
parsed_content = re.sub(r"\[(\d+)]: ", r"\1: ", parsed_content)
parsed_content = re.sub(r"Searching the web for:(.*)\n", "", response)
parsed_content = re.sub(r"```json(.*)```", "", parsed_content,flags=re.DOTALL)
parsed_content = re.sub(r"Generating answers for you...", "", parsed_content)
if config.bing.show_references:
parsed_content = re.sub(r"\[(\d+)\]: ", r"\1: ", parsed_content)
else:
parsed_content = re.sub(r"(\[\d+]: .+)+", "", parsed_content)
parts = re.split(image_pattern, parsed_content)
Expand Down Expand Up @@ -120,8 +124,8 @@ async def text_to_img(self, prompt: str):
logger.debug(f"[Bing Image] Prompt: {prompt}")
try:
async with ImageGenAsync(
next((cookie['value'] for cookie in self.bot.cookies if cookie['name'] == '_U'), None),
False
all_cookies=self.bot.chat_hub.cookies,
quiet=True
) as image_generator:
images = await image_generator.get_images(prompt)

Expand All @@ -145,9 +149,17 @@ async def __download_image(self, url) -> GraiaImage:
logger.debug(f"[Bing AI] 下载完成:{resp.content_type} {url}")
return GraiaImage(data_bytes=await resp.read())

async def preset_ask(self, role: str, prompt: str):
yield None # Bing 不使用预设功能

@classmethod
def register(cls):
account_manager.register_type("bing", BingCookieAuth)
async def preset_ask(self, role: str, text: str):
if role.endswith('bot') or role in {'assistant', 'bing'}:
logger.debug(f"[预设] 响应:{text}")
yield text
else:
logger.debug(f"[预设] 发送:{text}")
item = None
async for item in self.ask(text): ...
if item:
logger.debug(f"[预设] Chatbot 回应:{item}")

0 comments on commit afd46d7

Please sign in to comment.