创建简单的 消息类型

from env_utils import DASHSCOPE_API_KEY, DASHSCOPE_BASE_URL, DEEPSEEK_BASE_URL, DEEPSEEK_API_KEY
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain.agents import create_agent
from langchain.tools import tool
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage

# ============================================================================
# Demo 1: 基本使用 - 创建简单的 Agent
# ============================================================================


@tool
def search(query: str) -> str:
    """搜索信息"""
    # 模拟搜索功能
    results = {
        "天气": "今天北京天气晴朗,温度22度",
        "新闻": "最新科技新闻:AI技术持续发展",
        "Python": "Python是一种流行的编程语言",
    }
    print('search tool 查询内容:', query)
    for key in results:
        if key in query:
            return results[key]
    return f"未找到关于 '{query}' 的信息"


@tool
def calculator(expression: str) -> str:
    """计算数学表达式"""
    try:
        result = eval(expression)
        return f"计算结果: {result}"
    except Exception as e:
        return f"计算错误: {str(e)}"


def demo1_Messages_Type():
    """基本使用 - 创建简单的 消息类型 demo1_Messages_Type"""
    print("=" * 50)
    print("Demo 1: 创建简单的 消息类型")
    print("=" * 50)

    # 方式3 推荐
    # 调用init_chat_model函数初始化模型,参数model用来指定模型名称,Langchain会根据模型名字自动设定base_url,并从环境变量中获取api_key

    model = init_chat_model(
        model="deepseek-chat",
        # base_url=DEEPSEEK_BASE_URL,  # 这个参数没有用,Langchain会根据模型名字自动设定base_url
        # api_key=DEEPSEEK_API_KEY,
        # temperature=1.5,
    )
    agent = create_agent(model, tools=[search, calculator])

    # 调用Agent,发送消息
    response = agent.invoke({
        "messages": [
            SystemMessage("请使用工具来获取天气信息。"),
            HumanMessage("你好,我是虎哥."),
            AIMessage("你好,虎哥,很高兴认识你."),
            HumanMessage("北京今天天气如何?")
        ]
    })

    print("\n result type:", type(response))
    #  output: result type: <class 'dict'>
    print(f"响应: {response}")
    print()

    # output:
    # 响应: {'messages': [HumanMessage(content='北京的天气怎么样?', additional_kwargs={}, response_metadata={}, id='7d2ae0ac-fc1e-4ad7-b0ae-fe03d866d504'), AIMessage(content='让我帮你查一下北京的天气情况。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 53, 'prompt_tokens': 314, 'total_tokens': 367, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 314}, 'model_provider': 'deepseek', 'model_name': 'deepseek-v4-flash', 'system_fingerprint': 'fp_058df29938_prod0820_fp8_kvcache_20260402', 'id': '9b88ff07-402d-443b-aad6-a5f88be4d53a', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--019e074f-e455-7150-8e05-ce89522864ac-0', tool_calls=[{'name': 'search', 'args': {'query': '北京天气 今天'}, 'id': 'call_00_Hidf1ib9kWm0VYvYd3Xb0177', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 314, 'output_tokens': 53, 'total_tokens': 367, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}), ToolMessage(content='今天北京天气晴朗,温度22度', name='search', id='5790d119-9e05-4f0e-8e9c-ececcada0c85', tool_call_id='call_00_Hidf1ib9kWm0VYvYd3Xb0177'), AIMessage(content='今天北京的天气情况如下:\n\n- **天气状况**:晴朗 ☀️\n- **温度**:22°C\n\n天气不错,适合外出活动!不过早晚温差可能较大,建议带件外套。如果你需要更详细的天气信息(比如风力、湿度、未来几天的预报等),可以告诉我,我再帮你查一下。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 70, 'prompt_tokens': 386, 'total_tokens': 456, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 256}, 'prompt_cache_hit_tokens': 256, 'prompt_cache_miss_tokens': 130}, 'model_provider': 'deepseek', 'model_name': 'deepseek-v4-flash', 'system_fingerprint': 'fp_058df29938_prod0820_fp8_kvcache_20260402', 'id': 'a32a2e6c-1c51-4b5a-8a4e-2f3ebf577c9b', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019e074f-eaa2-7150-95d1-b2b6eb675f89-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 386, 'output_tokens': 70, 'total_tokens': 456, 'input_token_details': {'cache_read': 256}, 'output_token_details': {}})]}

    # 从结果中提取消息列表
    messages = response.get('messages', [])
    if messages:
        # 打印方式一:
        # 获取最后一条消息(通常是最终的 AI 响应)
        last_message = messages[-1]
        print(f"最后一条消息类型: {type(last_message).__name__}")
        print(f"内容: {last_message.content}")

        # output:
        # 最后一条消息类型: AIMessage
        # 内容: 虎哥,今天北京的天气是**晴朗**的,温度大约在 **22°C** 左右,体感比较舒适。

        # 不过天气信息可能会有变化,建议您出门前再确认一下最新的天气预报哦!有什么其他需要帮忙的吗?😊

        # 打印方式二 美化打印
        for message in messages:
            print()
            # message.pretty_print()

            # output:

            # ================================ System Message ================================

            # 请使用工具来获取天气信息。
            # ================================ Human Message =================================

            # 你好,我是虎哥.
            # ================================== Ai Message ==================================

            # 你好,虎哥,很高兴认识你.
            # ================================ Human Message =================================

            # 北京今天天气如何?
            # ================================== Ai Message ==================================

            # 让我帮你查一下北京今天的天气情况。
            # Tool Calls:
            # search (call_00_DpUeC7FL49dZFK4zpZtL1523)
            # Call ID: call_00_DpUeC7FL49dZFK4zpZtL1523
            # Args:
            #     query: 北京今天天气 2024年
            # ================================= Tool Message =================================
            # Name: search

            # 今天北京天气晴朗,温度22度
            # ================================== Ai Message ==================================

            # 虎哥,北京今天天气很不错的!具体情况如下:

            # - **天气状况**:☀️ 晴朗
            # - **气温**:22°C左右

            # 天气挺好的,温度也很舒适,适合外出活动。不过早晚可能有点凉,出门时可以带件薄外套哦~有什么其他需要帮忙的吗?

            # 打印方式三: json格式打印每一项结果
            # print("="*50)
            # print(message.model_dump_json(indent=2))
            # print("="*50)

            # output:
            # ==================================================
            # {
            # "content": "请使用工具来获取天气信息。",
            # "additional_kwargs": {},
            # "response_metadata": {},
            # "type": "system",
            # "name": null,
            # "id": "43801aa1-0350-423e-967d-bc29858feb4f"
            # }
            # ==================================================
            # ==================================================
            # {
            # "content": "你好,我是虎哥.",
            # "additional_kwargs": {},
            # "response_metadata": {},
            # "type": "human",
            # "name": null,
            # "id": "937876e6-5d00-4783-8caa-c90a09f539e0"
            # }
            # ==================================================
            # ==================================================
            # {
            # "content": "你好,虎哥,很高兴认识你.",
            # "additional_kwargs": {},
            # "response_metadata": {},
            # "type": "ai",
            # "name": null,
            # "id": "a5ecaf5b-c890-4983-85e5-5193a4a5efba",
            # "tool_calls": [],
            # "invalid_tool_calls": [],
            # "usage_metadata": null
            # }
            # ==================================================
            # ==================================================
            # {
            # "content": "北京今天天气如何?",
            # "additional_kwargs": {},
            # "response_metadata": {},
            # "type": "human",
            # "name": null,
            # "id": "54143d9f-555a-49fd-a8fa-550bac566b43"
            # }
            # ==================================================
            # ==================================================
            # {
            # "content": "好的,我来帮你查一下北京的天气情况。",
            # "additional_kwargs": {
            #     "refusal": null
            # },
            # "response_metadata": {
            #     "token_usage": {
            #     "completion_tokens": 54,
            #     "prompt_tokens": 342,
            #     "total_tokens": 396,
            #     "completion_tokens_details": null,
            #     "prompt_tokens_details": {
            #         "audio_tokens": null,
            #         "cached_tokens": 0
            #     },
            #     "prompt_cache_hit_tokens": 0,
            #     "prompt_cache_miss_tokens": 342
            #     },
            #     "model_provider": "deepseek",
            #     "model_name": "deepseek-v4-flash",
            #     "system_fingerprint": "fp_8b330d02d0_prod0820_fp8_kvcache_20260402",
            #     "id": "dfd87978-6c8e-4f4b-9357-d4dea0198f2b",
            #     "finish_reason": "tool_calls",
            #     "logprobs": null
            # },
            # "type": "ai",
            # "name": null,
            # "id": "lc_run--019e1b81-f7e9-71e2-ae12-567e0a9178b4-0",
            # "tool_calls": [
            #     {
            #     "name": "search",
            #     "args": {
            #         "query": "北京今天天气"
            #     },
            #     "id": "call_00_kZYK9nPRRpCYyssQWS299025",
            #     "type": "tool_call"
            #     }
            # ],
            # "invalid_tool_calls": [],
            # "usage_metadata": {
            #     "input_tokens": 342,
            #     "output_tokens": 54,
            #     "total_tokens": 396,
            #     "input_token_details": {
            #     "cache_read": 0
            #     },
            #     "output_token_details": {}
            # }
            # }
            # ==================================================
            # ==================================================
            # {
            # "content": "今天北京天气晴朗,温度22度",
            # "additional_kwargs": {},
            # "response_metadata": {},
            # "type": "tool",
            # "name": "search",
            # "id": "ce4ece2b-31d0-44b6-b9c0-ff91e8c57991",
            # "tool_call_id": "call_00_kZYK9nPRRpCYyssQWS299025",
            # "artifact": null,
            # "status": "success"
            # }
            # ==================================================
            # ==================================================
            # {
            # "content": "虎哥,北京今天天气**晴朗**,气温大约 **22°C**,是个挺不错的好天气,适合外出活动!不过早晚可能有点凉,建议带件外套哦。\n\n还有其他想了解的吗?",
            # "additional_kwargs": {
            #     "refusal": null
            # },
            # "response_metadata": {
            #     "token_usage": {
            #     "completion_tokens": 45,
            #     "prompt_tokens": 415,
            #     "total_tokens": 460,
            #     "completion_tokens_details": null,
            #     "prompt_tokens_details": {
            #         "audio_tokens": null,
            #         "cached_tokens": 256
            #     },
            #     "prompt_cache_hit_tokens": 256,
            #     "prompt_cache_miss_tokens": 159
            #     },
            #     "model_provider": "deepseek",
            #     "model_name": "deepseek-v4-flash",
            #     "system_fingerprint": "fp_8b330d02d0_prod0820_fp8_kvcache_20260402",
            #     "id": "50ab5d1a-181b-4e8e-88d4-36b28b9d353c",
            #     "finish_reason": "stop",
            #     "logprobs": null
            # },
            # "type": "ai",
            # "name": null,
            # "id": "lc_run--019e1b81-fc40-7190-8378-7828ce5b7532-0",
            # "tool_calls": [],
            # "invalid_tool_calls": [],
            # "usage_metadata": {
            #     "input_tokens": 415,
            #     "output_tokens": 45,
            #     "total_tokens": 460,
            #     "input_token_details": {
            #     "cache_read": 256
            #     },
            #     "output_token_details": {}
            # }
            # }
            # ==================================================


