דילוג לתוכן
תיעוד Nodaro
תיעודמדריך הרכיביםמודליםתבניותסוכני AI (MCP)מפתחיםאירוח עצמימחקרהשוואות
SDK ל-TypeScript

Copilot ב-SDK

client.copilot מנהל את השיחות של ה-Copilot ומזרים את הפניות שלו. הוא עובד רק בתוך אפליקציה של Nodaro, עם הסשן של המשתמש המחובר עצמו.

זמין ב-Nodaro Cloud

client.copilot מאפשר לשלוט מקוד ב-Copilot, עוזר התהליכים של Nodaro. שיחה נפתחת על תהליך מסוים, ופנייה היא הודעה אחת, יחד עם כל מה שהעוזר עושה כדי לענות עליה. המתודות קוראות ל-/v1/copilot/*. כדי לקרוא על היכולת עצמה, ראו את הדף בניית תהליך עם ה-Copilot.

ה-Copilot עובד רק בתוך אפליקציה של Nodaro. כל נתיב דוחה עם 403 in_app_only כל קריאה שלא נשלחת עם הסשן של המשתמש המחובר עצמו. ה-SDK זורק את השגיאה הזו כ-ForbiddenError. השדה code שלה הוא forbidden, ולכן כדי לזהות אותה בדקו את השדה message. אסימוני API ואסימוני OAuth לא יכולים לשלוט ב-Copilot של אף משתמש. השתמשו בו מאפליקציית דפדפן עם supabaseAuth. ה-Copilot רץ ב-Nodaro Cloud. בפריסה שבה היכולת כבויה, פתיחת שיחה או שליחת פנייה נדחות עם 503 feature_disabled.

מתודות

מתודהמה היא עושה
create(input)פתיחת שיחה על תהליך קיים או על תהליך חדש
list(params)קריאת השיחה הפעילה של תהליך
get(id, opts?)קריאת שיחה עם ההודעות שלה
archive(id)העברת שיחה לארכיון
cancel(id)עצירת הפנייה שרצה עכשיו
stream(threadId, opts)שליחת הודעה וקריאת האירועים של הפנייה בזמן שהם מגיעים

המתודות האלה מחזירות את מעטפת ה-{ data } של ה-API כמו שהיא מגיעה, חוץ מ-stream(), שמחזירה אירועים בזה אחר זה.

client.copilot

create(input)‎

פותחת שיחה. אפשר לשלוח workflowId של תהליך קיים, או prompt, ואז השרת יוצר תהליך שמתחיל מהפרומפט הזה. פתיחת שיחה על תהליך שכבר יש לו שיחה פעילה מחזירה את השיחה הזו, ולא פותחת שיחה שנייה.

create(input: { workflowId?: string; prompt?: string; name?: string }): Promise<{
  data: { thread: CopilotThread; workflow: CopilotThreadWorkflow }
}>

מאפיין

סוג

const { data } = await client.copilot.create({ workflowId })
const threadId = data.thread.id

לשיחה יש id, workflowId, runMode (ask, שמציע הרצות ומחכה, או auto, שמריץ בגבולות autoRunLimitCredits), modelTier, allowPublishing, userTurnCount, lastMessageAt ו-createdAt. השדה surface מציין לאיזה עוזר השיחה שייכת; כשהשדה חסר, הפריסה לא ציינה זאת.

list(params)‎

מחזירה את השיחה הפעילה של תהליך, או null כשאין שיחה כזו.

list(params: { workflowId: string }): Promise<{ data: { thread: CopilotThread | null } }>

מאפיין

סוג

const { data: { thread } } = await client.copilot.list({ workflowId })

get(id, opts?)‎

מחזירה שיחה עם ההודעות שלה. השיחה כוללת גם status מחושב (running או idle) ואת activeTurnId.

get(id: string, opts?: { after?: number; limit?: number }): Promise<{
  data: { thread: CopilotThread; messages: CopilotMessage[] }
}>

מאפיין

סוג

const { data: { messages } } = await client.copilot.get(threadId, { after: lastSeq })

לכל הודעה יש id, seq, turnId, role, createdAt ו-parts: חלקי טקסט וחלקים של קריאות לכלים.

archive(id)‎

מעבירה שיחה לארכיון. אפשר עדיין לקרוא את ההודעות, ושום דבר לא נמחק. אי אפשר להעביר לארכיון שיחה שיש בה פנייה שרצה.

archive(id: string): Promise<{ data: { archived: true } }>

מאפיין

סוג

await client.copilot.archive(threadId)

cancel(id)‎

עוצרת את הפנייה שרצה בשיחה, ומחזירה את המזהה של הפנייה שהיא ביקשה לעצור. הזרם של הפנייה הזו מסתיים באירוע done.

cancel(id: string): Promise<{ data: { cancelling: true; turnId: string } }>

מאפיין

סוג

await client.copilot.cancel(threadId)

stream(threadId, opts)‎

שולחת הודעה ומחזירה את האירועים של הפנייה ברגע שהם מגיעים, בזרם של אירועי שרת (SSE). כך אפשר להציג טקסט, פעילות של כלים והצעות בזמן אמת, במקום לחכות לתשובה המלאה. זו המתודה היחידה בדף הזה שמוציאה קרדיטים.

stream(threadId: string, opts: {
  message: string
  baseVersion?: number
  tier?: "economy" | "standard" | "premium"
  signal?: AbortSignal
}): AsyncGenerator<CopilotStreamFrame>

מאפיין

סוג

try {
  for await (const frame of client.copilot.stream(threadId, { message: "Tidy the graph" })) {
    if (frame.type === "token") appendText(frame.data.text)
    if (frame.type === "run_proposed") await askTheUser(frame.data)
    if (frame.type === "done") break
  }
} catch (err) {
  if ((err as Error).name !== "AbortError") throw err // a stopped turn is a normal ending
}

הטיפוס CopilotStreamFrame הוא union שמובחן לפי type:

אירועמה יש בו
metadataהמזהים של הפנייה, המודל, runMode, autoRunLimitCredits וההגדרות
tokenקטע מהטקסט של התשובה
tool_callכלי שהעוזר משתמש בו: started, ואחר כך finished או failed
workflow_updatedהרכיבים שנוספו, השתנו והוסרו, והגרסה החדשה
workflow_createdתהליך שהעוזר יצר
run_proposedמה שהפנייה רוצה להריץ, לאישור של אדם
memory_savedמשהו שהעוזר בחר לזכור
usageכמות הטוקנים שהפנייה השתמשה בה, ו-creditsCharged
doneהסיום: completed, capped או cancelled
errorהפנייה נכשלה, עם code ועם message

השדה data של אירוע מועבר כמו שהוא, ולכן גם שדות שה-SDK לא מגדיר מגיעים אליכם. ה-SDK מדלג על סוג אירוע שהוא לא מגדיר, במקום לזרוק שגיאה, כך ששרת חדש יותר לא יכול לשבור לקוח ישן יותר. הגרסה הזו לא מגדירה את action_proposed, כרטיס ההצעה של שיחות שה-surface שלהן הוא studio, ולכן ההצעות האלה לא מגיעות לקוד שקורא למתודה.

משך החיים של הפנייה בידיכם. ה-timeoutMs של הלקוח לא חל על פנייה, כי פנייה יכולה לרוץ כמה דקות. כדי לסיים את הבקשה, העבירו signal או הפסיקו את הלולאה. כשמבטלים, הלולאה נכשלת עם ה-AbortError של סביבת הריצה עצמה, ולא עם NodaroError, בין שהביטול קורה לפני האירוע הראשון ובין שהוא קורה בין שני אירועים. אם הבקשה שפותחת את הזרם נכשלת עם סטטוס של שגיאה, המתודה זורקת כרגיל שגיאה עם טיפוס, עוד לפני כל אירוע.

שאלות נפוצות

האם אפשר להשתמש ב-client.copilot עם אסימון API?

לא. כל נתיבי ה-Copilot דוחים אסימוני API ואסימוני OAuth עם 403 in_app_only. רק הסשן של המשתמש המחובר עצמו, שנשלח עם supabaseAuth מתוך אפליקציה של Nodaro, יכול לעבוד עם client.copilot.

מה מחזירה המתודה client.copilot.stream?

המתודה client.copilot.stream מחזירה איטרטור אסינכרוני של אירועים עם טיפוסים: המטא־דאטה של הפנייה, קטעי טקסט, קריאות לכלים, עדכונים של התהליך, הצעות להרצה, נתוני שימוש ובסוף אירוע done או error. עברו עליו בלולאת for await.

האם פסק הזמן של הלקוח עוצר פנייה ארוכה ל-Copilot?

לא. פסק הזמן לא חל על פנייה, כי פנייה יכולה לרוץ כמה דקות. כדי לסיים אותה, העבירו AbortSignal או הפסיקו את הלולאה.

אילו אירועים לא מגיעים לקוד שקורא למתודה?

גרסת ה-SDK הזו מדלגת על סוגי אירועים שהיא לא מגדירה. ביניהם האירוע action_proposed, כרטיס ההצעה של שיחות שה-surface שלהן הוא studio, ולכן ההצעות האלה לא מגיעות לקוד שקורא למתודה.

עודכן לאחרונה

בדף הזה