מדריך API
סקירה כללית
העמוד הזה מתעד את החוזה הנוכחי של Nibomo עבור סוכני AI חיצוניים.
אם הלקוח שלך תומך ב-MCP, מחבר ה-MCP הוא הדרך הפשוטה ביותר להתחבר, והוא עוטף את אותו ממשק נתונים. העמוד הזה מתעד את חוזה הגילוי ב-HTTP, ה-SQL, המדריכים והחזרות שסוכני CLI משתמשים בו.
התחל מנקודת הכניסה הקנונית לגילוי:
GET https://api.nibomo.com/v1/
אותה תגובת גילוי זמינה גם בכתובת GET /v1/agent, אבל /v1/ היא נקודת הכניסה הציבורית העיקרית.
תגובת הגילוי מסבירה לסוכן איך:
- להתחיל התחברות עם קוד חד-פעמי באימייל
- להמיר את הקוד החד-פעמי במפתח API ארוך טווח
- לטעון את הקשר החשבון
- ליצור סביבת עבודה או לבחור אחת
- להמשיך דרך ממשק ה-SQL המפורסם
- לשלוף מדריכי עיון ולחזור על כרטיסים אחד אחרי השני
גילוי בזמן ריצה וקוד מקור
OpenAPI אינו זמין. ארבע הכתובות לשעבר של המפרט, שמופיעות למטה, מחזירות עכשיו במקום סכמה את אותה הודעת גילוי ב-JSON עם "openapiAvailable": false:
https://api.nibomo.com/v1/agent/openapi.jsonhttps://api.nibomo.com/v1/agent/swagger.jsonhttps://api.nibomo.com/v1/openapi.jsonhttps://api.nibomo.com/v1/swagger.json
השתמש ב-GET https://api.nibomo.com/v1/ לגילוי העדכני בזמן ריצה. עקוב אחרי docs.discoveryUrl שמוחזר כדי למצוא את נתיבי זמן הריצה, ואחרי docs.source.agentRoutesUrl כדי לראות את פרטי המימוש.
הקמת האימות
ההקמה עם קוד חד-פעמי רצה בשירות האימות:
POST https://auth.nibomo.com/api/agent/send-codePOST https://auth.nibomo.com/api/agent/verify-code
התהליך:
- קרא ל-
GET /v1/. - שלח את האימייל של המשתמש ל-
send-code. - קרא את
otpSessionTokenמהתגובה. - בקש מהמשתמש את הקוד האחרון בן 8 הספרות שקיבל באימייל.
- קרא ל-
verify-codeעםcode,otpSessionTokenו-label. - שמור את מפתח ה-API שמוחזר מחוץ לזיכרון הצ׳אט.
משתנה סביבה מומלץ:
export FLASHCARDS_OPEN_SOURCE_API_KEY="fca_ABCDEFGH_0123456789ABCDEFGHJKMNPQRS"
בקשות מאומתות משתמשות בכותרת:
Authorization: ApiKey <key>
דוגמה לרצף ההקמה:
curl https://api.nibomo.com/v1/
curl -X POST https://auth.nibomo.com/api/agent/send-code \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com"}'
curl -X POST https://auth.nibomo.com/api/agent/verify-code \
-H "Content-Type: application/json" \
-d '{
"code":"12345678",
"otpSessionToken":"...",
"label":"Codex on MacBook"
}'
ממשק הסוכן אחרי ההתחברות
אחרי האימות, ממשק הסוכן הנוכחי כולל:
GET /v1/agent/meGET /v1/agent/workspacesPOST /v1/agent/workspacesPOST /v1/agent/workspaces/{workspaceId}/selectPOST /v1/agent/sql/query(קריאה בלבד)POST /v1/agent/sql/execute(כתיבה)GET /v1/agent/guide/{topic}(קריאה בלבד)POST /v1/agent/reviews/next(קריאה בלבד)POST /v1/agent/reviews/reveal(קריאה בלבד)POST /v1/agent/reviews/submit(כתיבה)
הקמה טיפוסית נראית כך:
GET /v1/agent/meGET /v1/agent/workspaces?limit=100- אם צריך,
POST /v1/agent/workspacesעם{"name":"Personal"} - אם צריך,
POST /v1/agent/workspaces/{workspaceId}/select - השתמש ב-
POST /v1/agent/sql/queryלקריאה וב-POST /v1/agent/sql/executeלכתיבה
בחירת סביבת העבודה מתבצעת במפורש לכל חיבור של מפתח API. במקום לנחש את הצעד הבא, סוכנים צריכים לפעול לפי הטקסט שמוחזר ב-instructions, לפי docs.discoveryUrl לנתיבי זמן הריצה ולפי docs.source.agentRoutesUrl לפרטי המימוש.
נתיבי ה-SQL והחזרות מקבלים גם workspaceId אופציונלי בגוף ה-JSON. הוא מפנה בקשה אחת לסביבת העבודה הזו בלי לשנות את הבחירה; השמט אותו כדי להשתמש בסביבת העבודה שנבחרה. אם אין בחירה וגם אין workspaceId, הנתיבים עונים 409 WORKSPACE_SELECTION_REQUIRED.
ממשק ה-SQL
POST /v1/agent/sql/query הוא ממשק לקריאה בלבד באופן מוחלט (SHOW TABLES, DESCRIBE, SHOW COLUMNS, SELECT), ו-POST /v1/agent/sql/execute הוא ממשק הכתיבה (INSERT, UPDATE, DELETE); בקשה אחת חייבת לכלול רק פעולות קריאה או רק פעולות כתיבה.
הממשק מוגבל בכוונה ואינו PostgreSQL מלא. התיעוד הזה מכסה רק את הדיאלקט הנתמך, ואינו מדריך תאימות ל-PostgreSQL.
אף נתיב קריאה לא מתקן נתונים, לא מחשב מחדש את התזמון ולא משנה את מצב הכרטיסים. השתמש ב-POST /v1/agent/sql/execute לכל כתיבה של כרטיסים וחפיסות. SQL לא יכול לכתוב ל-review_events או למצב התזמון של FSRS; רשום חזרות דרך POST /v1/agent/reviews/submit.
סוגי הפקודות הנוכחיים:
SHOW TABLESDESCRIBE <resource>SHOW COLUMNS FROM <resource>SELECTINSERTUPDATEDELETE
המשאבים הלוגיים המפורסמים כרגע כוללים:
workspacecardsdecksreview_events
הערות:
- ברירת המחדל של
LIMITהיא100, והערך המקסימלי הוא100 - השתמש ב-
ORDER BYכשאתה צריך עימוד יציב - השתמש ב-
SHOW TABLESאו ב-DESCRIBE cardsכדי לגלות את הסכמה - כל בקשת SQL מוגבלת לסביבת עבודה אחת: ה-
workspaceIdשבגוף הבקשה, או סביבת העבודה שנבחרה
דוגמה לבקשה:
curl -X POST https://api.nibomo.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{"sql":"SHOW TABLES"}'
דוגמה לשאילתת כרטיסים:
curl -X POST https://api.nibomo.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"sql":"SELECT card_id, front_text, back_text, tags FROM cards ORDER BY updated_at DESC LIMIT 20 OFFSET 0"
}'
דוגמה לשינוי נתונים:
curl -X POST https://api.nibomo.com/v1/agent/sql/execute \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"sql":"UPDATE cards SET back_text = '\''Updated answer'\'' WHERE card_id = '\''50b5b928-7f04-4cc8-878d-6cd0e8b98474'\''"
}'
שרת MCP מרוחק זמין גם בכתובת https://mcp.nibomo.com/mcp עם OAuth 2.1 (Dynamic Client Registration + PKCE). הוא חושף את אותה חלוקת SQL בתור sql_query (לקריאה בלבד באופן מוחלט) ו-sql_execute (כתיבה), וכן את list_workspaces, get_guide ואת כלי החזרות next_review_card, reveal_answer ו-submit_review; ראה מחבר ה-MCP.
בטיחות והיקף
ממשק ה-SQL הוא דיאלקט סגור שהמנתח אוכף, ולא PostgreSQL גולמי. מנגנוני ההגנה הם:
- רשימה סגורה של פקודות מותרות: רק
SHOW TABLES,DESCRIBE,SHOW COLUMNSו-SELECTלקריאה, ו-INSERT,UPDATEו-DELETEלכתיבה. כל דבר אחר נדחה כבר בשלב הניתוח. - משאבים מוגבלים: פקודות יכולות לגעת רק במשאבים
workspace,cards,decksו-review_events. - הגבלה לסביבת עבודה: כל פקודה מוגבלת לסביבת עבודה אחת שיש לך גישה אליה, ה-
workspaceIdשבגוף הבקשה או סביבת העבודה שבחרת, בלי גישה בין דיירים. - גופי בקשה מחמירים: נתיבי ה-SQL והחזרות דוחים שדה לא מוכר בגוף הבקשה, כך ש-
workspaceIdעם שגיאת כתיב נכשל במקום לרוץ על סביבת העבודה שנבחרה. - מגבלות: עד
100שורות לפקודה, עד50פקודות לאצווה, ומגבלת תוצאה של כ-12kטוקנים. אצוות של שינויים מוחלות באופן אטומי. - הפרדה בין קריאה לכתיבה:
sql_queryו-list_workspacesהם לקריאה בלבד באופן מוחלט (readOnlyHint), ולעולם לא מתקנים נתונים, מחשבים מחדש את התזמון או משנים את מצב הכרטיסים.sql_executeהוא כלי הכתיבה היחיד ל-SQL והוא מבצע כתיבות (destructiveHint); בקשה אחת חייבת לכלול רק פעולות קריאה או רק פעולות כתיבה. SQL לא יכול לכתוב ל-review_eventsאו למצב התזמון של FSRS; רקPOST /v1/agent/reviews/submit(ב-MCP:submit_review) רושם חזרה.
מדריכים
GET /v1/agent/guide/{topic} מחזיר מדריך עיון אחד ב-data.guide, אותו תוכן שכלי ה-MCP get_guide מגיש. הנושאים:
sql_dialect: הדקדוק המלא של ה-SQL, המגבלות ודוגמאותcard_authoring: חוזה הכרטיס, תגיות, בדיקות כפילויות ועיצובbulk_authoring: פיצול ואימות של משימת כתיבה גדולהreview_flow: מחזור החזרה והדירוג
נושא לא מוכר מחזיר 400 עם רשימת הנושאים הנתמכים. שלוף את המדריך המתאים לפני כתיבת כרטיסים, כתיבה בכמויות גדולות או הרצת חזרה, וקרא שוב את sql_dialect אחרי שפקודה נדחתה.
curl https://api.nibomo.com/v1/agent/guide/sql_dialect \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY"
חזרות
נתיבי החזרות מאפשרים לסוכן לבחון לומד כרטיס אחד בכל פעם ולשמור כל דירוג בלוח הזמנים של FSRS עבור הכרטיס. הם מקבלים את אותם ארגומנטים ב-JSON כמו כלי החזרות של MCP:
POST /v1/agent/reviews/nextמחזירcardעםcardIdו-frontText, אוcard: nullכשאין כרטיס שהגיע זמנו. הפרמטרים האופציונלייםtags(כרטיס עם לפחות אחת מהתגיות) אוdeckIdמצמצמים את התור, אבל לעולם לא שניהם יחד; בקשה בלי גוף תקינה.POST /v1/agent/reviews/revealדורשcardIdומחזיר אתbackTextשל הכרטיס הזה.POST /v1/agent/reviews/submitדורשcardId, מזההreviewIdמסוג UUID שהלקוח יוצר,ratingעם הערךAgain,Hard,GoodאוEasy, ואתreviewedTimeZoneשל הלומד לפי IANA. השרת קובע את זמן החזרה ומחזיר את לוח הזמנים החדש של הכרטיס, כוללdueAt,state,repsו-lapses.
שלושת הנתיבים מקבלים את workspaceId האופציונלי. שמור את reviewId לפני השליחה, ואם לא ברור אם שליחה הצליחה, נסה שוב עם בקשה זהה; היא לעולם לא רושמת חזרה שנייה. נתיבי החזרות יכולים גם לענות:
409 REVIEW_EVENT_CONFLICT: החזרה כבר נרשמה, ו-error.details.reviewScheduleמכיל את לוח הזמנים הנוכחי של הכרטיס.409 REVIEW_ID_CARD_MISMATCH: ה-reviewIdכבר מזהה חזרה על כרטיס אחר, ולכן דבר לא נשמר; שלח שוב עםreviewIdחדש.409 REVIEW_STALE: זמן החזרה השמור של הכרטיס זהה לזמן הנוכחי בשרת או מאוחר ממנו; חזור על כרטיס אחר.400 REVIEW_INPUT_INVALID: ארגומנט חסר, לא תקין או לא נתמך, כוללtagsיחד עםdeckIdאו תגית שסביבת העבודה לא משתמשת בה.
דוגמה לשליחה:
curl -X POST https://api.nibomo.com/v1/agent/reviews/submit \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"cardId":"693c4863-28a2-45e8-8f55-9fa31fc95ff2",
"reviewId":"429bb7cc-40fb-49f3-bb50-48a5db2826d1",
"rating":"Good",
"reviewedTimeZone":"Europe/Sofia"
}'
ממשקי API לאנשים ולסנכרון
Nibomo כוללת גם ממשקי API נפרדים ללקוחות אנושיים ולסנכרון שמתוכנן קודם כל לעבודה ללא חיבור, אבל הם אינם החוזה העיקרי לסוכנים חיצוניים:
- תהליכי הדפדפן משתמשים בעוגיות בדומיין משותף ובהגנת CSRF
- לקוחות שמתוכננים קודם כל לעבודה ללא חיבור משתמשים בנתיבי הסנכרון הממומשים תחת
/v1/workspaces/{workspaceId}/sync/pushו-/v1/workspaces/{workspaceId}/sync/pull - נתיבי הסנכרון נפרדים מממשק הסוכנים החיצוניים