catalog-agent/test_unified_format.py
2025-10-09 11:55:36 +08:00

155 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
测试统一使用OpenAI格式的一致性
"""
import json
from fastapi_app import convert_messages_to_openai_format
from openai_converter import OpenAIConverter
def test_unified_openai_format():
"""测试统一使用OpenAI格式"""
print("=== 测试统一OpenAI格式 ===")
# 测试数据
test_messages = [
{
"role": "assistant",
"reasoning_content": "这是思考过程",
"content": "这是回答内容",
"function_call": {
"name": "test_function",
"arguments": '{"param1": "value1"}'
}
},
{
"role": "function",
"name": "test_function",
"content": "工具执行结果"
}
]
print("原始qwen-agent格式:")
print(json.dumps(test_messages, indent=2, ensure_ascii=False))
# 使用新的统一函数
openai_messages = convert_messages_to_openai_format(test_messages)
print("\n转换后的OpenAI格式:")
print(json.dumps(openai_messages, indent=2, ensure_ascii=False))
# 验证格式
assert len(openai_messages) == 2
# 验证第一个消息
first_msg = openai_messages[0]
assert first_msg["role"] == "assistant"
assert "reasoning_content" in first_msg
assert "tool_calls" in first_msg
assert first_msg["tool_calls"][0]["function"]["name"] == "test_function"
# 验证第二个消息
second_msg = openai_messages[1]
assert second_msg["role"] == "tool"
assert "tool_call_id" in second_msg
print("✅ 统一OpenAI格式测试通过")
def test_stream_and_nonstream_consistency():
"""测试流式和非流式响应的一致性"""
print("\n=== 测试流式和非流式一致性 ===")
converter = OpenAIConverter()
# 模拟agent返回的消息
agent_messages = [
{
"role": "assistant",
"content": "让我帮你查询文件",
"reasoning_content": "用户想查询文件信息",
"function_call": {
"name": "list_files",
"arguments": '{"path": "/tmp"}'
}
}
]
# 非流式处理
openai_messages = converter.convert_messages_to_openai_format(agent_messages)
# 创建非流式响应
non_stream_response = converter.create_openai_response(
"test-model",
openai_messages,
{"prompt_tokens": 10, "completion_tokens": 5, "total_tokens": 15}
)
print("非流式响应:")
print(json.dumps(non_stream_response, indent=2, ensure_ascii=False))
# 验证响应结构
assert "choices" in non_stream_response
assert "usage" in non_stream_response
assert non_stream_response["choices"][0]["message"]["role"] == "assistant"
assert "tool_calls" in non_stream_response["choices"][0]["message"]
print("✅ 流式和非流式一致性测试通过")
def test_no_more_string_conversion():
"""测试不再有字符串转换"""
print("\n=== 测试无字符串转换 ===")
# 测试直接返回OpenAI格式不转换为字符串
test_messages = [
{
"role": "assistant",
"content": "这是一个简单的回答",
"function_call": {
"name": "simple_tool",
"arguments": '{"input": "test"}'
}
}
]
result = convert_messages_to_openai_format(test_messages)
# 验证返回的是结构化数据,不是字符串
assert isinstance(result, list)
assert isinstance(result[0], dict)
assert "tool_calls" in result[0]
assert "function" in result[0]["tool_calls"][0]
# 验证没有旧的字符串标记
msg_str = str(result)
assert "[THINK]" not in msg_str
assert "[TOOL_CALL]" not in msg_str
assert "[ANSWER]" not in msg_str
print("返回的数据类型:", type(result))
print("消息结构:", json.dumps(result[0], indent=2, ensure_ascii=False))
print("✅ 无字符串转换测试通过")
def main():
"""运行所有测试"""
print("测试统一使用OpenAI格式")
print("=" * 50)
test_unified_openai_format()
test_stream_and_nonstream_consistency()
test_no_more_string_conversion()
print("\n" + "=" * 50)
print("✅ 所有测试通过")
print("\n统一后的优势:")
print("1. 流式和非流式都使用OpenAI格式")
print("2. 不再有字符串转换的开销")
print("3. 完全兼容OpenAI API协议")
print("4. 代码更加简洁和一致")
if __name__ == "__main__":
main()