Compare commits
3 Commits
fix/sse-gz
...
ea234ea007
| Author | SHA1 | Date | |
|---|---|---|---|
| ea234ea007 | |||
|
|
db4d5e4d00 | ||
| 358fcaeff5 |
@@ -28,14 +28,8 @@ function isJsonFile(file: { mimetype: string; originalname: string }): boolean {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SSE_PAD_TARGET = 4096;
|
|
||||||
|
|
||||||
function sseWrite(res: import('express').Response, data: Record<string, unknown>) {
|
function sseWrite(res: import('express').Response, data: Record<string, unknown>) {
|
||||||
const payload = `data: ${JSON.stringify(data)}\n\n`;
|
res.write(`data: ${JSON.stringify(data)}\n\n`);
|
||||||
const pad = Math.max(0, SSE_PAD_TARGET - payload.length);
|
|
||||||
// SSE comment lines (": ...") are ignored by the browser but push
|
|
||||||
// data past proxy buffer thresholds so each event is delivered immediately.
|
|
||||||
res.write(pad > 0 ? `: ${' '.repeat(pad)}\n${payload}` : payload);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|||||||
@@ -150,6 +150,10 @@ const LLM_PROGRESS_MAX = 98;
|
|||||||
const LLM_PROGRESS_RANGE = LLM_PROGRESS_MAX - LLM_PROGRESS_MIN;
|
const LLM_PROGRESS_RANGE = LLM_PROGRESS_MAX - LLM_PROGRESS_MIN;
|
||||||
const THROTTLE_MS = 300;
|
const THROTTLE_MS = 300;
|
||||||
|
|
||||||
|
function yieldToEventLoop(): Promise<void> {
|
||||||
|
return new Promise(resolve => setImmediate(resolve));
|
||||||
|
}
|
||||||
|
|
||||||
export async function convertPdfToStatementStreaming(
|
export async function convertPdfToStatementStreaming(
|
||||||
buffer: Buffer,
|
buffer: Buffer,
|
||||||
onProgress: OnProgress,
|
onProgress: OnProgress,
|
||||||
@@ -163,6 +167,7 @@ export async function convertPdfToStatementStreaming(
|
|||||||
}
|
}
|
||||||
|
|
||||||
onProgress('pdf', 2, 'Извлечение текста из PDF...');
|
onProgress('pdf', 2, 'Извлечение текста из PDF...');
|
||||||
|
await yieldToEventLoop();
|
||||||
|
|
||||||
let text: string;
|
let text: string;
|
||||||
try {
|
try {
|
||||||
@@ -186,6 +191,7 @@ export async function convertPdfToStatementStreaming(
|
|||||||
}
|
}
|
||||||
|
|
||||||
onProgress('pdf', 8, 'Текст извлечён, отправка в LLM...');
|
onProgress('pdf', 8, 'Текст извлечён, отправка в LLM...');
|
||||||
|
await yieldToEventLoop();
|
||||||
|
|
||||||
const openai = new OpenAI({
|
const openai = new OpenAI({
|
||||||
apiKey: config.llmApiKey,
|
apiKey: config.llmApiKey,
|
||||||
@@ -205,7 +211,6 @@ export async function convertPdfToStatementStreaming(
|
|||||||
stream: true,
|
stream: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Estimate expected output size as ~2x the input PDF text length, clamped
|
|
||||||
const expectedChars = Math.max(2_000, Math.min(text.length * 2, 30_000));
|
const expectedChars = Math.max(2_000, Math.min(text.length * 2, 30_000));
|
||||||
|
|
||||||
let accumulated = '';
|
let accumulated = '';
|
||||||
@@ -227,11 +232,14 @@ export async function convertPdfToStatementStreaming(
|
|||||||
);
|
);
|
||||||
onProgress('llm', llmProgress, 'Конвертация через LLM...');
|
onProgress('llm', llmProgress, 'Конвертация через LLM...');
|
||||||
lastEmitTime = now;
|
lastEmitTime = now;
|
||||||
|
// Let the event loop flush socket writes to the network
|
||||||
|
await yieldToEventLoop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onProgress('llm', LLM_PROGRESS_MAX, 'LLM завершил, обработка результата...');
|
onProgress('llm', LLM_PROGRESS_MAX, 'LLM завершил, обработка результата...');
|
||||||
|
await yieldToEventLoop();
|
||||||
|
|
||||||
const content = accumulated.trim();
|
const content = accumulated.trim();
|
||||||
if (!content) {
|
if (!content) {
|
||||||
|
|||||||
Reference in New Issue
Block a user