Skip to content

Latest commit

ย 

History

7,556 Commits

Folders and files

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

DartLab

DartLab

์ข…๋ชฉ์ฝ”๋“œ ํ•˜๋‚˜. ๊ธฐ์—…์˜ ์ „์ฒด ์ด์•ผ๊ธฐ.

Korean DART + US SEC EDGAR ๊ณต์‹œ๋ฅผ ํ•œ ์ค„์˜ Python ์œผ๋กœ ์ฝ๊ณ  ๋น„๊ตํ•œ๋‹ค.

PyPI Python License CI Docs Blog YouTube Music Podcast

๋ฌธ์„œ ยท Skill OS ยท Skill Market ยท ๋ธ”๋กœ๊ทธ ยท Colab์—์„œ ์—ด๊ธฐ ยท Molab์—์„œ ์—ด๊ธฐ ยท English ยท ํ›„์›

HuggingFace Data Desktop Download

DartLab: ๊ณต์‹œ๋ฅผ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋กœ

๊ณต์‹œ ๋ทฐ์–ด ๋ฐ”๋กœ๊ฐ€๊ธฐ ย ย  dartlab ๊ณต์‹ ํŽ˜์ด์ง€

ํ„ฐ๋ฏธ๋„: ๋ธ”๋ฃธ๋ฒ„๊ทธ์‹์— ๋„์ „ํ•˜๋‹ค

DartLab ํ„ฐ๋ฏธ๋„

์ข…๋ชฉ ํ•˜๋‚˜๋กœ ์žฌ๋ฌดยท์ฃผ๊ฐ€ยท๊ณต์‹œยท์‹ ์šฉยท์‚ฐ์—…ยท๋งคํฌ๋กœ๋ฅผ ํ•œ ํ™”๋ฉด์—์„œ ์ฝ๋Š” ๋ธ”๋ฃธ๋ฒ„๊ทธ์‹ ํ„ฐ๋ฏธ๋„์— ๋„์ „ํ•˜๋Š” DartLab ํ„ฐ๋ฏธ๋„. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™”๋ฉด ์œ„์— ์˜ฌ๋ ธ๋‹ค.

์ด ํ„ฐ๋ฏธ๋„์€ @youngchangjo ๋‹˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐ›์€ ์˜๊ฐ์œผ๋กœ ์‹œ์ž‘๋์Šต๋‹ˆ๋‹ค.

DartLab ๋ฌด์—‡์„ ํ•ด์ฃผ๋Š”๊ฐ€

DartLab์€ DART์™€ EDGAR ๊ณต์‹œ๋ฅผ ์ข…๋ชฉ์ฝ”๋“œ ํ•˜๋‚˜๋กœ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊พธ๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ์žฌ๋ฌด์ œํ‘œ, ์‚ฌ์—…๋ณด๊ณ ์„œ ๋ณธ๋ฌธ, ๊ณต์‹œ ๋ชฉ๋ก, ๋น„์œจ, ์‹ ์šฉ์œ„ํ—˜, ์‚ฐ์—… ๋งต, ๋งคํฌ๋กœ ๋งฅ๋ฝ์„ ๊ฐ™์€ Company ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฝ๋Š”๋‹ค.

ํ•ต์‹ฌ์€ ๋‹จ์ˆœ ์ˆ˜์ง‘์ด ์•„๋‹ˆ๋‹ค. ํšŒ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ณ„์ •๋ช…๊ณผ ๊ณต์‹œ ๋ชฉ์ฐจ๋ฅผ topic ร— period, account ร— period ํ˜•ํƒœ๋กœ ์ˆ˜ํ‰ํ™”ํ•ด์„œ ์ž‘๋…„๊ณผ ์˜ฌํ•ด, ์‚ผ์„ฑ์ „์ž์™€ ์• ํ”Œ, ํ•œ ์ข…๋ชฉ๊ณผ ์ „์ฒด ์‹œ์žฅ์„ ๊ฐ™์€ ์งˆ๋ฌธ์œผ๋กœ ๋น„๊ตํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

Before After
์‚ฌ์—…๋ณด๊ณ ์„œ ์—ฌ๋Ÿฌ ํ•ด๋ฅผ ์—ด๊ณ  ๋ชฉ์ฐจ๋ฅผ ๋งž์ถ˜๋‹ค c.panel()
XBRL ๊ณ„์ •๋ช…๊ณผ ํ•œ๊ธ€ ํ•ญ๋ชฉ๋ช…์„ ์ง์ ‘ ๋งคํ•‘ํ•œ๋‹ค c.panel("IS")
์ „ ์ข…๋ชฉ ์žฌ๋ฌด๋น„์œจ์„ ์ง์ ‘ ์ˆ˜์ง‘ยท์ •๊ทœํ™”ํ•œ๋‹ค dartlab.scan("profitability")
AI ๋‹ต๋ณ€์˜ ์ˆซ์ž๋ฅผ ๋‹ค์‹œ ๊ฒ€์‚ฐํ•œ๋‹ค dartlab.ask(...) + ์‹คํ–‰ ๊ทผ๊ฑฐ ref

์„ธ ๊ฐ€์ง€ ์‹œ์ž‘์ 

DartLab์€ AI / Python / CLI ์„ธ ๊ธธ์„ ๊ฐ™์€ ๋ฐ์ดํ„ฐยท๊ฐ™์€ ์—”์ง„ ์œ„์— ์˜ฌ๋ ค๋†“๋Š”๋‹ค. ์ž๊ธฐ ๋งฅ๋ฝ์— ๋งž๋Š” ๊ธธ๋กœ ์ง„์ž…ํ•˜๋ฉด ๋œ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ์‹ ์ฝ”๋“œ ๊ธธ์ด ์ฒซ ๊ฒฐ๊ณผ ์ด๋Ÿฐ ์‚ฌ๋žŒ์—๊ฒŒ ๋งž๋‹ค
AI๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ 1 ์ค„ ~1 ๋ถ„ ์งˆ๋ฌธ์„ ๋˜์ง€๊ณ  ๊ทผ๊ฑฐ ์žˆ๋Š” ๋‹ต๋ณ€์„ ๋ฐ›๊ณ  ์‹ถ์€ ๋ถ„์„๊ฐ€
Python ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ 3-5 ์ค„ ~3 ๋ถ„ ์žฌ๋ฌด์ œํ‘œยท๊ณต์‹œยท์Šค์บ” ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๊ฐœ๋ฐœ์ž
CLI ๋กœ ์‚ฌ์šฉ 1 ๋ช…๋ น ~2 ๋ถ„ ๋‹จ๋ฐœ ์กฐํšŒยท์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธยท์…ธ ํŒŒ์ดํ”„๋ผ์ธ ์‚ฌ์šฉ์ž

๊ฐ ๊ฒฝ๋กœ๋Š” ๋ชจ๋‘ dartlab.Company ์™€ ๊ฐ™์€ ๋ถ„์„ ์—”์ง„์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ถœ๋ฐœ์ ๋งŒ ๋‹ค๋ฅผ ๋ฟ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค.

AI๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ

๊ธฐ์—… ์ด๋ฆ„์ด๋‚˜ ์ข…๋ชฉ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ณ  ์ž์—ฐ์–ด๋กœ ๋ฌผ์–ด๋ณด๋ฉด, PC์— ์„ค์น˜๋œ Codex CLI, Claude Code, Cline ์ค‘ ํ•˜๋‚˜๊ฐ€ DartLab MCP์˜ Company, analysis, credit, scan, macro ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋กœ๊ทธ์ธยท๋ชจ๋ธยท๋Œ€ํ™” ์›๋ฌธ์€ ํ•ด๋‹น agent CLI๊ฐ€ ์†Œ์œ ํ•˜๊ณ  DartLab์€ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์™€ ์ถ”์  ๊ฐ€๋Šฅํ•œ ref๋งŒ ์—ฐ๊ฒฐํ•œ๋‹ค.

Windows Desktop Download Skill OS

import dartlab

dartlab.ask("์‚ผ์„ฑ์ „์ž ์žฌ๋ฌด๊ฑด์ „์„ฑ ๋ถ„์„ํ•ด์ค˜")
# ์„ค์น˜๋œ agent๊ฐ€ DartLab MCP๋กœ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทผ๊ฑฐ ref๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜
# ์…‹ ์ค‘ ์ด๋ฏธ ์“ฐ๋Š” agent ํ•˜๋‚˜๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ•ด๋‹น CLI์—์„œ ๋กœ๊ทธ์ธ
npm install -g @openai/codex
codex login

# DartLab์ด ์„ค์น˜ยท๋ฒ„์ „ยทMCP ์ƒํƒœ๋ฅผ ํ™•์ธ
dartlab agent status --refresh

# ๋ช…๋ น์„ ๋จผ์ € ๊ฒ€ํ† ํ•˜๊ณ , ์ถœ๋ ฅ๋œ digest๋ฅผ ๋ถ™์˜€์„ ๋•Œ๋งŒ MCP ์„ค์ • ์‹คํ–‰
dartlab agent connect codex
dartlab agent connect codex --approve-digest <์ถœ๋ ฅ๋œ-digest>

AI ๊ฒฝ๋กœ์˜ ์žฅ์ :

  • ๋ถ„์„ ํ๋ฆ„์„ ์ง์ ‘ ์„ค๊ณ„: ์งˆ๋ฌธ์— ๋งž์ถฐ ๊ณต์‹œ, ์žฌ๋ฌด์ œํ‘œ, ์‹ ์šฉ, ๋งคํฌ๋กœ, peer ๋น„๊ต ๋„๊ตฌ๋ฅผ ์กฐํ•ฉํ•œ๋‹ค.
  • ์ˆซ์ž ๊ฒ€์‚ฐ ๊ฐ€๋Šฅ: ๋‹ต๋ณ€ ์† ์ˆซ์ž์™€ ํ‘œ๋Š” ์‹คํ–‰ ๊ฒฐ๊ณผ ref์— ์—ฐ๊ฒฐ๋œ๋‹ค.
  • ๊ณต์‹œ ๋ณธ๋ฌธ์€ ๋ฐ์ดํ„ฐ๋กœ๋งŒ ์ฒ˜๋ฆฌ: DART/EDGAR/์›น ๋ณธ๋ฌธ ์•ˆ์˜ ์ง€์‹œ๋Š” ๋”ฐ๋ฅด์ง€ ์•Š๊ณ  ๋ถ„์„ ๊ทผ๊ฑฐ๋กœ๋งŒ ์“ด๋‹ค.
  • ๋‚ด ๊ณ„์ • ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ: DartLab์— ๋ชจ๋ธ API key๋‚˜ OAuth token์„ ์ž…๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ณต๊ตฌ ๋™์ž‘์ด ํ•œ๊ณณ์— ์žˆ์Œ: ๋กœ์ปฌ UI์˜ Runtime Center๊ฐ€ ํƒ์ง€, ์„ค์น˜ ๊ณ„ํš, MCP ์—ฐ๊ฒฐ, runtime ์„ ํƒ์„ ๋‹ด๋‹นํ•œ๋‹ค.
claude mcp add dartlab -- dartlab mcp
codex  mcp add dartlab -- dartlab mcp

Claude Desktop ยท ์›๊ฒฉ SSE ยท ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์˜ต์…˜์€ MCP ์„น์…˜ ์ฐธ์กฐ.

Python ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ

์ฝ”๋“œ ๊ฒฝ๋กœ๋Š” Company๊ฐ€ ์ค‘์‹ฌ์ด๋‹ค. ์ข…๋ชฉ์ฝ”๋“œ ํ•˜๋‚˜๋กœ ์žฌ๋ฌด์ œํ‘œ, ๊ณต์‹œ ๋ณธ๋ฌธ, ์ •ํ˜• ๋ณด๊ณ ์„œ, ๋น„์œจ์„ c.panel ๋‹จ์ผ ํ‘œ๋ฉด์—์„œ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. c.panel ์„ ์žก๋Š” ์ˆœ๊ฐ„ ํ•ญ๋ชฉร—๊ธฐ๊ฐ„ ๊ฒฉ์ž๊ฐ€ ๋œ๋‹ค.

uv add dartlab
import dartlab

c = dartlab.Company("005930")       # ์‚ผ์„ฑ์ „์ž

c.panel()                           # ์ „์ฒด ๊ณต์‹œ ์ˆ˜ํ‰ํ™” ๊ฒฉ์ž (ํ•ญ๋ชฉ ร— ๊ธฐ๊ฐ„)
c.panel("IS")                       # ์†์ต๊ณ„์‚ฐ์„œ (finance ์ •๊ทœํ™” ์ˆซ์ž)
c.panel("is")                       # native ์†์ต - ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ (XBRL+์˜› ํ†ตํ•ฉ 2013~)
c.panel("ratios")                   # native ์žฌ๋ฌด๋น„์œจ (5ํ‘œ ํ•ญ๋ชฉ์œผ๋กœ ๊ณ„์‚ฐ)
c.panel("์‚ฌ์—…")                      # ์‚ฌ์—… ๊ฐœ์š” ๋“ฑ ๊ณต์‹œ ๋ณธ๋ฌธ ํ–‰ ๊ฒ€์ƒ‰
c.filings()                         # ์›๋ฌธ ๊ณต์‹œ ๋งํฌ
# ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋‹ค๋ฅธ ์‹œ์žฅ
kr = dartlab.Company("005930")
us = dartlab.Company("AAPL")

kr.panel("IS")
us.panel("IS")

Python ๊ฒฝ๋กœ์˜ ์žฅ์ :

  • API ํ‚ค ์—†์ด ์‹œ์ž‘: ์‚ฌ์ „ ๊ตฌ์ถ• ๋ฐ์ดํ„ฐ๋Š” HuggingFace์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋กœ์ปฌ์— ์บ์‹œํ•œ๋‹ค.
  • ๊ธฐ๊ฐ„ ๋น„๊ต๊ฐ€ ๊ธฐ๋ณธ: ๊ณต์‹œ ๋ณธ๋ฌธ๊ณผ ์žฌ๋ฌด์ œํ‘œ๋ฅผ ๊ธฐ๊ฐ„ ์ถ•์œผ๋กœ ๋งž์ถ˜๋‹ค.
  • ํ•œ๊ตญ๊ณผ ๋ฏธ๊ตญ์„ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์กฐํšŒ: DART์™€ EDGAR์˜ ์ฐจ์ด๋Š” provider๊ฐ€ ํก์ˆ˜ํ•œ๋‹ค.
  • ์—”์ง„ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ: analysis, credit, macro, quant, industry, story ๊ฒฐ๊ณผ๋ฅผ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๋‹ค๋ฃฌ๋‹ค.

CLI ๋กœ ์‚ฌ์šฉ

์„ค์น˜ ํ›„ ์…ธ์—์„œ dartlab ๋ช…๋ น์œผ๋กœ ๊ฐ™์€ ์—”์ง„์„ ํ˜ธ์ถœํ•œ๋‹ค. ๋‹จ๋ฐœ ์กฐํšŒยท์…ธ ์ž๋™ํ™”ยทํŒŒ์ดํ”„๋ผ์ธ ์นœํ™”์ .

uv add dartlab

dartlab help "์™ธ์ธ ๋งค์ˆ˜"            # ๋„์›€๋ง + ๋งค์นญ capability ํƒ์ƒ‰
dartlab list scan                    # scan ์นดํ…Œ๊ณ ๋ฆฌ recipe ์ธ๋ฑ์Šค
dartlab show 005930 IS               # ์†์ต๊ณ„์‚ฐ์„œ ์ถœ๋ ฅ (Python c.panel("IS") ๋“ฑ๊ฐ€)
dartlab analyze 005930 --aspect credit
dartlab mcp                          # MCP ์„œ๋ฒ„ ์ง„์ž… (์™ธ๋ถ€ LLM ๋„๊ตฌ ๋“ฑ๋ก์šฉ)

CLI ๊ฒฝ๋กœ์˜ ์žฅ์ :

  • API ํ‚ค ์—†์ด ๋‹จ๋ฐœ ํ˜ธ์ถœ: HuggingFace ์บ์‹œ ์ž๋™ ์‚ฌ์šฉ
  • ์…ธ ํŒŒ์ดํ”„๋ผ์ธ ์นœํ™”: dartlab show ... --json | jq ... ์‹์œผ๋กœ ํ•ฉ์„ฑ
  • MCP ์„œ๋ฒ„ ์ง„์ž…์  ๋™์ผ: dartlab mcp ํ•œ ๋ช…๋ น์œผ๋กœ ์™ธ๋ถ€ ์–ด์‹œ์Šคํ„ดํŠธ ๋„๊ตฌ ๋…ธ์ถœ

CLI ๋ช…๋ น ์ „์ฒด ๋ชฉ๋ก + ์˜ต์…˜์€ dartlab --help ๋˜๋Š” Skill OS (src/dartlab/skills/specs/operation/code.md) ์ฐธ์กฐ.

๊ฒฐ๊ณผ ์˜ˆ์‹œ

์•„๋ž˜๋Š” Python ๊ฒฝ๋กœ์—์„œ ๋ฐ”๋กœ ์–ป๋Š” ๋Œ€ํ‘œ ๊ฒฐ๊ณผ๋‹ค. ๊ณต์‹œ ๋ณธ๋ฌธ, ์žฌ๋ฌด์ œํ‘œ, ์›๋ฌธ ๋งํฌ๊ฐ€ ๊ฐ™์€ Company ๊ฐ์ฒด์—์„œ ๋‚˜์˜จ๋‹ค.

