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