Builder API를 TypeScript 타입으로 호출합니다. Builder API 키는 자신의 계정을, OAuth 액세스 토큰은 Minds Connect로 로그인한 사용자를 대상으로 합니다.
@animocabrands/minds-client-lib는 애플리케이션에서 Builder API를 호출하는 방법입니다. 대부분의 빌더는 자신의 계정에서 Minds CLI 로 시작한 뒤, 같은 호출을 TypeScript 타입으로 출시하기 위해 이 라이브러리로 옮깁니다. 메시징, waitForReply, SSE 이벤트, 계정 작업이 대상입니다. 사용자가 로그인하는 브라우저 앱은 Minds Connect SDK 를 사용합니다. Connect가 이 클라이언트를 감싸고, 호출 전에 사용자의 액세스 토큰을 갱신합니다.
Node 백엔드에서 쓰거나, Connect를 통해 브라우저에서 쓰세요. UI, 브랜딩, 사용자 흐름은 그대로 유지됩니다. 클라이언트는 타입이 지정된 HTTP와 api.build로의 스트리밍을 처리합니다. Builder API 키를 쓸 때는 시작하는 방법 을 마치고 CLI로 확인한 다음 아래 예제를 연결하세요. 사용자 로그인에는 OAuth 클라이언트를 등록하고 Connect 가이드를 따르세요.
설치
Node 앱에는 **Node 22+**가 필요합니다. Connect는 같은 패키지를 브라우저에서 불러옵니다.
npm install @animocabrands/minds-client-lib
인증
계정 및 메시징 호출은 OAuth 액세스 토큰 또는 Builder API 키를 받습니다. 둘 다 있으면 액세스 토큰이 우선하고 클라이언트는 Authorization: Bearer를 보냅니다. 그렇지 않으면 X-Api-Key를 보냅니다. **X-Access-Key**는 더 이상 사용되지 않으므로 사용하지 마세요.라이브러리는 .env를 읽지 않습니다. 앱에서 MINDS_BUILDER_API_KEY(상수 BUILDER_API_KEY_ENV)를 읽어 인자로 넘기세요. 브라우저 앱은 Minds Connect SDK 를 사용합니다. Connect의 oauth.client는 요청 전에 새 토큰을 넣습니다. 백엔드에서는 브라우저에서 사용자가 로그인한 뒤 그 액세스 토큰을 createMindsClient에 넘깁니다.Builder API 키는 빌더 자신의 계정으로 동작합니다. 액세스 토큰은 로그인한 사용자로 동작하며, 허용된 스코프 안에서만 동작합니다.Builder API 키:
import { BUILDER_API_KEY_ENV, createMindsClient } from "@animocabrands/minds-client-lib";const builderApiKey = process.env[BUILDER_API_KEY_ENV];if (!builderApiKey) throw new Error(`${BUILDER_API_KEY_ENV} is not set`);const client = createMindsClient({ builderApiKey });
setAccessToken(null) 또는 빈 문자열은 토큰을 지웁니다. 생성 시 Builder API 키도 넘겼다면 이후 호출은 그 키를 사용합니다.getAccessToken은 인증이 필요한 HTTP 또는 SSE 요청 전에 실행됩니다. 반환한 토큰은 그 요청에서 정적인 accessToken보다 우선합니다. Connect는 oauth.client에 이것을 연결합니다. 함수가 null을 반환하면 클라이언트는 정적 토큰 또는 키로 돌아갑니다.
createMindsClient({})는 공개 Bazaar 카탈로그(client.bazaar.*)에만 유효합니다. 액세스 토큰도 Builder API 키도 없으면 인증 메서드는 생성 시점이 아니라 호출 시점에 missing_builder_api_key 코드와 함께 MindsApiError를 발생시킵니다. 코드 이름은 그대로입니다.
Mind 생성
Mind 이름은 고유합니다. 이미 사용 중인 이름인지 먼저 checkMindName으로 확인하세요(공개 메서드, 자격 증명 불필요). 그다음 awakenMind를 호출합니다(Builder API 키 또는 액세스 토큰 필요).id는 생성할 미리 구성된 Mind 유형을 선택합니다. 패키지는 카탈로그를 내보내지 않습니다. 각 유형과 짧은 설명은 Minds CLI 에서 minds mind awaken --help를 실행하면 확인할 수 있습니다. 동일한 목록은 API 참조 에도 있습니다. 이름이 이미 사용 중이거나 id가 유효하지 않으면 awakenMind는 MindsApiError를 던집니다.예제는 sales Mind 이름 J-Belfort입니다. 이 펜을 팔아 보세요.
액세스 토큰을 쓰면 listMinds()는 토큰의 sub를 userId로 하여 GET /v1/users/{userId}/minds를 호출합니다. Builder API 키는 여전히 GET /v1/humans/{humanId}/minds를 호출합니다. listMinds({ humanId })를 넘기면 humans 경로를 씁니다.
Mind 세부 정보
getMind(mindId)는 이메일, 지갑 주소, 체인, 종, isEnabled 등 전체 세부 정보를 반환합니다:
Mind별 Cognition 사용량과 잔액 조회는 CLI 명령과 동일하게 동작합니다. Mind는 대화할 때뿐만 아니라 추론하고, 도구를 실행하고, 자율 작업을 수행할 때도 Cognition을 소비합니다. 두 메서드 모두 mindId(UUID)와 선택적 AbortSignal을 받습니다.Cognition은 Mind의 추론, 도구 사용 및 자율 작업을 지원합니다. 시간에 따른 사용량 및 도구별 사용량을 보려면 getCognitionUsage 및 getCognitionUsageByTool을 사용하세요. 남은 Cognition 잔액을 보려면 getCognitionBalance를 사용하세요:
두 사용량 메서드는 서로 다른 간격 값을 허용합니다. getCognitionUsage는 1m, 5m, 15m, 1h, 1d, 1w, 1M을 허용하고, getCognitionUsageByTool은 hour, day, week, month만 허용합니다. 선택적 startTime과 endTime(ISO 날짜-시간)으로 두 메서드 모두 조회 기간을 제한할 수 있습니다.
Mind의 Circle은 협력자의 집합입니다 - 인간 및 다른 Mind. getCircle은 CircleMember[] 배열을 직접 반환하고, addCircleMembers와 removeCircleMembers는 이메일별 결과와 베스트 에포트 요약을 담은 CircleMutationResult 엔벨로프를 반환합니다:
인간 이메일은 어떤 주소든 가능하고, Mind 이메일은 @hellominds.ai로 끝납니다. listCirclesForAccount()는 listMinds()를 호출한 다음 각 Mind에 대해 병렬로 getCircle()을 호출하는 편의 기능입니다. 빈번한 호출 경로(hot paths) 대신 계정 전체 개요를 파악하는 데 사용하세요.
Bazaar 카탈로그
공개 Bazaar 카탈로그는 client.bazaar로 사용할 수 있으며 API 키가 필요하지 않습니다. ID 검색(skillId, appId)을 위해 Bazaar를 사용한 다음, 아래의 Mind 장착 메서드로 해당 ID를 장착하세요. 라우트 형태는 API 참조 의 Bazaar 및 Minds 태그에 있으며, CLI는 minds bazaar를 통해 동일한 카탈로그를 제공합니다.조회된 목록의 각 항목에는 플랫폼 전체에서 해당 항목을 장착한 Mind의 수를 나타내는 equippedCount가 포함될 수 있습니다. 이는 플랫폼 전체의 인기이며, Mind별 장착된 세트는 listEquippedSkills / listEquippedApps를 사용하세요.
await client.sendMessage({ alias: "main", messageText: "Hello" });const rows = await client.getHistory("main", { limit: 50 });// rows[0]이 최신. 마지막 fingerprint → 다음 더 오래된 페이지(통신상 `before`).const cursor = rows.at(-1)?.fingerprint;const older = await client.getHistory("main", { cursor, limit: 50 });
getHistory는 인간과 Mind의 전체 대화 기록을 **최신순(newest-first)**으로 반환합니다. 행에는 senderType(1 = 인간, 0 = Mind)이 사용됩니다. SDK cursor(및 더 이상 사용되지 않는 after)는 쿼리 before로 전송되어 배타적인 다음 더 오래된 페이지를 조회합니다. 동일한 senderType 필드가 subscribeEvents / eventsIterator / waitForReply의 SSE 이벤트에도 나타납니다.sendMessage에는 alias 및 messageText가 필요합니다. 선택적 attachments는 아웃바운드 객체를 허용하며, fileName 및 mimeType이 포함된 공개 HTTPS url을 선호합니다:
await client.sendMessage({ alias: "main", messageText: "Summarize this PDF in one sentence.", attachments: [ { url: "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf", fileName: "dummy.pdf", mimeType: "application/pdf", extension: "pdf", }, ],});
이미지 URL은 동일한 형태(mimeType: "image/png" 등)를 사용합니다. getHistory, waitForReply 및 SSE 이벤트에 대한 Mind 회신에는 다음과 같은 인바운드 아티팩트가 포함될 수 있습니다:
// One attachment on a Mind reply (PDF; artifact body truncated){ artifactId: "7388b65d-144a-49ff-a4dc-cb7c23ded982", slug: "whale_watchtower_skill_artifact_1_0_5", logicalType: "document", mimeType: "application/pdf", extension: "pdf", artifact: "JVBERi0xLjQK...",}
아웃바운드 전송은 인라인 페이로드에 content를 사용하고, 인바운드 회신은 동일한 역할에 artifact를 사용합니다. slug 및 logicalType은 선택적 문자열이며, 값을 고정 열거형이 아닌 힌트로 취급합니다. 필드 세부 정보는 API 참조 를 확인하세요.getLatestHistoryFingerprint는 최신 메시지의 fingerprint를 반환합니다. 이를 waitForReply에 afterFingerprint로 전달하여 전송 후 도착한 회신만 수락하세요. 첫 번째 getHistory 페이지(커서 없음)는 이미 가장 최신 창입니다 - 더 최신 행을 기대하고 해당 fingerprint를 cursor로 전달하지 마세요.
for await (const event of client.eventsIterator({ alias: "main" })) { console.log(event.fingerprint, event.messageText);}
프로세스가 종료될 때 취소하려면 반복자 또는 구독 옵션에 signal을 전달하세요.
오류
실패한 HTTP 호출은 status, code, message가 포함된 MindsApiError를 발생시킵니다. 액세스 토큰도 Builder API 키도 없이 인증 메서드를 호출하면 호출 시점에 missing_builder_api_key가 발생합니다. 401/403은 자격 증명 누락, 만료, 폐기, 또는 사용자가 허용하지 않은 스코프로 해석하세요. 429에는 재시도 안내가 포함될 수 있습니다.