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 @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.
Đă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.

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
ImportKhi nào dùng
@animocabrands/minds-connectTypeScript, không dùng React
@animocabrands/minds-connect/reactReact. 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ào clientId. 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ằng MindsConnect, để 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)}
    />
  );
}
Không truyền children cho 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ại MindsOAuth 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ên opts.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 });
}
Trong React, dùng cùng danh sách với 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 .
MindsScopeScopeNgười dùng cho phép
MindsScope.EmailemailXem email của họ
MindsScope.MindsListminds:listXem Mind của họ
MindsScope.MindsStatusminds:statusXem Mind của họ đang bật hay không
MindsScope.MindsCognitionminds:cognitionXem cognition của Mind họ
MindsScope.MindsSkillsListminds:skills:listXem kỹ năng của Mind họ
MindsScope.MindsToolsListminds:tools:listXem công cụ của Mind họ
MindsScope.MindsAppsListminds:apps:listXem ứng dụng của Mind họ
MindsScope.MindsEmailminds:emailXem email của Mind họ
MindsScope.MindsWalletsminds:walletsXem địa chỉ ví của Mind họ
MindsScope.MindsAwakenminds:awakenĐánh thức Mind cho họ
MindsScope.MindsEnableminds:enableBật Mind của họ
MindsScope.MindsDisableminds:disableTắt Mind của họ
MindsScope.MindsSkillsEquipminds:skills:equipTrang bị kỹ năng cho Mind họ
MindsScope.MindsSkillsUnequipminds:skills:unequipGỡ kỹ năng khỏi Mind họ
MindsScope.MindsToolsEquipminds:tools:equipTrang bị công cụ cho Mind họ
MindsScope.MindsToolsUnequipminds:tools:unequipGỡ công cụ khỏi Mind họ
MindsScope.MindsAppsEquipminds:apps:equipTrang bị ứng dụng cho Mind họ
MindsScope.MindsAppsUnequipminds:apps:unequipGỡ ứng dụng khỏi Mind họ
MindsScope.ConversationsCreateconversations:createBắt đầu chat với Mind họ
MindsScope.ConversationsListconversations:listXem các cuộc chat của họ
MindsScope.ConversationsReadconversations:readXem một cuộc chat với Mind họ
MindsScope.MessagingSendmessaging:sendGửi tin nhắn với tư cách họ
MindsScope.MessagingBeaconmessaging:beaconNhắc Mind của họ
MindsScope.MessagingHistorymessaging:historyXem lịch sử chat của họ
MindsScope.MessagingActivityStreammessaging:activity:streamTheo dõi hoạt động của một Mind của họ
MindsScope.MessagingStreammessaging:streamTheo 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();
Khi bạn cũng có backend, giữ Connect trên trình duyệt cho đăng nhập và làm mới token. Cài thư viện ứng dụng khách trên server, và truyền access token mà trang gửi lên. Liệt kê Mind, gửi tin nhắn, và việc dài hơn có thể chạy ở đó. Các phương thức giống nhau. Chúng được ghi ở trang thư viện ứng dụng khách .
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 trong localStorage, 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
accessTokenBearer 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
expiresInSố giây còn lại khi bạn đọc kho
scopeScope đã 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ào new MindsOAuth(opts) và vào MindsConnect.
Tùy chọnBắt buộcMặc địnhBạn truyền
clientIdcó—Client ID công khai từ tab OAuth Client
redirectUricó—URL callback bạn đã đăng ký, gồm origin
scopescó—Đủ 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
storagekhô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ựcBạn gọi
Đăng nhậpsignIn, handleRedirect
PhiêngetAccessToken, tokens, hasScopes, onTokensChanged, signOut
Builder APIclient — thư viện ứng dụng khách (listMinds, sendMessage, và phần còn lại)
ReactMindsConnect, 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.