Skip to content
avlp12Public

About

KAVEN = Korean AI-based Vigilance for Event Navigation. KAVEN (Kaven) is an AI-based early warning system that collects geopolitical events from various sources (AIS/ADS-B/News/Social Media), analyzes and deduplicates the data, and delivers alerts via Telegram.

Resources

Stars

49 stars

Watchers

1 watching

Forks

Latest commit

ย 

History

200 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

KAVEN

KAVEN โ€” Korean AI-based Vigilance for Event Navigation

AIS(ํ•ด์ƒ)ยทADS-B(ํ•ญ๊ณต)ยท๋‰ด์Šคยท์†Œ์…œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , LLM ๋ถ„์„๊ณผ ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ๊ฑฐ์ณ severity(1โ€“5) ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ง€์ •ํ•™ ์กฐ๊ธฐ๊ฒฝ๋ณด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ํ…”๋ ˆ๊ทธ๋žจ ๊ฒฝ๋ณด, Palantir ์Šคํƒ€์ผ ์›น ์ž‘์ „ ์ฝ˜์†”(Ops Console), ๊ทธ๋ฆฌ๊ณ  AI ์—์ด์ „ํŠธ ์—ฐ๋™(MCP + REST)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„์ „: 0.0.21 ยท ๋ณ€๊ฒฝ ์ด๋ ฅ: docs/release-notes.md ยท ๋ผ์ด์„ ์Šค: MIT


ํ™”๋ฉด (Ops Console)

์ง€๋„๋Š” ๋‚ด์žฅ ๋ฒกํ„ฐ ์›”๋“œ๋งต(Natural Earth 110m + ๋กœ์ปฌ ๋ฒˆ๋“ค Leaflet)์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค โ€” CDNยทํƒ€์ผ ์„œ๋ฒ„ ์—†์ด ์˜คํ”„๋ผ์ธ์—์„œ๋„ ํ•ญ์ƒ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

COP (Common Operating Picture) โ€” ๋ฒกํ„ฐ ์›”๋“œ๋งต + ๊ฐ์‹œ๊ตฌ์—ญ ์˜ค๋ฒ„๋ ˆ์ด + severity ๋งˆ์ปค + 24์‹œ๊ฐ„ ํƒ€์ž„๋ผ์ธ + ์ง€์—ญ ๋„์‹œ์—(7์ผ ์ŠคํŒŒํฌ๋ผ์ธ):

COP

AO ์คŒ โ€” ๊ฐ์‹œ๊ตฌ์—ญ ํ™•๋Œ€ (ํ•œ๋ฐ˜๋„ ADS-B ๊ตฌ์—ญ + S5 ์ด๋ฒคํŠธ ๋งˆ์ปค):

COP zoom

Event Feed โ€” ํ•„ํ„ฐยท์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์ด๋ฒคํŠธ ํŠธ๋ฆฌ์•„์ง€ ํ…Œ์ด๋ธ” + ์ธ์ŠคํŽ™ํ„ฐ(๋ถ„์„ ๊ทผ๊ฑฐยท์˜ํ–ฅ ์ž์‚ฐยท์ถœ์ฒ˜):

Event Feed

Intel Report Asset Impact
Intel Report Asset Impact
๊ทœ์น™ ๊ธฐ๋ฐ˜ ์ผ์ผ ๋ธŒ๋ฆฌํ•‘ (LLM/API ํ‚ค ๋ถˆํ•„์š”) ์ž์‚ฐ๋ณ„ 7์ผ severity ํžˆํŠธ๋งต + ์‹ ํ˜ธ ๋ถ„ํฌ
Command Palette (Ctrl+K) System / Collection
Command Palette System
์ง€์—ญยท์ด๋ฒคํŠธยท์ž์‚ฐยท๋ทฐยท์•ก์…˜ ํ†ตํ•ฉ ๊ฒ€์ƒ‰ ๊ฐ์‹œ๊ตฌ์—ญ/ํ”ผ๋“œ/ํ‚ค์›Œ๋“œ ์ˆ˜์ง‘ ์ƒํƒœ ๋ณด๋“œ

Settings โ€” zcode ์Šคํƒ€์ผ ์„ค์ • ์ฝ˜์†” (์ขŒ์ธก ๋‚ด๋น„: ์ฝ˜์†”/๋ชจ๋ธ/์ˆ˜์ง‘ยท๋ฐ์ดํ„ฐ ๊ทธ๋ฃน, ์„ ํƒ ํƒญ ์œ ์ง€):

Settings โ€” ๋ชจ๋ธ ๊ณต๊ธ‰์ž (๊ตฌ๋…/OAuth) Settings โ€” ์ผ๋ฐ˜ยท์ฝ˜์†” ํ™˜๊ฒฝ์„ค์ •
Settings Providers Settings General
๊ณต๊ธ‰์ž ์นด๋“œ: OAuthยท๊ตฌ๋…/API Key ์ƒํƒœ ๋ฐฐ์ง€, ์„ค์น˜๋จ/๋ฏธ์„ค์น˜ ์ƒํƒœ ์ , CLI ๋ธŒ๋ฆฌ์ง€ ์ธ๋ผ์ธ ํŽธ์ง‘ยท์ถ”๊ฐ€ยทํ•ด์ œ ์–ธ์–ด ์ „ํ™˜ + ์‹œ์ž‘ ํ™”๋ฉดยท์ƒˆ๋กœ๊ณ ์นจ ์ฃผ๊ธฐยท์ง€๋„ severityยท์˜ค๋ฒ„๋ ˆ์ดยทํŽ„์ŠคยทAPI ์ฃผ์†Œ
Settings โ€” ์ˆ˜์ง‘ ์„ค์ • ํŽธ์ง‘ COP โ€” English mode
Settings Collection COP English
์ž์‚ฐ/์ง€์—ญ/๊ฐ์‹œ๊ตฌ์—ญ/ํ”ผ๋“œ/ํ‚ค์›Œ๋“œ ์ „ ์„น์…˜ ์ธ๋ผ์ธ ํŽธ์ง‘ โ†’ config.json ์ €์žฅ ์–ธ์–ด ์ „ํ™˜ ์‹œ ์ง€์—ญ๋ช…ยท์„ค๋ช…ยท๋„์›€๋ง์ด ์˜์–ด๋กœ ํ‘œ์‹œ

ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค โ€” ? ํ‚ค๋กœ ์ฝ˜์†” ์•ˆ์—์„œ ์–ธ์ œ๋“  ํ™•์ธ:

Shortcuts


