• Stars
    star
    12,733
  • Rank 2,517 (Top 0.05 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 2 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Node.js client for the official ChatGPT API. 🔥

ChatGPT API

Node.js client for the official ChatGPT API.

NPM Build Status MIT License Prettier Code Formatting

Intro

This package is a Node.js wrapper around ChatGPT by OpenAI. TS batteries included.

Example usage

Updates

April 10, 2023

This package now fully supports GPT-4! 🔥

We also just released a TypeScript chatgpt-plugin package which contains helpers and examples to make it as easy as possible to start building your own ChatGPT Plugins in JS/TS. Even if you don't have developer access to ChatGPT Plugins yet, you can still use the chatgpt-plugin repo to get a head start on building your own plugins locally.

If you have access to the gpt-4 model, you can run the following to test out the CLI with GPT-4:

npx chatgpt@latest --model gpt-4 "Hello world"

Using the chatgpt CLI with gpt-4

We still support both the official ChatGPT API and the unofficial proxy API, but we now recommend using the official API since it's significantly more robust and supports GPT-4.

Method Free? Robust? Quality?
ChatGPTAPI No Yes ✅️ Real ChatGPT models + GPT-4
ChatGPTUnofficialProxyAPI Yes No️ ChatGPT webapp

Note: We strongly recommend using ChatGPTAPI since it uses the officially supported API from OpenAI. We will likely remove support for ChatGPTUnofficialProxyAPI in a future release.

  1. ChatGPTAPI - Uses the gpt-3.5-turbo model with the official OpenAI chat completions API (official, robust approach, but it's not free)
  2. ChatGPTUnofficialProxyAPI - Uses an unofficial proxy server to access ChatGPT's backend API in a way that circumvents Cloudflare (uses the real ChatGPT and is pretty lightweight, but relies on a third-party server and is rate-limited)
Previous Updates
March 1, 2023

The official OpenAI chat completions API has been released, and it is now the default for this package! 🔥

Method Free? Robust? Quality?
ChatGPTAPI No Yes ✅️ Real ChatGPT models
ChatGPTUnofficialProxyAPI Yes ☑️ Maybe Real ChatGPT

Note: We strongly recommend using ChatGPTAPI since it uses the officially supported API from OpenAI. We may remove support for ChatGPTUnofficialProxyAPI in a future release.

  1. ChatGPTAPI - Uses the gpt-3.5-turbo model with the official OpenAI chat completions API (official, robust approach, but it's not free)
  2. ChatGPTUnofficialProxyAPI - Uses an unofficial proxy server to access ChatGPT's backend API in a way that circumvents Cloudflare (uses the real ChatGPT and is pretty lightweight, but relies on a third-party server and is rate-limited)
Feb 19, 2023

We now provide three ways of accessing the unofficial ChatGPT API, all of which have tradeoffs:

Method Free? Robust? Quality?
ChatGPTAPI No Yes ☑️ Mimics ChatGPT
ChatGPTUnofficialProxyAPI Yes ☑️ Maybe Real ChatGPT
ChatGPTAPIBrowser (v3) Yes No Real ChatGPT

Note: I recommend that you use either ChatGPTAPI or ChatGPTUnofficialProxyAPI.

  1. ChatGPTAPI - (Used to use) text-davinci-003 to mimic ChatGPT via the official OpenAI completions API (most robust approach, but it's not free and doesn't use a model fine-tuned for chat)
  2. ChatGPTUnofficialProxyAPI - Uses an unofficial proxy server to access ChatGPT's backend API in a way that circumvents Cloudflare (uses the real ChatGPT and is pretty lightweight, but relies on a third-party server and is rate-limited)
  3. ChatGPTAPIBrowser - (deprecated; v3.5.1 of this package) Uses Puppeteer to access the official ChatGPT webapp (uses the real ChatGPT, but very flaky, heavyweight, and error prone)
Feb 5, 2023

OpenAI has disabled the leaked chat model we were previously using, so we're now defaulting to text-davinci-003, which is not free.

We've found several other hidden, fine-tuned chat models, but OpenAI keeps disabling them, so we're searching for alternative workarounds.

Feb 1, 2023

This package no longer requires any browser hacks – it is now using the official OpenAI completions API with a leaked model that ChatGPT uses under the hood. 🔥

import { ChatGPTAPI } from 'chatgpt'

const api = new ChatGPTAPI({
  apiKey: process.env.OPENAI_API_KEY
})

const res = await api.sendMessage('Hello World!')
console.log(res.text)

Please upgrade to chatgpt@latest (at least v4.0.0). The updated version is significantly more lightweight and robust compared with previous versions. You also don't have to worry about IP issues or rate limiting.

Huge shoutout to @waylaidwanderer for discovering the leaked chat model!

If you run into any issues, we do have a pretty active ChatGPT Hackers Discord with over 8k developers from the Node.js & Python communities.

Lastly, please consider starring this repo and following me on twitter twitter to help support the project.

Thanks && cheers, Travis

CLI

To run the CLI, you'll need an OpenAI API key:

export OPENAI_API_KEY="sk-TODO"
npx chatgpt "your prompt here"

By default, the response is streamed to stdout, the results are stored in a local config file, and every invocation starts a new conversation. You can use -c to continue the previous conversation and --no-stream to disable streaming.

Usage:
  $ chatgpt <prompt>

Commands:
  <prompt>  Ask ChatGPT a question
  rm-cache  Clears the local message cache
  ls-cache  Prints the local message cache path

For more info, run any command with the `--help` flag:
  $ chatgpt --help
  $ chatgpt rm-cache --help
  $ chatgpt ls-cache --help

Options:
  -c, --continue          Continue last conversation (default: false)
  -d, --debug             Enables debug logging (default: false)
  -s, --stream            Streams the response (default: true)
  -s, --store             Enables the local message cache (default: true)
  -t, --timeout           Timeout in milliseconds
  -k, --apiKey            OpenAI API key
  -o, --apiOrg            OpenAI API organization
  -n, --conversationName  Unique name for the conversation
  -h, --help              Display this message
  -v, --version           Display version number

If you have access to the gpt-4 model, you can run the following to test out the CLI with GPT-4:

Using the chatgpt CLI with gpt-4

Install

npm install chatgpt

Make sure you're using node >= 18 so fetch is available (or node >= 14 if you install a fetch polyfill).

Usage

To use this module from Node.js, you need to pick between two methods:

Method Free? Robust? Quality?
ChatGPTAPI No Yes ✅️ Real ChatGPT models + GPT-4
ChatGPTUnofficialProxyAPI Yes No️ Real ChatGPT webapp
  1. ChatGPTAPI - Uses the gpt-3.5-turbo model with the official OpenAI chat completions API (official, robust approach, but it's not free). You can override the model, completion params, and system message to fully customize your assistant.

  2. ChatGPTUnofficialProxyAPI - Uses an unofficial proxy server to access ChatGPT's backend API in a way that circumvents Cloudflare (uses the real ChatGPT and is pretty lightweight, but relies on a third-party server and is rate-limited)

Both approaches have very similar APIs, so it should be simple to swap between them.

Note: We strongly recommend using ChatGPTAPI since it uses the officially supported API from OpenAI and it also supports gpt-4. We will likely remove support for ChatGPTUnofficialProxyAPI in a future release.

Usage - ChatGPTAPI

Sign up for an OpenAI API key and store it in your environment.

import { ChatGPTAPI } from 'chatgpt'

async function example() {
  const api = new ChatGPTAPI({
    apiKey: process.env.OPENAI_API_KEY
  })

  const res = await api.sendMessage('Hello World!')
  console.log(res.text)
}

You can override the default model (gpt-3.5-turbo) and any OpenAI chat completion params using completionParams:

const api = new ChatGPTAPI({
  apiKey: process.env.OPENAI_API_KEY,
  completionParams: {
    model: 'gpt-4',
    temperature: 0.5,
    top_p: 0.8
  }
})

If you want to track the conversation, you'll need to pass the parentMessageId like this:

const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_API_KEY })

// send a message and wait for the response
let res = await api.sendMessage('What is OpenAI?')
console.log(res.text)

// send a follow-up
res = await api.sendMessage('Can you expand on that?', {
  parentMessageId: res.id
})
console.log(res.text)

// send another follow-up
res = await api.sendMessage('What were we talking about?', {
  parentMessageId: res.id
})
console.log(res.text)

You can add streaming via the onProgress handler:

const res = await api.sendMessage('Write a 500 word essay on frogs.', {
  // print the partial response as the AI is "typing"
  onProgress: (partialResponse) => console.log(partialResponse.text)
})

// print the full text at the end
console.log(res.text)

You can add a timeout using the timeoutMs option:

// timeout after 2 minutes (which will also abort the underlying HTTP request)
const response = await api.sendMessage(
  'write me a really really long essay on frogs',
  {
    timeoutMs: 2 * 60 * 1000
  }
)

If you want to see more info about what's actually being sent to OpenAI's chat completions API, set the debug: true option in the ChatGPTAPI constructor:

const api = new ChatGPTAPI({
  apiKey: process.env.OPENAI_API_KEY,
  debug: true
})

We default to a basic systemMessage. You can override this in either the ChatGPTAPI constructor or sendMessage:

const res = await api.sendMessage('what is the answer to the universe?', {
  systemMessage: `You are ChatGPT, a large language model trained by OpenAI. You answer as concisely as possible for each responseIf you are generating a list, do not have too many items.
Current date: ${new Date().toISOString()}\n\n`
})

Note that we automatically handle appending the previous messages to the prompt and attempt to optimize for the available tokens (which defaults to 4096).

Usage in CommonJS (Dynamic import)
async function example() {
  // To use ESM in CommonJS, you can use a dynamic import like this:
  const { ChatGPTAPI } = await import('chatgpt')
  // You can also try dynamic importing like this:
  // const importDynamic = new Function('modulePath', 'return import(modulePath)')
  // const { ChatGPTAPI } = await importDynamic('chatgpt')

  const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_API_KEY })

  const res = await api.sendMessage('Hello World!')
  console.log(res.text)
}

