{"adoption": {"forks": 167, "observed_at": "2026-08-28T04:07:45.556028+00:00", "stars": 3132}, "canonical_url": "https://ross.abutalabs.com/products/opyrator", "card": {"archived": false, "artifact_type": "library", "description": "🪄 Turns your machine learning code into microservices with web API, interactive GUI, and more.", "domain": ["machine-learning", "web-development", "developer-tools", "apis"], "enriched": true, "function": ["api-framework", "web-framework", "deployment", "microservices", "ui-components"], "health_score": 80, "homepage": "https://opyrator-playground.mltooling.org", "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "experimental", "member_repos": ["ml-tooling/opyrator"], "name": "ml-tooling/opyrator", "platform": ["python", "self-hosted"], "pushed_at": "2026-08-25T02:35:35+00:00", "repo": "ml-tooling/opyrator", "stars": 3132, "tags": ["fastapi", "streamlit", "pydantic", "faas", "serverless", "type-hints", "openapi", "function-as-a-service", "docker", "web-server"], "topics": ["fastapi", "streamlit", "pydantic", "python", "microservices", "serverless", "faas", "functions", "python-functions", "machine-learning", "deployment", "type-hints"], "urls": [], "use_cases": ["turn python functions into rest apis", "deploy machine learning models as microservices", "auto-generate a web ui for a python function", "package python code as a docker image for serving", "quickly prototype ml model demos with an api and gui", "share python functions as self-contained executable services"], "what_it_is": "Opyrator is a Python library that turns plain Python functions into production-ready microservices with an auto-generated HTTP API (FastAPI) and interactive web UI (Streamlit). Services can be exported as portable executable files or Docker images and are built on OpenAPI, JSON Schema, and Python type hints.", "when_to_avoid": ["you need a production-hardened, actively maintained framework - it is explicitly an alpha for experimental use", "you require fine-grained control over API design, auth, or complex multi-endpoint services", "your workload doesn't fit the single-function input/output model"], "when_to_choose": ["you want to expose Python functions as HTTP APIs with minimal boilerplate", "you need a quick interactive UI for demos of ML models or functions", "you want portable, shareable service artifacts (files or Docker images) built on OpenAPI standards"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/opyrator", "repo": "ml-tooling/opyrator", "role": "main", "score": 67}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.556028+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:26:08.603485+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "df965fa6c34c9ec18faad9348c3862bc42b2c9ccf3409e11781cf27fc09a3577", "fetched_at": "2026-08-28T04:07:45.556028+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ml-tooling/opyrator"}, {"content_hash": "160bbb74abb869356ffd69b52e975f0a82b9741b14eea26fdc723ebd1ec0ce1f", "fetched_at": "2026-08-29T09:40:56.911555+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/opyrator/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-03T02:39:23.370411+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1975, "days_push": 9, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 67, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}