import dartlab

c = dartlab.Company("005930")       # ์‚ผ์„ฑ์ „์ž

c.panel()                           # ๋ชจ๋“  ํ•ญ๋ชฉ, ๋ชจ๋“  ๊ธฐ๊ฐ„, ๋‚˜๋ž€ํžˆ - ์žก๋Š” ์ˆœ๊ฐ„ ๊ฒฉ์ž
# shape: (223, 14) - ๊ณต์‹œ ํ•ญ๋ชฉ ร— ๊ธฐ๊ฐ„
#                     2026Q1  2025Q4  2025Q3  2024Q4  ...
# (ํ‘œ์ง€)                  v       v       v       v
# ์‚ฌ์—…์˜ ๋‚ด์šฉ             v       v       v       v
# ์žฌ๋ฌด์ƒํƒœํ‘œ              v       v       v       v

ํ…์ŠคํŠธ์™€ ์ˆซ์ž์˜ ์‹œ๊ณ„์—ด ์ˆ˜ํ‰ํ™”: ์ „ ๊ธฐ๊ฐ„ ๋น„๊ต ๊ฐ€๋Šฅ์„ฑ์˜ ํ•ต์‹ฌ

c.panel() ์ถœ๋ ฅ ์˜ˆ์‹œ: ์‚ผ์„ฑ์ „์ž ๊ณต์‹œ ํ•ญ๋ชฉ ร— ๊ธฐ๊ฐ„ ์ „์ฒด ๊ฒฉ์ž
c.panel("IS")                       # ์†์ต๊ณ„์‚ฐ์„œ - finance ์ •๊ทœํ™” (๋ถ„๊ธฐ ๊ธฐ๋ณธ)
c.panel("IS", freq="year")          # freq๋กœ ์—ฐ๊ฐ„ ํ•ฉ์‚ฐ

finance ์ •๊ทœํ™”: XBRL ํ‘œ์ค€๊ณ„์ •(snakeId) + ํ•œ๊ธ€ ํ•ญ๋ชฉ๋ช…, ์› ๋‹จ์œ„ ์ •๋ฐ€ ์ˆซ์ž

c.panel('IS', freq='year'): ์‚ผ์„ฑ์ „์ž ์—ฐ๊ฐ„ ์†์ต๊ณ„์‚ฐ์„œ (finance ์ •๊ทœํ™”)
c.panel("is", freq="year")          # native ์†์ต - ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ (2013~)
c.panel("ratios")                   # native ์žฌ๋ฌด๋น„์œจ, 5ํ‘œ ํ•ญ๋ชฉ์œผ๋กœ ๊ณ„์‚ฐ

์†Œ๋ฌธ์ž=native: ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ, XBRL ์ด์ „๊นŒ์ง€ ๋‹ฟ๋Š” ๊นŠ์€ history (2013~)

c.panel('is', freq='year'): ์‚ผ์„ฑ์ „์ž ์—ฐ๊ฐ„ ์†์ต๊ณ„์‚ฐ์„œ (native, ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ)
c.panel("์‚ฌ์—…")                      # ์‚ฌ์—… ๊ฐœ์š” ๋“ฑ ๊ณต์‹œ ๋ณธ๋ฌธ ํ–‰ ๊ฒ€์ƒ‰
c.panel.search("์žฌ๊ณ ")               # ๋ณธ๋ฌธ ์ „์ฒด ๊ฒ€์ƒ‰

c.filings()                         # ๋ชจ๋“  ๋ณด๊ณ ์„œ - DART ๋ทฐ์–ด๋กœ ๋ฐ”๋กœ ์—ฐ๊ฒฐ

์‚ฌ์—…๋ณด๊ณ ์„œ๋ถ€ํ„ฐ ๋ถ„๊ธฐ๋ณด๊ณ ์„œ๊นŒ์ง€, dartUrl๋กœ ์›๋ฌธ ์ฆ‰์‹œ ํ™•์ธ

c.filings(): ์‚ผ์„ฑ์ „์ž ๋ณด๊ณ ์„œ ๋ชฉ๋ก + DART ๋ทฐ์–ด ๋งํฌ
# ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋‹ค๋ฅธ ๋‚˜๋ผ
us = dartlab.Company("AAPL")
us.panel("business")
us.panel("ratios")

# ์ž์—ฐ์–ด๋กœ ์งˆ๋ฌธ
dartlab.ask("์‚ผ์„ฑ์ „์ž ์žฌ๋ฌด๊ฑด์ „์„ฑ ๋ถ„์„ํ•ด์ค˜")
# โ†’ AI๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๋ถ„์„: "์˜์—…์ด์ต๋ฅ ์ด 8.6%โ†’21.4%๋กœ ๋ฐ˜๋“ฑ..."

API ํ‚ค ๋ถˆํ•„์š”. HuggingFace์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ, ๋กœ์ปฌ ์บ์‹œ๋กœ ์ฆ‰์‹œ ๋กœ๋“œ.

DataHub: ์ „ ๊ณ„์ธต ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์ง„์ž…์ 

dartlab.dataHub๋Š” ํŠน์ • ์Šค์บ๋„ˆ๋‚˜ AI ์ „์šฉ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. L1 ์›์ฒœ, L1.5 ํšก๋‹จ ๋ฐ์ดํ„ฐ, L2 ๋ถ„์„ ์ž์‚ฐ์„ ํ•˜๋‚˜์˜ catalog์™€ query ๊ณ„์•ฝ์œผ๋กœ ๋ฐœ๊ฒฌํ•˜๊ณ  ์™ธ๋ถ€ Python, HTTP, ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•จ๊ป˜ ์“ฐ๋Š” ๋…๋ฆฝ ๋ฐ์ดํ„ฐ ํ”Œ๋žซํผ ์—”์ง„์ด๋‹ค. Factor store๋Š” ๋ณ„๋„ ์ œํ’ˆ์ด ์•„๋‹ˆ๋ผ ์ด ์ž‘์—…๋Œ€์˜ factor projection๊ณผ immutable materialization์„ ์กฐํ•ฉํ•œ ์‚ฌ์šฉ ๋ฐฉ์‹์ด๋‹ค.

import dartlab

catalog = dartlab.dataHub(
    "catalog",
    query={"layers": ["L1", "L1.5", "L2"], "search": "financialFeatures"},
)

first = dartlab.dataHub(
    "query",
    query={
        "requests": [
            {
                "assetId": "analysis.dartFinancialFeatures",
                "requestId": "krListed",
                "universe": {"markets": ["KR"], "membership": "listed"},
                "projection": {
                    "kind": "factor",
                    "measures": [
                        "financial.revenue",
                        "financial.operatingMargin",
                    ],
                },
                "time": {"knownAt": "20260723"},
            },
            {
                "assetId": "analysis.edgarFinancialFeatures",
                "requestId": "usListed",
                "universe": {"markets": ["US"], "membership": "listed"},
                "projection": {
                    "kind": "factor",
                    "measures": [
                        "financial.revenue",
                        "financial.operatingMargin",
                    ],
                },
                "time": {"knownAt": "20260723"},
            },
        ],
        "budget": {
            "maxRows": 100000,
            "maxBytes": 64 * 1024 * 1024,
            "timeoutMs": 120000,
            "maxAssets": 4,
            "maxSubjects": 20000,
            "maxConcurrency": 2,
        },
        "materialization": {"mode": "refresh"},
    },
)

for page in first.iterPages():
    consume(page)

์ด ํ˜ธ์ถœ ํ•˜๋‚˜๊ฐ€ ํ˜„์žฌ ์ƒ์žฅ KR 2,661๊ฐœ์™€ US 7,669๊ฐœ์˜ ์ž‘์—…์„ ๋“ฑ๋กํ•œ๋‹ค. ์ข…๋ชฉ๋ณ„ API๋ฅผ ํ˜ธ์ถœ์ž๊ฐ€ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒซ ์‘๋‹ต RAM์— ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค. ์ž‘์—…๋Œ€๊ฐ€ row, byte, time ์ƒํ•œ ์•ˆ์—์„œ opaque continuation์„ ์†Œ๋น„ํ•˜๊ณ , ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ ์ข…๋ชฉ๋„ ๊ตฌ์กฐํ™” gap๊ณผ coverage์— ๋‚จ๊ธด๋‹ค.

Cold refresh๋Š” terminal generation์„ ๋™๊ธฐ์ ์œผ๋กœ ์™„์„ฑํ•˜๋ฏ€๋กœ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ฐ™์€ DARTLAB_HOME์„ ๋ณด๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ warm reuse์™€ receipt ๊ธฐ๋ฐ˜ offline์€ ์ €์žฅ๋œ Arrow page๋ฅผ owner์™€ source ์žฌํ˜ธ์ถœ ์—†์ด ์ฝ๋Š”๋‹ค. ์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค๋Š” DataHubClient ๋˜๋Š” AsyncDataHubClient๋กœ /api/dataHub/v1 ๊ณ„์•ฝ์„ ํ˜ธ์ถœํ•˜๊ณ , ๋ถ„์‚ฐ ๋…ธ๋“œ๋Š” pull worker๋กœ ๊ฐ™์€ job ledger๋ฅผ ์†Œ๋น„ํ•œ๋‹ค. ์ž์„ธํ•œ ๊ณ„์•ฝ์€ engines.dataHub์™€ ๋ฐ์ดํ„ฐ ์ž‘์—…๋Œ€ ๊ณ„์•ฝ์— ์žˆ๋‹ค.

๊ณต์‹œ์—์„œ ํŒ๋‹จ๊นŒ์ง€

DartLab์€ DART์™€ EDGAR ๊ณต์‹œ๋ฅผ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๊ธฐ์—… ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊พธ๊ณ , ๋‹ค์„ฏ ๊ฐœ์˜ ๋ถ„์„ ๋ Œ์ฆˆ๋กœ ๊ทผ๊ฑฐ ์žˆ๋Š” ๊ธฐ์—… ํŒ๋‹จ์„ ๋งŒ๋“œ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ฆฌ์„œ์น˜ ์‹œ์Šคํ…œ์ด๋‹ค.

๊ณต์‹œ ์›๋ฌธ โ†’ Company์™€ Panel โ†’ ๋‹ค์„ฏ ๋ถ„์„ ๋ Œ์ฆˆ โ†’ Story, Simulate, Ask
                              โ†˜ Scan๊ณผ Screener
  • Company์™€ Panel์€ ํšŒ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ณต์‹œ ๋ชฉ์ฐจ์™€ ๊ณ„์ •์„ ํ•ญ๋ชฉ๊ณผ ๊ธฐ๊ฐ„์˜ ๊ฒฉ์ž๋กœ ๋งž์ถ˜๋‹ค.
  • Scan๊ณผ Screener๋Š” ๊ฐ™์€ ์กฐ๊ฑด์„ ์ „์ฒด ์ƒ์žฅ์‚ฌ์— ์ ์šฉํ•˜๊ณ , ํ†ต๊ณผ์™€ ํƒˆ๋ฝ ์ด์œ ๋ฅผ ํ•จ๊ป˜ ๋‚จ๊ธด๋‹ค.
  • ๋‹ค์„ฏ ๋ถ„์„ ๋ Œ์ฆˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์งˆ๋ฌธ์— ๋…๋ฆฝ์ ์œผ๋กœ ๋‹ตํ•œ๋‹ค. ํ•˜๋‚˜์˜ ์ข…ํ•ฉ์ ์ˆ˜๋กœ ํ•ฉ์น˜์ง€ ์•Š๋Š”๋‹ค.
  • Story, Simulate, Ask๋Š” ๋ Œ์ฆˆ๊ฐ€ ๋งŒ๋“  ๊ฒฐ๋ก ๊ณผ ๊ทผ๊ฑฐ๋ฅผ ์žฌ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์กฐ์‚ฌ ๋ชฉ์ ์— ๋งž๊ฒŒ ์กฐํ•ฉํ•œ๋‹ค.

๋‹ค์„ฏ ๋ถ„์„ ๋ Œ์ฆˆ

๊ฐ ๋ Œ์ฆˆ์˜ ๋Œ€ํ‘œ ๊ฒฐ๊ณผ์—๋Š” conclusion, drivers, evidence, confidence, gaps, falsifiers, asOf, dataAsOf๊ฐ€ ๊ฐ™์€ ๋ฌธ๋ฒ•์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. confidence.score๋Š” ์ˆ˜์ต๋ฅ  ์˜ˆ์ธก ํ™•๋ฅ ์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ํŒ๋‹จ์— ํ•„์š”ํ•œ ๊ทผ๊ฑฐ ์ถฉ์กฑ๋„๋‹ค. ์„ธ๋ถ€ ์ถ•์€ ๊ทธ๋Œ€๋กœ ๊ณต๊ฐœ๋˜๋ฉฐ, ๋Œ€ํ‘œ ํ˜ธ์ถœ์—์„œ ์‹œ์ž‘ํ•ด ํ•„์š”ํ•œ ๊ทผ๊ฑฐ๊นŒ์ง€ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๋ Œ์ฆˆ ๋‹ตํ•˜๋Š” ์งˆ๋ฌธ ๋Œ€ํ‘œ ํ˜ธ์ถœ
Analysis ์ด ํšŒ์‚ฌ์˜ ์‚ฌ์—…, ์ด์ต, ํ˜„๊ธˆ, ์ž๋ณธ๋ฐฐ๋ถ„๊ณผ ๊ฐ€์น˜๋Š” ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”๊ฐ€? c.analysis("์ข…ํ•ฉํ‰๊ฐ€")
Credit ์ด ํšŒ์‚ฌ๋Š” ๋นš์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฌด์—‡์ด ๋“ฑ๊ธ‰์„ ๊นจ๋Š”๊ฐ€? c.credit("๋“ฑ๊ธ‰", detail=True)
Industry ์ด ํšŒ์‚ฌ๋Š” ๊ฐ€์น˜์‚ฌ์Šฌ ์–ด๋””์— ์žˆ๊ณ , ์ด์ต ํ’€๊ณผ ๋น„๊ต๊ธฐ์—…์€ ๋ˆ„๊ตฌ์ธ๊ฐ€? c.industry()
Quant ๊ณต์‹œ ํŽ€๋”๋ฉ˜ํ„ธ ๋ณ€ํ™”์™€ ์‹œ์žฅ ๊ธฐ๋Œ€, ๊ฐ€๊ฒฉ ๋ฐ˜์‘ ์‚ฌ์ด์— ๊ดด๋ฆฌ๊ฐ€ ์žˆ๋Š”๊ฐ€? c.quant("๊ดด๋ฆฌ")
Macro ๊ฑฐ์‹œ ๋ณ€ํ™”๊ฐ€ ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ์ด ํšŒ์‚ฌ์˜ ์žฌ๋ฌด์™€ ๊ฐ€์น˜์— ์ „๋‹ฌ๋˜๋Š”๊ฐ€? c.macro("์ „ํŒŒ")

Industry์˜ Company ๋Œ€ํ‘œ ํ˜ธ์ถœ์€ ํ˜„์žฌ ๊ฒ€์ฆ๋œ DART ๊ฐ€์น˜์‚ฌ์Šฌ taxonomy๊ฐ€ ์žˆ๋Š” ํ•œ๊ตญ ๊ธฐ์—…์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค. EDGAR ๊ธฐ์—…์€ Story์™€ ๊ณต๊ฐœ ๋ Œ์ฆˆ bundle์—์„œ ๊ฐ€์งœ ์‚ฐ์—… ๋งคํ•‘ ๋Œ€์‹  blocked ๊ฒฐ์†๊ณผ ์‚ฌ์œ ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

analysis = c.analysis("์ข…ํ•ฉํ‰๊ฐ€")
credit = c.credit("๋“ฑ๊ธ‰", detail=True)
industry = c.industry()
quant = c.quant("๊ดด๋ฆฌ")
macro = c.macro("์ „ํŒŒ")

print(analysis["product"]["conclusion"])
print(credit["product"]["gaps"])
print(macro["product"]["time"])

product๋Š” ๊ธฐ์กด ์—”์ง„ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€๋˜๋Š” ๊ณตํ†ต ์™ธํ”ผ๋‹ค. ๊ธฐ์กด ๋“ฑ๊ธ‰, ๋น„์œจ, ๊ฐ€์น˜์‚ฌ์Šฌ, ๊ธฐ์ˆ ์ง€ํ‘œ์™€ ์ „ํŒŒ ๊ฒฝ๋กœ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๋ฏ€๋กœ ์„ธ๋ถ€ ๋ถ„์„ ๋Šฅ๋ ฅ์„ ์ˆจ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

ํŒ๋‹จ ์›Œํฌํ”Œ๋กœ

