Observed since 21 Oct, 11:31 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
aindy-runtime
Self-hostable AI agent execution runtime — syscall contract, DAG flows, vector memory, plugin registry
A self-hosted execution substrate for AI systems — the layer beneath your agents, workflows and applications, running on your own database.
Work is durable. A run suspends as a first-class lifecycle state, survives a restart, and resumes where it stopped — not replayed from the beginning.
Work is governed. Approval does not merely permit a run; it mints a signed, scoped capability token bound to that run, that user and that plan. Tools are capability-gated, delegation can only narrow authority, and side effects pass a ledgered boundary you can make at-most-once.
And work accumulates. Every execution records what it knew going in and what it produced going out, into an addressable memory space that is scored and fed back into the next decision — so the tenth run is not the first run again.
The runtime is the substrate; your domain logic mounts on top as a plugin package or over the HTTP SDK. A bare install gives you the execution layer and the operator surfaces, not a finished application — see Building apps on aindy-runtime.
Deployable in minutes via Docker Compose. Extensible via a Python plugin registry. Operable
via a built-in platform UI and a REST API backed by the aindy-sdk.
What it gives you:
/memory/{tenant}/{namespace}/{type}/{id}), scored on impact, usage and causal depth,
and joined to execution — each ExecutionUnit carries memory_context_ids and
output_memory_ids, so what a run knew going in and produced going out is answerable from
one row. Backed by pgvector, with an optional native scoring path (a Rust cdylib with a C++
semantic kernel) and a Python fallback pinned equal by parity testspending | executing | waiting | resumed | completed | failed), where waiting and
resumed are distinct so an audit query can tell a fresh run from a resumptionSyscallDispatcher entry point with schema validation, idempotency gates, and tenant isolation/platform)register_connector plus a capability-enforced egress boundary: recipient/domain allow-lists, per-capability rate limits, and just-in-time secrets from a broker rather than app configaindy-runtime mcp-server (opt-in, [mcp] extra).nodus / .nd), with memory builtins and WAIT/RESUME propagation back into the flow enginesys.v1.agent.undo to walk back a run's recorded side effects, plus sys.v1.agent.simulate for zero-side-effect rehearsal against virtual toolsaindy-runtime sandbox), and an append-only audit logPOST /memory/federated/recall, dispatched through the syscall contractThe runtime was built as the execution layer beneath a closed-loop system — the Infinity Algorithm, whose support layer needs real behaviour observed, converted into signals, fed into scoring, and used to adjust what runs next:
observe → score → adjust → execute → observe
Building that pushed the loop's primitives down into the runtime as generic mechanisms,
rather than leaving them in the application. They are ordinary runtime event types
(AINDY/core/system_event_types.py) and a runtime-owned observation service, so any system
mounted on the runtime inherits them without writing any of it:
| Loop stage | Runtime primitive |
|---|---|
| observe | the watcher — platform_layer/watcher_service.py, routes/watcher_router.py |
| recall | recall.used |
| score | score.computed |
| adjust | next_action.chosen |
| execute | next_action.dispatched |
The division is deliberate and holds for any consumer: the application owns the formulas; the runtime owns the loop. Scoring functions, KPI weighting and policy are domain logic and belong in your app. Observation, the signal path, the causal record, durable re-execution and the provenance that ties them together are substrate concerns.
For the full statement of what the runtime is and what a consumer inherits — including where
the claims stop — see docs/runtime/WHAT_THE_RUNTIME_IS.md.
Stability: public surfaces declared under docs/runtime/ (PUBLIC_RUNTIME_SURFACES.md, RUNTIME_STABILITY_INDEX.md) are stable. Extension and
orchestration surfaces marked experimental may change between minor versions. In-process
extensions require trusted code — this is not a sandboxed third-party plugin host.
Prerequisites: Docker Desktop (or Docker Engine + Compose plugin v2.20+).
# 1. Clone
git clone https://github.com/Masterplanner25/aindy-runtime.git
cd aindy-runtime
# 2. Configure
cp AINDY/.env.example AINDY/.env
# Open AINDY/.env and set at minimum:
# SECRET_KEY — generate: python3 -c "import secrets; print(secrets.token_hex(32))"
# OPENAI_API_KEY
# 3. Start
docker compose up -d
# 4. Run migrations + wait for ready
# (alembic upgrade head runs automatically inside the api container on boot)
# Watch progress:
docker compose logs -f api
# 5. Verify
curl http://localhost:8000/ready # → {"status": "ok", ...}
# 6. Visit the platform UI
# http://localhost:8000/platform
Production-shaped deployment (Redis + distributed worker):
docker compose --profile full up -d
With metrics (Prometheus on port 9090):
docker compose --profile full --profile monitoring up -d
Cloud / remote VM with nginx + TLS (ports locked down, HTTPS):
NGINX_CONF=nginx.tls.conf \
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
--profile full --profile proxy up -d
See Remote deployment below for the full TLS checklist.
Once curl http://localhost:8000/ready returns {"status": "ok"}, create your first account and API key:
# Register. Returns 202 with NO token — registration does not log you in.
# Passwords must be at least 8 characters.
curl -s -X POST http://localhost:8000/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "password": "yourpassword", "username": "you"}' \
| python -m json.tool
# Log in — copy access_token from the response
curl -s -X POST http://localhost:8000/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "password": "yourpassword"}' \
| python -m json.tool
# Promote yourself to admin (needed to create Platform API keys).
# For a compose deployment the CLI lives in the container, not on the host:
# docker compose exec api aindy-runtime auth promote-admin you@example.com
aindy-runtime auth promote-admin you@example.com
# Create a Platform API key (save the 'key' field — shown only once).
# Unknown scopes are rejected with 422 — see the table below for the full set.
curl -s -X POST http://localhost:8000/platform/keys \
-H "Authorization: Bearer <your-jwt>" \
-H "Content-Type: application/json" \
-d '{"name": "my-app", "scopes": ["memory.read", "memory.write", "flow.execute", "event.emit"]}' \
| python -m json.tool
API key scopes — the complete set. Anything else is a 422:
| Scope | Grants |
|---|---|
flow.read / flow.execute | Read flow definitions and runs / dispatch sys.v1.flow.run |
memory.read / memory.write / memory.delete | Recall, write, and hard-delete memory nodes — delete is not implied by write |
agent.run | Create and execute agent runs |
execution.read | Read execution units, metrics, and observability surfaces |
event.emit | Emit events through the syscall contract |
webhook.manage | Manage webhook subscriptions |
platform.admin | Full platform administration |
Registration returns
202and no token. It does not log you in. If an email channel is configured it sends a verification link. This is deliberate: a response that differed between "created" and "already exists" would be an account-enumeration oracle. Log in separately for a token. Verification is not required to log in unless you setAINDY_REQUIRE_VERIFIED_LOGIN=true.
Then install the SDK and make your first call:
pip install aindy-sdk
from aindy_sdk import AINDYClient
client = AINDYClient("http://localhost:8000", api_key="aindy_your_key")
registry = client.syscalls.list()
print(registry["total_count"], "syscalls available")
Full SDK documentation and examples: aindy-sdk
Three integration patterns, listed by increasing coupling:
1. SDK (external HTTP) — Any service that can make HTTP requests can integrate
via Platform API keys. Install aindy-sdk, create a key with the scopes you need,
and use AINDYClient. See After the server starts above.
2. Agent runs — Submit agent objectives via POST /apps/agent/run. The runtime
executes the objective through its flow engine. No in-process code needed — just an
authenticated HTTP call with a capability token. Note: the /apps/agent/run route
itself is registered by the app plugin layer (pattern 3), not the bare runtime — a
plugin bootstrap such as aindy-apps-monolith must be mounted for this endpoint to
exist.
3. Trusted Python extensions (in-process) — Set
AINDY_TRUST_EXTERNAL_PYTHON_EXTENSIONS=true to load a Python package into the
runtime process at startup. Extensions register routers, flows, jobs, syscalls, and
event handlers through the plugin registry. Any trusted Python package that ships
a schema-valid aindy_plugins.json manifest can plug in this way — point the runtime
at it with AINDY_APP_PLUGIN_MANIFEST=/path/to/aindy_plugins.json, or let it discover
an aindy_plugins.json in the working directory. The plugin layer is not tied to any
particular app package; aindy-apps-monolith is the first-party reference
implementation, not a required dependency.
Reference implementation: aindy-apps-monolith
contains 16 working domain apps built on this pattern. The canonical how-to doc is
docs/architecture/PLUGIN_REGISTRY_PATTERN.md
— it covers every registration category the registry exposes, boot-order dependency
declarations, and a step-by-step guide for adding a new domain app.
Trust posture note: option 3 is a trusted-internal mechanism. It does not sandbox extension code. Do not use it to load untrusted third-party packages.
Note — database host inside compose: The
DATABASE_URLinAINDY/.envmust use the compose service name as the host, notlocalhost:DATABASE_URL=postgresql://aindy:aindy@postgres:5432/aindy
postgresresolves on the compose network;localhostdoes not.
Note — pgvector required: The compose file uses
pgvector/pgvector:pg16instead of the stockpostgres:16-alpine. The runtime stores memory embeddings asVECTOR(1536)columns, which requires the PostgreSQLpgvectorextension.docker/init-pgvector.sqlrunsCREATE EXTENSION IF NOT EXISTS vectoron first initialization. If you bring your own PostgreSQL instance, run that statement once before first boot.
Note — published database ports:
postgres(5432),redis(6379), andmongo(27017) publish to the host for local development convenience. For production deployments on a cloud VM, remove theports:blocks from those services or use a compose override file. SeeTECH_DEBT: COMPOSE-PROD-PORTS-1.
pip install aindy-runtime
Import name: The distribution name is aindy-runtime but the importable module is AINDY
(uppercase — it is an acronym). import aindy_runtime will not work.
The native memory scorer is a build-from-source accelerator, not something you install.
aindy-runtime publishes a pure-Python py3-none-any wheel, so installed users run the
Python scoring path — which is the supported configuration, not a degraded one.
The optional Rust scorer (AINDY/memory/native/memory_bridge_rs, a cdylib via pyo3) is
not shipped compiled, deliberately: a .pyd/.so/.dylib is specific to one OS,
architecture and CPython version, and putting one inside a py3-none-any wheel would install
a broken binary for everyone on a different combination. AINDY/memory/native_bridge.py looks
for a built artifact and falls back to Python when it finds none, so nothing breaks either way.
The source ships in the sdist (Cargo.toml, Cargo.lock, build.rs, src/*.rs), so it
can be built locally — see AINDY/memory/native/memory_bridge_rs/BUILD.md. Before investing in
per-platform wheels, measure: no benchmark comparing the native scorer against the Python one
exists in this repo, and that measurement should come first.
from AINDY._version import __version__ # correct
from AINDY.platform_layer.deployment_contract import deployment_contract_summary
# import aindy_runtime ← ImportError
For local development (editable install from source):
python -m pip install -e .
For staged release builds:
python -m pip install -e .[release]
aindy-runtime init Scaffold AINDY/.env (with generated SECRET_KEY), Dockerfile,
docker-compose.yml, and docker/init-pgvector.sql for a new install
aindy-runtime serve Start the HTTP API server (requires DATABASE_URL)
aindy-runtime sandbox Report sandbox capabilities and exit
aindy-runtime bootstrap-schema Create runtime-owned tables from packaged metadata
and stamp the Alembic baseline (idempotent; requires DATABASE_URL)
aindy-runtime mcp-server Serve AINDY syscalls as an MCP server over stdio for external
MCP clients (needs the [mcp] extra; read-only by default)
aindy-runtime auth promote-admin <email> Grant admin to a registered user (grant-only)
aindy-runtime --help Show help and exit
aindy-runtime --version Show version and exit
Runtime-only API boot:
aindy-runtime serve
Minimum runtime environment:
DATABASE_URL=postgresql://USER:PASSWORD@HOST:5432/DBNAME
SECRET_KEY=...
OPENAI_API_KEY=sk-...
For local smoke tests only, SQLite remains opt-in and must be declared explicitly:
DATABASE_URL=sqlite://
AINDY_ALLOW_SQLITE=1
SECRET_KEY=runtime-local-secret-key
OPENAI_API_KEY=sk-test-placeholder
Equivalent module and ASGI forms:
python -m AINDY.runtime_only serve
uvicorn AINDY.runtime_only:app
pip install --upgrade aindy-runtime
Verify the new version:
aindy-runtime --version
# or, while the server is running:
curl http://localhost:8000/api/version
If this release includes a schema change, set AINDY_SCHEMA_RECONCILE=true
before restarting. The startup log will tell you whether reconciliation is
needed; if AINDY_ENFORCE_SCHEMA=true is set, the server will refuse to start
rather than silently run against a mismatched schema.
AINDY_SCHEMA_RECONCILE=true aindy-runtime serve
Once the server confirms a clean startup you can unset the flag.
# The api service builds locally (`build: .`) rather than pulling a published image,
# so `docker compose pull` has nothing to fetch. Rebuild instead:
docker compose build --no-cache api # picks up the aindy-runtime pin in the Dockerfile
docker compose up -d # recreate containers
The Dockerfile installs a pinned aindy-runtime==X.Y.Z from PyPI, so bump that pin to the
version you want before rebuilding. The Platform UI ships inside that wheel as package
data rather than being built by the Dockerfile, so a container serves the UI belonging to
the pinned version — not your working tree.
If the release bumps the schema, set the reconcile flag in AINDY/.env before
restarting, then remove it after the first clean boot.
pip install "aindy-runtime==<previous-version>"
# or, for Docker:
docker compose down && docker compose up -d # after reverting the image tag in docker-compose.yml
Rolling back across a schema change requires a database restore — schema migrations are not automatically reversed on downgrade.
For cloud VM or any deployment where a domain name and HTTPS are required.
The proxy profile brings up an nginx container on ports 80 and 443 that
forwards all traffic to the api container. The docker-compose.prod.yml
overlay closes all internal port bindings so nothing is reachable from
outside the host except nginx.
Suitable for AWS ALB, GCP Load Balancer, Cloudflare Proxy, etc. that terminate TLS and forward plain HTTP to the backend.
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
--profile full --profile proxy up -d
Set ALLOWED_ORIGINS=https://yourdomain.com in AINDY/.env.
# 1. On the host — obtain a certificate (certbot must be installed)
certbot certonly --standalone -d yourdomain.com
# 2. Edit nginx/nginx.tls.conf — replace `server_name _;` with your domain:
# server_name yourdomain.com;
# 3. Mount your certs — create docker-compose.override.yml:
cat > docker-compose.override.yml << 'EOF'
services:
nginx:
volumes:
- /etc/letsencrypt/live/yourdomain.com/fullchain.pem:/etc/nginx/certs/fullchain.pem:ro
- /etc/letsencrypt/live/yourdomain.com/privkey.pem:/etc/nginx/certs/privkey.pem:ro
EOF
# 4. In AINDY/.env set:
# ALLOWED_ORIGINS=https://yourdomain.com
# 5. Start
NGINX_CONF=nginx.tls.conf \
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
--profile full --profile proxy up -d
Certificate renewal — add to host cron (crontab -e):
0 3 * * * certbot renew --quiet && docker compose exec nginx nginx -s reload
| Profile combination | Ports exposed to host |
|---|---|
| Default (no overlay) | 8000 (api), 5432, 6379, 27017 |
+ docker-compose.prod.yml | 8000 (api) only |
+ proxy profile | 8000 (api), 80, 443 |
+ proxy + docker-compose.prod.yml | 80, 443 only |
aindy-runtime owns the execution substrate: the runtime kernel, flow engine, memory
system, agent runtime, syscall registry, platform UI, and all stable operator surfaces
declared under docs/runtime/.
App-layer code (apps/, aindy_plugins.json, app-profile Alembic migrations) lives in a
plugin package, not this repo — any package that implements the plugin manifest can serve
that role. A.I.N.D.Y.'s own apps live in
aindy-apps-monolith, the
first-party reference that demonstrates the plugin pattern at scale across 16 domain apps.
Full boundary definition: docs/runtime/RUNTIME_BOUNDARY.md
Active contribution model for this repo:
mainmainmainThis repo does not use the archived monolith develop-targeting flow.
python -m pytest \
tests/unit/test_runtime_only_test_fixtures.py \
tests/unit/test_platform_only_startup.py \
tests/unit/test_runtime_packaging.py \
tests/unit/test_runtime_boundary.py \
tests/unit/test_runtime_compatibility_metadata.py \
tests/api/test_version_api.py \
-m runtime_only -q
Runtime CI scope in .github/workflows/runtime-ci.yml now covers the
runtime-owned push/PR baseline:
docs/{runtime,operations,governance,upgrades,handoffs,design}/apps.*aindy-runtime console scriptGET /health and GET /api/version in runtime-only modetests -m runtime_only)twine checkGitHub Actions note:
runtime-ci.yml is the automatic push/PR check for mainrelease-staging.yml is intentionally manual-only (workflow_dispatch) and
will not appear as a normal push/PR status check until it is dispatchedStaged release flow in .github/workflows/release-staging.yml is intentionally
non-publishing:
twine checkChecks intentionally left out of the runtime repo because they remain app- or monolith-owned:
The extracted runtime is self-hostable for its own database surface.
AINDY_SCHEMA_RECONCILE=true before mutating an initialized databaseAINDY_ENFORCE_SCHEMA=trueBlessed deploy primitive — aindy-runtime bootstrap-schema. A deploy entrypoint
that wants a clean ownership split (rather than replaying the full app migration
history onto a fresh database) can run:
aindy-runtime bootstrap-schema # idempotent; requires DATABASE_URL + pgvector
This does two things the server also does at startup, but as an explicit, standalone,
idempotent step: (a) builds the runtime-owned tables from packaged ORM metadata —
scoped to the runtime's own table set, never app tables — and (b) stamps the runtime's
alembic_version_runtime table to the runtime head revision. Step (b) is the half an
app-side bootstrap cannot do correctly: it gives a create_all-built database a proper
Alembic baseline, so a later runtime schema upgrade migrates from a stamped line instead
of replaying the whole chain onto live tables. The recommended split is:
aindy-runtime bootstrap-schema # runtime tables + runtime Alembic baseline
# then, in the app deploy step: build only the app-owned tables
Pass --reconcile to also apply additive column/index fixes if the runtime schema is
out of date. On an already-current database the command is a no-op that re-stamps the
same head.
Documentation is split by the question it answers — see docs/README.md
for the map. In short: docs/runtime/ is what the runtime guarantees,
docs/operations/ is how to run it (start with
QUICKSTART.md), docs/governance/ is
how work is done on this repo, and docs/upgrades/ is what
changes between releases.
Release staging guidance lives in docs/governance/RELEASE_STAGING.md.
CI ownership guidance lives in docs/governance/CI_OWNERSHIP.md.
Deployment topology guidance lives in docs/operations/DEPLOYMENT_PROFILES.md.
Manual GitHub branch-protection and review settings guidance lives in
docs/governance/GITHUB_SETTINGS_CHECKLIST.md.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
annotated-docEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | annotated-doc==0.0.5 | runtime |
annotated-typesEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | annotated-types==0.8.0 | runtime |
anyioEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | anyio==4.15.1 | runtime |
apschedulerEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | apscheduler==3.11.3 | runtime |
bcryptEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | bcrypt==4.0.1 | runtime |
certifiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | certifi==2026.7.22 | runtime |
charset-normalizerEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | charset-normalizer==3.5.2 | runtime |
clickEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | click==8.5.0 | runtime |
cloudpickleEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | cloudpickle==3.1.2 | runtime |
coloramaEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | colorama==0.4.6 | runtime |
distroEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | distro==1.9.0 | runtime |
dnspythonEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | dnspython==2.8.0 | runtime |
fastapiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | fastapi==0.141.1 | runtime |
fastapi-cache2Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | fastapi-cache2==0.2.2 | runtime |
greenletEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | greenlet==3.5.6 | runtime |
h11Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | h11==0.16.0 | runtime |
httpcoreEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | httpcore==1.0.9 | runtime |
httpxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | httpx==0.28.1 | runtime |
idnaEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | idna==3.19 | runtime |
jinja2Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | jinja2==3.1.6 | runtime |
jiterEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | jiter==0.17.0 | runtime |
joblibEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | joblib==1.6.0 | runtime |
alembicEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | alembic==1.19.2 | runtime |
MakoEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | Mako==1.4.3 | runtime |
MarkupSafeEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | MarkupSafe==3.0.3 | runtime |
nodus-langEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | nodus-lang==5.15.0 | runtime |
numpyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | numpy==2.4.6 | runtime |
limitsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | limits==5.8.0 | runtime |
openaiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | openai==2.46.0 | runtime |
packagingEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | packaging>=24.0 | runtime |
opentelemetry-apiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-api==1.45.1 | runtime |
opentelemetry-exporter-otlp-proto-grpcEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-exporter-otlp-proto-grpc==1.45.1 | runtime |
opentelemetry-instrumentation-fastapiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-instrumentation-fastapi==0.66b1 | runtime |
opentelemetry-sdkEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-sdk==1.45.1 | runtime |
passlibEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | passlib==1.7.4 | runtime |
pendulumEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pendulum==3.2.0 | runtime |
pgvectorEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pgvector==0.4.2 | runtime |
prometheus-fastapi-instrumentatorEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | prometheus-fastapi-instrumentator==8.1.0 | runtime |
psycopg2Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | psycopg2==2.9.13 | runtime |
pydanticEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pydantic==2.14.0 | runtime |
pydantic-settingsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pydantic-settings==2.15.0 | runtime |
pymongoEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pymongo==4.18.2 | runtime |
pyphenEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pyphen==0.18.1 | runtime |
python-dateutilEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | python-dateutil==2.9.0.post0 | runtime |
python-dotenvEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | python-dotenv==1.2.3 | runtime |
PyJWTEnvironment{
"extras": "crypto",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | PyJWT[crypto]==2.15.1 | runtime |
cryptographyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | cryptography==50.0.1 | runtime |
python-json-loggerEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | python-json-logger==4.2.0 | runtime |
redisEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | redis==8.1.0 | runtime |
regexEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | regex==2026.9.29 | runtime |
requestsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | requests==2.34.2 | runtime |
sixEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | six==1.17.0 | runtime |
slowapiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | slowapi==0.1.10 | runtime |
sniffioEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | sniffio==1.3.1 | runtime |
SQLAlchemyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | SQLAlchemy==2.0.52 | runtime |
starletteEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | starlette==1.7.0 | runtime |
tenacityEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | tenacity==9.1.4 | runtime |
tqdmEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | tqdm==4.70.1 | runtime |
typing-inspectionEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | typing-inspection==0.4.4 | runtime |
typing_extensionsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | typing_extensions==4.16.0 | runtime |
tzdataEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | tzdata==2026.3 | runtime |
tzlocalEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | tzlocal==5.4.4 | runtime |
urllib3Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | urllib3==2.8.0 | runtime |
uvicornEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | uvicorn==0.54.0 | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest==9.1.1; extra == "test" | runtime |
pytest-asyncioEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest-asyncio==1.4.0; extra == "test" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest-cov==7.1.0; extra == "test" | runtime |
pytest-mockEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest-mock==3.15.1; extra == "test" | runtime |
respxEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | respx==0.23.1; extra == "test" | runtime |
buildEnvironment{
"extras": "",
"marker": "extra == \"release\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | build==1.6.1; extra == "release" | runtime |
twineEnvironment{
"extras": "",
"marker": "extra == \"release\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | twine==7.0.0; extra == "release" | runtime |
sentence-transformersEnvironment{
"extras": "",
"marker": "extra == \"embeddings-local\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | sentence-transformers>=2.2.0; extra == "embeddings-local" | runtime |
anthropicEnvironment{
"extras": "",
"marker": "extra == \"anthropic\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | anthropic>=0.40.0; extra == "anthropic" | runtime |
nodus-mcpEnvironment{
"extras": "",
"marker": "extra == \"mcp\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | nodus-mcp>=0.1.4; extra == "mcp" | runtime |
mcpEnvironment{
"extras": "",
"marker": "extra == \"mcp\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mcp>=1.0.0; extra == "mcp" | runtime |
uvicornEnvironment{
"extras": "",
"marker": "extra == \"mcp\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | uvicorn>=0.30.0; extra == "mcp" | runtime |
starletteEnvironment{
"extras": "",
"marker": "extra == \"mcp\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | starlette>=0.37.0; extra == "mcp" | runtime |
pip-auditEnvironment{
"extras": "",
"marker": "extra == \"security\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pip-audit>=2.7.0; extra == "security" | runtime |
bcryptEnvironment{
"extras": "",
"marker": "extra == \"security\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | bcrypt>=4.0.1; extra == "security" | runtime |
passlibEnvironment{
"extras": "",
"marker": "extra == \"security\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | passlib>=1.7.4; extra == "security" | runtime |
PyJWTEnvironment{
"extras": "",
"marker": "extra == \"security\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | PyJWT>=2.15.1; extra == "security" | runtime |
setuptoolsEnvironment{
"extras": "",
"marker": "extra == \"security\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | setuptools>=83.0.0; extra == "security" | runtime |
bdist_wheel · 1,434.36 KB · Python py3
sdist · 1,635.95 KB · Python source
Shared repository data · GitHub
Observed since 21 Oct, 11:31 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:b13146cbff716b080c178613d38be099fe01d474d5957cdda8833861ea4b88d4