perf(LLM 併發): 角色分析與誤報/補行號裁決改為並行 sub-agent(預設不限併發)
This commit is contained in:
+33
@@ -6,6 +6,39 @@ import { getLLMConfig } from './config.js';
|
||||
import { recordUsage } from './usage.js';
|
||||
import { line } from './log.js';
|
||||
|
||||
// 每個 LLM CLI 呼叫(角色分析、補行號等)都是一個獨立子行程。預設「不限制」併發(全部同時跑);
|
||||
// 若機器資源不足或撞到提供者限流,可用 AI_ASSISTANT_CONCURRENCY 設一個正整數當上限。
|
||||
// 0 / 未設定 / 非正整數 → 不限制。
|
||||
export const LLM_CONCURRENCY = Number(process.env.AI_ASSISTANT_CONCURRENCY) || 0;
|
||||
|
||||
/**
|
||||
* 對 items 並行執行 async fn(保序回傳),加速多個獨立的 LLM 子行程呼叫。
|
||||
*
|
||||
* limit 為同時執行上限;`limit <= 0`、非數字或大於項目數時「不限制」(全部並行)。
|
||||
* fn 需自行處理例外(內部 try/catch);本函式不會因單一項目 reject 而中斷其餘工作。
|
||||
* @template T, R
|
||||
* @param {T[]} items - 要處理的項目。
|
||||
* @param {number} limit - 同時執行的上限;<=0/非數字表示不限制。
|
||||
* @param {(item: T, index: number) => Promise<R>} fn - 對每個項目執行的 async 函式。
|
||||
* @returns {Promise<R[]>} 與 items 對應(同索引)的結果陣列。
|
||||
*/
|
||||
export async function mapWithConcurrency(items, limit, fn) {
|
||||
const list = Array.isArray(items) ? items : [];
|
||||
const results = new Array(list.length);
|
||||
if (list.length === 0) return results;
|
||||
const n = Number(limit);
|
||||
const workers = (!Number.isFinite(n) || n <= 0) ? list.length : Math.min(n, list.length);
|
||||
let cursor = 0;
|
||||
async function run() {
|
||||
while (cursor < list.length) {
|
||||
const i = cursor++;
|
||||
results[i] = await fn(list[i], i);
|
||||
}
|
||||
}
|
||||
await Promise.all(Array.from({ length: workers }, run));
|
||||
return results;
|
||||
}
|
||||
|
||||
/**
|
||||
* 將既有 system/user prompt 合併成一次 CLI 呼叫用的輸入。
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user