Usage - ChatGPTUnofficialProxyAPI

The API for ChatGPTUnofficialProxyAPI is almost exactly the same. You just need to provide a ChatGPT accessToken instead of an OpenAI API key.

import { ChatGPTUnofficialProxyAPI } from 'chatgpt'

async function example() {
  const api = new ChatGPTUnofficialProxyAPI({
    accessToken: process.env.OPENAI_ACCESS_TOKEN
  })

  const res = await api.sendMessage('Hello World!')
  console.log(res.text)
}

See demos/demo-reverse-proxy for a full example:

npx tsx demos/demo-reverse-proxy.ts

ChatGPTUnofficialProxyAPI messages also contain a conversationid in addition to parentMessageId, since the ChatGPT webapp can't reference messages across different accounts & conversations.

Reverse Proxy

You can override the reverse proxy by passing apiReverseProxyUrl:

const api = new ChatGPTUnofficialProxyAPI({
  accessToken: process.env.OPENAI_ACCESS_TOKEN,
  apiReverseProxyUrl: 'https://your-example-server.com/api/conversation'
})

Known reverse proxies run by community members include:

Reverse Proxy URL Author Rate Limits Last Checked
https://ai.fakeopen.com/api/conversation @pengzhile 5 req / 10 seconds by IP 4/18/2023
https://api.pawan.krd/backend-api/conversation @PawanOsman 50 req / 15 seconds (~3 r/s) 3/23/2023

