102 lines
4.5 KiB
Python
102 lines
4.5 KiB
Python
Код содержит критическую проблему: он использует 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 |