Skip to main content

Connect plugins to AI

Project description

🎸 Plug and Plai

Plug and Plai is an open source library aiming to simplify the integration of AI plugins into open-source language models (LLMs).

It provides utility functions to get a list of active plugins from plugnplai.com directory, get plugin manifests, and extract OpenAPI specifications and load plugins.

Installation

You can install Plug and Plai using pip:

pip install plugnplai

Quick Start Example

Plugins Retrieval API - https://www.plugnplai.com/_functions/retrieve?text={user_message_here}: Open In Colab

Use an Specific Plugin - Step by Step: Open In Colab

More Examples

Generate Prompt with Plugins Description: Open In Colab

Plugins Retrieval: Open In Colab

OAuth Plugins Example for setting up plugins with OAuth: examples/oauth_example

Usage

Get a list of plugins

  • urls = get_plugins(): Get a list of available plugins from a plugins repository.

  • urls = get_plugins(filter = 'ChatGPT', category='dev'): Use 'filter' or 'category' variables to query specific plugins

Example:

import plugnplai

# Get all plugins from plugnplai.com
urls = plugnplai.get_plugins()

#  Get ChatGPT plugins - only ChatGPT verified plugins
urls = plugnplai.get_plugins(filter = 'ChatGPT')

#  Get working plugins - only tested plugins (in progress)
urls = plugnplai.get_plugins(filter = 'working')

#  Get plugins by category - only tested plugins (in progress)
urls = plugnplai.get_plugins(category = 'travel')

#  Get the names list of categories
urls = plugnplai.get_category_names()

Utility Functions

Help to load the plugins manifest and OpenAPI specification

  • manifest = get_plugin_manifest(url): Get the AI plugin manifest from the specified plugin URL.
  • specUrl = get_openapi_url(url, manifest): Get the OpenAPI URL from the plugin manifest.
  • spec = get_openapi_spec(openapi_url): Get the OpenAPI specification from the specified OpenAPI URL.
  • manifest, spec = spec_from_url(url): Returns the Manifest and OpenAPI specification from the plugin URL.

Example:

import plugnplai

# Get the Manifest and the OpenAPI specification from the plugin URL
manifest, openapi_spec = plugnplai.spec_from_url(urls[0])

Load Plugins

Example: Open In Colab

from plugnplai import Plugins

###### ACTIVATE A MAX OF 3 PLUGINS ######
# Context length limits the number of plugins you can activate,
# you need to make sure the prompt fits in your context lenght,
# still leaving space for the user message

# Initialize 'Plugins' by passing a list of urls, this function will
# load the plugins and build a default description to be used as prefix prompt
plugins = Plugins.install_and_activate(urls)

#  Print the deafult prompt for the activated plugins
print(plugins.prompt)

#  Print the number of tokens of the prefix prompt
print(plugins.tokens)

Example on installing (loading) all plugins, and activating a few later:

from plugnplai import Plugins

# If you just want to load the plugins, but activate only
# some of them later use Plugins(urls) instead
plugins = Plugins(urls)

# Print the names of installed plugins
print(plugins.list_installed)

# Activate the plugins you want
plugins.activate(name1)
plugins.activate(name2)
plugins.activate(name3)

# Deactivate the last plugin
plugins.deactivate(name3)

Prompt and Tokens Counting

The plugins.prompt attribute contains a prompt with descriptions of the active plugins. The plugins.tokens attribute contains the number of tokens in the prompt.

For example:

plugins = Plugins.install_and_activate(urls)
print(plugins.prompt)
print(plugins.tokens)

This will print the prompt with plugin descriptions and the number of tokens.

Parse LLM Response for API Tag

The parse_llm_response() function parses an LLM response searching for API calls. It looks for the <API> pattern defined in the plugins.prompt and extracts the plugin name, operation ID, and parameters.

Call API

The call_api() function calls an operation in an active plugin. It takes the plugin name, operation ID, and parameters extracted by parse_llm_response() and makes a request to the plugin API.

Plugin Authentication: Plugins with Oauth, user or service level authentication pass api_key(string) as parameter. For oauth, use the access_token as the api_key parameter. For more detail about oauth authentication please see oauth_example/run_plugin_with_oauth.py and oauth_example/oauth_server.py files.

Apply Plugins

The @plugins.apply_plugins decorator can be used to easily apply active plugins to an LLM function.

This method is suboptimal for GPT chat models because it doesn't make use of the different available roles on the chat api (system, user, or assistant roles). But it may be useful for other LLM providers or open-source models.

  1. Import the Plugins class and decorator:
from plugnplai import Plugins, plugins.apply_plugins
  1. Define your LLM function, that necessarily takes a string (the user input) as the first argument and returns a string (the response):
