| import json |
|
|
| from openai import OpenAI |
| from colorama import init, Fore |
| from loguru import logger |
|
|
| from tool_register import get_tools, dispatch_tool |
|
|
| init(autoreset=True) |
| client = OpenAI( |
| base_url="http://127.0.0.1:8000/v1", |
| api_key = "xxx" |
| ) |
|
|
| tools = get_tools() |
|
|
|
|
| def run_conversation(query: str, stream=False, tools=None, max_retry=5): |
| params = dict(model="chatglm3", messages=[{"role": "user", "content": query}], stream=stream) |
| if tools: |
| params["tools"] = tools |
| response = client.chat.completions.create(**params) |
|
|
| for _ in range(max_retry): |
| if not stream: |
| if response.choices[0].message.function_call: |
| function_call = response.choices[0].message.function_call |
| logger.info(f"Function Call Response: {function_call.model_dump()}") |
|
|
| function_args = json.loads(function_call.arguments) |
| tool_response = dispatch_tool(function_call.name, function_args) |
| logger.info(f"Tool Call Response: {tool_response}") |
|
|
| params["messages"].append(response.choices[0].message) |
| params["messages"].append( |
| { |
| "role": "function", |
| "name": function_call.name, |
| "content": tool_response, |
| } |
| ) |
| else: |
| reply = response.choices[0].message.content |
| logger.info(f"Final Reply: \n{reply}") |
| return |
|
|
| else: |
| output = "" |
| for chunk in response: |
| content = chunk.choices[0].delta.content or "" |
| print(Fore.BLUE + content, end="", flush=True) |
| output += content |
|
|
| if chunk.choices[0].finish_reason == "stop": |
| return |
|
|
| elif chunk.choices[0].finish_reason == "function_call": |
| print("\n") |
|
|
| function_call = chunk.choices[0].delta.function_call |
| logger.info(f"Function Call Response: {function_call.model_dump()}") |
|
|
| function_args = json.loads(function_call.arguments) |
| tool_response = dispatch_tool(function_call.name, function_args) |
| logger.info(f"Tool Call Response: {tool_response}") |
|
|
| params["messages"].append( |
| { |
| "role": "assistant", |
| "content": output |
| } |
| ) |
| params["messages"].append( |
| { |
| "role": "function", |
| "name": function_call.name, |
| "content": tool_response, |
| } |
| ) |
|
|
| break |
|
|
| response = client.chat.completions.create(**params) |
|
|
|
|
| if __name__ == "__main__": |
| query = "你是谁" |
| run_conversation(query, stream=True) |
|
|
| logger.info("\n=========== next conversation ===========") |
|
|
| query = "帮我查询北京的天气怎么样" |
| run_conversation(query, tools=tools, stream=True) |
|
|