Note: info on how the reverse proxies work is not being published at this time in order to prevent OpenAI from disabling access.

Access Token

To use ChatGPTUnofficialProxyAPI, you'll need an OpenAI access token from the ChatGPT webapp. To do this, you can use any of the following methods which take an email and password and return an access token:

These libraries work with email + password accounts (e.g., they do not support accounts where you auth via Microsoft / Google).

Alternatively, you can manually get an accessToken by logging in to the ChatGPT webapp and then opening https://chat.openai.com/api/auth/session, which will return a JSON object containing your accessToken string.

Access tokens last for days.

Note: using a reverse proxy will expose your access token to a third-party. There shouldn't be any adverse effects possible from this, but please consider the risks before using this method.

Docs

See the auto-generated docs for more info on methods and parameters.

Demos

Most of the demos use ChatGPTAPI. It should be pretty easy to convert them to use ChatGPTUnofficialProxyAPI if you'd rather use that approach. The only thing that needs to change is how you initialize the api with an accessToken instead of an apiKey.

To run the included demos:

  1. clone repo
  2. install node deps
  3. set OPENAI_API_KEY in .env

A basic demo is included for testing purposes:

npx tsx demos/demo.ts

A demo showing on progress handler:

npx tsx demos/demo-on-progress.ts

The on progress demo uses the optional onProgress parameter to sendMessage to receive intermediary results as ChatGPT is "typing".

