nthlayer-common
Shared utilities for the NthLayer ecosystem. Provides the unified LLM interface, provider infrastructure, identity resolution, and data models used by all ecosystem components.
Install
pip install nthlayer-common
LLM Interface
Model-agnostic — one function, any provider. No LiteLLM, no SDKs. Direct HTTP calls via httpx.
from nthlayer_common import llm_call
result = llm_call(
system="You are a triage agent...",
user="Evaluate this incident...",
)
print(result.text)
Provider support
Two API formats cover the entire market:
| Provider | Model format | API |
|---|---|---|
| Anthropic | anthropic/claude-sonnet-4-20250514 |
Messages API |
| OpenAI | openai/gpt-4o |
Chat Completions |
| Ollama | ollama/llama3.1 |
Chat Completions |
| Azure | azure/my-deployment |
Chat Completions |
| Together | together/meta-llama/Llama-3-70b |
Chat Completions |
| Groq | groq/llama-3.1-70b-versatile |
Chat Completions |
| Mistral | mistral/mistral-large-latest |
Chat Completions |
| vLLM | vllm/my-model |
Chat Completions |
| LM Studio | lmstudio/my-model |
Chat Completions |
Configuration
NTHLAYER_MODEL="anthropic/claude-sonnet-4-20250514" # default
NTHLAYER_LLM_TIMEOUT="60" # seconds
ANTHROPIC_API_KEY="sk-ant-..." # for anthropic/* models
OPENAI_API_KEY="sk-..." # for openai/*, together/*, groq/*, etc.
OPENAI_API_BASE="http://localhost:11434/v1" # override endpoint URL
Retry & resilience
Built-in retry with exponential backoff and jitter for transient errors (429, 502, 503, timeouts). Respects Retry-After headers. Permanent errors (400, 401, 403) fail immediately. Default: 3 retries.
Provider Infrastructure
Shared async providers for infrastructure services, migrated from nthlayer-generate so all ecosystem components use the same clients:
PrometheusProvider— query, query_range, get_sli_value, health_checkGrafanaProvider— dashboard CRUD, datasource management, folder operationsPagerDutyProvider— service, team, and escalation policy managementMimirRulerProvider— Prometheus rule push to Grafana MimirProviderRegistry— register/create/list providers by name
Identity Resolution
Cross-provider service name normalization and ownership attribution:
IdentityResolver— 7-strategy resolution (explicit mapping → external ID → exact → alias → normalized → fuzzy → attribute correlation)normalize_service_name()— strips env suffixes, version tags, Java package prefixes, type suffixesOwnershipResolver— queries multiple ownership sources concurrently, selects highest-confidence signal- Ownership providers — Backstage, Kubernetes, PagerDuty (live); CODEOWNERS, Declared (static, in nthlayer)
HTTP Clients
Shared HTTP client infrastructure with per-instance retry and circuit breaker:
BaseHTTPClient— httpx-based with configurable retry (tenacity) + circuit breakerCortexClient— Cortex API clientPagerDutyClient— PagerDuty REST API clientSlackAPIClient— Slack Web API (token-based,post_message)
Slack Notifications
SlackNotifier— Block Kit messages via incoming webhook (fail-open, never blocks pipelines)SlackWebClient— Web API for interactive messages (buttons, message updates, signature verification)
Error Handling
Unified error hierarchy for the entire ecosystem:
ExitCode— SUCCESS=0, WARNING=1, BLOCKED=2, CONFIG_ERROR=10, PROVIDER_ERROR=11, VALIDATION_ERROR=12NthLayerError→ConfigurationError,ProviderError,ValidationError,BlockedError@main_with_error_handling()— decorator for CLI main functions with automatic exit code conversion
Tier Definitions
Single source of truth for service tier configuration:
Tier— CRITICAL, STANDARD, LOW (with legacy aliases tier-1/2/3)TIER_CONFIGS— availability targets, latency thresholds, error budget warning/blocking percentages, PagerDuty urgencynormalize_tier(),get_tier_config(),get_slo_targets()
Data Models
Shared Pydantic/dataclass models used across the ecosystem:
- SLO models —
SLO,ErrorBudget,SLOStatus,TimeWindow - Dependency models —
DependencyGraph,DependencyType,BlastRadiusResult - Domain models —
Run,Finding,Team,Service - Gate models —
GateResult,GatePolicy,DeploymentGateCheck
Prompt Loader
Shared YAML prompt loader for agentic components:
load_prompt(path)— reads YAML, renders schema block into system promptrender_user_prompt(template, **kwargs)— simple{{ variable }}interpolationvalidate_response(data, schema)— validates model output against expected schema
Typed package
Ships with a py.typed marker (PEP 561) — mypy and pyright use inline type annotations directly without requiring a separate stub package.
License
Apache 2.0
Metadata
Release files for nthlayer-common 2.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nthlayer_common-2.1.0.tar.gz | 195.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nthlayer_common-2.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 356.3 kB
Release files / nthlayer_common-2.1.0.tar.gz
| Download URL | nthlayer_common-2.1.0.tar.gz |
|---|---|
| Size | 195.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a0da4dd20d64a152b5630bd78236f06bb3b31269f2f0cb20ebdbd0aea13542ca
|
|
BLAKE2b-256 checksum How to use checksums |
81dc24f86b431221d2956f5e421a10bebab81f1d088e10b1ee6adde1c9dbf3ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency logRelease files / nthlayer_common-2.1.0-py3-none-any.whl
| Download URL | nthlayer_common-2.1.0-py3-none-any.whl |
|---|---|
| Size | 160.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
79d897564cb731b90e0d79ecff5045cbdb02776016bbdf94573bca7b28805de8
|
|
BLAKE2b-256 checksum How to use checksums |
9f9c0f9ae34826e4710f369a544deca8af392f1a01715b00fef05c54ddbdb84a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency log