Package: plugnplai
🎸 Plug and PlaiPlug 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 fromplugnplai.comdirectory, get plugin manifests, and extract OpenAPI specifications and load plugins.InstallationYou can install Plug and Plai using pip:pipinstallplugnplaiQuick Start ExamplePlugins Retrieval API -https://www.plugnplai.com/_functions/retrieve?text={user_message_here}:Use an Specific Plugin - Step by Step:More ExamplesGenerate Prompt with Plugins Description:Plugins Retrieval:OAuth PluginsExample for setting up plugins with OAuth:examples/oauth_exampleUsageGet a list of pluginsurls = get_plugins(): Get a list of available plugins from aplugins repository.urls = get_plugins(filter = 'ChatGPT', category='dev'): Use 'filter' or 'category' variables to query specific pluginsExample:importplugnplai# Get all plugins from plugnplai.comurls=plugnplai.get_plugins()#  Get ChatGPT plugins - only ChatGPT verified pluginsurls=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 categoriesurls=plugnplai.get_category_names()Utility FunctionsHelp to load the plugins manifest and OpenAPI specificationmanifest = 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:importplugnplai# Get the Manifest and the OpenAPI specification from the plugin URLmanifest,openapi_spec=plugnplai.spec_from_url(urls[0])Load PluginsExample:fromplugnplaiimportPlugins###### 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 promptplugins=Plugins.install_and_activate(urls)#  Print the deafult prompt for the activated pluginsprint(plugins.prompt)#  Print the number of tokens of the prefix promptprint(plugins.tokens)Example on installing (loading) all plugins, and activating a few later:fromplugnplaiimportPlugins# If you just want to load the plugins, but activate only# some of them later use Plugins(urls) insteadplugins=Plugins(urls)# Print the names of installed pluginsprint(plugins.list_installed)# Activate the plugins you wantplugins.activate(name1)plugins.activate(name2)plugins.activate(name3)# Deactivate the last pluginplugins.deactivate(name3)Prompt and Tokens CountingTheplugins.promptattribute contains a prompt with descriptions of the active plugins.
Theplugins.tokensattribute 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 TagTheparse_llm_response()function parses an LLM response searching for API calls. It looks for the<API>pattern defined in theplugins.promptand extracts the plugin name, operation ID, and parameters.Call APIThecall_api()function calls an operation in an active plugin. It takes the plugin name, operation ID, and parameters extracted byparse_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 seeoauth_example/run_plugin_with_oauth.pyandoauth_example/oauth_server.pyfiles.Apply PluginsThe@plugins.apply_pluginsdecorator 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.Import the Plugins class and decorator:fromplugnplaiimportPlugins,plugins.apply_pluginsDefine your LLM function, that necessarily takes a string (the user input) as the first argument and returns a string (the response):@plugins.apply_pluginsdefcall_llm(user_input):...returnresponseThe decorator will handle the following:Prepending the prompt (with plugin descriptions) to the user inputChecking the LLM response for API calls (the ... pattern)Calling the specified pluginsSummarizing the API calls in the LLM responseCalling the LLM function again with the summary to get a final responseIf 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":Plugins RetrievalPlugnPlai Retrieval API -https://www.plugnplai.com/_functions/retrieve?text={user_message_here}:Build our own Plugins Vector Database:fromplugnplaiimportPluginRetriever# Initialize the plugins retriever vector database and index the plugins descriptions.# Loading the plugins from plugnplai.com directoryplugin_retriever=PluginRetriever.from_directory()#  Retrieve the names of the plugins given a user's messageplugin_retriever.retrieve_names("what shirts can i buy?")ContributingPlug 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 / APIsProject RoadmapBuild auxiliary functions that helps everyone to use plugins as defined byOpenAIBuild in compatibility with different open-source formats (e.g. LangChain, BabyAGI, etc)Find a best prompt format for plugins, optimizing for token number and description completnessHelp with authenticationBuild a dataset to finetune open-source models to call pluginsFinetune an open-source model to call pluginsEtc.LinksPlugins directory:https://plugnplai.com/API reference:https://plugnplai.github.io/