import { splitBatchRequests } from "./batch-utils.js"; import { runWithConcurrency } from "./internal.js"; export type EmbeddingBatchExecutionParams = { wait: boolean; pollIntervalMs: number; timeoutMs: number; concurrency: number; debug?: (message: string, data?: Record) => void; }; export async function runEmbeddingBatchGroups(params: { requests: TRequest[]; maxRequests: number; wait: EmbeddingBatchExecutionParams["wait"]; pollIntervalMs: EmbeddingBatchExecutionParams["pollIntervalMs"]; timeoutMs: EmbeddingBatchExecutionParams["timeoutMs"]; concurrency: EmbeddingBatchExecutionParams["concurrency"]; debugLabel: string; debug?: EmbeddingBatchExecutionParams["debug"]; runGroup: (args: { group: TRequest[]; groupIndex: number; groups: number; byCustomId: Map; }) => Promise; }): Promise> { if (params.requests.length === 0) { return new Map(); } const groups = splitBatchRequests(params.requests, params.maxRequests); const byCustomId = new Map(); const tasks = groups.map((group, groupIndex) => async () => { await params.runGroup({ group, groupIndex, groups: groups.length, byCustomId }); }); params.debug?.(params.debugLabel, { requests: params.requests.length, groups: groups.length, wait: params.wait, concurrency: params.concurrency, pollIntervalMs: params.pollIntervalMs, timeoutMs: params.timeoutMs, }); await runWithConcurrency(tasks, params.concurrency); return byCustomId; } export function buildEmbeddingBatchGroupOptions( params: { requests: TRequest[] } & EmbeddingBatchExecutionParams, options: { maxRequests: number; debugLabel: string }, ) { return { requests: params.requests, maxRequests: options.maxRequests, wait: params.wait, pollIntervalMs: params.pollIntervalMs, timeoutMs: params.timeoutMs, concurrency: params.concurrency, debug: params.debug, debugLabel: options.debugLabel, }; }