npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

plazbot

v2.1.4

Published

Official Plazbot SDK for creating AI agents for WhatsApp, portals, and developers.

Readme

Plazbot SDK

Official SDK to interact with Plazbot AI Agents, Portals, WhatsApp messaging, and more. TypeScript-first with full type definitions.

Installation

npm install plazbot

Quick Start

import { Plazbot } from "plazbot";

const bot = new Plazbot({
  apiKey: "YOUR_API_KEY",
  workspaceId: "YOUR_WORKSPACE_ID",
  zone: "LA" // "LA" or "EU"
});

// Create an agent
const result = await bot.agent.addAgent({
  name: "Support Agent",
  prompt: "You are a helpful assistant.",
  zone: "LA",
  buffer: 5,
  color: "blue"
});

// Chat with the agent
const response = await bot.agent.onMessage({
  agentId: result.agentId,
  question: "Hello!",
  sessionId: "session-123"
});

console.log(response.answer);

You can also import classes individually:

import { Agent, Portal, Message } from "plazbot";

const agent = new Agent({
  apiKey: "YOUR_API_KEY",
  workspaceId: "YOUR_WORKSPACE_ID",
  zone: "LA"
});

Agent

Create Agent

const result = await bot.agent.addAgent({
  name: "Sales Bot",
  prompt: "You are a sales assistant.",
  zone: "LA",
  buffer: 5,
  color: "blue",
  useToolCalling: true,
  instructions: {
    tone: "friendly",
    style: "conversational",
    language: "Espanol",
    emojis: true,
    greeting: "Hola! En que puedo ayudarte?"
  },
  person: {
    name: "Ana",
    role: "Sales advisor",
    speaksInFirstPerson: true
  },
  fallbacks: {
    noAnswer: "I don't have that info.",
    serviceError: "Service is down.",
    doNotUnderstand: "Could you rephrase?"
  }
});

console.log(result.agentId);

Update Agent

await bot.agent.updateAgent("AGENT_ID", {
  name: "Updated Bot",
  useToolCalling: false
});

List / Get / Copy / Delete

const agents = await bot.agent.getAgents();
const agent = await bot.agent.getAgentById({ id: "AGENT_ID" });
const copy = await bot.agent.copyAgent({ id: "AGENT_ID" });
await bot.agent.deleteAgent({ id: "AGENT_ID" });

Chat

const response = await bot.agent.onMessage({
  agentId: "AGENT_ID",
  question: "What products do you offer?",
  sessionId: "session-uuid"
});

console.log(response.answer);
console.log(response.sources);         // Knowledge base sources
console.log(response.actionsExecuted); // Tool Calling actions executed

Knowledge Base (Files)

// Add file
const file = await bot.agent.addFile({
  fileUrl: "https://example.com/document.pdf",
  reference: "Product catalog",
  agentId: "AGENT_ID"
});

// Check processing status
const status = await bot.agent.validateFile({ fileId: "FILE_ID" });

// Remove file
await bot.agent.deleteFile({ fileId: "FILE_ID", agentId: "AGENT_ID" });

Quick Configuration

await bot.agent.setGreeting("AGENT_ID", "Welcome!");
await bot.agent.setInstructions("AGENT_ID", { tone: "professional", emojis: false });
await bot.agent.setPersona("AGENT_ID", { name: "Carlos", role: "Support" });
await bot.agent.setFallbacks("AGENT_ID", { noAnswer: "I can't help with that." });
await bot.agent.setRules("AGENT_ID", { doNotMentionPrices: true });
await bot.agent.setTags("AGENT_ID", ["support", "premium"]);

Widget

const widget = await bot.agent.enableWidget({ id: "AGENT_ID", enable: true });
console.log(widget.script); // Embed script

AI Utilities

const improved = await bot.agent.improvePrompt("help users buy stuff");
console.log(improved.result);

Portal

Create Portal

const portal = await bot.portal.addPortal({
  name: "Support Portal",
  zone: "LA",
  theme: "dark",
  access: "direct"
});
console.log(portal.id, portal.url);

Update / Get / Delete

await bot.portal.updatePortal({ id: "PORTAL_ID", name: "New Name", theme: "light" });
const portal = await bot.portal.getPortal("PORTAL_ID");
await bot.portal.deletePortal("PORTAL_ID");