@plugins.apply_plugins
def call_llm(user_input):
  ...
  return response
  1. The decorator will handle the following:
  • Prepending the prompt (with plugin descriptions) to the user input
  • Checking the LLM response for API calls (the ... pattern)
  • Calling the specified plugins
  • Summarizing the API calls in the LLM response
  • Calling the LLM function again with the summary to get a final response
  1. If no API calls are detected, the original LLM response is returned.

To more details on the implementation of these steps, see example "Step by Step": Open In Colab

Plugins Retrieval

PlugnPlai Retrieval API - https://www.plugnplai.com/_functions/retrieve?text={user_message_here} : Open In Colab

Build our own Plugins Vector Database: Open In Colab

from plugnplai import PluginRetriever

# Initialize the plugins retriever vector database and index the plugins descriptions.
# Loading the plugins from plugnplai.com directory
plugin_retriever = PluginRetriever.from_directory()

#  Retrieve the names of the plugins given a user's message
plugin_retriever.retrieve_names("what shirts can i buy?")

Contributing

Plug and Plai is an open source library, and we welcome contributions from the entire community. If you're interested in contributing to the project, please feel free to fork, submit pull requests, report issues, or suggest new features.

To dos

  • [Load] Define a default object to read plugins - use LangChain standard? (for now using only manifest and specs jsons)
  • [Load] Fix breaking on reading certain plugins specs
  • [Load] Accept different specs methods and versions (param, query, body)
  • [Prompt] Build a utility function to return a default prompts for a plugin
  • [Prompt] Fix prompt building for body (e.g. "Speak")
  • [Prompt] Build a utility function to return a default prompts for a set of plugins
  • [Prompt] Build a utility function to count tokens of the plugins prompt
  • [Prompt] Use the prompt tokens number to short or expand a plugin prompt, use LLM to summarize the prefix prompt
  • [CallAPI] Build a function to call API given a dictionary of parameters
  • [CallAPI] Add example for calling API
  • [Embeddings] Add filter option (e.g. "working", "ChatGPT") to "PluginRetriever.from_directory()"
  • [Docs] Add Sphynx docs
  • [Verification] Build automated tests to verify new plugins
  • [Verification] Build automated monitoring for working plugins for plugnplai
  • [Verification] Build automated monitoring for working plugins for langchain
  • [Website] Build an open-source website
  • [Authentication] Add support for OAuth, user and service level authentication
  • [Functions] Automaticly create OpenAI function dictionary for plugins (plugins.functions)
  • [Model] Create a dataset for finetuning open-source models to call Plugins / APIs. Use the descriptions on plugins.prompt (eventually plugins.functions) as input
  • [Model] Finetune an open-source model to call Plugins / APIs

Project Roadmap

  1. Build auxiliary functions that helps everyone to use plugins as defined by OpenAI
  2. Build in compatibility with different open-source formats (e.g. LangChain, BabyAGI, etc)
  3. Find a best prompt format for plugins, optimizing for token number and description completness
  4. Help with authentication
  5. Build a dataset to finetune open-source models to call plugins
  6. Finetune an open-source model to call plugins
  7. Etc.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plugnplai-0.0.24.tar.gz (27.0 kB view details)

Uploaded Source

Built Distribution

plugnplai-0.0.24-py3-none-any.whl (27.9 kB view details)

Uploaded Python 3

File details

Details for the file plugnplai-0.0.24.tar.gz.

File metadata

  • Download URL: plugnplai-0.0.24.tar.gz
  • Upload date:
  • Size: 27.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.9.13 Linux/5.15.0-73-generic

File hashes

Hashes for plugnplai-0.0.24.tar.gz
Algorithm Hash digest
SHA256 f2532276e42680bf5da0d54e3266e2b12a96e3298e241e426e8e2a285f1a6ad8
MD5 e12e01f3b4adfb7b8be71fbf778b99de
BLAKE2b-256 8847f6f2dd729a15f09586ce3b8aa42745b2d19e19b7f223db6cb95405ca9244

See more details on using hashes here.

File details

Details for the file plugnplai-0.0.24-py3-none-any.whl.

File metadata

  • Download URL: plugnplai-0.0.24-py3-none-any.whl
  • Upload date:
  • Size: 27.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.9.13 Linux/5.15.0-73-generic

File hashes

Hashes for plugnplai-0.0.24-py3-none-any.whl
Algorithm Hash digest
SHA256 82d9cdae9adf21fd15d682787b58028a088bb03262ef23a0885521427f4feb6b
MD5 7c93513ea09d6e4ddf540cb6199bab34
BLAKE2b-256 3ecd6b4c46e78ff887040febef296d8d3fb78bb744f0f16e8f578ef97d33d010

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page