mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-13 22:20:58 +00:00
fix: Fixed the errors in modelscopechatcmpl.py when in pseudo-non-streaming mode, regarding the display of main content and tool calls.
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import json
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
import openai
|
import openai
|
||||||
@@ -34,10 +35,11 @@ class ModelScopeChatCompletions(requester.ProviderAPIRequester):
|
|||||||
|
|
||||||
async def _req(
|
async def _req(
|
||||||
self,
|
self,
|
||||||
|
query: core_entities.Query,
|
||||||
args: dict,
|
args: dict,
|
||||||
extra_body: dict = {},
|
extra_body: dict = {},
|
||||||
remove_think: bool = False,
|
remove_think: bool = False,
|
||||||
) -> chat_completion.ChatCompletion:
|
) -> list[dict[str, typing.Any]]:
|
||||||
args['stream'] = True
|
args['stream'] = True
|
||||||
|
|
||||||
chunk = None
|
chunk = None
|
||||||
@@ -51,12 +53,15 @@ class ModelScopeChatCompletions(requester.ProviderAPIRequester):
|
|||||||
chunk_idx = 0
|
chunk_idx = 0
|
||||||
thinking_started = False
|
thinking_started = False
|
||||||
thinking_ended = False
|
thinking_ended = False
|
||||||
|
tool_id = ''
|
||||||
|
tool_name = ''
|
||||||
|
message_delta = {}
|
||||||
async for chunk in resp_gen:
|
async for chunk in resp_gen:
|
||||||
# print(chunk)
|
|
||||||
if not chunk or not chunk.id or not chunk.choices or not chunk.choices[0] or not chunk.choices[0].delta:
|
if not chunk or not chunk.id or not chunk.choices or not chunk.choices[0] or not chunk.choices[0].delta:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
reasoning_content = chunk.choices[0].delta.reasoning_content
|
delta = chunk.choices[0].delta.model_dump() if hasattr(chunk.choices[0], 'delta') else {}
|
||||||
|
reasoning_content = delta.get('reasoning_content')
|
||||||
# 处理 reasoning_content
|
# 处理 reasoning_content
|
||||||
if reasoning_content:
|
if reasoning_content:
|
||||||
# accumulated_reasoning += reasoning_content
|
# accumulated_reasoning += reasoning_content
|
||||||
@@ -72,78 +77,50 @@ class ModelScopeChatCompletions(requester.ProviderAPIRequester):
|
|||||||
else:
|
else:
|
||||||
# 继续输出 reasoning_content
|
# 继续输出 reasoning_content
|
||||||
pending_content += reasoning_content
|
pending_content += reasoning_content
|
||||||
elif thinking_started and not thinking_ended and chunk.choices[0].delta.content:
|
elif thinking_started and not thinking_ended and delta.get('content'):
|
||||||
# reasoning_content 结束,normal content 开始,添加 </think> 结束标签
|
# reasoning_content 结束,normal content 开始,添加 </think> 结束标签
|
||||||
thinking_ended = True
|
thinking_ended = True
|
||||||
pending_content += '\n</think>\n' + chunk.choices[0].delta.content
|
pending_content += '\n</think>\n' + delta.get('content')
|
||||||
|
|
||||||
if chunk.choices[0].delta.content is not None:
|
if delta.get('content') is not None:
|
||||||
pending_content += chunk.choices[0].delta.content
|
pending_content += delta.get('content')
|
||||||
|
|
||||||
if chunk.choices[0].delta.tool_calls is not None:
|
if delta.get('tool_calls') is not None:
|
||||||
for tool_call in chunk.choices[0].delta.tool_calls:
|
for tool_call in delta.get('tool_calls'):
|
||||||
if tool_call.function.arguments is None:
|
if tool_call['id'] != '':
|
||||||
|
tool_id = tool_call['id']
|
||||||
|
if tool_call['function']['name'] is not None:
|
||||||
|
tool_name = tool_call['function']['name']
|
||||||
|
if tool_call['function']['arguments'] is None:
|
||||||
continue
|
continue
|
||||||
|
tool_call['id'] = tool_id
|
||||||
|
tool_call['name'] = tool_name
|
||||||
for tc in tool_calls:
|
for tc in tool_calls:
|
||||||
if tc.index == tool_call.index:
|
if tc['index'] == tool_call['index']:
|
||||||
tc.function.arguments += tool_call.function.arguments
|
tc['function']['arguments'] += tool_call['function']['arguments']
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
tool_calls.append(tool_call)
|
tool_calls.append(tool_call)
|
||||||
|
|
||||||
if chunk.choices[0].finish_reason is not None:
|
if chunk.choices[0].finish_reason is not None:
|
||||||
break
|
break
|
||||||
|
message_delta['content'] = pending_content
|
||||||
|
message_delta['role'] = 'assistant'
|
||||||
|
|
||||||
real_tool_calls = []
|
message_delta['tool_calls'] = tool_calls if tool_calls else None
|
||||||
|
# print(message_delta)
|
||||||
for tc in tool_calls:
|
return [message_delta]
|
||||||
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,
|
||||||
chat_completion: chat_completion.ChatCompletion,
|
chat_completion: list[dict[str, typing.Any]],
|
||||||
) -> llm_entities.Message:
|
) -> llm_entities.Message:
|
||||||
chatcmpl_message = chat_completion.choices[0].message.dict()
|
chatcmpl_message = chat_completion[0]
|
||||||
|
|
||||||
# 确保 role 字段存在且不为 None
|
# 确保 role 字段存在且不为 None
|
||||||
if 'role' not in chatcmpl_message or chatcmpl_message['role'] is None:
|
if 'role' not in chatcmpl_message or chatcmpl_message['role'] is None:
|
||||||
chatcmpl_message['role'] = 'assistant'
|
chatcmpl_message['role'] = 'assistant'
|
||||||
|
print(chatcmpl_message)
|
||||||
message = llm_entities.Message(**chatcmpl_message)
|
message = llm_entities.Message(**chatcmpl_message)
|
||||||
|
|
||||||
return message
|
return message
|
||||||
@@ -183,7 +160,7 @@ class ModelScopeChatCompletions(requester.ProviderAPIRequester):
|
|||||||
args['messages'] = messages
|
args['messages'] = messages
|
||||||
|
|
||||||
# 发送请求
|
# 发送请求
|
||||||
resp = await self._req(args, extra_body=extra_args, remove_think=remove_think)
|
resp = await self._req(query, args, extra_body=extra_args, remove_think=remove_think)
|
||||||
|
|
||||||
# 处理请求结果
|
# 处理请求结果
|
||||||
message = await self._make_msg(resp)
|
message = await self._make_msg(resp)
|
||||||
|
|||||||
Reference in New Issue
Block a user