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:
StructuredLLMClientCompleteStructured(ctx, req, out)
OpenAI-compatible request shape
At a conceptual level, Audita sends chat completion requests with:
modelmessages(role/content pairs)response_format:type = "json_schema"json_schema.name(stable schema name)json_schema.strict = truejson_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_formatname) - raw JSON Schema payload
- SHA-256 hash
Current schemas:
correction_set:- id
audita.correction_set - version
v1 - name
audita_correction_set_v1
- id
validator_decision_set:- id
audita.validator_decision_set - version
v1 - name
audita_validator_decision_set_v1
- id
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.