创建简单的 消息类型
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
最后编辑:海马 更新时间:2026-07-01 20:05