Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
프로토타입: 중소기업 도매업자의 청구서와 은행 명세서로 만든 검증된 12개월 금융 패키지, 은행 신용 분석가용
Prototype: a verified 12-month financing package for a bank credit analyst, built from an SME wholesaler's invoices and bank statements.
금융Python · JavaScriptGitHub @rayahMubark온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Turns a wholesaler's 12 months of invoices (Excel) and bank statements (PDF) into a verified package a bank credit analyst can act on in minutes.
Live: https://qawafel-financing-prototype.vercel.app
A credit analyst opens one applicant and can answer three questions:
Click any invoice to see its source row (as it appears in the Excel) and the exact bank transactions that paid it; each transaction links to its statement PDF, opened at the right page, with a copyable bank reference. Evidence lists are complete and paginated. A briefing memo is written by Claude from the verified figures. It lists evidence and questions but never recommends a decision, because the bank decides.
You can also upload your own files (same layout as the samples) with Analyze your own files.
pip install -r requirements-dev.txt
uvicorn main:app --reload # open http://127.0.0.1:8000
pytest -q # 16 tests, including matching accuracy and the memo paths
Optional: export ANTHROPIC_API_KEY=... to enable the AI memo. CLAUDE_MODEL overrides the model (default claude-sonnet-5-5, low effort, up to 2,000 output tokens).
Memo fallback. The memo never blocks the page. If there is no key, the API call fails, or Claude returns no text, the page shows a template memo built from the same figures, and the response's note says why (the exception, or the stop_reason); the reason is also printed to the server logs (Vercel function logs). Only successful Claude memos are cached, so a failed attempt is retried on the next request.
Regenerate the sample data: python scripts/generate_data.py && python scripts/extract_statements.py, then python scripts/evaluate_matching.py.
main.py; public/ is served from the CDN.ANTHROPIC_API_KEY under Project Settings, Environment Variables, and set a spend limit on the key.All in data/. Fully synthetic: the applicant, customers and banks are fictional.
| File | What it is |
|---|---|
invoices_2025-10_to_2026-09.xlsx | 1,857 invoice rows, the Excel the wholesaler uploads |
statements/*.pdf | 24 monthly statements for 2 accounts, the PDFs the wholesaler uploads |
customers.csv | Customer master plus simulated commercial-registry fields |
organization.json | Applicant profile and declared bank accounts |
extracted/bank_transactions.csv | 1,418 transactions extracted from the PDFs |
_ground_truth_allocations.csv | Which payment paid which invoice, used only to score the matcher |
Assumptions behind the data and the prototype, and the issues deliberately planted in it: ASSUMPTIONS.md.
Excel ──► loader: find header, map columns, dates, VAT, USD→SAR, duplicates, credit notes, entity check
PDFs ──► extractor: parse tables, verify every row against the running balance
│
▼
matcher: invoice number → statement month → exact amount → oldest-first; cash batches
│ (output = allocations: invoice, transaction, amount, method, confidence)
▼
package: metrics, monthly series, customers, aging, ranked flags, review queue
│
├──► FastAPI JSON API ──► analyst page (public/)
└──► Claude briefing memo (figures only, no decision)
Matching accuracy on the sample data: 99.5% precision and 99.5% recall (amount-weighted, against ground truth).
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /api/applications/demo/package | Decision summary: metrics, flags, customers, aging |
| GET | /api/applications/demo/invoices?status=&min_amount=&customer_id= | Filter invoices behind a metric (status: matched, partial, unmatched, not_yet_due, excluded_entity) |
| GET | /api/applications/demo/invoices/{number}/evidence | Source row and the payments that settled it |
| GET | /api/applications/demo/report | Everything the page needs in one response |
| POST | /api/analyze | Analyze uploaded files (multipart: invoices, statements[], optional customers, organization) |
| POST | /api/memo | AI briefing memo from a package |
| GET | /api/sample-data, /api/sample-data/{path}?inline=1 | List and download the sample files; inline=1 opens a PDF in the browser |
Interactive docs at /docs. Task 2 diagrams (data model, process flow, status) are listed in docs/README.md, as Mermaid source and PNG. Errors share one format: {"error": {"code", "message", "details"}}.