Skip to main content

Semantido

PyPI - Version PyPI - Python Version CI License

Code-native semantic layer authoring for SQLAlchemy. Annotate your models where they live and generate LLM-ready schema context for text-to-SQL agents, RAG pipelines, and BI tools, as JSON, Markdown, or vendor-neutral Apache Ossie YAML.


Table of Contents

Why

A database schema tells an LLM what your tables are called — not what they mean. Text-to-SQL systems fail on exactly the things a schema doesn't say: bridge tables that fan out and double-count, amount columns whose sign convention lives in a code column, three different columns that all look like "the amount".

semantido closes that gap without introducing a separate modeling language or YAML repository to keep in sync. Semantic metadata is declared next to the SQLAlchemy models it describes — reviewed in the same pull request, versioned in the same git history, refactored by the same tools. One sync_semantic_layer() call extracts models, columns, and relationships (with join conditions and cardinality) into a semantic layer you can export wherever your stack needs it.

Output is deterministic: the same models always produce byte-identical exports, so generated artifacts can be committed, diffed, and cached.

Installation

pip install semantido

The core installation is dependency-light (SQLAlchemy only) and covers the JSON and Markdown exporters plus to_ossie_dict(). For Apache Ossie YAML export (to_ossie_yaml()), add the ossie extra, which pulls in PyYAML:

pip install 'semantido[ossie]'

Quickstart

Annotate your models with the @semantic_table decorator and column-level attributes:

from sqlalchemy import Column, Integer, String, Numeric, DateTime, ForeignKey
from sqlalchemy.orm import relationship

from semantido import semantic_table, SemanticDeclarativeBase
from semantido.generators.semantic_layer import PrivacyLevel, TimeGrain


@semantic_table(
    description="Customer orders — one row per order.",
    synonyms=["orders", "purchases"],
    business_context="total_amount is gross, including tax and shipping.",
    time_dimension="ordered_at",
)
class Order(SemanticDeclarativeBase):
    __tablename__ = "orders"

    order_id = Column(Integer, primary_key=True)
    customer_id = Column(Integer, ForeignKey("customers.customer_id"))
    ordered_at = Column(DateTime, nullable=False)
    total_amount = Column(Numeric(12, 2), nullable=False)
    status = Column(String(16), nullable=False)

    ordered_at_time_grain = TimeGrain.SECOND
    total_amount_description = "Gross order total, including tax and shipping."
    total_amount_synonyms = ["order value", "revenue"]
    status_sample_values = ["PENDING", "SHIPPED", "CANCELLED"]

    customer = relationship("Customer", back_populates="orders")


@semantic_table(description="Customers who have placed at least one order.")
class Customer(SemanticDeclarativeBase):
    __tablename__ = "customers"

    customer_id = Column(Integer, primary_key=True)
    email = Column(String(255), nullable=False)

    email_privacy_level = PrivacyLevel.CONFIDENTIAL

    orders = relationship("Order", back_populates="customer")

Then build the layer and export it:

from semantido.exporters import to_json, to_markdown, to_ossie_yaml

layer = SemanticDeclarativeBase.sync_semantic_layer()

to_json(layer)                                      # structured JSON
to_markdown(layer)                                  # LLM prompt context
to_ossie_yaml(layer, model_name="commerce")         # Apache OOssie  interchange (requires [ossie])

Relationships, join conditions, cardinality, foreign keys, and primary keys are extracted automatically from the SQLAlchemy mappers — you only author what the schema cannot express.

What gets captured

Concern Authored as
Table meaning, business & application context @semantic_table(...) arguments
Column meaning, synonyms, sample values <column>_description, <column>_synonyms, <column>_sample_values
Business rules an agent must respect <column>_application_rules
Data sensitivity <column>_privacy_level (PUBLICCONFIDENTIAL)
Primary business time axis time_dimension= in the decorator (or __semantic_time_dimension__ on the class)
Secondary time axes & native grain <column>_is_time_dimension, <column>_time_grain (TimeGrain or "day")
Default filters / row-level security fragments sql_filters on the table
Relationship semantics <relationship>_relationship_description
Join conditions, cardinality, FKs, PKs extracted automatically from SQLAlchemy

Exporters

  • JSON (to_json, to_json_file) — structured, machine-readable, empty values pruned by default.
  • Markdown (to_markdown, to_markdown_file) — formatted for direct inclusion in LLM prompts for text-to-SQL and agentic analytics.
  • Apche Ossie YAML (to_ossie_dict, to_ossie_yaml) — the Open Semantic Interchange format for exchanging semantic models across the wider data stack. Time dimensions are curated on export: declared axes are flagged dimension.is_time, while audit timestamps (created_at, updated_at, ...) are demoted with an explicit "do not use as a time axis" instruction, keeping the signal-to-noise high for agentic consumers.

Example: trade reporting

examples/01_getting_started is a full walkthrough on a realistic wholesale-banking schema: a synthetic EMIR/MiFIR regulatory reporting subset that deliberately encodes three classic text-to-SQL failure modes — bridge fan-out, sign conventions, and amount ambiguity — and shows how semantic annotations counter each one. Reference exports in all three formats are committed alongside it.

Full documentation: semantido.ai

Contributing

Contributions to this library are welcomed and highly encouraged. See CONTRIBUTING.md for more information on how to get started.

License

semantido is distributed under the terms of the Apache License 2.0 license.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

semantido-0.5.2.tar.gz (135.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

semantido-0.5.2-py3-none-any.whl (66.2 kB view details)

Uploaded Python 3

File details

Details for the file semantido-0.5.2.tar.gz.

File metadata

  • Download URL: semantido-0.5.2.tar.gz
  • Upload date:
  • Size: 135.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Hatch/1.17.1 {"ci":null,"cpu":"arm64","distro":{"name":"macOS","version":"26.6"},"implementation":{"name":"CPython","version":"3.13.2"},"installer":{"name":"hatch","version":"1.17.1"},"openssl_version":"OpenSSL 3.0.16 11 Feb 2025","python":"3.13.2","system":{"name":"Darwin","release":"25.6.0"}} HTTPX2/2.5.0

File hashes

Hashes for semantido-0.5.2.tar.gz
Algorithm Hash digest
SHA256 49b0cef65019e64a228a49aaa3c2d65d3457949d291c57b1ca7f2c135fd0f682
MD5 3f1214cf965d47986f4a626b0c74e906
BLAKE2b-256 f9a1796a014b9b66159e3c63e499af7b583ef571574d96e829cc88cd8a461706

See more details on using hashes here.

File details

Details for the file semantido-0.5.2-py3-none-any.whl.

File metadata

  • Download URL: semantido-0.5.2-py3-none-any.whl
  • Upload date:
  • Size: 66.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Hatch/1.17.1 {"ci":null,"cpu":"arm64","distro":{"name":"macOS","version":"26.6"},"implementation":{"name":"CPython","version":"3.13.2"},"installer":{"name":"hatch","version":"1.17.1"},"openssl_version":"OpenSSL 3.0.16 11 Feb 2025","python":"3.13.2","system":{"name":"Darwin","release":"25.6.0"}} HTTPX2/2.5.0

File hashes

Hashes for semantido-0.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 cbc3573d32e69c3c1eb776fa37362ad9dee8d94a37f40142e6ec1e4817b3c864
MD5 8598e78950a49c04d9da6c02e33dd80d
BLAKE2b-256 dd2f48962000957959e0c7ee827fd1ca19bc81f3e30a42cd77a95346a4fb6059

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.5.2 This release

2 files

0.5.1

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.2

2 files

0.1.1

1 file

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page