์ž‘์—… ํ•˜๋Š” ์ผ ๋Œ€ํ‘œ ํ˜ธ์ถœ
Story์™€ Report ํ•„์š”ํ•œ ๋ Œ์ฆˆ์˜ ๋…๋ฆฝ ๊ฒฐ๋ก , ๊ทผ๊ฑฐ, ํ•œ๊ณ„๋ฅผ ํ•œ ๋ณด๊ณ ์„œ์— ๋ฐฐ์น˜ c.story(type="full")
Simulate ๊ฒฐ์ •๋ก  ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๋ Œ์ฆˆ ๊ฐ€์ •์„ ํ•˜๋‚˜์˜ ๊ฐ€์ • ์›์žฅ์œผ๋กœ ์ถ”์  c.simulate(scenario="adverse")
Ask ๋ Œ์ฆˆ ๊ฒฐ๋ก ๊ณผ ๊ธฐ์ค€์‹œ์ ์„ valueRef, dateRef๋กœ ์ธ์šฉํ•ด ์„ค๋ช… dartlab.ask("์‚ผ์„ฑ์ „์ž ํ•˜๋ฐฉ ์œ„ํ—˜์„ ๊ทผ๊ฑฐ์™€ ํ•จ๊ป˜ ๋ถ„์„ํ•ด์ค˜")
Scan๊ณผ Screener ์ „์ฒด ์ƒ์žฅ์‚ฌ์— ๊ฐ™์€ ์กฐ๊ฑด์„ ์ ์šฉํ•˜๊ณ  ์ œ์™ธ ์ด์œ ๋ฅผ ์„ค๋ช… dartlab.scan("screen", "resilientCompounders", explain=True)

Story JSON๊ณผ ReportModel์€ ๋ Œ์ฆˆ๋ณ„ ์›๋ฌธ์„ lensProducts์— ๋ณด์กดํ•œ๋‹ค. ๋ Œ์ฆˆ ๊ฐ„ ๋‹จ์ผ ๋“ฑ๊ธ‰์€ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉฐ, usable, partial, blocked ์ƒํƒœ์™€ ๋ฐ์ดํ„ฐ ๊ฒฐ์†์„ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœํ•œ๋‹ค.

๋ชจ๋“  ๋…ธํŠธ๋ถ: marimo ยท colab ยท Open in marimo

Company

์„ค๊ณ„: engines.company

์„ธ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ์†Œ์Šค(docs=์ „๋ฌธ ๊ณต์‹œ, finance=XBRL ์žฌ๋ฌด์ œํ‘œ, report=DART API ์ •ํ˜• ๋ฐ์ดํ„ฐ)๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ํ†ตํ•ฉ. HuggingFace์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ, ์„ค์ • ๋ถˆํ•„์š”.

c = dartlab.Company("005930")

c.panel()                       # ์žก๋Š” ์ˆœ๊ฐ„ ๊ฒฉ์ž -- ๊ณต์‹œ ํ•ญ๋ชฉ ร— ๊ธฐ๊ฐ„ ์ „์ฒด
c.panel("BS")                   # ์žฌ๋ฌด์ƒํƒœํ‘œ -- finance ์ •๊ทœํ™” ์ˆซ์ž
c.panel("bs")                   # native ์žฌ๋ฌด์ƒํƒœํ‘œ -- ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ (2013~)
c.panel("ratios")               # native ์žฌ๋ฌด๋น„์œจ -- 5ํ‘œ ํ•ญ๋ชฉ์œผ๋กœ ๊ณ„์‚ฐ
c.panel("๋งค์ถœ")                  # ํ•ญ๋ชฉ๋ช… ํ–‰ ๊ฒ€์ƒ‰ (raw ๊ณต์‹œ)

์ฃผ์„(Notes): BS/IS ์ด์•ก ์ด๋ฉด์˜ ํ•ญ๋ชฉ๋ณ„ ๋ถ„ํ•ด. c.panel("topic")์œผ๋กœ ์žฌ๋ฌด์ œํ‘œ์™€ ๊ฐ™์€ ํŒจํ„ด์œผ๋กœ ์ ‘๊ทผ. DART(K-IFRS HTML ํŒŒ์‹ฑ)์™€ EDGAR(US-GAAP XBRL ํƒœ๊ทธ) ๋™์ผ ์ธํ„ฐํŽ˜์ด์Šค.

c.panel(...) ๋‚ด์šฉ DART EDGAR
"inventory" ์›์žฌ๋ฃŒ/์žฌ๊ณตํ’ˆ/์ œํ’ˆ ๋ถ„ํ•ด โœ… โœ…
"borrowings" ๋‹จ๊ธฐ/์žฅ๊ธฐ ์ฐจ์ž…๊ธˆ ๋ถ„ํ•ด โœ… โœ…
"tangibleAsset" ์œ ํ˜•์ž์‚ฐ ์ทจ๋“์›๊ฐ€/๊ฐ๊ฐ€์ƒ๊ฐ/์žฅ๋ถ€๊ฐ€ โœ… โœ…
"intangibleAsset" ์˜์—…๊ถŒ/๊ฐœ๋ฐœ๋น„ ๋“ฑ โœ… โœ…
"receivables" ๋งค์ถœ์ฑ„๊ถŒ + ๋Œ€์†์ถฉ๋‹น๊ธˆ โœ… โœ…
"provisions" ๋ณด์ฆ/์†Œ์†ก/๊ตฌ์กฐ์กฐ์ • ์ถฉ๋‹น๋ถ€์ฑ„ โœ… โœ…
"eps" ๊ธฐ๋ณธ/ํฌ์„ ์ฃผ๋‹น์ด์ต โœ… โœ…
"segments" ๋ถ€๋ฌธ๋ณ„ ๋งค์ถœ/์ด์ต โœ… โœ…
"costByNature" ์›์žฌ๋ฃŒ/๊ธ‰์—ฌ/๊ฐ๊ฐ€์ƒ๊ฐ ์„ฑ๊ฒฉ๋ณ„ ๋น„์šฉ โœ… โœ…
"lease" ์‚ฌ์šฉ๊ถŒ์ž์‚ฐ/๋ฆฌ์Šค๋ถ€์ฑ„ โœ… โœ…
"affiliates" ๊ด€๊ณ„๊ธฐ์—… ์ง€๋ถ„๋ฒ• ํˆฌ์ž โœ… โœ…
"investmentProperty" ํˆฌ์ž๋ถ€๋™์‚ฐ ๊ณต์ •๊ฐ€์น˜/์žฅ๋ถ€๊ฐ€ โœ… โœ…

marimo Colab

Scan: ์ „ ์ข…๋ชฉ ํšก๋‹จ ๋น„๊ต

์„ค๊ณ„: engines.scan

์ „ ์ข…๋ชฉ ๋Œ€์ƒ ํšก๋‹จ ๋ถ„์„. ๊ฑฐ๋ฒ„๋„Œ์Šค, ์ธ๋ ฅ, ์ฃผ์ฃผํ™˜์›, ๋ถ€์ฑ„, ํ˜„๊ธˆํ๋ฆ„, ๊ฐ์‚ฌ, ๋‚ด๋ถ€์ž, ์ด์ต์˜ ์งˆ, ์œ ๋™์„ฑ, ๋„คํŠธ์›Œํฌ, ๊ณ„์ •/๋น„์œจ ๋น„๊ต ๋“ฑ.

dartlab.scan("governance")            # ์ „์ข…๋ชฉ ์ง€๋ฐฐ๊ตฌ์กฐ
dartlab.scan("ratio", "roe")          # ์ „์ข…๋ชฉ ROE
dartlab.scan("account", "๋งค์ถœ์•ก")      # ์ „์ข…๋ชฉ ๋งค์ถœ์•ก ์‹œ๊ณ„์—ด

2,500+ ์ข…๋ชฉ์˜ ๋งค์ถœ์•ก์„ ํ•œ ๋ฒˆ์—: ๋ถ„๊ธฐ๋ณ„ ์‹œ๊ณ„์—ด๋กœ ์ฆ‰์‹œ ๋น„๊ต

dartlab.scan('account', '๋งค์ถœ์•ก'): ์ „์ข…๋ชฉ ๋งค์ถœ์•ก ํšก๋‹จ ๋น„๊ต

Compare: ํšŒ์‚ฌ ๊ฐ„ N์‚ฌ ๋น„๊ต

์„ค๊ณ„: engines.panel

Company.panel์ด ํ•œ ํšŒ์‚ฌ๋ฅผ ํ•ญ๋ชฉร—๊ธฐ๊ฐ„์œผ๋กœ ์ˆ˜ํ‰ํ™”ํ•œ๋‹ค๋ฉด, dartlab.compare๋Š” 2~6๊ฐœ ํšŒ์‚ฌ๋ฅผ ๊ฐ™์€ ํ† ํ”ฝยท์‹œ์  ๊ฒฉ์ž๋กœ ์ •๋ ฌํ•œ๋‹ค. scan์ฒ˜๋Ÿผ ๋‹จ์–ด ํ•˜๋‚˜๋กœ ๋ถ€๋ฅด๋Š” ํ†ฑ๋ ˆ๋ฒจ verb: ํšŒ์‚ฌ ๊ฐ„ ๋น„๊ต์˜ ๊ณต์‹ ํ‘œ๋ฉด์ด๋‹ค.

import dartlab

# ์ฃผ์„ยท์„œ์ˆ  ๋น„๊ต - disclosureKeyยทscopeยทleafType ์ •๋ ฌํ‚ค๋กœ ํšŒ์‚ฌ ๊ฐ„ ํ•œ ํ–‰ ์ •๋ ฌ
dartlab.compare(["005930", "000660"], topic="์žฌ๊ณ ")

# ์žฌ๋ฌด์ œํ‘œ ์…€ ๋น„๊ต - acode ๋‹จ์œ„, ๊ฐ’์€ ์› ํ™˜์‚ฐ (๋‹จ์œ„ยท๋ผ๋ฒจ ์ฐฉ์‹œ ์ œ๊ฑฐ)
dartlab.compare(["005930", "000660"], topic="is", freq="year")

# ๋‹ค๊ธฐ๊ฐ„ - ์…€ ์ปฌ๋Ÿผ์ด {code}โŸ{period} ๋กœ ํšŒ์‚ฌยท์‹œ์  namespace
dartlab.compare(["005930", "000660"], topic="์œ ํ˜•์ž์‚ฐ", period=["2025Q4", "2024Q4"])
  • label-drift ์ž๋™ ํ•ด์†Œ: ๊ฐ™์€ ํ•ญ๋ชฉ์ด ํšŒ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ ˆ ๋ฒˆํ˜ธ(์‚ผ์„ฑ "7. ์œ ํ˜•์ž์‚ฐ" โ†” SK "11. ์œ ํ˜•์ž์‚ฐ")์—ฌ๋„ ํ•œ ํ–‰์— ์ •๋ ฌํ•œ๋‹ค.
  • ํ™•์‹  ์˜ค์ •๋ ฌ ์ฐจ๋‹จ: ์—ฐ๊ฒฐโ†”๋ณ„๋„(scope)ยทํ‘œโ†”์„œ์ˆ (leafType)์ด ๋‹ค๋ฅด๋ฉด ๊ฐ™์€ ํ–‰์— ๋ณ‘์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฒฐ์†์€ NaN ์œ ์ง€: 0 ์ฑ„์›€ยทforward-fill ์—†์ด ๋นˆ ์นธ์„ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค(honest-gap, ์ถ”์„ธ ์™œ๊ณก ๋ฐฉ์ง€).
  • ์‹œ์žฅ ๊ฒฝ๊ณ„: KOโ†”US ํ˜ผํ•ฉ์€ ๋ง‰๋Š”๋‹ค. US(EDGAR)๋Š” ํ˜„์žฌ row ๋น„๊ต๋งŒ, ์žฌ๋ฌด ์…€ ๋น„๊ต๋Š” DART(์› ํ™˜์‚ฐ)๋งŒ ์—ด๋ ค ์žˆ๋‹ค.

Gather: ์™ธ๋ถ€ ์‹œ์žฅ ๋ฐ์ดํ„ฐ

์„ค๊ณ„: engines.gather

์ฃผ๊ฐ€, ์ˆ˜๊ธ‰, ๊ฑฐ์‹œ์ง€ํ‘œ, ๋‰ด์Šค๋ฅผ Polars DataFrame์œผ๋กœ.

dartlab.gather("price", "005930")             # KR OHLCV
dartlab.gather("price", "AAPL", market="US")  # US ์ฃผ๊ฐ€
dartlab.gather("macro", "FEDFUNDS")           # ์ž๋™ US ๊ฐ์ง€
dartlab.gather("news", "์‚ผ์„ฑ์ „์ž")             # Google News RSS

๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ batch ์ˆœํšŒ: ์ธ์‚ฌ์ด๋” ๊ฑฐ๋ž˜ยท์ง€๋ถ„ยท๋‰ด์Šค๋ฅผ generator ๋กœ ๋ถ„ํ•  yield (๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „, ์ „ ์ข…๋ชฉ ์Šค์บ”์šฉ):

from dartlab.gather.accessors import DefaultFinanceAccessor
a = DefaultFinanceAccessor()
for batch in a.iterNews("์‚ผ์„ฑ์ „์ž", days=30, batchSize=100):
    process(batch)
# ๋™ํ–‰: a.iterInsiderTrades("005930") ยท a.iterOwnership("005930")
# ์ผ๊ด„: a.fetchInsiderTrades / fetchOwnership / fetchNews

getDefaultGather() ์‹ฑ๊ธ€ํ„ด์€ thread-safe (๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ๋ณด์žฅ). ์บ์‹œ ํ†ต๊ณ„ยทsource fallback ์‹ ํ˜ธ๋Š” getCacheStatsSnapshot() ยท DARTLAB_TELEMETRY=stdout ์œผ๋กœ ์ถ”์ .

Analysis: ์žฌ๋ฌด ์ธ๊ณผ ๋ถ„์„

์„ค๊ณ„: engines.analysis

์ด ํšŒ์‚ฌ์˜ ์‚ฌ์—…, ์ด์ต, ํ˜„๊ธˆ, ์ž๋ณธ๋ฐฐ๋ถ„๊ณผ ๊ฐ€์น˜๋Š” ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”๊ฐ€?

๋Œ€ํ‘œ ๊ฒฐ๊ณผ๋Š” ์‚ฌ์—…, ์ด์ต, ํ˜„๊ธˆ, ํšŒ๋ณต๋ ฅ, ์ž๋ณธ๋ฐฐ๋ถ„, ๊ฐ€์น˜, ์œ„ํ—˜์˜ ์ง์ ‘ ๊ณ„์‚ฐ์„ ํ•œ ํ๋ฆ„์œผ๋กœ ๋ฌถ๋Š”๋‹ค. ํ•„์ˆ˜ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ํŒ๋‹จ์„ ๋ง‰๊ฑฐ๋‚˜ partial๋กœ ๋‚ฎ์ถ”๋ฉฐ, ์„ธ๋ถ€ 22์ถ•์€ ๊ทธ๋Œ€๋กœ drilldownํ•  ์ˆ˜ ์žˆ๋‹ค.

result = c.analysis("์ข…ํ•ฉํ‰๊ฐ€")
print(result["product"]["conclusion"])
print(result["product"]["drivers"])
print(result["product"]["gaps"])

c.analysis("์ˆ˜์ต์„ฑ")                  # ์„ธ๋ถ€ ์ถ•
c.analysis("ํ˜„๊ธˆํ๋ฆ„")                # ์„ธ๋ถ€ ์ถ•
c.analysis("๊ฐ€์น˜ํ‰๊ฐ€")                # ์„ธ๋ถ€ ์ถ•

Credit: ๋…๋ฆฝ ์‹ ์šฉ๋ถ„์„

์„ค๊ณ„: engines.credit | ๋ณด๊ณ ์„œ: eddmpython.github.io/dartlab/blog/credit-reports

์ด ํšŒ์‚ฌ๋Š” ๋นš์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฌด์—‡์ด ๋“ฑ๊ธ‰์„ ๊นจ๋Š”๊ฐ€?

3-Track ๋ชจ๋ธ(์ผ๋ฐ˜/๊ธˆ์œต/์ง€์ฃผ), Notch Adjustment, CHS ์‹œ์žฅ ๋ณด์ •๊ณผ ๋ณ„๋„์žฌ๋ฌด ๋ธ”๋ Œ๋”ฉ์œผ๋กœ dCR ๋“ฑ๊ธ‰์„ ๋งŒ๋“ ๋‹ค. ๋Œ€ํ‘œ ์ œํ’ˆ์€ ๋“ฑ๊ธ‰๊ณผ ๋ถ€๋„ํ™•๋ฅ ๋ฟ ์•„๋‹ˆ๋ผ ๋™์ธ, ๋ช…์‹œ์  ๊ฐ€์ •, ํ•˜๋ฐฉ ์ŠคํŠธ๋ ˆ์Šค์™€ tripwire๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

79๊ฐœ์‚ฌ ๊ฒ€์ฆ: ๋Œ€๊ธฐ์—… 87% (26/30), ์ค‘๋Œ€ํ˜• 82% (41/50), ์ „์ฒด 70% (55/79, v5.0 ๊ณผ๋Œ€ํ‰๊ฐ€ ์ˆ˜์ • ํ›„ ์žฌ์ธก์ • ์˜ˆ์ •). ์‚ผ์„ฑ์ „์ž AA+ ์ •ํ™• ์ผ์น˜. ๊ฒ€์ฆ ๋ฐฉ๋ฒ•๋ก ์€ methodology ์ฐธ์กฐ.

print(c.credit())            # ์„ธ๋ถ€ ์ถ• ๊ฐ€์ด๋“œ

cr = c.credit("๋“ฑ๊ธ‰", detail=True)
print(cr["grade"])          # dCR-AA+
print(cr["product"]["conclusion"])
print(cr["product"]["scenarios"])
print(cr["product"]["falsifiers"])

์‹ ์šฉ๋ถ„์„ ๋ณด๊ณ ์„œ ๋ฐœ๊ฐ„ (credit ์„œ์‚ฌ + ์‹ ํ‰์‚ฌ ๋Œ€์กฐ๊ฐ€ story 5๋ง‰์— ์ž๋™ ํ†ตํ•ฉ):

