Обратное давление очереди промптов
Обзор
qwen serve теперь применяет обратное давление при приеме промптов для каждой сессии. Лимит по умолчанию составляет 5 ожидающих промптов на сессию. Ожидающий промпт — это промпт, который демон принял через sendPrompt и который еще не завершился, включая промпты, ожидающие в FIFO-очереди сессии, и промпт, выполняющийся в данный момент.
branchSession по-прежнему сериализуется в той же FIFO-очереди для каждой сессии, но это не промпт, и он не потребляет этот лимит промптов.
Семантика
- По умолчанию:
maxPendingPromptsPerSession = 5. - Отключено:
0илиInfinityозначает без ограничений. - Недопустимые значения: отрицательные числа, дроби и
NaNотклоняются при создании bridge и вrunQwenServe. CLI-флаг принимает неотрицательные целые числа;0отключает ограничение. - Авторитетность: bridge является шлюзом для приема запросов. Учет на стороне SDK — это механизм раннего отказа, а не замена серверному контролю.
- Дедлайн промпта:
--prompt-deadline-msпо-прежнему применяется только к уже принятым промптам. Это не ограничение на прием в очередь.
Поведение bridge
SessionEntry отслеживает pendingPromptCount. sendPrompt намеренно не является async, поэтому проверка приема может синхронно выбросить исключение до того, как HTTP-маршруты вернут 202 Accepted.
Процесс приема:
- Поиск сессии.
- Отклонение предварительно прерванных сигналов до увеличения счетчика.
- Если
pendingPromptCount >= maxPendingPromptsPerSession, выбрасываетсяPromptQueueFullError. - Увеличение счетчика и постановка промпта в FIFO-очередь.
- Освобождение слота ровно один раз, когда промис промпта, возвращаемый вызывающему коду, завершается.
Сбои не нарушают работу FIFO, так как конец очереди по-прежнему обрабатывает каждый результат промпта. Исходный вызывающий код всё равно получает ошибку отклонения промпта.
Поведение HTTP
POST /session/:id/prompt перехватывает синхронный PromptQueueFullError до отправки ответа о принятии. Маршрут возвращает:
- Статус:
503 - Заголовок:
Retry-After: 5 - Тело:
{ code: 'prompt_queue_full', error, sessionId, limit, pendingCount }
При сбое приема promptId не возвращается.
/capabilities предоставляет:
{
"limits": {
"maxPendingPromptsPerSession": 5
}
}Когда ограничение отключено, предоставляемое значение равно null.
Поведение ACP HTTP
Транспорт ACP JSON-RPC преобразует PromptQueueFullError в стабильную структуру ошибки вместо проброса неструктурированной внутренней ошибки:
{
"data": {
"errorKind": "prompt_queue_full",
"sessionId": "...",
"limit": 5,
"pendingCount": 5
}
}Поведение SDK
DaemonClient имеет локальное резервирование для каждой сессии при вызовах prompt(). Оно резервируется перед отправкой HTTP-запроса и освобождается при:
- устаревшем блокирующем завершении с кодом
200, - неблокирующем завершении хода с кодом
202, turn_error,- отмене вызывающим кодом,
- завершении SSE,
- сбое fetch или парсинга ответа.
DaemonPendingPromptLimitError означает, что SDK отклонил запрос локально и не отправил запрос промпта.
Опция SDK принимает числовое значение capability напрямую; null отключает локальное ограничение, соответствуя /capabilities.limits.maxPendingPromptsPerSession.
DaemonSessionClient применяет тот же локальный лимит для пути с долгоживущей подпиской. Статические методы createOrAttach, load и resume сохраняют свои существующие позиции параметров; прямое создание может переопределить локальное ограничение.