74 lines
3.3 KiB
Python
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() |