Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Aangan Studio Enquiry OS: Vaani AI phone agent + rules-based qualification, Telegram/Calendly handoff, and a funnel/cost/ROI dashboard that asks: is this making more business?
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
An AI-assisted inbound phone enquiry qualification system for Aangan Studio, an interior design studio in Pune. Vaani AI answers the phone; a Next.js app (on Vercel, with Neon Postgres and Vercel AI Gateway) makes the decisions, hands off on Telegram with a Calendly booking link, and runs the dashboard.
The system is judged by enquiry → project conversion and revenue, not by how many calls the AI answered. The dashboard's first question is "Is this system generating more business?" and it answers "can't tell yet" whenever the evidence doesn't support a yes.README 전문 보기 ↗An AI-assisted inbound phone enquiry qualification system for Aangan Studio, an interior design studio in Pune. Vaani AI answers the phone; a Next.js app (on Vercel, with Neon Postgres and Vercel AI Gateway) makes the decisions, hands off on Telegram with a Calendly booking link, and runs the dashboard.
The system is judged by enquiry → project conversion and revenue, not by how many calls the AI answered. The dashboard's first question is "Is this system generating more business?" and it answers "can't tell yet" whenever the evidence doesn't support a yes.
Prototype · demo data.
knowledge/*.md, the 40 sample enquiries and the baseline are invented. They are not Aangan's real services, rates, criteria or call transcripts.
services.md, and never claims a service that isn't listed there.pricing.md, always with the "varies by site" caveat. It never quotes a final price.qualified.md: QUALIFIED / NOT_QUALIFIED / NEEDS_HUMAN_REVIEW.| Route | What |
|---|---|
/ | Overview: the verdict, revenue, conversion, pipeline, response and outcomes |
/leads, /leads/:id | Enquiries; full record with outcome actions, decision change, transcript, activity |
/failures | Needs attention: review queue, missed handoffs, warnings |
/intelligence | Insights: who to call first, objections, follow-ups |
/calls | Every call and its transcript |
/analytics | Performance: before vs now, ROI, baseline editor, remove demo data |
/costs | Cost breakdown and per-call costs |
/simulate | Talk to the agent: live conversation with the real Vaani agent in the browser, or have it ring your phone |
The agent prompt, rules and architecture are deliberately not shown in the web UI. Use npm run vaani:setup to print the Vaani configuration.
PHONE / SIMULATOR / BROWSER MIC
↓
CALL INGESTION ............ /api/simulate · /api/calls/live · /api/calls/inbound
↓
CONVERSATION ENGINE ....... lib/engine/conversation.ts (slot policy, FAQ, service questions)
↓
INFORMATION EXTRACTION .... lib/engine/extract.ts (rules) + lib/engine/llm.ts (AI Gateway fills gaps)
↓
KNOWLEDGE RETRIEVAL ....... lib/knowledge.ts ← knowledge/services.md · pricing.md · qualified.md
↓
QUALIFICATION ENGINE ...... lib/engine/qualify.ts (R1–R5 from qualified.md only)
↓
PRICING ENGINE ............ lib/engine/pricing.ts (ranges + disclaimer + unapproved-₹ guard)
↓
DECISION ENGINE ........... confidence < threshold / contradiction / missing / high-value fail → human
↓
┌──────────────┬────────────────┬───────────────┐
QUALIFIED HUMAN REVIEW NOT QUALIFIED
↓ ↓ ↓
TELEGRAM REVIEW TASK POLITE RESPONSE
↓
DESIGNER → CONSULTATION → PROJECT (recorded by a person: lib/actions.ts)
↓
ANALYTICS ................ lib/metrics.ts
Each knowledge file holds the human-readable rules and a machine-readable JSON block. The engine evaluates that block, so what Nikhil reads and what the code runs come from one file, versioned in Git.
DATABASE_URL. On first load the app creates the schema and seeds the demo data.AGENT_MODEL, EXTRACT_MODEL.TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID. For the ✅/📞 buttons, also set TELEGRAM_WEBHOOK_SECRET and callhttps://api.telegram.org/bot<TOKEN>/setWebhook?url=https://<app>/api/telegram/webhook/<SECRET>CALENDLY_EVENT_URL to the free-consultation event link. Every qualified lead then gets a prefilled link (name, phone, utm_campaign=<lead id>) in the Telegram handoff and on the lead page. To sync bookings automatically (needs Calendly Standard or above), create a webhook subscription with a Calendly personal access token:
curl -X POST https://api.calendly.com/webhook_subscriptions \
-H "Authorization: Bearer <CALENDLY_TOKEN>" -H "Content-Type: application/json" \
-d '{"url":"https://<app>/api/calendly/webhook","events":["invitee.created","invitee.canceled","invitee_no_show.created","invitee_no_show.deleted"],"organization":"<org uri>","scope":"organization","signing_key":"<random secret>"}'
Then set the same secret as CALENDLY_WEBHOOK_SIGNING_KEY. Bookings move the lead to Consultation; cancellations and no-shows move it back and show up on /failures. A booking that can't be matched to a lead (no utm, unknown phone) raises a warning instead of being dropped.TELEPHONY_WEBHOOK_SECRET is required in production for /api/calls/inbound (requests are refused without it).Local development: cp .env.example .env.local, set DATABASE_URL, run npm i && npm run dev. Run npm run test:engine to put the three core scenarios through the engine.
Vaani holds the call; this app decides. Run DATABASE_URL=<neon url> APP_URL=https://<app> npm run vaani:setup to print everything to paste into Vaani, generated from knowledge/*.md: the greeting, the agent instructions, the data-collection points and the webhook URL.
VAANI_WEBHOOK_SECRET (any long random string) in Vercel.https://<app>/api/vaani/webhook/<VAANI_WEBHOOK_SECRET>. Vaani doesn't document request signing, so the secret sits in the URL.call_postprocessing the app parses the transcript and re-extracts every field with its own rules. Vaani's collected data only fills gaps. The app then qualifies against qualified.md, flags any rupee figure the agent said that isn't in pricing.md (a pricing guardrail breach on /failures), and sends the handoff or creates a review task. A caller who hangs up before speaking becomes a call-back task. Retries are deduplicated by Vaani call_id.This prototype has no Indian phone number of its own. To take real calls, a provider with an Indian DID (Exotel, Plivo, Twilio India over SIP, or Vapi with a SIP-trunked +91 number) can either:
/api/calls/inbound ({ phone, startedAt, transcript: [{ role, text, secondsFromStart }] }), or/api/calls/live (start → turn → end) and speak the returned replies.Pune callers will mix Hindi, Marathi and English. Choose STT/TTS that handles code-switching before going live.
Talk to the agent opens a live in-browser (WebRTC) conversation with the real Vaani agent; Or get a call on your phone makes it ring your mobile (Vaani's own default number — no number purchase needed). Talk as the customer; when you hang up, Vaani posts the transcript to the webhook and the enquiry appears with its decision. These are real enquiries: once any exist, all numbers and insights are computed from them only. No calls are simulated by the app; a small demo set (12 enquiries) is kept until real calls arrive.
Needs VAANI_API_KEY (Vaani → Developers → API Keys) in Vercel. Optional: VAANI_AGENT_ID (defaults to the Aangan agent), OUTBOUND_DAILY_LIMIT (default 20).
DASHBOARD_PASSWORD — set it. Without it anyone with the URL sees customer names and phone numbers. Browser asks for a password (any username). Webhooks stay reachable.npm run vaani:setup. Until then no real calls arrive.TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, TELEGRAM_WEBHOOK_SECRET, then setWebhook (step 4 above).CALENDLY_EVENT_URL; for auto-sync, CALENDLY_WEBHOOK_SIGNING_KEY + webhook subscription (paid plan).ALLOW_RESET=0 — after going live, disables the reset endpoint entirely.lib/costs.ts with invoiced figures./analytics#experiment explains how to run an alternate-day randomised test and how big the sample needs to be.lib/costs.ts is a placeholder. Replace it with invoiced rates.