Перейти к основному содержанию
Langflow — open-source конструктор LLM-flow: вы собираете граф из компонентов (модель, промпт, retriever, инструменты, вывод) на холсте, тестируете его в браузере и публикуете как эндпоинт. Он полезен там, где нужен быстрый прототип RAG-чата или агента: схема видна целиком на одном экране, а каждый блок настраивается полями формы, а не кодом. Смысл подключения к SpeShu.AI в том, что API текстовых моделей совместим с форматом OpenAI. Langflow умеет работать с любым OpenAI-совместимым провайдером, поэтому отдельный адаптер не нужен — достаточно указать адрес и ключ.
Два значения решают всё остальное: base_url = "https://speshu.ai/api/v1" и API-ключ. Больше ничего прописывать не нужно.

Установка

Langflow ставится как обычный Python-пакет и запускается локальным веб-сервером на порту 7860 по умолчанию.
Откройте http://127.0.0.1:7860. Адрес и порт переопределяются переменными LANGFLOW_HOST и LANGFLOW_PORT; полный список — в langflow run --help. Узнать установленную версию:
Поля компонентов меняются между мажорными версиями Langflow. Названия ниже относятся к ветке 1.x; в 0.x блок OpenAI называется ChatOpenAI и имеет те же по смыслу поля. Сверяйтесь с фактической версией из команды выше.

Возьмите идентификатор модели из каталога

Идентификаторы текстовых моделей зашивать в код нельзя: состав каталога меняется, и зашитый в конфиг id начинает падать с 404 model_not_found. Возьмите его из GET /api/v1/models и положите в переменную окружения.
cURL
.data[0] — первый элемент, чтобы пример был запускаемым. В своём flow выбирайте модель по context_length, cost_completion и наличию зрения; провайдер модели виден в поле owned_by. Формат ответа — в разделе Каталог моделей, выбор — в Модели и цены.

Настройка компонента модели

Соберите минимальный flow: Chat Input → OpenAI → Chat Output. В компоненте OpenAI заполните три поля: Поле OpenAI API Base — это и есть тот самый переключатель на OpenAI-совместимого провайдера. Без него компонент пойдёт на официальный эндпоинт провайдера по умолчанию и вернёт 401 или ошибку маршрутизации.
В base URL не должно быть завершающего слэша и не должно быть префикса /v1 поверх уже имеющегося: https://speshu.ai/api/v1 — целиком. Langflow склеивает адрес со своим путём (/chat/completions), поэтому лишний / даст запрос не по тому адресу.

Параметризованный вариант: компонент Code

Если значения должны приходить из окружения, а не из формы, замените компонент OpenAI на компонент Code. Этот путь работает одинаково во всех версиях Langflow, потому что использует публичный класс ChatOpenAI из пакета langchain-openai:
Python
Перед запуском Langflow положите .env в его рабочий каталог — процесс подхватит переменные при старте:

Первый работающий пример

Тот же flow можно вызвать по HTTP, не открывая интерфейс. Эндпоинт POST /api/v1/run/{flow_id} принадлежит самому Langflow, а не SpeShu.AI: flow_id — идентификатор сохранённого flow из его URL. Запрос авторизуется секретом самого Langflow в заголовке x-api-key.
cURL
Секрет Langflow задаётся переменной LANGFLOW_SECRET_KEY при первом запуске и печатается в лог сервера. Без него интерфейс пускает вас через автоматический вход суперпользователя, а API-запросы отклоняются с 401.
Внутри flow итоговая стоимость генерации в рублях недоступна: Langflow отдаёт только текст ответа. Списание при этом происходит — по каждому запросу к SpeShu.AI. Сверяйте расход по эндпоинту баланса либо логируйте usage.cost.total_cost на стороне прокси, если вам нужен учёт по каждому запуску flow.

Потоковая передача

Поле Streaming в компоненте OpenAI включает поточный режим: вместо целого ответа Chat Output получает текст по мере генерации. Транспорт при этом тот же — блок OpenAI уходит в POST /api/v1/chat/completions с stream: true. На стороне Langflow тот же поток включается параметром stream_mode в теле запроса к /api/v1/run/{flow_id} — тогда ответ приходит как Server-Sent Events:
cURL
Поток SpeShu.AI идёт на контексте, отвязанном от соединения. Если вы закрыли вкладку Langflow, генерация всё равно дойдёт до конца, и деньги спишутся за произведённые токены — отмена на стороне клиента останавливает только чтение.
Формат кадров, маркер [DONE] и поведение при обрыве — на странице Потоковая передача.

