{"adoption": {"forks": 399, "observed_at": "2026-08-28T04:06:58.540516+00:00", "stars": 2527}, "canonical_url": "https://ross.abutalabs.com/products/bestruirui-octopus", "card": {"archived": false, "artifact_type": "service", "description": "One Hub All LLMs For You | 为个人打造的 LLM API 聚合网关", "domain": ["large-language-models", "apis", "self-hosted", "backend"], "enriched": true, "function": ["api-gateway", "llm-inference", "proxy", "middleware", "analytics", "monitoring"], "health_score": 100, "homepage": null, "language": "TypeScript", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["bestruirui/octopus"], "name": "bestruirui/octopus", "platform": ["self-hosted", "windows", "go"], "pushed_at": "2026-08-26T07:30:38+00:00", "repo": "bestruirui/octopus", "stars": 2527, "tags": ["llm-gateway", "api-aggregation", "openai-compatible", "anthropic", "protocol-conversion", "failover", "claude-code", "codex", "ai-agents", "docker", "web-server", "linux", "macos"], "topics": ["ai", "ai-gateway", "anthropic", "claude", "claude-code", "codex", "openai", "self-hosted", "llm-gateway", "codex-app", "codex-cli", "codex-desktop", "opencode", "pi"], "urls": [], "use_cases": ["aggregate multiple llm providers behind one api endpoint", "convert anthropic api requests to openai format", "self-host an openai-compatible gateway for claude code and codex", "add automatic failover when an llm provider goes down", "track token usage and cost across llm channels", "shield agent tasks from upstream llm errors"], "what_it_is": "Octopus is a self-hosted LLM API aggregation gateway that unifies multiple provider channels behind a single endpoint, converting between OpenAI Chat, OpenAI Responses, and Anthropic API formats. It includes automatic failover, model and price syncing, request visualization, and usage analytics with a web management panel.", "when_to_avoid": ["you need enterprise-grade multi-tenant API management at scale", "you want a fully managed cloud gateway without self-hosting", "you only call a single LLM provider directly", "you need fine-grained team quota and billing features beyond personal use"], "when_to_choose": ["you use multiple LLM providers and want one unified API", "you need protocol conversion between OpenAI and Anthropic formats", "you want a lightweight single-binary or Docker self-hosted gateway", "you need per-request analytics, cost tracking, and failover for LLM traffic"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/bestruirui-octopus", "repo": "bestruirui/octopus", "role": "main", "score": 79}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "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:06:58.540516+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:58.540516+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:25:24.473537+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c404462d41a0ead85d3f7243c02c2b8ff4eba06e9c304d0677573799a4f7f7c1", "fetched_at": "2026-08-28T04:06:58.540516+00:00", "kind": "readme", "missing": false, "url": "https://github.com/bestruirui/octopus"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 20, "rhythm": 87}, "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": 289, "days_push": 7, "days_rel": 8, "gap_med": 0, "n_releases_24m": 80}, "score": 79, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}