def demo2_Messages_Image_Url():
    """示例1: 通过 Messages 字段传递图片 Url"""
    print("=" * 50)
    print("Demo 1: 通过 Messages 字段传递图片 Url")
    print("=" * 50)

    # 初始化模型
    model = init_chat_model(
        model="qwen3.5-plus",  # 模型名称,这里选择qwen3.5-plus,这是一个多模态模型,支持图片、文本、音频、视频
        model_provider="openai",
        base_url=DASHSCOPE_BASE_URL,
        api_key=DASHSCOPE_API_KEY
    )
    # 创建Agent
    agent = create_agent(model=model)

    # 准备多模态消息
    # message = HumanMessage([
    #     {"type": "text", "text": "描述以下这张图片的内容."},
    #     {"type": "image", "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
    # ])
    message = HumanMessage(content=[
        {"type": "text", "text": "描述以下这张图片的内容."},
        {"type": "image_url",
         "image_url": {
             "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
         },
    ])

    stream = agent.stream(
        {"messages": [message]},
        stream_mode="messages"
    )
    for chunk, metadata in stream:
        if chunk.content:
            print(chunk.content, end="", flush=True)

    # output:
    # 这张图片捕捉了一个非常温馨、治愈的时刻,主要包含以下内容:

    # **1. 主体人物与动物:**
    # *   **一位年轻女子**:她坐在沙滩上,留着长发,身穿黑白格纹的长袖衬衫和深色裤子,赤着脚。她面带灿烂的笑容,侧身面向狗狗,看起来非常开心和放松。
    # *   **一只狗**:看起来像是一只金毛寻回犬或拉布拉多,毛色金黄。它乖巧地坐在女子对面,身上戴着带有彩色图案的胸背带(harness)。它抬起一只前爪,正与女子的手接触,仿佛在进行“握手”或“击掌”的互动。

    # **2. 环境与背景:**
    # *   **海滩**:两人位于宽阔的沙滩上,沙地上有一些自然的纹理和脚印。
    # *   **大海**:背景是平静的大海,可以看到远处的海平线和轻轻拍打岸边的海浪。
    # *   **光线**:阳光非常强烈且温暖,从画面右侧照射过来(看起来像是日落时分的“黄金时刻”)。逆光的效果给女子的头发和狗狗的轮廓镀上了一层金边,营造出一种梦幻、温暖的氛围。

    # **3. 细节:**
    # *   红色的牵引绳随意地散落在女子脚边的沙地上。
    # *   女子手腕上似乎戴着一只白色的手表或手环。

    # 总的来说,这张照片展现了人与宠物之间亲密无间的关系,以及在海边享受美好时光的宁静与快乐。%


def main():
    """主函数,分别调用各个 demo"""
    print("DASHSCOPE_API_KEY", DASHSCOPE_API_KEY)
    print("DASHSCOPE_BASE_URL", DASHSCOPE_BASE_URL)
    demo1_Messages_Type()
    # demo2_Messages_Image_Url()


if __name__ == "__main__":
    main()
作者:海马  创建时间:2026-06-24 11:41
最后编辑:海马  更新时间:2026-07-01 20:05