from dartlab.story.publisher import publishReport
publishReport("005930")

Industry: ๊ฐ€์น˜์‚ฌ์Šฌ๊ณผ ๋น„๊ต๊ธฐ์—…

์„ค๊ณ„: engines.industry

์ด ํšŒ์‚ฌ๋Š” ๊ฐ€์น˜์‚ฌ์Šฌ ์–ด๋””์— ์žˆ๊ณ , ์ด์ต ํ’€๊ณผ ๋น„๊ต๊ธฐ์—…์€ ๋ˆ„๊ตฌ์ธ๊ฐ€?

์‚ฐ์—… ์ด๋ฆ„๋งŒ ๋ถ™์ด๋Š” ๋ถ„๋ฅ˜๊ธฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ณต์ •๊ณผ ์—ญํ• , upstream๊ณผ downstream ๊ด€๊ณ„, ๋™์ข… stage, profit pool๊ณผ ๊ด€๊ณ„ ๊ทผ๊ฑฐ๋ฅผ ํ•œ ์ œํ’ˆ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ง์ ‘ ๊ด€๊ณ„๋‚˜ ์ตœ์‹ ์„ฑ์ด ๋ถ€์กฑํ•˜๋ฉด ๊ทธ ๋ฒ”์œ„๋ฅผ gaps์— ๋‚จ๊ธด๋‹ค.

position = c.industry()
print(position["product"]["conclusion"])
print(position["peers"])
print(position["relationships"])

Quant: ๊ธฐ๋Œ€์™€ ๊ฐ€๊ฒฉ ๋ฐ˜์‘์˜ ๊ดด๋ฆฌ

์„ค๊ณ„: engines.quant

๊ณต์‹œ ํŽ€๋”๋ฉ˜ํ„ธ ๋ณ€ํ™”์™€ ์‹œ์žฅ ๊ธฐ๋Œ€, ๊ฐ€๊ฒฉ ๋ฐ˜์‘ ์‚ฌ์ด์— ๊ดด๋ฆฌ๊ฐ€ ์žˆ๋Š”๊ฐ€?

๋Œ€ํ‘œ ์ œํ’ˆ์€ ๊ณต์‹œ ์ด์ต ๋ณ€ํ™”, ํšก๋‹จ๋ฉด ์ด์ต ์„œํ”„๋ผ์ด์ฆˆ ํ”„๋ก์‹œ, ์‹ค์ œ ๊ฐ€๊ฒฉ ๋ฐ˜์‘์„ ๋น„๊ตํ•ด ๋ฏธ๋ฐ˜์˜, ํ™•์ธ, ๊ณผ์—ด, ์•…ํ™” ๋ฐ˜์˜ ๋˜๋Š” ํŒ๋‹จ ๋ณด๋ฅ˜๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค. ์‹ค์ œ ์• ๋„๋ฆฌ์ŠคํŠธ ์ปจ์„ผ์„œ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ”„๋ก์‹œ๋ฅผ ์ปจ์„ผ์„œ์Šค๋กœ ๊ฐ€์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

gap = c.quant("๊ดด๋ฆฌ")
print(gap["classification"])
print(gap["product"]["conclusion"])
print(gap["product"]["gaps"])

c.quant("ํŒ๋‹จ")                    # ์„ธ๋ถ€ ๊ฐ€๊ฒฉ ํŒ๋‹จ
c.quant("๋ฒ ํƒ€", benchmarkMode="sector")

Macro: ๊ธฐ์—…๊นŒ์ง€ ๋‹ฟ๋Š” ๊ฑฐ์‹œ ์ „๋‹ฌ๊ฒฝ๋กœ

์„ค๊ณ„: engines.macro

๊ฑฐ์‹œ ๋ณ€ํ™”๊ฐ€ ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ์ด ํšŒ์‚ฌ์˜ ์žฌ๋ฌด์™€ ๊ฐ€์น˜์— ์ „๋‹ฌ๋˜๋Š”๊ฐ€?

๋Œ€ํ‘œ ์ œํ’ˆ์€ ์ตœ์‹  ๊ฑฐ์‹œ ๊ด€์ธก์—์„œ ์‚ฐ์—… ๋…ธ์ถœ, ํšŒ์‚ฌ ์žฌ๋ฌด ๊ทผ๊ฑฐ, ๊ฐ€์น˜ ๋ ˆ๋ฒ„๊นŒ์ง€ ์ด์–ด์ง€๋Š” edge๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ๊ธฐ์—… ์ง์ ‘ ๊ทผ๊ฑฐ๊ฐ€ ์—†์œผ๋ฉด sector prior ๋˜๋Š” template ์ƒํƒœ๋กœ ๋‚จ๊ฒจ ์‹œ์žฅ ํ•ด์„๊ณผ ๊ธฐ์—… ํ•ด์„์„ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์‹œ์žฅ ์ž์ฒด๋ฅผ ์ฝ๋Š” ์„ธ๋ถ€ ์ถ•๋„ ๊ทธ๋Œ€๋กœ ์ œ๊ณตํ•œ๋‹ค.

transmission = c.macro("์ „ํŒŒ")
print(transmission["product"]["conclusion"])
print(transmission["edges"])
print(transmission["product"]["gaps"])

dartlab.macro("์‚ฌ์ดํด")          # ์‹œ์žฅ ๊ตญ๋ฉด
dartlab.macro("๊ธˆ๋ฆฌ")            # ๊ธˆ๋ฆฌ์™€ ์ˆ˜์ต๋ฅ ๊ณก์„ 
dartlab.macro("์œ„๊ธฐ")            # ๊ธˆ์œต ๊ฑด์ „์„ฑ

์‹œ์žฅ ์‚ฌ์ดํดยท๊ธˆ๋ฆฌยท์œ ๋™์„ฑยท์‹ฌ๋ฆฌยท์ž์‚ฐ ์‹ ํ˜ธ์™€ ๊ธ€๋กœ๋ฒŒ ๊ฑฐ์‹œ ๋ถ„์„ ๋ฐฉ๋ฒ•๋ก (Hamilton EM, Kalman DFM, Nelson-Siegel, Cleveland Fed ํ”„๋กœ๋น—, Sahm Rule, BIS Credit-to-GDP)์„ numpy๋งŒ์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„.

๋ฐฑํ…Œ์ŠคํŠธ ์‹ค์ฆ (2000-2024, FRED): Cleveland Fed ํ”„๋กœ๋น—์ด ๋ฏธ๊ตญ 3/3 ์นจ์ฒด๋ฅผ 2-16๊ฐœ์›” ์ „์— ์‚ฌ์ „ ๊ฐ์ง€, recall 90%.

Story: ๋ถ„์„์„ ๋ณด๊ณ ์„œ๋กœ

์„ค๊ณ„: engines.story

ํ•„์š”ํ•œ ๋ Œ์ฆˆ์˜ ์ œํ’ˆ ๊ฒฐ๊ณผ๋ฅผ ์žฌ๊ณ„์‚ฐ ์—†์ด ๊ตฌ์กฐํ™” ๋ณด๊ณ ์„œ๋กœ ์กฐ๋ฆฝํ•œ๋‹ค. ๊ฐ ๋ Œ์ฆˆ์˜ ๊ฒฐ๋ก , ๊ทผ๊ฑฐ ์ถฉ์กฑ๋„, ์‹œ์ ๊ณผ ๊ฒฐ์†์€ ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉฐ ๋‹จ์ผ ์ข…ํ•ฉ์ ์ˆ˜๋Š” ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ์ถœ๋ ฅ ํ˜•์‹์€ rich, html, markdown, json ๋„ค ๊ฐ€์ง€๋‹ค.

story = c.story(type="full")
print(story.lensProducts["analysis"]["conclusion"])
print(story.toMarkdown())

simulation = c.simulate(scenario="adverse")
print(simulation.assumptionLedger)

dartlab.ask("์‚ผ์„ฑ์ „์ž ํ•˜๋ฐฉ ์œ„ํ—˜์„ ๊ทผ๊ฑฐ์™€ ํ•จ๊ป˜ ๋ถ„์„ํ•ด์ค˜")

์‚ผ์„ฑ์ „์ž ๋ณด๊ณ ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ: "๋งค์ถœ +23.8% ์„ฑ์žฅ, ์˜์—…์ด์ต๋ฅ  8.6%โ†’21.4% ๋ฐ˜๋“ฑ. FCF ์–‘์ˆ˜ ์ „ํ™˜, ROIC > WACC, ์žฌํˆฌ์ž๊ฐ€ ๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๊ตฌ๊ฐ„."

์ด์•ผ๊ธฐ๊พผ: ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์ด์•ผ๊ธฐ๋‹ค

์„ค๊ณ„: engines.story ยท ์‹œ๋ฆฌ์ฆˆ: ๊ธฐ์—…์ด์•ผ๊ธฐ

๊ธฐ์—…๋ถ„์„์€ ๋น„์œจ ๋‚˜์—ด์ด ์•„๋‹ˆ๋‹ค. DartLab์€ 5๊ฐœ ์—”์ง„(analysis, credit, scan, quant, macro)์˜ ๊ฒฐ๊ณผ๋ฅผ 6๋ง‰ ์Šคํ† ๋ฆฌํ…”๋ง ๊ตฌ์กฐ๋กœ ์กฐํ•ฉํ•ด ๋ธ”๋กœ๊ทธ์— ๋ฐœ๊ฐ„ ๊ฐ€๋Šฅํ•œ ๊ธฐ์—…์ด์•ผ๊ธฐ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค.

from dartlab.story.publisher import publishReport
publishReport("068270")    # ์…€ํŠธ๋ฆฌ์˜จ - 6๋ง‰ ๊ธฐ์—…์ด์•ผ๊ธฐ ์ž๋™ ๋ฐœ๊ฐ„

๋ฐœ๊ฐ„๋œ ๊ธฐ์—…์ด์•ผ๊ธฐ:

๊ธฐ์—… ์ด์•ผ๊ธฐ
SKํ•˜์ด๋‹‰์Šค ํ•œ๊ตญ ๋ฐ˜๋„์ฒด 30๋…„์˜ ๋ฏธ์Šคํ„ฐ๋ฆฌ, ์˜์—…์ด์ต๋ฅ  58%
์‚ผ์–‘์‹ํ’ˆ ๋ผ๋ฉด ๋น…3 ๊ผด๋“ฑ์ด ๋งค์ถœ 2.3์กฐ ๊ธ€๋กœ๋ฒŒ ์‹ํ’ˆ ๊ฑฐ์ธ์ด ๋˜๊ธฐ๊นŒ์ง€
๋‘์‚ฐ์—๋„ˆ๋นŒ๋ฆฌํ‹ฐ ๋ถ€์ฑ„๋น„์œจ 305%์—์„œ 129%๊นŒ์ง€, 9๋…„ ๋‹ค์ด์–ดํŠธ์˜ ์ง„์งœ ๋ชจ์Šต
์•Œํ…Œ์˜ค์   9๋…„ ์ ์ž ๋ฐ”์ด์˜คํ…์ด ํ•œ ๊ฑด์˜ ๋ผ์ด์„ ์Šค๋กœ ์˜์—…์ด์ต +1,069์–ต
HMM ์‹œ์žฅ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์ดํด์ด ์ฃผ๊ฐ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํšŒ์‚ฌ
์…€ํŠธ๋ฆฌ์˜จ IMF๋กœ ์ง์žฅ ์žƒ์€ 41์„ธ, 5์ฒœ๋งŒ์›์œผ๋กœ ์‹œ์ž‘ํ•ด 25๋…„ ํ›„ ๋ฌดํ˜•์ž์‚ฐ 13.78์กฐ
ํ•œํ™”์—์–ด๋กœ์ŠคํŽ˜์ด์Šค ์‚ผ์„ฑ์ด 8,400์–ต์— ๋ฒ„๋ฆฐ ๋ฌด๊ธฐ๊ฐ€ ์ˆ˜์ฃผ์ž”๊ณ  37์กฐ๊ฐ€ ๋๋‹ค
HDํ˜„๋Œ€์ผ๋ ‰ํŠธ๋ฆญ 7๋…„ ์ „ ์ ์ž 1,006์–ต์ด ์˜ฌํ•ด 1์กฐ๊ฐ€ ๋๋‹ค, ๋ณ€์••๊ธฐ ํ•˜๋‚˜๋กœ
๊ณ ๋ ค์•„์—ฐ 50๋…„ ๋งŒ์— ์ฒซ ์ˆœ์†์‹ค 2,457์–ต, ๊ทธ๋Ÿฐ๋ฐ ์˜์—…์ด์ต์€ ์‚ฌ์ƒ ์ตœ๋Œ€
์—์ดํ”ผ์•Œ ํ™”์žฅํ’ˆ ํšŒ์‚ฌ๊ฐ€ ๊ฐ€์ „์„ 4,070์–ต ํŒ”์•˜๋‹ค, ๊ทธ๊ฒŒ ์‹œ์ž‘์ด์—ˆ๋‹ค

Search: ๊ณต์‹œยท๋‰ด์Šค๋ฅผ ์˜๋ฏธ๋กœ ๊ฒ€์ƒ‰

์„ค๊ณ„: engines.search

HuggingFace current search artifact ๋ฅผ ์ž๋™ ์‚ฌ์šฉํ•œ๋‹ค. Search Index Delta ์™€ Data Prebuild ๊ฐ€ source manifest ๊ธฐ์ค€์œผ๋กœ ์ฆ๋ถ„ ๋ฐ˜์˜ํ•˜๋ฉฐ, source๋ณ„ ์ตœ์‹ ์„ฑ์€ ๊ฒฐ๊ณผ์˜ dataAsOf/sourceRef ๋กœ ํ™•์ธํ•œ๋‹ค. ๋‹น์ผ ๋ฏธ๋Ÿฌ ์ „ ๋‹จ์ผ ์ข…๋ชฉ ๊ณต์‹œ ํ™•์ธ์€ Company.disclosure / Company.liveFilings ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

๋ชจ๋ธ ์—†์Œ, GPU ์—†์Œ, cold start ์—†์Œ. 400๋งŒ ๋ฌธ์„œ 95% ์ •๋ฐ€๋„: ์ž„๋ฒ ๋”ฉ๋ณด๋‹ค ์ •ํ™•, 1/100 ๋น„์šฉ. ๋ฒค์น˜๋งˆํฌ ์ƒ์„ธ๋Š” methodology ์ฐธ์กฐ.

dartlab.search("์œ ์ƒ์ฆ์ž ๊ฒฐ์ •")                     # ์œ ์ƒ์ฆ์ž ๊ณต์‹œ ์ฐพ๊ธฐ
dartlab.search("๋Œ€ํ‘œ์ด์‚ฌ ๋ณ€๊ฒฝ", corp="005930")       # ์ข…๋ชฉ ํ•„ํ„ฐ
dartlab.search("ํšŒ์‚ฌ๊ฐ€ ๋ˆ์„ ๋นŒ๋ ธ๋‹ค")                 # ์ž์—ฐ์–ด๋„ ๋™์ž‘

AI: ์„ค์น˜ํ˜• Agent Runtime

์„ค๊ณ„: operation.opsAsSkills ยท ๋ฃจํ”„ ๊ฐœ์š”: ์ƒ๋‹จ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜

dartlab.ask("์‚ผ์„ฑ์ „์ž ์žฌ๋ฌด๊ฑด์ „์„ฑ ๋ถ„์„ํ•ด์ค˜")
dartlab.ask("์‚ผ์„ฑ์ „์ž ๋ถ„์„", runtimeId="claude")
dartlab setup codex --yes
dartlab invest 005930 --runtime codex

์ง€์› runtime์€ codex, claude, cline์ด๋‹ค. dartlab setup์€ ์„ค์น˜, ๊ณต์‹ ๋กœ๊ทธ์ธ, DartLab MCP ์—ฐ๊ฒฐ, ๊ธฐ๋ณธ runtime ์„ ํƒ์„ ํ•œ ๋ฒˆ์˜ ์Šน์ธ ํ๋ฆ„์œผ๋กœ ์™„๋ฃŒํ•˜๋ฉฐ ์ด๋ฏธ ๋๋‚œ ๋‹จ๊ณ„๋Š” ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. DartLab์€ provider API key, OAuth token, ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค. CLI ์„ค์น˜์™€ DartLab MCP ์—ฐ๊ฒฐ์ด ๋ชจ๋‘ ํ™•์ธ๋œ groundedReady runtime๋งŒ ์‹คํ–‰๋˜๋ฉฐ, ๋ฏธ์—ฐ๊ฒฐ runtime์€ ๋น„๊ทผ๊ฑฐ ๋‹ต๋ณ€์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์—ฐ๊ฒฐ ๊ณ„ํš์„ ์•ˆ๋‚ดํ•œ๋‹ค. ํˆฌ์ž๋ถ„์„ ์ „์šฉ dartlab invest๋Š” ์ค‘์‹ฌ๋…ผ์ง€, ๋ฐ˜๋Œ€๋…ผ์ง€, ๋ฐธ๋ฅ˜์—์ด์…˜, ์‹œ๋‚˜๋ฆฌ์˜ค, ์ด‰๋งค, ๋ฆฌ์Šคํฌ์™€ ๋‹ค์Œ ์ ๊ฒ€ ์‹œ์ ์„ ๊ฐ™์€ ๊ทผ๊ฑฐ ๊ณ„์•ฝ์œผ๋กœ ๋ถ„์„ํ•œ๋‹ค.

