رسانه برنامهنویسی REST
همهی کارهایی که برنامههای Antimatter انجام میدهند از طریق همین رسانه برنامهنویسی HTTP صورت میگیرد، بنابراین اسکریپتهای شما هم میتوانند همین کار را انجام دهند. این صفحه روش احراز هویت، منابعی که بیشترین استفاده را دارید، ساختار پاسخها و خطاها، و همچنین روش دنبالکردن رویدادها بهصورت زنده از طریق WebSocket را توضیح میدهد.
مبانی
- آدرس پایه:
https://chat.example.com/api/v4. همهی نقاط پایانی زیر نسبت به این آدرس هستند. - قالب: ورودی و خروجی بهصورت JSON است، بهجز بارگذاری فایلها (multipart).
Content-Type: application/jsonرا ارسال کنید. - شناسهها: هر شیء یک
idبا ۲۶ کاراکتر دارد. زمانها بهصورت میلیثانیه از مبدأ Unix هستند (create_at،update_at،delete_at؛ مقدار 0 به معنای «حذفنشده» است). - جوامع همان تیمها هستند: رسانه برنامهنویسی به آنها
teamsمیگوید و برای هر کدام یکteam_idوجود دارد. - خودتان: هر جا که در مسیر یک
user_idلازم باشد،meبه کاربر واردشده اشاره دارد، همانطور که درGET /users/meمیبینید.
فهرست کامل نقاط پایانی در کد سرور قرار دارد: مسیرها در server/channels/api4/*.go و انواع داده در server/public/model تعریف شدهاند. توضیحات OpenAPI در پوشه api/v4/source مخزن، نقاط پایانی ارثبری شده از Mattermost و برخی از افزودههای Antimatter را پوشش میدهد: انتقال رشتهها، اتصالات مدل، عاملها، قوانین جامعه، حالت تمرکز و اقدامات پیام. سایر نقاط پایانی فقط در کد موجود هستند.
احراز هویت
هر درخواست، بهجز ورود و چند نقطه پایانی عمومی، به یک توکن در هدر Authorization نیاز دارد:
curl -H "Authorization: Bearer $TOKEN" https://chat.example.com/api/v4/users/me
سه نوع توکن در آنجا پذیرفته میشود: توکنهای دسترسی شخصی، توکنهای نشست و توکنهای دسترسی OAuth. Authorization: Token … هم پذیرفته میشود. توکنها در رشته پرس (query string) (?access_token=) فقط برای توکنهای دسترسی OAuth پذیرفته میشوند.
توکنهای دسترسی شخصی (برای اسکریپتها توصیه میشود)
یک توکن دسترسی شخصی بهجای شما عمل میکند، مگر اینکه تاریخ انقضایی برای آن تعیین کنید، و میتوان آن را در هر لحظه باطل کرد. توکنهای دسترسی شخصی بهطور پیشفرض غیرفعال هستند:
- یک مدیر سیستم گزینه فعال کردن رمزهای دسترسی شخصی را در کنسول سیستم › ادغام ها › مدیریت یکپارچه سازی (
ServiceSettings.EnableUserAccessTokens،AM_SERVICESETTINGS_ENABLEUSERACCESSTOKENS) فعال میکند. - برای هر فردی که ممکن است توکنها را ایجاد کند، یک مدیر سیستم کنسول سیستم › مدیریت کاربران › کاربران را باز میکند، در منوی آن فرد مدیریت نقشها را انتخاب میکند و اجازه تولید توکنهای دسترسی شخصی برای این حساب را فعال میکند. مدیران سیستم همیشه میتوانند این توکنها را ایجاد کنند.
- کاربر روی آواتار خود در گوشه بالا سمت راست کلیک میکند و سپس به بخش مشخصات و تنظیمات › امنیت میرود. در زیر بخش توکن های دسترسی شخصی، توضیح میدهد که این توکن برای چه کاری استفاده میشود و گزینه توکن ایجاد کنید را انتخاب میکند. توکن فقط یک بار نمایش داده میشود: آن را کپی کنید.
با استفاده از API: POST /users/{user_id}/tokens همراه با {"description": "backup script", "expires_at": 0} (expires_at بر حسب میلیثانیه؛ 0 برای بدون انقضا). فیلد token در پاسخ، راز (secret) است؛ id آن چیزی است که برای لغو توکن استفاده میشود (POST /users/tokens/revoke همراه با {"token_id": "…"}). از خط فرمان: amctl token generate <user> <description>.
یک مدیر سیستم میتواند مدت اعتبار توکنها را با حداکثر مدت اعتبار توکن دسترسی شخصی (روز) در همان صفحه کنسول سیستم محدود کند.
توکنهای نشست
ورود با رمز عبور، یک توکن نشست را در هدر پاسخ Token برمیگرداند، همان نوع نشستی که برنامهها از آن استفاده میکنند:
curl -i -X POST https://chat.example.com/api/v4/users/login \
-H 'Content-Type: application/json' \
-d '{"login_id": "maya", "password": "…"}'
برای حسابی که احراز هویت چندعاملی دارد، "token": "123456" را اضافه کنید. نشستها طبق تنظیمات نشست سرور منقضی میشوند و نقطه ورود (login endpoint) محدودیت نرخ دارد (۵ درخواست بر ثانیه). POST /users/logout نشست را پایان میدهد.
X-CSRF-Token را نیز ارسال کند؛ توکن در هدر Authorization به هدر CSRF نیاز ندارد.برنامههای OAuth 2.0
برای اینکه افراد بتوانند با حساب Antimatter خود به برنامه شما وارد شوند، یک برنامه OAuth 2.0 ثبت کنید. در این صورت Antimatter به عنوان ارائهدهنده OAuth عمل میکند:
- گزینه فعال کردن OAuth 2.0 Service Provider باید فعال باشد (کنسول سیستم › ادغام ها › مدیریت یکپارچه سازی،
ServiceSettings.EnableOAuthServiceProvider، به صورت پیشفرض فعال است). - شخصی که حق مدیریت برنامههای OAuth را دارد (به طور پیشفرض مدیران سیستم)، ادغام ها › برنامههای OAuth 2.0 (منوی جامعه › تنظیمات تیم › ادغام ها) را باز میکند و برنامه را همراه با URLهای بازگشتی آن اضافه میکند. سپس یک شناسه مشتری و یک رمز مشتری دریافت میکند.
- برنامه شما کاربران را به
https://chat.example.com/oauth/authorizeباresponse_type=code،client_id،redirect_uriوstateمیفرستد. پشتیبانی از PKCE باcode_challenge_method=S256وجود دارد. - کد را در
POST https://chat.example.com/oauth/access_token(باgrant_type=authorization_codeو سپسrefresh_tokenبرای تمدید) تبدیل میکند و باAuthorization: Bearer <access token>به API دسترسی پیدا میکند.
کاربران میتوانند برنامههایی که به آنها مجوز دادهاند را در بخش مشخصات و تنظیمات › امنیت › برنامههایی که به آنها مجوز دادهاید مشاهده کنند.
منابع اصلی
| چه چیزی | پایانهها |
|---|---|
| شما و سایر کاربران | GET /users/me، GET /users/{user_id}، GET /users/username/{username}، POST /users/ids (یک فهرست از شناسهها)، POST /users/search، GET /users?in_team=…&in_channel=… |
| جوامع | GET /users/me/teams, GET /teams/{team_id}, GET /teams/name/{name}, PUT /teams/{team_id}/patch, GET /teams/{team_id}/members, POST /teams/{team_id}/members |
| کانالها | GET /users/me/teams/{team_id}/channels، GET /teams/name/{team}/channels/name/{channel}، POST /channels، POST /channels/direct (دو شناسه کاربر)، POST /channels/group، POST /channels/{channel_id}/members |
| پیامها | POST /posts, GET /posts/{post_id}, PUT /posts/{post_id}/patch, DELETE /posts/{post_id}, GET /channels/{channel_id}/posts, GET /posts/{post_id}/thread, POST /teams/{team_id}/posts/search |
| واکنشها | POST /reactions با {"user_id", "post_id", "emoji_name"}، DELETE /users/{user_id}/posts/{post_id}/reactions/{emoji_name} |
| فایلها | POST /files (چندبخشی: channel_id و files)، سپس شناسههای برگشتی را در file_ids پیام قرار دهید؛ GET /files/{file_id} |
| ترجیحات | GET /users/me/preferences, PUT /users/me/preferences |
| یکپارچهسازیها | /hooks/incoming، /hooks/outgoing، /commands، /bots، /oauth/apps (به صفحات بعدی مراجعه کنید) |
| سرور | GET /system/ping (سلامتی، بدون نیاز به توکن)، GET /config/client?format=old (تنظیماتی که کلاینتها میبینند) |
ارسال پیام
curl -X POST https://chat.example.com/api/v4/posts \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"channel_id": "'$CHANNEL_ID'", "message": "Backup finished: **42 GB** in 3 min"}'
پیامها به صورت Markdown هستند. برای پاسخ در یک رشته، "root_id" (اولین پیام رشته) را اضافه کنید، برای فایلها "file_ids" و برای پیوستها و سایر موارد اضافی "props" (به پیوستها مراجعه کنید).
یافتن شناسه کانال
curl -H "Authorization: Bearer $TOKEN" \
https://chat.example.com/api/v4/teams/name/lumen-labs/channels/name/ops-alerts
نامها همانهایی هستند که در لینک کانال آمده است: /lumen-labs/channels/ops-alerts.
صفحهبندی
پایانههای فهرستدهنده page (از 0) و per_page (بهطور پیشفرض 60، حداکثر 200) را میپذیرند. برای دریافت صفحه بعدی درخواست بدهید تا زمانی که صفحهای کوتاهتر از per_page برگردد.
پیامهای یک کانال (GET /channels/{channel_id}/posts) نیز میپذیرند since (یک زمان: همهچیز که از آن زمان تغییر کرده است)، یا before و after (یک شناسه پیام). پاسخ بهصورت یک فهرست پیام برمیگردد: {"order": [IDs, newest first], "posts": {ID: post}, "next_post_id", "prev_post_id"}.
خطاها
خطاها از کدهای وضعیت HTTP معمول استفاده میکنند (400 ورودی نامعتبر، 401 عدم ورود، 403 عدم مجوز، 404 یافت نشد، 501 غیرفعال بودن قابلیت) و بدنه JSON:
{
"id": "api.context.permissions.app_error",
"message": "You do not have the appropriate permissions.",
"detailed_error": "",
"request_id": "jz8zm5nunpbt8f3gpqsz5dq6so",
"status_code": 403
}
در کد خود از id استفاده کنید: message به زبان کاربر ترجمه میشود. detailed_error خالی است، مگر اینکه سرور در حالت توسعهدهنده اجرا شود (ServiceSettings.EnableDeveloper). request_id را به مدیر سرور ذکر کنید: این شناسه در لاگها موجود است.
محدودیت نرخ
محدود کردن نرخ به صورت پیشفرض غیرفعال است. وقتی یک مدیر سیستم آن را فعال میکند (کنسول سیستم › محیط › محدود کردن نرخ)، هر کلاینت به صورت پیشفرض ۱۰ درخواست در ثانیه با امکان افزایش تا ۱۰۰ درخواست (burst) مجاز است؛ این شمارش بر اساس آدرس IP یا کاربر انجام میشود. پاسخها هدرهای X-RateLimit-Limit، X-RateLimit-Remaining و X-RateLimit-Reset را همراه دارند؛ در صورت عبور از حد مجاز، سرور با کد 429 و هدر Retry-After (به ثانیه) پاسخ میدهد. برخی از نقاط پایانی (endpoints)، مانند ورود به سیستم، صرفنظر از تنظیمات، محدودیت اختصاصی خود را دارند.
اسکریپتی بنویسید که در صورت دریافت 429 صبر کند و دوباره تلاش کند، و از پُلینگ (polling) خودداری کنید: به جای آن از WebSocket استفاده کنید.
جریان رویدادهای WebSocket
به wss://chat.example.com/api/v4/websocket متصل شوید. یا با هدر Authorization: Bearer در درخواست اتصال احراز هویت کنید، یا با ارسال این پیام به عنوان اولین پیام:
{"seq": 1, "action": "authentication_challenge", "data": {"token": "…"}}
سرور یک رویداد hello ارسال میکند، سپس برای هر چیزی که مجاز به مشاهده آن هستید یک رویداد میفرستد:
{
"event": "posted",
"data": {"channel_id": "…", "channel_type": "O", "post": "{\"id\":\"…\",\"message\":\"Hello\",…}"},
"broadcast": {"channel_id": "…", "team_id": "", "user_id": "", "omit_users": null},
"seq": 4
}
توجه داشته باشید که data.post همان پیام به صورت رشته JSON است. رویدادهای رایج: posted، post_edited، post_deleted، reaction_added، reaction_removed، typing، status_change، user_added، direct_added. اپلیکیشنها رویدادهای خاص خود را ارسال میکنند که با نام custom_<app id>_<event> مشخص میشوند.
شما همچنین میتوانید عملیات (actions) ارسال کنید، هر کدام با یک seq افزایشی: user_typing با {"channel_id", "parent_id"}، یا get_statuses. هنگام قطع شدن اتصال دوباره متصل شوید و آنچه را از دست دادهاید با since بازیابی کنید (به صفحهبندی مراجعه کنید).
Antimatter این رویدادها را اضافه میکند: agent_activity_changed و agent_post_stream (به عاملها مراجعه کنید)، ai_tools_changed (به عاملها مراجعه کنید)، community_rules_updated و community_rules_accepted (به قوانین جامعه مراجعه کنید)، focus_ended (به حالت تمرکز مراجعه کنید)، community_attributes_updated، member_timeouts_updated، post_put_on_top، post_removed_from_top، server_categories_updated، channel_overrides_updated و category_overrides_updated. ورود جدید به حساب کاربری خودتان، رویداد session_created را به سایر جلسات شما ارسال میکند (session_id، create_at، platform، os، browser، mobile؛ هرگز شامل توکن نیست)، و رسیدگی به هشدار آن، رویداد session_revoked یا session_acknowledged (session_id) را به همه آنها ارسال میکند.
کتابخانههای کلاینت
- برو:
model.Client4در مسیرserver/public/model(با import کردنgithub.com/mattermost/mattermost/server/public/model). ابتداmodel.NewAPIv4Client(url)را صدا بزنید، سپسclient.SetToken(token)را؛model.NewWebSocketClient4(wsURL, token)رویدادها را دنبال میکند. نسخه Antimatter روشهایی برای نقاط پایانی اختصاصی خود، مانندUpdateMessageRequest،PutPostOnTopوExportChannelاضافه کرده است. - TypeScript: کلاس
Client4از بسته@mattermost/clientدر مسیرwebapp/platform/client، با تایپهای آن درwebapp/platform/types. نسخه موجود در مخزن Antimatter شامل نقاط پایانی Antimatter است؛ اما بستهای که Mattermost در npm منتشر کرده، این موارد را ندارد.
package main
import (
"context"
"log"
"github.com/mattermost/mattermost/server/public/model"
)
func main() {
client := model.NewAPIv4Client("https://chat.example.com")
client.SetToken("…")
post, _, err := client.CreatePost(context.Background(), &model.Post{
ChannelId: "…",
Message: "Hello from Go",
})
if err != nil {
log.Fatal(err)
}
log.Println("posted", post.Id)
}
آنچه Antimatter به API اضافه میکند
این نقاط پایانی و فیلدها روی سرور Mattermost وجود ندارند. همه آنها به یک نشست (session) نیاز دارند.
| نقطه پایانی | عملکرد |
|---|---|
GET /teams/{team_id}/user_attributes/fieldsPOST همان مسیرPATCH, DELETE …/fields/{field_id} | ویژگیهای جامعه (Community attributes): فیلدهای پروفایلی که مدیران یک جامعه برای اعضایش تعریف میکنند (تا ۲۰ فیلد). اعضا میتوانند آنها را بخوانند؛ مدیران جامعه آنها را ایجاد و تغییر میدهند. |
GET /teams/{team_id}/members/{user_id}/user_attributesPATCH همان مسیرPOST /teams/{team_id}/user_attributes/values/search | مقادیر ویژگیهای یک عضو، به صورت {field_id: value}. اعضا مقادیر خود را تنظیم میکنند (به جز فیلدهای تحت مدیریت مدیران)؛ مدیران میتوانند مقادیر هر کسی را تنظیم کنند. جستجو با {"user_ids": [...]} انجام میشود (تا ۲۰۰ عضو). |
GET /teams/{team_id}/timeoutsPUT /teams/{team_id}/members/{user_id}/timeoutGET /teams/{team_id}/members/{user_id}/moderation | مهلتهای زمانی (Timeouts): {"until": time, "reason": "…"} کسی را از ارسال پیام، واکنش نشان دادن و بارگذاری فایل در جامعه تا زمان مشخص شده (حداکثر ۲۸ روز) منع میکند؛ مقدار "until": 0 این محدودیت را برمیدارد. نمای مدیریت (moderation view) زمان پیوستن و میزان ارسال پیامهای اخیر را نشان میدهد. |
GET /channels/{channel_id}/on_topPUT, DELETE /posts/{post_id}/on_top | پیامهایی که در بالای کانال نگه داشته میشوند (تا ۱۰ عدد). {"duration": ms}، حداکثر ۳۰ روز؛ مقدار ۰ یعنی تا زمانی که حذف نشود باقی بماند. هر کسی که میتواند کانال را بخواند، این پیامها را فهرست میکند. قرار دادن پیام در بالا یا برداشتن آن نیازمند حق ارسال پیام در کانال است و در کانالهای یک جامعه، باید مدیر کانال یا جامعه باشید یا در آنجا مدیریت پیامها (delete_others_posts) داشته باشید. در پیامهای مستقیم یا گروهی، اعضا میتوانند این کار را انجام دهند. در کانالهای بایگانیشده این کار رد میشود. |
GET, PUT /teams/{team_id}/rulesPOST /teams/{team_id}/rules/acceptGET /teams/{team_id}/rules/stats | قوانین جامعه: به قوانین جامعه مراجعه کنید. |
GET, POST, DELETE /users/me/focusGET /users/me/focus/summary?since=&until=POST /users/me/focus/summary/read | حالت تمرکز: به حالت تمرکز مراجعه کنید. |
POST /channels/{channel_id}/message_request | روی درخواست پیام شما عمل میکند: {"action": "accept"}، "dismiss"، یا "request" برای بازگرداندن یک مکالمه به میان درخواستها. عضو کانال شما را برمیگرداند. |
GET, PUT /channels/{channel_id}/overridesGET /channels/{channel_id}/overrides/effectiveGET, PUT /channels/{channel_id}/role_access | آنچه یک نقش یا یک شخص میتواند در یک کانال انجام دهد، و اینکه کدام نقشها به کانالهای محدودشده با نقش دسترسی دارند. |
GET, PUT /teams/{team_id}/server_categoriesGET, PUT …/server_categories/overrides | دستههای کانالهای مشترک جامعه و استثناهایی که به همه کانالهای یک دسته اعمال میشوند. |
GET /groups/{group_id}/team_rolePUT …/team_role/permissions | دسترسیهایی که یک نقش جامعه اعطا میکند. |
POST /teams/{team_id}/autolinks/preview | قوانین خودکارلینک جامعه را روی یک متن آزمایش میکند. |
POST /channels/{channel_id}/export?format=csv&since=&until= | پیامهای یک کانال را بهصورت CSV (تا ۵۰,۰۰۰ پیام) دانلود میکند؛ برای کسانی که میتوانند کانال را بخوانند. |
GET /posts/{post_id}/speech | پیام بهصورت صوتی که هنگام پیکربندی تبدیل متن به گفتار پخش میشود. |
POST /posts/{post_id}/move_to_channel | یک رشته را به کانال دیگری در همان جامعه منتقل میکند: به جابجایی یک رشته مراجعه کنید. |
GET, POST /ai/connectionsGET, PATCH, DELETE /ai/connections/{connection_id}GET /ai/connections/usable | اتصال مدلها، ارائهدهندگان هوش مصنوعی که ویژگیها و اپلیکیشنهای هوش مصنوعی سرور از آنها استفاده میکنند: به اتصال مدلها مراجعه کنید. |
GET, POST /ai/agentsGET, PATCH, DELETE /ai/agents/{agent_id}POST /ai/agents/{agent_id}/tasksGET /ai/agents/conversations | عاملهای هوش مصنوعی، فعالیت آنها و وظایف و مکالمات چت هوش مصنوعی: به عاملها مراجعه کنید. |
GET /ai/agents/{agent_id}/toolsGET /ai/agents/tools/cataloguePOST /ai/tools/calls/{call_id}/confirm, /declineGET, POST /ai/mcp_serversGET, PATCH, DELETE /ai/mcp_servers/{server_id}POST, DELETE /ai/mcp_servers/{server_id}/oauth | ابزارهای یک عامل، فهرست ابزارهایی که ممکن است استفاده کند، تأیید یا رد یک فراخوانی ابزار در انتظار، و سرورهای MCP در دسترس برای عاملها: به هوش مصنوعی مراجعه کنید. |
GET /channels/{channel_id}/message_actionsPOST /posts/{post_id}/message_actions/{hook_id}GET, POST /hooks/outgoing/{hook_id}/icon | عملیات پیام: وبهوکهای خروجی که افراد از منوی پیام اجرا میکنند. به عملیات پیام مراجعه کنید. |
POST /users/me/sessions/acknowledge | هشدار ورود جدید برای یکی از جلسات خودتان را رد میکند: {"session_id"}. فقط کاربر وارد شده میتواند این را برای جلسات خود فراخوانی کند. |
PUT /channels/{channel_id}/type | پیشتنظیم یا تنظیمات یک کانال را تغییر میدهد: به انواع کانال مراجعه کنید. |
GET /channels/{channel_id}/topicsPATCH /posts/{post_id}/topic | موضوعات یک انجمن و پذیرش پاسخ یا تعیین وضعیت موضوع: به انواع کانال مراجعه کنید. |
فیلدهای جدید
- جوامع (
TeamوPUT /teams/{team_id}/patch):all_channels_membership(همه در تمام کانالهایی که میبینند عضو هستند)،default_channel_id(کانالی که تازهواردها به آن هدایت میشوند)،welcome_channel_id(کانالی که پیامهای پیوستن و خروج به آن ارسال میشود؛ خالی به معنای عدم ارسال)،kind(communityیاworkplaceکه در رابط کاربری به ترتیب با نامهای Guild و Workspace نمایش داده میشوند: نوع guild همچنین گزینهall_channels_membershipرا فعال میکند؛ جوامع جدید از مقدارTeamSettings.DefaultCommunityKindسرور استفاده میکنند که به طور پیشفرضcommunity/Guild است)،member_list_view(نحوه گروهبندی اعضا در لیست اعضا:choiceکه پیشفرض است و به هر عضو اجازه انتخاب میدهد؛rolesیاteamsآن را ثابت میکند)،hide_role_colors،require_team_badges،name_display(نحوه نمایش افراد توسط جامعه؛ خالی به معنای استفاده از پیشفرض سرور)،onboardingوautolinks(هر دو رشته JSON). - کانال پیشفرض یک جامعهٔ جدید
general(General) است، نهtown-square. ارتقا به نسخهٔ 0.9.0،town-squareهر جامعه را بهgeneralتغییر نام میدهد و شناسهٔ آن را حفظ میکند، مگر اینکه جامعه از قبل یک کانالgeneralداشته باشد. نامهای قدیمی همچنان کار میکنند:GET /teams/{team_id}/channels/name/town-square،GET /teams/name/{team}/channels/name/town-squareوchannelیک وبهوکِ ورودی، در صورتی که کانالی با آن نام وجود نداشته باشد، کانال پیشفرض جامعه را برمیگردانند. در کدهای جدید ازdefault_channel_idیا نامgeneralاستفاده کنید. - پیوندهای کانال:
#channel-nameیک کانال را پیوند میزند، همانطور که~channel-nameانجام میدهد. خاصیتchannel_mentionsیک پست، کانالهایی را که به هر دو روش پیوند خوردهاند فهرست میکند؛ یک#wordکه نام کانالی را نشان نمیدهد، یک هشتگ باقی میماند. رابط وب و اپلیکیشن موبایل Antimatter از#nameاستفاده میکنند. - کانالهای آرشیو شده همچنان اعضای جدید میپذیرند (
POST /channels/{channel_id}/members) و آنها میتوانند تاریخچه را بخوانند. هیچکس نمیتواند در آنها پیام بفرستد، واکنش بگذارد، پین کند، پیامی را به بالا ببرد، نام کانال را تغییر دهد یا نقشهای اعضا را تغییر دهد. - پاسخهای درونمتنی: پستی با
"props": {"reply_to": "<post id>"}پیام همان کانال را نقل میکند. برای اینکه نویسنده آن پیام اعلان دریافت نکند،"reply_to_mention": falseرا اضافه کنید. سرورmetadata.reply_toرا با یک توضیح کوتاه از پیام نقلشده پر میکند. - اسپویلرها:
"props": {"spoiler": true}متن و فایلهای یک پست را تا زمانی که خواننده بخواهد آنها را ببیند، پنهان میکند. - نادیدهگرفتن و مسدودکردن ترجیحات کاربری هستند: دسته
user_block، نامگذاریشده بر اساس شناسه شخص دیگر، با مقدارignoreیاblock. اینکه آیا یک پیام مستقیم بهصورت درخواست در انتظار میماند یا نه، درnotify_props.dm_requestعضو کانال شما مشخص است (pending،acceptedیاdismissed). - پیوستهای پیام میتوانند
stagesو یکchartداشته باشند: به کارتها مراجعه کنید. - کانالها (
Channel): درpropsهر کانال جامعه، همیشهam_type(text،voiceیاforum)،am_mode،am_root_posts(membersیاmoderators) وam_preset(شناسه پیشتنظیم مطابقتدار یا خالی برای تنظیمات سفارشی) وجود دارد. برای انجمنها،am_forum_view(topicsیاimageboard) نیز وجود دارد. نبودam_typeدر یک بارگذاری (payload) به این معناست که مقدار آن پر نشده است، نه اینکه کانال از نوع متنی است. پیامهای مستقیم و گروهی هیچکدام از این مقادیر را ندارند. به انواع کانال مراجعه کنید.
انواع کانال
یک کانال جامعه از نوع text، voice یا forum است (نوع آن هنگام ایجاد تعیین میشود و قابل تغییر نیست)، در یکی از حالتهای آن نوع، با تنظیمات اضافه. یک پیشتنظیم (Preset) یک بسته نامدار از حالت و تنظیمات است که کلاینت آن را به عنوان یک گزینه واحد ارائه میدهد؛ پیشتنظیمها ذخیره نمیشوند، بنابراین پیشتنظیم یک کانال (am_preset) از تنظیمات آن مشتق میشود و اگر با هیچ پیشتنظیمی مطابقت نداشته باشد، مقدار "" را برمیگرداند (که به معنای «سفارشی» است).
| شناسه پیشتنظیم | نوع | حالت | root_posts | view |
|---|---|---|---|---|
text_chat | text | chat | members | – |
text_announcement | text | chat | moderators | – |
voice_talk | voice | talk | members | – |
voice_stage | voice | stage | members | – |
forum_agora | forum | discussion | members | topics |
forum_qa | forum | qa | members | topics |
forum_ideas | forum | ideas | members | topics |
forum_announcement | forum | discussion | moderators | topics |
forum_imageboard | forum | discussion | members | imageboard |
ایجاد و تغییر نوع کانال
POST /channels ابتدا props.am_preset را (پس از بسط دادن) و سپس props.am_type، am_mode، am_root_posts و am_forum_view را بهعنوان تنظیمات فردی روی آن اعمال میکند؛ هر am_ دیگری نادیده گرفته میشود. ایجاد کانال صوتی زمانی که اپلیکیشن کانالهای صوتی فعال نیست، رد میشود (400 api.channel.type.voice_unavailable.app_error)؛ همچنین ایجاد پیام مستقیم یا پیام گروهی با ویژگیهای نوع کانال رد میشود (api.channel.type.direct.app_error).
curl -X POST https://chat.example.com/api/v4/channels \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"team_id": "'$TEAM_ID'", "name": "help-desk", "display_name": "Help desk", "type": "O",
"props": {"am_preset": "forum_qa"}}'
PUT /channels/{channel_id}/type پیشتنظیم یا تنظیمات یک کانال موجود را تغییر میدهد: {"preset"?, "mode"?, "root_posts"?, "view"?}، که پیشتنظیم ابتدا همانند زمان ایجاد باز میشود. این عمل نیازمند مجوز manage_public_channel_properties یا manage_private_channel_properties در کانال است (رویداد ممیزی updateChannelType) و کانال تکمیلشده را برمیگرداند. بدنهای که type دیگری را نامگذاری کند رد میشود (api.channel.type.fixed.app_error): خود نوع هرگز تغییر نمیکند. خطاهای دیگر: api.channel.type.invalid.app_error (یک مقدار ناشناخته، حالتی که با نوع کانال سازگار نیست، یا یک نمای مربوط به غیر انجمن).
واردات و صادرات انبوه (amctl import bulk) همان چهار فیلد را در خط مربوط به کانال حمل میکنند: am_type، am_mode، am_root_posts، am_forum_view. خط کانالی که این فیلدها را نداشته باشد، به عنوان یک کانال چت متنی ساده وارد میشود، همانند قبل از وجود انواع کانال.
چه کسی مکالمات را شروع میکند یا موضوعات را باز میکند
برای ارسال پیام اصلی (در مقابل پاسخ) به مجوز create_root_post نیاز است که در ویرایشگر لغوها به صورت شروع گفتگوها (متن، صوتی) یا باز کردن موضوعات (انجمنها) نمایش داده میشود. هیچ نقشی این مجوز را به صورت پیشفرض ندارد: قبل از اعمال لغوها، همه کسانی که اجازه ارسال دارند، در کانالهایی که مقدار root_posts برابر با members است، این مجوز را دارند و تنها مدیران کانال (مدیران سیستم، مدیران انجمن، مدیران کانال و هر کسی که مجوز مدیریت پیامها را دارد) در کانالهایی که مقدار آن moderators است، این مجوز را دارند. سپس لغو مجوز برای یک نقش یا فرد خاص روی create_root_post اعمال میشود، همانطور که برای هر مجوز دیگری اعمال میشود. برای ارسال پاسخ (که root_id در آن تنظیم شده است) تنها حق معمولی ارسال پیام لازم است.
اگر پست ریشهای این شرط را برآورده نکند، خطای 403 با کد app.post.root_posts.moderators_only.app_error زمانی رخ میدهد که root_posts روی moderators تنظیم شده باشد و ارسالکننده مدیر کانال نباشد، یا خطای app.post.root_posts.denied.app_error برای رد کردن با اولویت بالاتر. این بررسی برای API استراحتی، رباتها، وبهوکهای ورودی و خروجی (برای ایجادکننده وبهوک) و پاسخهای دستور اسلش انجام میشود؛ اما برای پستهای ارسالشده توسط برنامهها (از طریق API افزونه) و کپیهای یک رشته منتقلشده انجام نمیشود (در عوض، فرد منتقلکننده رشته بررسی میشود). وارد کردن انبوه نیز از این بررسی صرفنظر میکند.
فرومها فقط موضوع را میپذیرند
در یک فروم، پست ریشهای نیاز به props.am_thread_title (عنوان موضوع آن) دارد که باید بدون فاصلههای اضافی (trimmed)، بین ۱ تا ۱۰۰ کاراکتر باشد و از هر منبعی (شامل برنامهها و رشتههای منتقلشده) ارسال شود. اگر عنوان وجود نداشته باشد، خطای 400 app.post.forum.title_required.app_error و اگر طول آن بیش از حد باشد، خطای app.post.forum.title_too_long.app_error رخ میدهد. پاسخها به عنوان نیاز ندارند و هر عنوانی که همراه با پاسخ ارسال شود، نادیده گرفته میشود. ویرایش پست ریشهای یک موضوع بدون عنوان یا با عنوان خالی، عنوان موجود آن را حفظ میکند؛ اما عنوان غیرخالی باعث تغییر نام آن میشود. انتقال یک رشته به داخل یک فروم (در ادامه) نیز نیاز به عنوان دارد، که از درخواست یا از خود رشته گرفته میشود.
پاسخ پذیرفتهشده برای یک موضوع پرسش و پاسخ (am_accepted_answer، که شناسه یک پاسخ است) و وضعیت یک موضوع ایده (am_topic_status، همراه با am_topic_status_by و am_topic_status_at) تنها از طریق PATCH /posts/{post_id}/topic نوشته میشوند. اگر هر یک از این سه فیلد هنگام ایجاد، بهروزرسانی یا پچ (patch) توسط یک کلاینت یا برنامه ارسال شود، نادیده گرفته میشود و مقدار ذخیرهشده حفظ میگردد.
فهرست کردن موضوعات یک فروم
GET /channels/{channel_id}/topics?sort=votes&per_page=25
نیاز به حق خواندن کانال دارد. پارامترهای پرسش (Query parameters):
sort:activity(پیشفرض)،newest،votes،unanswered(فقط برای پرسش و پاسخ) یاstatus(فقط برای ایدهها).answered(true/false، برای پرسش و پاسخ) وstatus(یکی ازopen،planned،in_progress،done،declined، برای ایدهها): برای فیلتر کردن بر اساس این موارد استفاده کنید. استفاده از هر یک خارج از حالت مربوطه منجر به خطای400میشود.mine=true: فقط موضوعاتی که شما شروع کردهاید.following=true: فقط موضوعاتی که آنها را دنبال میکنید.q: با عنوان یا متن اولین پست مطابقت دارد، تا حداکثر ۲۰۰ کاراکتر.before: مقدارnext_cursorصفحهی قبلی.per_page: بهطور پیشفرض ۲۵، حداکثر ۱۰۰.replies: ۰ تا ۵ پاسخ آخر هر موضوع، برای نمای تابلوی اعلانات.
پاسخ: {"topics": [{"post", "reply_count", "last_reply_at", "participant_ids", "votes", "accepted_answer_id", "status", "on_top", "replies": [post, …]}], "next_cursor"}. آرا واکنشهای 👍 هستند (که +1 و thumbsup با هم شمرده میشوند)، منهای نویسندهی خودِ موضوع؛ accepted_answer_id فقط در انجمنهای پرسش و پاسخ داده میشود و status فقط در انجمنهای ایدهها. موضوعات پینشده در بالای کانال ابتدا نمایش داده میشوند.
پذیرش یک پاسخ، یا تعیین وضعیت یک موضوع
curl -X PATCH https://chat.example.com/api/v4/posts/$POST_ID/topic \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"accepted_answer_id": "'$REPLY_ID'"}'
post_id باید پست ریشهی یک موضوع انجمنی باشد، در غیر این صورت خطای 400 app.topic.not_a_topic.app_error رخ میدهد. accepted_answer_id (شناسهی یک پاسخ، یا "" برای لغو آن) نیازمند یک انجمن پرسش و پاسخ است؛ status نیازمند یک انجمن ایدهها است؛ استفاده از هر کدام در حالت نادرست منجر به خطای 400 app.topic.mode.app_error میشود.
- پذیرش یک پاسخ: فقط پرسشگر موضوع (در صورتی که هنوز اجازهی ارسال پست داشته باشد) یا یک مدیر کانال میتواند این کار را انجام دهد؛ در غیر این صورت خطای
403 app.topic.accept.not_allowed.app_errorرخ میدهد. پاسخ باید یک پاسخ فعال و غیرسیستمی از همان موضوع باشد، در غیر این صورت خطای400 app.topic.accept.not_a_reply.app_errorرخ میدهد. حذف پاسخ پذیرفتهشده، وضعیت «پاسخ پذیرفتهشده» را پاک میکند. - تعیین وضعیت: فقط مدیران کانال مجاز به این کار هستند، در غیر این صورت خطای
403 app.topic.status.not_allowed.app_errorرخ میدهد؛ مقدار ناشناخته منجر به خطای400 app.topic.status.invalid.app_errorمیشود.
هر تغییر، یک پاسخ سیستمی در موضوع (به اطلاعرسانی به دنبالکنندگان آن) ثبت میکند و پست ریشهی موضوع را به وضعیت جدید پاسخ میدهد. در انجمن ایدهها، رأی دادن به یک موضوع شما را به دنبالکنندهی آن تبدیل میکند.
جابهجایی یک رشته
POST /posts/{post_id}/move_to_channel یک رشته، پیام اول آن و تمام پاسخهایش را به کانال دیگری در همان جامعه منتقل میکند. post_id میتواند پیام اول یا هر پاسخ دیگری باشد.
curl -X POST https://chat.example.com/api/v4/posts/$POST_ID/move_to_channel \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"channel_id": "'$TARGET_CHANNEL_ID'", "flatten": false}'
channel_id(الزامی): کانالی که رشته به آن منتقل میشود.flatten(پیشفرضfalse): مقدارtrueباعث میشود پاسخها به جای تشکیل یک رشته، پیامهایی در کانال مقصد باشند. گزینهی تبدیل به کانال در Fusion از این قابلیت استفاده میکند. اگر مقصد یک انجمن باشد، این عملیات رد میشود (400 app.post.move_thread.forum_flatten.app_error)، زیرا پاسخها به موضوعاتی بدون عنوان تبدیل میشدند.title: عنوان موضوع، زمانی که مقصد یک انجمن است. اگر این مقدار ارائه نشود، عنوان خودِ رشته (در صورت وجود) حفظ میشود؛ نبودِ عنوان در هر دو حالت منجر به خطای400 app.post.move_thread.forum_title_required.app_errorمیشود. برای مقصدی که انجمن نیست، نادیده گرفته میشود.
پیامها نویسنده، زمان، واکنشها و فایلهای خود را حفظ میکنند. رونوشتهای آنها خاصیت silent_notification را دارند، بنابراین هیچکس را مطلع نمیکنند. پیامهای اصلی حذف میشوند. پاسخ، پیام اولِ جابهجا شده با شناسهٔ جدیدش است.
چه کسانی میتوانند یک رشته را جابهجا کنند
- باید بتوانید رشته را بخوانید و در کانال مقصد پیام بفرستید.
- مدیران کانال، مدیران جامعه، افرادی که در کانال مدیریت پیامها (
delete_others_posts) دارند و مدیران سیستم میتوانند هر رشتهای را جابهجا کنند. - نویسندهٔ رشته میتواند آن را جابهجا کند اگر هر دو کانال عمومی باشند، یا اگر تمام پیامهای رشته متعلق به او باشند. در غیر این صورت پاسخ
403با شناسهٔapi.post.move_thread.private_needs_moderator.app_errorاست. - هر دو کانال باید در یک جامعه (نه پیام مستقیم یا گروهی) باشند، با هم متفاوت باشند و بایگانی نشده باشند. پیامهای سیستمی و پیامهای یکبار مصرف قابل جابهجایی نیستند.
- رشتهای که طول آن از
WranglerSettings.MoveThreadMaxCountپیام (بهطور پیشفرض ۱۰۰؛ ۰ برای بدون محدودیت) بیشتر باشد، رد میشود.
اشاره و یادداشت
جابهجایی دو پیام سیستمی از نوع system_wrangler باقی میگذارد: یک اشاره در کانال مبدأ ("رشتهای با ۱۳ پیام به #target جابهجا شده است") و یک یادداشت در مقصد ("این رشته از #source جابهجا شده است")، زیر رشته جابهجا شده یا، با flatten، بعد از پیامهای آن. علاوه بر متن پیام، ویژگیهای (props) آنها به کلاینت اجازه میدهند نام کانال را بهصورت پیوند نمایش دهد:
- اشاره:
MovedThreadPermalink،NumMessages،MovedThreadChannelId،MovedThreadTeamName،MovedThreadPostIdو، برای مقصد عمومی،MovedThreadChannelNameوMovedThreadChannelDisplayName. - یادداشت:
MovedFromChannelId،MovedFromTeamName،MovedFromPostId(اشاره)،MovedFromPermalinkو، برای مبدأ عمومی،MovedFromChannelNameوMovedFromChannelDisplayName.
هر دو همچنین دارای TranslationID هستند. نام کانال خصوصی حذف میشود: خوانندگان «یک کانال دیگر» را میبینند. POST /posts/{post_id}/move خود Mattermost در Antimatter غیرفعال است؛ از این نقطه پایانی (endpoint) استفاده کنید.
قوانین انجمن
مدیران یک جامعه میتوانند اعضا را ملزم کنند که قبل از ارسال پیام در کانالهای آن، با قوانین موافقت کنند. تا زمانی که قوانین فعال هستند، عضوی که با نسخه فعلی موافقت نکرده است، نمیتواند پیامی ارسال کند، پاسخی بدهد، فایلی بفرستد، پیامی را زمانبندی کند، پیامی را ویرایش یا بازگرداند، یا دستوری را اجرا کند که منجر به ارسال پیام در کانالهای جامعه شود؛ در این حالت سرور با کد 403 و شناسه api.post.community_rules_not_accepted پاسخ میدهد و پیام زمانبندیشدهای که در آن زمان باید ارسال میشد، با کد خطای community_rules_not_accepted شکست میخورد. خواندن پیامها، واکنشها، پیامهای مستقیم و گروهی محدود نمیشوند؛ همچنین رباتها، وبهوکهای ورودی، پیامهای سیستمی و مدیران جامعه (با مجوز manage_team که مدیران سیستم نیز دارند) از این محدودیت معاف هستند.
| نقطه پایانی | عملکرد |
|---|---|
GET /teams/{team_id}/rules | قوانین (enabled، text به صورت Markdown، version)، همراه با آخرین نسخهای که با آن موافقت کردهاید (accepted_version) و اینکه آیا قبل از ارسال پیام باید موافقت کنید (must_accept). برای اعضا و برای هر کسی که ممکن است به یک جامعه باز بپیوندد. |
PUT /teams/{team_id}/rules | آنها را با {"enabled", "text", "ask_again"} ذخیره میکند (manage_team). ask_again نسخه جدیدی ایجاد میکند که همه باید دوباره با آن موافقت کنند؛ اولین ذخیرهسازی نسخه ۱ است. متن برای فعال کردن قوانین الزامی است و حداکثر ۱۶,۰۰۰ کاراکتر میتواند داشته باشد. |
POST /teams/{team_id}/rules/accept | به عنوان عضو، با versionای که خواندهاید موافقت میکند؛ اگر از آخرین ذخیرهسازی نسخه جدیدتری وجود داشته باشد، کد 409 برمیگرداند و مقدار ۰ به معنای موافقت با نسخه فعلی است. |
GET /teams/{team_id}/rules/stats | تعداد اعضایی از جامعه که با نسخه فعلی موافقت کردهاند (manage_team). |
رویداد community_rules_updated به جامعه ارسال میشود زمانی که یک مدیر قوانین را ذخیره میکند (team_id، enabled، version)، و رویداد community_rules_accepted به کسی که موافقت کرده است، در تمام جلساتش ارسال میشود (team_id، version).
حالت تمرکز
حالت تمرکز همان «مزاحم نشوید» با یک زمان پایان است: اعلانها بیصدا میشوند (هیچ اعلان push، ایمیل، دسکتاپ یا ماندگاری، از جمله پیامهای فوری، ارسال نمیشود)، دلیل به عنوان وضعیت سفارشی با ایموجی 🎯 (dart) تنظیم میشود که در زمان پایان منقضی میشود، و اپلیکیشنهای Antimatter نشانهای خواندهنشده خودِ فرد را پنهان میکنند. فقط خودِ فرد میتواند از این نقاط پایانی استفاده کند (me یا شناسه خودش)؛ هیچ کس دیگر، از جمله مدیران سیستم، اجازه ندارد حالت تمرکز یا خلاصه آن را برای کسی شروع، پایان یا خوانده شود.
| نقطه پایانی | عملکرد |
|---|---|
GET /users/me/focus | حالت تمرکز فعلی (active، start_at، end_at، reason)، یا آخرین حالت تمرکز پس از پایان آن (ended_at تنظیم شده است)، یا همه مقادیر صفر. |
POST /users/me/focus | تمرکز را شروع میکند، یا در حین تمرکز، پایان و دلیل آن را تغییر میدهد: {"duration": "1h30m", "reason": "…"}، یا به جای مدت زمان، {"end_at": ms} را از یک دقیقه تا یک هفته بعد مشخص میکند. "duration": "tomorrow" در ساعت ۰۹:۰۰ روز بعد در منطقه زمانی کاربر تمام میشود. زمان پایان به دقیقه گرد میشود؛ حداکثر طول دلیل ۱۰۰ نویسه است. نیازمند فعال بودن وضعیت کاربران (ServiceSettings.EnableUserStatuses) است؛ رباتها نمیتوانند در حالت تمرکز باشند. |
DELETE /users/me/focus | تمرکز را اکنون پایان میدهد. |
GET /users/me/focus/summary?since=&until= | آنچه در آن بازه زمانی از دست رفته است (شامل start_at و ended_at یک تمرکز): کانالهایی با پیامهای خواندهنشده از دیگران (ابتدا پیامهای مستقیم و گروهی، سپس آنهایی که اشاره دارند؛ کانالهای بیصدا فقط در صورت داشتن اشاره)، و با رشتههای پاسخ جمعشده، رشتههای دنبالشده با پاسخهای جدید، هر کدام با تعداد پاسخها، اشارهها و آخرین فرستنده. |
POST /users/me/focus/summary/read | با {"since", "until"}: آن کانالها و رشتهها را فقط تا until خواندهشده علامت میزند؛ آنچه بعد از آن آمده، خواندهنشده باقی میماند. |
در حین تمرکز یک کاربر، کاربر او دارای ویژگی focus_until (میلیثانیه) است که کلاینتها از آن برای نمایش وضعیت تمرکز استفاده میکنند؛ این مقدار از طریق پروفایل قابل تغییر نیست. تمرکز زمانی پایان مییابد که کاربر آن را پایان دهد، زمان آن فرا برسد (در عرض یک دقیقه)، یا کاربر خودش وضعیتی را انتخاب کند که در آن صورت همان وضعیت باقی میماند. در غیر این صورت، وضعیت و وضعیت سفارشی قبلی بازگردانده میشوند. سپس تمام جلسات کاربر رویداد focus_ended را با start_at، end_at و ended_by (user، timer یا status) دریافت میکنند.
اتصالات مدل
اتصال مدل، آدرس و کلید ارائهدهنده هوش مصنوعی است که توسط مدیر تنظیم میشود. قابلیتهای هوش مصنوعی سرور و برنامههایی که از سرویس هوش مصنوعی استفاده میکنند، از آنها بهره میبرند. مدیران سیستم اتصالات سراسری سرور را مدیریت میکنند (manage_ai_connections)؛ مدیران یک جامعه، اتصالات مخصوص جامعه خود را مدیریت میکنند (manage_team_ai_connections). کلیدها فقط برای نوشتن هستند: هیچ پاسخی یکی را حمل نمیکند، فقط api_key_set و api_key_last4.
| نقطه پایانی | عملکرد |
|---|---|
GET /ai/connections?scope= | اتصالاتی که شما مدیریت میکنید. scope یا server است یا شناسه یک جامعه؛ بدون آن، همه دامنههایی که مدیریت میکنید. |
POST /ai/connections | یک اتصال اضافه میکند (پاسخ 201 را برمیگرداند). |
POST /ai/connections/test, POST /ai/connections/models | قبل از ذخیره، یک اتصال را آزمایش میکند یا مدلهای آن را فهرست میکند. بدنه (body) همان افزودن است؛ چیزی ذخیره نمیشود. |
GET، PATCH (یا PUT)، DELETE /ai/connections/{connection_id} | یک اتصال را میخواند، تغییر میدهد یا حذف میکند. یک patch فقط فیلدهایی را که باید تغییر کنند حمل میکند؛ برای حفظ کلید، api_key را حذف کنید. |
POST /ai/connections/{connection_id}/test | یک اتصال ذخیرهشده را آزمایش میکند: {"ok", "error", "status_code", "latency_ms", "model_count"}. |
GET /ai/connections/{connection_id}/models | مدلهایی که ارائهدهنده در اختیار میگذارد. |
GET /ai/connections/{connection_id}/usage | درخواستها و توکنهای این ماه. |
GET /ai/connections/usable?channel_id=&team_id= | برای هر کسی که وارد شده است: اتصالاتی که میتوانید از آنها استفاده کنید، همراه با مدلها و قابلیتهایشان، اما هرگز کلیدها یا آدرسهایشان. |
بدنه یک اتصال جدید:
{
"name": "Local models",
"scope": "server",
"provider": "openai_compatible",
"base_url": "http://llm.internal:8000/v1",
"api_key": "…",
"extra_headers": {},
"models": {"chat": "qwen3-32b", "embeddings": "", "transcription": "", "decisions": ""},
"limits": {"requests_per_minute": 0, "monthly_token_budget": 0, "per_user_requests_per_minute": 0, "per_user_monthly_token_budget": 0},
"sharing": {"all_teams": true, "team_ids": []},
"audience": {"everyone": true, "group_ids": [], "roles": [], "allow_guests": false}
}
provider یا openai_compatible است یا anthropic. مقدار پیشفرض scope برابر با server است؛ اگر شناسه یک جامعه را وارد کنید، اتصال به آن جامعه اختصاص مییابد. در بخش limits، مقدار 0 به معنای عدم وجود محدودیت است؛ درخواستها در دقیقه برای هر سرور بهشمار میروند و بودجه توکنها برای کل خوشه بر اساس ماه تقویمی (UTC) محاسبه میشود. sharing مشخص میکند کدام جوامع میتوانند از اتصال کل سرور استفاده کنند (برای پیامهای مستقیم و گروهی، all_teams لازم است) و audience مشخص میکند چه کسانی میتوانند از آن استفاده کنند؛ مهمانها فقط در صورت فعال بودن allow_guests. تغییرات در گزارش ممیزی ثبت میشوند. راهنمای مدیران این تنظیمات را توضیح میدهد: هوش مصنوعی را ببینید.
عاملها
یک عامل، حساب رباتی از نوع agent است (با is_agent روی کاربر آن)، همراه با تنظیماتش: دامنه آن (server، یا شناسه یک جامعه)، داخلی یا external، و برای یک عامل داخلی، اتصال مدل، مدل، پرامپت سیستمی و استدلال آن. مدیران سیستم، عاملهای سطح سرور را مدیریت میکنند (manage_system)، و مدیران یک جامعه، عاملهای جامعه خود را (manage_team)؛ علاوه بر این، manage_own_agent برای عاملی که خودشان ساختهاند و manage_others_agent برای سایرین. شناسه عامل در این مسیرها، شناسه کاربری آن است. اجرای یک عامل خارجی و نحوه تعیین وضعیت یک عامل داخلی در رباتها توضیح داده شده است؛ PUT /users/{user_id}/status و پایانههای وضعیت سفارشی، شناسه یک عامل داخلی را رد میکنند، حتی برای مدیران سیستم (403، api.status.agent.app_error).
| نقطه پایانی | عملکرد |
|---|---|
GET /ai/agents?scope= | عاملهایی که مدیریت میکنید: scope برابر با server یا شناسه یک جامعه است؛ در صورت نبود این پارامتر، تمام عاملهایی که مدیریت میکنید. |
POST /ai/agents | یک عامل و حساب کاربری آن را ایجاد میکند (پاسخ 201). عامل یک جامعه به آن جامعه میپیوندد. |
GET, PATCH, DELETE /ai/agents/{agent_id}POST …/enable, POST …/disable | خواندن، تغییر، حذف (حساب کاربری آن غیرفعال میشود، اما پیامهایش باقی میمانند)، و روشن یا خاموش کردن یک عامل. |
GET /ai/agents/connections?scope=GET /ai/agents/connections/{connection_id}/models | اتصالات مدل که یک عامل با آن دامنه میتواند استفاده کند، و مدلهای آن اتصالات. |
GET, PUT /ai/agents/{agent_id}/activityPOST /ai/agents/activity/ids | وضعیت فعلی عامل؛ توسط توکن خود عامل یا مدیران آن تعیین میشود. درخواست دستهای حداکثر تا ۲۰۰ شناسه کاربر را میپذیرد. |
POST /ai/agents/{agent_id}/tasks | از یک عامل داخلی که مجاز به استفاده از آن هستید برای انجام یک وظیفه درخواست میکند: summarize_thread، find_action_items یا find_open_questions (بر اساس post_id یک رشته، یا channel_id از since به بعد)، summarize_channel، ask_channel (با یک question) یا summarize_transcription (پست متننویسی یک مکالمه). درخواست به صورت پیام شما در پیام مستقیمتان با آن عامل، به زبان شما تبدیل میشود و در همانجا پاسخ داده میشود؛ پاسخ (201) همان پیام است. اگر به پست یا کانالی دسترسی خواندن نداشته باشید، پاسخ به صورت «وجود ندارد» داده میشود. |
GET /ai/agents/conversations?agent_id=&before=&per_page= | گفتگوهای شما با عاملهایی که مجاز به استفاده از آنها هستید، از جدیدترین به قدیمیترین: رشتههایی که در پیامهای مستقیمتان با آنها شروع کردهاید، و رشتههای دیگری که یکی از آنها در آنها پاسخ داده و شما آنها را دنبال میکنید. پارامتر before (یک زمان) صفحه بعدی را برمیگرداند؛ per_page حداکثر ۱۰۰ است. |
بدنه یک عامل جدید:
{
"username": "researcher",
"display_name": "Researcher",
"description": "Answers with sources",
"scope": "server",
"external": false,
"connection_id": "…",
"model": "",
"system_prompt": "You research questions and answer with sources.",
"reasoning": {"enabled": false, "effort": "", "budget_tokens": 0},
"max_tool_turns": 0,
"access": {"everyone": true, "team_ids": [], "channel_ids": [], "roles": [], "user_ids": [], "allow_guests": false}
}
اگر model خالی باشد، از مدل چتِ اتصال استفاده میشود. access.channel_ids به معنای اعضای آن کانالها است. یک عامل خارجی هیچ اتصال، مدل یا دستور سیستمی ندارد. GET /agents لیست عاملهایی که میتوانید با آنها صحبت کنید را به همان شکلی که اپلیکیشن چت هوش مصنوعی آنها را میخواند، ارائه میدهد.