unify parse api
This commit is contained in:
@@ -1,16 +1,21 @@
|
||||
# `POST /delivery/parsePDF`
|
||||
# `POST /delivery/parse`
|
||||
|
||||
Protected. Requires a valid session cookie (`credentials: 'include'`).
|
||||
|
||||
Parse PDF (SSE)
|
||||
Parse document (SSE)
|
||||
|
||||
Accepts a PDF invoice or delivery note (`multipart/form-data`, field `pdf`)
|
||||
and streams extraction results as Server-Sent Events until parsing is complete.
|
||||
Accepts an invoice or delivery note as PDF or text file
|
||||
(`multipart/form-data`, field `file`) and streams extraction results as
|
||||
Server-Sent Events until parsing is complete.
|
||||
|
||||
The PDF is read via `pdftotext -layout` and fed page-by-page to an LLM
|
||||
(OpenRouter) which fills a structured manifest of header data and line items.
|
||||
The OpenRouter API key is read from the authenticated user's company setting
|
||||
`keys.openrouter`; the endpoint returns `400` if the key is not configured.
|
||||
PDFs are read via `pdftotext -layout`; text files are decoded as UTF-8.
|
||||
Pages are separated by the form feed character (`\f`). If no form feed
|
||||
is present, the input is treated as a single page.
|
||||
|
||||
The extracted pages are fed to an LLM (OpenRouter) which fills a structured
|
||||
manifest of header data and line items. The OpenRouter API key is read from
|
||||
the authenticated user's company setting `keys.openrouter`; the endpoint
|
||||
returns `400` if the key is not configured.
|
||||
|
||||
The stream ends after the final `result` event (or an `error` event on failure).
|
||||
|
||||
@@ -19,7 +24,7 @@ The stream ends after the final `result` event (or an `error` event on failure).
|
||||
|
||||
| Field | Required | Type | Description |
|
||||
|-------|----------|------|-------------|
|
||||
| `pdf` | yes | file | PDF file to parse (max 50 MB, application/pdf) |
|
||||
| `file` | yes | file | Document to parse (max 50 MB, application/pdf or text file) |
|
||||
|
||||
## SSE Events
|
||||
|
||||
@@ -27,13 +32,13 @@ The response is a `text/event-stream`. Events are emitted in order until the str
|
||||
|
||||
| Event | Description | Payload |
|
||||
|-------|-------------|---------|
|
||||
| `status` | PDF parse confirmation and LLM status messages | `{ "message": "…" }` |
|
||||
| `status` | Document parse confirmation and LLM status messages | `{ "message": "…" }` |
|
||||
| `llm_call` | Fired before each LLM request | `{ "model": "…", "promptSize": 0, "messages": 0 }` |
|
||||
| `tool_call` | Fired when the output_manifest tool is invoked | `{ "name": "output_manifest" }` |
|
||||
| `usage` | Token usage after each LLM response | `{ "input": 0, "cached": 0, "output": 0, "cost": 0 }` |
|
||||
| `progress` | Intermediate accumulated extraction state (basedata / notes / items) | `ManifestResult` |
|
||||
| `result` | Final accumulated extraction — emitted just before the stream closes | `ManifestResult` |
|
||||
| `error` | Emitted on PDF parse or LLM failure; stream closes immediately after | `{ "message": "…" }` |
|
||||
| `error` | Emitted on document parse or LLM failure; stream closes immediately after | `{ "message": "…" }` |
|
||||
|
||||
## Response `200`
|
||||
|
||||
@@ -77,7 +82,7 @@ The response is a `text/event-stream`. Events are emitted in order until the str
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| 400 | No PDF uploaded or OpenRouter key not configured — `{"error":"…"}` |
|
||||
| 400 | No file uploaded, unsupported file type, or OpenRouter key not configured — `{"error":"…"}` |
|
||||
| 401 | Unauthorized — `{"error":"…"}` |
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user