AutoGraph Error Handling and Troubleshooting
HTTP error codes, common issues, and troubleshooting for the AutoGraph service
Error Handling
The service returns these HTTP status codes:
| Code | Meaning |
|---|---|
200 | Success, for synchronous operations. |
202 | Accepted. The corpus build, strategizer run, or orchestration was started in the background. |
400 | Invalid request body or parameters, a corpus build selector the File Manager has nothing for, a rejected model configuration credential, or a latched model configuration. |
401 | Missing or invalid token. Project Overview also returns it when the File Manager rejects the credentials of the service. |
403 | Authenticated but not allowed to use the database. Project Overview also returns it when the File Manager denies access. |
404 | Unknown build, job, orchestration, or cluster ID, a collection in an embed request that does not exist, a category that was never built, a project that is not the one the service runs against, or an AutoGraph service node that is missing from the project metadata. |
409 | Another build, orchestration run, strategizer run, or graph mutation is already in progress, a project deletion has started, there is nothing to orchestrate, or none of the given file_ids matched. |
500 | Server or configuration error. |
503 | The service, the graph, or the File Manager is not ready. |
Error responses are usually JSON with a message field (and sometimes a
code) that you can log or show to operators.
429 Too Many Requests and 507 Insufficient Storage are defined but never
reached. The gateway maps a provider rate limit onto 429 and a local storage
limit onto 507, but no endpoint raises either of them. Do not write a client
branch for these two statuses.
- Provider throttling always happens while a job runs in the background, so
it is reported on the job as
error_code: LLM_RATE_LIMITEDorLLM_QUOTA_EXCEEDED, which you read from a200poll of the failed job. A rate limit that the live inference probe ofPUT /v1/projects/{project}/model-config/credentialsruns into is a400witherror_code: RATE_LIMITEDinstead, and a rate-limited File Manager is reported as503. - A single file larger than the whole staging budget is skipped and
reported on the build itself, as a completed build with
error_code: STORAGE_FILE_TOO_LARGE. On the deprecatedPOST /v1/import-multiplethe same file is rejected up front with a400instead. Ordinary exhaustion of the staging space is not an error and is never reported, see Build error codes.
Two outcomes that are not failures
202means accepted, not finished. Poll the matching status endpoint.409fromPOST /v1/orchestratewith a message that readsNothing to orchestrate: …means the knowledge graph is already up to date. Do not retry. Check Project Overview if you expected work to be pending.
Successful responses that you still have to inspect
GET /v1/corpus/builds/{id}withstatus: completedand a non-emptyerror_codeis a partial success, see Build error codes.PUT /v1/projects/{project}/model-config/credentialsreturns200for a configuration that was accepted and persisted, butapplied_to_running_podcan still befalse, which means it only takes effect on the next service restart. A validation failure is a400, see Update Model Config Credentials.DELETE /v1/projects/{project}returns200for a complete teardown and for a partial failure. Key offdeleted, see Delete Project.- A
POST /v1/graph/insertor/v1/graph/updateresponse can report a failure per file while the request itself succeeded.
202 even if the job later
fails because of an LLM or embedding provider problem; the 202 only means that
the job was accepted, not that it finished. To learn the real outcome, poll
GET /v1/corpus/builds/{id}, GET /v1/rag-strategizer/jobs/{id}, or
GET /v1/orchestrate/{id}, or watch the status in the web interface.Provider-failure error codes
When a corpus build fails because of an LLM
or embedding provider error, GET /v1/corpus/builds/{id} returns an error_code
field that identifies the cause, so your client can react to each one.
The HTTP equivalent column below is a semantic category for client handling.
It is not a status that the API returns: the poll of the build status answers
200 with the failed build record, and none of these failures ever reaches you
as an HTTP status, because they all occur while the job runs in the background.
error_code | Meaning | HTTP equivalent |
|---|---|---|
LLM_AUTHENTICATION_FAILED | API key rejected by the provider | 401 |
LLM_PERMISSION_DENIED | API key valid but lacks access to the model | 403 |
LLM_RATE_LIMITED | Provider rate-limited the request | 429 |
LLM_QUOTA_EXCEEDED | Provider quota for the key was consumed | 429 |
LLM_API_KEY_MISSING | No chat/embedding key configured on the service | 401 |
A build can also carry FILE_PARSER_PARTIAL_FAILURE, FILE_PARSER_NO_SUCCESS,
FILE_PARSER_TIMEOUT, STORAGE_FILE_TOO_LARGE, REBUILD_NOT_ALLOWED, or the
catch-all UNKNOWN_ERROR. For the full list and what to do about each of them,
see Build error codes.
The model configuration gate
If the chat or embedding configuration that the service resolved at startup is
invalid, or if a pod is still reloading the persisted settings, then
POST /v1/corpus/builds, POST /v1/rag-strategizer/analyze, and
POST /v1/orchestrate return 400 immediately rather than queueing work that
would fail while embedding. Health checks and read requests are unaffected.
Clear the gate with
PUT /v1/projects/{project}/model-config/credentials.
Only definitive, non-retryable validation failures latch it. Transient ones such
as ENDPOINT_UNREACHABLE, TIMEOUT, RATE_LIMITED, and PROVIDER_ERROR are
logged and leave the gate open.
Common causes of validation or configuration errors:
- The
filesarray is empty on import, insert, or update, or an insert batch holds more than 100 files. - The
embedding_strategyis set to a value other than"first_chunk". - The
cluster_thresholdis set to a value other than1or2. - More than one of
categories,modules, orfile_idsis set on a corpus build. - A
categorieslabel on a full corpus build (incremental: false) has no files in the File Manager, orfile_idslists IDs that the File Manager cannot resolve. No build is created in either case, see Create Corpus Build. - A model configuration credential is rejected by the provider or the secret manager, see Update Model Config Credentials.
projectorcomplexityis missing on a RAG Strategizer request.- The RAG Strategizer was called before a corpus build finished successfully.
- An incremental graph update was called before the initial corpus build had finished.
- The
categoryof an incremental graph update is unknown, or it was omitted in a project that has more than one category. - A document that you want to delete or update is not in the graph, or it belongs to another category.
- A batch contains duplicate
doc_nameorfile_idvalues. - The
partition_idsarray is empty in a recluster request, or lists more than five partitions. - An embed request is missing
collectionorfield, orfieldends in_embedding. - The server has no embedding provider or no authentication configured.
Known Limitations
Citation handling
Citations require manual processing. AutoGraph preserves the citable_url
field throughout the pipeline (from import through the Importer), but
it does not yet detect or link citations automatically. The service stores
any citation URLs you provide at import and passes them on to later stages;
you have to handle these citation features yourself:
- Citation extraction from content: Citations inside document text (for example, references, footnotes, or bibliographies) are not detected or extracted automatically.
- SemanticUnits linking: The orchestrator sets
enable_semantic_units: truefor FullGraphRAG partitions, but citation nodes are not yet created or linked in theSemanticUnitscollection. - Citation validation: No citation URL is checked for reachability, so a
link that has gone dead is still shown. URLs that come from File Manager are
at least checked for a usable
httporhttpsform; ones you set inline are stored exactly as you write them. - Cross-document citation tracking: Links between documents based on citations are not created automatically.
Recommended workflow:
- When you import documents via
POST /v1/import-multiple, setcitable_urlon each file that has a canonical URL to cite. - The URL is stored in the Corpus Graph and passed to the importer during orchestration.
- To extract citations from document content, add your own processing step
that:
- Scans your documents for citation references.
- Creates
SemanticUnitsnodes for cited resources. - Links chunks and documents to their citations.
A future release will add automatic citation detection and SemanticUnits creation.
VectorRAG query support
VectorRAG partitions support a smaller set of queries. When the RAG
Strategizer assigns VectorRAG to a cluster (domain), the Importer
creates only the Documents, Chunks, and Relations collections
for that partition. It does not create Entities or Communities, which
some query types need. This limits which queries you can run later.
| Query type | VectorRAG | FullGraphRAG | Notes |
|---|---|---|---|
| Global | Not supported | Supported | Needs Communities with community summaries. |
| Local | Not supported | Supported | Needs Entities and entity-relationship subgraphs. |
| Unified | Partial | Supported | Vector search works, but without entity context the answer quality drops. |
Why this happens:
- VectorRAG is a lighter strategy that skips entity extraction and community detection to save time and cost.
- Global queries need community-level summaries that only exist in FullGraphRAG partitions.
- Local queries need entity-relationship graphs extracted from text, which VectorRAG does not produce.
- Unified queries can search chunks with vector similarity (both strategies have chunks), but they miss the entity context that FullGraphRAG adds.
Recommended approach:
- For query-heavy workloads: Set
complexityto"very_high"or"high"when callingPOST /v1/rag-strategizer/analyzeso that most or all clusters use FullGraphRAG. - For mixed workloads: Accept that VectorRAG partitions only serve vector chunk search (unified queries with reduced quality).
- To change the strategy of a single cluster: Override it with
PATCH /v1/rag-strategizer/strategy/{cluster_id}. Do so before the first orchestration, because the partition ID does not change and an already imported partition is not built again. - For critical domains: Review the assignments with
GET /v1/rag-strategizer/strategy. If a partition has already been imported under the wrong strategy, remove the category withDELETE /v1/projects/{project}/categories/{category}, build it again, re-run the strategizer, and orchestrate.
For the full comparison, see Retrieval capability per strategy.
Troubleshooting
- Cannot reach ArangoDB. Check your network and firewall, and confirm the ArangoDB URL your deployment is using.
- 401 Unauthorized. Send the token as
Authorization: Bearer <token>, with a space betweenBearerand the token value. - Build appears stuck or fails. Poll
GET /v1/corpus/builds/{id}and inspect thestatus,message, anderrorfields for details. - A build failed with
FILE_PARSER_NO_SUCCESS. No file in the build produced any usable text, so there was nothing to embed.messagenames the first ten failing files asfilename (ID: file_id): error. Scanned images without OCR-readable text, and corrupt or password-protected documents, are the usual causes. - A build failed with
FILE_PARSER_TIMEOUT. The File Parsing Service did not finish within the batch deadline. The batch was not cancelled and may still complete on the parser side. Retry the build; if it keeps happening, the corpus is probably too slow to parse, for example because it is mostly scanned material. - Only one module’s files appear in the build, or files and a category
from an earlier import are gone. Each
POST /v1/import-multiplecall deletes the files of the previous direct-upload call and the category itsmodulelabel created. Earlier versions of the service kept both. The endpoint is deprecated for this reason: upload to the File Manager and build withcategoriesinstead. See Import Files. - A build ignores files that
import-multipleaccepted. A staged file only reaches the build if the same basename also exists as a RAG input in the File Manager for the same database, so the direct upload alone is not enough. A build that does passcategoriesorfile_idshas its selector checked before it is accepted and reports this as a400on the request instead, see Create Corpus Build. - RAG Strategizer fails. Make sure a corpus build has finished and
produced clusters before you run the Strategizer. Poll
GET /v1/rag-strategizer/jobs/{strategize_job_id}for the outcome of a run. - A scoped Strategizer job fails immediately. If you sent
categoriesand any of the listed categories has no matching cluster, the whole job fails, even when the others matched. The labels are case-sensitive, check them againstGET /v1/projects/{project}/overview. - A job status returns
404. The statuses are held in memory with bounded retention: 24 hours for a corpus build, 1 hour for a strategizer job, and an orchestration status is evicted by the next orchestration trigger. All of them are lost on a pod restart, so persist any ID you need for an audit. - Orchestration fails. Confirm that the
ragscollection contains strategies, and that platform authentication and the Importer integration are configured for your environment. - You uploaded more files than the corpus has documents. There are two
causes and they show up in different places. Check them in this order:
- A name was reused within one category, which is the more common case.
The File Manager keys a RAG input by database, project, category, and name,
so uploading the same name into the same category supersedes the earlier
file. You get one entry at
version: 2, not two entries, and only the latest version of a file is built. Confirm it by listing the RAG inputs of the project and comparing their number against the number of your uploads, and by checking theversionfield of the suspects. The build response cannot show this, because a file that was superseded before the build ran was never visible to AutoGraph. Upload under distinct names, or into separate categories, if you want both files to exist. - Two files collapsed onto one document during the build, which
documents_deduplicatedanddedup_groupsreport onGET /v1/corpus/builds/{id}. See Document identity and deduplication for the sequence that leads to it and how to resolve it.
- A name was reused within one category, which is the more common case.
The File Manager keys a RAG input by database, project, category, and name,
so uploading the same name into the same category supersedes the earlier
file. You get one entry at
- A corpus build fails with duplicate insert symptoms, such as
Partial bulk insert: 0/NorNo documents were inserted into the database. The run tried to insert document keys that already exist, that is the same category and the same file name. Import under a different category or file name, or replace the documents in place withPOST /v1/graph/update. A full rebuild of a category that already exists is rejected withREBUILD_NOT_ALLOWED. - A client breaks after an upgrade with an unexpected status. The
asynchronous endpoints now return
202instead of200. Accept any2xx. - A model configuration change had no effect. Check
applied_to_running_podin the response. When it isfalse, the configuration was persisted but only takes effect on the next service restart. A rejected configuration never gets that far. It comes back as a400withvalid: falseand nothing is persisted or applied. MODEL_NOT_FOUNDfor a model you know exists. Sendchat_api_urlandembedding_api_urlin the request, so that the live inference probe hits your endpoint instead of the default OpenAI URL.- Project Overview returns
503. The File Manager is unreachable, timed out, or not ready. A401or403from the overview indicates a File Manager authentication or permission problem rather than an outage. - An incremental graph update returns
409. Corpus builds, orchestration runs, and the/v1/graph/*endpoints share one service-wide slot. Wait for the active operation to finish and try again. - A document is missing from Layer 3 after an insert. An insert only updates
Layers 1 and 2. Run a targeted orchestration with the returned
file_id. For other problems with incremental graph updates, see Graph Operations. - An insert or update is rejected with
400and a list ofdoc_namevalues. Those entries have nofile_id. Both endpoints take File Manager input only, and a single missing ID rejects the whole batch. See Identifying documents for Layer 3. - Embed Field endpoint fails. The target collection must exist, the source field must have non-empty values, and an embedding provider must be configured on the service.