์งˆ๋ฌธ์€ Skill OS์˜ 241๊ฐœ ๊ณต๊ฐœ capability๋ฅผ ์งˆ๋ฌธ๋ณ„ informationCoverage๋กœ ์ขํžŒ๋‹ค. ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ 182๊ฐœ๋Š” ๊ตฌ์กฐํ™”๋œ ์‹คํ–‰ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•˜๊ณ  reference-only ๊ฒฝ๋กœ๋Š” canonical replacement๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค. ๋‹ต๋ณ€์€ ํ‘œยท๋ฌธ์„œยท๊ฐ’ยท๊ธฐ์ค€์ผ์˜ exact ref payload์™€ ๊ฐ’ยท๊ธฐ๊ฐ„ยท๋Œ€์ƒยท๋ฌธ์„œ ์ฃผ์žฅ์ด ์ผ์น˜ํ•  ๋•Œ๋งŒ ๊ณต๊ฐœ๋œ๋‹ค. ๋กœ์ปฌ GUI๋Š” ๋‹ต๋ณ€์ด ์‹ค์ œ ์‚ฌ์šฉํ•œ ๊ทผ๊ฑฐ, ๋ณด์กฐ ๊ทผ๊ฑฐ, ๋ฏธ์ถฉ์กฑ ๊ทผ๊ฑฐ, artifact์™€ ์‹คํ–‰ ์˜์ˆ˜์ฆ์„ ๋ถ„๋ฆฌํ•ด์„œ ๋ณด์—ฌ ์ค€๋‹ค.

Channel: ์™ธ๋ถ€์—์„œ ๋‚ด PC dartlab ์ ‘๊ทผ

์„ค๊ณ„: runtime.channel

PC์—์„œ ํ•œ ์ค„์ด๋ฉด ํฐ์—์„œ dartlab UI ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ. Microsoft DevTunnels ์ž๋™ ์…‹์—….

dartlab channel

ํ๋ฆ„:

  1. winget์œผ๋กœ devtunnel CLI ์ž๋™ ์„ค์น˜ (์ตœ์ดˆ 1ํšŒ)
  2. GitHub OAuth 1ํšŒ ์ธ์ฆ (๋ธŒ๋ผ์šฐ์ € ์ž๋™ ์˜คํ”ˆ)
  3. ์˜๊ตฌ URL + QR ๋ฐœ๊ธ‰ (https://<id>-8400.<region>.devtunnels.ms)
  4. ํฐ Chrome์— URL/QR ์ž…๋ ฅ โ†’ dartlab UI ๊ทธ๋Œ€๋กœ ๋™์ž‘

๋„๋ฉ”์ธ 0๊ฐœ, ํ† ํฐ ํŠธ๋ฆญ 0๊ฐœ. VS Code Remote Tunnels์™€ ๋™์ผ ์ธํ”„๋ผ๋ผ ๋ชจ๋ฐ”์ผ ํ˜ธํ™˜์„ฑ ๊ฒ€์ฆ๋จ. ๋ฉ”์‹œ์ง• ๋ด‡ ์˜ต์…˜ (--telegram/slack/discord) ๋„ ์ง€์›.

EDGAR (๋ฏธ๊ตญ)

๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์†Œ์Šค. SEC API์—์„œ ์ž๋™ ์ˆ˜์ง‘, ์‚ฌ์ „ ๋‹ค์šด๋กœ๋“œ ๋ถˆํ•„์š”.

# Korea (DART)                          # US (EDGAR)
c = dartlab.Company("005930")           c = dartlab.Company("AAPL")
c.panel()                               c.panel()
c.panel("์‚ฌ์—…")                          c.panel("business")
c.panel("BS")                           c.panel("BS")
c.panel("ratios")                       c.panel("ratios")
c.panel("๋งค์ถœ")                          c.panel("revenue")

MCP: AI ์–ด์‹œ์Šคํ„ดํŠธ ์—ฐ๋™

๋ฃจํ”„ยท๋„๊ตฌ ํ‘œ๋ฉด ๊ฐœ์š”: ์ƒ๋‹จ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜

MCP ์„œ๋ฒ„ ๋‚ด์žฅ. ์™ธ๋ถ€ LLM์€ tools/list๊ฐ€ ๊ด‘๊ณ ํ•˜๋Š” canonical ๋„๊ตฌ๋งŒ ํ˜ธ์ถœํ•˜๋ฉฐ, ๋‹จ์ผ ๊ณต๊ฐœ API๋Š” EngineCall, ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ์˜ ๊ฒฐํ•ฉยท๊ฐ€๊ณต๋งŒ RunPython์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Claude Desktop / Claude Code / Cursor (stdio, ๊ถŒ์žฅ)

uvx dartlab mcp ์˜ cold start ๊ฐ€ Claude Desktop attach timeout ์•ˆ์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์‚ฌ์ „ ์„ค์น˜ + entry point ์ง์ ‘ ํ˜ธ์ถœ ์ด ์ •๋ณธ์ž…๋‹ˆ๋‹ค. command: "python" ์€ Microsoft Store Python ํ™˜๊ฒฝ์—์„œ spawn ENOENT ๋กœ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์–ด (์ด์Šˆ #28), command: "dartlab" ์œผ๋กœ entry point ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ๊ฒฌ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

# 1. ์‚ฌ์ „ ์„ค์น˜ (ํ•œ ๋ฒˆ๋งŒ) - .local/bin/dartlab(.exe) entry point ์ƒ์„ฑ
uv tool install dartlab        # ๋˜๋Š”: pipx install dartlab
// 2-A. Claude Desktop - %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "dartlab": {
      "command": "dartlab",
      "args": ["mcp"],
      "env": { "PYTHONUNBUFFERED": "1", "PYTHONUTF8": "1" }
    }
  }
}
# 2-B. Claude Code ํ•œ ์ค„ ์„ค์ •
claude mcp add dartlab -- dartlab mcp

# 2-C. Codex CLI
codex mcp add dartlab -- dartlab mcp

dartlab ๋ช…๋ น์ด PATH ์— ์žกํžˆ์ง€ ์•Š๋Š” ํ™˜๊ฒฝ (ํ•œ์ •์ ) ์ด๋ผ๋ฉด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ ์–ด์ฃผ์„ธ์š”:

{
  "mcpServers": {
    "dartlab": {
      "command": "C:\\Users\\<user>\\.local\\bin\\dartlab.exe",   // Windows
      // "command": "/Users/<user>/.local/bin/dartlab",              // macOS / Linux
      "args": ["mcp"],
      "env": { "PYTHONUNBUFFERED": "1", "PYTHONUTF8": "1" }
    }
  }
}

๊ฐ™์€ ์ถœ๋ ฅ์€ dartlab mcp --config claude-desktop / dartlab mcp --config claude-code ๋กœ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ .mcp.json ์ž๋™ ์ƒ์„ฑ: dartlab mcp --install.

์›๊ฒฉ MCP (Claude Code ยท Cursor ๋“ฑ SSE ์ง€์› ํด๋ผ์ด์–ธํŠธ๋งŒ)

{
  "mcpServers": {
    "dartlab": {
      "url": "https://eddmpython-dartlab.hf.space/mcp/sse"
    }
  }
}

HuggingFace Spaces ํ˜ธ์ŠคํŒ…. DART API ํ‚ค ๋ถˆํ•„์š”. Claude Desktop ๋ฐ์Šคํฌํ†ฑ ์•ฑ์€ stdio ๋งŒ ๋ฐ›์œผ๋ฏ€๋กœ ์ด URL ๋ฐฉ์‹์„ reject ํ•ฉ๋‹ˆ๋‹ค. ์œ„ stdio ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋„๊ตฌ ํ‘œ๋ฉด

์‹ค์ œ ์ด๋ฆ„ยท์Šคํ‚ค๋งˆยท์‹คํ–‰ ๊ถŒํ•œ์˜ ์ •๋ณธ์€ ์„œ๋ฒ„์˜ tools/list์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์—ญํ• ๋ณ„ ์š”์•ฝ์ด๋ฉฐ, ๋ชฉ๋ก์— ์—†๋Š” legacy alias๋‚˜ AI ๋‚ด๋ถ€ ๋„๊ตฌ๋Š” ์ง์ ‘ ํ˜ธ์ถœํ•ด๋„ tool_not_advertised๋กœ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ ์—ญํ• 
ask dartlab chat-native ๋ฃจํ”„: LLM ์ž์œจ ๋„๊ตฌ ํ˜ธ์ถœ + Ref ๊ฒ€์‚ฐ ์ผ๊ด„
ReadSkill / GetSkillBody / ReadSkillMarket ๊ณต์‹ Skill OS ๊ฒ€์ƒ‰ยท๋ณธ๋ฌธ ์กฐํšŒยท์™ธ๋ถ€ ๋งˆ์ผ“ ๋ณด์™„
ReadCapability dartlab ๊ณต๊ฐœ API/docstring ๊ฒ€์ƒ‰
EngineCall capability ๊ฒฐ๊ณผ ์ค‘ engineCallable=true์ธ ๋‹จ์ผ ๊ณต๊ฐœ API ํ˜ธ์ถœ
RunPython dartlab + Polars ์ฝ”๋“œ ์‹คํ–‰ โ†’ executionRef/valueRef/tableRef
Read / WebSearch / ExternalReachDoctor ๋กœ์ปฌ ๋ฌธ์„œยท์™ธ๋ถ€ ์ตœ์‹  ์ •๋ณดยท์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ
SaveArtifact / CompileVisual / CreateUserSkill ์‚ฐ์ถœ๋ฌผยท์‹œ๊ฐํ™”ยท์‚ฌ์šฉ์ž ์Šคํ‚ฌ ์ž‘์„ฑ
PeerCompareN / DCFValuation / CompileFinancialDashboard ๋น„๊ตยท๊ฐ€์น˜ํ‰๊ฐ€ยท์žฌ๋ฌด ๋Œ€์‹œ๋ณด๋“œ
RegressionForecast / SensitivityAnalysis / CreditScorecard ์˜ˆ์ธกยท๋ฏผ๊ฐ๋„ยท์‹ ์šฉ ๋ถ„์„
ScenarioCompareN / ScenarioOverlay / SearchPastSessions ์‹œ๋‚˜๋ฆฌ์˜คยท๊ณผ๊ฑฐ ์„ธ์…˜ ์กฐํšŒ

์˜› generated ๋„๊ตฌ(companyAnalysis/companyStory/marketScan ๋“ฑ)๋Š” 0.10๋ถ€ํ„ฐ ํ๊ธฐ๋์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํ˜ธ์ถœ์€ EngineCall({"apiRef": ..., "args": {...}}), ๋‹ค๋‹จ ๊ฒฐํ•ฉยท๊ฐ€๊ณต๋งŒ RunPython์œผ๋กœ ์˜ฎ๊ธฐ์„ธ์š”. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ CHANGELOG ์ฐธ์กฐ.

Skill OS ์™€ Skill Market