A conversation demo:

npx tsx demos/demo-conversation.ts

A persistence demo shows how to store messages in Redis for persistence:

npx tsx demos/demo-persistence.ts

Any keyv adaptor is supported for persistence, and there are overrides if you'd like to use a different way of storing / retrieving messages.

Note that persisting message is required for remembering the context of previous conversations beyond the scope of the current Node.js process, since by default, we only store messages in memory. Here's an external demo of using a completely custom database solution to persist messages.

Note: Persistence is handled automatically when using ChatGPTUnofficialProxyAPI because it is connecting indirectly to ChatGPT.

Projects

All of these awesome projects are built using the chatgpt package. 🤯

If you create a cool integration, feel free to open a PR and add it to the list.

Compatibility

  • This package is ESM-only.
  • This package supports node >= 14.
  • This module assumes that fetch is installed.
    • In node >= 18, it's installed by default.
    • In node < 18, you need to install a polyfill like unfetch/polyfill (guide) or isomorphic-fetch (guide).
  • If you want to build a website using chatgpt, we recommend using it only from your backend API

Credits

License

MIT © Travis Fischer

If you found this project interesting, please consider sponsoring me or following me on twitter twitter

More Repositories

1

create-react-library

CLI for creating reusable react libraries.
JavaScript
4,783
star
2

nextjs-notion-starter-kit

Deploy your own Notion-powered website in minutes with Next.js and Vercel.
TypeScript
4,211
star
3

awesome-puppeteer

A curated list of awesome puppeteer resources.
2,073
star
4

react-particle-effect-button

Bursting particle effect buttons for React 🎉
JavaScript
1,463
star
5

awesome-ffmpeg

👻 A curated list of awesome FFmpeg resources.
847
star
6

bing-chat

Node.js client for Bing's new AI-powered search. It's like ChatGPT on steroids 🔥
TypeScript
745
star
7

ffmpeg-concat

Concats a list of videos together using ffmpeg with sexy OpenGL transitions.
JavaScript
721
star
8

chatgpt-twitter-bot

Twitter bot powered by OpenAI's ChatGPT API. It's aliveeeee 🤖
TypeScript
629
star
9

functional-typescript

TypeScript standard for rock solid serverless functions.
TypeScript
628
star
10

chatgpt-plugin-ts

Everything you need to start building ChatGPT Plugins in JS/TS 🔥
TypeScript
546
star
11

ffmpeg-gl-transition

FFmpeg filter for applying GLSL transitions between video streams.
C
525
star
12

OpenOpenAI

Self-hosted version of OpenAI’s new stateful Assistants API
TypeScript
509
star
13

react-static-tweets

Extremely fast static renderer for tweets.
TypeScript
506
star
14

yt-semantic-search

OpenAI-powered semantic search for any YouTube playlist – featuring the All-In Podcast. 💪
TypeScript
423
star
15

twitter-search

Instantly search across your entire Twitter history with a beautiful UI powered by Algolia.
TypeScript
347
star
16

check-links

Robustly checks an array of URLs for liveness. Extremely fast ⚡
JavaScript
324
star
17

react-modern-library-boilerplate

Boilerplate for publishing modern React modules with Rollup
JavaScript
324
star
18

puppeteer-lottie

Renders Lottie animations via Puppeteer to image, GIF, or MP4.
JavaScript
309
star
19

snapchat

NodeJS client for the unofficial Snapchat API
JavaScript
265
star
20

lqip-modern

Modern approach to Low Quality Image Placeholders (LQIP) using webp and sharp.
JavaScript
221
star
21

sms-number-verifier

Allows you to spoof SMS number verification.
JavaScript
173
star
22

puppeteer-email

