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 | Median latency |
|---|---|---|---|---|---|
| mock:keyword | 92.5% | 50.0% | 9.3 | 100.0% | 0 ms |
| mock:flaky | 50.0% | 27.5% | 10.1 | 57.5% | 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.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.