|
|
|
@@ -22,18 +22,6 @@ from core.model_runtime.model_providers.__base.large_language_model import Large |
|
|
|
from core.model_runtime.model_providers.zhipuai._common import _CommonZhipuaiAI |
|
|
|
from core.model_runtime.utils import helper |
|
|
|
|
|
|
|
GLM_JSON_MODE_PROMPT = """You should always follow the instructions and output a valid JSON object. |
|
|
|
The structure of the JSON object you can found in the instructions, use {"answer": "$your_answer"} as the default structure |
|
|
|
if you are not sure about the structure. |
|
|
|
|
|
|
|
And you should always end the block with a "```" to indicate the end of the JSON object. |
|
|
|
|
|
|
|
<instructions> |
|
|
|
{{instructions}} |
|
|
|
</instructions> |
|
|
|
|
|
|
|
```JSON""" # noqa: E501 |
|
|
|
|
|
|
|
|
|
|
|
class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel): |
|
|
|
def _invoke( |
|
|
|
@@ -64,42 +52,8 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel): |
|
|
|
credentials_kwargs = self._to_credential_kwargs(credentials) |
|
|
|
|
|
|
|
# invoke model |
|
|
|
# stop = stop or [] |
|
|
|
# self._transform_json_prompts(model, credentials, prompt_messages, model_parameters, tools, stop, stream, user) |
|
|
|
return self._generate(model, credentials_kwargs, prompt_messages, model_parameters, tools, stop, stream, user) |
|
|
|
|
|
|
|
# def _transform_json_prompts(self, model: str, credentials: dict, |
|
|
|
# prompt_messages: list[PromptMessage], model_parameters: dict, |
|
|
|
# tools: list[PromptMessageTool] | None = None, stop: list[str] | None = None, |
|
|
|
# stream: bool = True, user: str | None = None) \ |
|
|
|
# -> None: |
|
|
|
# """ |
|
|
|
# Transform json prompts to model prompts |
|
|
|
# """ |
|
|
|
# if "}\n\n" not in stop: |
|
|
|
# stop.append("}\n\n") |
|
|
|
|
|
|
|
# # check if there is a system message |
|
|
|
# if len(prompt_messages) > 0 and isinstance(prompt_messages[0], SystemPromptMessage): |
|
|
|
# # override the system message |
|
|
|
# prompt_messages[0] = SystemPromptMessage( |
|
|
|
# content=GLM_JSON_MODE_PROMPT.replace("{{instructions}}", prompt_messages[0].content) |
|
|
|
# ) |
|
|
|
# else: |
|
|
|
# # insert the system message |
|
|
|
# prompt_messages.insert(0, SystemPromptMessage( |
|
|
|
# content=GLM_JSON_MODE_PROMPT.replace("{{instructions}}", "Please output a valid JSON object.") |
|
|
|
# )) |
|
|
|
# # check if the last message is a user message |
|
|
|
# if len(prompt_messages) > 0 and isinstance(prompt_messages[-1], UserPromptMessage): |
|
|
|
# # add ```JSON\n to the last message |
|
|
|
# prompt_messages[-1].content += "\n```JSON\n" |
|
|
|
# else: |
|
|
|
# # append a user message |
|
|
|
# prompt_messages.append(UserPromptMessage( |
|
|
|
# content="```JSON\n" |
|
|
|
# )) |
|
|
|
|
|
|
|
def get_num_tokens( |
|
|
|
self, |
|
|
|
model: str, |
|
|
|
@@ -170,7 +124,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel): |
|
|
|
:return: full response or stream response chunk generator result |
|
|
|
""" |
|
|
|
extra_model_kwargs = {} |
|
|
|
# request to glm-4v-plus with stop words will always response "finish_reason":"network_error" |
|
|
|
# request to glm-4v-plus with stop words will always respond "finish_reason":"network_error" |
|
|
|
if stop and model != "glm-4v-plus": |
|
|
|
extra_model_kwargs["stop"] = stop |
|
|
|
|
|
|
|
@@ -186,7 +140,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel): |
|
|
|
# resolve zhipuai model not support system message and user message, assistant message must be in sequence |
|
|
|
new_prompt_messages: list[PromptMessage] = [] |
|
|
|
for prompt_message in prompt_messages: |
|
|
|
copy_prompt_message = prompt_message.copy() |
|
|
|
copy_prompt_message = prompt_message.model_copy() |
|
|
|
if copy_prompt_message.role in {PromptMessageRole.USER, PromptMessageRole.SYSTEM, PromptMessageRole.TOOL}: |
|
|
|
if isinstance(copy_prompt_message.content, list): |
|
|
|
# check if model is 'glm-4v' |
|
|
|
@@ -238,59 +192,38 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel): |
|
|
|
params = self._construct_glm_4v_parameter(model, new_prompt_messages, model_parameters) |
|
|
|
else: |
|
|
|
params = {"model": model, "messages": [], **model_parameters} |
|
|
|
# glm model |
|
|
|
if not model.startswith("chatglm"): |
|
|
|
for prompt_message in new_prompt_messages: |
|
|
|
if prompt_message.role == PromptMessageRole.TOOL: |
|
|
|
for prompt_message in new_prompt_messages: |
|
|
|
if prompt_message.role == PromptMessageRole.TOOL: |
|
|
|
params["messages"].append( |
|
|
|
{ |
|
|
|
"role": "tool", |
|
|
|
"content": prompt_message.content, |
|
|
|
"tool_call_id": prompt_message.tool_call_id, |
|
|
|
} |
|
|
|
) |
|
|
|
elif isinstance(prompt_message, AssistantPromptMessage): |
|
|
|
if prompt_message.tool_calls: |
|
|
|
params["messages"].append( |
|
|
|
{ |
|
|
|
"role": "tool", |
|
|
|
"role": "assistant", |
|
|
|
"content": prompt_message.content, |
|
|
|
"tool_call_id": prompt_message.tool_call_id, |
|
|
|
"tool_calls": [ |
|
|
|
{ |
|
|
|
"id": tool_call.id, |
|
|
|
"type": tool_call.type, |
|
|
|
"function": { |
|
|
|
"name": tool_call.function.name, |
|
|
|
"arguments": tool_call.function.arguments, |
|
|
|
}, |
|
|
|
} |
|
|
|
for tool_call in prompt_message.tool_calls |
|
|
|
], |
|
|
|
} |
|
|
|
) |
|
|
|
elif isinstance(prompt_message, AssistantPromptMessage): |
|
|
|
if prompt_message.tool_calls: |
|
|
|
params["messages"].append( |
|
|
|
{ |
|
|
|
"role": "assistant", |
|
|
|
"content": prompt_message.content, |
|
|
|
"tool_calls": [ |
|
|
|
{ |
|
|
|
"id": tool_call.id, |
|
|
|
"type": tool_call.type, |
|
|
|
"function": { |
|
|
|
"name": tool_call.function.name, |
|
|
|
"arguments": tool_call.function.arguments, |
|
|
|
}, |
|
|
|
} |
|
|
|
for tool_call in prompt_message.tool_calls |
|
|
|
], |
|
|
|
} |
|
|
|
) |
|
|
|
else: |
|
|
|
params["messages"].append({"role": "assistant", "content": prompt_message.content}) |
|
|
|
else: |
|
|
|
params["messages"].append( |
|
|
|
{"role": prompt_message.role.value, "content": prompt_message.content} |
|
|
|
) |
|
|
|
else: |
|
|
|
# chatglm model |
|
|
|
for prompt_message in new_prompt_messages: |
|
|
|
# merge system message to user message |
|
|
|
if prompt_message.role in { |
|
|
|
PromptMessageRole.SYSTEM, |
|
|
|
PromptMessageRole.TOOL, |
|
|
|
PromptMessageRole.USER, |
|
|
|
}: |
|
|
|
if len(params["messages"]) > 0 and params["messages"][-1]["role"] == "user": |
|
|
|
params["messages"][-1]["content"] += "\n\n" + prompt_message.content |
|
|
|
else: |
|
|
|
params["messages"].append({"role": "user", "content": prompt_message.content}) |
|
|
|
else: |
|
|
|
params["messages"].append( |
|
|
|
{"role": prompt_message.role.value, "content": prompt_message.content} |
|
|
|
) |
|
|
|
params["messages"].append({"role": "assistant", "content": prompt_message.content}) |
|
|
|
else: |
|
|
|
params["messages"].append({"role": prompt_message.role.value, "content": prompt_message.content}) |
|
|
|
|
|
|
|
if tools and len(tools) > 0: |
|
|
|
params["tools"] = [{"type": "function", "function": helper.dump_model(tool)} for tool in tools] |
|
|
|
@@ -406,7 +339,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel): |
|
|
|
Handle llm stream response |
|
|
|
|
|
|
|
:param model: model name |
|
|
|
:param response: response |
|
|
|
:param responses: response |
|
|
|
:param prompt_messages: prompt messages |
|
|
|
:return: llm response chunk generator result |
|
|
|
""" |
|
|
|
@@ -505,7 +438,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel): |
|
|
|
if tools and len(tools) > 0: |
|
|
|
text += "\n\nTools:" |
|
|
|
for tool in tools: |
|
|
|
text += f"\n{tool.json()}" |
|
|
|
text += f"\n{tool.model_dump_json()}" |
|
|
|
|
|
|
|
# trim off the trailing ' ' that might come from the "Assistant: " |
|
|
|
return text.rstrip() |