Email automation driven by headless chrome.
JavaScript
149
star
23

ffmpeg-generate-video-preview

Generates an attractive image strip or GIF preview from a video.
JavaScript
138
star
24

random

The most random module on npm
TypeScript
128
star
25

scikit-learn-ts

Powerful machine learning library for Node.js – uses Python's scikit-learn under the hood.
TypeScript
125
star
26

react-background-slideshow

Sexy tiled background slideshow for React 🔥
JavaScript
111
star
27

captcha-solver

Library and CLI for automating captcha verification across multiple providers.
JavaScript
107
star
28

chatgpt-well-known-plugin-finder

Checks Alexa's top 1M websites for the presence of OpenAI's new .well-known/ai-plugin.json files
TypeScript
106
star
29

puppeteer-lottie-cli

CLI for rendering Lottie animations via Puppeteer to image, GIF, or MP4.
JavaScript
106
star
30

react-suspense-polyfill

Polyfill for the React Suspense API 😮
JavaScript
100
star
31

puppeteer-instagram

Instagram automation driven by headless chrome.
JavaScript
100
star
32

chatgpt-hackers

Join thousands of other developers, researchers, and AI enthusiasts who are building at the cutting edge of AI ✨
TypeScript
97
star
33

react-starfield-animation

✨ Canvas-based starfield animation for React.
JavaScript
96
star
34

react-mp3-recorder

Microphone recorder for React that captures mp3 audio 🎵
JavaScript
84
star
35

react-particle-animation

✨Canvas-based particle animation for React.
JavaScript
81
star
36

react-fluid-gallery

Fluid media gallery for React powered by WebGL.
JavaScript
75
star
37

primitive

Reproduce images from geometric primitives.
JavaScript
74
star
38

npm-es-modules

Breakdown of 7 different ways to use ES modules with npm today.
JavaScript
69
star
39

react-fluid-animation

Fluid media animation for React powered by WebGL.
JavaScript
68
star
40

react-before-after-slider

A sexy image comparison slider for React.
JavaScript
62
star
41

ffmpeg-extract-frames

Extracts frames from a video using ffmpeg.
JavaScript
60
star
42

puppeteer-render-text

Robust text renderer using headless chrome.
JavaScript
59
star
43

text-summarization

Automagically generates summaries from html or text.
JavaScript
54
star
44

kwote

Create beautiful quotes that capture your attention.
TypeScript
49
star
45

next-movie

Pick your next movie using Next.js 13
TypeScript
45
star
46

bens-bites-ai-search

AI search for all the best resources in AI – powered by Ben's Bites 💯
TypeScript
45
star
47

ffmpeg-cli-flags

A comprehensive list of all ffmpeg commandline flags.
44
star
48

twitter-feed-algorithm

TypeScript code exploring what an open source version of Twitter's algorithmic feed might look like.
TypeScript
42
star
49

scrape-github-trending

Tutorial for web scraping / crawling with Node.js.
JavaScript
42
star
50

clubhouse

Clubhouse API client and social graph crawler for TypeScript.
TypeScript
41
star
51

populate-movies

Populates a high quality database of movies from TMDB, IMDB, and Rotten Tomatoes.
TypeScript
36
star
52

react-fake-tweet

React renderer for tweets.
JavaScript
33
star
53

ip-set

Efficient mutable set data structure optimized for use with IPv4 and IPv6 addresses. The primary use case is for working with potentially large IP blacklists.
JavaScript
33
star
54

cf-image-proxy

Image proxy and CDN for CF workers. Simple, extremely fast, and free.
JavaScript
31
star
55

node-compat-require

Easily allow your Node program to run in a target node version range to maximize compatibility.
JavaScript
22
star
56

avp

Audio Visual Playground, or Alien vs Predator? You decide...
TypeScript
22
star
57

p-cache

Decorator to memoize the results of async functions via lru-cache.
JavaScript
22
star
58

parse-otp-message

Parses OTP messages for a verification code and service provider.
JavaScript
21
star
59

spotify-to-twitter

Example of how to create your own automated Twitter account that tweets tracks from a Spotify playlist.
JavaScript
21
star
60

gif-extract-frames

Extracts frames from a GIF including inter-frame coalescing.
JavaScript
21
star
61

