mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-07-16 17:36:07 +00:00
Merge branch 'master' into feat/wxoa
This commit is contained in:
@@ -11,9 +11,12 @@ body:
|
|||||||
- 其他(或暂未使用)
|
- 其他(或暂未使用)
|
||||||
- Nakuru(go-cqhttp)
|
- Nakuru(go-cqhttp)
|
||||||
- aiocqhttp(使用 OneBot 协议接入的)
|
- aiocqhttp(使用 OneBot 协议接入的)
|
||||||
- qq-botpy(QQ官方API)
|
- qq-botpy(QQ官方API WebSocket)
|
||||||
|
- qqofficial(QQ官方API Webhook)
|
||||||
- lark(飞书)
|
- lark(飞书)
|
||||||
- wecom(企业微信)
|
- wecom(企业微信)
|
||||||
|
- gewechat(个人微信)
|
||||||
|
- discord
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
|
|||||||
@@ -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> |
|
||||||
|
|||||||
@@ -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,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")
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,4 +1,4 @@
|
|||||||
semantic_version = "v3.4.6"
|
semantic_version = "v3.4.6.2"
|
||||||
|
|
||||||
debug_mode = False
|
debug_mode = False
|
||||||
|
|
||||||
|
|||||||
Generated
+6
-6
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user