{"adoption": {"forks": 1281, "observed_at": "2026-08-28T04:05:45.061902+00:00", "stars": 1857}, "canonical_url": "https://ross.abutalabs.com/products/wechat-ai", "card": {"archived": false, "artifact_type": "service", "description": "WeChat AI - 自托管微信角色扮演对话服务", "domain": ["chatbots", "artificial-intelligence", "large-language-models", "messaging-platforms", "self-hosted", "web-development"], "enriched": true, "function": ["chatbot", "agent-framework", "llm-inference", "self-hosted", "web-framework", "caching"], "health_score": 100, "homepage": null, "language": "TypeScript", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["SMNETSTUDIO/WeChat-AI"], "name": "SMNETSTUDIO/WeChat-AI", "platform": ["self-hosted", "cloud"], "pushed_at": "2026-08-26T04:56:01+00:00", "repo": "SMNETSTUDIO/WeChat-AI", "stars": 1857, "tags": ["wechat", "roleplay", "ilink", "redis", "oauth", "linuxdo", "persona", "sticker", "multi-node", "cloudflare-worker", "nodejs", "docker", "web-server"], "topics": [], "urls": [], "use_cases": ["run a self-hosted AI roleplay chatbot on WeChat", "connect WeChat bots to OpenAI-compatible LLMs", "manage multiple WeChat bot personas with an admin dashboard", "relay messages between WeChat users and AI personas", "deploy a multi-node chatbot service with load balancing", "add sticker and image replies to a WeChat AI bot", "track daily token usage for LLM chatbots"], "what_it_is": "A self-hosted WeChat roleplay chatbot service written in TypeScript that connects directly to Tencent iLink, stores data in remote Redis, and authenticates users via LINUX DO OAuth. It supports persona assignment, P2P chat relaying, sticker replies, voice transcription, OpenAI-compatible LLMs, visual Chatflow orchestration, and multi-node deployment behind a Cloudflare Worker load balancer.", "when_to_avoid": ["you need a general-purpose WeChat customer-service bot without roleplay features", "you cannot use LINUX DO OAuth or a remote Redis instance", "you need official WeChat API integration rather than direct iLink connectivity", "you want a simple single-file bot script instead of a full service"], "when_to_choose": ["you want a self-hosted WeChat AI chatbot with persona/roleplay support", "you need multi-node deployment with shared Redis state and load balancing", "you want admin tooling for bots, users, token usage, and sticker moderation", "you rely on LINUX DO OAuth for user identity"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/wechat-ai", "repo": "SMNETSTUDIO/WeChat-AI", "role": "main", "score": 68}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "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:05:45.061902+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.061902+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:16:14.768556+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "474f75a1c273c97549967665c38f7a2b5316d1977d990ee33f9cb991fe4aff5e", "fetched_at": "2026-08-28T04:05:45.061902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/SMNETSTUDIO/WeChat-AI"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 1, "rhythm": 65}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["young"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 23, "days_push": 7, "days_rel": 20, "gap_med": null, "n_releases_24m": 1}, "score": 68, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}