สำหรับผู้ใช้ที่เรียก DeepSeek ตรง (
api.deepseek.com) ไม่ผ่าน gateway/aggregator เขียนจากของที่วัดจริงบนเครื่อง Hermes อีกตัว (แต่ตัดส่วนที่ผูกกับ Cloudflare ออกทั้งหมด)
deepseek ในตัว — ใส่แค่ DEEPSEEK_API_KEYmodel.provider: deepseek · model: deepseek-chat (ตัวหลัก)deepseek-reasoner ใช้เฉพาะงานวิเคราะห์ อย่าตั้งเป็น default (ช้า + แพงกว่า)compression.threshold ~0.4 เพราะคุณภาพตกก่อนเต็มUSER.md + MEMORY.md + transcript ที่ runtime เก็บ + ไฟล์ state-of-record ต่อโปรเจกต์# 1) คีย์
echo 'DEEPSEEK_API_KEY=sk-xxxxxxxx' >> ~/.hermes/.env
# 2) provider + model
hermes config set model.provider deepseek
hermes config set model deepseek-chat
# 3) ตรวจว่ามองเห็นโมเดล
hermes models # หรือในแชท: /model
เลือกโมเดล
| งาน | โมเดล | เหตุผล |
|---|---|---|
| แชท/งานทั่วไป/เขียนโค้ด | deepseek-chat | เร็ว ถูก context 128k |
| วิเคราะห์ยาว/วางแผนซับซ้อน | deepseek-reasoner | คิดเป็นขั้น แต่ช้ากว่า 2–5 เท่า |
| สรุป/จัดรูปแบบ | deepseek-chat | อย่าเปลือง reasoner |
ข้อควรระวังกับ reasoner: มันคืน reasoning_content แยกจาก content — ถ้า max_tokens น้อยจะได้ content ว่าง ตั้ง ≥4000 และ ห้ามให้ระบบ fallback ไปใช้ reasoning_content แทนคำตอบ
fallback provider (ถ้าอยากมีกันล่ม): ตั้ง fallback_providers ให้ชี้ provider อื่นที่มีคีย์ — Hermes รองรับ (fallback-providers.md)
hermes config set compression.threshold 0.4 # compact ที่ ~40% ของ window
hermes config set compression.model deepseek-chat
เหตุผล: 128k คือเพดานที่รับได้ ไม่ใช่จุดที่ยังฉลาด — งานจริงคุณภาพเริ่มตกที่ 40–60% ของ window
ตัวเลขที่ควรจำ: context 300k+ ทำให้ compaction ล้ม (result_tokens=0) และ stream หลุด — เราเคยเจอจริง
DeepSeek context caching: prompt ที่มี prefix ซ้ำจะถูก cache → ถูกกว่า ~10 เท่า ⇒ ออกแบบ system prompt ให้ นิ่ง และวางของที่เปลี่ยนทุกเทิร์น (ผล tool, context ที่ฉีด) ไว้ ท้าย prompt
~/.hermes/memories/USER.md ← ตัวเจ้าของ: preference, วิธีพูด, ข้อห้าม (เพดาน ~3,000 ตัวอักษร)
~/.hermes/memories/MEMORY.md ← convention ของเครื่อง/โปรเจกต์ (เพดาน ~6,000)
$HERMES_HOME/state.db ← transcript ทั้งหมด (runtime เก็บเอง) + FTS5
<repo>/docs/project-history/ ← current-state.md (snapshot ≤80 บรรทัด) + changelog.md (append-only)
กติกา 3 ข้อ
1. USER.md เขียนเป็น ข้อเท็จจริง ไม่ใช่คำสั่ง: ผู้ใช้ชอบรายงานสั้น ≤5 บรรทัด ✅ / ต้องตอบสั้น ❌
2. current-state.md = snapshot (เขียนทับ) · changelog.md = append-only — อย่าสลับกัน
3. เมื่อ USER.md ใกล้เต็ม ให้ แทนที่ บรรทัดที่ล้าสมัย ไม่ใช่เพิ่มต่อ
ค้นย้อนหลัง: ทำ CLI เล็ก ๆ อ่าน state.db แบบ read-only (FTS5) — เร็วกว่าและไม่กิน context ของโมเดล
SELECT session_id, role, content FROM messages_fts f JOIN messages m ON m.id=f.rowid
WHERE messages_fts MATCH ? ORDER BY bm25(messages_fts) LIMIT 20;
hook ของ Hermes รับ JSON ทาง stdin คืน JSON ทาง stdout — pre_llm_call คืน {"context": "..."} = ถูกฉีดเข้า user message
ค่าที่แนะนำ
| hook | ทำอะไร | ค่า |
|---|---|---|
| pre_llm_call | ฉีดความรู้ เฉพาะเทิร์นแรก | timeout 8s · budget ≤1,500 tokens · cache 30 นาที |
| pre_tool_call | บล็อกการแก้ไฟล์นอก allowlist | fail_closed: true |
| post_tool_call | บันทึก event (PROBE) | ไม่บล็อก |
| pre_api_request | คุม rate/concurrency | concurrency 1 |
กฎเหล็ก: hook ต้อง fail-open (exception → คืน {} + log ERROR) เพราะ hook ที่ทำให้เทิร์นพังแย่กว่าไม่มี hook
และห้ามฉีดทุกเทิร์น — วัดแล้วเทิร์นแรก +5.5s, เทิร์นถัดไปต้อง +0s
สัมภาษณ์รอบเดียว 20 นาที แล้วเขียน USER.md 5–10 บรรทัด:
งานประจำ · เครื่องมือที่ใช้ · ภาษาและน้ำเสียง · สิ่งที่ห้ามทำ · เวลาทำงาน/ความเร่งด่วน
วงจรเรียนรู้ 1. ทุกครั้งที่ผู้ใช้แก้คำตอบ → เพิ่ม preference 1 บรรทัด (ไม่เล่าเรื่อง) 2. ทุกครั้งที่ต้องเตือนซ้ำเรื่องเดิม → นั่นคือช่องว่างของ memory ให้เก็บทันที 3. ทบทวนสัปดาห์ละครั้ง: บรรทัดไหนไม่เคยถูกใช้ = ลบทิ้ง
ห้าม: ให้โมเดล "สรุปว่าผู้ใช้เป็นคนแบบไหน" แล้วเก็บเป็นความจริง — ให้เก็บจากคำพูดจริงของผู้ใช้เท่านั้น
เจ้าของ → Lead (Hermes) เขียน brief + gate
→ coder (agent อีกตัว/subprocess) เขียนโค้ดเท่านั้น
→ Lead รันเทสต์เอง (ไม่เชื่อรายงาน)
→ reviewer แยก เห็นเฉพาะ diff + ผลเทสต์ + brief
→ ปิดงาน: changelog + commit
บังคับที่ระดับเครื่องมือ ไม่ใช่ที่วินัย: hook pre_tool_call ที่บล็อก Lead ไม่ให้เขียนไฟล์ source (fail_closed)
บทเรียนจริง: gate ที่ใช้ fixture ประดิษฐ์จะ "เขียวหลอก" — ต้องทดสอบด้วยข้อมูลจริง + holdout ที่คนเขียนไม่เห็นล่วงหน้า
deepseek-chat ถูกมากอยู่แล้ว — ตัวคูณจริงคือ จำนวน token ที่ฉีดทุกเทิร์น ไม่ใช่ราคาต่อ token| อาการ | สาเหตุ | แก้ |
|---|---|---|
| ตอบว่าง | reasoner + max_tokens เล็ก |
ตั้ง ≥4000, ห้ามใช้ reasoning_content แทน content |
| ช้าผิดปกติ | ใช้ reasoner เป็น default | เปลี่ยน default เป็น deepseek-chat, เรียก reasoner เฉพาะงาน |
| ตอบช้าแล้วหลุดกลางทาง | context ใหญ่ + compaction ล้ม | ลด compression.threshold, ตรวจ log ว่า compaction สำเร็จ |
| 429 | ยิงพร้อมกันหลาย request | concurrency 1 + breaker |
| "จำไม่ได้" | ความรู้อยู่แต่ไม่ถูกค้น | ทำ recall CLI + ฉีดเทิร์นแรก + เขียน current-state.md |
| script รายงานสำเร็จแต่ไม่มีอะไรเกิดขึ้น | silent failure | บังคับ exit ≠ 0 + log ERROR + watchdog |
DEEPSEEK_API_KEY ใน ~/.hermes/.env · model.provider=deepseek · model=deepseek-chatcompression.threshold=0.4 · compression.model=deepseek-chatUSER.md 5–10 บรรทัดจากบทสัมภาษณ์docs/project-history/current-state.md ของโปรเจกต์แรกstate.dbวัดผลสัปดาห์แรก: context tokens/เทิร์น · session ใหม่ตอบเรื่องเดิมได้กี่ข้อจาก 5 · latency เทิร์นแรก · จำนวนครั้งที่ต้องอธิบายซ้ำ
USER.md + project-historyหลักคิด: ยิ่งทำงานนาน ต้องยิ่งมีความรู้ ไม่ใช่ยิ่งมี context บวม