Links & Agents

await bot.portal.addAgentToPortal({ portalId: "PORTAL_ID", id: "AGENT_ID" });
await bot.portal.removeAgentFromPortal({ portalId: "PORTAL_ID", id: "AGENT_ID" });
await bot.portal.addLinkToPortal({ portalId: "PORTAL_ID", value: "FAQ", url: "/faq" });
await bot.portal.clearLinks("PORTAL_ID");

Message (WhatsApp)

Send Direct Message

await bot.message.onWhatsappMessage({
  to: "5491123456789",
  message: "Hello from Plazbot!"
});

Send Template

await bot.message.onConversation({
  to: "5491123456789",
  template: "welcome_template",
  variablesBody: [{ variable: "1", value: "John" }],
  variablesHeader: [{ variable: "1", value: "Acme Inc" }],
  file: { fileUrl: "https://example.com/file.pdf", fileName: "catalog.pdf" }
});

Message History

const messages = await bot.message.getMessages({ contactId: "CONTACT_ID" });
const history = await bot.message.getConversationHistory({ contactId: "CONTACT_ID" });
const results = await bot.message.searchMessages({ query: "invoice" });

Webhooks

await bot.message.registerWebhook({ number: "5491123456789", webhookUrl: "https://myapp.com/webhook" });
await bot.message.deleteWebhook({ number: "5491123456789" });

Template

const templates = await bot.template.getTemplates();
const active = await bot.template.getActiveTemplates();
const template = await bot.template.getTemplate("TEMPLATE_ID");

Contact

const contacts = await bot.contact.getContacts();
const contact = await bot.contact.getContact("CONTACT_ID");
const found = await bot.contact.searchByPhone("5491123456789");
const byEmail = await bot.contact.searchByEmail("[email protected]");

const newContact = await bot.contact.createContact({
  name: "John Doe",
  cellphone: "5491123456789",
  email: "[email protected]"
});

await bot.contact.updateContact({ id: "CONTACT_ID", name: "Jane Doe" });
await bot.contact.deleteContacts(["CONTACT_ID_1", "CONTACT_ID_2"]);

Tool Calling Configuration

Configure agents to execute actions automatically via the agent config:

await bot.agent.addAgent({
  name: "Clinic Bot",
  prompt: "You help patients schedule appointments.",
  zone: "LA",
  buffer: 5,
  useToolCalling: true,
  services: [{
    intent: "check_availability",
    reference: "availability, schedule, free slots",
    method: "GET",
    endpoint: "https://api.clinic.com/availability",
    requiredFields: [
      { name: "date", type: "date", description: "Appointment date" }
    ],
    responseMessage: "Here are the available slots:"
  }],
  actions: [{
    intent: "schedule_appointment",
    reference: "schedule, book, appointment",
    enabled: true,
    action: [{ type: "action.event.add", value: "" }],
    requiredFields: [
      { name: "date", type: "datetime", description: "Date and time" },
      { name: "patient", type: "string", description: "Patient name" }
    ],
    responseMessage: "Your appointment has been scheduled."
  }]
});

Available Action Types

| Type | Description | |------|-------------| | action.event.add | Schedule event | | action.event.update | Reschedule event | | action.event.delete | Cancel event | | action.event.list | List events | | action.tag | Add tag to contact | | action.stage | Change contact stage | | action.agentShutDown | Transfer to human agent | | action.solved | Mark as resolved | | action.asign | Assign to agent | | action.segmentation | Apply segmentation |


TypeScript Types

All types are exported for full type safety:

import type {
  AgentConfig,
  AgentData,
  AgentResponse,
  AgentSource,
  AIProvider,
  AgentInstructions,
  AgentPerson,
  AgentFallbacks,
  AgentService,
  AgentAction,
  PortalConfig,
  SendTemplateParams,
  ContactData,
  WhatsAppTemplate,
  PlazbotOptions,
} from "plazbot";

Development Flag

All classes accept a customUrl option for local development:

const bot = new Plazbot({
  apiKey: "YOUR_API_KEY",
  workspaceId: "YOUR_WORKSPACE_ID",
  zone: "LA",
  customUrl: "http://localhost:5090"
});

Scripts

  • npm run build - Compile TypeScript
  • npm run clean - Remove dist folder
  • npm run release - Bump version and publish

License

MIT