DartLab ์—๋Š” ๋‘ ๊ฐ€์ง€ ์Šคํ‚ฌ ์ธต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ธต ์œ„์น˜ ์—ญํ• 
builtin Skill OS src/dartlab/skills/specs/** ยท /skills ๊ณต์‹ ์šด์˜ยท์—”์ง„ยท๋ถ„์„ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๋ฉฐ AI ๊ฐ€ ๋จผ์ € ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
community Skill Market GitHub Discussions ยท /skills/market ยท ์ •์  marketIndex.json ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต์œ ํ•œ ๋ถ„์„ ์งˆ๋ฌธ์„ Forge ๊ฐ€ ๊ตฌ์กฐํ™”ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์Šคํ‚ฌ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ builtin ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šด์˜ ํ๋ฆ„์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ GitHub Discussions ์— ๋ถ„์„ ์งˆ๋ฌธ์„ ์”๋‹ˆ๋‹ค. DartLab Forge ๊ฐ€ ์›๋ฌธ๊ณผ ๋Œ“๊ธ€์„ ์ฝ๊ณ  intent, inputs, dataSources, procedure, executionPlan, outputs, outputSchema, criteria, forbidden, completionCriteria ๋ฅผ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ์•ˆ๊ณผ ๋ณด์™„ ์ค‘์ธ ํ•ญ๋ชฉ์€ marketIndex.json ์—๋งŒ ๋‚จ๊ณ  ์ตœ์ข… ์Šคํ‚ฌ snapshot ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Maintainer ๊ฐ€ ์™„์„ฑ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๊ฒ€ํ† ํ•ด /market runnable, /market curated, /market builtin-candidate ๋กœ ํ˜„์žฌ revision ์„ ํ™•์ •ํ•  ๋•Œ๋งŒ GitHub Action ์ด items/{id}.json accepted snapshot ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋žœ๋”ฉ์˜ Skill Market ๊ณผ AI ๋„๊ตฌ ReadSkillMarket ์ด ์ด ์ •์  artifact ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์Šคํ‚ฌ์€ ์นด๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋ถ„์„ ํ–‰์œ„์˜ ๊ณ„์•ฝ์ž…๋‹ˆ๋‹ค. ์ตœ์ข… ๊ณต์œ ์Šคํ‚ฌ์€ ์–ด๋–ค DartLab ์—”์ง„์ด๋‚˜ recipe ๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ํ˜ธ์ถœํ•˜๋Š”์ง€ executionPlan ์— ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. mappedBuiltinSkills ๋Š” ์ฐธ๊ณ  ์—ฐ๊ฒฐ์ผ ๋ฟ์ด๋ฉฐ, executionPlan ์ด ์—†์œผ๋ฉด marketCurated ๋Œ“๊ธ€์ด ์žˆ์–ด๋„ ์ตœ์ข… snapshot ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

marketCurated ๋Š” Skill Market ์•ˆ์—์„œ ์™„์„ฑ๋œ ๊ณต์œ ์Šคํ‚ฌ์ž…๋‹ˆ๋‹ค. builtin ํŽธ์ž…์„ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™„์„ฑ๋œ ๊ณต์œ ์Šคํ‚ฌ์€ Discussion ๊ณผ accepted item snapshot ์— ๋‚จ๊ณ , AI ๋Š” sourceUrl ๊ณผ trustTier ๋ฅผ ํ‘œ์‹œํ•œ ๋’ค ๋ณด์กฐ ์ ˆ์ฐจ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. builtinCandidate ๋Š” ์˜ˆ์™ธ์ ์ธ ์žฅ๊ธฐ ๊ฒ€ํ†  ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์šด์˜ ๊ฒฝ๋กœ๋Š” ํ† ๋ก ์—์„œ ์™„์„ฑํ•œ ๊ณต์œ ์Šคํ‚ฌ์„ Skill Market ์— ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ตœ์ข… ์Šคํ‚ฌ์€ Discussion ์˜ ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์ด๋‚˜ body ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์Šน์ธ๋œ items/{id}.json snapshot ์ž…๋‹ˆ๋‹ค. items/{id}.json ์ด ์—†์œผ๋ฉด ์•„์ง ์ตœ์ข… ์Šคํ‚ฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ“๊ธ€์€ ํ† ๋ก ๊ณผ ๊ธฐ์—ฌ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ์™„์„ฑ ๋’ค ์ƒˆ ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฌ๋ฉด ๊ธฐ์กด ์ตœ์ข… ์Šคํ‚ฌ์€ ์ฆ‰์‹œ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ  revisionStatus: pendingReview ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Maintainer ๊ฐ€ revision draft ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ๋‹ค์‹œ ์Šน๊ฒฉํ•˜๋ฉด ๊ทธ๋•Œ item snapshot, marketIndex.json, ๋žœ๋”ฉ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

Discussion ์šด์˜์€ ์•„์ด๋””์–ด โ†’ Caller Audit โ†’ executionPlan ์ดˆ์•ˆ โ†’ ์˜ˆ์‹œ ์ž…๋ ฅ/๊ธฐ๋Œ€ ์ถœ๋ ฅ โ†’ ์šด์˜์ž ํ™•์ • โ†’ accepted snapshot ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋˜๋ฉด ๊ธฐ์กด snapshot ์€ ์œ ์ง€๋˜๊ณ  ์ƒˆ ๋Œ“๊ธ€์€ pending revision ์œผ๋กœ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ† ๋ก ํ•ด์„œ ์šด์˜์ž๊ฐ€ ํ™•์ •ํ•˜๋ฉด items/{id}.json ์ด vN+1 ๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

dartlab-lite: ๋ธŒ๋ผ์šฐ์ €ยท์—‘์…€์—์„œ ์„ค์น˜ ์—†์ด (Pyodide)

์ƒ์„ธ: ๋ธ”๋กœ๊ทธ: ์—‘์…€ยท๋ธŒ๋ผ์šฐ์ €ยท๋…ธํŠธ๋ถ์—์„œ ์„ค์น˜ ์—†์ด dartlab ์“ฐ๊ธฐ (Pyodide)

Pyodide๊ฐ€ CPython์„ WebAssembly๋กœ ํฌํŒ…ํ•œ ๋•์— ํŒŒ์ด์ฌ์ด ์„ค์น˜๋˜์ง€ ์•Š์€ ํ™˜๊ฒฝ์—์„œ๋„ dartlab์ด ๊ทธ๋Œ€๋กœ ๋ˆ๋‹ค. ๊ฐ™์€ API, ๊ฐ™์€ ๋ฐ์ดํ„ฐ.

์ง€์› ํ™˜๊ฒฝ: xlwings Lite (Excel) ยท Anaconda Code (Excel) ยท JupyterLite ยท Google Colab WASM ๋Ÿฐํƒ€์ž„ ยท marimo (pyodide) ยท ์ˆœ์ˆ˜ HTML ์ž„๋ฒ ๋“œ.

๐Ÿ‘‰ ์›น ์—‘์…€์—์„œ ๋ฐ”๋กœ ์—ด์–ด๋ณด๊ธฐ: OneDrive ๊ณต์œ  ์›Œํฌ๋ถ: xlwings Lite + dartlab ์„ธํŒ… ์™„๋ฃŒ. ๋ฒ„ํŠผ๋งŒ ๋ˆ„๋ฅด๋ฉด ์‹œํŠธ์— ์žฌ๋ฌด์ œํ‘œ๊ฐ€ ์ฐํžŒ๋‹ค.

๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ๋ฐฉ์‹: scriptํ˜• vs funcํ˜•

xlwings Lite๋Š” ๋‘ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. @script๋Š” ๋ฒ„ํŠผํ˜•(๋ช…๋ นํ˜•), @func๋Š” ์ˆ˜์‹ํ˜•(์„ ์–ธํ˜•). dartlab์€ ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋ฉฐ, ํ•จ์ˆ˜ํ˜•์ด dartlab์„ ์—‘์…€๋‹ต๊ฒŒ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

1. @script: ์‚ฌ์ด๋“œ๋ฐ” ๋ฒ„ํŠผ โ†’ ์‹œํŠธ์— ์ฑ„์šฐ๊ธฐ

import dartlab
import xlwings as xw
from xlwings import arg, func, script

@script(name="isTest")
def finance(book: xw.Book):
    c = dartlab.Company('000020')
    df = c.panel('IS')
    data = [list(df.columns)] + [list(r) for r in df.iter_rows()]
    sheet = book.sheets.active
    sheet["A3"].value = data

xlwings Lite: @script ๋ชจ๋“œ, ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์‹œํŠธ์— IS๊ฐ€ ์ฑ„์›Œ์ง„๋‹ค

2. @func: ์—‘์…€ ์…€์— ์ˆ˜์‹์ฒ˜๋Ÿผ =GETFINANCE("005930")

@func
def getFinance(code: str):
    c = dartlab.Company(code)
    df = c.panel('IS')
    data = [list(df.columns)] + [list(r) for r in df.iter_rows()]
    return data

<img src=".github/assets/xlwings-lite-func.webp" alt="xlwings Lite: @func ๋ชจ๋“œ, ์…€์— =GETFINANCE("005930")๋งŒ ์ณ๋„ 5๋ถ„๊ธฐ IS๊ฐ€ ์ž๋™ ์Šคํ•„" width="720">

VLOOKUP๊ณผ ๋‚˜๋ž€ํžˆ =GETFINANCE๊ฐ€ ์—‘์…€ ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ข…๋ชฉ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ๋ฉด ์…€ ์žฌ๊ณ„์‚ฐ์œผ๋กœ ์ „๋ถ€ ๊ฐฑ์‹ ๋œ๋‹ค.

์„ค์น˜ (xlwings Lite ยท ํ•œ ์ค„)

import micropip
# ํ•œ ์ค„์ด๋ฉด ๋. deps(diff-match-patchยทopenpyxl ๋“ฑ)์™€ ๋นŒํŠธ์ธ C ํ™•์žฅ์€ wheel ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋งˆ์ปค๋กœ ์ž๋™ ํ•ด์†Œ.
await micropip.install("dartlab")

import dartlab
c = dartlab.Company("005930")
c.panel("IS")

๋˜๋Š” xlwings Lite ์‚ฌ์ด๋“œ๋ฐ”์˜ requirements.txt์— dartlab ํ•œ ์ค„. ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ ๋. ๋กœ์ปฌ ํŒŒ์ด์ฌ 0์ค„, uv 0์ค„, venv 0์ค„.

์ œ์•ฝ (๋ธŒ๋ผ์šฐ์ € ๋Ÿฐํƒ€์ž„์˜ ํ•œ๊ณ„)

๊ธฐ๋Šฅ Pyodide ๋น„๊ณ 
Company() ยท c.panel() ยท analysis ยท story ยท credit โœ… HF parquet ์ž๋™ ๋‹ค์šด๋กœ๋“œ
dartlab.ask() โŒ ์„ค์น˜ํ˜• agent CLI์™€ ๋กœ์ปฌ process๊ฐ€ ํ•„์š”
dartlab.scan() โŒ ์‚ฌ์ „ ๋นŒ๋“œ parquet 271MB (๋ธŒ๋ผ์šฐ์ € ๋น„ํ˜„์‹ค์ )
dartlab.gather() โŒ NaverยทYahooยทGoogle News CORS ์ฐจ๋‹จ

์Šค๋ ˆ๋“œ ์—†์Œ ยท MEMFS ํœ˜๋ฐœ ยท CORS ๋ฏธํ—ˆ์šฉ API ๋ถˆ๊ฐ€: ์ด ์„ธ ์ œ์•ฝ์ด ๊ทผ๋ณธ์ด๋‹ค. ์ƒ์„ธ์™€ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์€ pyodide/README.md, ์„ค์น˜ 5๋‹จ๊ณ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๋ณธ๋‹ค.

OpenAPI: ์›๋ณธ ๊ณต๊ณต API

from dartlab import OpenDart, OpenEdgar

# ํ•œ๊ตญ (opendart.fss.or.kr ๋ฌด๋ฃŒ API ํ‚ค ํ•„์š”)
d = OpenDart()
d.filings("์‚ผ์„ฑ์ „์ž", "2024")
d.finstate("์‚ผ์„ฑ์ „์ž", 2024)

# ๋ฏธ๊ตญ (API ํ‚ค ๋ถˆํ•„์š”)
e = OpenEdgar()
e.filings("AAPL", forms=["10-K", "10-Q"])

๋ฐ์ดํ„ฐ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” HuggingFace์— ์‚ฌ์ „ ๊ตฌ์ถ•: ์ž๋™ ๋‹ค์šด๋กœ๋“œ. EDGAR๋Š” SEC API ์ง์ ‘ ์ˆ˜์ง‘. ์‚ฌ์šฉ์ž๋Š” ๋ฐ์ดํ„ฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ณด๊ณ  ์ƒˆ Skill Market ์•„์ด๋””์–ด์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ๋‹ค.

์นดํ…Œ๊ณ ๋ฆฌ ํฌํ•จ ๋ฐ์ดํ„ฐ ๋Œ€ํ‘œ ์‚ฌ์šฉ
DART docs ์‚ฌ์—…๋ณด๊ณ ์„œยท๋ถ„๊ธฐ๋ณด๊ณ ์„œ ์›๋ฌธ ์„น์…˜, ์ฃผ์„, ํ…์ŠคํŠธ ํ† ํ”ฝ ๊ณต์‹œ ๋ณ€ํ™”, ๋ฆฌ์Šคํฌ, ์‚ฌ์—… ์„ค๋ช…
DART finance K-IFRS XBRL ์žฌ๋ฌด์ œํ‘œ, ํ‘œ์ค€ ๊ณ„์ •, ๊ธฐ๊ฐ„ ๋น„๊ต Company.show, analysis, credit
DART report OpenDART ์ •ํ˜• ํ•ญ๋ชฉ, ์ž„์›ยท์ง์›ยท๋ฐฐ๋‹นยท์ง€๋ถ„ ๋“ฑ ์ง€๋ฐฐ๊ตฌ์กฐ, ๋ฐฐ๋‹น, ์ธ๋ ฅ, ์ž๋ณธ์ •์ฑ…
DART scan ์ „์ข…๋ชฉ ํšก๋‹จ ์Šค์บ”์šฉ ํ”„๋ฆฌ๋นŒ๋“œ ์ง€ํ‘œ peer ๋น„๊ต, ๋žญํ‚น, ์ด์ƒ์น˜ ํƒ์ƒ‰
EDGAR SEC filing, US-GAAP XBRL, 10-K/10-Q/8-K ๋ฏธ๊ตญ ๊ธฐ์—… ๋ถ„์„, ํ•œ๋ฏธ ๋น„๊ต
Gather ๊ฐ€๊ฒฉ, ์ˆ˜๊ธ‰, ๋‰ด์Šค, ๊ฑฐ์‹œ์ง€ํ‘œ(FREDยทECOS), ์™ธ๋ถ€ ๋ณด์กฐ ๋ฐ์ดํ„ฐ ์‹œ์žฅ ๋ฐ˜์‘, ์ด๋ฒคํŠธ, macro recipe
Reference ์‚ฐ์—… ๋งต, capability, ๋ Œ๋”๋งยท๋งคํ•‘ ๊ธฐ์ค€ Skill OS, ์ฐจํŠธ, ๋ณด๊ณ ์„œ ์กฐ๋ฆฝ

ํŒŒ์ดํ”„๋ผ์ธ: ๋กœ์ปฌ ์บ์‹œ(์ฆ‰์‹œ) โ†’ HuggingFace(์ž๋™ ๋‹ค์šด๋กœ๋“œ) โ†’ DART API(ํ‚ค ํ•„์š”). ๋Œ€๋ถ€๋ถ„ ์ฒ˜์Œ ๋‘ ๋‹จ๊ณ„๋กœ ์ถฉ๋ถ„.

๋ฐ”๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

๋…ธํŠธ๋ถ (Colab): Company ยท Gather ยท Scan ยท Quant ยท Analysis ยท Macro ยท Credit ยท Story ยท AI

๋…ธํŠธ๋ถ (marimo): ์ „์ฒด ๋ชฉ๋ก: import ๋ฐ˜๋ณต ์—†๋Š” ๋‹จ์ผ ์ง„์ž…, ์…€๋งˆ๋‹ค ์ฃผ์„ ์„ค๋ช…, ๋งˆํฌ๋‹ค์šด ์…€ ๋ฏธ์‚ฌ์šฉ

๋ฌธ์„œ

๋ฌธ์„œ ยท ๋น ๋ฅธ ์‹œ์ž‘ ยท Skills

๋ธ”๋กœ๊ทธ (120+ ๊ธ€): ์ „์ฒด ยท ๊ธฐ์—…์ด์•ผ๊ธฐ ยท ์‹ ์šฉํ‰๊ฐ€ ๋ณด๊ณ ์„œ

์•ˆ์ •์„ฑ

Tier ๋ฒ”์œ„
Stable DART Company (panel, show, trace, diff, BS/IS/CF, CIS, index, filings, profile), EDGAR Company core, valuation, forecast, simulation
Beta EDGAR ํŒŒ์›Œ์œ ์ € (SCE, notes, freq, coverage), credit, insights, distress, ratios, timeseries, network, governance, workforce, capital, debt, chart/table/text ๋„๊ตฌ, ask/chat, OpenDart, OpenEdgar, Server API, MCP
Experimental AI ๋„๊ตฌ ํ˜ธ์ถœ, export, viz (์ฐจํŠธ)

์ž์„ธํ•œ ๊ธฐ์ค€์€ operation.stability ๋ฅผ ๋ณธ๋‹ค.

์„ค๊ณ„ ์„ ํƒ

๋‹ค๋ฅธ ์žฌ๋ฌด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‹ค๋ฅธ ์˜์‹์  ๊ฒฐ์ •: ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์น˜ ํ›„ ๋งˆ์ฃผ์น  ์ฐจ์ด๋ฅผ ๋ฏธ๋ฆฌ ๋ช…์‹œํ•œ๋‹ค.

๊ฒฐ์ • ์˜๋ฏธ ์ด์œ 
๋‹จ์ผ base install: [extras] ๋ถ„๋ฆฌ ์—†์Œ pip install dartlab ํ•œ ๋ฒˆ์— ๋ถ„์„ยท์„œ๋ฒ„ยทMCPยทvizยทAgent Runtime ํ˜ธ์ŠคํŠธ๊ฐ€ ํ•จ๊ป˜ ๋“ค์–ด์˜จ๋‹ค ๋ถ„์„ ๋„๊ตฌ์— "์ด๊ฒƒ๋„ ์„ค์น˜ํ•˜์„ธ์š”" ๊ฐ€ ๋ˆ„์ ๋˜๋ฉด ์ฒซ ์‚ฌ์šฉ๊นŒ์ง€ ๋งˆ์ฐฐ์ด ๋Š˜์–ด๋‚œ๋‹ค. ๋ชจ๋ธ ์‹คํ–‰์€ ์‚ฌ์šฉ์ž์˜ ์„ค์น˜ํ˜• agent๊ฐ€ ๋งก๊ณ  DartLab wheel์€ runtime adapter์™€ ๊ธˆ์œต ๋Šฅ๋ ฅ๋งŒ ์ œ๊ณตํ•œ๋‹ค.
์‚ฌ์ „ ๊ตฌ์ถ• ๋ฐ์ดํ„ฐ, API ํ‚ค 0 ์œผ๋กœ ์‹œ์ž‘ Company("005930") ํ˜ธ์ถœ ์‹œ HuggingFace ์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ โ†’ ๋กœ์ปฌ ์บ์‹œ. DART API ํ‚ค๋Š” ์žฌ์ˆ˜์ง‘ ๋งŒ ํ•„์š” "ํ‚ค ๋งŒ๋“ค๊ณ  ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ธํŒ…" ๋‹จ๊ณ„๋ฅผ 1์ˆœ์œ„ ์‚ฌ์šฉ ๊ฒฝ๋กœ์—์„œ ์ œ๊ฑฐ. ํ‚ค ๋ฐœ๊ธ‰์€ dartlab collect ๊ฐ™์€ raw ์žฌ์ˆ˜์ง‘ ํ๋ฆ„์—์„œ๋งŒ ๋“ฑ์žฅ.
๊ณต์‹œ ๋ณธ๋ฌธ์€ ๋ฐ์ดํ„ฐ, ์ง€์‹œ ์•„๋‹˜ ์™ธ๋ถ€ ๋ณธ๋ฌธ์€ ์ง๋ ฌํ™” ์‹œ [EXTERNAL CONTENT START - untrusted ...] ๋งˆ์ปค๋กœ ์ž๋™ ๊ฐ์Œˆ DART/EDGAR/๋‰ด์Šค ๋ณธ๋ฌธ ์•ˆ์˜ "์ด์ „ ์ง€์‹œ ๋ฌด์‹œ" ๊ฐ™์€ ํŒจํ„ด์ด AI ๋™์ž‘์„ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋„๋ก ์ง๋ ฌํ™” ๋‹จ์—์„œ ๊ฐ•์ œ. ๋งˆ์ปค ์•ˆ ์ˆซ์žยท๋‚ ์งœยท๊ณ ์œ ๋ช…์‚ฌ๋Š” 1์ฐจ ์ถœ์ฒ˜ ์žฌ๊ฒ€์ฆ ํ›„ ์ธ์šฉ.
AI ์—”์ง„ = Bring Your Agent Runtime Codex app-server, Claude stream-json, ACP๋ฅผ provider-neutral AgentEvent๋กœ ์ •๊ทœํ™”ํ•œ๋‹ค. ๊ณ ์ • graph ์—†์ด agent๊ฐ€ Skill OS์™€ MCP ๋„๊ตฌ๋ฅผ ์ž์œจ ์‚ฌ์šฉํ•œ๋‹ค. ์ธ์ฆยท๋ชจ๋ธยทnative session์€ CLI์— ๋‘๊ณ  DartLab์€ ๊ธˆ์œต capability, ๊ทผ๊ฑฐ, ๊ถŒํ•œยทprocess ๊ฒฝ๊ณ„์— ์ง‘์ค‘ํ•œ๋‹ค.
๋‚ด๋ถ€ ๋‹จ๋ฐฉํ–ฅ import ์ œํ’ˆ ์„ค๋ช…๊ณผ ๋ณ„๊ฐœ๋กœ ์ฝ”๋“œ ํด๋”๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ ์œ ์ง€ํ•œ๋‹ค ์ž์„ธํ•œ ๋ ˆ์ด์–ด์™€ ๊ธฐ์—ฌ ๊ทœ์œจ์€ ARCHITECTURE.md์— ๋‘”๋‹ค. import-linter์™€ dartlabGuard.py strict --scope l0-l15๊ฐ€ PR ๊ฒŒ์ดํŠธ๋‹ค.
ํ…Œ์ŠคํŠธ ์ง๋ ฌํ™” ๊ฐ•์ œ (Polars OOM ๊ฐ€๋“œ) pytest -v ์ „์ฒด ํ˜ธ์ถœ ๊ธˆ์ง€. tests/test-lock.sh tests/ -m "<marker>" ๊ฒฝ์œ  Company 1๊ฐœ โ‰ˆ 200~500 MB Rust ํž™์€ gc.collect() ํšŒ์ˆ˜ ๋ถˆ๊ฐ€. CI ์™€ ๋กœ์ปฌ์„ ๊ฐ™์€ lock wrapper ๋ช…๋ น์œผ๋กœ ํ†ต์ผ.
๋ฉ”์‹œ์ง€ ํ•œ๊ตญ์–ด ์šฐ์„ , API ์˜์–ด Company, pastInsight, analysis ๋“ฑ symbol ์€ ์˜์–ด. CLI ์—๋Ÿฌยท์ง„ํ–‰ ๋ฉ”์‹œ์ง€๋Š” ํ•œ๊ตญ์–ด classifier ์— Natural Language :: Korean / English ๋‘˜ ๋‹ค ์„ ์–ธ. PyPI ์˜์–ด ์‚ฌ์šฉ์ž ๋Œ€์ƒ ์˜๋ฌธ ์ง„์ž…์€ README_EN.md ์™€ ์˜๋ฌธ docstring ์œผ๋กœ ๋ณ„๋„ ํŠธ๋ž™.
๋‹จ์ผ SSOT: Skill OS ์™ธ๋ถ€ LLMยท์‚ฌ์šฉ์ž๊ฐ€ capabilities() ํ•œ ์ค„๋กœ 304 specs ์นดํƒˆ๋กœ๊ทธ ์งˆ์˜ ์ฝ”๋“œยท๋ฌธ์„œยท๊ณ„์•ฝ์„ ๊ฐ™์€ ํŒŒ์ผ (src/dartlab/skills/specs/**) ๋กœ ์šด์˜. README โ†” docs โ†” ์ฝ”๋“œ drift ๋ฅผ SSOT ํ•œ ๊ณณ์—์„œ ๋ฐฉ์ง€.
๋ถ€์ฑ„ ์‹œ๊ณ„์—ด ๊ณต๊ฐœ uv run python -X utf8 src/dartlab/skills/measureProgress.py ๋กœ baseline ยท docstring backlog ยท pytest marker ๋ถ„ํฌ 3 ์ถ• ์ถ”์„ธ ์ธก์ •. master push ๋งˆ๋‹ค _progress/measureHistory.jsonl ํ•œ ์ค„ ์ ์žฌ "์‹ ๊ทœ ํšŒ๊ท€ 0" ๊ฐ€๋“œ ์™ธ์— ์ƒํ™˜ ๋„ ์ •๋Ÿ‰์œผ๋กœ ๋ณธ๋‹ค. ์™ธ๋ถ€ ๊ธฐ์—ฌ์ž๊ฐ€ "๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ณ  ์žˆ๋Š”๊ฐ€" ๋ฅผ ์‹œ๊ณ„์—ด ํ•œ ํŒŒ์ผ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ.

30์ดˆ ์•ˆ์— ์ฒซ ๊ฒฐ๊ณผ

pip install dartlab
import dartlab
c = dartlab.Company("005930")   # HuggingFace ์ž๋™ ๋‹ค์šด๋กœ๋“œ (์ตœ์ดˆ ~์ˆ˜์‹ญ MB, ๋กœ์ปฌ ์บ์‹œ)
c.panel("IS")                   # ์†์ต๊ณ„์‚ฐ์„œ, ๋ถ„๊ธฐ ๊ธฐ๋ณธ

์„ธ ์ค„: API ํ‚ค 0, ํ™˜๊ฒฝ๋ณ€์ˆ˜ 0. ์˜๋ฌธ ์‚ฌ์šฉ์ž๋Š” README_EN.md, ๋‹ค๋ฅธ ์ง„์ž… ๊ฒฝ๋กœ (CLI ยท AI ยท MCP) ๋Š” ์œ„ ์„ธ ๊ฐ€์ง€ ์‹œ์ž‘์  ์ฐธ์กฐ.

๊ธฐ์—ฌ

๊ธฐ์—ฌ๋Š” ๋ฌด์—‡์ด๋“  ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ, ๊ธฐ๋Šฅ ์ œ์•ˆ, ๋ฌธ์„œ ๊ฐœ์„ , ์˜ˆ์ œ ์ถ”๊ฐ€, ๋ฐ์ดํ„ฐ ๋งคํ•‘ ์ˆ˜์ •์ฒ˜๋Ÿผ ์ž‘์€ ๋ณ€๊ฒฝ๋„ dartlab์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํ•œ๊ตญ์–ด์™€ ์˜์–ด ์ด์ŠˆยทPR ๋ชจ๋‘ ํŽธํ•˜๊ฒŒ ์—ด์–ด์ฃผ์„ธ์š”. ์–ด๋””์„œ ์‹œ์ž‘ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์ด์Šˆ๋กœ ๋จผ์ € ์ด์•ผ๊ธฐํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ถ๊ทน์„ฑ (๊ฐœ๋ฐœ ์šด์˜ ์ง€ํ‘œ)

์ด ์„น์…˜์€ ์‚ฌ์šฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ ์šด์˜ ๊ธฐ๋ก์ด๋‹ค. DartLab์„ ์“ฐ๋Š” ๋ฐ๋Š” ํ•„์š” ์—†๊ณ , ๋ฌด์—‡์„ ์šฐ์„  ๋งŒ๋“ค๊ณ  ์–ด๋””๊ฐ€ ์•ฝํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์ด๋‹ค.

DartLab์€ ์‹ค์ œ ๊ธฐ์—…ยท์‹œ์žฅยท๊ณต์‹œ ์งˆ๋ฌธ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์‹ ์—”์ง„์˜ ๊ณ„์‚ฐ๊ณผ ์ถœ์ฒ˜๋ฅผ ๊ฑฐ์ณ, ์Šค์Šค๋กœ ๊ทผ๊ฑฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์„ ๊ฒฐ๊ณผ์— ๋„๋‹ฌํ•˜๋„๋ก ๋•๋Š”๋‹ค.

๋ถ๊ทน์„ฑ์€ ์ฃผ๊ฐ„ ๊ฒ€์ฆ ์™„๋ฃŒ ๋ถ„์„ ๋ฃจํ”„(weeklyVerifiedAnalysisLoops) ํ•˜๋‚˜๋งŒ ์„ผ๋‹ค. ์‹ค์ œ ์งˆ๋ฌธ์ด DartLab ์ •์‹ ์—”์ง„์„ ๊ฑฐ์ณ ๊ทผ๊ฑฐ ์žˆ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ๊ฒฐ๊ณผ์˜ ์ •ํ™•ํ•œ evidence ๋˜๋Š” artifact๋ฅผ ์ง์ ‘ ํ™•์ธํ–ˆ์„ ๋•Œ๋งŒ ํ•œ ๊ฑด์ด๋‹ค. ๋ชจ๋ธ ์‘๋‹ต, tool call ์ˆ˜, ํŽ˜์ด์ง€๋ทฐ, ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์ˆ˜๋Š” ์„ธ์ง€ ์•Š๋Š”๋‹ค. ํ˜„์žฌ ์ „์—ญ ๊ฐ’์€ ๋ฏธ์ธก์ •์ด๋ฉฐ, ๊ถŒ์œ„ ์žˆ๋Š” ์ธก์ •์ด ์„œ๊ธฐ ์ „์—๋Š” ์„ฑ์žฅ ๋ชฉํ‘œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

์ ์ˆ˜๋Š” ์ถ•๋ณ„ ์„ฑ์ˆ™๋„์ด๋ฉฐ, ์—ฌ๋Ÿ ๋Šฅ๋ ฅ ์ฐจ์› ์ ์ˆ˜์˜ ์‚ฐ์ˆ ํ‰๊ท ์ด๋‹ค. ๊ฐ ์ฐจ์› 10์ ์€ ์‹ค์‚ฌ์šฉ ํ™˜๊ฒฝ์—์„œ ๊ทธ ๋Šฅ๋ ฅ์ด ๋ฐ˜๋ณต ๊ฒ€์ฆ๋œ ์ƒํƒœ๋‹ค. ์ ์ˆ˜์˜ ๊ทผ๊ฑฐ๋Š” ์‹ค์ œ๋กœ ๋„๋Š” ๊ฒŒ์ดํŠธ์™€ ์‹ค์ธก ์—ฌ์ •์ด๋ฉฐ, ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ๋Š” ๊ตฌํ˜„๋ผ ์žˆ์–ด๋„ ์ ์ˆ˜๋กœ ์„ธ์ง€ ์•Š๋Š”๋‹ค. ์ฐจ์› ์ •์˜์™€ ์™„๋ฃŒ ํŒ์ •์˜ ์ •๋ณธ์€ ๋ถ๊ทน์„ฑ skill์ด๋‹ค. ํ˜„์žฌ ์ด์ ์€ 72.0/120, ํ‰๊ท  6.0/10์ด๋‹ค.

์ฐจ์› 10์ ์˜ ์˜๋ฏธ
๊ทผ๊ฑฐ ๋ชจ๋“  ๊ฒฐ๊ณผ๊ฐ€ ์ถœ์ฒ˜์™€ ๊ธฐ์ค€์‹œ์ ์„ ๋‹ฌ๊ณ , ๊ฒ€์‚ฐ ์—ฌ์ •์ด ๋ฐ˜๋ณต ๊ฒ€์ฆ๋œ๋‹ค
์ปค๋ฒ„๋ฆฌ์ง€ ๋ชฉํ‘œ ์œ ๋‹ˆ๋ฒ„์Šค(์ „ ์ƒ์žฅ์‚ฌยท์ „ ๊ธฐ๊ฐ„ยท์ „ ํ‘œ๋ฉด)๋ฅผ ๋น ์ง์—†์ด ์ปค๋ฒ„ํ•œ๋‹ค
๊ฒ€์ฆ๊ฐ•๋„ ํ•ต์‹ฌ ํ–‰๋™ ์ „๋ถ€๊ฐ€ ์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ž๋™ ๊ฒŒ์ดํŠธ๋กœ ๋‹จ์–ธ๋œ๋‹ค
์ง๊ด€์„ฑ ๋ฐฐ์šธ ๊ฒƒ ์—†์ด ์ฒซ ๊ฒฐ๊ณผ๊นŒ์ง€ ํ•œ ์ค„, ์ด๋ฆ„๊ณผ ๋ฌธ๋ฒ•์ด ์ž๋ช…ํ•˜๋‹ค
์†๋„ ์ฒซ ๊ฒฐ๊ณผ์™€ ์žฌํ˜ธ์ถœ์ด ์ฒด๊ฐ ์ฆ‰์‹œ์ด๊ณ  ์‹ค์ธก์น˜๊ฐ€ ์žˆ๋‹ค
ํšจ์œจ์„ฑ ์ค‘๋ณต ๋นŒ๋“œ 0, ์‚ฌ๋ณธ 0, ์ž์› ์˜ˆ์‚ฐ ์ค€์ˆ˜๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋” ์‹ธ๊ฒŒ ๋‚ธ๋‹ค
์•ˆ์ •์„ฑ ํšŒ๊ท€ ๊ฐ€๋“œ๊ฐ€ ์ƒ์ฃผํ•˜๊ณ  ์‹คํŒจ๋Š” ์ •์งํ•œ ์ƒํƒœ๋กœ ๊ฐ•๋“ฑ๋œ๋‹ค
ํ˜์‹ ์„ฑ ๊ธฐ์กด ๋Œ€์•ˆ์ด ์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์‹ค์ธก์œผ๋กœ ์ฆ๋ช…ํ•œ๋‹ค
์ถ• ๊ทผ๊ฑฐ ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒ€์ฆ๊ฐ•๋„ ์ง๊ด€์„ฑ ์†๋„ ํšจ์œจ์„ฑ ์•ˆ์ •์„ฑ ํ˜์‹ ์„ฑ ์ข…ํ•ฉ
Python ๊ณต๊ฐœ ๊ณ„์•ฝ 8.5 8.0 8.5 8.0 7.0 7.0 8.0 8.5 7.9
๋ฐ์ดํ„ฐ ์ธํ”„๋ผ (HF SSOT) 8.5 8.0 8.0 8.5 7.5 8.5 8.0 7.5 8.1
๋ฏธ๊ตญ (EDGAR) 7.0 4.5 5.0 7.0 5.5 6.0 5.5 6.5 5.9
๋‹ค์„ฏ ๋ถ„์„ ๋ Œ์ฆˆ 8.0 7.0 6.5 7.5 6.5 7.0 7.0 8.0 7.2
๋ฆฌํฌํŠธยท์Šคํ† ๋ฆฌ 7.5 6.0 6.0 7.0 6.0 6.5 6.5 7.5 6.6
์‹œ๋ฎฌ๋ ˆ์ด์…˜ 6.0 4.5 5.5 5.0 5.5 5.5 5.0 6.0 5.4
AI ์›Œํฌ๋ฒค์น˜ (ask) 8.0 7.0 6.5 8.0 6.0 6.5 7.0 8.0 7.1
MCP ์„œ๋ฒ„ 7.5 7.0 7.5 7.0 6.0 7.0 7.0 7.0 7.0
Agent Runtime (Bring Your Agent) 2.0 1.5 1.0 1.5 1.0 1.5 1.0 2.5 1.5
ํ„ฐ๋ฏธ๋„ 7.0 7.5 6.5 7.0 6.5 7.5 6.5 7.0 6.9
๋…ธํŠธ๋ถยท๋ธŒ๋ผ์šฐ์ € (Pyodide) 6.5 5.5 6.0 7.5 5.5 6.5 6.0 7.5 6.4
๋ถ๊ทน์„ฑ ์ธก์ • (productOutcome) 3.0 1.5 1.0 2.0 2.0 2.5 1.5 2.5 2.0
์ถ• ํ˜„ ์ƒํƒœ ๋„๋‹ฌํ•  ์ƒํƒœ
Python ๊ณต๊ฐœ ๊ณ„์•ฝ 9๊ฐœ ๊ณ„์•ฝ ์—”์ง„(gatherยทscanยทanalysisยทmacroยทquantยทindustryยทcreditยทdataHubยทsimulate)๊ณผ Companyยทstory ํŒŒ์‚ฌ๋“œ๊ฐ€ dartlab.{engine}("{axis}", ...) ํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ๋Œ๊ณ , L0~L4 ์ „ ๊ณ„์ธต ์•ˆ์ •ํ™” ํŒ์ •์ด ๋๋‚ฌ๋‹ค. ๋…ธํŠธ๋ถยท๋ธ”๋กœ๊ทธยทSkill OS ์ฝ”๋“œํŽœ์Šค์˜ ๊ณ„์•ฝ ์œ„๋ฐ˜์€ AST ๊ฐ€๋“œ๊ฐ€ ๊ธฐ๊ณ„ ์ฐจ๋‹จํ•˜๊ณ , ๊ณต๊ฐœ API manifest ๋Œ€์กฐ์™€ product smoke๊ฐ€ CI์—์„œ ๋ˆ๋‹ค. ์‹ค์‚ฌ์šฉ์ž ์—ฌ์ •์˜ ๋ฐ˜๋ณต ๊ณ„์ธก์€ ๋‚จ์•˜๋‹ค. ์–ด๋–ค ์ง„์ž… ํ‘œ๋ฉด์—์„œ๋“  ๊ฐ™์€ ๋ฌธ๋ฒ•๊ณผ ๊ฐ™์€ ๊ทผ๊ฑฐ ๋ฌธ๋ฒ•์œผ๋กœ ๊ณต๊ฐœ ๊ณ„์•ฝ์ด ํ˜ธ์ถœ๋œ๋‹ค.
๋ฐ์ดํ„ฐ ์ธํ”„๋ผ (HF SSOT) DART ๊ณต์‹œ ์›๋ฌธ ์„น์…˜ยทXBRL ์žฌ๋ฌดยท์ •ํ˜• ํ•ญ๋ชฉยท์ „์ข…๋ชฉ ์Šค์บ” ํ”„๋ฆฌ๋นŒ๋“œยท๊ฐ€๊ฒฉยท๊ฑฐ์‹œ๊ฐ€ HuggingFace ๊ณต๊ฐœ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์„œ๊ณ , ๋Ÿฐํƒ€์ž„์€ ๋ณ„๋„ ๋นŒ๋“œ ์—†์ด SSOT๋ฅผ ์ง๋…ํ•ด ๋กœ์ปฌ ์บ์‹œ๋กœ ๋ˆ๋‹ค. API ํ‚ค 0์œผ๋กœ ์ฒซ ๊ฒฐ๊ณผ๊ฐ€ ๋‚œ๋‹ค. ์ˆ˜์ง‘์€ ์˜จ๋ผ์ธ, ํ”„๋ฆฌ๋นŒ๋“œ๋Š” ์˜คํ”„๋ผ์ธ ์ „์šฉ์œผ๋กœ ๋ถ„๋ฆฌ๋˜๊ณ  offline ๊ฐ€๋“œ 3์ข…์ด CI์—์„œ ๊ฐ•์ œ๋œ๋‹ค. ์ „์ฒด ๊ณต์‹œ ๋ชฉ๋ก์€ ์›”๋ณ„ parquet๋กœ ๋ฐฑํ•„๋œ๋‹ค. ์‹ ์„ ๋„ ์™„๊ฒฐ ์—ฌ์ •์˜ ์ž๋™ ๊ณ„์ธก์€ ๋‚จ์•˜๋‹ค. ์ „ ์ƒ์žฅ์‚ฌยท์ „ ๊ธฐ๊ฐ„์ด ๊ณต๊ฐœ SSOT์—์„œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์—ด๋ฆฌ๊ณ  ์‹ ์„ ๋„๊ฐ€ ๊ณ„์ธก๋œ๋‹ค.
๋ฏธ๊ตญ (EDGAR) Company("AAPL")๊ฐ€ SEC ์›๋ณธ ์ œ์ถœ๋ฌผ์˜ XBRL์„ ์ž๊ธ‰ ํŒŒ์‹ฑํ•ด ํ•œ๊ตญ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค(panelยท์ฃผ์„ 12ํ† ํ”ฝยทratiosยทfilings)๋กœ ์—ด๋ฆฐ๋‹ค. ๊ฐ€์น˜์‚ฌ์Šฌ taxonomy๋Š” ํ•œ๊ตญ ํ•œ์ •์ด๋ผ EDGAR industry๋Š” ๊ฐ€์งœ ๋งคํ•‘ ๋Œ€์‹  blocked ๊ฒฐ์†์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ„ฐ๋ฏธ๋„ ๋„๋‹ฌ ๋ฐฐ์„ ์€ ์žฌ์ •๋ ฌ ์ค‘์ด๊ณ  ๊ฐ€๊ฒฉยท์ง€์ˆ˜ ๊ตฌ์กฐ๋งŒ ํ™•์ •๋๋‹ค. ๋ฏธ๊ตญ ์ข…๋ชฉ์ด ํ•œ๊ตญ๊ณผ ๊ฐ™์€ ํ„ฐ๋ฏธ๋„ยท๋ Œ์ฆˆ ์—ฌ์ •์œผ๋กœ ์—ด๋ฆฐ๋‹ค.
๋‹ค์„ฏ ๋ถ„์„ ๋ Œ์ฆˆ analysisยทcreditยทindustryยทquantยทmacro๊ฐ€ conclusionยทdriversยทevidenceยทconfidenceยทgapsยทfalsifiersยทasOf ๊ณตํ†ต ๋ฌธ๋ฒ•์˜ product ์™ธํ”ผ๋กœ ๋Œ๊ณ , ๋‹จ์ผ ์ข…ํ•ฉ์ ์ˆ˜๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉฐ ๊ฒฐ์†์„ usableยทpartialยทblocked๋กœ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœํ•œ๋‹ค. credit์€ 79๊ฐœ์‚ฌ ์‹ค์ธก ๊ฒ€์ฆ(๋Œ€๊ธฐ์—… 87%, ์ „์ฒด 70%)์ด ์žˆ๋‹ค. ๋ Œ์ฆˆ ๊ฒฐ๋ก ์˜ ์‹ค์‚ฌ์šฉ ๋ฐ˜๋ณต ๊ฒ€์ฆ๊ณผ v5.0 ์žฌ์ธก์ •์€ ๋‚จ์•˜๋‹ค. ๊ฐ ๋ Œ์ฆˆ๊ฐ€ ์‹ค์ œ ์งˆ๋ฌธ์—์„œ ๋ฐ˜๋ณต ๊ฒ€์ฆ๋œ ๊ทผ๊ฑฐ ์ถฉ์กฑ๋„๋กœ ๋‹ตํ•œ๋‹ค.
๋ฆฌํฌํŠธยท์Šคํ† ๋ฆฌ c.story() 6๋ง‰ ์„œ์‚ฌ์™€ Company.reportModel ๊ณต๊ฐœ ๊ณ„์•ฝ, ํ”„๋กœ ๋ฆฌํฌํŠธ emitter๊นŒ์ง€ ์™„๊ฒฐ๋๊ณ  ๋ฐœ๊ฐ„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๊ธฐ์—…์ด์•ผ๊ธฐ 10ํŽธ์ด ๋ธ”๋กœ๊ทธ์— ์‹ค๋ฐœ๊ฐ„๋๋‹ค. ๋žœ๋”ฉ์ด ๊ฐ™์€ ๋ชจ๋ธ์„ ์†Œ๋น„ํ•˜๋Š” ๋‹จ๊ณ„๋Š” ์šด์˜์ž ๊ฒฐ์ • ๋Œ€๊ธฐ๋‹ค. ํšŒ์‚ฌ ํ•˜๋‚˜์˜ ์ „์ฒด ์ด์•ผ๊ธฐ๊ฐ€ ๋ฆฌํฌํŠธ๋กœ ๋‚˜์˜ค๊ณ  ๋ชจ๋“  ํ‘œ๋ฉด์ด ๊ฐ™์€ ๋ชจ๋ธ์„ ์†Œ๋น„ํ•œ๋‹ค.
์‹œ๋ฎฌ๋ ˆ์ด์…˜ dartlab.simulate ๊ฒฐ์ •๋ก  ๋“œ๋ผ์ด๋ฒ„ DAG ์ฝ”์–ด๊ฐ€ ๊ณ„์•ฝ ์—”์ง„์œผ๋กœ ๋Œ๊ณ  ๊ฐ€์ • ์›์žฅ์„ ๋‚จ๊ธด๋‹ค. ๊ฑฐ์‹œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์—”์ง„์€ ์™„๊ฒฐ๋๋‹ค(ํšŒ์‚ฌ๋‹จ ๊ฑฐ์‹œ ์žฌ๋ฌด ๋ธŒ๋ฆฌ์ง€๋Š” ๋ฐ์ดํ„ฐ ๋ฒฝ์œผ๋กœ ๋ฏธ๋นŒ๋“œ ํ™•์ •). Play UIยทfan ์ฐจํŠธ์™€ ์‹œ๋‚˜๋ฆฌ์˜ค ์‹ค์‚ฌ์šฉ ์—ฌ์ •์€ ๋ฏธ์™„์ด๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋Œ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ„ฐ๋ฏธ๋„์—์„œ ๋งŒ์ง„๋‹ค.
AI ์›Œํฌ๋ฒค์น˜ (ask) dartlab.ask๊ฐ€ chat-native ์ž์œจ tool calling์œผ๋กœ ๋Œ๊ณ , 241๊ฐœ capability์˜ ์งˆ๋ฌธ๋ณ„ coverage์™€ 182๊ฐœ ์‹คํ–‰ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ˆซ์žยท๊ธฐ๊ฐ„ยท๋น„๊ต์ถ•ยท๊ฐ์‚ฌ ์ฃผ์žฅ์€ exact ref payload๋กœ ๊ฒ€์‚ฐ๋˜๊ณ  ๋ถˆ์ผ์น˜๋Š” ๊ณต๊ฐœ ์ „์— ์‹คํŒจํ•œ๋‹ค. GUI๋Š” ์‚ฌ์šฉ ๊ทผ๊ฑฐ์™€ ๋ณด์กฐ ๊ทผ๊ฑฐ, ๊ฒฐ์†, artifact, ์‚ฌ์šฉ์ž exact ํ™•์ธ์„ ๋ถ„๋ฆฌํ•œ๋‹ค. ์ „์—ญ ์ฃผ๊ฐ„ ๋ถ๊ทน์„ฑ ๋ถ„์ž๋Š” ์•„์ง ๋ฏธ์ธก์ •์ด๋‹ค. ์งˆ๋ฌธ ํ•˜๋‚˜๊ฐ€ ๊ฒ€์ฆ ์™„๋ฃŒ ๋ถ„์„ ๋ฃจํ”„ ํ•œ ๊ฑด์œผ๋กœ ๋๋‚œ๋‹ค.
MCP ์„œ๋ฒ„ tools/list๊ฐ€ ๊ด‘๊ณ ํ•˜๋Š” canonical ๋„๊ตฌ๋งŒ ์‹คํ–‰๋˜๊ณ , ๋‹จ์ผ ํ˜ธ์ถœ์€ EngineCall allowlist, ๋‹ค๋‹จ ๊ฐ€๊ณต๋งŒ RunPython์œผ๋กœ ๋ถ„๋ฆฌ๋œ๋‹ค. ์˜› generated ๋„๊ตฌ 33์ข…์€ 0.10์—์„œ ํ๊ธฐ๋๊ณ  agent์™€ MCP์˜ ๋„๊ตฌ ๋ชฉ๋ก ๋“œ๋ฆฌํ”„ํŠธ๋Š” ๋‹จ์ผ SSOT๋กœ ๊ธฐ๊ณ„ ๋Œ€์กฐ๋œ๋‹ค. stdio์™€ ์›๊ฒฉ SSE ๋‘˜ ๋‹ค ์‚ฐ๋‹ค. ์™ธ๋ถ€ LLM ์‹ค์‚ฌ์šฉ์˜ ๋ฐ˜๋ณต ๊ฒ€์ฆ์€ ๋‚จ์•˜๋‹ค. ์™ธ๋ถ€ LLM์ด ๊ฐ™์€ ๊ณ„์•ฝยท๊ฐ™์€ ๊ทผ๊ฑฐ ๋ฌธ๋ฒ•์œผ๋กœ DartLab์„ ์“ด๋‹ค.
Agent Runtime (Bring Your Agent) ์„ค์น˜๋œ CLI๋ฅผ ์“ฐ๋Š” runtime์ด ๊ตฌํ˜„๋๋‹ค. Claude์™€ Codex ์‹ค์ œ ask๊ฐ€ ReadSkillยทEngineCall์„ ํ˜ธ์ถœํ•ด ์ •๋Ÿ‰ยท๊ธฐ์—… ๋น„๊ตยท๊ฐ์‚ฌ ๋ฌธ์„œ ์งˆ๋ฌธ์˜ exact ref ๋‹ต๋ณ€์„ ๋ฐ˜ํ™˜ํ–ˆ๊ณ , local GUI SSE๋„ ๊ฐ™์€ ๊ณ„์•ฝ์„ ์™„์ฃผํ–ˆ๋‹ค. ์—ญ์‚ฌ ์‹œ์  ์ž…๋ ฅ์ด ๋ถ€์กฑํ•œ ๊ธฐ์—… ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ์ˆซ์ž๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  partial๊ณผ ๊ฒฐ์†์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. Cline embedded๋Š” ํ˜„์žฌ ACP๊ฐ€ session MCP๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š์•„ fail-closed๋‹ค. ์ ์ˆ˜๋Š” ์ฃผ๊ฐ„ review ์ „๊นŒ์ง€ ์œ ์ง€ํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์„ค์น˜๋œ agent๊ฐ€ DartLab ์ž‘์—…๋Œ€์—์„œ ๊ฒ€์ฆ ๋ฃจํ”„๋ฅผ ๋ฐ˜๋ณต ์™„์ฃผํ•œ๋‹ค.
ํ„ฐ๋ฏธ๋„ ๊ณต๊ฐœ ํ„ฐ๋ฏธ๋„์ด ์ „ ์ƒ์žฅ์‚ฌ๋ฅผ ์ปค๋ฒ„ํ•˜๊ณ  ์žฌ๋ฌดยท์ฃผ๊ฐ€ยท๊ณต์‹œยท์‹ ์šฉยท์‚ฐ์—…ยท๋งคํฌ๋กœ๋ฅผ ํ•œ ํ™”๋ฉด์— ์˜ฌ๋ฆฐ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ์€ ๋‹จ์ผ ์ง„์ž…์  ๊ณตํ†ต๋ฐฐ์„ ์œผ๋กœ ์ž ๊ฒจ ์žˆ๊ณ  ๊ฐ€๋“œ๊ฐ€ ์ƒ์ฃผํ•œ๋‹ค. ๋กœ์ปฌ ์•ฑ์€ ๊ณต๊ฐœ ๋ฐ”๋‹ฅ์˜ ์ƒ์œ„์ง‘ํ•ฉ์ด๋‹ค. ์Šคํฌ๋ฆฌ๋„ˆ ์žฌ๊ตฌ์ถ•์€ ๊ตฌํ˜„ ์™„๋ฃŒ ํ›„ ๋ˆˆ๊ฒ€์ˆ˜ ๋Œ€๊ธฐ๋‹ค. ํ™”๋ฉด ์•ˆ ๊ทผ๊ฑฐ ํ™•์ธ ์—ฌ์ •์˜ ๋ฐ˜๋ณต ๊ฒ€์ฆ์€ ๋‚จ์•˜๋‹ค. ์ „๋ฌธ๊ฐ€ ๊ณ„๊ธฐํŒ์—์„œ ์งˆ๋ฌธ๊ณผ ๊ทผ๊ฑฐ ํ™•์ธ์ด ํ™”๋ฉด ์•ˆ์—์„œ ๋๋‚œ๋‹ค.
๋…ธํŠธ๋ถยท๋ธŒ๋ผ์šฐ์ € (Pyodide) ์„ค์น˜ ์—†์ด xlwings LiteยทJupyterLiteยทmarimoยทColab WASM์—์„œ Companyยทpanelยทanalysisยทcreditยทstoryยทmacro๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์—‘์…€ ์ˆ˜์‹์œผ๋กœ๋„ ๋‹ฟ๋Š”๋‹ค. scan ํ”„๋ฆฌ๋นŒ๋“œ ์šฉ๋Ÿ‰๊ณผ gather CORS๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ฒฝ๊ณ„๋กœ ๋‚จ๋Š”๋‹ค. Colabยทmarimo ๋…ธํŠธ๋ถ 9์ข…์ด ๊ณ„์•ฝ ๋ฌธ๋ฒ•์œผ๋กœ ์‚ฐ๋‹ค. ๊ต์œก SSOT๋Š” ๋ธ”๋กœ๊ทธ ์—ฐ์žฌ๋‹ค. ์‹ค๋ฐ์ดํ„ฐ ์‹ค์Šต์ด ์„ค์น˜ ์—†์ด ๊ต์œก ์„œ์‚ฌ์™€ ์ด์–ด์ง„๋‹ค.
๋ถ๊ทน์„ฑ ์ธก์ • (productOutcome) ๋กœ์ปฌ ์ƒํƒœ ์›์žฅ, bounded evidence resolve, exact ref hash ๊ฒ€์ฆ์ด ๊ตฌํ˜„๋๋‹ค. ์‹ค์ œ local GUI operator journey์—์„œ 2026Q1 ์‚ผ์„ฑ์ „์ž ๋งค์ถœ ๊ฐ’ ๊ทผ๊ฑฐ๋ฅผ ์—ด์–ด verified=1 ์ „์ด๋ฅผ ํ™•์ธํ–ˆ๋‹ค. ์ด๋Š” ๋กœ์ปฌ ์‹ค์ฆ์ด๋ฉฐ ์ฃผ๊ฐ„ cohort๊ฐ€ ์—†์–ด ์ „์—ญ ๊ฐ’์€ ๊ณ„์† ๋ฏธ์ธก์ •์ด๋‹ค. ์ ์ˆ˜๋Š” ์ฃผ๊ฐ„ review ์ „๊นŒ์ง€ ์œ ์ง€ํ•œ๋‹ค. verified ๋ฃจํ”„๊ฐ€ ์ž๋™ ๊ณ„์ˆ˜๋˜๊ณ  ์ฃผ๊ฐ„ ๋ฆฌ๋ทฐ๊ฐ€ ์ด ํ‘œ๋ฅผ ์žฌํŒ์ •ํ•œ๋‹ค.

๊ฒฐ๊ณผ ์ˆ˜๋ช…์ฃผ๊ธฐ์™€ ์ฃผ๊ฐ„ ์šด์˜ ์ฃผ๊ธฐ์˜ ํ˜„์žฌ ๊ณ„์•ฝ์€ ๋ถ๊ทน์„ฑ skill๊ณผ operation.productCycle์— ์žˆ๋‹ค. ์ ์ˆ˜ ์žฌํŒ์ •์€ ์ฃผ๊ฐ„ outcome review์—์„œ๋งŒ ํ•˜๋ฉฐ, ๊ทผ๊ฑฐ ์—†๋Š” ์ƒํ–ฅ์€ ๋ฌดํšจ๋‹ค. ์‹ค์ธก๊ณผ ๊ฒŒ์ดํŠธ์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ฐจ์› ์ ์ˆ˜๋Š” ์žฌํŒ์ •์—์„œ ์šฐ์„  ํ•˜ํ–ฅ ๋Œ€์ƒ์ด๋‹ค.

2026-08-03 Agent Runtime ์‹ค์งˆ Ask์—์„œ ์‚ผ์„ฑ์ „์ž ์ตœ๊ทผ 5๊ฐœ๋…„ ๋งค์ถœ๊ณผ ์˜์—…์ด์ต์˜ 10๊ฐœ claim cell์„ ๋ชจ๋‘ ๋ฎ๊ณ  ๊ทผ๊ฑฐ commit์„ ํ™•์ธํ–ˆ๋‹ค. ์ด ๋‹จ์ผ ๋กœ์ปฌ ์‹คํ–‰๋งŒ์œผ๋กœ ์ฃผ๊ฐ„ ์ ์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ์ง€๋Š” ์•Š๋Š”๋‹ค. ํ˜„์žฌ ๋™์ž‘๊ณผ ์žฌ๊ฒ€์ฆ ์ ˆ์ฐจ๋Š” Agent Runtime ์šด์˜์— ๊ธฐ๋กํ•œ๋‹ค.

๋ผ์ด์„ ์Šค

์ฝ”๋“œ๋Š” Apache License 2.0, ๋ฐ์ดํ„ฐ์…‹์€ CC BY 4.0 ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉยท์ˆ˜์ •ยทํฌํฌยท์žฌ๋ฐฐํฌยท์ธ์šฉ ๋ชจ๋‘ ์ž์œ ๋กญ๊ฒŒ ํ•˜์„ธ์š”.

ํ•œ ๊ฐ€์ง€๋งŒ ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค. ์ถœ์ฒ˜๋ฅผ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. dartlab ์„ ์“ด ํ”„๋กœ์ ํŠธ์—๋Š” NOTICE ์˜ Built with dartlab (https://github.com/eddmpython/dartlab) ํ•œ ์ค„์„, ๊ธ€์ด๋‚˜ ๋…ผ๋ฌธ์—์„œ ์ธ์šฉํ•œ๋‹ค๋ฉด CITATION.cff ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‹ฌ์•„์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑฐ๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

Releases

Sponsor this project

Packages

Used by

Contributors

Languages