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

ai-utils.js

v0.0.43

Published

Build AI applications, chatbots, and agents with JavaScript and TypeScript.

Downloads

187

Readme

ai-utils.js

Build AI applications, chatbots, and agents with JavaScript and TypeScript.

Created by Lars Grammel NPM Version MIT License

Introduction | Quick Install | Usage | Features | Integrations | Documentation | Examples | ai-utils.dev

Disclaimer

ai-utils.js is currently in its initial development phase. Until version 0.1 there may be frequent breaking changes.

Introduction

ai-utils.js is a library for building AI apps, chatbots, and agents. It provides abstractions for working with AI models, vector indices, and tools. It was designed with the following goals in mind:

  • Provide type inference and validation: ai-utils.js uses TypeScript and Zod to infer types whereever possible and to validate AI responses.
  • Flexibility and control: AI application development can be complex and unique to each project. With ai-utils.js, you have complete control over the prompts, the model settings, and the control flow of your application. You can also access the full responses from the models and metadata easily to build what you need.
  • Integrate support features: Essential features like logging, retries, throttling, and error handling are integrated and easily configurable.

Quick Install

npm install ai-utils.js

You need to install zod and a matching version of zod-to-json-schema (peer dependencies):

npm install zod zod-to-json-schema

Usage Examples

You can provide API keys for the different integrations using environment variables (e.g., OPENAI_API_KEY) or pass them into the model constructors as options.

Generate Text

Generate text using a language model and a prompt. You can stream the text if it is supported by the model. You can use prompt mappings to change the prompt format of a model.

generateText

const { text } = await generateText(
  new OpenAITextGenerationModel({ model: "text-davinci-003" }),
  "Write a short story about a robot learning to love:\n\n"
);

streamText

const { textStream } = await streamText(
  new OpenAIChatModel({ model: "gpt-3.5-turbo", maxTokens: 1000 }),
  [
    OpenAIChatMessage.system("You are a story writer."),
    OpenAIChatMessage.user("Write a story about a robot learning to love"),
  ]
);

for await (const textFragment of textStream) {
  process.stdout.write(textFragment);
}

Prompt Mapping

Prompt mapping lets you use higher level prompt structures (such as instruction or chat prompts) for different models.

const { text } = await generateText(
  new LlamaCppTextGenerationModel({
    contextWindowSize: 4096, // Llama 2 context window size
    nPredict: 1000,
  }).mapPrompt(InstructionToLlama2PromptMapping()),
  {
    system: "You are a story writer.",
    instruction: "Write a short story about a robot learning to love.",
  }
);
const { textStream } = await streamText(
  new OpenAIChatModel({
    model: "gpt-3.5-turbo",
  }).mapPrompt(ChatToOpenAIChatPromptMapping()),
  [
    { system: "You are a celebrated poet." },
    { user: "Write a short story about a robot learning to love." },
    { ai: "Once upon a time, there was a robot who learned to love." },
    { user: "That's a great start!" },
  ]
);

Metadata and original responses

Most ai-utils.js model functions return rich results that include the original response and metadata.

const { text, response, metadata } = await generateText(
  new OpenAITextGenerationModel({
    model: "text-davinci-003",
  }),
  "Write a short story about a robot learning to love:\n\n"
);

Generate JSON

Generate JSON value that matches a schema.

const { value } = await generateJson(
  new OpenAIChatModel({
    model: "gpt-3.5-turbo",
    temperature: 0,
    maxTokens: 50,
  }),
  {
    name: "sentiment" as const,
    description: "Write the sentiment analysis",
    schema: z.object({
      sentiment: z
        .enum(["positive", "neutral", "negative"])
        .describe("Sentiment."),
    }),
  },
  OpenAIChatFunctionPrompt.forSchemaCurried([
    OpenAIChatMessage.system(
      "You are a sentiment evaluator. " +
        "Analyze the sentiment of the following product review:"
    ),
    OpenAIChatMessage.user(
      "After I opened the package, I was met by a very unpleasant smell " +
        "that did not disappear even after washing. Never again!"
    ),
  ])
);

Generate JSON or Text

Generate JSON (or text as a fallback) using a prompt and multiple schemas. It either matches one of the schemas or is text reponse.

const { schema, value, text } = await generateJsonOrText(
  new OpenAIChatModel({ model: "gpt-3.5-turbo", maxTokens: 1000 }),
  [
    {
      name: "getCurrentWeather" as const, // mark 'as const' for type inference
      description: "Get the current weather in a given location",
      schema: z.object({
        location: z
          .string()
          .describe("The city and state, e.g. San Francisco, CA"),
        unit: z.enum(["celsius", "fahrenheit"]).optional(),
      }),
    },
    {
      name: "getContactInformation" as const,
      description: "Get the contact information for a given person",
      schema: z.object({
        name: z.string().describe("The name of the person"),
      }),
    },
  ],
  OpenAIChatFunctionPrompt.forSchemasCurried([OpenAIChatMessage.user(query)])
);

Tools

Tools are functions that can be executed by an AI model. They are useful for building chatbots and agents.

Create Tool

A tool is a function with a name, a description, and a schema for the input parameters.

