diff --git a/libs/chatchat-server/chatchat/server/agent/agent_factory/qwen_agent.py b/libs/chatchat-server/chatchat/server/agent/agent_factory/qwen_agent.py index c957f3cd3c..15132481b1 100644 --- a/libs/chatchat-server/chatchat/server/agent/agent_factory/qwen_agent.py +++ b/libs/chatchat-server/chatchat/server/agent/agent_factory/qwen_agent.py @@ -104,10 +104,11 @@ class QwenChatAgentOutputParserCustom(StructuredChatOutputParser): def parse(self, text: str) -> Union[AgentAction, AgentFinish]: if s := re.findall( - r"\nAction:\s*(.+)\nAction\sInput:\s*(.+)", text, flags=re.DOTALL + r"\*{0,2}Action:\*{0,2}\s*(.+?)\s*\*{0,2}Action Input:\*{0,2}\s*(?:```(?:json\n)?)?({.*?})(?:```)?", text, flags=re.DOTALL ): s = s[-1] - json_string: str = s[1] + tool_name: str = s[0].replace("[", "").replace("]", "").replace("*", "").strip() + json_string: str = s[1].replace("\n", "").replace(" ", "").replace("*", "").strip() json_input = None try: json_input = json.loads(json_string) @@ -135,7 +136,7 @@ def parse(self, text: str) -> Union[AgentAction, AgentFinish]: if "command" in json_input: json_input["query"] = json_input.pop("command") - return AgentAction(tool=s[0].strip(), tool_input=json_input, log=text) + return AgentAction(tool=tool_name.strip(), tool_input=json_input, log=text) elif s := re.findall(r"\nFinal\sAnswer:\s*(.+)", text, flags=re.DOTALL): s = s[-1] return AgentFinish({"output": s}, log=text) @@ -192,7 +193,7 @@ def create_structured_qwen_chat_agent( RunnablePassthrough.assign(agent_scratchpad=itemgetter("intermediate_steps")) | prompt | llm.bind( - stop=["<|endoftext|>", "<|im_start|>", "<|im_end|>", "\nObservation:"] + stop=["<|endoftext|>", "<|im_start|>", "<|im_end|>", "\nObservation:", "\n**Observation:**"] ) | output_parser ) diff --git a/libs/chatchat-server/chatchat/server/chat/chat.py b/libs/chatchat-server/chatchat/server/chat/chat.py index 432a0a5636..570a586efa 100644 --- a/libs/chatchat-server/chatchat/server/chat/chat.py +++ b/libs/chatchat-server/chatchat/server/chat/chat.py @@ -39,20 +39,21 @@ def create_models_from_config(configs, callbacks, stream, max_tokens): models = {} prompts = {} for model_type, params in configs.items(): - model_name = params.get("model", "").strip() or get_default_llm() - callbacks = callbacks if params.get("callbacks", False) else None + model_name = list(params.keys())[0].strip() or get_default_llm() + params_model = params[model_name] + callbacks = callbacks if params_model.get("callbacks", False) else None # 判断是否传入 max_tokens 的值, 如果传入就按传入的赋值(api 调用且赋值), 如果没有传入则按照初始化配置赋值(ui 调用或 api 调用未赋值) - max_tokens_value = max_tokens if max_tokens is not None else params.get("max_tokens", 1000) + max_tokens_value = max_tokens if max_tokens is not None else params_model.get("max_tokens", 1000) model_instance = get_ChatOpenAI( model_name=model_name, - temperature=params.get("temperature", 0.5), + temperature=params_model.get("temperature", 0.5), max_tokens=max_tokens_value, callbacks=callbacks, streaming=stream, local_wrap=True, ) models[model_type] = model_instance - prompt_name = params.get("prompt_name", "default") + prompt_name = params_model.get("prompt_name", "default") prompt_template = get_prompt_template(type=model_type, name=prompt_name) prompts[model_type] = prompt_template return models, prompts