conductor-oss/conductor · error · NonRetryableException

docId is empty

Error message

docId is empty

What it means

Thrown as NonRetryableException by the LLM_INDEX_TEXT worker when input.getDocId() is blank. A stable document id is required to upsert and later retrieve/update the indexed document in the vector store, so a blank id fails the task terminally.

Source

Thrown at ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/VectorDBWorkers.java:63

@Conditional(AIIntegrationEnabledCondition.class)
public class VectorDBWorkers implements AnnotatedSystemTaskWorker {

    private static final TypeReference<Map<String, Object>> MAP_OF_STRING_TO_OBJ =
            new TypeReference<Map<String, Object>>() {};

    private final VectorDBs vectorDBs;
    private final LLMs llm;

    public VectorDBWorkers(VectorDBs vectorDBs, LLMs llm) {
        this.vectorDBs = vectorDBs;
        this.llm = llm;
        log.info("VectorDBWorkers initialized with LLMs: {} and vectorDBs: {}", llm, vectorDBs);
    }

    @WorkerTask("LLM_INDEX_TEXT")
    public void indexText(IndexDocInput input) {
        if (isBlank(input.getDocId())) {
            throw new NonRetryableException("docId is empty");
        }

        try {
            String chunk = input.getText();
            EmbeddingGenRequest request =
                    EmbeddingGenRequest.builder()
                            .model(input.getEmbeddingModel())
                            .dimensions(input.getDimensions())
                            .text(chunk)
                            .build();
            request.setLlmProvider(input.getEmbeddingModelProvider());
            List<Float> embeddings = llm.generateEmbeddings(TaskContext.get().getTask(), request);

            vectorDBs.storeEmbeddings(
                    input.getVectorDB(),
                    TaskContext.get(),
                    input.getIndex(),
                    input.getNamespace(),

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Provide a non-blank docId in the LLM_INDEX_TEXT input.
  2. Generate a stable id upstream (e.g. UUID or hash of content) and map it into docId.
  3. Verify the template variable feeding docId resolves to a non-empty value.
  4. Confirm the input key is 'docId' (worker reads input.getDocId()).

Example fix

// before
{ "text": "...", "embeddingModel": "..." }  // no docId
// after
{ "docId": "${workflow.documentId}", "text": "...", "embeddingModel": "..." }
Defensive patterns

Strategy: validation

Validate before calling

// Generate/validate a docId before indexing
if (StringUtils.isBlank(input.getDocId())) {
    input.setDocId(UUID.randomUUID().toString()); // or a content hash
}

Prevention

When it happens

Trigger: Running LLM_INDEX_TEXT with a blank IndexDocInput.docId; an upstream task that was supposed to generate an id producing null/empty.

Common situations: Workflow author forgot to set docId; docId sourced from a template variable that resolved to blank (e.g. missing source field); caller built IndexDocInput without an id; docId derived from a filename that was empty.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/8e985e2bde516786. Report an issue: GitHub.