4.bd_oneapi_agent.py
"""
LangChain Agent 使用 One API 示例
One API 是一个统一的 API 网关,可以访问多种大模型
"""
from langchain.agents import create_agent
from langchain.tools import tool
from langchain_openai import ChatOpenAI
# One API 配置
BD_ONE_API_KEY = "xxx"
BD_ONE_API_BASE_URL = "https://xxx.com/v1"
# 可用的模型列表(根据 One API 实际支持的模型)
AVAILABLE_MODELS = {
"glm_4_7": "glm-4.7", # GLM-4.7
"glm_5": "glm-5", # GLM-5
"minimax_m2_5": "minimax-m2.5", # MiniMax M2.5
"minimax_m2_7": "minimax-m2.7", # MiniMax M2.7
"kimi_k2_5": "kimi-k2.5", # Kimi K2.5
"kimi_k2_6": "kimi-k2.6", # Kimi K2.6
}
# ============================================================================
# 定义工具
# ============================================================================
@tool
def get_weather(city: str) -> str:
"""
获取指定城市的天气信息
Args:
city: 城市名称,如"北京"、"上海"
Returns:
天气信息字符串
"""
# 模拟天气数据
weather_data = {
"北京": "晴天,温度 18-25°C,空气质量良好",
"上海": "多云,温度 20-28°C,有轻微雾霾",
"广州": "阴天,温度 22-30°C,可能有小雨",
"深圳": "晴天,温度 24-32°C,紫外线较强",
}
return weather_data.get(city, f"未找到 {city} 的天气信息")
@tool
def calculate(expression: str) -> str:
"""
计算数学表达式
Args:
expression: 数学表达式,如 "2+3*4"
Returns:
计算结果
"""
try:
result = eval(expression)
return f"计算结果: {result}"
except Exception as e:
return f"计算错误: {str(e)}"
@tool
def search_info(query: str) -> str:
"""
搜索信息
Args:
query: 搜索关键词
Returns:
搜索结果
"""
# 模拟搜索结果
search_results = {
"Python": "Python 是一种高级编程语言,以其简洁易读著称",
"AI": "人工智能(AI)是计算机科学的一个分支,致力于创建智能机器",
"机器学习": "机器学习是 AI 的子领域,使计算机能够从数据中学习",
}
for key in search_results:
if key in query:
return search_results[key]
return f"未找到关于 '{query}' 的信息"
# ============================================================================
# Demo 1: 基本使用 - 创建简单的 Agent
# ============================================================================
def demo1_basic_agent():
"""基本使用 - 创建简单的 Agent"""
print("=" * 60)
print("Demo 1: 基本使用 - 创建简单的 Agent")
print("=" * 60)
# 创建使用 One API 的模型
model = ChatOpenAI(
model=AVAILABLE_MODELS["glm_4_7"], # 使用 GLM-4.7 模型
temperature=0,
api_key=BD_ONE_API_KEY,
base_url=BD_ONE_API_BASE_URL,
)
# 创建 agent
agent = create_agent(
model,
tools=[get_weather, calculate, search_info],
name="BD_assistant"
)
# 调用 agent
result = agent.invoke({
"messages": [{"role": "user", "content": "北京今天天气怎么样?"}]
})
# 打印结果
print("\n result type:", type(result))
print("\n result", result)
# output
# result type: <class 'dict'>
# result {'messages': [HumanMessage(content='北京今天天气怎么样?', additional_kwargs={}, response_metadata={}, id='932d3e2a-ea07-40ba-92a6-5d5d444aced7'), AIMessage(content='我来帮您查询北京今天的天气情况。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 58, 'prompt_tokens': 331, 'total_tokens': 389, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': None, 'reasoning_tokens': 37, 'rejected_prediction_tokens': None}, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 43}}, 'model_provider': 'openai', 'model_name': 'glm-4.7', 'system_fingerprint': None, 'id': '2026050614284333c72cb793ee4a0c', 'finish_reason': 'tool_calls', 'logprobs': None}, name='BD_assistant', id='lc_run--019dfbf9-74fd-7180-aede-b642f93a44d7-0', tool_calls=[{'name': 'get_weather', 'args': {'city': '北京'}, 'id': 'call_-7666669799073636564', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 331, 'output_tokens': 58, 'total_tokens': 389, 'input_token_details': {'cache_read': 43}, 'output_token_details': {'reasoning': 37}}), ToolMessage(content='晴天,温度 18-25°C,空气质量良好', name='get_weather', id='07ae035b-9a53-45ae-a5c9-8313d079112b', tool_call_id='call_-7666669799073636564'), AIMessage(content='北京今天的天气很不错!🌞\n\n- **天气状况**:晴天\n- **温度范围**:18-25°C\n- **空气质量**:良好\n\n今天是个适合外出活动的好天气,温度适宜,空气也不错。记得根据温度变化适当增减衣物哦!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 95, 'prompt_tokens': 392, 'total_tokens': 487, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'glm-4.7', 'system_fingerprint': None, 'id': '20260506142900707fca5ce2e74121', 'finish_reason': 'stop', 'logprobs': None}, name='BD_assistant', id='lc_run--019dfbf9-ba80-79d0-a29c-3ba689c12026-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 392, 'output_tokens': 95, 'total_tokens': 487, 'input_token_details': {}, 'output_token_details': {}})]}
# 提取并打印结果
messages = result.get('messages', [])
if messages:
last_message = messages[-1]
print(f"\nAgent 响应:")
print(f"{last_message.content}")
# output
# Agent 响应:
# 北京今天的天气很不错!🌞
# - **天气状况**:晴天
# - **温度范围**:18-25°C
# - **空气质量**:良好
# 今天是个适合外出活动的好天气,温度适宜,空气也不错。记得根据温度变化适当增减衣物哦!
print()
# ============================================================================
# Demo 2: 多工具调用
# ============================================================================
def demo2_multiple_tools():
"""多工具调用示例"""
print("=" * 60)
print("Demo 2: 多工具调用")
print("=" * 60)
model = ChatOpenAI(
model=AVAILABLE_MODELS["glm_4_7"],
temperature=0,
api_key=BD_ONE_API_KEY,
base_url=BD_ONE_API_BASE_URL,
)
agent = create_agent(
model,
tools=[get_weather, calculate, search_info],
name="multi_tool_assistant"
)
# 提问需要调用多个工具
result = agent.invoke({
"messages": [{"role": "user", "content": "北京天气怎么样?顺便帮我算一下 25 * 4"}]
})
print(f"响应: {result}")
print()
# output
# 响应: {'messages': [HumanMessage(content='北京天气怎么样?顺便帮我算一下 25 * 4', additional_kwargs={}, response_metadata={}, id='1c004fdc-5827-4439-904f-fa1b4be474d4'), AIMessage(content='我来帮您查询北京天气并计算这个数学表达式。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 100, 'prompt_tokens': 339, 'total_tokens': 439, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': None, 'reasoning_tokens': 63, 'rejected_prediction_tokens': None}, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 337}}, 'model_provider': 'openai', 'model_name': 'glm-4.7', 'system_fingerprint': None, 'id': '20260506144459b844580abeaf415a', 'finish_reason': 'tool_calls', 'logprobs': None}, name='multi_tool_assistant', id='lc_run--019dfc08-5c4e-7063-813d-b9a128415c52-0', tool_calls=[{'name': 'get_weather', 'args': {'city': '北京'}, 'id': 'call_-7666671723218992284', 'type': 'tool_call'}, {'name': 'calculate', 'args': {'expression': '25 * 4'}, 'id': 'call_-7666671723218992283', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 339, 'output_tokens': 100, 'total_tokens': 439, 'input_token_details': {'cache_read': 337}, 'output_token_details': {'reasoning': 63}}), ToolMessage(content='晴天,温度 18-25°C,空气质量良好', name='get_weather', id='406bc828-adf0-45f1-bcd9-b19ef3fbae56', tool_call_id='call_-7666671723218992284'), ToolMessage(content='计算结果: 100', name='calculate', id='4dd3f2f3-bf3c-4371-900b-6be3279fe530', tool_call_id='call_-7666671723218992283'), AIMessage(content='根据查询结果:\n\n**北京天气**:晴天,温度 18-25°C,空气质量良好\n\n**计算结果**:25 × 4 = 100\n\n今天北京天气不错,温度适宜,是个外出活动的好天气!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 95, 'prompt_tokens': 396, 'total_tokens': 491, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': None, 'reasoning_tokens': 47, 'rejected_prediction_tokens': None}, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'glm-4.7', 'system_fingerprint': None, 'id': '2026050614450320d1cdeb666d4d85', 'finish_reason': 'stop', 'logprobs': None}, name='multi_tool_assistant', id='lc_run--019dfc08-6c8c-7082-adc7-d2567084ffdf-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 396, 'output_tokens': 95, 'total_tokens': 491, 'input_token_details': {}, 'output_token_details': {'reasoning': 47}})]}
# 提取并打印结果
messages = result.get('messages', [])
if messages:
last_message = messages[-1]
print(f"\nAgent 响应:")
print(f"{last_message.content}")
# output;
# Agent 响应:
# 根据查询结果:
# **北京天气**:晴天,温度 18-25°C,空气质量良好
# **计算结果**:25 × 4 = 100
# 今天北京天气不错,温度适宜,是个外出活动的好天气!
print()
# ============================================================================
# Demo 3: 不同模型配置
# ============================================================================
def demo3_different_models():
"""使用不同模型的示例"""
print("=" * 60)
print("Demo 3: 不同模型配置")
print("=" * 60)
# One API 支持的模型(某些模型有特定的温度要求)
# Kimi 模型只支持 temperature=1
model_configs = [
(AVAILABLE_MODELS["glm_4_7"], "GLM-4.7", 0),
(AVAILABLE_MODELS["glm_5"], "GLM-5", 0),
(AVAILABLE_MODELS["minimax_m2_5"], "MiniMax M2.5", 0),
(AVAILABLE_MODELS["minimax_m2_7"], "MiniMax M2.7", 0),
(AVAILABLE_MODELS["kimi_k2_5"], "Kimi K2.5", 1),
(AVAILABLE_MODELS["kimi_k2_6"], "Kimi K2.6", 1),
]
for model_name, model_desc, temperature in model_configs:
print(f"\n尝试使用模型: {model_desc} ({model_name})")
print("-" * 60)
try:
model = ChatOpenAI(
model=model_name,
temperature=temperature,
api_key=BD_ONE_API_KEY,
base_url=BD_ONE_API_BASE_URL,
)
agent = create_agent(
model,
tools=[get_weather],
name=f"{model_name}_assistant"
)
result = agent.invoke({
"messages": [{"role": "user", "content": "你好,请介绍一下你自己,并说一下你支持哪些模型?"}]
})
# print(f"result响应: {result}")
# print()
messages = result.get('messages', [])
if messages:
last_message = messages[-1]
print(f"响应: {last_message.content[:200]}...") # 只显示前200字符
# output
# 响应: 你好!我是 **Kimi**,由 **月之暗面科技有限公司(Moonshot AI)** 开发的人工智能助手。
# ### 关于我
# 我基于 **Kimi K2.5 系列**大模型,采用**混合专家(MoE)**架构,具备以下核心能力:
# - **超长上下文处理**:标准支持高达 256,000 tokens 的上下文窗口,测试中可处理高达 200 万字符的长文档、视频分析
# - **多模态理解**:支持...
except Exception as e:
print(f"错误: {str(e)}")
print()
# ============================================================================
# Demo 4: 流式输出
# ============================================================================
def demo4_streaming():
"""流式输出示例"""
print("=" * 60)
print("Demo 4: 流式输出")
print("=" * 60)
model = ChatOpenAI(
model=AVAILABLE_MODELS["glm_4_7"],
temperature=0,
api_key=BD_ONE_API_KEY,
base_url=BD_ONE_API_BASE_URL,
streaming=True,
)
agent = create_agent(
model,
tools=[search_info],
name="streaming_assistant"
)
print("\n流式响应:")
# 流式调用
for chunk in agent.stream({
"messages": [{"role": "user", "content": "请介绍一下 Python 编程语言"}]
}):
if 'messages' in chunk:
for msg in chunk['messages']:
if hasattr(msg, 'content') and msg.content:
print(msg.content, end="", flush=True)
print("\n")
# ============================================================================
# Demo 5: 带温度参数的创造性任务
# ============================================================================
def demo5_creative_task():
"""创造性任务示例 - 使用更高的温度参数"""
print("=" * 60)
print("Demo 5: 创造性任务")
print("=" * 60)
# 使用更高的温度参数增加创造性
model = ChatOpenAI(
model=AVAILABLE_MODELS["glm_4_7"],
temperature=0.8, # 提高温度增加随机性
api_key=BD_ONE_API_KEY,
base_url=BD_ONE_API_BASE_URL,
)
agent = create_agent(
model,
tools=[search_info],
name="creative_assistant"
)
result = agent.invoke({
"messages": [{"role": "user", "content": "请用 Python 写一首关于人工智能的诗"}]
})
messages = result.get('messages', [])
if messages:
last_message = messages[-1]
print(f"\n创作内容:")
print(f"{last_message.content}")
print()
# ============================================================================
# 主函数
# ============================================================================
def main():
"""主函数"""
print("\n One API Agent 示例")
print("=" * 60)
# 运行各个 demo
# demo1_basic_agent()
# demo2_multiple_tools()
# demo3_different_models()
demo4_streaming()
# demo5_creative_task()
if __name__ == "__main__":
main()
作者:海马 创建时间:2026-05-06 19:55
最后编辑:海马 更新时间:2026-05-13 07:11
最后编辑:海马 更新时间:2026-05-13 07:11