Elaine is a TypeScript library designed for crafting chatbots and conversational interfaces on Node and Edge runtimes, leveraging the OpenAI Chat Completion API.
This project aims to cover a wide spectrum of requirements. While beginners should find it easy and straightforward, seasoned developers should also benefit from its sophisticated features.
- Stream-first: Embracing a stream-first approach ensures that Elaine is incredibly efficient and scalable, especially in modern Edge/v8 environments.
- Function integration out of the box: Effortlessly register functions for the bot, amplifying its capabilities. This seamless integration comes complete with built-in typing and validation.
- Conversation history: Automatic conversation history management right out of the box, storing interactions in-memory for quick access. You can also integrate it with your custom message store.
$ npm i elaine
// bot.mjs
import elaine from "elaine";
const bot = elaine();
const response = await bot.read("Write some story about a cat in just 3 sentences.");
const text = await response.text();
console.log(text);
$ OPENAI_API_KEY=<your key> node bot.mjs
Once upon a time, a curious tabby cat named Whiskers set out on an adventure through the bustling city streets. As he wandered from alley to alley, he encountered friendly shopkeepers, playful children, and even a mischievous squirrel that led him on a chase. Exhausted but content, Whiskers finally returned home, his heart filled with the unforgettable tales of his feline escapade.
Elaine returns a stream by default.
const bot = elaine();
const response = await bot.read("Hello!");
for await (const chunk of response) {
process.stdout.write(chunk);
}
Elaine makes it easy to use functions:
import { z } from "zod";
bot.function({
name: "GetTemperature",
description: "Get the current temperature in the given location",
schema: z.object({ location: z.string() }),
onCall: ({ location }) => "25C",
});
const response = await bot.read("Is it too hot in Miami right now?");
console.log(await response.text());
// The current temperature in Miami is 25°C
Elaine has in-memory conversation history out of the box.
let response = await bot.read("Hello, what's my name?");
console.log(await response.text());
// I'm sorry, but I am an AI language model and I do not have access to personal information.
response = await bot.read("My name is Luis");
console.log(await response.text());
// Hello Luis! How can I assist you today?
response = await bot.read("What's my name?");
console.log(await response.text());
// Your name is Luis.
You can configure your own message store:
import { MessageStore } from "elaine";
class DbMessageStore implements MessageStore {
async add(message: ChatCompletionMessage): Promise<void> {
// save the message to db
}
async get(): Promise<ChatCompletionMessage[]> {
// get all messages from db
}
async clear(): Promise<void> {
// delete all messages from db
}
}
const bot = elaine({
messageStore: new DbMessageStore(),
});
import { Temperature } from "elaine";
import { createWriteStream } from "node:fs";
import { Readable } from "node:stream";
const bot = elaine({
model: "gpt-3.5-turbo-16k",
instructions:
"Write the title of the given document, summarize it and give your opinion about it.",
temperature: Temperature.Consistent,
});
const article = await fetch("https://uist.acm.org/uist2002/files/SOSPadvice.txt");
const summary = await bot.read(await article.text());
const outputFile = createWriteStream("summarized.txt");
await Readable.from(summary).pipe(outputFile);
Useful for advanced customizations or for unit testing:
import { OpenAI } from "openai";
const client = new OpenAI();
const bot = elaine({
client,
params: {
max_tokens: 20,
},
});
const response = await bot.talk();
for await (const chunk of response) {
process.stdout.write(chunk);
}
You can check full code of the above examples and more in the ./examples directory.
The source code for the site is licensed under the MIT license, which you can find in the LICENSE.txt file.