Merge branch 'master' into feat/wxoa

This commit is contained in:
Junyan Qin (Chin)
2025-02-11 00:02:33 +08:00
committed by GitHub
10 changed files with 102 additions and 12 deletions
+4 -1
View File
@@ -11,9 +11,12 @@ body:
- 其他(或暂未使用) - 其他(或暂未使用)
- Nakurugo-cqhttp - Nakurugo-cqhttp
- aiocqhttp(使用 OneBot 协议接入的) - aiocqhttp(使用 OneBot 协议接入的)
- qq-botpyQQ官方API - qq-botpyQQ官方API WebSocket
- qqofficialQQ官方API Webhook
- lark(飞书) - lark(飞书)
- wecom(企业微信) - wecom(企业微信)
- gewechat(个人微信)
- discord
validations: validations:
required: true required: true
- type: input - type: input
+1 -1
View File
@@ -6,7 +6,7 @@
<div align="center"> <div align="center">
<a href="https://trendshift.io/repositories/6187" target="_blank"><img src="https://trendshift.io/api/badge/repositories/6187" alt="RockChinQ%2FQChatGPT | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a> <a href="https://trendshift.io/repositories/12901" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12901" alt="RockChinQ%2FLangBot | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
<a href="https://docs.langbot.app">项目主页</a> <a href="https://docs.langbot.app">项目主页</a>
<a href="https://docs.langbot.app/insight/intro.htmll">功能介绍</a> <a href="https://docs.langbot.app/insight/intro.htmll">功能介绍</a>
+21
View File
@@ -0,0 +1,21 @@
from __future__ import annotations
import typing
import os
import sys
import logging
from .. import note, app
@note.note_class("PrintVersion", 3)
class PrintVersion(note.LaunchNote):
"""打印版本信息
"""
async def need_show(self) -> bool:
return True
async def yield_note(self) -> typing.AsyncGenerator[typing.Tuple[str, int], None]:
yield f"当前版本:{self.ap.ver_mgr.get_current_version()}", logging.INFO
+1 -1
View File
@@ -1,7 +1,7 @@
from __future__ import annotations from __future__ import annotations
from .. import stage, app, note from .. import stage, app, note
from ..notes import n001_classic_msgs, n002_selection_mode_on_windows from ..notes import n001_classic_msgs, n002_selection_mode_on_windows, n003_print_version
@stage.stage_class("ShowNotesStage") @stage.stage_class("ShowNotesStage")
+1 -1
View File
@@ -102,7 +102,7 @@ class ResponseWrapper(stage.PipelineStage):
new_query=query new_query=query
) )
if result.tool_calls is not None: # 有函数调用 if result.tool_calls is not None and len(result.tool_calls) > 0: # 有函数调用
function_names = [tc.function.name for tc in result.tool_calls] function_names = [tc.function.name for tc in result.tool_calls]
+1
View File
@@ -47,6 +47,7 @@ class QQOfficialMessageConverter(adapter.MessageConverter):
yiri_msg_list.append( yiri_msg_list.append(
platform_message.Image(base64=base64_url) platform_message.Image(base64=base64_url)
) )
yiri_msg_list.append(platform_message.Plain(text=message)) yiri_msg_list.append(platform_message.Plain(text=message))
chain = platform_message.MessageChain(yiri_msg_list) chain = platform_message.MessageChain(yiri_msg_list)
return chain return chain
+63 -1
View File
@@ -8,6 +8,7 @@ from typing import AsyncGenerator
import openai import openai
import openai.types.chat.chat_completion as chat_completion import openai.types.chat.chat_completion as chat_completion
import openai.types.chat.chat_completion_message_tool_call as chat_completion_message_tool_call
import httpx import httpx
import aiohttp import aiohttp
import async_lru import async_lru
@@ -40,6 +41,7 @@ class OpenAIChatCompletions(requester.LLMAPIRequester):
timeout=self.requester_cfg['timeout'], timeout=self.requester_cfg['timeout'],
http_client=httpx.AsyncClient( http_client=httpx.AsyncClient(
trust_env=True, trust_env=True,
timeout=self.requester_cfg['timeout']
) )
) )
@@ -47,7 +49,67 @@ class OpenAIChatCompletions(requester.LLMAPIRequester):
self, self,
args: dict, args: dict,
) -> chat_completion.ChatCompletion: ) -> chat_completion.ChatCompletion:
return await self.client.chat.completions.create(**args) args["stream"] = True
chunk = None
pending_content = ""
tool_calls = []
resp_gen: openai.AsyncStream = await self.client.chat.completions.create(**args)
async for chunk in resp_gen:
# print(chunk)
if not chunk:
continue
if chunk.choices[0].delta.content is not None:
pending_content += chunk.choices[0].delta.content
if chunk.choices[0].delta.tool_calls is not None:
for tool_call in chunk.choices[0].delta.tool_calls:
for tc in tool_calls:
if tc.index == tool_call.index:
tc.function.arguments += tool_call.function.arguments
break
else:
tool_calls.append(tool_call)
real_tool_calls = []
for tc in tool_calls:
function = chat_completion_message_tool_call.Function(
name=tc.function.name,
arguments=tc.function.arguments
)
real_tool_calls.append(chat_completion_message_tool_call.ChatCompletionMessageToolCall(
id=tc.id,
function=function,
type="function"
))
return chat_completion.ChatCompletion(
id=chunk.id,
object="chat.completion",
created=chunk.created,
choices=[
chat_completion.Choice(
index=0,
message=chat_completion.ChatCompletionMessage(
role="assistant",
content=pending_content,
tool_calls=real_tool_calls if len(real_tool_calls) > 0 else None
),
finish_reason=chunk.choices[0].finish_reason if hasattr(chunk.choices[0], 'finish_reason') and chunk.choices[0].finish_reason is not None else 'stop',
logprobs=chunk.choices[0].logprobs,
)
],
model=chunk.model,
service_tier=chunk.service_tier if hasattr(chunk, 'service_tier') else None,
system_fingerprint=chunk.system_fingerprint if hasattr(chunk, 'system_fingerprint') else None,
usage=chunk.usage if hasattr(chunk, 'usage') else None
) if chunk else None
async def _make_msg( async def _make_msg(
self, self,
@@ -46,6 +46,9 @@ class DeepseekChatCompletions(chatcmpl.OpenAIChatCompletions):
# 发送请求 # 发送请求
resp = await self._req(args) resp = await self._req(args)
if resp is None:
raise errors.RequesterError('接口返回为空,请确定模型提供商服务是否正常')
# 处理请求结果 # 处理请求结果
message = await self._make_msg(resp) message = await self._make_msg(resp)
+1 -1
View File
@@ -1,4 +1,4 @@
semantic_version = "v3.4.6" semantic_version = "v3.4.6.2"
debug_mode = False debug_mode = False
+6 -6
View File
@@ -4410,14 +4410,14 @@
} }
}, },
"node_modules/jsonpath-plus": { "node_modules/jsonpath-plus": {
"version": "10.1.0", "version": "10.2.0",
"resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.1.0.tgz", "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.2.0.tgz",
"integrity": "sha512-gHfV1IYqH8uJHYVTs8BJX1XKy2/rR93+f8QQi0xhx95aCiXn1ettYAd5T+7FU6wfqyDoX/wy0pm/fL3jOKJ9Lg==", "integrity": "sha512-T9V+8iNYKFL2n2rF+w02LBOT2JjDnTjioaNFrxRy0Bv1y/hNsqR/EBK7Ojy2ythRHwmz2cRIls+9JitQGZC/sw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jsep-plugin/assignment": "^1.2.1", "@jsep-plugin/assignment": "^1.3.0",
"@jsep-plugin/regex": "^1.0.3", "@jsep-plugin/regex": "^1.0.4",
"jsep": "^1.3.9" "jsep": "^1.4.0"
}, },
"bin": { "bin": {
"jsonpath": "bin/jsonpath-cli.js", "jsonpath": "bin/jsonpath-cli.js",