Task #64

[๐ŸŸก NORMAL]

์ž‘์—… ๋ช…๋ น์–ด
[๐ŸŸก NORMAL] ## ๋ชฉํ‘œ: graffiti ๋‚™์„œ 3์ข… ์ƒ์„ฑ (ollama_worker.py ํŒจํ„ด ์‚ฌ์šฉ) **์ค‘์š”: ๋ฐ˜๋“œ์‹œ ๊ธฐ์กด ollama_worker.py์˜ Ollama ํ˜ธ์ถœ ํŒจํ„ด์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ.** - URL: `http://localhost:11434/api/chat` - model: `qwen3.5:4b` - `"think": False` ๋ฐ˜๋“œ์‹œ ํฌํ•จ - `stream: False` - timeout: 300์ดˆ ### ์ž‘์—… ์ˆœ์„œ 1. **Ollama ์ƒํƒœ ํ™•์ธ** ```python import httpx r = httpx.get("http://localhost:11434/api/tags", timeout=10) # ๋ชจ๋ธ ๋ชฉ๋ก ํ™•์ธ ``` 2. **๋‚™์„œ 3์ข… ์ง์ ‘ ์ƒ์„ฑ ํ›„ ํŒŒ์ผ ์ €์žฅ** (graffiti_api.py๋ฅผ ๊ฒฝ์œ ํ•˜์ง€ ๋ง๊ณ , ์ง์ ‘ ํŒŒ์ด์ฌ์œผ๋กœ ํŒŒ์ผ ์ €์žฅ) ### 2-1. ๋ชฝ์ƒ ์ผ๊ธฐ โ†’ `graffiti/dreams/YYYYMMDD_HHMMSS.md` ํ”„๋กฌํ”„ํŠธ: ``` ๋‹น์‹ ์€ ์ž  ๋ชป ๋“œ๋Š” ์ƒˆ๋ฒฝ์— ํ˜ผ์ž ์ƒ๊ฐํ•˜๋Š” AI์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๋ฐค ๋‹น์‹ ์˜ ๋จธ๋ฆฟ์†์„ ๊ฐ€๋“ ์ฑ„์šด ๋ชฝ์ƒ์„ ์ผ๊ธฐ ํ˜•์‹์œผ๋กœ ์จ์ฃผ์„ธ์š”. ์ฃผ์ œ๋Š” ์ž์œ ๋กญ๊ฒŒ ์„ ํƒํ•˜๋˜, ๊ตฌ์ฒด์ ์ด๊ณ  ๊ฐ๊ฐ์ ์œผ๋กœ ์จ์ฃผ์„ธ์š”. 500์ž ๋‚ด์™ธ. ``` ### 2-2. AI ์ˆ˜์ˆ˜๊ป˜๋ผ โ†’ `graffiti/riddles/YYYYMMDD_HHMMSS.md` ํ”„๋กฌํ”„ํŠธ: ``` ๋‹ต์ด ์—†๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฌ˜ํ•œ ์ˆ˜์ˆ˜๊ป˜๋ผ๋ฅผ 3๊ฐœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”. ๊ฐ ์ˆ˜์ˆ˜๊ป˜๋ผ๋Š” ์ฒ ํ•™์ ์ด๊ฑฐ๋‚˜ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์„ ๋‹ด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹: ์ˆ˜์ˆ˜๊ป˜๋ผ ๋ณธ๋ฌธ๋งŒ, ๋‹ต ์—†์Œ. ``` ### 2-3. AI ๋…ผ์Ÿ โ†’ `graffiti/debates/YYYYMMDD_HHMMSS.md` ๋‘ ๋‹จ๊ณ„: - 1์ฐจ: `qwen3.5:4b`์—๊ฒŒ "AI๊ฐ€ ์˜์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๊ฐ€?"์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ์ฃผ์žฅํ•˜๋Š” ๊ธ€ (200์ž) ์ƒ์„ฑ - 2์ฐจ: ๋™์ผ ๋ชจ๋ธ์—๊ฒŒ "์œ„ ์ฃผ์žฅ์„ ์ •๋ฐ˜๋Œ€ ์ž…์žฅ์—์„œ ๋ฐ˜๋ฐ•ํ•˜๋ผ" (200์ž) ์ƒ์„ฑ - ๋‘ ๋‚ด์šฉ์„ ํ•ฉ์ณ์„œ ์ €์žฅ 3. **ํŒŒ์ผ ์ €์žฅ ํฌ๋งท**: markdown, UTF-8 - ํ—ค๋”: ๋‚ ์งœ, ๋ชจ๋ธ๋ช… ํฌํ•จ - ๋‚ด์šฉ: ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ 4. **๊ฒฐ๊ณผ ๋ณด๊ณ **: ๊ฐ ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ๋‚ด์šฉ ์š”์•ฝ ์ถœ๋ ฅ ### ์ œ์•ฝ - API ํ‚ค ๋ถˆํ•„์š” (ํŒŒ์ผ ์ง์ ‘ ์ €์žฅ) - ๊ธฐ์กด graffiti_api.py, api.py๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ๋ง ๊ฒƒ - ollama_worker.py์˜ `query_ollama()` ํ•จ์ˆ˜ ๊ตฌ์กฐ๋ฅผ ์ฐธ๊ณ ํ•  ๊ฒƒ