תיעוד/מתקדם
חיבור סוכן Hermes
הריצו את רכיב השיחות שלנו עם סוכן Hermes שרץ אצלכם בתור המוח. בסוף התהליך המספר שלכם עונה עם סוכן קולי בזמן אמת, שמדבר בפרסונה של ה-Hermes שלכם, זוכר את כל השיחה, ומקליט ומדווח על שיחות כמו כל סוכן אחר.
איך החלקים מתחברים
Caller -> phone network -> voice gateway -> session shim -> Hermes API server
(on your host) 127.0.0.1:8788 127.0.0.1:8642
רכיב השיחות מדבר עם המוח שלו דרך OpenAI Responses API (POST /v1/responses), ושרת ה-API של Hermes מדבר באותו API בדיוק. נשאר רק הבדל אחד לגשר עליו: הזיכרון. רכיב השיחות מחבר את כל התגובות של שיחה אחת בכך שהוא שולח בכל בקשה את אותה כותרת x-openclaw-session-key. Hermes מתעלם מכותרות שהוא לא מכיר, ומשרשר שיחה דרך השדה conversation בגוף הבקשה.
רכיב תיווך (shim) קטן מעתיק את הכותרת לשדה הזה ומעביר את כל השאר בלי שינוי. כך הסוכן זוכר את כל השיחה, מתחילתה ועד סופה. תוכנית ההתקנה כותבת את רכיב התיווך ומריצה אותו כשירות. כל השאר הוא הגדרות.
לפני שמתחילים
- סוכן קולי בדשבורד, כדי להפיק טוקן התקנה.
- שרת Linux עם systemd שכבר מריץ את סוכן ה-Hermes שלכם, ושאפשר להריץ עליו את תוכנית ההתקנה כ-root או עם sudo בלי סיסמה. תוכנית ההתקנה יוצרת משתמש שירות ייעודי לרכיב השיחות.
- Node.js ב-
PATHשל השרת, בשביל רכיב התיווך.
פרופיל Hermes נתמך ב-Linux בלבד. ב-macOS תוכנית ההתקנה תומכת ב-OpenClaw.
שלב 1: מפעילים את שרת ה-API של Hermes
הוסיפו את השורות האלה לקובץ הסביבה של Hermes, למשל ~/.hermes/.env, ואז הפעילו מחדש את Hermes:
API_SERVER_ENABLED=true
API_SERVER_KEY=<a-long-secret>
# the defaults are what the gateway expects:
# API_SERVER_HOST=127.0.0.1
# API_SERVER_PORT=8642
בדקו שהוא עלה:
curl -s http://127.0.0.1:8642/v1/health
# the response includes "status":"ok"
API_SERVER_KEY מתוך /docker/*/.env, ~/.hermes/.env או /root/.hermes/.env, ושומרת את הראשון ששרת ה-API בפורט 8642 מקבל. מפתח שמוגדר במקום אחר לא יימצא.שלב 2: מתקינים את רכיב השיחות
בהגדרות הסוכן, תחת Settings (הגדרות) ואז Installation (התקנה), הפיקו טוקן התקנה. הוא תקף לשימוש אחד ופג אחרי 15 דקות. אחר כך, על שרת ה-Hermes:
curl -sSL https://api.talktomyagent.io/install.sh \
| bash -s -- --token <YOUR_TOKEN> --agent-profile hermes --accept-license
תוכנית ההתקנה מזהה בעצמה Hermes שרץ על השרת, ו---agent-profile hermes הופך את הבחירה למפורשת. אחר כך היא:
- מוצאת את ה-
API_SERVER_KEYשעובד ומעבירה אותו לרכיב השיחות כטוקן ה-backend שלו, ומכוונת אותו לרכיב התיווך בכתובת127.0.0.1:8788, לא ישירות ל-Hermes. - יוצרת משתמש שירות נעול שאינו root,
ttma-voice, שתיקיית הבית שלו היא/opt/ttma-voice. רכיב השיחות מותקן ב-/opt/ttma-voice/ninja-talk/, וסביבת העבודה שלו היא/opt/ttma-voice/workspace/. - כותבת את רכיב התיווך ומפעילה אותו כשירות
ttma-hermes-shim, שמאזין רק ב-127.0.0.1. - מעתיקה את הפרסונה שלכם מ-Hermes לסביבת העבודה הקולית:
SOUL.md, וגםUSER.mdו-MEMORY.mdמתוך התיקייהmemoriesשל Hermes. טיימר מעתיק אותם שוב כל 15 דקות, כך ששינויים ב-Hermes מגיעים לסוכן הקולי בלי שתצטרכו לעשות דבר. - לוקחת את אזור הזמן של הסוכן הקולי מההגדרה
timezoneבקובץconfig.yamlשל Hermes, אם הוגדרה. - יוצרת פלייבוק קולי ראשוני ומחילה את פרופיל התכונות של Hermes (פירוט בהמשך).
שימו לב לסימני ה-V. אזהרה ש-Node.js לא נמצא אומרת שהשירות של רכיב התיווך לא יכול לעלות. התקינו Node.js, ואז הריצו sudo systemctl restart ttma-hermes-shim.service.
פרופיל התכונות של Hermes
חלק מהתכונות של רכיב השיחות תלויות ב-OpenClaw, ולכן תוכנית ההתקנה קובעת את הערכים האלה ב-/opt/ttma-voice/ninja-talk/config.json, וקובעת אותם מחדש בכל התקנה חוזרת:
"features": { "kbSearch": false, "crmCapture": false, "openclawStream": false },
"context": { "files": ["SOUL.md", "USER.md", "MEMORY.md"] }
| הגדרה | למה |
|---|---|
kbSearch: false | החיפוש המובנה במאגר הידע קורא את מסד הנתונים המקומי של OpenClaw, שאין בשרת Hermes. במקום זה הסוכן נשען על Hermes בכל מה שקשור לידע. |
crmCapture: false | זיכרון המתקשרים משתמש בכלים של סביבת העבודה של OpenClaw, שלא קיימים בשרת Hermes. |
openclawStream: false | רכיב התיווך מעביר תשובות רגילות, ולא ממיר תשובה שמגיעה בסטרימינג. |
context.files | קובצי הפרסונה שהועתקו מ-Hermes. ל-Hermes אין IDENTITY.md. |
openclawQuery נשאר פעיל. למרות השם, זה הכלי "לשאול את המוח" שקורא ל-/v1/responses, ודרכו Hermes עונה. העברת משימות ארוכות לערוץ צ'אט פונה ל-endpoint שקיים רק ב-OpenClaw, ולכן היא נשארת כבויה.
שלב 3: בודקים
קודם בדקו את הנתיב ל-Hermes, בלי להוציא שיחה. הבקשה הזו עוברת דרך רכיב התיווך, וצריכה להחזיר JSON עם מערך output שמכיל "type":"output_text":
curl -s http://127.0.0.1:8788/v1/responses \
-H "Authorization: Bearer <your API_SERVER_KEY>" \
-H "Content-Type: application/json" \
-H "x-openclaw-session-key: test-123" \
-d '{"model":"openclaw","input":"Say hello in five words."}'
אחר כך בחרו קול ומספר בדשבורד, והתקשרו. עשו בדיקת זיכרון: בשיחה מהמספר שלכם, ספרו לסוכן פרט כלשהו ("קוראים לי דנה"), וכמה תגובות אחר כך שאלו "איך קוראים לי?". תשובה נכונה אומרת שרכיב התיווך משרשר את השיחה. עקבו אחרי הלוגים בזמן הבדיקה:
ninja-talk logs -f
sudo journalctl -u ttma-hermes-shim.service -n 30
מתי הסוכן פונה ל-Hermes
הסוכן הקולי מדבר בעצמו, על סמך קובצי הפרסונה והפלייבוק, ופונה ל-Hermes דרך openclaw_query כשבקשה דורשת את המוח. באילו שיחות זה אפשרי נקבע לפי מצב השיחה:
- שיחות של בעל העסק (מצב פרטי, מהמספר שלכם) ושיחות שהסוכן מוציא יכולות לבקש מ-Hermes כל דבר שהוא יודע לעשות, כולל הסקילים (skills) שלו.
- שיחות ציבוריות אף פעם לא מגיעות ל-Hermes. מתקשרים מהציבור מקבלים תשובות מתוך הפרסונה, הפלייבוק וכל כלי מותאם שתוסיפו. כתבו קטע
## Public Modeאמיתי בקובץ/opt/ttma-voice/workspace/protocols/dojo-voice-agent-playbook.mdלפני שאתם מפרסמים את המספר.
רכיב התיווך משתמש במפתח השיחה (session key) של רכיב השיחות כמזהה השיחה ב-Hermes. שיחות של בעל העסק ושיחות שהסוכן מוציא משתמשות כולן במפתח של בעל העסק.
פרסונה וקבצים
- ערכו את הפרסונה ב-Hermes (
SOUL.mdוקובצי הזיכרון שלו). הטיימר מעתיק אותם לסביבת העבודה הקולית כל 15 דקות ודורס את מה שיש שם, ולכן שינוי שנעשה ישירות ב-/opt/ttma-voice/workspace/יימחק. - הפלייבוק,
voice-tools.jsonוהמקורות שנטענים תמיד נמצאים בסביבת העבודה הקולית,/opt/ttma-voice/workspace/, ושם אתם עורכים אותם. ראו פלייבוקים וכלים מותאמים. - קובצי התמלול נכתבים ל-
/opt/ttma-voice/ninja-talk/transcripts/. ראו תמלולי שיחות.
מה עובד
| יכולת | עם Hermes |
|---|---|
| שיחה בזמן אמת עם זיכרון לאורך כל השיחה | עובד, דרך רכיב התיווך |
פרסונה מתוך SOUL.md וקובצי הזיכרון | עובד, מסונכרן מ-Hermes |
| Hermes עונה, עם הסקילים שלו | בשיחות של בעל העסק ובשיחות שהסוכן מוציא |
| הקלטה, תמלולים דרך API ו-webhook, שיחות יוצאות דרך ה-Voice API | עובד, כמו בכל סוכן |
| פלייבוק, מקורות שנטענים תמיד, כלי HTTPS מותאמים | עובד |
| חיפוש מובנה במאגר הידע, זיכרון מתקשרים | כבוי: OpenClaw בלבד. בנו את המקבילה כסקילים של Hermes. |
| העברת משימות ארוכות, כלים ישירים של OpenClaw | OpenClaw בלבד |
פתרון תקלות
| תסמין | מה לבדוק |
|---|---|
| הסוכן שוכח דברים באמצע השיחה | רכיב התיווך לא רץ, או שרכיב השיחות לא מכוון אליו. בדקו את systemctl status ttma-hermes-shim.service, והריצו את ה-curl משלב 3 פעמיים עם אותו x-openclaw-session-key, כדי לוודא שהתשובה השנייה זוכרת את הראשונה. |
| הסוכן אומר שלא הצליח להגיע ל-backend | Hermes או רכיב התיווך לא פועלים, או שהמפתח שגוי. בדקו את /v1/health בפורט 8642, ואז את ה-curl משלב 3 בפורט 8788. הלוג של רכיב השיחות מציין את הסטטוס ש-Hermes החזיר. |
הלוג מראה 401 מה-backend | הטוקן של רכיב השיחות כבר לא תואם ל-API_SERVER_KEY של Hermes, למשל אחרי שהחלפתם את המפתח. הריצו שוב את תוכנית ההתקנה עם טוקן התקנה חדש, כדי שתקלוט את המפתח החדש. |
| פרסונה כללית או שגויה | SOUL.md חסר ב-/opt/ttma-voice/workspace/. בדקו שהוא קיים ב-Hermes, ושה-ttma-persona-sync.timer פעיל. |
| תוכנית ההתקנה מודיעה שלא נמצא מפתח שעובד | שרת ה-API של Hermes לא מופעל, לא רץ בפורט 8642, או שהמפתח שלו לא נמצא באחד מקובצי ה-.env שמופיעים בשלב 1. |
כדי להסיר הכול, הריצו את תוכנית ההתקנה במצב הסרה (uninstall). היא מסירה גם את רכיב התיווך, את טיימר הפרסונה ואת משתמש השירות שיצרה. רוצים עזרה בהגדרה? ספרו לנו מה אתם מריצים.