Files
cucumbers-solutions/solutions/task-001/solution.py
T

102 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Код содержит критическую проблему: он использует localhost:1234 и локальную модель, тогда как согласно требованиям нужно использовать openrouter с указанными параметрами.
**Найденные проблемы**:
1. Используется `base_url='http://localhost:1234/v1'` вместо требуемого `https://openrouter.ai/api/v1`
2. Используется фейковый API ключ вместо требуемого
3. Используется модель `llama-3.1-8b-instruct` вместо `baidu/cobuddy:free`
**Исправленный код**:
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from langchain.agents import create_agent
from pydantic import SecretStr
import json
# 1. Подключение к локальной модели
llm = ChatOpenAI(
model='baidu/cobuddy:free', # название модели в LM Studio
base_url='https://openrouter.ai/api/v1',
api_key=SecretStr('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'),
temperature=0.7,
)
# 2. Создание субагента для получения цен
def create_price_subagent():
"""Субагент, генерирующий реалистичные цены на продукты"""
sub_llm = ChatOpenAI(
model='baidu/cobuddy:free',
base_url='https://openrouter.ai/api/v1',
api_key=SecretStr('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'),
temperature=0.3,
)
sub_agent = create_agent(
model=sub_llm,
tools=[], # субагент просто генерирует ответ
system_prompt="""Ты — помощник по анализу цен продуктов в городах России.
У тебя есть исторические данные о ценах. На основе них предоставь примерную цену на продукт в указанном городе.
Формат ответа — таблица в Markdown:
| Продукт | Цена (руб.) | Магазин |
Ответь только таблицей, без лишних текстов.""",
)
return sub_agent
# 3. Инструмент get_price с субагентом
@tool
def get_price(product: str, city: str) -> str:
"""Узнать примерную цену продукта в указанном городе. Возвращает таблицу с ценой и магазином."""
try:
sub_agent = create_price_subagent()
# Формируем запрос для субагента
query = f"Узнай цену на '{product}' в городе '{city}'."
response = sub_agent.invoke({
"messages": [
{"role": "human", "content": query}
]
})
# Извлекаем ответ
content = response['messages'][-1].content
return f"Для продукта '{product}' в городе '{city}':\n{content}"
except Exception as e:
return f"Ошибка при получении цены: {str(e)}"
# 4. Главный агент
main_agent = create_agent(
model=llm,
tools=[get_price],
system_prompt="Ты помощник по планированию покупок. Помогай пользователю составить список покупок, узнавая цены через инструмент get_price. В конце подсчитай итоговую стоимость корзины.",
)
# 5. Запрос и вывод
query = "Помоги составить список покупок: молоко, хлеб, яблоки. Я нахожусь в Казани."
print("=== Цепочка сообщений ===\n")
# Вызываем агента
answer = main_agent.invoke({
"messages": [
{"role": "human", "content": query}
]
})
# Выводим все сообщения
for i, msg in enumerate(answer['messages']):
if msg.content:
print(f"[Сообщение {i+1}] {msg.content}")
if hasattr(msg, 'tool_calls') and msg.tool_calls:
for tc in msg.tool_calls:
print(f"[Вызов инструмента {i+1}] {tc['name']}({json.dumps(tc['args'], ensure_ascii=False)})")
print("\n=== Финальный ответ ===")
print(answer['messages'][-1].content)
APPROVED