Bắt đầu
Minds Connect SDK
Kết nối ứng dụng của bạn với Hello Minds. Người dùng đăng nhập bằng tài khoản Minds, hoặc tạo tài khoản ngay tại chỗ, và ứng dụng có thể xem, nhắn tin, và làm việc với Mind của họ.
Minds Connect SDK là gói TypeScript tạo kết nối đó. Thêm
Đăng ký một OAuth client trong bảng điều khiển Builder, sao chép client ID vào SDK, và thêm route callback tại redirect URI bạn đã đăng ký. Các ví dụ bên dưới là TypeScript.
@animocabrands/minds-connect vào ứng dụng web của bạn. Người dùng đăng nhập trên Hello Minds, kể cả người tạo tài khoản lần đầu. Màn hình đăng nhập và đồng ý nằm ở đó. Khi họ quay lại, oauth.client là Thư viện ứng dụng khách Minds , sẵn sàng liệt kê Mind của họ, gửi tin nhắn, và làm phần còn lại mà họ đã cho phép. Connect giữ phiên mới trước mỗi lệnh gọi.Giao diện vẫn là của bạn. Connect lo phần chuyển hướng, phiên đã lưu, và đăng xuất khỏi ứng dụng của bạn.Cài đặt
Gói kèm kiểu TypeScript. SDK chạy trên trình duyệt. Nạp nó từ Vite, webpack, hoặc bundler khác. Trên Next.js App Router, đặt binding React trong ranh giới"use client".
npm install @animocabrands/minds-connect| Import | Khi nào dùng |
|---|---|
@animocabrands/minds-connect | TypeScript, không dùng React |
@animocabrands/minds-connect/react | React. Cần react và react-dom từ 18 trở lên, là peer tùy chọn |
Đăng ký OAuth client
Tạo client ở tab OAuth Client . Sao chép client ID vàoclientId. ID là công khai. Không có client secret để lưu.
Redirect URI là trang trong ứng dụng của bạn kết thúc đăng nhập. Origin được phép là trang được phép bắt đầu đăng nhập. Cả hai phải khớp giá trị bạn đăng ký, kể cả scheme, host và cổng.
Giữ người dùng trong cùng một tab trình duyệt. Connect lưu một lần kiểm tra trong sessionStorage của tab đó. Tab mới, popup, hoặc URL callback đã đánh dấu sẽ không hoàn tất đăng nhập.
Tab liệt kê Phạm vi khả dụng. Đó là danh sách được phép của client này. Bạn không sửa danh sách ở đó. Truyền các scope trong danh sách đó bằng MindsScope. Đăng nhập thất bại nếu bạn yêu cầu một scope không có trong đó. MindsScope.Email là email tài khoản của người vừa đăng nhập, và nó nằm trong danh sách được phép. MindsScope.MindsEmail là một scope khác: địa chỉ của một Mind của họ.
React
Bọc router một lần bằngMindsConnect, để trang chủ và callback dùng chung một client. Tùy chọn được đọc khi provider mount. Tải lại trang để đổi chúng.
Đặt LoginCallback trên cùng đường dẫn với redirectUri. signIn() đưa người dùng tới Hello Minds. Sau khi họ quay lại, gọi Builder API trên oauth.client.
import { BrowserRouter, Route, Routes, useNavigate } from "react-router-dom";
import {
LoginCallback,
MindsConnect,
MindsScope,
useMindsConnect,
type MindsOAuthOptions,
} from "@animocabrands/minds-connect/react";
const opts: MindsOAuthOptions = {
clientId: "YOUR_CLIENT_ID",
redirectUri: `${window.location.origin}/callback`,
scopes: [MindsScope.Email, MindsScope.MindsList],
};
export function Root() {
return (
<BrowserRouter>
<MindsConnect opts={opts}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/callback" element={<Callback />} />
</Routes>
</MindsConnect>
</BrowserRouter>
);
}
function Home() {
const { isInitialized, isAuthenticated, signIn, signOut, oauth } = useMindsConnect();
if (!isInitialized || !oauth) return <p>Loading…</p>;
if (!isAuthenticated) {
return (
<button type="button" onClick={() => signIn()}>
Sign in with Minds
</button>
);
}
async function listMinds() {
const minds = await oauth.client.listMinds();
console.log(minds);
}
return (
<>
<button type="button" onClick={() => listMinds()}>
List minds
</button>
<button type="button" onClick={() => signOut()}>
Log out
</button>
</>
);
}
function Callback() {
const navigate = useNavigate();
return (
<LoginCallback
onSuccess={() => navigate("/", { replace: true })}
onError={(err) => console.error(err)}
/>
);
}LoginCallback thì SDK hiện trạng thái có sẵn. Nếu bạn truyền children, chúng luôn được vẽ. Đưa người dùng về trang chủ trong onSuccess.
useMindsConnect() còn trả về hasScopes, tokens, và getAccessToken.
Không dùng React
Các bước giống nhau. Dùng chung một module tùy chọn, bắt đầu đăng nhập từ một nút, và kết thúc trên trang callback. Callback là một lần tải trang mới, nên hãy tạo lạiMindsOAuth với cùng clientId và redirectUri.
onTokensChanged chạy trong tab này khi Connect ghi phiên: đăng xuất, làm mới, hoặc lần làm mới thất bại xóa kho lưu. Nó không chạy khi trang vừa tải. Đọc oauth.tokens khi vẽ lần đầu.
// oauth.ts
import { MindsOAuth, MindsScope, type MindsOAuthOptions } from "@animocabrands/minds-connect";
export const opts: MindsOAuthOptions = {
clientId: "YOUR_CLIENT_ID",
redirectUri: `${window.location.origin}/callback`,
scopes: [MindsScope.Email, MindsScope.MindsList],
};
export const oauth = new MindsOAuth(opts);// main.ts — home page
import { oauth } from "./oauth";
const connectBtn = document.getElementById("connect");
const listBtn = document.getElementById("list");
const logoutBtn = document.getElementById("logout");
oauth.onTokensChanged((tokens) => {
const signedIn = Boolean(tokens);
if (connectBtn) connectBtn.hidden = signedIn;
if (listBtn) listBtn.hidden = !signedIn;
if (logoutBtn) logoutBtn.hidden = !signedIn;
});
connectBtn?.addEventListener("click", async () => {
await oauth.signIn();
});
listBtn?.addEventListener("click", async () => {
const minds = await oauth.client.listMinds();
console.log(minds);
});
logoutBtn?.addEventListener("click", async () => {
await oauth.signOut();
});// callback.ts — same path as redirectUri
import { OAuthRedirectError } from "@animocabrands/minds-connect";
import { oauth } from "./oauth";
try {
await oauth.handleRedirect();
window.location.replace("/");
} catch (err) {
if (err instanceof OAuthRedirectError) {
console.error(err.error, err.errorDescription);
} else {
console.error(err);
}
}handleRedirect() kiểm tra state trả về, đổi mã lấy token, và lưu token. Nếu người dùng từ chối, hoặc state không khớp, hàm ném OAuthRedirectError.
Scope
Scope là việc người dùng đã đăng nhập cho phép ứng dụng làm. Đặt đủ bộ lênopts.scopes khi bạn tạo SDK. MindsScope là các hằng TypeScript cho những id đó. Cả hai entry point đều xuất chúng.
Để xin thêm sau này, gọi signIn({ scopes }) với đủ danh sách bạn muốn, kể cả scope họ đã cấp. hasScopes cho biết lần chuyển hướng đó có cần hay không.
import { MindsScope } from "@animocabrands/minds-connect";
const scopes = [MindsScope.MindsList, MindsScope.ConversationsList, MindsScope.MessagingSend];
if (oauth.tokens && !oauth.hasScopes(scopes)) {
await oauth.signIn({ scopes });
}isAuthenticated, hasScopes, và signIn.
oauth.client chỉ gọi được những gì grant đó gồm. listMinds() cần MindsScope.MindsList. Gửi tin nhắn cần MindsScope.MessagingSend. Danh sách phương thức nằm ở trang thư viện ứng dụng khách .
MindsScope | Scope | Người dùng cho phép |
|---|---|---|
MindsScope.Email | email | Xem email của họ |
MindsScope.MindsList | minds:list | Xem Mind của họ |
MindsScope.MindsStatus | minds:status | Xem Mind của họ đang bật hay không |
MindsScope.MindsCognition | minds:cognition | Xem cognition của Mind họ |
MindsScope.MindsSkillsList | minds:skills:list | Xem kỹ năng của Mind họ |
MindsScope.MindsToolsList | minds:tools:list | Xem công cụ của Mind họ |
MindsScope.MindsAppsList | minds:apps:list | Xem ứng dụng của Mind họ |
MindsScope.MindsEmail | minds:email | Xem email của Mind họ |
MindsScope.MindsWallets | minds:wallets | Xem địa chỉ ví của Mind họ |
MindsScope.MindsAwaken | minds:awaken | Đánh thức Mind cho họ |
MindsScope.MindsEnable | minds:enable | Bật Mind của họ |
MindsScope.MindsDisable | minds:disable | Tắt Mind của họ |
MindsScope.MindsSkillsEquip | minds:skills:equip | Trang bị kỹ năng cho Mind họ |
MindsScope.MindsSkillsUnequip | minds:skills:unequip | Gỡ kỹ năng khỏi Mind họ |
MindsScope.MindsToolsEquip | minds:tools:equip | Trang bị công cụ cho Mind họ |
MindsScope.MindsToolsUnequip | minds:tools:unequip | Gỡ công cụ khỏi Mind họ |
MindsScope.MindsAppsEquip | minds:apps:equip | Trang bị ứng dụng cho Mind họ |
MindsScope.MindsAppsUnequip | minds:apps:unequip | Gỡ ứng dụng khỏi Mind họ |
MindsScope.ConversationsCreate | conversations:create | Bắt đầu chat với Mind họ |
MindsScope.ConversationsList | conversations:list | Xem các cuộc chat của họ |
MindsScope.ConversationsRead | conversations:read | Xem một cuộc chat với Mind họ |
MindsScope.MessagingSend | messaging:send | Gửi tin nhắn với tư cách họ |
MindsScope.MessagingBeacon | messaging:beacon | Nhắc Mind của họ |
MindsScope.MessagingHistory | messaging:history | Xem lịch sử chat của họ |
MindsScope.MessagingActivityStream | messaging:activity:stream | Theo dõi hoạt động của một Mind của họ |
MindsScope.MessagingStream | messaging:stream | Theo dõi sự kiện nhắn tin trên các Mind của họ |
Lệnh gọi chạy ở đâu
Ứng dụng web không có backend thì Connect là đủ.oauth.client là thư viện ứng dụng khách, đã hướng tới người vừa đăng nhập. Connect phụ thuộc @animocabrands/minds-client-lib, nên bạn không tự cài gói đó cho các lệnh gọi trên trình duyệt.
const minds = await oauth.client.listMinds();import { createMindsClient } from "@animocabrands/minds-client-lib";
const accessToken = req.headers.authorization?.replace(/^Bearer\s+/i, "");
const minds = await createMindsClient({ accessToken }).listMinds();getAccessToken() trả về token còn hiệu lực, và làm mới khi token còn dưới 60 giây là hết hạn. Nó trả về null khi không có phiên. oauth.tokens là bản lưu, và bản đó có thể đã hết hạn, nên hãy dùng getAccessToken() khi gửi token tới backend.
Đăng xuất
signOut() xóa phiên trong ứng dụng của bạn và thu hồi refresh token. Tài khoản Hello Minds của họ vẫn đăng nhập, nên lần sau họ có thể tiếp tục mà không tạo tài khoản lại.
await oauth.signOut();Phiên
Phiên được lưu tronglocalStorage, với khóa minds_oauth_session: cộng client ID của bạn. Phiên còn sau khi tải lại và trên các tab khác cùng origin. Mọi script trên trang đều đọc được.
Truyền storage khi bạn muốn kho khác. Kế thừa TokenStore và triển khai get, set, và clear. signOut() xóa kho đó.
| Trường | Ý nghĩa |
|---|---|
accessToken | Bearer token cho lệnh gọi Builder API |
refreshToken | Được thay mỗi lần làm mới. Kho giữ bản mới nhất |
expiresIn | Số giây còn lại khi bạn đọc kho |
scope | Scope đã cấp, cách nhau bằng dấu cách. Dùng hasScopes để kiểm tra |
Tùy chọn
Cùng một object được truyền vàonew MindsOAuth(opts) và vào MindsConnect.
| Tùy chọn | Bắt buộc | Mặc định | Bạn truyền |
|---|---|---|---|
clientId | có | — | Client ID công khai từ tab OAuth Client |
redirectUri | có | — | URL callback bạn đã đăng ký, gồm origin |
scopes | có | — | Đủ danh sách MindsScope cho signIn() đầu tiên. Không được để trống. Thêm MindsScope.Email khi bạn cần email tài khoản |
storage | không | "localStorage" | "localStorage", hoặc TokenStore của bạn |
signIn() còn nhận state (chuỗi hoặc object, bạn nhận lại từ handleRedirect) và scopes (đủ danh sách thay cho opts.scopes trong lần đó).
Phương thức
| Khu vực | Bạn gọi |
|---|---|
| Đăng nhập | signIn, handleRedirect |
| Phiên | getAccessToken, tokens, hasScopes, onTokensChanged, signOut |
| Builder API | client — thư viện ứng dụng khách (listMinds, sendMessage, và phần còn lại) |
| React | MindsConnect, useMindsConnect, LoginCallback |
MindsOAuth, MindsScope, OAuthRedirectError, TokenStore, và các kiểu MindsOAuthOptions, TokenSuccess, SignInOptions, OAuthSession được xuất từ @animocabrands/minds-connect. Entry React xuất lại MindsScope.