Skip to main content

Semantic Operators

One small interface for System One models: fast models that answer structured questions about text or data with probabilities, not prose. Jev was the first; Laya is an open-weight, Jev-compatible alternative you can run locally. More are coming. This library lets you write your code once and swap the model underneath.

Provider Models Where it runs Install
providers.typesafe.TypeSafe Jev (jev-latest, or pin a version) TypeSafe's hosted API (needs TYPESAFE_API_KEY) [typesafe]
providers.laya.Laya Laya checkpoints (English, multilingual, typed-decisions) on your machine (~800 MB download on first use) [laya]

A provider is the service or runtime you talk to; the model is a setting.

Install

pip install "semantic-operators[typesafe]"   # TypeSafe (hosted Jev)
pip install "semantic-operators[laya]"       # Laya (local; pulls in torch)
pip install "semantic-operators[typesafe,laya]"   # both

The core alone (pip install semantic-operators) has no dependencies.

The whole idea

A System One model is asked named questions about a piece of state and returns an answer with probabilities for each. There are three kinds of question:

Question You give it answer.value
Boolean instructions (+ optional true/false meanings) True / False
Choice instructions + named options the chosen option name
Score instructions + ordered rubric levels expected level as a float, e.g. 1.7

Every Answer also carries probabilities (a dict, in the question's option/level order) and raw (the provider's own answer object).

A provider is anything with one method:

def ask(self, state, questions: dict[str, Question]) -> dict[str, Answer]

That's the entire abstraction.

Quick start

echo "TYPESAFE_API_KEY=..." > .env
uv run --env-file .env --extra typesafe python examples/hello.py
from typesafe_sdk import TypeSafeClient
from semantic_operators import Boolean, Choice, Score
from semantic_operators.providers.typesafe import TypeSafe

with TypeSafeClient() as client:          # you create and own the SDK client
    provider = TypeSafe(client)           # model defaults to "jev-latest"
    answers = provider.ask(
        "I was charged twice and I'm furious.",
        {
            "is_complaint": Boolean("Is the customer complaining?"),
            "department": Choice("Which team should handle this?",
                                 {"billing": "Payments, refunds", "other": "Anything else"}),
            "urgency": Score("How urgent is this?", ["low", "medium", "high"]),
        },
    )

answers["department"].value           # "billing"
answers["department"].probabilities   # {"billing": 0.97, "other": 0.03}

Swapping to Laya changes only how the provider is built:

import laya
from semantic_operators.providers.laya import Laya

provider = Laya(laya.load("convaiinnovations/laya"))   # or Laya(laya.Router())
answers = provider.ask(state, questions)                # same questions, same Answer type

Compare both side by side:

uv run --env-file .env --extra typesafe --extra laya python examples/compare.py

Benchmark

bench.run(provider, questions, cases) asks each labeled case all questions in one call and reports, per question, accuracy (Score values are rounded to the nearest level) and p(correct), the average probability the provider gave the right answer, plus latency and every miss.

uv run --env-file .env --extra typesafe --extra laya python benchmarks/run.py

benchmarks/support_tickets.py holds 20 hand-written, hand-labeled support messages and the same 3 questions in three wordings. bench.stability(reports) reports how often a provider's decision stays the same when only the wording changes (labels play no part). It's a smoke test, not a verdict: small, authored, one person's labels.

Async

Every provider has an async twin with the same contract, await provider.ask(...):

from typesafe_sdk import AsyncTypeSafeClient
from semantic_operators.providers.typesafe import AsyncTypeSafe
from semantic_operators.providers.laya import AsyncLaya

async with AsyncTypeSafeClient() as client:
    answers = await AsyncTypeSafe(client).ask(state, questions)

AsyncLaya runs the local model in a worker thread, one call at a time. Concurrency speeds up a hosted API (many requests in flight), not a single local model. bench.run_async(provider, questions, cases, concurrency=8) benchmarks async providers:

uv run --env-file .env --extra typesafe --extra laya python benchmarks/run_async.py

Layout

src/semantic_operators/
  types.py          Boolean, Choice, Score, Answer: our vocabulary
  provider.py       Provider and AsyncProvider (one method each)
  providers/typesafe.py  translates to/from the TypeSafe SDK
  providers/laya.py translates to/from the laya package
  bench.py          (higher layer) run labeled cases through a provider, score them
examples/
  hello.py          one real call to Jev
  compare.py        the same questions through TypeSafe and Laya
benchmarks/
  support_tickets.py  20 labeled messages + the questions
  run.py              runs the suite through TypeSafe and Laya
  run_async.py        concurrency, and both providers at once

Layers

Semantic Operators is built in layers inside one package:

  1. Base layer: a clean, provider-neutral abstraction over System One models: types.py, provider.py, providers/.
  2. Higher layers: built only on the base layer. So far: bench.py. Later: reusable named operators and composition.

The base layer never imports from a higher layer, so it could later be split out as its own package without changing how it's used.

Rules

  • The library never reads API keys or environment variables. You build the client.
  • The core has no dependencies. Each provider's SDK is an optional extra ([typesafe], [laya]).
  • Our names, not the provider's: Boolean, not noul.

Not here yet (on purpose)

Reusable named operators, error types, and "don't know" answers. Each will be added as its own small step.

License

MIT

Release files for semantic-operators 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for semantic-operators 0.2.0
File Size Uploaded
semantic_operators-0.2.0.tar.gz 81.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for semantic-operators 0.2.0
File Interpreter ABI Platform
semantic_operators-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 93.3 kB

Release files / semantic_operators-0.2.0.tar.gz

Download URL semantic_operators-0.2.0.tar.gz
Size 81.5 kB
Tags Source
SHA-256 checksum
How to use checksums
fd88a841c2a1fb822588d27fb4d05689c0c0baea94feeba4554951d7ca5ee145
BLAKE2b-256 checksum
How to use checksums
11129e938497c647c86b63f06b266d160621e7495845363d5a27cf3a7be20dbc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / semantic_operators-0.2.0-py3-none-any.whl

Download URL semantic_operators-0.2.0-py3-none-any.whl
Size 11.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0c800295b989fd90a1a75f5a9cd7fa516db634abb86e17e48401301a23da8852
BLAKE2b-256 checksum
How to use checksums
beb50884f90860fdc77848530c80e4fcf75bcd352ebbf1148126216ed65c8680
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page