๋ชฉ์ฐจ

  1. ์ฃผ์š” ๊ธฐ๋Šฅ
  2. ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜
  3. ๋น ๋ฅธ ์‹œ์ž‘
  4. ์›น ์ž‘์ „ ์ฝ˜์†”
  5. AI ์—์ด์ „ํŠธ ์—ฐ๋™
  6. ์„ค์ •
  7. API ์š”์•ฝ
  8. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
  9. ํ…Œ์ŠคํŠธ
  10. ์šด์˜ / ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  11. ๋ฌธ์„œยท๊ธฐ์—ฌยท๋ผ์ด์„ ์Šค

1) ์ฃผ์š” ๊ธฐ๋Šฅ

  • 4์ฑ„๋„ ์ˆ˜์ง‘ โ€” AIS ์„ ๋ฐ•(ํ˜ธ๋ฅด๋ฌด์ฆˆยท๋ง๋ผ์นด ๋“ฑ), ADS-B ํ•ญ๊ณต(์ค‘๋™ยท๋Œ€๋งŒยทํ•œ๋ฐ˜๋„), ๋‰ด์Šค RSS(๊ธฐ๋ณธ 13๊ฐœ ๋ฌด๋ฃŒยทํŽ˜์ด์›” ์—†๋Š” ๊ณต๊ฐœ ํ”ผ๋“œ: AP/BBC/Al Jazeera/Guardian/ DW/France 24/UN News/CNA/gCaptain/OilPrice/Google News + SearxNG), ์†Œ์…œ ๊ฒ€์ƒ‰. ๊ฐ์‹œ๊ตฌ์—ญยทํ”ผ๋“œยทํ‚ค์›Œ๋“œ๋Š” ์ „๋ถ€ ์„ค์ • ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ํ•ญ๋ชฉ๋ณ„ enabled ํ† ๊ธ€ ์ง€์›.
  • LLM ๋ถ„์„ + ๊ทœ์น™ ํด๋ฐฑ โ€” OpenAI ํ˜ธํ™˜(๋กœ์ปฌ LLM ํฌํ•จ) โ†’ Gemini โ†’ Anthropic (API ํ‚ค ๋˜๋Š” ๊ตฌ๋… OAuth) โ†’ CLI ๊ตฌ๋… ๋ธŒ๋ฆฌ์ง€(Claude Code/Codex/ Cursor Agent/Gemini CLI) โ†’ ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์ˆœ์„œ๋กœ ํด๋ฐฑ. ์ถœ๋ ฅ: event, severity(1-5), category, signal, confidence, affected_assets, source_url ๋“ฑ.
  • ๊ตฌ๋…(OAuth) ๋ชจ๋ธ ์—ฐ๊ฒฐ โ€” API ํ‚ค ์—†์ด Claude Pro/MaxยทChatGPT Plus/Proยท CursorยทGoogle ๊ณ„์ • ๊ตฌ๋…์œผ๋กœ ๋ถ„์„ ๋ชจ๋ธ ์‚ฌ์šฉ (ยง3.3). GLM(์ง€ํ‘ธ)ยทKimi๋Š” ํ˜ธํ™˜ ์—”๋“œํฌ์ธํŠธ๋กœ ์ง€์›.
  • ์ž…๋ ฅ ๊ธฐ์ค€ ์ค‘๋ณต ์ œ๊ฑฐ โ€” ์ƒˆ ์ž๊ทน(์‹ ๊ทœ ๋‰ด์Šค URL, AIS/ADS-B anomaly)์ด ์—†์œผ๋ฉด LLM ํ˜ธ์ถœยท๋ฐœ์†ก ์ž์ฒด๋ฅผ ์Šคํ‚ต. ํ…์ŠคํŠธ/์ˆ˜์น˜/URL ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ์ด๋ฒคํŠธ ๋ณ‘ํ•ฉ.
  • ํ…”๋ ˆ๊ทธ๋žจ ๊ฒฝ๋ณด โ€” severity ๊ธฐ์ค€ ๋ฐœ์†ก, ๊ธด๊ธ‰(5) ๋ณ„๋„ ํ—ค๋”.
  • ์›น ์ž‘์ „ ์ฝ˜์†” โ€” ๋‹ค์ค‘ ํŒจ๋„ ์ธํ…”๋ฆฌ์ „์Šค ์ฝ˜์†”(์œ„ ์Šคํฌ๋ฆฐ์ƒท). ์‹ค์‹œ๊ฐ„ SSE, ํ‚ค๋ณด๋“œ ์ค‘์‹ฌ ์šด์šฉ, ์ƒํƒœ ์ง€์†์„ฑ(localStorage), ํ•œ๊ตญ์–ด/์˜์–ด ์ „ํ™˜, ์ถ”์  ์ž์‚ฐ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•(Settings ๋ทฐ์—์„œ ํŽธ์ง‘ โ†’ config.json ์ €์žฅ).
  • AI ์—์ด์ „ํŠธ ์—ฐ๋™ โ€” ์˜์กด์„ฑ ์—†๋Š” stdio MCP ์„œ๋ฒ„(๋„๊ตฌ 8๊ฐœ) + /agent/* REST. ์—์ด์ „ํŠธ๊ฐ€ ์ƒํ™ฉ ์š”์•ฝยท์ด๋ฒคํŠธ ์ฟผ๋ฆฌยทLLM ๋ธŒ๋ฆฌํ•‘์„ ๋„๊ตฌ๋กœ ์†Œ๋น„ ๊ฐ€๋Šฅ.
  • ์ผ์ผ ๋ฆฌํฌํŠธ โ€” JSONL ๋กœ๊ทธ์—์„œ ๊ทœ์น™ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง€์—ญ/์นดํ…Œ๊ณ ๋ฆฌ/์ž์‚ฐ ์ง‘๊ณ„ + ๋งˆํฌ๋‹ค์šด ๋ธŒ๋ฆฌํ•‘ ์ž๋™ ์ƒ์„ฑ (API ํ‚ค ๋ถˆํ•„์š”).
  • ๋กœ์ปฌ ์šฐ์„  ์ €์žฅ โ€” JSONL ๋กœ๊ทธ๊ฐ€ ์›๋ณธ. ์™ธ๋ถ€ ์ „์†ก(Convex)์€ CONVEX_SITE_URL ๋ช…์‹œ ์„ค์ • ์‹œ์—๋งŒ opt-in (์ด์Šˆ #7 ์ •์ฑ…).

2) ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

โ”Œโ”€ ์ˆ˜์ง‘(collectors) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ AIS โ”‚ ADS-B โ”‚ News โ”‚ Social    โ”‚   config.json (๊ฐ์‹œ๊ตฌ์—ญ/ํ”ผ๋“œ/ํ‚ค์›Œ๋“œ, enabled ํ† ๊ธ€)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ–ผ
      ์ž…๋ ฅ ๊ฒŒ์ดํŒ… (์ƒˆ ์ž๊ทน ์—†์œผ๋ฉด ์Šคํ‚ต)
               โ–ผ
โ”Œโ”€ ๋ถ„์„(analyzer) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ OpenAIํ˜ธํ™˜ โ†’ Gemini โ†’ Anthropicโ”‚ โ†’ ๊ทœ์น™ ๊ธฐ๋ฐ˜ ํด๋ฐฑ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ–ผ
      ์ค‘๋ณต ์ œ๊ฑฐ(dedup) โ†’ severity ์ด๋ฒคํŠธ
               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ–ผ              โ–ผ                           โ–ผ
ํ…”๋ ˆ๊ทธ๋žจ ๊ฒฝ๋ณด   JSONL ๋กœ๊ทธ (๋กœ์ปฌ ์›๋ณธ)      Convex ์—…๋กœ๋“œ(opt-in)
               โ”‚
               โ–ผ  src/kaven/ ์ฝ”์–ด (log_store ยท ops_summary ยท aggregates ยท agent_service)
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ–ผ                    โ–ผ
 FastAPI ์›น API      MCP ์„œ๋ฒ„ (stdio)
 (webapp/backend)    (python -m src.kaven.mcp_server)
     โ–ผ                    โ–ผ
 Ops Console SPA      AI ์—์ด์ „ํŠธ (Claude Code / Desktop ๋“ฑ)
  • ๋„๋ฉ”์ธ ๋กœ์ง์€ ์ „๋ถ€ src/kaven/ ์ฝ”์–ด์— ์žˆ๊ณ , ์›น ๋ผ์šฐํ„ฐ์™€ MCP ์„œ๋ฒ„๋Š” ์–‡์€ ์–ด๋Œ‘ํ„ฐ ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ HTTP์™€ MCP ์–‘์ชฝ์—์„œ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3) ๋น ๋ฅธ ์‹œ์ž‘

3.1 ์„ค์น˜

python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -r requirements.txt          # ์šด์˜
pip install -r requirements-dev.txt      # ๊ฐœ๋ฐœ(+pytest/ruff/mypy)

3.2 .env ์ค€๋น„ (์„ ํƒ)

Kaven์€ src/kaven/.env๋ฅผ ์ž๋™ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ‚ค๋Š” ์„ ํƒ์ด๋ฉฐ, ์—†์œผ๋ฉด ์‹œ๋ฎฌ๋ ˆ์ด์…˜/๋น„์ธ์ฆ/๊ทœ์น™ ๊ธฐ๋ฐ˜ ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

cat > src/kaven/.env <<'ENV'
# ===== ์ˆ˜์ง‘ =====
OPENSKY_CLIENT_ID=
OPENSKY_CLIENT_SECRET=
AISSTREAM_API_KEY=
SEARXNG_URL=http://localhost:8080

# ===== ๋ถ„์„ (ํ•˜๋‚˜๋งŒ ์žˆ์–ด๋„ ๋จ; ์—†์œผ๋ฉด ๊ตฌ๋… CLI โ†’ ๊ทœ์น™ ๊ธฐ๋ฐ˜) =====
OPENAI_BASE_URL=
OPENAI_API_KEY=
OPENAI_MODEL=
GEMINI_API_KEY=
ANTHROPIC_API_KEY=
# ๊ตฌ๋…(OAuth) โ€” API ํ‚ค ๋Œ€์‹  (ยง3.3): ANTHROPIC_AUTH_TOKEN ๋˜๋Š” `ant auth login`
ANTHROPIC_AUTH_TOKEN=
ANTHROPIC_BASE_URL=
ANTHROPIC_MODEL=

# ===== ์•Œ๋ฆผ =====
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
TELEGRAM_TOPIC_MAVEN=
TELEGRAM_USER_DM=

# ===== ์›๊ฒฉ ๋ฐฑ์—… (opt-in โ€” ๋ฏธ์„ค์ • ์‹œ ์™ธ๋ถ€ ์ „์†ก ์™„์ „ ๋น„ํ™œ์„ฑ) =====
CONVEX_SITE_URL=
CONVEX_EVENT_PATH=/addKavenRun
ENV

๋ณด์•ˆ: .env๋Š” ์ ˆ๋Œ€ ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”. CONVEX_SITE_URL ๋ฏธ์„ค์ • ์‹œ ์ด๋ฒคํŠธ๋Š” ์–ด๋–ค ์™ธ๋ถ€ ์—”๋“œํฌ์ธํŠธ๋กœ๋„ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3.3 ๊ตฌ๋…(OAuth)์œผ๋กœ ๋ชจ๋ธ ์—ฐ๊ฒฐ โ€” API ํ‚ค ์—†์ด

API ํ‚ค ๋Œ€์‹  ์ด๋ฏธ ์“ฐ๊ณ  ์žˆ๋Š” ๊ตฌ๋…์œผ๋กœ ๋ถ„์„ ๋ชจ๋ธ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ‚คยทํ† ํฐยท์—”๋“œํฌ์ธํŠธ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋Œ€์‹  ์ฝ˜์†” Settings โ†’ ๋ชจ๋ธ ๊ณต๊ธ‰์ž ์นด๋“œ์—์„œ ์ง์ ‘ ์ž…๋ ฅยท์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (config.json์— ์ €์žฅ, ๋™์ผ ํ•ญ๋ชฉ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์šฐ์„ , ์—ฐ๊ฒฐ ํ•ด์ œ ๋ฒ„ํŠผ์œผ๋กœ ์‚ญ์ œ).

Anthropic ์ง์ ‘ ์—ฐ๊ฒฐ (์šฐ์„ ์ˆœ์œ„: ANTHROPIC_API_KEY โ†’ OAuth):

๊ตฌ๋… ๋ฐฉ๋ฒ•
Claude Pro/Max ant auth login ํ•œ ๋ฒˆ์ด๋ฉด ๋ โ€” Kaven์ด ant CLI ํ”„๋กœํ•„์—์„œ ๋‹จ๊ธฐ ํ† ํฐ์„ ์ž๋™ ๋ฐœ๊ธ‰ (๋˜๋Š” ANTHROPIC_AUTH_TOKEN์— OAuth ํ† ํฐ ์ง์ ‘ ์ง€์ •)
GLM (์ง€ํ‘ธ/Z.ai) ANTHROPIC_BASE_URL=https://open.bigmodel.cn/api/anthropic + ๊ตฌ๋… ํ‚ค
Kimi (Moonshot) ANTHROPIC_BASE_URL=https://api.moonshot.ai/anthropic + ๊ตฌ๋… ํ‚ค

๋ชจ๋ธ์€ ANTHROPIC_MODEL๋กœ ์ง€์ • (๊ธฐ๋ณธ claude-sonnet-5).

CLI ๊ตฌ๋… ๋ธŒ๋ฆฌ์ง€ โ€” ๋กœ๊ทธ์ธ๋œ ๊ณต์‹ CLI์— ๋ถ„์„ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ยท๋กœ๊ทธ์ธ๋งŒ ๋˜์–ด ์žˆ์œผ๋ฉด ์ž๋™ ๊ฐ์ง€๋˜๋ฉฐ, Settings โ†’ ๋ชจ๋ธ ๊ณต๊ธ‰์ž์—์„œ ํ™œ์„ฑ/๋น„ํ™œ์„ฑยท๋ช…๋ น ํŽธ์ง‘ยท์ปค์Šคํ…€ ๊ณต๊ธ‰์ž ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๋œ CLI๋Š” ์นด๋“œ์˜ ์—ฐ๊ฒฐ(๋กœ๊ทธ์ธ) ๋ฒ„ํŠผ์œผ๋กœ OAuth ๋กœ๊ทธ์ธ ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ๋ฐฑ์—”๋“œ ๋จธ์‹ ์—์„œ ์ƒˆ ํ„ฐ๋ฏธ๋„ ์ฐฝ์ด ์—ด๋ฆฌ๊ฑฐ๋‚˜(๋ฐ์Šคํฌํ†ฑ), ํ—ค๋“œ๋ฆฌ์Šค ํ™˜๊ฒฝ์ด๋ฉด ๋กœ๊ทธ์ธ URL์„ ์ถ”์ถœํ•ด ๋ธŒ๋ผ์šฐ์ € ์ƒˆ ํƒญ์œผ๋กœ ์—ฝ๋‹ˆ๋‹ค (POST /cli/{id}/login, ๋กœ๊ทธ์ธ ๋ช…๋ น์€ login_command ํ•„๋“œ๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ):

๊ตฌ๋… CLI ๊ธฐ๋ณธ ๋ช…๋ น
Claude Pro/Max Claude Code claude -p --output-format text
ChatGPT Plus/Pro OpenAI Codex codex exec
Cursor Cursor Agent cursor-agent -p --output-format text
Google ๊ณ„์ • Gemini CLI gemini -p

KAVEN_CLI_PROVIDER๋กœ ํŠน์ • ๋ธŒ๋ฆฌ์ง€๋งŒ ์‚ฌ์šฉ(id)ํ•˜๊ฑฐ๋‚˜ ์ „์ฒด ๋น„ํ™œ์„ฑ(off)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Grok ๋“ฑ ๊ณต์‹ API ๊ตฌ๋… ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ์„œ๋น„์Šค๋„ ํ•ด๋‹น CLI๊ฐ€ ์žˆ๋‹ค๋ฉด ์ปค์Šคํ…€ ๊ณต๊ธ‰์ž๋กœ ๋“ฑ๋กํ•ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Grok์€ xAI API ํ‚ค๋ฅผ OPENAI_BASE_URL=https://api.x.ai/v1๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ).

์—ฐ๊ฒฐ ์ƒํƒœ๋Š” ์ฝ˜์†” Settings โ†’ ๋ชจ๋ธ ๊ณต๊ธ‰์ž ๋˜๋Š” GET /health์˜ analysis ํ•„๋“œ์—์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค (๋น„๋ฐ€๊ฐ’์€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ).

3.4 ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰

python src/kaven/kaven.py --once            # 1ํšŒ ์‹คํ–‰
python src/kaven/kaven.py --watch           # ๊ฐ์‹œ ๋ชจ๋“œ (๊ธฐ๋ณธ 5๋ถ„)
python src/kaven/kaven.py --watch --interval 10

4) ์›น ์ž‘์ „ ์ฝ˜์†”

4.1 ์‹คํ–‰

# ๋ฐฑ์—”๋“œ (FastAPI)
uvicorn webapp.backend.app:app --reload --port 8000

# ํ”„๋ก ํŠธ์—”๋“œ (์ •์  ํŒŒ์ผ)
python -m http.server 8080 --directory webapp/frontend

์ ‘์†: http://127.0.0.1:8080 โ€” API ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ?api=http://ํ˜ธ์ŠคํŠธ:8000์œผ๋กœ override.

4.2 ํ™”๋ฉด ๊ตฌ์„ฑ

๋ทฐ ๋‚ด์šฉ
COP ๋‚ด์žฅ ๋ฒกํ„ฐ ์›”๋“œ๋งต(Natural Earth, ์˜คํ”„๋ผ์ธ ๋™์ž‘) ์œ„ ๊ฐ์‹œ๊ตฌ์—ญ ๋ฐ•์Šคยทseverity ๋งˆ์ปคยทํŽ„์Šค ๋ง + 24h ์ด๋ฒคํŠธ ํƒ€์ž„๋ผ์ธ
Event Feed severity/์นดํ…Œ๊ณ ๋ฆฌ/์‹ ํ˜ธ/ํ…์ŠคํŠธ ํ•„ํ„ฐ + Time/Sev ์ •๋ ฌ ํ…Œ์ด๋ธ”
Intel Report ์ผ์ผ ๋ธŒ๋ฆฌํ•‘ ๋งˆํฌ๋‹ค์šด (๋‚ ์งœ ์„ ํƒ)
Asset Impact ์ž์‚ฐ๋ณ„ 7์ผ severity ํžˆํŠธ๋งต + ์‹ ํ˜ธ ๋ถ„ํฌ
System ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ/๊ฐ์‹œ๊ตฌ์—ญ/ํ”ผ๋“œ/ํ‚ค์›Œ๋“œ ์ƒํƒœ ๋ณด๋“œ
Settings zcode ์Šคํƒ€์ผ ์ขŒ์ธก ๋‚ด๋น„(์ฝ˜์†”/๋ชจ๋ธ/์ˆ˜์ง‘ ๊ทธ๋ฃน): ์–ธ์–ดยท์ฝ˜์†” ํ™˜๊ฒฝ์„ค์ • + ๋ชจ๋ธ ๊ณต๊ธ‰์ž ํŒจ๋„(Direct API ํ‚คยทํ† ํฐ ์นด๋“œ ์ž…๋ ฅ/์—ฐ๊ฒฐ ํ•ด์ œ + CLI ๊ตฌ๋… ๋ธŒ๋ฆฌ์ง€ ํŽธ์ง‘) + ์„œ๋ฒ„ ์„ค์ • ์ „ ์„น์…˜ ํŽธ์ง‘๊ธฐ(์ž์‚ฐ/๊ฐ์‹œ์ง€์—ญ/AISยทADS-B ๊ตฌ์—ญ/๋‰ด์Šค ํ”ผ๋“œ/ํ‚ค์›Œ๋“œ โ†’ config.json ์ €์žฅ)

๊ณตํ†ต: ์ขŒ์ธก AO ์›Œ์น˜๋ฆฌ์ŠคํŠธ(S0 ์ง€์—ญ์€ +n QUIET ์ ‘๊ธฐ, ๏ผ‹ ๋ฒ„ํŠผ์œผ๋กœ AO ์ถ”๊ฐ€ยทํŽธ์ง‘, ์ž์‚ฐ ํด๋ฆญ โ†’ Feed ํ•„ํ„ฐ), ์šฐ์ธก ์ธ์ŠคํŽ™ํ„ฐ(์ด๋ฒคํŠธ ์ƒ์„ธยท์ง€์—ญ ๋„์‹œ์—ยท7์ผ ์ŠคํŒŒํฌ๋ผ์ธยทJSON ๋ณต์‚ฌ), ์ƒ๋‹จ THREATCONยทSYNC ์‹ ์„ ๋„ยทUTC/KST ์‹œ๊ณ„ยทLIVE(SSE) ํ† ๊ธ€.

4.3 ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค

ํ‚ค ๋™์ž‘
1โ€“6 ๋ทฐ ์ „ํ™˜ (COP / Feed / Intel / Assets / System / Settings)
Ctrl+K, / ์ปค๋งจ๋“œ ํŒ”๋ ˆํŠธ (๊ฒ€์ƒ‰ยท์ด๋™ยท์•ก์…˜)
J / K ๋‹ค์Œ / ์ด์ „ ์ด๋ฒคํŠธ ์„ ํƒ
F Feed ์ด๋™ + ํ…์ŠคํŠธ ํ•„ํ„ฐ ํฌ์ปค์Šค
R ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ 1ํšŒ ์‹คํ–‰
L LIVE(SSE) ์ŠคํŠธ๋ฆผ ํ† ๊ธ€
Esc ์„ ํƒ ํ•ด์ œ / ์˜ค๋ฒ„๋ ˆ์ด ๋‹ซ๊ธฐ
? ๋‹จ์ถ•ํ‚ค ๋„์›€๋ง

๋ทฐยทํ•„ํ„ฐยท์ •๋ ฌยทLIVE ์ƒํƒœยท์–ธ์–ด๋Š” localStorage์— ์ €์žฅ๋˜์–ด ์ƒˆ๋กœ๊ณ ์นจ ํ›„ ๋ณต์›๋ฉ๋‹ˆ๋‹ค.

4.4 ์–ธ์–ด (ํ•œ๊ตญ์–ด / English)

  • Settings ๋ทฐ(๋‹จ์ถ•ํ‚ค 6) ๋˜๋Š” ์ปค๋งจ๋“œ ํŒ”๋ ˆํŠธ์˜ "Toggle language"๋กœ ์ „ํ™˜.
  • ์ „ํ™˜ ์‹œ ์ง€์—ญ๋ช…ยท์ง€์—ญ ์„ค๋ช…ยท๋„์›€๋งยทํˆดํŒยท์„ค์ • ๋ผ๋ฒจ์ด ํ•ด๋‹น ์–ธ์–ด๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค (์ฝ˜์†” ํฌ๋กฌ์˜ mono ๋ ˆ์ด๋ธ”์€ ๋””์ž์ธ์ƒ ์–‘์ชฝ ๋ชจ๋‘ ์˜๋ฌธ ์œ ์ง€).
  • Intel ๋ฆฌํฌํŠธ๋Š” ๊ทœ์น™ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๊ตญ์–ด๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

5) AI ์—์ด์ „ํŠธ ์—ฐ๋™

5.1 MCP ์„œ๋ฒ„ (๊ถŒ์žฅ)

์™ธ๋ถ€ SDK ์˜์กด์„ฑ ์—†๋Š” stdio MCP ์„œ๋ฒ„๋ฅผ ๋‚ด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋งŒ ์ฝ์œผ๋ฏ€๋กœ API ํ‚ค ์—†์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(kaven_run_collection ์ œ์™ธ).

# Claude Code (์ €์žฅ์†Œ ๋ฃจํŠธ์—์„œ)
claude mcp add kaven -- python -m src.kaven.mcp_server
// claude_desktop_config.json
{
  "mcpServers": {
    "kaven": {
      "command": "python",
      "args": ["-m", "src.kaven.mcp_server"],
      "cwd": "/path/to/kaven"
    }
  }
}
๋„๊ตฌ ์„ค๋ช…
kaven_ops_summary ํ†ตํ•ฉ ์ƒํ™ฉ ์š”์•ฝ (์œ„ํ˜‘ ์ˆ˜์ค€ยท์ง€์—ญยท์ด๋ฒคํŠธยท์ž์‚ฐยท๊ฐ์‹œ๊ตฌ์—ญ)
kaven_events ํ‰ํƒ„ํ™” ์ด๋ฒคํŠธ ์ฟผ๋ฆฌ (severity/์ง€์—ญ/์นดํ…Œ๊ณ ๋ฆฌ/์‹ ํ˜ธ/ํ‚ค์›Œ๋“œ ํ•„ํ„ฐ)
kaven_agent_context LLM ํ”„๋กฌํ”„ํŠธ ์ฃผ์ž…์šฉ ์••์ถ• ๋งˆํฌ๋‹ค์šด ๋ธŒ๋ฆฌํ•‘
kaven_region ์ง€์—ญ ์ƒ์„ธ + ์ตœ๊ทผ N์ผ severity ํžˆ์Šคํ† ๋ฆฌ
kaven_daily_report ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์ผ์ผ ๋ธŒ๋ฆฌํ•‘ (๋งˆํฌ๋‹ค์šด)
kaven_portfolio ์ž์‚ฐ๋ณ„ ํˆฌ์ž ์˜ํ–ฅ ์ง‘๊ณ„
kaven_config ์ˆ˜์ง‘ ์„ค์ • ์กฐํšŒ
kaven_run_collection ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ 1ํšŒ ์ฆ‰์‹œ ์‹คํ–‰

5.2 REST

curl http://127.0.0.1:8000/agent/manifest                          # ๋””์Šค์ปค๋ฒ„๋ฆฌ ์นดํƒˆ๋กœ๊ทธ
curl "http://127.0.0.1:8000/agent/context?severity_min=3"          # LLM ๋ธŒ๋ฆฌํ•‘
curl "http://127.0.0.1:8000/agent/events?region=korea&severity_min=4"

์ด๋ฒคํŠธ ์Šคํ‚ค๋งˆ ์–ดํœ˜(์ง€์—ญ ์ฝ”๋“œยท์นดํ…Œ๊ณ ๋ฆฌยท์‹ ํ˜ธยทseverity ์˜๋ฏธ)๋Š” /agent/manifest์˜ vocabulary ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ฝ˜์†”์˜ ์ปค๋งจ๋“œ ํŒ”๋ ˆํŠธ์—๋„ "Copy ops briefing (LLM context)" ์•ก์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

6) ์„ค์ •

6.1 ๊ฐ์‹œ๊ตฌ์—ญ/ํ”ผ๋“œ/ํ‚ค์›Œ๋“œ (config.json)

ํƒ์ƒ‰ ์ˆœ์„œ: KAVEN_CONFIG ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฒฝ๋กœ โ†’ src/kaven/config.json โ†’ ๋‚ด์žฅ ๊ธฐ๋ณธ๊ฐ’.

cp src/kaven/config.example.json src/kaven/config.json   # ํŽธ์ง‘ ํ›„ ์žฌ์‹œ์ž‘

์ง€์› ์„น์…˜: ais_zones, adsb_zones, news_feeds, news_keywords, social_keywords, assets, regions, cli_providers. ๊ฐ ํ•ญ๋ชฉ์˜ enabled: false๋กœ ์ˆ˜์ง‘/์ง‘๊ณ„์—์„œ ์ œ์™ธ (ํŒŒ์ผ์—๋Š” ์œ ์ง€), ํŠน์ • ์„น์…˜๋งŒ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ์„น์…˜๋งŒ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋กœ๋“œ ์ƒํƒœ๋Š” GET /config์œผ๋กœ ํ™•์ธ.

์ง€์› ์„น์…˜ ์ „์ฒด๊ฐ€ ์ฝ˜์†” Settings ๋ทฐ์—์„œ ์ง์ ‘ ํŽธ์ง‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (PUT /config/{section}, ์„น์…˜๋ณ„ ๊ฒ€์ฆ: ์ขŒํ‘œ ๋ฒ”์œ„, URL ์Šคํ‚ด, ์œ ํ˜• ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ, ์ค‘๋ณต ๊ธˆ์ง€). ์„น์…˜๋ณ„ ์˜๋ฏธ:

์„น์…˜ ๋ฐ˜์˜ ์ง€์ 
assets ํฌํŠธํด๋ฆฌ์˜ค/์›Œ์น˜๋ฆฌ์ŠคํŠธ ์ž์‚ฐ ๋ฉ”ํƒ€. ๋ฏธ๋“ฑ๋ก ์ž์‚ฐ์€ type: other๋กœ ํ‘œ์‹œ, enabled: false๋Š” ์ง‘๊ณ„ ์ œ์™ธ
regions ๊ฐ์‹œ ์ง€์—ญ(AO) โ€” ์ฝ”๋“œ/์ด๋ฆ„(ํ•œยท์˜)/์ขŒํ‘œ/์„ค๋ช…. ์ง€๋„ยท์›Œ์น˜๋ฆฌ์ŠคํŠธยท๊ฐ€์ด๋“œยท์—์ด์ „ํŠธ ์–ดํœ˜์— ๋ฐ˜์˜. ์ƒˆ ์ง€์—ญ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
ais_zones / adsb_zones ํ•ด์ƒ/๊ณต์—ญ ๊ฐ์‹œ๊ตฌ์—ญ bounding box + ์ง€๋„ ์˜ค๋ฒ„๋ ˆ์ด
news_feeds / news_keywords / social_keywords ์ˆ˜์ง‘๊ธฐ ์†Œ์Šค/๊ฒ€์ƒ‰์–ด
cli_providers AI CLI ๊ตฌ๋… ๋ธŒ๋ฆฌ์ง€ โ€” ์ด๋ฆ„/๋ช…๋ น(ํ”„๋กฌํ”„ํŠธ๋Š” ๋งˆ์ง€๋ง‰ ์ธ์ž๋กœ ์ „๋‹ฌ). Settings โ†’ ๋ชจ๋ธ ๊ณต๊ธ‰์ž์—์„œ ํŽธ์ง‘

์ฐธ๊ณ : regions์— ์ƒˆ ์ง€์—ญ(AO)์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ง€๋„ยท์›Œ์น˜๋ฆฌ์ŠคํŠธยท์—์ด์ „ํŠธ ์–ดํœ˜ (/agent/manifest)๋Š” ๋ฌผ๋ก  ๋ถ„์„๊ธฐ(LLM) ํ”„๋กฌํ”„ํŠธ์˜ ์ง€์—ญ ์ฝ”๋“œ ์–ดํœ˜์—๋„ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์–ด, ๋‹ค์Œ ์ˆ˜์ง‘ run๋ถ€ํ„ฐ ํ•ด๋‹น ์ฝ”๋“œ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ถ„๋ฅ˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†” ์›Œ์น˜๋ฆฌ์ŠคํŠธ์˜ AREAS OF OPERATION ํ—ค๋” ๏ผ‹ ๋ฒ„ํŠผ์œผ๋กœ ํŽธ์ง‘ ํ™”๋ฉด์— ๋ฐ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ AO๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์ „๊นŒ์ง€ S0์ด๋ฏ€๋กœ +n QUIET ์ ‘ํž˜ ์•ˆ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

{
  "ais_zones": [
    {"id": "hormuz", "name": "ํ˜ธ๋ฅด๋ฌด์ฆˆ ํ•ดํ˜‘", "enabled": true,
     "lat_min": 25.5, "lat_max": 27.0, "lon_min": 56.0, "lon_max": 57.5,
     "baseline_ships": 50}
  ]
}

6.2 ์ฃผ์š” ํ™˜๊ฒฝ๋ณ€์ˆ˜

๋ณ€์ˆ˜ ์šฉ๋„ ๊ธฐ๋ณธ๊ฐ’
KAVEN_CONFIG ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ override src/kaven/config.json
KAVEN_LOG_DIR JSONL ๋กœ๊ทธ ๋””๋ ‰ํ„ฐ๋ฆฌ (์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ณตํ†ต) src/kaven/logs
SEARXNG_URL ๋‰ด์Šค/์†Œ์…œ ๊ฒ€์ƒ‰ ์—”์ง„ http://localhost:8080
OPENAI_BASE_URL ์™ธ ๋ถ„์„ LLM (ยง3.2 ์ฐธ์กฐ) ๊ทœ์น™ ๊ธฐ๋ฐ˜ ํด๋ฐฑ
ANTHROPIC_AUTH_TOKEN ๊ตฌ๋… OAuth ํ† ํฐ (๋˜๋Š” ant auth login ํ”„๋กœํ•„ ์ž๋™ ์‚ฌ์šฉ) โ€”
ANTHROPIC_BASE_URL Anthropic ํ˜ธํ™˜ ์—”๋“œํฌ์ธํŠธ (GLM/Kimi ๋“ฑ) api.anthropic.com
ANTHROPIC_MODEL Anthropic ๊ณ„์—ด ๋ถ„์„ ๋ชจ๋ธ claude-sonnet-5
KAVEN_CLI_PROVIDER CLI ๋ธŒ๋ฆฌ์ง€ ์„ ํƒ โ€” auto/off/ํŠน์ • id auto
TELEGRAM_* ๊ฒฝ๋ณด ๋ฐœ์†ก ๋ฏธ๋ฐœ์†ก
CONVEX_SITE_URL ์›๊ฒฉ ๋ฐฑ์—… opt-in ๋น„ํ™œ์„ฑ

7) API ์š”์•ฝ

FastAPI ๋ฌธ์„œ: GET /docs (Swagger UI), GET /openapi.json

์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
GET /health ํ—ฌ์Šค์ฒดํฌ + ๋ฒ„์ „ + ๋ถ„์„ ๋ฐฑ์—”๋“œ ์ƒํƒœ(analysis โ€” ์ธ์ฆ ๋ชจ๋“œ/CLI ์„ค์น˜ ์—ฌ๋ถ€, ๋น„๋ฐ€๊ฐ’ ๋ฏธ๋…ธ์ถœ)
GET /ops/summary?date= ์ฝ˜์†”์šฉ ํ†ตํ•ฉ ์š”์•ฝ (์ง€์—ญ+์ด๋ฒคํŠธ+์ž์‚ฐ+๊ฐ์‹œ๊ตฌ์—ญ)
GET /agent/manifest ยท /agent/context ยท /agent/events AI ์—์ด์ „ํŠธ ์—ฐ๋™ (ยง5)
GET /runs ยท /runs/latest ยท /runs/files ยท /runs/dates ์‹คํ–‰ ๋กœ๊ทธ ์กฐํšŒ (+ํ•„ํ„ฐ)
POST /runs/once ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ 1ํšŒ ์‹คํ–‰
GET /runs/stream SSE ์‹ค์‹œ๊ฐ„ run ์ŠคํŠธ๋ฆผ
GET /report ยท /report/dates ยท /report/{YYYYMMDD} ์ผ์ผ ๋ฆฌํฌํŠธ
GET /guide ยท /guide/{region}?days= ์ง€์—ญ ๊ฐ€์ด๋“œ + ํžˆ์Šคํ† ๋ฆฌ
GET /map/data ์ง€๋„ ๋งˆ์ปค ๋ฐ์ดํ„ฐ
GET /portfolio ยท /portfolio/{asset} ์ž์‚ฐ ์˜ํ–ฅ ์ง‘๊ณ„
GET /config ์ˆ˜์ง‘ ์„ค์ • ์กฐํšŒ
PUT /config/{section} ์„ค์ • ์„น์…˜ ์ €์žฅ โ€” assets/regions/ais_zones/adsb_zones/news_feeds/news_keywords/social_keywords/cli_providers (Settings ๋ทฐ๊ฐ€ ์‚ฌ์šฉ)
PUT /config/credentials ๋ชจ๋ธ ํ‚คยทํ† ํฐ ์ €์žฅ/์‚ญ์ œ (Settings โ†’ ๋ชจ๋ธ ๊ณต๊ธ‰์ž ์นด๋“œ. ๋นˆ ๊ฐ’ = ์—ฐ๊ฒฐ ํ•ด์ œ. GET /config ์‘๋‹ต์— ๋ฏธ๋…ธ์ถœ, ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์šฐ์„ )
POST /cli/{id}/login CLI ๋ธŒ๋ฆฌ์ง€ OAuth ๋กœ๊ทธ์ธ ์‹คํ–‰ โ€” ๋ฐฑ์—”๋“œ ๋จธ์‹ ์—์„œ ํ„ฐ๋ฏธ๋„ ์ฐฝ ๋˜๋Š” ๋กœ๊ทธ์ธ URL ์ถ”์ถœ (Settings ์—ฐ๊ฒฐ ๋ฒ„ํŠผ์ด ์‚ฌ์šฉ)

8) ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/kaven/
โ”œโ”€โ”€ kaven.py            # ๋ฉ”์ธ ์‹คํ–‰๊ธฐ (--once / --watch), dedup, ๋ฐœ์†ก, ์ €์žฅ
โ”œโ”€โ”€ collectors/         # ais / adsb / news / social ์ˆ˜์ง‘๊ธฐ
โ”œโ”€โ”€ analyzer.py         # LLM ๋ถ„์„ ์—”์ง„ (๋‹ค๋‹จ๊ณ„ ํด๋ฐฑ)
โ”œโ”€โ”€ anthropic_auth.py   # Anthropic ์ธ์ฆ ํ•ด์„ (API ํ‚ค / ๊ตฌ๋… OAuth / ant CLI)
โ”œโ”€โ”€ cli_providers.py    # CLI ๊ตฌ๋… ๋ธŒ๋ฆฌ์ง€ (claude/codex/cursor-agent/gemini)
โ”œโ”€โ”€ signal_generator.py # ํ…”๋ ˆ๊ทธ๋žจ ๊ฒฝ๋ณด
โ”œโ”€โ”€ config_loader.py    # ๊ฐ์‹œ๊ตฌ์—ญ/ํ”ผ๋“œ/ํ‚ค์›Œ๋“œ ์„ค์ • ๋กœ๋”
โ”œโ”€โ”€ log_store.py        # JSONL ๋กœ๊ทธ ์•ก์„ธ์Šค ๋‹จ์ผ ์†Œ์Šค (KAVEN_LOG_DIR)
โ”œโ”€โ”€ regions.py          # ์ง€์—ญ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ + ์Šคํ‚ค๋งˆ ์–ดํœ˜ ๋‹จ์ผ ์†Œ์Šค
โ”œโ”€โ”€ ops_summary.py      # COP ํ†ตํ•ฉ ์ง‘๊ณ„
โ”œโ”€โ”€ aggregates.py       # ๊ฐ€์ด๋“œ/์ง€๋„/ํฌํŠธํด๋ฆฌ์˜ค ์ง‘๊ณ„
โ”œโ”€โ”€ report_generator.py # ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์ผ์ผ ๋ฆฌํฌํŠธ
โ”œโ”€โ”€ agent_service.py    # ์—์ด์ „ํŠธ ์ฟผ๋ฆฌยท์ปจํ…์ŠคํŠธยท๋งค๋‹ˆํŽ˜์ŠคํŠธ
โ””โ”€โ”€ mcp_server.py       # stdio MCP ์„œ๋ฒ„ (์˜์กด์„ฑ ์—†์Œ)

webapp/
โ”œโ”€โ”€ backend/app.py      # FastAPI ์•ฑ ์กฐ๋ฆฝ (CORS + ๋ผ์šฐํ„ฐ ์—ฐ๊ฒฐ๋งŒ)
โ”œโ”€โ”€ backend/routers/    # system / runs / ops / agent / intel / portfolio
โ””โ”€โ”€ frontend/index.html # Ops Console SPA (๋‹จ์ผ ํŒŒ์ผ, vanilla JS)

tests/                  # pytest (์—์ด์ „ํŠธ/MCP/์ง‘๊ณ„/์„ค์ •/dedup ๋“ฑ)
docs/                   # release-notes, ์šด์˜ ๋ฌธ์„œ, README ์ด๋ฏธ์ง€
deploy/                 # Dockerfile, docker-compose, systemd ์œ ๋‹›

9) ํ…Œ์ŠคํŠธ

make test          # ์ „์ฒด
make test-kaven    # ํ•ต์‹ฌ(dedup/policy)
pytest -q          # ์ง์ ‘ ์‹คํ–‰
ruff check .       # ๋ฆฐํŠธ

์ฐธ๊ณ : test_kaven_log_replay_integration.py 1๊ฑด์€ v0.0.05 ์ €์žฅ์†Œ ์œ„์ƒ ์ž‘์—…(์šด์˜ ๋กœ๊ทธ ์ถ”์  ํ•ด์ œ)์œผ๋กœ ์ƒ˜ํ”Œ ๋กœ๊ทธ๊ฐ€ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค โ€” ๊ธฐ์กด ์•Œ๋ ค์ง„ ์ด์Šˆ๋กœ ์ฝ”๋“œ ๊ฒฐํ•จ์ด ์•„๋‹™๋‹ˆ๋‹ค.

10) ์šด์˜ / ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

  • ๋กœ๊ทธ: src/kaven/logs/kaven_YYYYMMDD.jsonl (๊ตฌ maven_*.jsonl ์ฝ๊ธฐ ํ˜ธํ™˜), dedup ์บ์‹œ sent_cache.json. KAVEN_LOG_DIR๋กœ ์œ„์น˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ.
  • ์ธํ”„๋ผ ์˜ˆ์‹œ:
    docker run --rm -d --name searxng -p 8080:8080 searxng/searxng   # ๊ฒ€์ƒ‰ ์—”์ง„
    cd deploy/docker && docker compose up -d                          # compose ์Šค์บํด๋“œ
  • ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ
    • TELEGRAM_CHAT_ID๋ฅผ ์จ์•ผ ํ•จ (CHAT_ID ์•„๋‹˜) โ€” ์ƒ์„ธ: docs/telegram-faq.md
    • .env๋Š” ๋ฃจํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ src/kaven/.env์— ์žˆ์–ด์•ผ ์ž๋™ ๋กœ๋“œ๋จ
    • SearxNG ๋ฏธ๊ตฌ๋™ ์‹œ ๋‰ด์Šค/์†Œ์…œ ์ˆ˜์ง‘ ์ €ํ•˜
    • CONVEX_SITE_URL ๋ฏธ์„ค์ • โ€” ์™ธ๋ถ€ ์ „์†ก ์Šคํ‚ต ๋กœ๊ทธ๋Š” ์ •์ƒ ๋™์ž‘ (opt-in ์ •์ฑ…)
    • ์ฝ˜์†” ์ง€๋„๋Š” ๋กœ์ปฌ ๋ฒˆ๋“ค(Leaflet + Natural Earth)๋กœ ๋ Œ๋”๋ง๋˜๋ฏ€๋กœ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ํ•„์š” ์—†์Œ. ๊ธฐ๋ฐ˜ ์ง€๋„ ๋ฐ์ดํ„ฐ: Natural Earth (public domain)

11) ๋ฌธ์„œยท๊ธฐ์—ฌยท๋ผ์ด์„ ์Šค

  • ๋ณ€๊ฒฝ ์ด๋ ฅ: docs/release-notes.md (๋ฒ„์ „ ์ •์ฑ…: ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๋งˆ๋‹ค ๋ฒ„์ „ ์ƒ์Šน)
  • ์›น์•ฑ ์ƒ์„ธ: webapp/README.md ยท ์ฝ”์–ด ์ƒ์„ธ: src/kaven/README.md
  • ์šด์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ: docs/webapp-checklist.md ยท ํ…”๋ ˆ๊ทธ๋žจ: docs/telegram-faq.md
  • ๊ธฐ์—ฌ: ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ โ†’ pytest -qยทruff check . ํ†ต๊ณผ โ†’ ๋ฌธ์„œ/๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ๊ฐฑ์‹  โ†’ PR (๋ณ€๊ฒฝ ์ด์œ ยทํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผยท์šด์˜ ์˜ํ–ฅ ๋ช…์‹œ)
  • ๋ผ์ด์„ ์Šค: MIT โ€” ์ž์œ ๋กœ์šด ์‚ฌ์šฉ/์ˆ˜์ •/์žฌ๋ฐฐํฌ, ์ €์ž‘๊ถŒ ๊ณ ์ง€ ์œ ์ง€

About

KAVEN = Korean AI-based Vigilance for Event Navigation. KAVEN (Kaven) is an AI-based early warning system that collects geopolitical events from various sources (AIS/ADS-B/News/Social Media), analyzes and deduplicates the data, and delivers alerts via Telegram.

Resources

Stars

49 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages