diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index b687adbde..0c475bf60 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -2,7 +2,7 @@ 如需修改配置,请在 `data/cmd_config.json` 中修改或者在管理面板中可视化修改。 """ -VERSION = "3.4.20" +VERSION = "3.4.21" DB_PATH = "data/data_v3.db" # 默认配置 @@ -72,6 +72,7 @@ DEFAULT_CONFIG = { }, "admins_id": [], "t2i": False, + "t2i_word_threshold": 150, "http_proxy": "", "dashboard": { "enable": True, @@ -752,7 +753,7 @@ CONFIG_METADATA_2 = { "description": "提示词", "type": "string", "obvious_hint": True, - "hint": "提示词。当提示词为空时,如果触发回复,prompt是触发的消息的内容;否则是提示词。此项可以和定时回复(暂未实现)配合使用。", + "hint": "提示词。当提示词为空时,如果触发回复,则向 LLM 请求的是触发的消息的内容;否则是提示词。此项可以和定时回复(暂未实现)配合使用。", }, }, }, @@ -781,6 +782,11 @@ CONFIG_METADATA_2 = { "type": "bool", "hint": "启用后,超出一定长度的文本将会通过 AstrBot API 渲染成 Markdown 图片发送。可以缓解审核和消息过长刷屏的问题,并提高 Markdown 文本的可读性。", }, + "t2i_word_threshold": { + "description": "文本转图像字数阈值", + "type": "int", + "hint": "超出此字符长度的文本将会被转换成图片。字数不能低于 50。", + }, "admins_id": { "description": "管理员 ID", "type": "list", diff --git a/astrbot/core/pipeline/result_decorate/stage.py b/astrbot/core/pipeline/result_decorate/stage.py index 332e1cef4..c05d4b0bc 100644 --- a/astrbot/core/pipeline/result_decorate/stage.py +++ b/astrbot/core/pipeline/result_decorate/stage.py @@ -19,6 +19,13 @@ class ResultDecorateStage: self.reply_with_mention = ctx.astrbot_config['platform_settings']['reply_with_mention'] self.reply_with_quote = ctx.astrbot_config['platform_settings']['reply_with_quote'] self.use_tts = ctx.astrbot_config['provider_tts_settings']['enable'] + self.t2i_word_threshold = ctx.astrbot_config['t2i_word_threshold'] + try: + self.t2i_word_threshold = int(self.t2i_word_threshold) + if self.t2i_word_threshold < 50: + self.t2i_word_threshold = 50 + except BaseException: + self.t2i_word_threshold = 150 # 分段回复 self.enable_segmented_reply = ctx.astrbot_config['platform_settings']['segmented_reply']['enable'] @@ -59,7 +66,7 @@ class ResultDecorateStage: comp.text = llm_resp.completion_text except BaseException as e: traceback.print_exc() - logger.error("使用 LLM 分段回复失败: " + str(e)) + logger.warning("使用 LLM 分段回复失败。将不分段回复。: " + str(e)) new_chain.append(comp) continue @@ -106,7 +113,7 @@ class ResultDecorateStage: plain_str += "\n\n" + comp.text else: break - if plain_str and len(plain_str) > 150: + if plain_str and len(plain_str) > self.t2i_word_threshold: render_start = time.time() try: url = await html_renderer.render_t2i(plain_str, return_url=True) diff --git a/astrbot/core/provider/sources/dify_source.py b/astrbot/core/provider/sources/dify_source.py index d59e9c62b..db10bcc67 100644 --- a/astrbot/core/provider/sources/dify_source.py +++ b/astrbot/core/provider/sources/dify_source.py @@ -39,7 +39,7 @@ class ProviderDify(Provider): self, prompt: str, session_id: str = None, - image_urls: List[str] = None, + image_urls: List[str] = [], func_tool: FuncCall = None, contexts: List = None, system_prompt: str = None, @@ -64,8 +64,6 @@ class ProviderDify(Provider): else: # TODO: 处理更多情况 logger.warning(f"未知的图片链接:{image_url},图片将忽略。") - - logger.debug(files_payload) # 获得会话变量 session_vars = sp.get("session_variables", {}) @@ -115,7 +113,6 @@ class ProviderDify(Provider): result = chunk['data']['outputs'][self.workflow_output_key] case _: raise Exception(f"未知的 Dify API 类型:{self.api_type}") - return LLMResponse(role="assistant", completion_text=result) async def forget(self, session_id): diff --git a/astrbot/core/utils/dify_api_client.py b/astrbot/core/utils/dify_api_client.py index 5d41e2911..fbc8a7e59 100644 --- a/astrbot/core/utils/dify_api_client.py +++ b/astrbot/core/utils/dify_api_client.py @@ -27,9 +27,14 @@ class DifyAPIClient: payload = locals() payload.pop("self") payload.pop("timeout") + logger.info(f"chat_messages payload: {payload}") async with self.session.post( url, json=payload, headers=self.headers, timeout=timeout ) as resp: + if resp.status != 200: + text = await resp.text() + raise Exception(f"chat_messages 请求失败:{resp.status}. {text}") + while True: data = await resp.content.read(8192) # 防止数据过大导致高水位报错 if not data: @@ -55,9 +60,13 @@ class DifyAPIClient: payload = locals() payload.pop("self") payload.pop("timeout") + logger.info(f"workflow_run payload: {payload}") async with self.session.post( url, json=payload, headers=self.headers, timeout=timeout ) as resp: + if resp.status != 200: + text = await resp.text() + raise Exception(f"chat_messages 请求失败:{resp.status}. {text}") while True: data = await resp.content.read(8192) # 防止数据过大导致高水位报错 if not data: diff --git a/changelogs/v3.4.21.md b/changelogs/v3.4.21.md new file mode 100644 index 000000000..3ee5055d8 --- /dev/null +++ b/changelogs/v3.4.21.md @@ -0,0 +1,18 @@ +# What's Changed + +> 由于重写了会话记录部分,更新此版本后,将会造成之前的对话记录清空(但没有被删除)。 +> 关于更好的对话管理,如果有任何报错或者优化建议,请直接提交 issue~ + +1. 修复 reminder 时区问题 +2. 面板支持重载单个插件 +3. 面板支持列表展示插件市场 +4. 文字转图片支持自定义字数阈值(配置->其他配置) +5. 面板更好的列表可视化 +6. 面板支持查看插件行为 +7. 支持设置 timeout 超时时间参数,防止思考模型太长达到超时时间。(需要重新配置服务提供商或者在服务提供商 config 中配置 timeout 参数) +8. openrouter 报错 no endpoints found that support tool use #371 +9. 修复插件 metadata 不生效的问题 +10. 修复不支持图片的模型请求异常 +11. 修复 reminder 无法删除的问题 +12. 修复 /model 切换不了模型的问题 +13. 插件支持设置优先级 \ No newline at end of file diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index b82512516..013e2c105 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -339,7 +339,7 @@ UID: {user_id} 此 ID 可用于设置管理员。/op 授权管理员, /deo else: self.context.get_using_provider().set_model(idx_or_name) message.set_result( - MessageEventResult().message(f"切换模型成功。 \n模型信息: {idx_or_name}")) + MessageEventResult().message(f"切换模型到 {self.context.get_using_provider().get_model()}。")) @filter.command("history")