رفتن به محتوا

دستورالعمل n8n

این گردش کار فایل جلسه را از گرهِ پیش از خودش می‌گیرد، آن را به لُب می‌فرستد، منتظر می‌ماند تا آماده شود، و جلسهٔ آماده را به‌صورت یک سند Markdown می‌خواند تا در یک یادداشت، پیام یا ایمیل بنشیند. چهار گره HTTP Request دارد: یکی جلسه را می‌فرستد، یکی در حلقه‌ای همراه یک گره Wait و سه گره IF وضعیت را می‌پرسد، یکی شکستی را که درست‌شدنی است دوباره اجرا می‌کند، و یکی جلسه را می‌خواند.

گردش کاری که فقط جلسه را می‌سپارد و هرگز آن را نمی‌خواند، به همهٔ این‌ها نیاز ندارد؛ جریانی که فقط جلسه می‌فرستد را ببینید.

توکن. در «اتصال‌ها» توکنی با «ارسال جلسه» و «خواندن» بسازید (recordings:write و recordings:read). «خواندن» همان چیزی است که به گره آخر اجازه می‌دهد جلسه را بگیرد. این توکن دقیقه خرج می‌کند، پس برایش سقف روزانه بگذارید. این توکن هم مثل هر توکن دیگری فقط تا وقتی کار می‌کند که «حالت توسعه‌دهنده» روشن باشد.

اعتبارنامه. توکن را در یک اعتبارنامهٔ n8n نگه دارید، هرگز در خود گره:

  1. در n8n یک اعتبارنامه از نوع Header Auth بسازید.
  2. Name آن را Authorization بگذارید و Value را Bearer lobbe_…: واژهٔ Bearer، یک فاصله و بعد توکن شما.
  3. در هر گره‌ای که با لُب کار می‌کند، Authentication را روی Generic Credential Type و Generic Auth Type را روی Header Auth بگذارید و بعد همین اعتبارنامه را انتخاب کنید.

تنظیمات هر گره همراه گردش کار ذخیره می‌شود، و گردش کارها را خروجی می‌گیرند و با دیگران به اشتراک می‌گذارند. خروجیِ یک گردش کار نام اعتبارنامه‌هایش را دارد، اما خود آن‌ها را نه.

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 هم اجرا را در شکستی که درست‌شدنی نیست تمام می‌کند.

  1. یک گره Wait: Resume برابر After Time Interval، به مدت یک دقیقه.

  2. یک گره HTTP Request برای وضعیت: Method برابر GET، همان اعتبارنامه، و این عبارت در URL:

    https://app.lobbe.ai/api/v1/recordings/{{ $('Send meeting').item.json.recording.id }}/status

    این همان statusUrl پاسخ ارسال است. شناسه در هر دور حلقه از گره Send meeting خوانده می‌شود، هر پاسخی که گرهِ پیش از این گره داده باشد. اگر نام دیگری برای آن گره گذاشته‌اید، همان نام را در این عبارت بنویسید.

  3. یک گره IF با شرط «{{ $json.status }} برابر READY». خروجی true آن به مرحلهٔ ۳ می‌رود و خروجی false آن به گره IF دوم.

  4. گره IF دوم با شرط «{{ $json.status }} برابر FAILED». خروجی false آن به گره Wait برمی‌گردد و خروجی true آن به گره IF سوم می‌رود.

  5. گره IF سوم با دو شرط که هر دو لازم‌اند (AND): «{{ $json.error.retryable }} برابر true» (از نوع Boolean) و «{{ $runIndex }} کمتر از 3» (از نوع Number). $runIndex می‌شمارد این گره پیش‌تر چند بار اجرا شده است، پس هر جلسه حداکثر سه بار دوباره اجرا می‌شود. خروجی true آن به گره تلاش دوبارهٔ پایین می‌رود. خروجی false آن اجرا را با یک گره Stop and Error تمام می‌کند که {{ $json.error.code }} را در پیامش دارد.

  6. یک گره 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 و تلاش دوباره را ببینید.

در 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 آن اضافه کنید. برای برداشتن هر جلسهٔ تازه همین که آماده شد، آوردن جلسه‌ها به ابزارهای خودتان را ببینید.