Чат-ассистент с инструментами через OpenRouter free-tier. Когда модель решает позвать функцию (поиск по базе знаний, метрики VPS, время, конвертация валют, чтение страницы) — её вызов виден прямо в диалоге, вместе с аргументами и результатом.
Как это работает
Простая идея. Обычная нейросеть умеет только разговаривать. Этот ассистент умеет ещё «нажимать кнопки»: сходить в базу знаний, посмотреть нагрузку на сервер, узнать курс валют. Он сам решает, какую кнопку нажать в ответ на ваш вопрос — и вы видите этот выбор прямо в чате.
- Вы пишете вопрос. Сервер создаёт серверную сессию (живёт 24 часа) и складывает туда ваше сообщение.
- Сообщение и описание 5 инструментов уходят в модель OpenRouter. Модель возвращает либо обычный ответ, либо список «вызовов инструментов» — какую функцию запустить и с какими аргументами.
- Если есть вызовы — сервер выполняет каждый локально (поиск по pgvector / чтение CPU / fetch ЦБ / fetch страницы) и отдаёт результаты обратно модели. Этот цикл повторяется до 4 раз — на практике хватает 1–2.
- Финальный ответ модели стримится вам по символам. История диалога сохраняется в серверной сессии — следующая ваша реплика учитывает все предыдущие, без перезагрузки контекста через клиент.
Стек и ограничения
- Модели: free-tier OpenRouter из живого ранкинга. Селектор сверху позволяет выбрать любую модель из топа; те, что не поддерживают tool calling, помечены отдельно.
- Сессия: Postgres (та же БД, что и у RAG), таблица
assistant_sessions, TTL 24 часа, без PII. - Tool-loop: до 4 итераций
модель → tool → результат → модель. Превышение — фиксируется флагомwarning: max_iterations_reached. - Лимит входа: 4000 символов на сообщение, 20 запросов / 5 минут на IP.
- summarizeUrl ходит только по allow-list (anthropic, openai, langchain, pydantic, github, mdn, wikipedia и т.п.) — никаких произвольных URL.
- Не все free-модели стабильно отдают tool_calls — при ошибке сервер делает один retry на fallback-модель.