DeepSeek Harness Remote
DeepSeek Harness Remote 可将手机或另一台电脑与你运行 DeepSeek Harness 的电脑安全连接,随时随地继续你的工作,方便随时查看进度并继续工作。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Share a game link on Telegram — a trailer, a review, or a store page — and it lands in your Notion "To Play" database, fully tagged: developer, genres, platforms, release date, a store link, a review, and how hyped you are.
The hard part isn't the Telegram plumbing — it's turning a messy, ambiguous link into
correct, structured data. A YouTube title like "over the hill – Steam Next Fest Demo Trailer" has to become the right game (not the playtest, not a same-named game), with a
release date you can trust and a review link that points at the correct title. This bot
resolves that by combining several free data sources and trusting each only for what it's
actually authoritative about.
flowchart LR
U["📱 Telegram<br/>trailer · review · store link"] --> V["Vercel<br/>FastAPI webhook"]
V --> M["metadata<br/>page title/desc<br/>+ Jina Reader for JS pages"]
M --> P{"analyse_game_link"}
P -->|"on Steam"| S["Steam appdetails<br/>name · dev · genres · date"]
P -->|"enrich / fallback"| I["IGDB<br/>console platforms"]
P -->|"last resort"| G["Groq LLM"]
S --> D["discovery<br/>store · review · trailer"]
I --> D
G --> D
D --> C["🎮 confirmation card<br/>+ hype rating"]
C -->|"button tap"| N[("Notion<br/>To Play")]
pipeline.analyse_game_link resolves each field from the source that's actually
authoritative for it:
| Source | Trusted for | Why |
|---|---|---|
| Steam store API | name, developer, genres, release date | The appid is unambiguous, so there's no wrong-game risk. Found from the URL, or by an exact-name search that skips playtests/demos. |
| IGDB | console platforms; time to beat; whole-game fallback | Steam only reports desktop. IGDB fills in Switch/PS/Xbox — but only when its match is clearly the same game. |
| Groq (LLM) | last-resort extraction | For the rare game neither store recognises. |
| Jina Reader | rendering JS-heavy pages | Xbox/Nintendo/PlayStation/Instagram return a shell page to a plain fetch; Jina renders them so we get the real title + store date. |
| Metacritic / Steam / DuckDuckGo | review + trailer links | Metacritic's slug is deterministic; Steam's own reviews page is a guaranteed-correct fallback for unreleased games. |
Release dates are never fabricated. A precise day is only written when Steam, an IGDB exact entry, or the store page provides one. A game known only to the year/quarter ("Q1 2026", "Coming soon") is saved as Unreleased with no invented date — an early version guessed dates and got them wrong, so the rule is now "exact or nothing".
Every enrichment layer is optional. With no IGDB/Groq/Jina keys the bot still resolves any game that's on Steam; each missing source just removes one fallback.
The whole backend is the game_bot package; api/index.py is a thin Vercel entrypoint.
game_bot/
├── config.py env vars + shared constants
├── text_utils.py JSON / string helpers (incl. tolerant LLM-JSON parsing)
├── telegram.py Telegram Bot API calls
├── llm.py Groq chat-completions client
├── metadata.py page-metadata fetch (+ Jina Reader JS fallback)
├── mapping.py genre / platform / date / title normalisation
├── steam.py Steam store API (appdetails + search)
├── igdb.py IGDB game-database client
├── discovery.py store-page / review / trailer lookups
├── pipeline.py analyse_game_link — orchestrates the sources
├── notion.py persist a game to the "To Play" database
└── bot.py FastAPI app, webhook, and interaction handlers
api/index.py Vercel entrypoint (re-exports game_bot.bot:app)
tests/ unit + integration tests (HTTP mocked with respx)
Python · FastAPI · httpx (async) · Vercel serverless · Notion API · Groq (LLM) · IGDB · Steam store API · Jina Reader · pytest + respx.
pip install -r requirements.txt -r requirements-test.txt
cp .env.example .env # fill in the required keys (see below)
Required: GROQ_API_KEY, NOTION_API_KEY, NOTION_DB_GAME, SECRET_KEY,
TELEGRAM_BOT_TOKEN, TELEGRAM_USER_ID.
Optional: TWITCH_CLIENT_ID/TWITCH_CLIENT_SECRET (IGDB), JINA_API_KEY,
GROQ_MODEL_FAST/GROQ_MODEL_CHAT. See .env.example.
The Notion integration must be shared with the "To Play" database. Its schema:
Name (title), Developer (text), Genre / Platform (multi-select), Status /
Hype (select), Release Date (date), Time to Beat (number, hours), Installed (checkbox), Store / Review / Video (url).
The site root (public/index.html) is a read-only dashboard over the same Notion database:
stats, "now playing / up next / coming soon" shelves, search, genre/platform/status filters,
sorting, and cards with Steam artwork. It reads GET /api/games, which queries Notion
server-side (the Notion token never reaches the browser) and requires the SECRET_KEY in an
x-secret-key header — the page asks for it once and keeps it in localStorage.
Open /?demo to preview the UI with sample data.
uvicorn game_bot.bot:app --reload # run locally
pytest -q # 120+ tests, all HTTP mocked
Deploys to Vercel on push (api/index.py is the function). Point your Telegram
webhook at https://<deployment>/api/telegram.
safe_json_loads repairs common malformed-JSON cases and the
caller retries once, so a single bad completion can't drop a save.