Files

74 lines
3.3 KiB
Python

from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain.agents import create_agent
from langchain.tools import tool
# 1. Подключение к модели (используем плейсхолдеры согласно инструкции)
llm = ChatOpenAI(
model="google/gemma-4-26b-a4b",
base_url="http://192.168.0.120:1234/v1",
api_key=SecretStr("lm-studio"),
temperature=0.7,
)
# 2. Инструмент с субагентом
@tool
def get_price(product: str, city: str) -> str:
"""Узнает примерную цену на продукт в указанном городе, используя исторические данные."""
# Создаем субагента для генерации цен
sub_agent = create_agent(
model=llm,
tools=[], # У субагента нет внешних инструментов, он использует свои знания
system_prompt=(
f"Ты — эксперт по ценам в городе {city}. "
"Твоя задача: придумать реалистичную цену для продукта. "
"Верни ответ строго в формате Markdown таблицы: | Продукты | Цена (руб.) | Магазин |"
)
)
# Вызываем субагента
response = sub_agent.invoke({
"messages": [{"role": "human", "content": f"Придумай цену для продукта: {product}"}]
})
# Возвращаем контент последнего сообщения субагента
return response["messages"][-1].content
# 3. Главный агент
main_agent = create_agent(
model=llm,
tools=[get_price],
system_prompt="Ты помощник по планированию покупок. Твоя задача — составить список покупок, "
"используя инструмент get_price для каждого продукта. В конце выведи итоговую стоимость."
)
# 4. Запрос и вывод
def format_message(message) -> str:
"""Форматирует сообщения агента (текст или вызов инструмента)."""
if hasattr(message, 'tool_calls') and message.tool_calls:
call = message.tool_calls[0]
args_str = ", ".join([f"{k}={v!r}" for k, v in call['args'].items()])
return f"{call['name']}({args_str})"
if hasattr(message, 'content') and message.content:
return message.content
return ""
def run_shopping_planner():
user_query = "Помоги составить список покупок: молоко, хлеб, яблоки. Я нахожусь в Казани."
print(f"User Query: {user_query}\n")
print("--- Agent Trace ---")
# Запуск агента
result = main_agent.invoke({
"messages": [{"role": "human", "content": user_query}]
})
# Вывод всех сообщений из истории (промежуточные шаги + финал)
for msg in result["messages"]:
formatted = format_message(msg)
if formatted:
print(formatted)
if __name__ == "__main__":
run_shopping_planner()