new-term-radar
Daily radar for new AI terms: names of new models, products and repos, caught on X, Hugging Face, GitHub and sitemaps before keyword tools list them.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A lead qualifier: Next.js, Trigger.dev, OpenRouter, Supabase auth and history, Stripe billing (test mode)
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A full-stack app that takes a sales lead (name, company, role, budget, need, timeline, source, notes) and returns a structured verdict: qualified or not, a score out of 100, the reasoning, red flags and a suggested next step. Auth, saved history and a free/Pro billing tier are built in. It is a portfolio project: the point is a complete, deployed agent-style workflow, not a production CRM.
Live demo: https://lead-qualifier-taupe.vercel.app (create a free account to try it; use fictional data only)
Left to right: the lead form, a result for the spam sample, and the private history (phone width, dark mode).
Small teams get inbound leads of very uneven quality: real buyers, vague students, spam. Reading each one and deciding whether it deserves a sales call is slow and inconsistent. This app applies one written set of criteria to every lead and explains its answer, so a human can skim the verdict and spend time only on the good ones.
qualified, score, reasoning, next_step, red_flags.Browser form
| POST /api/analyze
v
Next.js route (Vercel, server-side) --tasks.trigger--> Trigger.dev task "qualify-lead"
^ |
| GET /api/runs/:id (polled) v
+-------------------- result JSON <------------------ OpenRouter (LLM)
Supabase: auth + lead_history + subscriptions Stripe (test mode): Checkout, portal, webhook
frontend/): Next.js App Router on Vercel. A proxy (frontend/proxy.ts) sends logged-out visitors to /login, and each API route checks the user again.tools/): a Trigger.dev task validates the lead with zod, calls the LLM through OpenRouter, validates the JSON it returns, and hands it back. The prompt lives in its own file (tools/prompt.ts).lead_history and subscriptions tables. Row-level security limits users to their own rows (supabase/schema.sql, supabase/billing.sql)./api/runs/:id for the result. The Trigger.dev secret key is only used in server routes./api/stripe/webhook) that keeps subscriptions in sync.openai/gpt-4o-mini), then falls back to free OpenRouter models on credit, rate limit or provider errors. Model ids live in tools/qualify-lead.ts.The repo is organised the way I work with Claude Code:
| Part | Folder | What it is |
|---|---|---|
| Workflows | workflows/ | Plain-language SOP: objective, inputs, steps, edge cases |
| Agent | Claude Code | Reads the workflow, writes and runs the tools, fixes errors |
| Tools | tools/ | The Trigger.dev task, prompt and schemas that do the work |
CLAUDE.md holds the standing instructions for the agent.
workflows/lead-qualifier.md what the workflow should do
tools/ Trigger.dev task, prompt, schemas
trigger.config.ts Trigger.dev project config
frontend/ Next.js app (deployed to Vercel)
evals/ model comparison: labelled fictional leads, runner, scorer
supabase/schema.sql history table and row-level security policies
supabase/billing.sql subscriptions table (written by the Stripe webhook)
docs/cv-bullets.md CV and LinkedIn wording for this project
Requires Node 20+, a Trigger.dev account, an OpenRouter API key, a Supabase project and a Stripe account in test mode.
npm install in the root and in frontend/.OPENROUTER_API_KEY in your Trigger.dev project (Development environment).supabase/schema.sql and supabase/billing.sql in the Supabase SQL Editor.frontend/.env.example to frontend/.env.local and fill in the variables below.npx trigger.dev@latest devstripe login, then stripe listen --forward-to localhost:3000/api/stripe/webhook. Put the signing secret it prints in STRIPE_WEBHOOK_SECRET.frontend/: npm run dev, then open http://localhost:3000. Pay with Stripe's test card 4242 4242 4242 4242.frontend/: npm run lint, npm test and npm run build. Tests run offline with Supabase, Stripe and Trigger.dev mocked, so they need no env vars or keys.npm run typecheck, npm test and npm run eval -- --mock. None of them needs a key.Names only. Values go in frontend/.env.local, Vercel, or the Trigger.dev dashboard. Never commit them.
| Variable | Where it is set | Notes |
|---|---|---|
OPENROUTER_API_KEY | Trigger.dev dashboard | Used by the task only |
TRIGGER_SECRET_KEY | Frontend server (.env.local / Vercel) | Server-side only |
NEXT_PUBLIC_SUPABASE_URL | Frontend | Public by design |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Frontend | Public by design; row-level security protects data |
SUPABASE_SERVICE_ROLE_KEY | Frontend server | Used by the webhook; never NEXT_PUBLIC_ |
STRIPE_SECRET_KEY | Frontend server | Test-mode key |
STRIPE_WEBHOOK_SECRET | Frontend server | From stripe listen or the webhook endpoint |
STRIPE_PRICE_ID | Frontend server | Test-mode Pro price |
npx trigger.dev@latest deploy. Set OPENROUTER_API_KEY in the Production environment.frontend, and add the variables above. In Supabase, set the Site URL and redirect URLs to the Vercel domain.The eval set compares models on the same leads. Each lead goes through the same prompt and schema as the Trigger.dev task. The answers are then scored against labels written in advance.
What it measures, per model, over 40 fictional leads:
qualified matches the expected label.score falls inside the expected band.score and the middle of the expected band, valid replies only.resultSchema in tools/schema.ts.An invalid reply counts as a miss for accuracy and band hits. Each model is called on its own, so the app's paid-then-free fallback is not tested.
Run it
Offline, with no keys and no cost. CI runs this mode:
npm run eval -- --mock
Live, through OpenRouter. This needs OPENROUTER_API_KEY and uses credit. CI never runs it:
OPENROUTER_API_KEY=your-key npm run eval
Models come from EVAL_MODELS (comma-separated ids), or from evals/models.json if that is not set. The default list is the models the app uses. Each run prints a Markdown table and writes it to evals/results/.
Mock mode uses two offline stand-ins. mock:keyword is a rule-based baseline. mock:flaky is the same baseline with deliberate faults. Neither is an LLM. They check the scorer and the parser, and they let the eval run in CI without keys.
Sample output (mock mode, not an LLM result)
No live run is committed, because that needs a key. The tables below come from mock mode. They describe the mock models only and say nothing about any AI model. The full file is evals/results/sample-mock.md.
| Model | Qualified accuracy | Score-band hit rate | MAE (points) | Schema-valid rate | HTTP/network errors | Schema failures | Median latency |
|---|---|---|---|---|---|---|---|
| mock:keyword | 92.5% | 50.0% | 9.3 | 100.0% | 0 | 0 | 0 ms |
| mock:flaky | 50.0% | 27.5% | 10.1 | 57.5% | 0 | 17 | 0 ms |
| Model | Strong | Medium | Weak | Spam |
|---|---|---|---|---|
| mock:keyword | 12/12 | 8/10 | 9/10 | 8/8 |
| mock:flaky | 7/12 | 3/10 | 5/10 | 5/8 |
Add a lead
evals/dataset/leads.json. It needs a unique id, a category (strong, medium, weak or spam), a lead that passes the app's lead schema, and an expected block.expected.qualified, and a score_min to score_max band. A qualified lead's band must start at 60 or higher. A lead that is not qualified must end at 59 or lower. This follows the rule in tools/prompt.ts.CATEGORY_COUNTS (evals/dataset.ts) to match. The tests fail if they differ.npm test.Limits
tools/prompt.ts. No second person has checked them.minimax/minimax-m3.1-flash:free is not in OpenRouter's public model list. It is also in the app's free fallback list. See REVIEW.md.The eval tests are separate from the frontend tests above. They cover the scorer, the parser, the dataset checks and the runner.
Honest list of what this is not:
/api/analyze, /api/stripe/webhook, /api/billing/*) with Supabase, Stripe and Trigger.dev mocked. Not tested yet: /api/runs/[id], the auth routes, the Trigger.dev task, the UI and any end-to-end flow.workflows/lead-qualifier.md). Next step: make them editable per user.Lead data can be personal data. Please enter fictional leads only. Leads you submit are stored in Supabase under your account.