40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
"""Provider-neutral boundary for structured LLM calls.
|
|
|
|
The harness owns prompt selection, privacy minimisation, and validation. A
|
|
provider adapter only has to execute one structured request and return either
|
|
the requested Pydantic model or a mapping that can be validated as that model.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Mapping
|
|
from typing import Any, Protocol, TypeVar, runtime_checkable
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
StructuredModel = TypeVar("StructuredModel", bound=BaseModel)
|
|
|
|
|
|
@runtime_checkable
|
|
class LLMBackend(Protocol):
|
|
"""Minimal synchronous interface implemented by model-provider adapters."""
|
|
|
|
def complete_json(
|
|
self,
|
|
*,
|
|
stage: str,
|
|
system_prompt: str,
|
|
task_prompt: str,
|
|
user_payload: Mapping[str, Any],
|
|
output_model: type[StructuredModel],
|
|
) -> StructuredModel | Mapping[str, Any]:
|
|
"""Return structured data for ``output_model``.
|
|
|
|
Adapters may return a validated model or a plain mapping. The pipeline
|
|
deliberately validates the value again at its trust boundary.
|
|
"""
|
|
|
|
|
|
__all__ = ["LLMBackend", "StructuredModel"]
|