5-Minute Quickstart
Get all five production layers running in minutes. No API key required — runs fully offline with a fake provider you swap out in one line.
Get running in 3 steps
Install
pip install electripy-aiPython 3.11+. No system dependencies.
Download the recipe
curl -O https://raw.githubusercontent.com/inference-stack-llc/electripy-ai/main/recipes/quickstart/quickstart.pyOr clone the repo and navigate to recipes/quickstart/.
Run it
python quickstart.pyRuns offline. No API key. No mocks. All five LSAS layers active.
Sync quickstart
5 layers · offlineAll five LSAS layers wired together. Swap FakeProvider for OpenAiSyncAdapter in one line.
# pip install electripy-ai && python quickstart.py
# Runs offline. No API key. No mocks. All five layers active.
import os
from electripy.ai.llm_gateway import LlmGatewaySyncClient, LlmGatewaySettings
from electripy.ai.llm_gateway import LlmMessage, LlmRequest, OpenAiSyncAdapter
from electripy.ai.policy_gateway import PolicyGateway, PolicyRule
from electripy.ai.policy_gateway import PolicyStage, PolicyAction, PolicySeverity
from electripy.ai.policy_gateway import build_llm_policy_hooks
from electripy.concurrency import CircuitBreaker
from electripy.observability.observe import ObservabilityService, InMemoryTracer
from electripy.ai.cost_ledger import CostLedger
# L01 Governance — redact PII before the model sees it
gateway = PolicyGateway(rules=[
PolicyRule(rule_id="pii-email", code="PII_EMAIL",
description="Redact emails in prompts",
stage=PolicyStage.PREFLIGHT,
pattern=r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}",
action=PolicyAction.SANITIZE,
severity=PolicySeverity.MEDIUM),
])
# L03 Reliability — stop cascading failures before they propagate
breaker = CircuitBreaker(failure_threshold=3, recovery_timeout=30.0)
# L02 Observability — structured AI spans with ContextVar propagation
tracer = InMemoryTracer()
obs = ObservabilityService(tracer=tracer)
# L04 Model Runtime — gateway wired to policy hooks
request_hook, response_hook = build_llm_policy_hooks(gateway)
client = LlmGatewaySyncClient(
port=OpenAiSyncAdapter(api_key=os.environ["OPENAI_API_KEY"]),
settings=LlmGatewaySettings(
request_hook=request_hook, response_hook=response_hook
),
)
ledger = CostLedger(cost_per_1k_tokens=0.00015)
# The call — emails are redacted before the model sees them
with obs.start_llm_span(provider="openai", model="gpt-4o-mini") as span:
response = breaker.call(lambda: client.complete(LlmRequest(
model="gpt-4o-mini",
messages=[LlmMessage.user("Escalate to admin@acme.com ASAP")],
)))
span.set_attribute("gen_ai.usage.total_tokens", response.usage_total_tokens)
ledger.record(tokens=response.usage_total_tokens,
labels={"model": "gpt-4o-mini", "feature": "support"})Async quickstart
asyncio · production-gradeSame five layers, fully async. LlmGatewayAsyncClient + async with obs.start_llm_span() — every await is real I/O, not a wrapper.
# pip install electripy-ai
# python recipes/async_quickstart/async_quickstart.py
# Runs offline. No API key. asyncio all the way down.
import asyncio
import re
from dataclasses import dataclass
from electripy.ai.llm_gateway import (
AsyncLlmPort, LlmGatewayAsyncClient, LlmGatewaySettings,
LlmMessage, LlmRequest, LlmResponse,
)
from electripy.ai.policy_gateway import (
PolicyGateway, PolicyRule, PolicyStage, PolicyAction,
PolicySeverity, build_llm_policy_hooks,
)
from electripy.concurrency import CircuitBreaker, CircuitOpenError
from electripy.observability.observe import InMemoryTracer, ObservabilityService
from electripy.ai.cost_ledger import CostLedger
@dataclass
class FakeAsyncProvider(AsyncLlmPort):
async def complete(self, request, *, timeout=None):
await asyncio.sleep(0.01) # simulated I/O
last = request.messages[-1].content
return LlmResponse(text=f"Acknowledged: {last}",
model=request.model, usage_total_tokens=22)
async def breaker_acall(breaker, coro_fn):
"""Async-safe circuit breaker wrapper."""
breaker._before_call()
try:
result = await coro_fn()
breaker._on_success()
return result
except Exception:
breaker._on_failure()
raise
async def main():
gateway = PolicyGateway(rules=[PolicyRule(
rule_id="pii-email", code="PII_EMAIL",
description="Redact emails before model sees them",
stage=PolicyStage.PREFLIGHT,
pattern=r"[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}",
action=PolicyAction.SANITIZE, severity=PolicySeverity.MEDIUM,
)])
breaker = CircuitBreaker(failure_threshold=3, recovery_timeout=30.0)
obs = ObservabilityService(tracer=InMemoryTracer())
ledger = CostLedger(cost_per_1k_tokens=0.00015)
req_hook, res_hook = build_llm_policy_hooks(gateway)
client = LlmGatewayAsyncClient(
port=FakeAsyncProvider(),
settings=LlmGatewaySettings(request_hook=req_hook, response_hook=res_hook),
)
async with obs.start_llm_span(provider="openai", model="gpt-4o-mini") as span:
response = await breaker_acall(breaker, lambda: client.complete(LlmRequest(
model="gpt-4o-mini",
messages=[LlmMessage.user(
"Deploy the hotfix and notify ops@acme.com and cto@acme.com."
)],
)))
span.set_attribute("gen_ai.usage.total_tokens", response.usage_total_tokens)
ledger.record(tokens=response.usage_total_tokens,
labels={"model": "gpt-4o-mini", "feature": "ops"})
print(response.text) # → Acknowledged: Deploy the hotfix and notify [REDACTED] and [REDACTED].
asyncio.run(main())Circuit breaker — failure mode
the system protecting youAfter 3 failures the circuit opens. Attempt 4 never touches the upstream — CircuitOpenError is thrown immediately. This is what stops a flaky model from taking down your whole service.
# Circuit breaker opens after 3 failures — downstream never called again.
# Same pattern works for any provider adapter.
from electripy.concurrency import CircuitBreaker, CircuitOpenError
from electripy.ai.llm_gateway import (
AsyncLlmPort, LlmGatewayAsyncClient, LlmGatewaySettings,
LlmMessage, LlmRequest, LlmResponse,
)
import asyncio
from dataclasses import dataclass
@dataclass
class FlakyProvider(AsyncLlmPort):
"""Simulates an upstream that always times out."""
async def complete(self, request, *, timeout=None):
await asyncio.sleep(0.005)
raise RuntimeError("upstream timeout")
async def breaker_acall(breaker, coro_fn):
breaker._before_call()
try:
result = await coro_fn()
breaker._on_success()
return result
except Exception:
breaker._on_failure()
raise
async def main():
client = LlmGatewayAsyncClient(port=FlakyProvider(),
settings=LlmGatewaySettings())
breaker = CircuitBreaker(failure_threshold=3, recovery_timeout=60.0)
for attempt in range(1, 5):
try:
await breaker_acall(breaker, lambda: client.complete(LlmRequest(
model="gpt-4o-mini", messages=[LlmMessage.user("ping")],
)))
except CircuitOpenError:
print(f"Attempt {attempt}: ⚡ CIRCUIT OPEN — fast-fail, upstream never called")
except RuntimeError as exc:
print(f"Attempt {attempt}: ✗ upstream error ({exc}) [circuit={breaker.state.name}]")
asyncio.run(main())What each layer does
Every layer is independently testable. Swap any one out without touching the others.
Governance
PII redaction before the model sees the prompt
How
PolicyGateway with a PREFLIGHT email-redaction ruleOutput
Escalate to [REDACTED] ASAPObservability
Structured AI spans with ContextVar propagation
How
ObservabilityService + InMemoryTracerOutput
1 span · 1.4msReliability
Circuit breaker — stops cascading failures
How
CircuitBreaker(failure_threshold=3, recovery_timeout=30)Output
CLOSED · 0/3 failuresModel Runtime
Gateway wired to policy + observability hooks
How
LlmGatewaySyncClient + build_llm_policy_hooks()Output
20 tokens · gpt-4o-miniCost Ledger
Token cost tracked per model + feature label
How
CostLedger(cost_per_1k_tokens=0.00015)Output
$0.000003 · 1 callSwap to a real provider — one line
The offline fake provider is identical in interface to the real adapters.
Offline (default)
port=FakeProvider()
Production
port=OpenAiSyncAdapter(api_key=os.environ["OPENAI_API_KEY"]) # or AnthropicSyncAdapter, OllamaSyncAdapter