| """BaseIntrospector — contract for source-specific schema readers. | |
| Subclasses produce a Source object with raw schema (names, types, sample | |
| values, stats). The planner consumes this directly — descriptions are not | |
| LLM-generated. | |
| """ | |
| from abc import ABC, abstractmethod | |
| from ..models import Source | |
| class BaseIntrospector(ABC): | |
| """Abstract base. Subclasses: DatabaseIntrospector, TabularIntrospector.""" | |
| async def introspect(self, location_ref: str) -> Source: | |
| ... | |