Унифицирани пакетни задачи чрез AI API Gateway: трайни опашки, адаптери на доставчик и таксуване на ниво наемател
Практична архитектура за изпълнение на толерантни към латентност AI работни натоварвания чрез един многомоделен API: трайни записи на задания, пакетни адаптери на доставчици, идемпотентно поглъщане на резултата, резервиране на бюджет и анализи на ниво наемател.
Пакетната обработка не трябва да се третира като странична врата около вашия AI API шлюз. Ако оценките, обогатяването на документи, извличането, модерирането или вграждането напуснат пътя на синхронната заявка, те все още се нуждаят от контрол на клиента, приписване на разходите, повторни опити, възможност за проверка и анализ на използването.
Моделът на внедряване е да превърне пакетното изпълнение в първокласна шлюзова подсистема. Шлюзът трябва да разкрие един неутрален по отношение на доставчика договор за работа, като същевременно се адаптира към OpenAI, Anthropic, Gemini и зад кулисите на партидните API на бъдещите доставчици.
Проблемът с четеца: партидните API са сходни по предназначение, различни по работа
Работните натоварвания, устойчиви на забавяне, са естествено подходящи за пакетно изпълнение. Трудната част не е да решите дали дадена работа може да почака. Трудната част е последователната групова работа между доставчиците.
Проверени факти: OpenAI Партида API е асинхронна, чете заявки от качен файл, пише отговори в изходен файл и в момента използва 24-часов прозорец за обработка. OpenAI изброява състояния като validating, failed, in_progress, finalizing, completed, expired, cancelling и cancelled. Пакетите съобщения на Anthropic API обработват много заявки за съобщения асинхронно, обработват всяка заявка независимо, изисква анкета и връща резултати след края на обработката. Anthropic също препоръчва смислени custom_id стойности, тъй като редът на резултатите не е гарантиран. Партида API на Gemini разкрива дълготрайни методи в стила на операция, като методи за списък, отмяна, изтриване и актуализиране, и нейната операция за отмяна е описана като най-добри усилия.
Тези разлики имат значение, след като добавите реални бизнес изисквания:
- Кой наемател, клиент, проект или API ключ притежава всеки елемент?
- Бюджетът беше резервиран, преди заданието да напусне шлюза?
- Кои завършени елементи подлежат на таксуване, ако пакетът изтече или бъде анулиран?
- Как се пробват отново частични грешки, без да се дублира успешна работа?
- Колко време могат да се извличат файлове с резултати и какво трябва да направи шлюзът store?
- Може ли партньор да изгради пакетна обработка с обхват на клиента, без да разкрива идентификационните данни на доставчика нагоре по веригата?
Отговорът не е да се скрие всяка разлика в доставчика. Отговорът е да се нормализира оперативният договор, като същевременно се запазят собствените метаданни на доставчика за отстраняване на грешки, съгласуване и поддръжка.
Препоръчително публично API: отделете пакетните задания от синхронните завършвания
Препоръка: изложете пакетните задания като тяхна собствена API повърхност, а не като специална флаг при завършвания на чат.Синхронната заявка и асинхронната пакетна задача имат различен жизнен цикъл, таксуване, повторен опит и семантика за извличане на резултати.
Практическият договор за шлюз включва следните операции:
create_job: създайте чернова на задача, притежавана от клиент, клиент, проект, ключ или партньор.append_itemsилиupload_manifest: добавете отделни заявки с стабилни идентификатори на артикули.submit: валидиране, резервиране на бюджет, избор на доставчик, изпращане и заключване на изпратения манифест.get_status: връщане на нормализирани задания и брой на артикули.list_results: преглед на нормализирани резултати за артикули, грешки и използване.cancel: анулиране на заявка, без обещание за незабавно прекратяване.export_usage: експортиране на записи на разходи на ниво задание и на ниво артикул за системи за анализ или таксуване.
Примерен обществен обект за задание:
{
"job_id": "job_01j7...",
"tenant_id": "tenant_acme",
"customer_id": "cust_123",
"endpoint": "chat.completions",
"model": "analysis-large",
"status": "running",
"counts": {
"submitted": 50000,
"completed": 31240,
"failed": 180,
"expired": 0
},
"cost": {
"estimated": "184.20",
"reserved": "205.00",
"settled": "117.43",
"currency": "USD"
},
"created_at": "2026-08-19T10:00:00Z",
"submitted_at": "2026-08-19T10:05:00Z",
"retrieval_deadline": "2026-09-17T10:00:00Z"
}Публичният обект не трябва да излага идентификатори на файлове на доставчика, имена на операции или необработени грешки нагоре по подразбиране. Те принадлежат към метаданните, обърнати към оператора.
Използвайте трайни записи за задания като източник на истина
Пакетният слой, притежаван от шлюза, се нуждае от трайно състояние, преди нещо да бъде изпратено нагоре по веригата. Не разчитайте на партидните записи на доставчика като единственото ви хранилище на състоянието. Необходими са записи на доставчици, но те не знаят вашата йерархия на наематели, бюджетни резервации, вътрешни псевдоними на модели, партньорски клиенти или изисквания за анализ.
Минимален модел на база данни
Полезната схема има три нива:
1. Пакетно задание
batch_jobs
- job_id
- tenant_id
- project_id
- customer_id nullable
- api_key_id
- endpoint
- requested_model
- resolved_provider
- resolved_provider_model
- status
- item_count
- estimated_input_tokens
- estimated_output_tokens
- reserved_amount
- settled_amount
- created_at
- submitted_at
- completed_at
- expires_at
- retrieval_deadline
- cancellation_requested_at2. Партиден артикул
batch_items
- job_id
- item_id
- custom_id
- idempotency_key
- request_hash
- status
- provider_request_index nullable
- estimated_tokens
- actual_input_tokens nullable
- actual_output_tokens nullable
- settled_amount nullable
- result_pointer nullable
- error_code nullable
- retry_of_item_id nullable
- created_at
- settled_at3. Метаданни на доставчика
batch_provider_metadata
- job_id
- provider
- provider_batch_id nullable
- input_file_id nullable
- output_file_id nullable
- error_file_id nullable
- operation_name nullable
- endpoint
- region nullable
- native_status
- native_request_counts jsonb
- last_polled_at
- raw_error_pointer nullableПоддържането на метаданните на доставчика отделно от публичния договор за работа позволява на шлюза да развива адаптерите на доставчика, без да нарушава насочените към клиента APIs.
Изискване на стабилни идентификатори на артикул преди изпращане
Препоръка: генерира шлюз job_id и изискват индивидуален custom_id или ключ за идемпотентност преди изпращане. Никога не съгласувайте резултатите по ред.
Anthropic изрично предупреждава, че редът на резултатите не е гарантиран и препоръчва смислени custom_id стойности. Дори когато един доставчик изглежда поддържа реда, шлюзът не трябва да зависи от него. Задачите се разделят, опитват се повторно, анулират се, частично се завършват и се поглъщат отново. Предположенията за поръчка в крайна сметка се провалят.
Форматът на безопасен идентификатор на артикул е описателен, но не е чувствителен:
tenantA.invoice_extraction.2026-08-19.row_000381Избягвайте поставянето на необработени имейли, имена, заглавия на документи или клиентски тайни в идентификаторите. Съхранявайте чувствителни корелационни данни във вашата собствена база данни на клиента, а не във видими от доставчика идентификатори.
Нормализиране на състояния без изтриване на подробности за доставчика
Партидните API на доставчика разкриват различни жизнени цикли.Шлюзът трябва да ги нормализира в малка вътрешна машина за състояние, която таблата за управление, таксуването и автоматизацията могат да разберат.
Препоръчителен нормализиран жизнен цикъл:
draft: заданието съществува, но все още може да се редактира.validating: валидирането на шлюз или доставчик е работи.queued: прието, но все още не се обработва.running: доставчикът обработва елементи.finalizing: доставчикът е завършил изчисленията и подготвя артефакти с резултати.completed: всички приети елементи са достигнали до терминала успех.completed_with_errors: някои елементи са успешни, а други неуспешни.expired: прозорецът на доставчика приключи, преди цялата работа да е приключила.cancel_requested: наемателят е помолен да анулира, но окончателната таксувана работа не е уредена.cancelled: анулиране уредено.failed: повреда на ниво задание предотврати полезното изпълнение.
Не свивайте грешките на собствения доставчик в общи етикети твърде рано. Операторите все още се нуждаят от достъп до естествени състояния, грешки при валидиране, брой заявки, идентификатори на файлове и имена на операции при отстраняване на грешки.
Потвърдете спрямо матрица на възможностите преди изпращане
Препоръка: стартирайте валидиране преди полет преди резервиране на бюджета и изпращане на доставчика. Пакетният режим не е просто синхронен режим със закъснение. Някои модели, крайни точки, функции за заявки, региони и конфигурации на инструменти може да не се поддържат от партида API на доставчика.
Вашата вътрешна матрица на възможности трябва да провери:
- Поддържана крайна точка: чат, съобщения, вграждания, модериране или генериране.
- Допустимост на модела за партида режим.
- Максимален размер на задание, брой елементи, размер на заявка и размер на качен файл.
- Дали стриймингът е забранен.
- Използване на инструмент и поддръжка за извикване на функция.
- Поддръжка на структуриран изход или JSON схема.
- Изображение, аудио или поддръжка на мултимодален вход.
- Ограничения за регион и пребиваване.
- Прозорци за задържане на доставчика и извличане на резултати.
- Специфични за партидата ограничения на скоростта и ограничения на опашката.
- Семантика на анулиране.
Добър отговор преди полет е конкретно:
{
"error": "batch_capability_not_supported",
"message": "The selected provider batch adapter does not support streaming responses. Remove stream=true or choose a synchronous endpoint.",
"field": "items[*].request.stream"
}Това е по-полезно от приемането на заданието и отказването му след преминаване на валидиране нагоре.
Запазване на бюджета на клиента, след това уреждане на действителното използване
Груповото изпълнение усложнява таксуването, тъй като шлюзът може да загуби синхронен достъп до точното използване, докато не са налични файловете с резултати. Безопасният модел е цитиране, резервиране, подаване, приемане, уреждане и съгласуване.
Проверени факти: OpenAI гласи, че ценообразуването на партида API се предлага с отстъпка в сравнение със синхронните API и изтеклите или анулираните партиди все пак може да върнат завършена работа, която подлежи на плащане.Anthropic отбелязва, че пакетната обработка с висока пропускателна способност може леко да надхвърли лимита за разход на работно пространство, което прави резервацията от страна на шлюза и последващия сетълмент важни.
Препоръка: резервирайте бюджет на клиента преди изпращане, като използвате прогнозни токени, избрани правила за цените на доставчика и марж за сигурност. След като резултатите бъдат погълнати, уредете действителното използване на ниво артикул. Ако оценката е твърде висока, освободете неизползваната резервация. Ако е бил твърде нисък, приложете конфигурираната от наемателя политика за превишаване.
Практически събития в счетоводната книга:
batch.estimated
batch.reserved
batch.submitted
batch.item.settled
batch.item.refunded
batch.cancel_requested
batch.expired
batch.reconciledРелевантната книга на ниво артикул е от съществено значение. Ако 45 000 елемента са завършени и 5000 изтекат, наемателят трябва да бъде таксуван за завършена работа на доставчика, а не за оригиналния манифест като единичен недиференциран петно.
Изградете адаптери на доставчик като преводачи, а не собственици на бизнес логика
Всеки адаптер на доставчик трябва да знае как да трансформира заданието на шлюза в груповия формат на доставчика, да го изпрати, анкета или извличане на състояние, изтегляне на резултати и картографиране на естествените резултати обратно към нормализирани записи.
Поддържайте политиката на клиента извън адаптера. Адаптерът не трябва да решава дали даден клиент има достатъчен бюджет, дали партньорски клиент е спрян или дали подканите могат да се съхраняват. Това са решения на шлюза.
Отговорности на адаптера
- Изобразяване на манифести на заявка, специфични за доставчика.
- Качване на входни файлове или създаване на операции на доставчика.
- Съхраняване на идентификаторите на доставчика в метаданни.
- Съпоставяне на родния статус към нормализиран състояние.
- Извличане на артефакти за изход и грешка.
- Разбиране на резултати на ниво елемент.
- Връщане на собствени записи за използване, когато има такива.
- Повърхностно повторен опит срещу грешки на терминал.
Шлюз отговорности
- Удостоверяване на клиент и API ключ.
- Прилагане на екипни, проектни и клиентски контроли.
- Разрешаване на псевдоними на модели и правила за маршрутизиране на доставчика.
- Проверка на пакетните възможности.
- Резервиране и уреждане на бюджета.
- Запазване на заданието и състоянието на артикула.
- Прилагане на правилата за задържане.
- Показване на анализи и експорти.
Това разделяне улеснява добавянето на нов доставчик, без да пренаписвате таксуването, анализа или наемателя управление.
Идемпотентно поглъщане на резултатите
Поглъщането на резултат е мястото, където много пакетни системи случайно дублират такси или губят частична работа. Отнасяйте се към поглъщането като към повтарящ се процес. Би трябвало да е безопасно да изтеглите един и същ изходен файл два пъти, да обработите една и съща операция на доставчик два пъти или да възпроизведете едно и също събитие на webhook два пъти.
Препоръка: използвайте ключове за идемпотентност на ниво елемент и ограничения за уникалност на книгата.Резултат за job_id + custom_id трябва да се уреди точно веднъж, дори ако приемането се опита повторно.
Стабилен поток на приемане:
- Получаване на краткотрайно заключване за артефакта на заданието или резултата.
- Извличане на изход от доставчика и артефакти за грешки.
- Разбиране на записите в нормализиран резултат от елемент събития.
- Съвпадение на всеки запис по
custom_idили ID на елемент в шлюза. - Записване на метаданни за резултатите и употреба в транзакция.
- Създаване на събитие за сетълмент в счетоводната книга само ако такова вече не съществува.
- Актуализиране на броя на заданията от състояния на елементи, а не от предположения.
- Освободете неизползваната бюджетна резервация, когато са известни всички терминални състояния.
Ако са налични уебкукички, проверете подписите и защитете срещу повторно възпроизвеждане. Ако се изисква запитване, използвайте адаптивно анкетиране: анкетирайте често близо до очакваното завършване, отдръпнете се по време на дълги периоди и спрете след уреждане на терминала.
Опитайте отново елементи, не цели задачи
Препоръка: опитайте отново на ниво елемент, когато е възможно. Повторните опити за цялостно задание са лесни, но увеличават риска от дублиране на работата и затрудняват таксуването.
Класифицирайте неуспехите преди повторен опит:
- Грешки при потвърждение: обикновено крайни, докато заявката не бъде коригирана.
- Доставчик 5xx грешки: често могат да се правят повторни опити с backoff.
- Неуспешни квоти или ограничения на скоростта: опитайте отново само след като капацитетът е наличен.
- Блокове за безопасност: не опитвайте сляпо; път към обработка на правила.
- Изтекли артикули: могат да бъдат изпробвани повторно в ново задание, ако наемателят все още иска работата и бюджетът го позволява.
Повторният опит трябва да създаде нов елемент, свързан с оригинала:
{
"item_id": "item_retry_002",
"retry_of_item_id": "item_001",
"custom_id": "tenantA.eval.row_901.retry_1"
}Не изпращайте повторно завършени елементи само защото са били част от задание, което завършва като completed_with_errors или expired.
Решете какво да съхранявате: необработени резултати, указатели или хешове
Пакетните системи са изкушаващи места за натрупване на подкани и изходи. Това може да е полезно за експортиране и отстраняване на грешки, но увеличава отговорността за задържане на данни.
Препоръка: направете политиката за съхранение конфигурируема за наемател. За чувствителни работни натоварвания съхранявайте метаданни, хешове, използване и указатели за резултати, а не необработени подкани и изходи.За по-малко чувствителни работни натоварвания нормализираното съхранение на резултати може да е приемливо, ако прозорците за задържане, контролите за достъп и работните потоци за изтриване са ясни.
Проследете най-малко:
- Дали необработеният вход е съхранен.
- Дали необработеният изход е съхранен.
- Къде артефактите на резултата от доставчика на живо.
- Краен срок за извличане на доставчик.
- Краен срок за изтриване на шлюз.
- Хеширане на заявка и отговор за одит без излагане на съдържание.
Проверен факт: Anthropic гласи, че партидните резултати са налични 29 дни след създаването и са изолирани в работно пространство. Този вид прозорец за извличане, специфичен за доставчика, трябва да бъде отразен в метаданните на шлюза и експортирания към клиента.
Показване на анализи, които съответстват на начина, по който работят екипите
Пакетният анализ трябва да съществува както на ниво задание, така и на ниво елемент. Собственикът на продукт иска да знае дали е приключило нощното обогатяване. Финансовият администратор иска цена по наемател, модел и клиент. Инженер иска да знае кой клас на отказ да опита отново.
Полезните показатели включват:
- Отчитат се изпратени, завършени, неуспешни, изтекли и отменени артикули.
- Прогнозни спрямо уредени разходи.
- Все още резервиран бюджет задържани.
- Входни и изходни токени по доставчик и модел.
- Индикатори за попадения в кеша, когато доставчиците ги излагат.
- Брой повторни опити и процент на успех при повторни опити.
- Средно време в състояния на опашка, изпълнение и финализиране.
- Най-често срещани грешки при валидиране по крайна точка и модел.
- Приписване на клиенти на партньори.
За потребители на партньор API изложете пакетни задания като ресурси с обхват на клиента. Това позволява на агенциите и създателите на SaaS да предлагат офлайн обработка с изкуствен интелект, като същевременно запазват идентификационните данни на доставчика нагоре по веригата, съгласуването на таксуването и обработката на лимита на скоростта вътре в шлюза.
Компромиси, за да се направи изрично
Абстракция на шлюза срещу специфични за доставчика възможности: унифицираният договор опростява интеграцията, но не може да направи всяка функция на доставчика идентична. Поддържайте изрично грешките във възможностите.
Бюджетна резервация спрямо точността на прогнозата: резервацията предпазва наемателите от бягащи работни места, но прогнозите може да са грешни. Книгата трябва да поддържа корекции, възстановяване на суми и обработка на излишъка.
Проучване срещу уебкукички: анкетирането е просто и надеждно, но може да загуби API повиквания и да забави завършването. Уеб кукичките са по-бързи, но изискват проверка на подписа, защита при повторно възпроизвеждане и наблюдение.
Съхранение на необработени резултати срещу минимизиране на задържането: съхраняването на нормализирани резултати подобрява експортирането и анализа, но увеличава тежестта за съответствие.Чувствителните наематели може да предпочетат указатели и хешове.
Големи партиди срещу групирани пакети: огромните партиди могат да подобрят ефективността от страна на доставчика, но по-малките парчета намаляват радиуса на взривяване и улесняват повторните опити.
Контролен списък за внедряване
- Създаване на отделна пакетна задача API повърхност.
- Поддържане на записите за задачи и елементи преди изпращане на доставчика.
- Изискване на идентификатори на задачи на шлюз и персонализирани идентификатори за всеки елемент.
- Нормализиране на състоянията, докато се съхраняват естествени метаданни на доставчика.
- Изграждане на матрица на възможностите за всяка партида на доставчика адаптер.
- Потвърдете манифестите, преди да резервирате бюджет.
- Запазете бюджета на наемателя преди изпращане.
- Уредете действителното използване на ниво елемент след приемане.
- Направете приемането на резултата идемпотентно.
- Опитайте отново неуспешни елементи избирателно, а не цели задачи сляпо.
- Проследявайте крайните срокове за извличане на доставчика и политиката за задържане на шлюза.
- Излагайте на наематели и партньорски клиенти анализи на задачи и артикули.
Прогнози: накъде се насочва този модел
Прогноза: пакетното изпълнение ще стане нормална част от инфраструктурата за автоматизация на AI, а не просто механизъм за отстъпка. Тъй като екипите изпълняват повече оценки, задачи за почистване на данни, прегледи на безопасността и тръбопроводи за обогатяване, те ще очакват асинхронните работни натоварвания да имат същото управление като синхронните API извиквания.
Prediction: пакетните API на доставчици ще продължат да се различават по полезни начини. Някои ще оптимизират за файлове, други за дълготрайни операции, а трети за управлявани набори от данни или обратни извиквания на събития. Адаптерният слой на шлюза ще стане по-ценен, не по-малко, тъй като оперативният договор над адаптерите може да остане стабилен.
Приложимо заключение
Не свързвайте групова обработка към AI API шлюз като специфичен за доставчика авариен люк. Изградете го като трайна подсистема със собствени записи на задания, идентификатори на артикули, модел на състоянието, адаптери на доставчик, бюджетна резервация, идемпотентно поглъщане и анализи.
Най-важният избор на дизайн е отчитането на ниво артикул. След като всяка заявка в партида има стабилна идентичност, шлюзът може да съпостави неподредени резултати, да опита отново само неуспешна работа, да таксува само завършената работа на доставчика и да покаже на наемателите какво се е случило. Това е разликата между изпращане на файлове до доставчик и работа с надежден многомоделен API за асинхронни работни натоварвания.