const calculator = new Tool({
  name: "calculator" as const, // mark 'as const' for type inference
  description: "Execute a calculation",

  inputSchema: z.object({
    a: z.number().describe("The first number."),
    b: z.number().describe("The second number."),
    operator: z.enum(["+", "-", "*", "/"]).describe("The operator."),
  }),

  execute: async ({ a, b, operator }) => {
    switch (operator) {
      case "+":
        return a + b;
      case "-":
        return a - b;
      case "*":
        return a * b;
      case "/":
        return a / b;
      default:
        throw new Error(`Unknown operator: ${operator}`);
    }
  },
});

useTool

The model determines the parameters for the tool from the prompt and then executes it.

const { tool, parameters, result } = await useTool(
  new OpenAIChatModel({ model: "gpt-3.5-turbo" }),
  calculator,
  OpenAIChatFunctionPrompt.forToolCurried([
    OpenAIChatMessage.user("What's fourteen times twelve?"),
  ])
);

useToolOrGenerateText

The model determines which tool to use and its parameters from the prompt and then executes it. Text is generated as a fallback.

const { tool, parameters, result, text } = await useToolOrGenerateText(
  new OpenAIChatModel({ model: "gpt-3.5-turbo" }),
  [calculator /* ... */],
  OpenAIChatFunctionPrompt.forToolsCurried([
    OpenAIChatMessage.user("What's fourteen times twelve?"),
  ])
);

Transcribe Audio

Turn audio (voice) into text.

const { transcription } = await transcribe(
  new OpenAITranscriptionModel({ model: "whisper-1" }),
  {
    type: "mp3",
    data: await fs.promises.readFile("data/test.mp3"),
  }
);

Generate Image

Generate a base64-encoded image from a prompt.

const { image } = await generateImage(
  new OpenAIImageGenerationModel({ size: "512x512" }),
  "the wicked witch of the west in the style of early 19th century painting"
);

Embed Text

Create embeddings for text. Embeddings are vectors that represent the meaning of the text.

const { embeddings } = await embedTexts(
  new OpenAITextEmbeddingModel({ model: "text-embedding-ada-002" }),
  [
    "At first, Nox didn't know what to do with the pup.",
    "He keenly observed and absorbed everything around him, from the birds in the sky to the trees in the forest.",
  ]
);

Tokenize Text

Split text into tokens and reconstruct the text from tokens.

const tokenizer = new TikTokenTokenizer({ model: "gpt-4" });

const text = "At first, Nox didn't know what to do with the pup.";

const tokenCount = await countTokens(tokenizer, text);

const tokens = await tokenizer.tokenize(text);
const tokensAndTokenTexts = await tokenizer.tokenizeWithTexts(text);
const reconstructedText = await tokenizer.detokenize(tokens);

Upserting and Retrieving Text Chunks from Vector Indices

const texts = [
  "A rainbow is an optical phenomenon that can occur under certain meteorological conditions.",
  "It is caused by refraction, internal reflection and dispersion of light in water droplets resulting in a continuous spectrum of light appearing in the sky.",
  // ...
];

const vectorIndex = new MemoryVectorIndex<TextChunk>();
const embeddingModel = new OpenAITextEmbeddingModel({
  model: "text-embedding-ada-002",
});

// update an index - usually done as part of an ingestion process:
await upsertTextChunks({
  vectorIndex,
  embeddingModel,
  chunks: texts.map((text) => ({ content: text })),
});

// retrieve text chunks from the vector index - usually done at query time:
const { chunks } = await retrieveTextChunks(
  new VectorIndexSimilarTextChunkRetriever({
    vectorIndex,
    embeddingModel,
    maxResults: 3,
    similarityThreshold: 0.8,
  }),
  "rainbow and water droplets"
);

Features

Integrations

Model Providers

| | OpenAI | Cohere | Llama.cpp | Hugging Face | Stability AI | Automatic1111 | | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | | Hosting | cloud | cloud | server (local) | cloud | cloud | server (local) | | Generate text | ✅ | ✅ | ✅ | ✅ | | | | Stream text | ✅ | ✅ | ✅ | | | | | Generate JSON | chat models | | | | | | | Generate JSON or Text | chat models | | | | | | | Embed text | ✅ | ✅ | ✅ | | | | | Tokenize text | full | full | basic | | | | | Generate image | ✅ | | | | ✅ | ✅ | | Transcribe audio | ✅ | | | | | | | Cost calculation | ✅ | | | | | |

Vector Indices

Documentation

More Examples

Basic Examples

Examples for the individual functions and objects.

PDF to Tweet

terminal app, PDF parsing, recursive information extraction, in memory vector index, _style example retrieval, OpenAI GPT-4, cost calculation

Extracts information about a topic from a PDF and writes a tweet in your own style about it.

AI Chat (Next.JS)

Next.js app, OpenAI GPT-3.5-turbo, streaming, abort handling

A basic web chat with an AI assistant, implemented as a Next.js app.

Image generator (Next.js)

Next.js app, Stability AI image generation

Create an 19th century painting image for your input.

Voice recording and transcription (Next.js)

Next.js app, OpenAI Whisper

Record audio with push-to-talk and transcribe it using Whisper, implemented as a Next.js app. The app shows a list of the transcriptions.

BabyAGI Classic

terminal app, agent, BabyAGI, OpenAI text-davinci-003

TypeScript implementation of the classic BabyAGI by @yoheinakajima without embeddings.

Middle school math

terminal app, agent, tools, GPT-4

Small agent that solves middle school math problems. It uses a calculator tool to solve the problems.

Terminal Chat (llama.cpp)

Terminal app, chat, llama.cpp

A terminal chat with a Llama.cpp server backend.