Инструменты и структурированный вывод

Оба механизма приходят в SpeShu.AI через OpenAI-совместимый эндпоинт, поэтому в Langflow они включаются штатно: подключите к модели блок Tools, а в промпте опишите функции в формате JSON Schema. Отдельной настройки на стороне API не требуется.

Изображения во входе

Визуальные модели из GET /api/v1/models принимают вход как блок контента image_url. В Langflow это работает, когда в сообщении лежит URL: загрузите файл в хранилище SpeShu.AI через POST /api/v1/storage/upload и передайте полученную ссылку в компонент Chat Input как изображение.
cURL
Модель без зрения отвергнет такой запрос целиком с 400 invalid_request — картинка не игнорируется молча. Форматы блоков контента разобраны в гайде Медиаввод.

Генерация медиа

Langflow не имеет готового компонента под асинхронный медиа-API: задача создаётся, оплачивается сразу и доводится до результата опросом статуса. Встраивается это компонентом Custom Tool или компонентом Code, которые делают два запроса к SpeShu.AI и возвращают ссылку на результат.
Python
Полный список медиа-моделей — в Каталоге медиа-моделей, жизненный цикл задачи — в Создании задачи и Статусе задачи.
Деньги списываются при создании задачи, а не при успешном результате. Повтор с тем же Idempotency-Key вернёт исходную задачу, повтор с новым — создаст новую и спишет снова.

Про эмбеддинги

SpeShu.AI не отдаёт эмбеддингов: эндпоинта /api/v1/embeddings в API нет. Стандартный RAG-flow Langflow требует эмбеддингов, поэтому блок OpenAI Embeddings с base URL SpeShu.AI работать не будет — он получит 404 на несуществующем маршруте. Подменять это чем-либо не нужно: выберите один из двух честных вариантов.
Вариант A — эмбеддинги у другого провайдера, генерация у SpeShu.AI. Оставьте блок OpenAI Embeddings на адресе и ключе стороннего сервиса, а компонент модели направьте на SpeShu.AI. Это две независимые настройки, и в спецификации vector store хранится embedding_provider отдельной конфигурацией — вектор из чужого провайдера туда попадает, а не подменяется на лету.
Python
Документы уходят в vector store через блок Embeddings, найденный текст — в Chat Input блоком Retriever, генерация ответа — компонентом модели. Расход считается только по генерации. Вариант B — flow без эмбеддингов. Уберите блоки Embeddings, Vector Store и Retriever и подавайте в промпт документы напрямую через Chat Input или компонент File с извлечением текста. Такой flow работает на небольшом корпусе (до десятков страниц), не требует сторонних сервисов и остаётся целиком на SpeShu.AI. Схема и параметры загрузки файлов — в Загрузке файла.

Возможные проблемы

Проверьте base URL. Нужно https://speshu.ai/api/v1 — с /v1 и без завершающего слэша. Если сработала попытка вызвать эмбеддинги, дело в этом же: такого маршрута в API не существует.
Ключ не попал в компонент модели: поле OpenAI API Key пустое, в нём кавычки или обрезанное значение. Проверьте переменную командой echo "$SPESHU_API_KEY" | wc -c. Формат ключа — на странице Аутентификация.
Идентификатор в поле Model Name устарел или скопирован с ошибкой. Возьмите id заново из GET /api/v1/models и подставьте как есть — без префикса провайдера и без обрезки.
Не включён Streaming в компоненте модели либо не задан stream_mode в теле запроса к /api/v1/run/{flow_id}. Формат кадров — в гайде Потоковая передача.
Первое — на балансе нет положительной суммы; пополнение — в профиле. Второе — входные токены плюс зарезервированный выход не влезают в context_length модели: сократите переданный контекст или возьмите модель с окном побольше.
Полная таблица кодов и цикл повторов — на странице Ошибки, таймауты и квоты — в разделе Лимиты.

Что дальше

Каталог моделей

Формат GET /api/v1/models и выбор идентификатора

Потоковая передача

SSE, [DONE] и кадр со списанием

Вызов функций

Полный цикл вызова инструмента

Медиаввод

Ссылки, base64 и хранилище

Тарификация и оплата

Как считается расход и списываются деньги

Создание медиа-задачи

Асинхронная генерация изображений, видео и аудио