trustgraph/tests/unit
cybermaggedon 9136526863
feat: LLM-native structured output via JSON schema enforcement (#1037)
Thread existing JSON schemas from prompt definitions through the
text-completion service to LLM backends' native structured output
APIs. When a prompt has response-type "json" and a strict-mode
compatible schema, the LLM constrains token selection at the logit
level to guarantee schema-valid output.

Wire-level changes:
- Add response_format and schema fields to TextCompletionRequest
- Update translator to encode/decode new fields
- Pass new fields through LlmService, TextCompletionClient, and
  PromptManager

Runtime schema compatibility checker:
- New is_strict_mode_compatible() utility validates schemas against
  LLM provider constraints (additionalProperties, required fields,
  no unsupported constraints, no open-ended objects)
- Per-prompt eligibility decision: compliant schemas use structured
  output, non-compliant schemas fall back to free-text + post-hoc
  validation

LLM backend implementations:
- OpenAI: response_format with json_schema, variant-aware top-level
  array rejection (openai variant blocks, llama/vllm variants allow)
- New vllm variant for the OpenAI backend
- vLLM (dedicated): response_format in raw HTTP body
- Ollama: format=<schema> parameter
- Claude: tool-use trick (forced tool call with schema as input_schema)
- Mistral: native json_schema response_format
- Llamafile, LM Studio: OpenAI SDK response_format
- Azure OpenAI: AzureOpenAI SDK response_format
- Azure serverless: response_format in raw HTTP body
- TGI: response_format in raw HTTP body
- VertexAI Gemini: response_mime_type + response_schema
- VertexAI Claude: tool-use trick
- Google AI Studio: response_mime_type + response_schema
- Bedrock, Cohere: signature-only (no structured output yet)

Post-hoc jsonschema.validate() retained as defence-in-depth.

Tech spec added: docs/tech-specs/structured-output.md

Update tests
2026-07-10 15:28:56 +01:00
..
test_agent feat: workspace-based multi-tenancy, replacing user as tenancy axis (#840) 2026-04-21 23:23:01 +01:00
test_api feat: structured source document references in graph-rag responses (#1035) 2026-07-08 23:59:56 +01:00
test_base feat: LLM-native structured output via JSON schema enforcement (#1037) 2026-07-10 15:28:56 +01:00
test_bootstrap feat: make bootstrapper initialiser timeouts configurable (#999) 2026-06-30 09:37:22 +01:00
test_chunking Per-flow librarian clients and per-workspace response queues (#865) 2026-05-06 12:01:01 +01:00
test_cli feat: export/import workspace knowledge in .tgx bundles (#877 Phase 2) (#1024) 2026-07-06 10:48:41 +01:00
test_clients feat: workspace-based multi-tenancy, replacing user as tenancy axis (#840) 2026-04-21 23:23:01 +01:00
test_concurrency feat: direction-aware reranker text in GraphRAG hop-and-filter (#1016) 2026-07-02 21:14:47 +01:00
test_config Structure data mvp (#452) 2025-08-07 20:47:20 +01:00
test_cores feat: complete knowledge core storage — named graphs, provenance, source material (#973) 2026-06-03 10:46:52 +01:00
test_decoding fix: reject invalid PDF decoder input (#977) 2026-06-09 16:37:39 +01:00
test_direct feat: workspace-based multi-tenancy, replacing user as tenancy axis (#840) 2026-04-21 23:23:01 +01:00
test_embeddings Fix HF embeddings tests (#967) 2026-06-01 12:35:09 +01:00
test_extract fix: preserve non-ASCII entity names in ontology URI normalization (#1036) 2026-07-09 00:05:35 +01:00
test_gateway feat: add structured audit event system (#1027) 2026-07-06 10:47:49 +01:00
test_iam feat: add structured audit event system (#1027) 2026-07-06 10:47:49 +01:00
test_knowledge_graph feat: workspace-based multi-tenancy, replacing user as tenancy axis (#840) 2026-04-21 23:23:01 +01:00
test_librarian Per-workspace queue routing for workspace-scoped services (#862) 2026-05-04 10:30:03 +01:00
test_provenance feat: replace LLM edge scoring with cross-encoder reranker in GraphRAG (#1005) 2026-06-30 14:36:37 +01:00
test_pubsub Test fixes for Kafka (#834) 2026-04-18 23:06:01 +01:00
test_query fix: update row query tests to mock async_execute_paged and async_scan (#979) 2026-06-09 16:29:32 +01:00
test_rdf Pub/sub abstraction: decouple from Pulsar (#751) 2026-04-01 20:16:53 +01:00
test_reliability feat: data store replication configuration and TLS upgrade (#975) 2026-06-04 11:49:29 +01:00
test_retrieval feat: structured source document references in graph-rag responses (#1035) 2026-07-08 23:59:56 +01:00
test_rev_gateway Update rev-gateway for IAM integration (#940) 2026-05-19 21:45:43 +01:00
test_storage feat: hybrid retrieval (BM25 + vector RRF fusion) for document-RAG (#875) (#1030) 2026-07-07 12:54:02 +01:00
test_structured_data Make all Cassandra and Qdrant I/O async-safe with proper concurrency controls (#916) 2026-05-14 16:00:54 +01:00
test_tables feat: complete knowledge core storage — named graphs, provenance, source material (#973) 2026-06-03 10:46:52 +01:00
test_text_completion Fixed document-rag workspace problem (#866) 2026-05-06 14:55:21 +01:00
test_translators feat: complete knowledge core storage — named graphs, provenance, source material (#973) 2026-06-03 10:46:52 +01:00
__init__.py Test suite executed from CI pipeline (#433) 2025-07-14 14:57:44 +01:00
test_prompt_manager.py fix: avoid swallowing prompt manager interrupts 2026-05-26 10:37:21 -04:00
test_prompt_manager_edge_cases.py Update to enable knowledge extraction using the agent framework (#439) 2025-07-21 14:31:57 +01:00
test_python_api_client.py Merge pull request #955 from jmolz/fix-socket-client-bare-excepts 2026-05-27 13:16:33 +01:00