Files
chatgpt-telegram-bot/bot/plugin_manager.py
2023-06-22 21:13:15 +02:00

56 lines
2.0 KiB
Python

import json
from plugins.images import ImageSearchPlugin
from plugins.translate import TranslatePlugin
from plugins.spotify import SpotifyPlugin
from plugins.crypto import CryptoPlugin
from plugins.weather import WeatherPlugin
from plugins.web_search import WebSearchPlugin
from plugins.wolfram_alpha import WolframAlphaPlugin
class PluginManager:
"""
A class to manage the plugins and call the correct functions
"""
def __init__(self, config):
enabled_plugins = config.get('plugins', [])
plugin_mapping = {
'wolfram': WolframAlphaPlugin(),
'weather': WeatherPlugin(),
'crypto': CryptoPlugin(),
'web_search': WebSearchPlugin(),
'spotify': SpotifyPlugin(),
'translate': TranslatePlugin(),
'image_search': ImageSearchPlugin(),
}
self.plugins = [plugin_mapping[plugin] for plugin in enabled_plugins]
def get_functions_specs(self):
"""
Return the list of function specs that can be called by the model
"""
return [spec for specs in map(lambda plugin: plugin.get_spec(), self.plugins) for spec in specs]
async def call_function(self, function_name, arguments):
"""
Call a function based on the name and parameters provided
"""
plugin = self.__get_plugin_by_function_name(function_name)
if not plugin:
return json.dumps({'error': f'Function {function_name} not found'})
return json.dumps(await plugin.execute(function_name, **json.loads(arguments)))
def get_plugin_source_name(self, function_name) -> str:
"""
Return the source name of the plugin
"""
plugin = self.__get_plugin_by_function_name(function_name)
if not plugin:
return ''
return plugin.get_source_name()
def __get_plugin_by_function_name(self, function_name):
return next((plugin for plugin in self.plugins
if function_name in map(lambda spec: spec.get('name'), plugin.get_spec())), None)