Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기HackKnight 2026
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
An AI credit committee. A user picks a company; a bull and a bear analyst debate its debt out loud
from SEC filings and news; a moderator fact-checks every claim and hands back a committee brief.
Most AI tells you what to think; ours shows you what to check.
Built for Hack Knight (Finance, Gemini and ElevenLabs tracks).
Everything runs end to end out of the box on stub data. Each TODO(Person N) marks where real work goes.README 전문 보기 ↗An AI credit committee. A user picks a company; a bull and a bear analyst debate its debt out loud from SEC filings and news; a moderator fact-checks every claim and hands back a committee brief.
Most AI tells you what to think; ours shows you what to check.
Built for Hack Knight (Finance, Gemini and ElevenLabs tracks).
bull-vs-bear/
├── frontend/ # Person 3: Next.js (home, debate room, brief)
│ ├── app/ # pages: /, /debate/[id], /brief/[id]
│ └── lib/ # types.ts (shared shapes), useDebate.ts (WebSocket + audio queue), mock/
├── backend/ # Person 2: FastAPI
│ ├── app/
│ │ ├── main.py # Person 2: endpoints + debate loop
│ │ ├── schemas.py # the 3 shared shapes (pydantic)
│ │ ├── edgar.py # Person 1: SEC EDGAR
│ │ ├── metrics.py # Person 1: debt-to-EBITDA, coverage, floating %, maturities, total immediate liquidity, capex / operating cash flow
│ │ ├── facts.py # Person 1: builds the fact sheet
│ │ ├── verify.py # Person 1: Hugging Face fact-checking
│ │ ├── agents.py # Person 2: Gemini bull / bear / moderator / brief
│ │ ├── voice.py # Person 2: ElevenLabs
│ │ └── store.py # Person 2: Supabase (in-memory fallback)
│ └── tests/
├── shared/
│ ├── schemas/ # JSON Schemas, generated from backend/app/schemas.py
│ └── examples/ # Fake data everyone builds against
├── .env.example # Key names only, never real keys
└── backend/railway.json # Backend deploy (Railway)
Everything runs end to end out of the box on stub data. Each TODO(Person N) marks where real work goes.
Backend (Python 3.12+)
cd backend
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp ../.env.example .env # fill in the keys you have; blanks are fine to start
uvicorn app.main:app --reload # http://localhost:8000/docs
pytest # checks shared shapes + metrics
Frontend (Node 20+)
cd frontend
npm install
cp .env.local.example .env.local # NEXT_PUBLIC_USE_MOCK=true runs without a backend
npm run dev # http://localhost:3000
npm test # unit tests (Vitest)
npm run typecheck
Set NEXT_PUBLIC_USE_MOCK=false to talk to the real backend.
| Method | Path | Returns |
|---|---|---|
| GET | /health | {ok: true} plus which services are configured |
| GET | /companies | pre-cached demo companies |
| GET | /companies/search?q= | up to 10 matching companies |
| GET | /models | Gemini models the user can pick, with prices |
| POST | /debates {ticker, model?, gemini_api_key?} | {debate_id} |
| GET | /debates/{id} | full debate for replay, including model and usage |
| GET | /debates/{id}/brief | committee brief |
| WS | /ws/debates/{id} | streams fact_sheet, positions, turn_start + line per turn, usage, brief; accepts interrupt and played |
The gear icon on every page opens Settings.
GET /models with prices. Applies to the next debate.
Pro needs a key with Pro access and is slow (about 45 s to the first line), so use Flash for live demos.sessionStorage (this tab only) and sends it
only to our backend with POST /debates. The backend holds it in memory for that one debate and drops it when
the debate ends; it's never saved, logged or returned. ElevenLabs voices still use the team's key.backend/app/usage.py): calls, input,
output and thinking tokens, voice characters, and an estimated cost. The live debate shows "This debate";
finished debates add to "All debates in this browser" (localStorage, resettable). Costs use Google's
published prices (thinking billed as output), recorded in usage.MODELS with the date they were checked.
Update those prices when Google changes them (Flash's introductory price ends Dec 31, 2026).A real 8-line debate on Flash-Lite made 19 Gemini calls (rejected lines are retried) and cost about $0.02.
See shared/README.md for the shapes, how ids connect them, the WebSocket protocol and how to change them.
VOICE_ENABLED=false until the debate reads well.frontend/), backend → Railway (root /backend, config /backend/railway.json).| Person | Role | Owns |
|---|---|---|
| Person 1 | Data and finance | edgar.py, metrics.py, facts.py, verify.py, demo number checks |
| Person 2 | AI and backend | main.py, agents.py, voice.py, store.py, WebSocket stream |
| Person 3 | Frontend and demo | frontend/, audio queue, claim labels, interrupt bar, hosting, pitch deck |
main always deploys. Work on a branch (p1/metrics, p2/agents, p3/debate-room) and open a PR..env.