from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage

from init_llm import deepseek_llm


# 定义股票查询工具
@tool
def get_stock_price(company: str, timeframe: str = "today") -> str:
    """获取指定公司的股票价格信息

    Args:
        company: 公司名称(如:苹果公司, 微软公司, 谷歌公司)
        timeframe: 时间范围(today-今日, week-本周, month-本月)
    """
    # 模拟股票数据
    mock_data = {
        "苹果公司": {"today": 185.20, "week": 183.50, "month": 180.75},
        "微软公司": {"today": 415.86, "week": 412.30, "month": 405.42},
        "谷歌公司": {"today": 15.42, "week": 15.20, "month": 14.85}
    }

    if company in mock_data:
        price = mock_data[company].get(timeframe, "未知时间范围")
        return f"{company} {timeframe}价格: {price}美元"
    else:
        return f"未找到股票代码 {company} 的数据"


# 定义新闻搜索工具
@tool
def search_news(company: str) -> str:
    """搜索指定公司的财经新闻

    Args:
        company: 公司名称
    Return:
        公司的财经新闻,每个新闻占一行
    """
    # 模拟新闻数据
    mock_news = {
        "苹果公司": [
            "苹果发布新款iPhone,股价上涨3%",
            "苹果与欧盟达成反垄断和解协议",
            "苹果将在印度扩大生产规模"
        ],
        "微软公司": [
            "微软Azure云业务季度增长超预期",
            "微软完成对Nuance的收购",
            "微软推出新一代AI助手Copilot"
        ],
        "谷歌公司": [
            "谷歌发布新AI模型,性能提升20%",
            "谷歌与OpenAI合作,开发新的AI助手",
            "谷歌在欧洲展开AI研究项目"
        ]
    }

    news_list = mock_news.get(company, [f"未找到{company}的相关新闻"])
    return "\n".join(news_list)


# 1. 初始化模型并绑定工具
tools = [get_stock_price, search_news]
model_with_tools = deepseek_llm.bind_tools(tools)

message = []
#human_message = HumanMessage(content="苹果公司今天的股价是多少?最近有什么新闻?")
human_message = HumanMessage(content="比较一下微软和苹果的股价")
#human_message = HumanMessage(content="腾讯最近有什么重大新闻?")
# human_message = HumanMessage(content="海水为什么是咸的?")
message.append(human_message)

# 2. 工具调用
while True:
    response = model_with_tools.invoke(message)

    message.append(response)

    # 如果有调用工具,处理工具调用响应
    # 3.开发者根据模型的响应,调用工具并获取结果
    if response.tool_calls:
        for tool_call in response.tool_calls:
            if tool_call["name"] == "get_stock_price":
                stock_result = get_stock_price.invoke(tool_call)
                print("stock_result", stock_result)
                message.append(stock_result)
            if tool_call["name"] == "search_financial_news":
                news_result = search_news.invoke(tool_call)
                print("news_result", news_result)
                message.append(news_result)
    else:
        print("没有工具调用,直接返回答案")
        break


print(message)

[HumanMessage(content='比较一下微软和苹果的股价', additional_kwargs={}, response_metadata={}), 


AIMessage(content='我来帮你查询微软和苹果的股票价格信息。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 124, 'prompt_tokens': 410, 'total_tokens': 534, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 384}, 'prompt_cache_hit_tokens': 384, 'prompt_cache_miss_tokens': 26}, 'model_provider': 'deepseek', 'model_name': 'deepseek-v4-flash', 'system_fingerprint': 'fp_8b330d02d0_prod0820_fp8_kvcache_20260402', 'id': 'eb47ca2a-3af3-43b7-91fa-0a2f7ca05a7e', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--019e6979-41a4-7403-b875-88285ac2f716-0', 

tool_calls=[

{'name': 'get_stock_price', 'args': {'company': '微软公司', 'timeframe': 'today'}, 'id': 'call_00_GLN3fxNaweLSYa6EBQc57191', 'type': 'tool_call'},

{'name': 'get_stock_price', 'args': {'company': '苹果公司', 'timeframe': 'today'}, 'id': 'call_01_idWsFLNdofWtrHquw6gh3359', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 410, 'output_tokens': 124, 'total_tokens': 534, 'input_token_details': {'cache_read': 384}, 'output_token_details': {}}), 


ToolMessage(content='微软公司 today价格: 415.86美元', name='get_stock_price', tool_call_id='call_00_GLN3fxNaweLSYa6EBQc57191'),

 ToolMessage(content='苹果公司 today价格: 185.2美元', name='get_stock_price', tool_call_id='call_01_idWsFLNdofWtrHquw6gh3359'), 
 
 AIMessage(content='好的,以下是微软和苹果今日股价的对比:\n\n---\n\n## 📊 微软 vs 苹果 股价对比\n\n| 公司 | 今日股价(美元) |\n|------|:--------------:|\n| **🟢 微软(Microsoft)** | **$415.86** |\n| **🍎 苹果(Apple)** | **$185.20** |\n\n### 对比分析:\n- **微软** 当前股价为 **$415.86**,远高于苹果的 **$185.20**,单价差距约为 **$230.66**。\n- 不过需要注意的是,股价高低并不直接代表公司价值大小,因为还要考虑总股本数量(市值 = 股价 × 总股本)。\n\n如果你想进一步了解它们的市值或近期新闻动态,也可以告诉我!😊', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 165, 'prompt_tokens': 573, 'total_tokens': 738, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 384}, 'prompt_cache_hit_tokens': 384, 'prompt_cache_miss_tokens': 189}, 'model_provider': 'deepseek', 'model_name': 'deepseek-v4-flash', 'system_fingerprint': 'fp_8b330d02d0_prod0820_fp8_kvcache_20260402', 'id': '86849b24-5baa-4603-a837-5f2b2af92b32', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019e6979-4932-7b00-9f9a-084788de16f1-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 573, 'output_tokens': 165, 'total_tokens': 738, 'input_token_details': {'cache_read': 384}, 'output_token_details': {}})]
 

更多推荐