@mintplex-labs/anythingllm-hub-cli
Version: 
CLI tool for interacting with the AnythingLLM Hub for custom agent skills and data connectors
120 lines (108 loc) • 3.97 kB
JavaScript
const fetch = require('node-fetch');
const fs = require('fs');
class CommunityHubInterface {
  apiBaseDev = "http://127.0.0.1:5001/anythingllm-hub/us-central1/external";
  apiBaseProd = "https://hub.external.anythingllm.com";
  constructor({ debug = false } = {}) {
    this.debug = debug;
    this.apiBase = debug ? this.apiBaseDev : this.apiBaseProd;
  }
  _debugLog(message) {
    if (this.debug) console.log(`[CommunityHubInterface:DEBUG] ${message}`);
  }
  _log(message, ...args) {
    console.log(`[CommunityHubInterface] ${message}`, ...args);
  }
  /**
   * Checks if the connection key is valid.
   * @param {string} connectionKey
   * @returns {Promise<boolean>}
   */
  async authCheck(connectionKey) {
    if (!this.debug) this._log(`Logging into hub.anythingllm.com...`);
    this._debugLog(`Checking auth for connection key against ${new URL(this.apiBase).origin}`);
    return await fetch(`${this.apiBase}/auth`, {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${connectionKey}`
      }
    })
      .then(response => response.ok)
      .catch(error => {
        console.error('Error checking auth:', error);
        return false;
      });
  }
  /**
   * Gets the user info.
   * @returns {Promise<{id: string, username: string, author_url: string}>}
   */
  async getUserInfo() {
    return fetch(`${this.apiBase}/v1/me`, {
      headers: { 'Authorization': `Bearer ${this.connectionKey}` }
    }).then(response => response.json())
      .catch(error => {
        console.error('Error getting user info:', error);
        return null;
      });
  }
  /**
   * Registers a skill with the AnythingLLM Hub.
   * @param {('agent-skill')} entityType - The type of entity to register.
   * @returns {Promise<{signedUrl: string, uri: string, entityId: string, error?: string}>}
   */
  async prepareUpload(entityType, visibility) {
    return fetch(`${this.apiBase}/v1/${entityType}/prepare`, {
      method: 'POST',
      headers: { 'Authorization': `Bearer ${this.connectionKey}` },
      body: JSON.stringify({ visibility })
    })
      .then(response => {
        if (!response.ok) throw new Error(`${response.status} - ${response.statusText}`);
        return response.json();
      })
      .catch(error => {
        console.error('Error preparing upload:', error);
        return { error: error.message };
      });
  }
  /**
   * Uploads a file to the AnythingLLM Hub.
   * @param {Object} uploadResponse - The response from the prepareUpload method.
   * @param {Object} uploadResponse.signedUrl - The signed URL to upload the file to.
   * @param {string} filePath - The path to the file to upload.
   * @returns {Promise<void>}
   */
  async uploadFile({ signedUrl, uri, debug = false }, zipBundlePath) {
    const uploadUrl = new URL(signedUrl);
    if (debug) uploadUrl.searchParams.set('uri', uri);
    const response = await fetch(uploadUrl, {
      method: 'PUT',
      body: fs.readFileSync(zipBundlePath),
      headers: {
        'Content-Type': 'application/zip',
      }
    });
    return response.ok;
  }
  /**
   * Finalizes an upload to the AnythingLLM Hub.
   * @param {('agent-skill')} entityType - The type of entity to finalize.
   * @param {string} entityId - The ID of the entity to finalize.
   * @param {{name: string, description: string, files: {path: string, name: string, size: number, content: string}[]}[]} manifestData - The manifest data to finalize the upload with.
   * @returns {Promise<boolean>}
   */
  async finalizeUpload(entityType, entityId, manifestData) {
    return fetch(`${this.apiBase}/v1/${entityType}/finalize/${entityId}`, {
      method: 'POST',
      headers: { 'Authorization': `Bearer ${this.connectionKey}` },
      body: JSON.stringify(manifestData)
    })
      .then(response => response.ok)
      .catch(error => {
        console.error('Error finalizing upload:', error);
        return false;
      });
  }
}
module.exports = CommunityHubInterface;