puppeteer-instaquote

Use Puppeteer to create snazzy Instagram-like quote images and memes
JavaScript
20
star
62

async-await-parallel

Node.js module with simple concurrency control for awaiting an array of async results
JavaScript
20
star
63

internet-diet

Chrome extension to remove unhealthy foods from the web.
HTML
18
star
64

react-block-image

React replacement for img with more control + fallback support.
JavaScript
18
star
65

react-docgen-props-table

Beautiful Props Table for React Docgen.
JavaScript
17
star
66

lexica-api

API wrapper around Lexica.art for searching Stable Diffusion images.
TypeScript
16
star
67

puppeteer-github

GitHub automation driven by headless chrome.
JavaScript
16
star
68

google-waitlist

Sign up for Google's latest AI-powered waitlist today!
TypeScript
16
star
69

ffmpeg-extract-frame

Extracts a single frame from a video.
JavaScript
15
star
70

compare-tokenizers

A test suite comparing Node.js BPE tokenizers for use with AI models.
TypeScript
15
star
71

ffmpeg-extract-audio

Extracts an audio stream from a media file.
JavaScript
14
star
72

replicate-api

Node.js wrapper around Replicate's ML API (including dreambooth + stable diffusion).
TypeScript
14
star
73

Gravity-spritekit

iOS n-body simulation visualized with metaballs. Physics and graphics provided by SpriteKit.
Swift
14
star
74

getsmscode

API client for getsmscode.com
JavaScript
13
star
75

nala

In loving memory of Nala Das Kitten; 2010 - 2023. 💕
TypeScript
13
star
76

ffmpeg-probe

Wrapper around ffprobe for getting info about media files.
JavaScript
13
star
77

apple-april-fools-2023

Fake Apple AI product launch for April Fool's Day 2023.
TypeScript
13
star
78

ffmpeg-on-progress

Utility for robustly reporting progress with fluent-ffmpeg.
JavaScript
13
star
79

dissolve-generator

Cool 2D dissolve effect generator
JavaScript
13
star
80

abstract-object-storage

Collection of useful utilities for working with Google Cloud Storage.
JavaScript
12
star
81

Milton

C++ Rendering Framework w/ MLT, bidi path tracing, etc. and OpenGL Previews (undergrad thesis project from Brown '09)
12
star
82

koa2-mongoose-crud

Koa 2 CRUD middleware for Mongoose models.
JavaScript
11
star
83

get-mp3-duration

Computes the duration of an mp3 buffer in node or browser.
JavaScript
11
star
84

github-scraper

Misc scripts for scraping GitHub.
TypeScript
9
star
85

create-vue-library

JavaScript
9
star
86

warm-social-images

Simple CLI to warm the cache of social images in all pages from a sitemap.
JavaScript
9
star
87

primitive-cli

CLI to reproduce images from geometric primitives.
JavaScript
9
star
88

puppeteer-render-text-cli

CLI for rendering text with headless chrome.
JavaScript
9
star
89

github-is-starred-cli

CLI for checking if a user has starred a particular GitHub repo.
JavaScript
9
star
90

open-source

Keeping track of my various open source projects.
8
star
91

id-shortener

Efficient id / url shortener for NodeJS backed by pluggable storage defaulting to redis.
JavaScript
8
star
92

update-markdown-jsdoc

Updates a markdown document section with jsdoc documentation.
JavaScript
7
star
93

commit-emoji

Performs a git commit with a random emoji message. 😂 🤙 🚀
JavaScript
7
star
94

github-is-starred

Checks if a user has starred a particular GitHub repo.
JavaScript
7
star
95

puppeteer-github-cli

CLI for GitHub automation driven by headless chrome.
JavaScript
7
star
96

wahlburger

Get dem burgers
JavaScript
7
star
97

phash-im

Perceptual image hashing provided by imagemagick.
JavaScript
6
star
98

phash-gif

Perceptual GIF hashing for easily finding near-duplicate GIFs.
JavaScript
6
star
99

is-acronym

Determines whether a given string is a common English acronym.
JavaScript
5
star
100

react-springy-scroll

React utility that adds a physical springiness to elements on scroll.
JavaScript
5
star