دستورالعمل n8n
این گردش کار فایل جلسه را از گرهِ پیش از خودش میگیرد، آن را به لُب میفرستد، منتظر میماند تا
آماده شود، و جلسهٔ آماده را بهصورت یک سند Markdown میخواند تا در یک یادداشت، پیام یا ایمیل
بنشیند. چهار گره HTTP Request دارد: یکی جلسه را میفرستد، یکی در حلقهای همراه یک گره Wait و سه
گره IF وضعیت را میپرسد، یکی شکستی را که درستشدنی است دوباره اجرا میکند، و یکی جلسه را میخواند.
گردش کاری که فقط جلسه را میسپارد و هرگز آن را نمیخواند، به همهٔ اینها نیاز ندارد؛ جریانی که فقط جلسه میفرستد را ببینید.
پیش از شروع
Section titled “پیش از شروع”توکن. در «اتصالها» توکنی با «ارسال جلسه» و «خواندن» بسازید (recordings:write و
recordings:read). «خواندن» همان چیزی است که به گره آخر اجازه میدهد جلسه را بگیرد. این توکن دقیقه
خرج میکند، پس برایش سقف روزانه بگذارید. این توکن هم مثل هر توکن
دیگری فقط تا وقتی کار میکند که «حالت توسعهدهنده» روشن باشد.
اعتبارنامه. توکن را در یک اعتبارنامهٔ n8n نگه دارید، هرگز در خود گره:
- در n8n یک اعتبارنامه از نوع
Header Authبسازید. Nameآن راAuthorizationبگذارید وValueراBearer lobbe_…: واژهٔBearer، یک فاصله و بعد توکن شما.- در هر گرهای که با لُب کار میکند،
Authenticationرا رویGeneric Credential TypeوGeneric Auth Typeرا رویHeader Authبگذارید و بعد همین اعتبارنامه را انتخاب کنید.
تنظیمات هر گره همراه گردش کار ذخیره میشود، و گردش کارها را خروجی میگیرند و با دیگران به اشتراک میگذارند. خروجیِ یک گردش کار نام اعتبارنامههایش را دارد، اما خود آنها را نه.
۱. فرستادن جلسه
Section titled “۱. فرستادن جلسه”HTTP Request node Method: POST URL: https://app.lobbe.ai/api/v1/recordings Credential (Header Auth): Authorization = Bearer <your token> Body: Form-Data, field audio = the meeting's file
Then poll the statusUrl it answers with, about once a minute.سطر Credential (Header Auth) بالا همان چیزی است که اعتبارنامه میفرستد؛ آن را در خود گره ننویسید.
تنظیمات گره:
| تنظیم | مقدار |
|---|---|
Method |
POST |
URL |
https://app.lobbe.ai/api/v1/recordings |
Authentication |
همان اعتبارنامهٔ Header Auth |
Send Body |
روشن، با Body Content Type برابر Form-Data |
| یک پارامتر بدنه | Parameter Type برابر n8n Binary File، Name برابر audio، و در Input Data Field Name نام فیلدی از آیتم که فایل در آن است (data، مگر گرهِ قبلی نام دیگری برایش گذاشته باشد) |
| پارامتر دوم بدنه | Parameter Type برابر Form Data، Name برابر naming و Value برابر skip |
audioفیلدی است که لُب فایل را از آن میخواند. n8n فایل را با همان نوعی میفرستد که درmimeTypeدادهٔ باینری آن ثبت شده است. پاسخ400 VALIDATIONبا پیامUnsupported audio typeیعنی این نوع از نوعهایی نیست که لُب میپذیرد؛ محدودیتهای ارسال فایل را ببینید.naming=skipیعنی جلسه هرگز برای نام گویندهها نمیایستد، پس حلقهٔ پایین همیشه به پایان میرسد. بدون آن، تنظیم «نامگذاری گویندهها»ی صاحب حساب تصمیم میگیرد و جلسه ممکن است ساعتها درNAMINGمنتظر بماند؛ رد شدن از نامگذاری هنگام فرستادن جلسه را ببینید.- فیلدهای دیگر، مثل
titleوrecordedAt(زمان برگزاری جلسه)، بهصورت پارامترهایForm Dataدیگر فرستاده میشوند؛POST /recordingsرا ببینید. - تلاش دوباره. اگر
Retry On Failاین گره را روشن میکنید، هدرIdempotency-Keyرا هم بفرستید، با مقداری که برای هر فایل یک بار و پیش از این گره ساخته شده باشد، تا تلاش دوباره جلسهٔ دومی نسازد؛ تکرارپذیری و تلاش دوباره را ببینید.
نام این گره را Send meeting بگذارید: حلقهٔ پایین شناسهٔ جلسه را از آن میخواند. پاسخ 202 است و
شناسهٔ جلسه در recording.id میآید.
۲. انتظار برای آمادهشدن
Section titled “۲. انتظار برای آمادهشدن”شش گره حلقهای میسازند که هر یک دقیقه یک بار وضعیت را میپرسد و شکستی را که درستشدنی است دوباره
اجرا میکند: یک گره Wait، دو گره HTTP Request و سه گره IF. یک گره Stop and Error هم اجرا را
در شکستی که درستشدنی نیست تمام میکند.
-
یک گره
Wait:ResumeبرابرAfter Time Interval، به مدت یک دقیقه. -
یک گره
HTTP Requestبرای وضعیت:MethodبرابرGET، همان اعتبارنامه، و این عبارت درURL:https://app.lobbe.ai/api/v1/recordings/{{ $('Send meeting').item.json.recording.id }}/statusاین همان
statusUrlپاسخ ارسال است. شناسه در هر دور حلقه از گرهSend meetingخوانده میشود، هر پاسخی که گرهِ پیش از این گره داده باشد. اگر نام دیگری برای آن گره گذاشتهاید، همان نام را در این عبارت بنویسید. -
یک گره
IFبا شرط «{{ $json.status }}برابرREADY». خروجیtrueآن به مرحلهٔ ۳ میرود و خروجیfalseآن به گرهIFدوم. -
گره
IFدوم با شرط «{{ $json.status }}برابرFAILED». خروجیfalseآن به گرهWaitبرمیگردد و خروجیtrueآن به گرهIFسوم میرود. -
گره
IFسوم با دو شرط که هر دو لازماند (AND): «{{ $json.error.retryable }}برابرtrue» (از نوعBoolean) و «{{ $runIndex }}کمتر از3» (از نوعNumber).$runIndexمیشمارد این گره پیشتر چند بار اجرا شده است، پس هر جلسه حداکثر سه بار دوباره اجرا میشود. خروجیtrueآن به گره تلاش دوبارهٔ پایین میرود. خروجیfalseآن اجرا را با یک گرهStop and Errorتمام میکند که{{ $json.error.code }}را در پیامش دارد. -
یک گره
HTTP Requestبرای تلاش دوباره:MethodبرابرPOST، همان اعتبارنامه،Never Errorروشن (درOptions، زیرResponse)، و این عبارت درURL:https://app.lobbe.ai/api/v1/recordings/{{ $('Send meeting').item.json.recording.id }}/retryخروجی آن به گره
Waitبرمیگردد.
چرا بهجای ایستادن دوباره اجرا میکنیم: لُب مرحلهٔ شکستخورده را پس از کمی صبر خودش دوباره امتحان
میکند، پس وضعیت ممکن است لحظهای FAILED باشد و بعد جلسه پیش برود. تلاش دوباره حتی در این حالت هم
بیخطر است: تا وقتی اجرای خود لُب در راه است اجرای دومی راه نمیاندازد، هزینهٔ تازهای ندارد، و اگر
جلسه خودش درست شده باشد پاسخ 409 NOT_FAILED میدهد. Never Error نمیگذارد این پاسخ اجرا را تمام
کند. هر پاسخ دیگری به تلاش دوباره به خواندن بعدی وضعیت سپرده میشود: یا جلسه پیش رفته است، یا دوباره
FAILED است و یکی دیگر از سه تلاش دوباره را مصرف میکند. جلسهای که error.retryable آن
false است (صدایش گفتاری ندارد یا فایلش خراب است) دوباره هم همانطور ناموفق میشود، پس حلقه همان
لحظه میایستد. FAILED و تلاش دوباره را ببینید.
۳. خواندن لُب
Section titled “۳. خواندن لُب”در READY، پاسخ وضعیت bundleUrl را دارد، یعنی نشانی جلسهٔ کامل. یک گره HTTP Request دیگر آن را
میخواند:
| تنظیم | مقدار |
|---|---|
Method |
GET |
URL |
{{ $json.bundleUrl }}?format=markdown |
Authentication |
همان اعتبارنامه |
Response Format (در Options، زیر Response) |
Text |
پاسخ یک سند Markdown است: عنوان، مشخصات جلسه، بخشهای لُب و رونوشت. n8n آن را در فیلد data آیتم
میگذارد تا گره بعدی از آن استفاده کند. بدون ?format=markdown، همین جلسه بهصورت JSON میآید؛
GET /recordings/{id}/bundle را ببینید.
برای توکنی که «خواندن» ندارد bundleUrl برابر null است، پس این گره به recordings:read نیاز دارد.
وقتی درخواستی خطا میدهد
Section titled “وقتی درخواستی خطا میدهد”بهجز گره تلاش دوباره، بگذارید هر گره HTTP Request با خطا گردش کار را متوقف کند، همانطور که n8n
بهطور پیشفرض میکند. آنوقت پاسخ خطا، مثلاً 403 DEVELOPER_MODE_OFF یا 402 INSUFFICIENT_MINUTES، اجرا را تمام میکند،
بهجای اینکه در حلقه بچرخد. برای اینکه باخبر شوید، در تنظیمات گردش کار یک Error Workflow برایش انتخاب
کنید. معنای هر کد در خطاها آمده است.
بهجای فرستادن، جلسههای آماده را بخوانید
Section titled “بهجای فرستادن، جلسههای آماده را بخوانید”توکنی که فقط «خواندن» دارد نمیتواند جلسه بفرستد، اما یک گره جلسههای آماده را فهرست میکند:
HTTP Request node Method: GET URL: https://app.lobbe.ai/api/v1/recordings/ready Credential (Header Auth): Authorization = Bearer <your token>
Each item's bundleUrl returns the whole meeting.items در پاسخ، جلسههای آمادهٔ شماست، از تازهترین. برای صفحهٔ بعد، nextCursor را در cursor
برگردانید. برای گرفتن یک جلسه بهصورت Markdown، مثل مرحلهٔ ۳، ?format=markdown را به bundleUrl آن
اضافه کنید. برای برداشتن هر جلسهٔ تازه همین که آماده شد،
آوردن جلسهها به ابزارهای خودتان را ببینید.