๐ง ํ๊ตญ์ด Context DB for AI Agents โ ํ ํฐ 91% ์ ๊ฐ. ์๋ฒ ๋ฉ ์๋ฏธ ๊ฒ์, ์ค๋ณต ์๋ ๋ณํฉ, ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธตํ(Hot/Warm/Cold), ์๋ ์์นด์ด๋ธ, WAL ํ๋กํ ์ฝ, ์ํฐํฐ ์ถ์ถ. Korean-first + English support.
---
name: token-saver
description: "๐ง ํ๊ตญ์ด Context DB for AI Agents โ ํ ํฐ 91% ์ ๊ฐ. ์๋ฒ ๋ฉ ์๋ฏธ ๊ฒ์, ์ค๋ณต ์๋ ๋ณํฉ, ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธตํ(Hot/Warm/Cold), ์๋ ์์นด์ด๋ธ, WAL ํ๋กํ ์ฝ, ์ํฐํฐ ์ถ์ถ. Korean-first + English support."
metadata:
openclaw:
requires:
bins: []
env:
- FIREWORKS_API_KEY
install:
- id: pip-konlpy
kind: pip
package: konlpy
label: "ํ๊ตญ์ด ํํ์ ๋ถ์๊ธฐ (konlpy)"
- id: pip-nltk
kind: pip
package: nltk
label: "์์ด NLP (nltk)"
compatibility: "OpenClaw 2.0+, Python 3.10+"
---
# ๐ง TokenSaver Korean v2.0
**AI ์์ด์ ํธ๋ฅผ ์ํ ํ๊ตญ์ด ์ต์ ํ Context Database**
ํ ํฐ ์๋ชจ๋ฅผ ์ต๋ **91% ์ ๊ฐ**ํ๋ ์ค๋งํธ ๋ฉ๋ชจ๋ฆฌ ์์คํ
.
์ ์ฅยท๊ฒ์ยท์์ถยท๊ณ์ธตํยท์์นด์ด๋ธ๊น์ง ์์ ์๋ํ.
---
## โจ ํต์ฌ ๊ธฐ๋ฅ
| ๊ธฐ๋ฅ | ํ ์ค ์ค๋ช
|
|------|-----------|
| ๐ **์๋ฒ ๋ฉ ์๋ฏธ ๊ฒ์** | ํค์๋๊ฐ ์๋๋ผ **์๋ฏธ**๋ก ์ฐพ์ต๋๋ค |
| ๐ **์ค๋ณต ์๋ ๋ณํฉ** | ๋น์ทํ ๋ฉ๋ชจ๋ฆฌ ์์์ ํฉ์ณ์ค๋๋ค |
| ๐ **๋ฉ๋ชจ๋ฆฌ ๊ณ์ธตํ** | Hot โ Warm โ Cold ์๋ ๊ด๋ฆฌ |
| ๐๏ธ **์๋ ์์นด์ด๋ธ** | 30์ผ ๋ฌต์ ๋ฉ๋ชจ๋ฆฌ ์๋ ์ ๋ฆฌ |
| ๐ **WAL ํ๋กํ ์ฝ** | ์ ์ฅ ๋จผ์ , ์๋ต ๋์ค โ ์ ์ค ์ ๋ก |
| ๐ท๏ธ **์ํฐํฐ ์ถ์ถ** | ์ฌ๋ยท๋ธ๋๋ยท์ ํ ์๋ ํ๊น
|
| ๐ **๋ค๊ตญ์ด ์ง์** | ํ๊ตญ์ด(konlpy) + ์์ด(nltk) |
---
## ๐ ๋น ๋ฅธ ์์
### 1. ํ๊ฒฝ๋ณ์ ์ค์
```bash
# Fireworks API ํค (์๋ฒ ๋ฉ ๊ฒ์์ฉ)
export FIREWORKS_API_KEY="your-key"
# Windows PowerShell
$env:FIREWORKS_API_KEY="your-key"
```
### 2. Python์์ ์ฌ์ฉ
```python
from token_saver.client import TokenSaverKorean
# ์ด๊ธฐํ (์๋์ผ๋ก workspace ํ์ง)
client = TokenSaverKorean()
# ์ ์ฅ โ ์๋ฒ ๋ฉ ์๋ ์์ฑ + ์ค๋ณต ์ ์๋ ๋ณํฉ
client.save_memory(
uri="biz/daily_sales",
content="์ค๋ ๋งค์ถ 500๋ง์, ROAS 5.83",
category="biz"
)
# ๊ฒ์ โ ํค์๋ + ์๋ฒ ๋ฉ ํ์ด๋ธ๋ฆฌ๋
results = client.find("๋งค์ถ ํํฉ", use_embedding=True)
# ํฐ์ด ํต๊ณ
stats = client.get_tier_stats()
# โ {'hot': 14, 'warm': 0, 'cold': 0, 'archive': 0}
# ๋ง๋ฃ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ
client.cleanup_expired(days=30)
```
### 3. OpenClaw์์ ์ฌ์ฉ
```
๋ง์คํฐ: "๋ฅํฐ๋ ์ด๋ ROAS ๊ธฐ์ตํด"
โ ๋ณด๋ผ: memory_store(uri="memories/drlady/roas", content="ROAS 5.83...")
๋ง์คํฐ: "์ ๋ฒ์ ๋ง์ผํ
์ ๋ต ๋ญ์์ง?"
โ ๋ณด๋ผ: memory_recall(query="๋ง์ผํ
์ ๋ต")
```
---
## ๐ ํ ํฐ ์ ๊ฐ ํจ๊ณผ
| ์๋๋ฆฌ์ค | ๊ธฐ์กด ํ ํฐ | TokenSaver | ์ ๊ฐ์จ |
|----------|-----------|------------|--------|
| ์ ์ฒด Context ๋ก๋ | 50,000 | 4,500 | **91%** |
| ํ๊ตญ์ด ๊ฒ์ | 20,000 | 2,000 | **90%** |
| ๋ฉ๋ชจ๋ฆฌ ์์ถ | 30,000 | 3,500 | **88%** |
---
## ๐๏ธ ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธตํ
์๋์ผ๋ก ์ค์๋์ ๋ฐ๋ผ ํฐ์ด๋ฅผ ๊ด๋ฆฌํฉ๋๋ค:
| ํฐ์ด | ๊ธฐ๊ฐ | ์ ์ฅ ๋ฐฉ์ |
|------|------|-----------|
| ๐ฅ **Hot** | 7์ผ ๋ด | ์ ์ฒด ๋ด์ฉ + ์๋ฒ ๋ฉ |
| ๐ก๏ธ **Warm** | 30์ผ ๋ด | ์์ฝ + ์๋ฒ ๋ฉ |
| โ๏ธ **Cold** | 30์ผ+ | ํค์๋๋ง (์์ถ) |
| ๐๏ธ **Archive** | 30์ผ ๋ฏธ์ ์ | ๊ฒ์์์ ์ ์ธ |
```python
# ์๋ ์น๊ฒฉ/๊ฐ๋ฑ โ ์ ๊ทผํ ์๋ก Hot์ผ๋ก ์ฌ๋ผ๊ฐ
client.save_memory("test", "๋ด์ฉ") # โ Hot
# 30์ผ ํ ์๋ โ Cold
# ๋ค์ ๊ฒ์ํ๋ฉด โ Warm โ Hot
```
---
## ๐ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์
ํค์๋ ๋งค์นญ + ์๋ฒ ๋ฉ ์ ์ฌ๋๋ฅผ ๊ฒฐํฉํ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์:
```python
results = client.find(
query="๊ด๊ณ ํจ์จ ๊ฐ์ ",
limit=5,
use_embedding=True # ์๋ฒ ๋ฉ ๊ฒ์ ON
)
# ๊ฒฐ๊ณผ: ํค์๋ ์ ์ + ์๋ฒ ๋ฉ ์ ์ = ์ต์ข
์์
# "ROAS ์ต์ ํ ๋ฐฉ๋ฒ" (12.45์ )
# "๊ด๊ณ ์์ฌ ์ฑ๊ณผ ๋ถ์" (9.91์ )
```
API ์คํจ ์ ์๋์ผ๋ก ํค์๋ ๊ฒ์์ผ๋ก ํด๋ฐฑ โ **์ ๋ ์ ๋๊น**.
---
## ๐ ์ค๋ณต ์๋ ๋ณํฉ
๋น์ทํ ๋ด์ฉ์ด๋ฉด ์๋ก ๋ง๋ค์ง ์๊ณ ๊ธฐ์กด ๊ฒ์ ์
๋ฐ์ดํธ:
```python
# ์ฒซ ์ ์ฅ
client.save_memory("biz/roas", "ROAS 5.83", category="biz")
# ๋น์ทํ ๋ด์ฉ ์ฌ์ ์ฅ โ ์๋ ๋ณํฉ (์ฝ์ฌ์ธ > 0.85)
client.save_memory("biz/roas", "ROAS 6.12๋ก ์์น", category="biz")
# โ ๊ฐ์ URI์ ๋ฒ์ ์
๊ทธ๋ ์ด๋ (v1 โ v2)
```
---
## ๐ท๏ธ ์๋ ์ํฐํฐ ์ถ์ถ
์ ์ฅ ์ ์ฌ๋ยท๋ธ๋๋ยท์ ํ์ ์๋์ผ๋ก ์ธ์:
```python
entities = client.extract_entities("๊น๋ช
์ง ๋ํ๊ฐ ๋ฅํฐ๋ ์ด๋ ๋ฆฌ์ฅฌ-ํก์ค ์ถ์")
# โ {'persons': ['๊น๋ช
์ง'], 'brands': ['๋ฅํฐ๋ ์ด๋'], 'products': ['๋ฆฌ์ฅฌ-ํก์ค']}
```
---
## โ๏ธ ์ค์ ํ์ผ (ovk.conf)
```json
{
"embedding": {
"dense": {
"provider": "fireworks",
"model": "qwen3-embedding-8b",
"dimension": 768
}
},
"language": "auto",
"token_optimization": {
"enabled": true,
"target_reduction": 0.91
}
}
```
---
## ๐ก๏ธ ์์ ์ฑ
| ๊ธฐ๋ฅ | ์ค๋ช
|
|------|------|
| **WAL ํ๋กํ ์ฝ** | ์๋ต ์ ์ ๋จผ์ ์ ์ฅ โ ํฌ๋์ํด๋ ์ ์ค ์์ |
| **์๋ ๋ฐฑ์
** | ์์ ์ ์๋ณธ ๋ฐฑ์
๋ณด๊ด |
| **์๋ฒ ๋ฉ ํด๋ฐฑ** | API ์ฅ์ ์ ํค์๋ ๊ฒ์์ผ๋ก ์๋ ์ ํ |
| **ํ์ํธํ** | v1 ๋ฐ์ดํฐ ๊ทธ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ |
---
## ๐ฆ ์์กด์ฑ
| ํจํค์ง | ์ฉ๋ | ํ์? |
|--------|------|-------|
| **konlpy** | ํ๊ตญ์ด ํํ์ ๋ถ์ | ๊ถ์ฅ |
| **nltk** | ์์ด NLP | ๊ถ์ฅ |
| **FIREWORKS_API_KEY** | ์๋ฒ ๋ฉ ๊ฒ์ | ์๋ฒ ๋ฉ ์ฌ์ฉ ์ |
> konlpy/nltk ์์ด๋ ์๋ํฉ๋๋ค (๊ธฐ๋ณธ ํ ํฌ๋์ด์ ์ฌ์ฉ).
---
## ๐ ๋ผ์ด์ ์ค
MIT License โ ์์ ๋กญ๊ฒ ์ฌ์ฉ, ์์ , ๋ฐฐํฌ ๊ฐ๋ฅ.
---
*TokenSaver Korean v2.0*
*์๋ฒ ๋ฉ ๊ฒ์ ยท ์ค๋ณต ๋ณํฉ ยท ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธตํ ยท ์๋ ์์นด์ด๋ธ*
*ํ๊ตญ์ด ์ฐ์ , ์์ด ์ง์, OpenClaw ์ต์ ํ*
don't have the plugin yet? install it then click "run inline in claude" again.