Files
audita/docs/structured-llm.md

3.3 KiB

Structured LLM Architecture

Purpose

This document describes Audita's structured LLM runtime boundary and adapter behavior.

Why Audita owns the adapter

Audita owns a small structured LLM adapter so that core runtime behavior is controlled inside the repository:

  • request construction and schema handling are explicit and testable;
  • retries, timeouts, cancellation, and error redaction are consistent across modules and validators;
  • provider SDK types are not exposed outside the adapter boundary;
  • dependency weight and transitive provider-specific behavior are reduced.

At runtime, the rest of Audita depends only on the internal contract:

  • StructuredLLMClient
  • CompleteStructured(ctx, req, out)

OpenAI-compatible request shape

At a conceptual level, Audita sends chat completion requests with:

  • model
  • messages (role/content pairs)
  • response_format:
    • type = "json_schema"
    • json_schema.name (stable schema name)
    • json_schema.strict = true
    • json_schema.schema (registered JSON Schema payload)

The adapter uses OpenAI-compatible POST {base_url}/chat/completions over net/http.

Structured response schema registry

Structured response schemas are registered in internal/framework/responseschema with stable metadata:

  • schema key
  • schema ID
  • schema version
  • schema name (OpenAI-compatible response_format name)
  • raw JSON Schema payload
  • SHA-256 hash

Current schemas:

  • correction_set:
    • id audita.correction_set
    • version v1
    • name audita_correction_set_v1
  • validator_decision_set:
    • id audita.validator_decision_set
    • version v1
    • name audita_validator_decision_set_v1

Provider compatibility assumptions

Audita assumes an OpenAI-compatible chat-completions endpoint that:

  • accepts message arrays with model selection;
  • accepts response_format.type = json_schema;
  • returns a completion with assistant message content and optional usage metadata.

Provider-specific differences are expected in strictness and error payload shapes, so the adapter treats provider output as untrusted until locally decoded.

Local decode and validation remain mandatory

Provider-level structured output is a transport guardrail, not final validation.

After receiving a response, Audita still:

  • decodes assistant content into typed request-specific structs;
  • validates proposal and validator payload invariants locally;
  • enforces deterministic validator/cardinality rules before any transcript application.

This protects runtime correctness even when provider responses are malformed, partial, or semantically inconsistent.

Diagnostics and redaction

When structured schemas are used, diagnostics metadata records:

  • schema ID
  • schema version
  • schema name
  • schema hash

Diagnostics and surfaced errors preserve secret redaction:

  • API keys and bearer tokens are redacted from request/response/error artifacts;
  • redaction is applied before diagnostic files are written.

Runtime behavior guarantees

The structured LLM path preserves existing runtime guarantees:

  • bounded LLM call execution through schedulers;
  • context-aware cancellation and timeout propagation;
  • retry behavior for transient failures and retryable malformed structured responses;
  • deterministic module/chunk/proposal/validator behavior outside provider nondeterminism.