anti-gambling-trader-tw
무료 오픈소스 투자 사기 방지·거래 통계·자동매매 도구, 기본 PaperBroker와 14개 증권사 옵션 제공, 로컬 분석
청소년 신용 보조 파일럿으로, 허가된 보호 조치를 통해 첫 카드 사용자의 점수를 명세서가 나오기 전에 보호합니다
A youth credit copilot that takes permissioned, guardrailed action to protect a first-time cardholder's score before the statement cuts.
금융TypeScript · CSSGitHub @GK-m8t온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A youth credit copilot that takes real, permissioned agentic action to protect a first-time cardholder's credit score — before the statement cuts, not after. Proof-of-concept for the Oolka AI PM case study: it feels like a real fintech app, but every external system (bank, bureau, issuer) is mocked.README 전문 보기 ↗A youth credit copilot that takes real, permissioned agentic action to protect a first-time cardholder's credit score — before the statement cuts, not after. Proof-of-concept for the Oolka AI PM case study: it feels like a real fintech app, but every external system (bank, bureau, issuer) is mocked.
First-time cardholders believe "I pay my bill in full, so my score is safe." It's false. Bureaus snapshot the card balance on the statement generation date, not after payment — so someone who spends heavily and pays in full a week later is still reported at high utilisation, quietly costing 20–40 points. Almost nobody knows this. It's preventable by an agent that acts before the statement date.
npm install
npm run dev
Open http://localhost:3000. No API key, no database, no configuration required — the LLM layer degrades to a deterministic templated explanation, chat degrades to grounded canned answers, and state lives in memory (there's a "Reset the demo scenario" button under Activity).
Two seeded scenarios (switch in Settings):
Use the model for what it's good at (language, empathy, explanation) and rules for what it must never get wrong (financial math, thresholds, actions). That boundary is the product design.
| Layer | File | Owns |
|---|---|---|
| 1 — Rules engine | lib/rulesEngine.ts + lib/tools.ts | Every number. Utilisation, the paydown-to-30% amount, affordability vs. the safety buffer, severity tiers, timing, the directional score-impact band, the prioritised multi-obligation plan. Deterministic TypeScript — the LLM never does arithmetic. |
| 2 — Language | lib/llm.ts + lib/chatAgent.ts | Words and orchestration only. Explains pre-formatted facts, and in chat decides which tools to call — but is given no numbers and may only repeat figures a tool returned. A post-generation guard rejects anything else. |
| 3 — Policy gate | lib/policy.ts | When NOT to act. Consent, safety buffer, autonomy caps, missing-signal checks — run before any action executes (paydowns, limit increases, autopay). Chat gets its own gates: scope screening and the tool-number verifier. Every denial is logged. |
The harm-aware recommendation this produces: getting under 30% needs ₹31,200, but George only has ₹38,000 with ₹15,000 needed for essentials. A naive agent would tell him to pay money he doesn't have. This one moves ₹23,000 now and schedules ₹8,200 for Oct 22, with his due amount.
Hard invariant: zero un-consented actions. Verifiable in lib/policy.ts — every action route passes through checkPolicy() and there is no other code path that moves money. Saying "pay it down" in chat produces a proposal button that routes through the consent screen — chat cannot execute.
The "Ask" tab is a tool-using agent, not a free-text generator:
lib/tools.ts (getUtilisation, simulatePaydown, projectScoreImpact, getStatementTiming, getObligations, loanEligibilitySignal, buildPlan, proposeAction) and repeat the results verbatim.verifyChatAnswer() in lib/policy.ts rejects any answer containing a figure no tool returned this turn (one corrective retry, then a grounded canned fallback).The second per-action autonomy dial: pays the statement amount on the due date only while the safety cushion holds — if paying in full would breach it, it pays the safe part and alerts about the rest, never overdrawing quietly. Arming always requires explicit consent; execution honours ask-first vs autonomous. Since the demo clock is frozen, a "fast-forward to the due date" button plays the payment out through the same policy gate and lands the same legible log entry.
Set LLM_PROVIDER in .env.local (see .env.example):
| Provider | Setup | Notes |
|---|---|---|
| (unset) | none | Deterministic templated explanation. The app never blocks on a model. |
ollama | Install Ollama, ollama pull llama3.2 | Recommended default. Local open model: keyless, offline, free. |
hf | HF_API_TOKEN | Hugging Face Inference API (default meta-llama/Llama-3.3-70B-Instruct). The easy way to get a live open model on a Vercel deploy. |
frontier | ANTHROPIC_API_KEY or OPENAI_API_KEY | Frontier API, for comparison. |
All providers sit behind one interface (explain(facts, kind)) — swapping is one env var. Any failure or timeout silently falls back to the template. The UI shows a small provenance badge ("words from…") so you can see which source produced the copy.
Why open-model-first for production: this workload is high-volume, short-form, vernacular explanation — exactly what a small self-hosted open model does well. At scale, per-call frontier pricing dominates unit economics; and the payloads contain financial PII, where RBI data-localisation expectations make keeping inference in-country and in-house the safer default. A frontier API remains a fallback for rare hard cases only.
On wide screens, a side rail narrates the architecture live: the numbers the rules engine computed, where the words came from (including the last chat answer's tool chain), and the checks the last action passed or failed.
GET /api/state — full snapshot (POST resets the demo)POST /api/guardian/evaluate — rules engine: detection, amounts, severity, impact bandPOST /api/guardian/explain — LLM layer ({ kind: "alert" | "recommendation" | "action-summary" | "out-of-scope" })POST /api/chat — grounded chat: { messages } → answer + tool trace + optional consent-gated action proposalPOST /api/actions/paydown — mocked bank debit; policy-gatedPOST /api/actions/limit-increase — mocked issuer request; policy-gatedPOST /api/actions/autopay — { intent: "arm" | "simulate-due-date" }; policy-gatedPATCH /api/settings — autonomy dials, auto-move cap, demo scenarioGET /api/llm-status — deployment diagnostics (?probe=1 makes one live provider call)External calls are mocked with simulated latency and deterministic outcomes.
Phase-2 integrations live behind lib/connectors/, each with the same contract as the LLM layer: env-selected, graceful mock fallback, provenance surfaced in the UI.
BANK_PROVIDER, default aa-sim) — a self-hosted Account Aggregator simulator that mirrors the Setu Bridge consent contract: consent session → the aggregator's hosted consent screen (its own surface, not the Guardian's) → grant → FI data fetch, with a deterministic 6-month synthetic deposit payload. Onboarding's "Link HDFC savings" runs this flow for real; the linked card shows "via Account Aggregator (simulator) · consent on record". Why a simulator: the real Setu AA sandbox signup is geo-fenced to India (and production AA requires an FIU licence); the app-side flow is identical, so real keys are an env swap. Direct CIBIL access, for anyone unregulated, is legally impossible (CICRA specified-user regime) — the seam shows where it would plug in.PAY_PROVIDER=razorpay + RAZORPAY_KEY_ID/RAZORPAY_KEY_SECRET) — every executed move creates a test-mode Razorpay Order, and the action log shows the order_… receipt chip (openable in the Razorpay test dashboard). The connector refuses live keys (rzp_live_…) on principle. Without keys, receipts are simulated and labelled as such.Standard Next.js — deploys to Vercel free tier as-is (vercel or import the repo). State is in-memory per serverless instance, which is fine for a demo; the reset button reseeds after cold starts. Optionally set LLM_PROVIDER=hf + HF_API_TOKEN (or frontier + a key) in the project's environment variables for live explanations.
One flow only (the Utilisation Guardian). Autopay and disputes appear as disabled stubs for context. No auth, no real integrations, no database — prototype polish over breadth.