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 🙏

© 2024 – Pkg Stats / Ryan Hefner

dialog-framework

v0.0.0

Published

A framework for creating chatbot dialogs

Downloads

1

Readme

Dialog Framework

Dialog Framework is a framework for building complex asynchronous javascript chatbots in node.js. It is designed to work in stateless systems and to provide as much flexibility to the user as possible.

Install with:

npm i dialog-framework

Hello world example

const Chatbot = require('dialog-framework');

let annotators = [
  async dialog => dialog
];

let agents = {
  root: async dialog => { message: 'hello world!', prompt: true }
};
let chatbot = Chatbot.create(annotators, agents);
let response = chatbot.chat('hi');
response.on('data', (data) => console.log(data.message)); // hello world

Annotators and Agents

Chatbots consists of two components Annotators and Agents.

An annotator is any function that takes an instance of Dialog as input and returns a promise that resolves to the same dialog.

let myAnnotator = async function (dialog) {
  dialog.context.sentiment = await analyseSentiment(dialog.context.input);
  return dialog;
}

An agent is any function that takes a Dialog as input and returns a promise that resolves to an object with any of the following properties or null:

  • message (any type): to be emitted back to the user
  • prompt (boolean): the dialog pauses for further user input
agents['root'] = async function (dialog) {
  if (dialog.context.input.includes('hello')) {
    dialog.push('greetings');
    return;
  } else {
    return { message: 'I\'m sorry, I don\'t understand', prompt: true };
  }
}

agents['greetings'] = async function (dialog) {
  return { message: 'hello world!', prompt: true };
}

The annotator and agent evaluation

Calling chat() on an instance of Chatbot will return an AgentEvaluationStream that runs the following algorithm:

  1. Create new Dialog with the previous context (if supplied).

  2. Run each annotator in series.

  3. If the stack is empty push the root agent.

  4. Pop an agent from the stack and run it.

  5. If the agent returns a message, emit it to the stream with the current context.

  6. If the agent does not prompt repeat from step 3.

  7. End the stream.

    Note it is possible to create loops where no agent prompts. To mitigate this the stream will error if it tries to evaluate over 100 agents or if the root agent was pushed more than 10 times.

const evalStream = chatbot.chat('hello world', myOldContext);
evalStream.on('data', (data) => {
  console.log(data.message);
  console.log(data.context);
});
evalStream.on('error', (err) => {
  console.log('a bad thing happened:', err);
})
evalStream.on('end', () => {
  console.log('finished');
});

Dialog Object

The dialog object is passed to both annotators and agents, exposes the context at dialog.context and several functions for agent evaluation.

dialog.loopCount(); // returns the number of times the active agents has been
                    // called consecutively
dialog.pop();       // removes and returns the next agent from the Stack
dialog.push(agentLabel) // pushes a new agent onto the stack

The pop() function is also included if you want to remove agents from the stack, but this is mainly used internally and would not be used in typical programs.

Development

The package.json includes scripts for running istanbul coverage, eslint and mocha tests:

npm run lint
npm run test
npm run coverage

ToDo

  • [ ] Add examples