A REST API
Minden, amit az Antimatter-alkalmazások végeznek, ugyanazon HTTP API-n keresztül történik, így a szkriptjeid is ugyanígy használhatják. Ez az oldal elmagyarázza, hogyan hitelesítsd a kéréseidet, melyek a leggyakrabban használt erőforrások, hogyan néznek ki a válaszok és a hibák, valamint hogyan követheted az eseményeket élőben a WebSocket-en keresztül.
Alapok
- Alap URL:
https://chat.example.com/api/v4. Az alábbi végpontok mind ehhez viszonyítva vannak megadva. - Formátum: bemenet és kimenet is JSON, kivéve a fájlfeltöltéseket (multipart). Küldd a
Content-Type: application/jsonfejlécet. - Azonosítók: minden objektum rendelkezik egy 26 karakteres
id-val. Az idők a Unix-epoch óta eltelt milliszekundumokban vannak megadva (create_at,update_at,delete_at; a 0 azt jelenti, hogy „nem törölve”). - A közösségek csapatok: az API
teamsnéven hivatkozik rájuk,team_idazonosítóval. - Önmagad: bárhová, ahol a útvonal egy
user_id-t vár, amea bejelentkezett felhasználót jelenti, ahogy aGET /users/mepéldában is.
A végpontok teljes listája a szerver kódjában található: az útvonalakat a server/channels/api4/*.go mappában, a típusokat pedig a server/public/model mappában deklarálják. A repozitóriumban az api/v4/source mappában található OpenAPI-leírás a Mattermosttól örökölt végpontokat, valamint az Antimatter néhány kiegészítését (üzenetszálak áthelyezése, modellkapcsolatok és üzenetműveletek) is lefedi. A többi végpont csak a kódban érhető el.
Hitelesítés
Minden kéréshez, a bejelentkezéssel és néhány nyilvános végponttal kivéve, token szükséges az Authorization fejlécben:
curl -H "Authorization: Bearer $TOKEN" https://chat.example.com/api/v4/users/me
Háromféle token fogadott el itt: személyes hozzáférési tokenek, munkamenet-tokenek és OAuth-hozzáférési tokenek. Az Authorization: Token … formátum is elfogadott. A lekérdezési paraméterben (?access_token=) megadott tokenek csak OAuth-hozzáférési tokenek esetén érvényesek.
Személyes hozzáférési tokenek (ajánlott szkriptekhez)
A személyes hozzáférési token a neked cselekszik, nem jár le, hacsak nem adsz meg lejárati dátumot, és bármikor visszavonható. A személyes hozzáférési tokenek alapértelmezés szerint le vannak tiltva:
- Egy rendszeradminisztrátor engedélyezi a Személyes hozzáférési tokenek engedélyezése beállítást a Rendszerkonzol › Integrációk › Integrációkezelés menüben (
ServiceSettings.EnableUserAccessTokens,AM_SERVICESETTINGS_ENABLEUSERACCESSTOKENS). - Minden olyan felhasználó számára, aki tokeneket hozhat létre, a rendszeradminisztrátor megnyitja a Rendszerkonzol › Felhasználókezelés › Felhasználók menüpontot, a felhasználó menüjében kiválasztja a Szerepkörök kezelése lehetőséget, és bejelöli az Engedélyezze, hogy ez a fiók személyes hozzáférési tokeneket generáljon opciót. A rendszeradminisztrátorok mindig létrehozhatnak tokeneket.
- A felhasználó megnyitja a profilját a jobb felső sarokban, majd a Profil és beállítások › Biztonság menüpontot. A Személyes hozzáférési tokenek alatt leírja, mire használja a tokenet, és kiválasztja a Token létrehozása gombot. A token csak egyszer jelenik meg: másolja le.
API-n keresztül: POST /users/{user_id}/tokens a következő testtel: {"description": "backup script", "expires_at": 0} (az expires_at milliszekundumban van megadva; 0 esetén nincs lejárati idő). A válasz token mezője a titok; a id mezővel lehet visszavonni (POST /users/tokens/revoke a {"token_id": "…"} testtel). Parancssorból: amctl token generate <user> <description>.
A rendszeradminisztrátor korlátozhatja a tokenek élettartamát a Személyes hozzáférési token maximális élettartama (nap) beállítással a Rendszerkonzol ugyanazon az oldalon.
Munkamenet-tokenek
A jelszóval történő bejelentkezés egy munkamenet-tokent ad vissza a Token válaszfejlécben, ugyanolyan típusú munkamenetet, amelyet az alkalmazások is használnak:
curl -i -X POST https://chat.example.com/api/v4/users/login \
-H 'Content-Type: application/json' \
-d '{"login_id": "maya", "password": "…"}'
Többfaktoros hitelesítéssel rendelkező fiókhoz adjon meg "token": "123456" értéket. A munkamenetek a szerver munkamenet-beállításai szerint járnak le, a bejelentkezési végpont pedig sebességkorlátozott (5 kérés per másodperc). A POST /users/logout lezárja a munkamenetet.
X-CSRF-Token fejlécet is; az Authorization fejlécben lévő tokenhez nem szükséges CSRF-fejléc.OAuth 2.0 alkalmazások
Ha azt szeretné, hogy a felhasználók Antimatter-fiókjukkal jelentkezzenek be az Ön alkalmazásába, regisztráljon egy OAuth 2.0 alkalmazást. Ekkor az Antimatter lesz az OAuth-szolgáltató:
- Az OAuth 2.0 szolgáltató engedélyezése beállításnak bekapcsolva kell lennie (Rendszerkonzol › Integrációk › Integrációkezelés,
ServiceSettings.EnableOAuthServiceProvider, alapértelmezetten bekapcsolva). - Aki jogosultsággal rendelkezik az OAuth-alkalmazások kezeléséhez (alapértelmezetten a rendszeradminisztrátorok), megnyitja a profilját, majd a Integrációk › OAuth 2.0 alkalmazások menüpontot, és hozzáadja az alkalmazást a visszahívási URL-jeivel. Ilyen módon kap egy kliensazonosítót (client ID) és egy kliens titkot (client secret).
- Az alkalmazásod a felhasználókat a
https://chat.example.com/oauth/authorizecímre irányítja, aresponse_type=code,client_id,redirect_uriésstateparaméterekkel. Acode_challenge_method=S256értékű PKCE támogatott. - A kódot a
POST https://chat.example.com/oauth/access_tokenvégponton cseréli be (előszörgrant_type=authorization_code, majdrefresh_tokenmegújításához), és aAuthorization: Bearer <access token>fejléccel hívja meg a API-t.
A felhasználók a Profil és beállítások › Biztonság › Engedélyezett alkalmazások menüben láthatják az engedélyezett alkalmazásaikat.
Fő erőforrások
| Mit | Végpontok |
|---|---|
| Te és mások | GET /users/me, GET /users/{user_id}, GET /users/username/{username}, POST /users/ids (azonosító-lista), POST /users/search, GET /users?in_team=…&in_channel=… |
| Közösségek | 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 |
| Csatornák | GET /users/me/teams/{team_id}/channels, GET /teams/name/{team}/channels/name/{channel}, POST /channels, POST /channels/direct (két felhasználói azonosító), POST /channels/group, POST /channels/{channel_id}/members |
| Üzenetek (bejegyzések) | 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 |
| Reakciók | POST /reactions a {"user_id", "post_id", "emoji_name"} testtel, DELETE /users/{user_id}/posts/{post_id}/reactions/{emoji_name} |
| Fájlok | POST /files (multipart: channel_id és files), majd a visszaadott azonosítókat írd be a bejegyzés file_ids mezőjébe; GET /files/{file_id} |
| Beállítások | GET /users/me/preferences, PUT /users/me/preferences |
| Integrációk | /hooks/incoming, /hooks/outgoing, /commands, /bots, /oauth/apps (lásd a következő oldalakat) |
| Szerver | GET /system/ping (egészségállapot, token nélkül), GET /config/client?format=old (a kliensek által látható beállítások) |
Üzenet küldése
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"}'
Az üzenetek Markdown formátumúak. Üzenetszálban való válaszhoz add meg a "root_id" (a szál első bejegyzése) értékét, fájlokhoz a "file_ids", csatolmányokhoz és egyéb kiegészítőkhöz a "props" mezőt (lásd: Csatolmányok).
Csatorna-azonosító keresése
curl -H "Authorization: Bearer $TOKEN" \
https://chat.example.com/api/v4/teams/name/lumen-labs/channels/name/ops-alerts
A nevek a csatorna hivatkozásában szereplők: /lumen-labs/channels/ops-alerts.
Lapozás
A listázó végpontok a page (0-tól) és per_page (alapértelmezés szerint 60, maximum 200) paramétereket fogadják el. Kérdezd tovább a következő lapokat, amíg egy lap rövidebb nem lesz, mint a per_page értéke.
A csatorna üzenetei (GET /channels/{channel_id}/posts) szintén elfogadnak since (időpont: minden, ami azóta változott), vagy before és after (bejegyzés-azonosító) paramétert. Válaszként bejegyzéslistát kapunk: {"order": [IDs, newest first], "posts": {ID: post}, "next_post_id", "prev_post_id"}.
Hibák
A hibák a szokásos HTTP-státuszkódokat használják (400 hibás bemenet, 401 nem bejelentkezve, 403 nem engedélyezett, 404 nem található, 501 funkció kikapcsolva), JSON-testtel:
{
"id": "api.context.permissions.app_error",
"message": "You do not have the appropriate permissions.",
"detailed_error": "",
"request_id": "jz8zm5nunpbt8f3gpqsz5dq6so",
"status_code": 403
}
A kódban a id értékét használd: a message a felhasználó nyelvén van lefordítva. A detailed_error csak akkor nem üres, ha a szerver fejlesztői módban fut (ServiceSettings.EnableDeveloper). A szerver adminisztrátorának idézd a request_id értékét: ez szerepel a naplóban.
Kérésekre vonatkozó korlátok
A sebességkorlátozás alapértelmezetten kikapcsolva van. Amikor a rendszeradminisztrátor bekapcsolja (Rendszerkonzol › Környezet › Sebességkorlátozás), minden kliens alapértelmezetten másodpercenként 10 kérést kap, 100-as burst-tel, IP-cím vagy felhasználó alapján számolva. A válaszok tartalmazzák az X-RateLimit-Limit, X-RateLimit-Remaining és X-RateLimit-Reset fejléceket; a limit túllépése esetén a szerver 429 státuszkóddal válaszol, másodpercben megadott Retry-After fejlécet tartalmazva. Egyes végpontok, például a bejelentkezés, saját limittel rendelkeznek, függetlenül a beállításoktól.
Írj olyan szkripteket, amelyek 429 esetén várakoznak és újrapróbálkoznak, és kerüljük a pollinget: a WebSocketet kövesd.
A WebSocket-eseményfolyam
Csatlakozz a wss://chat.example.com/api/v4/websocket címre. A hitelesítés vagy a Authorization: Bearer fejléc használatával történik a csatlakozási kérésben, vagy az első üzenetként küldd el ezt:
{"seq": 1, "action": "authentication_challenge", "data": {"token": "…"}}
A szerver egy hello eseményt küld, majd mindenhez, amit látni engedélyeztek, egy-egy eseményt:
{
"event": "posted",
"data": {"channel_id": "…", "channel_type": "O", "post": "{\"id\":\"…\",\"message\":\"Hello\",…}"},
"broadcast": {"channel_id": "…", "team_id": "", "user_id": "", "omit_users": null},
"seq": 4
}
Megjegyzés: a data.post a bejegyzés JSON-sztringként. Gyakori események: posted, post_edited, post_deleted, reaction_added, reaction_removed, typing, status_change, user_added, direct_added. Az alkalmazások saját eseményeket küldenek, custom_<app id>_<event> néven.
Akkciókat is küldhetsz, mindegyik növekvő seq értékkel: user_typing {"channel_id", "parent_id"} paraméterekkel, vagy get_statuses. Ha a kapcsolat megszakad, csatlakozz újra, és a since paraméterrel (lásd Lapozás) szerezd be, amit elhagytál.
Az Antimatter hozzáadja az alábbi eseményeket: community_attributes_updated, member_timeouts_updated, post_put_on_top, post_removed_from_top, server_categories_updated, channel_overrides_updated és category_overrides_updated.
Klienskönyvtárak
- Mehet: a
model.Client4aserver/public/modelmappában (import:github.com/mattermost/mattermost/server/public/model). Először amodel.NewAPIv4Client(url), majd aclient.SetToken(token); amodel.NewWebSocketClient4(wsURL, token)követi az eseményeket. Az Antimatter saját másolata módszereket ad hozzá a saját végpontjaihoz, példáulUpdateMessageRequest,PutPostOnTopésExportChannel. - TypeScript: a
@mattermost/clientClient4osztálya awebapp/platform/clientkönyvtárban, a típusok awebapp/platform/typeskönyvtárban. Az Antimatter repozitóriumban lévő másolat tartalmazza az Antimatter végpontjait; a Mattermost által npm-en publikált csomag nem.
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)
}
Az Antimatter által a API-hoz hozzáadott elemek
Ezek a végpontok és mezők nem léteznek egy Mattermost szerveren. Mindegyikükhöz munkamenet szükséges.
| Végpont | Mire szolgál |
|---|---|
GET /teams/{team_id}/user_attributes/fieldsPOST ugyanerre az útvonalraPATCH, DELETE …/fields/{field_id} | Közösségi attribútumok: a közösség adminisztrátorai által a tagok számára definiált profilmézők (legfeljebb 20). A tagok olvashatják őket; a közösségi adminisztrátorok hozhatják létre és módosíthatják. |
GET /teams/{team_id}/members/{user_id}/user_attributesPATCH ugyanerre az útvonalraPOST /teams/{team_id}/user_attributes/values/search | Egy tag attribútumértékei, {field_id: value} formátumban. A tagok a saját értékeiket állíthatják be (kivéve az adminisztrátor által kezelt mezőket); az adminisztrátorok bármelyik tagéit beállíthatják. A keresés {"user_ids": [...]} paramétert vár (legfeljebb 200 elem). |
GET /teams/{team_id}/timeoutsPUT /teams/{team_id}/members/{user_id}/timeoutGET /teams/{team_id}/members/{user_id}/moderation | Időkorlátok: a {"until": time, "reason": "…"} paraméter addig megakadályozza a közösségben való posztolást, reakciókat és feltöltést, amíg az időkorlát le nem jár (legfeljebb 28 nap); "until": 0 esetén feloldja. A moderációs nézet megmutatja, mikor csatlakoztak, és mennyit posztoltak közelmúltban. |
GET /channels/{channel_id}/on_topPUT, DELETE /posts/{post_id}/on_top | Üzenetek kitűzése a csatorna tetejére (legfeljebb 10 darab). {"duration": ms}, legfeljebb 30 napig; 0 esetén a kitűzés addig marad, amíg fel nem oldják. A csatornát olvasni tudó felhasználók láthatják a kitűzött üzeneteket. Az üzenet kitűzéséhez vagy levételéhez csatornabeli írási jogosultság szükséges, közösségi csatornák esetén pedig a csatorna vagy a közösség adminisztrátori szerepe, illetve a Üzenetek kezelése (delete_others_posts) jogosultság. Közvetlen és csoportos üzeneteknél a tagok végezhetik el a műveletet. Archívált csatornákban nem engedélyezett. |
POST /channels/{channel_id}/message_request | A saját üzenetkérésére hajt végre műveletet: {"action": "accept"}, "dismiss", vagy "request" a beszélgetés visszaállítása a kérések közé. Visszaadja a csatorna tagjait. |
GET, PUT /channels/{channel_id}/overridesGET /channels/{channel_id}/overrides/effectiveGET, PUT /channels/{channel_id}/role_access | A csatornán végrehajtható műveletek, valamint az, melyik szerepkör látja a szerepkörre korlátozott csatornát. |
GET, PUT /teams/{team_id}/server_categoriesGET, PUT …/server_categories/overrides | A közösség közös csatorna-kategóriái, valamint a kategóriában lévő minden csatornára vonatkozó felülírások. |
GET /groups/{group_id}/team_rolePUT …/team_role/permissions | A közösségi szerepkör által biztosított jogosultságok. |
POST /teams/{team_id}/autolinks/preview | Próbálja ki a közösség automatikus hivatkozás-szabályait egy szövegen. |
POST /channels/{channel_id}/export?format=csv&since=&until= | Letölti a csatorna üzeneteit CSV formátumban (legfeljebb 50 000), azok számára, akik olvashatják a csatornát. |
GET /posts/{post_id}/speech | Az üzenet hangos olvasata, hanganyagként, ha be van állítva a szöveg-ből-hang (text-to-speech) funkció. |
POST /posts/{post_id}/move_to_channel | Üzenetszál áthelyezése a közösség másik csatornájába: lásd Üzenetszál áthelyezése. |
GET, POST /ai/connectionsGET, PATCH, DELETE /ai/connections/{connection_id}GET /ai/connections/usable | Modellkötések, az AI-szolgáltatók, amelyeket a szerver AI-funkciói és alkalmazásai használnak: lásd Modellkötések. |
GET /channels/{channel_id}/message_actionsPOST /posts/{post_id}/message_actions/{hook_id}GET, POST /hooks/outgoing/{hook_id}/icon | Üzenetműveletek: kimenő webhookok, amelyeket a felhasználók az üzenetmenüből indíthatnak. Lásd Üzenetműveletek. |
Új mezők
- Közösségek (
Team, ésPUT /teams/{team_id}/patch):all_channels_membership(mindenki tagja minden csatornának, amelyet láthat),default_channel_id(ahová az újonnan csatlakozók kerülnek; ha üres, akkor a General csatorna),kind(communityvagyworkplace: workplace esetén a csatorna-adminisztrátorok archíválhatják a saját csatornáikat is; az új közösségek a szerverTeamSettings.DefaultCommunityKindértékét kapják, alapértelmezettencommunity),member_list_view(hogy a taglista hogyan csoportosítja a tagokat:choice, az alapértelmezés, lehetővé teszi, hogy minden tag maga válassza;rolesvagyteamsrögzíti a csoportosítást),hide_role_colors,require_team_badges,onboardingésautolinks(mindkettő JSON-sztring). - Új közösség alapértelmezett csatornája a
general(General), nem atown-square. A 0.9.0-s frissítés átnevezi minden közösségtown-squarecsatornájátgeneral-ra, megtartva annak azonosítóját, hacsak a közösségnek már nincsgeneralnevű csatornája. A régi nevek továbbra is működnek: aGET /teams/{team_id}/channels/name/town-square, aGET /teams/name/{team}/channels/name/town-squareés a bejövő webhookchannelmezője a közösség alapértelmezett csatornáját adja vissza, ha nincs ilyen nevű csatorna. Az új kódban használja adefault_channel_id-t, vagy ageneralnevet. - Csatorna-hivatkozások: a
#channel-namehivatkozás egy csatornát jelöl, ahogy a~channel-nameis. A bejegyzéschannel_mentionstulajdonsága felsorolja mindkét módon hivatkozott csatornákat; a#word, amely nem nevez meg csatornát, hashtag marad. Az Antimatter webes felülete és mobilalkalmazása a#nameformátumot használja. - Archivált csatornák még mindig felvehetnek új tagokat (
POST /channels/{channel_id}/members), akik olvashatják a korábbi üzeneteket. Senki nem közzéteszhet, nem reagálhat, nem tűzhet ki, nem emelhet üzenetet a tetejére, nem nevezheti át a csatornát, és nem módosíthatja a tagok szerepkörét. - Belső válaszok: egy bejegyzés, amelynek
"props": {"reply_to": "<post id>"}értéke, idézi a csatorna másik üzenetét. A"reply_to_mention": falsehozzáadása esetén a szerző nem kap értesítést. A szerver kitölti ametadata.reply_tomezőt a hivatkozott üzenet rövid leírásával. - Spoilerek: a
"props": {"spoiler": true}elrejteti a bejegyzés szövegét és fájljait, amíg az olvasó nem dönt úgy, hogy megtekinti őket. - Mellőzés és blokkolás beállítások:
user_blockkategória, a másik személy azonosítója szerint elnevezve,ignorevagyblockértékkel. Hogy egy közvetlen üzenet kérésként vár-e, a csatorna-tagodnotify_props.dm_requestmezőjében látható (pending,acceptedvagydismissed). - Üzenet-csatolmányok tartalmazhatnak
stageséschartelemeket: lásd Kártyák.
Üzenetszál áthelyezése
A POST /posts/{post_id}/move_to_channel egy másik, ugyanahhoz a közösséghez tartozó csatornába mozgatja az üzenetszalat, annak első üzenetét és minden válaszát. A post_id lehet az első üzenet vagy bármelyik válasz.
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(kötelező): a csatorna, ahová az üzenetszál átköltözik.flatten(alapérték:false): hatrue, a válaszok nem szálként, hanem a célcsatorna közvetlen üzenetei lesznek. A Fusion Make it a channel funkciója használja ezt.
Az üzenetek megtartják szerzőiket, időbélyeget, reakcióikat és csatolmányaikat. A másolatok a silent_notification tulajdonságot viselik, így nem küldenek értesítést senkinek. Az eredeti üzenetek törlődnek. A válasz a mozgatott első üzenet, az új azonosítóval.
Ki mozgathat üzenetszalat
- Olvashatod az üzenetszalat, és közzéteshetsz a célcsatornában.
- A csatorna adminisztrátorai, a közösség adminisztrátorai, a csatornában Üzenetek kezelése (
delete_others_posts) jogosultsággal rendelkezők, valamint a rendszeradminisztrátorok bármelyik üzenetszalat mozgatják. - Az üzenetszál szerzője akkor mozgatja, ha mindkét csatorna nyilvános, vagy ha a szál minden üzenete az őtől származik. Egyébként a válasz
403, azapi.post.move_thread.private_needs_moderator.app_errorazonosítóval. - Mindkét csatornának ugyanahhoz a közösséghez kell tartoznia (közvetlen és csoportos üzenetek nem jöhetnek szóba), különbözőeknek kell lenniük, és nem lehetnek archiválva. Rendszerüzenetek és az olvasáskor törlődő üzenetek nem mozgatók.
- A
WranglerSettings.MoveThreadMaxCountüzenetnél hosszabb szál (alapértelmezés szerint 100; 0 esetén nincs korlát) nem mozgatható.
A mutató és a megjegyzés
A mozgatás két system_wrangler típusú rendszerüzenetet hagy maga után: egy mutatót a régi csatornában („Egy 13 üzenetes szál átköltözött a #target csatornába”) és egy megjegyzést a célcsatornában („Ez a szál átköltözött a #source csatornából”), a mozgatott szál alatt, vagy a flatten esetén az üzenetek után. Az üzenetszöveg mellett a tulajdonságaik lehetővé teszik, hogy a kliens a csatorna nevét hivatkozásként jelenítse meg:
- A mutató:
MovedThreadPermalink,NumMessages,MovedThreadChannelId,MovedThreadTeamName,MovedThreadPostId, valamint, ha a cél nyílt csatorna,MovedThreadChannelNameésMovedThreadChannelDisplayName. - A megjegyzés:
MovedFromChannelId,MovedFromTeamName,MovedFromPostId(a mutató),MovedFromPermalink, valamint, ha a forrás nyílt csatorna,MovedFromChannelNameésMovedFromChannelDisplayName.
Mindkettő rendelkezik TranslationID-vel. A privát csatorna neve elmarad: az olvasók „másik csatorna” feliratot látnak. A Mattermost saját POST /posts/{post_id}/move végpontja az Antimatterben nem érhető el; ehelyett ezt a végpontot használd.
Modellkapcsolatok
A modellkapcsolat egy MI-szolgáltató címe és kulcsa, amelyet egy adminisztrátor állít be. A szerver MI-funkciói és az MI-szolgáltatást hívó alkalmazások használják ezeket. A rendszeradminisztrátorok a szerver-szintű kapcsolatokat kezelik (manage_ai_connections); a közösségek adminisztrátorai a saját közösségük kapcsolatait (manage_team_ai_connections). A kulcsok csak írási módúak: egyetlen válasz sem tartalmazza őket, csak a api_key_set és a api_key_last4 mezők.
| Végpont | Mire szolgál |
|---|---|
GET /ai/connections?scope= | A te általad kezelt kapcsolatok. A scope értéke server vagy egy közösség azonosítója; ha nem adod meg, minden olyan tartományt kapsz, amelyet kezelhetsz. |
POST /ai/connections | Kapcsolat hozzáadása (a válasz 201). |
POST /ai/connections/test, POST /ai/connections/models | Kapcsolat tesztelése, vagy annak modelljeinek listázása, mielőtt elmentenéd. Ugyanaz a test, mint a hozzáadáskor; semmi nem tárolódik. |
GET, PATCH (vagy PUT), DELETE /ai/connections/{connection_id} | Kapcsolat olvasása, módosítása vagy törlése. A patch csak azokat a mezőket tartalmazza, amelyeket módosítani szeretnél; hagyd ki a api_key mezőt, ha a kulcsot meg szeretnéd őrizni. |
POST /ai/connections/{connection_id}/test | Mentett kapcsolat tesztelése: {"ok", "error", "status_code", "latency_ms", "model_count"}. |
GET /ai/connections/{connection_id}/models | A szolgáltató által kínált modellek. |
GET /ai/connections/{connection_id}/usage | A jelenlegi hónap kérései és tokenjei. |
GET /ai/connections/usable?channel_id=&team_id= | Bármelyik bejelentkezett felhasználó számára: az ott használható kapcsolatok, modellekkel és képességekkel, de soha nem kulcsokkal vagy címekkel. |
Az új kapcsolat testje:
{
"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}
}
A provider értéke openai_compatible vagy anthropic. A scope alapértelmezett értéke server; ha egy közösség azonosítója szerepel, akkor az adott közösséghez tartozó kapcsolat lesz. A limits szekcióban a 0 azt jelenti, hogy nincs korlát; a perces kérésszámot szerverenként, a token-kvótákat pedig a teljes klaszterre vonatkozóan, naptári hónap (UTC) szerint számoljuk. A sharing mező megadja, mely közösségek használhatják a szerver-szintű kapcsolatot (a közvetlen és csoportos üzenetekhez all_teams szükséges), a audience pedig azt, hogy ki férhet hozzá; vendégek csak akkor, ha be van kapcsolva a allow_guests. A módosítások a naplóba kerülnek. A beállítások részletes leírását lásd az adminisztrátori útmutatóban: AI.