├── .breakpoints ├── .gitignore ├── LICENSE ├── main.py ├── nulll.well-known └── ai-plugin.json ├── plugins ├── ai-plugin.json ├── logo.jpg └── manifest-d2ca5b25-467e-4b70-afc1-1712bc4a0d92.yaml ├── poetry.lock ├── pyproject.toml ├── readme.md ├── replit.nix ├── requirements.txt └── templates ├── action.html ├── commands.html ├── context.html ├── errors.html ├── examples.html ├── index.html ├── initialize.html ├── introduction.html ├── purpose.html ├── random.html ├── results.html └── swagger.html /.breakpoints: -------------------------------------------------------------------------------- 1 | { 2 | "files": {} 3 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # .gitignore 2 | 3 | # Ignore Replit specific files 4 | .replit 5 | 6 | # Ignore Python cache files 7 | __pycache__/ 8 | *.pyc 9 | *.pyo 10 | *.pyd 11 | *.pyc 12 | .Python 13 | 14 | # Ignore virtual environments 15 | venv/ 16 | *.venv 17 | .env 18 | .venv/ 19 | ENV/ 20 | env.bak/ 21 | PythonENV/ 22 | 23 | # Ignore Jupyter Notebook checkpoints 24 | .ipynb_checkpoints 25 | 26 | # Ignore data files 27 | data/ 28 | 29 | # Ignore plugins folder 30 | plugins/ 31 | 32 | # Ignore logs 33 | logs/ 34 | *.log 35 | 36 | # Ignore local configuration files 37 | .local/ 38 | .vscode/ 39 | 40 | # Ignore macOS specific files 41 | .DS_Store 42 | ._* 43 | .Spotlight-V100 44 | .Trashes 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 ruv 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # ChatGPT Plugin Creator - From Swagger 2 | # /\__/\ - main.py 3 | # ( o.o ) - v0.0.1 4 | # >^< - by @rUv 5 | 6 | import os 7 | import uuid 8 | import time 9 | from flask import Flask, request, render_template, send_from_directory, flash, jsonify 10 | import yaml 11 | from pathlib import Path 12 | from flask import jsonify 13 | import json 14 | from werkzeug.routing import BaseConverter 15 | from urllib.parse import unquote 16 | import re 17 | import logging 18 | 19 | app = Flask(__name__) 20 | app.secret_key = 'your_secret_key' 21 | plugins_folder = 'plugins' 22 | base_url = "https://chatgpt-dev-1.ruvnet.repl.co" # Replace with your actual base URL 23 | 24 | current_topic = None 25 | 26 | # Ensure the plugins folder exists 27 | if not os.path.exists(plugins_folder): 28 | os.makedirs(plugins_folder) 29 | 30 | class RandomPathConverter(BaseConverter): 31 | def __init__(self, url_map, *items): 32 | super(RandomPathConverter, self).__init__(url_map) 33 | self.regex = '(?i).*random.*' 34 | 35 | app.url_map.converters['random_path'] = RandomPathConverter 36 | 37 | 38 | def load_json_data(): 39 | data_file_path = os.path.join('data', 'introduction.json') 40 | with open(data_file_path, 'r') as file: 41 | data = json.load(file, strict=False) 42 | return data 43 | 44 | # Define a function to read the contents of the data/instructions.txt file 45 | def read_instructions_file(filename): 46 | file_path = os.path.join('data', filename) 47 | try: 48 | with open(file_path, 'r') as file: 49 | contents = file.read() 50 | return contents 51 | except FileNotFoundError: 52 | return "File not found." 53 | 54 | @app.before_request 55 | def log_request_info(): 56 | logging.info('Headers: %s', request.headers) 57 | logging.info('Body: %s', request.get_data()) 58 | 59 | # Add the requested endpoints 60 | @app.route('/introduction', methods=['GET', 'POST']) 61 | def introduction(): 62 | if request.method == 'POST': 63 | # code to be executed 64 | pass 65 | else: 66 | # Handle the GET request (default behavior) 67 | instructions_text = read_instructions_file('introduction.txt') 68 | return instructions_text # Return the contents of the file as plain text 69 | 70 | @app.route('/purpose', methods=['GET']) 71 | def purpose(): 72 | purpose_text = read_instructions_file('purpose.txt') 73 | return purpose_text 74 | 75 | 76 | @app.route('/context', methods=['GET']) 77 | def context(): 78 | context_text = read_instructions_file('context.txt') 79 | return context_text 80 | 81 | 82 | @app.route('/examples', methods=['GET']) 83 | def examples(): 84 | examples_text = read_instructions_file('examples.txt') 85 | return examples_text 86 | 87 | 88 | @app.route('/errors', methods=['GET']) 89 | def errors(): 90 | errors_text = read_instructions_file('errors.txt') 91 | return errors_text 92 | 93 | 94 | @app.route('/commands', methods=['GET']) 95 | def commands(): 96 | commands_text = read_instructions_file('commands.txt') 97 | return commands_text 98 | 99 | 100 | @app.route('/action', methods=['GET']) 101 | def action(): 102 | action_text = read_instructions_file('action.txt') 103 | return action_text 104 | 105 | 106 | @app.route('/initialize', methods=['GET']) 107 | def initialize(): 108 | initialize_text = read_instructions_file('initialize.txt') 109 | return initialize_text 110 | 111 | @app.route('/random', defaults={'path': ''}, methods=['GET', 'POST']) 112 | @app.route('/random/', methods=['GET', 'POST']) 113 | def random(path): 114 | if request.method == 'GET': 115 | # Extract JSON payload from the path 116 | payload = re.search(r'\{.*\}', unquote(path)) 117 | if payload: 118 | payload_str = payload.group() 119 | try: 120 | input_data = json.loads(payload_str) 121 | topic = input_data.get('topic', 'No topic provided') 122 | data = { 123 | 'message': 124 | f'You have provided the following topic: {topic}. Here is the output of a manifest.json and specification.yaml in mark down code block.' 125 | } 126 | return jsonify(data) 127 | except json.JSONDecodeError: 128 | pass 129 | random_text = read_instructions_file('random.txt') 130 | return random_text 131 | elif request.method == 'POST': 132 | input_data = request.get_json() 133 | topic = input_data.get('topic', 'No topic provided') 134 | random_text = read_instructions_file('random.txt') 135 | data = { 136 | 'message': 137 | f'You have provided the following topic: {topic}. Here is the output of a manifest.json and specification.yaml in mark down code block.\n\n{random_text}' 138 | } 139 | return jsonify(data) 140 | 141 | @app.route('/convert_curl', methods=['POST']) 142 | def convert_curl(): 143 | input_data = request.get_json() 144 | topic = input_data.get('curl_command', '{topic}') 145 | random_text = read_instructions_file('random.txt') 146 | data = { 147 | 'message': f'You have provided the following CURL: {topic}. Here is the output of a manifest.json and specification.yaml in mark down code block.\n\n{random_text}' 148 | } 149 | return jsonify(data) 150 | 151 | 152 | @app.route('/api/v1/create-plugin', methods=['POST']) 153 | def create_plugin(): 154 | # Process the JSON data 155 | data = request.get_json() 156 | 157 | # Get the form data 158 | swagger_yaml = yaml.safe_load(data['swaggerFile']) 159 | name = data.get('name') 160 | description = data.get('description') 161 | url = data.get('url') 162 | user_authenticated = data.get('user_authenticated') == 'true' 163 | logo_url = data.get('logo_url') 164 | contact_email = data.get('contact_email') 165 | legal_info_url = data.get('legal_info_url') 166 | 167 | # Generate a unique file name with a timestamp 168 | spec_file_name = f"spec_{int(time.time())}.yaml" 169 | 170 | # Convert the Swagger file to ChatGPT manifest and API specification 171 | manifest, openapi_spec = convert_swagger_to_chatgpt_manifest( 172 | swagger_yaml, name, description, base_url, spec_file_name, 173 | user_authenticated, logo_url, contact_email, legal_info_url) 174 | 175 | # Generate unique file names for the manifest and specification files 176 | manifest_filename = os.path.join(plugins_folder, 177 | f'manifest-{uuid.uuid4()}.yaml') 178 | openapi_spec_filename = os.path.join(plugins_folder, 179 | f'spec-{uuid.uuid4()}.yaml') 180 | 181 | # Save the manifest and specification files 182 | with open(manifest_filename, 'w') as manifest_file: 183 | manifest_file.write(manifest) 184 | with open(openapi_spec_filename, 'w') as spec_file: 185 | spec_file.write(openapi_spec) 186 | 187 | return jsonify({ 188 | 'manifest_file': f"/plugins/{os.path.basename(manifest_filename)}", 189 | 'openapi_spec_file': f"/plugins/{os.path.basename(openapi_spec_filename)}", 190 | 'manifest': manifest, 191 | 'openapi_spec': openapi_spec 192 | }) 193 | 194 | 195 | from pathlib import Path 196 | import uuid 197 | 198 | 199 | @app.route('/', methods=['GET', 'POST']) 200 | def upload_file(): 201 | if request.method == 'POST': 202 | # Process the form data 203 | swagger_file = request.files['swaggerFile'] 204 | swagger_yaml = yaml.safe_load(swagger_file.read()) 205 | 206 | # Get additional form data 207 | name = request.form.get('name') 208 | description = request.form.get('description') 209 | url = request.form.get('url') 210 | user_authenticated = request.form.get('user_authenticated') == 'true' 211 | logo_url = request.form.get('logo_url') 212 | contact_email = request.form.get('contact_email') 213 | legal_info_url = request.form.get('legal_info_url') 214 | 215 | # Convert the Swagger file to ChatGPT manifest and API specification 216 | manifest, openapi_spec = convert_swagger_to_chatgpt_manifest( 217 | swagger_yaml, name, description, url, user_authenticated, logo_url, 218 | contact_email, legal_info_url) 219 | 220 | # Save the manifest and specification files to the /plugins folder 221 | Path("plugins").mkdir(parents=True, exist_ok=True) 222 | 223 | manifest_filename = f"manifest-{uuid.uuid4()}.yaml" 224 | with open(f"plugins/{manifest_filename}", "w") as manifest_file: 225 | manifest_file.write(manifest) 226 | 227 | openapi_spec_filename = f"openapi_spec-{uuid.uuid4()}.yaml" 228 | with open(f"plugins/{openapi_spec_filename}", "w") as openapi_spec_file: 229 | openapi_spec_file.write(openapi_spec) 230 | 231 | return jsonify({ 232 | 'manifest_file': f"/download/{manifest_filename}", 233 | 'openapi_spec_file': f"/download/{openapi_spec_filename}", 234 | 'manifest': manifest, 235 | 'openapi_spec': openapi_spec 236 | }) 237 | 238 | return render_template('index.html') 239 | 240 | 241 | def index(): 242 | if request.method == 'POST': 243 | swagger_file = request.files['swaggerFile'] 244 | name = request.form['name'] 245 | description = request.form['description'] 246 | url = request.form['url'] 247 | user_authenticated = request.form['user_authenticated'] == 'true' 248 | logo_url = request.form['logo_url'] 249 | contact_email = request.form['contact_email'] 250 | legal_info_url = request.form['legal_info_url'] 251 | 252 | if swagger_file: 253 | swagger_yaml = yaml.safe_load(swagger_file.read()) 254 | manifest, openapi_spec = convert_swagger_to_chatgpt_manifest( 255 | swagger_yaml, name, description, url, user_authenticated, logo_url, 256 | contact_email, legal_info_url) 257 | return render_template('index.html', 258 | manifest=manifest, 259 | openapi_spec=openapi_spec) 260 | else: 261 | flash('Please upload a valid Swagger (OpenAPI) file.', 'danger') 262 | return render_template('index.html') 263 | 264 | return render_template('index.html') 265 | 266 | 267 | def convert_swagger_to_chatgpt_manifest(swagger_yaml, name, description, 268 | base_url, spec_file_name, 269 | user_authenticated, logo_url, 270 | contact_email, legal_info_url): 271 | # Extract relevant information from the Swagger YAML 272 | info = swagger_yaml.get('info', {}) 273 | title = info.get('title', 'My API Plugin') 274 | description = info.get('description', 'Plugin for interacting with my API.') 275 | 276 | # Create the ChatGPT manifest 277 | manifest = { 278 | 'schema_version': 'v1', 279 | 'name_for_human': name or title, 280 | 'description_for_human': description 281 | or 'Plugin for interacting with my API.', 282 | 'description_for_model': description 283 | or 'Plugin for interacting with my API.', 284 | 'auth': { 285 | 'type': 'none' 286 | }, 287 | 'api': { 288 | 'type': 'openapi', 289 | 'url': f"{base_url}/plugins/{spec_file_name}", 290 | 'is_user_authenticated': user_authenticated 291 | }, 292 | 'logo_url': logo_url, 293 | 'contact_email': contact_email, 294 | 'legal_info_url': legal_info_url 295 | } 296 | 297 | # Update the endpoints with authentication and POST type 298 | paths = swagger_yaml.get('paths', {}) 299 | for path_key, path_item in paths.items(): 300 | for method_key, method_item in path_item.items(): 301 | if method_key.lower() == 'post': 302 | method_item[ 303 | 'x-auth-type'] = 'none' if not user_authenticated else 'apiKey' 304 | method_item['x-auth-location'] = 'query' 305 | 306 | # Convert the manifest dictionary to a YAML string 307 | manifest_yaml = yaml.dump(manifest, default_flow_style=False) 308 | 309 | # Prepare the OpenAPI specification for ChatGPT 310 | # This example assumes that the original Swagger YAML is suitable for use as the ChatGPT OpenAPI specification. 311 | # You may need to modify or filter the original YAML to suit your needs. 312 | openapi_spec_yaml = yaml.dump(swagger_yaml, default_flow_style=False) 313 | 314 | return manifest_yaml, openapi_spec_yaml 315 | 316 | 317 | @app.route('/.well-known/', methods=['GET']) 318 | def download(filename): 319 | return send_from_directory('plugins', filename, as_attachment=True) 320 | 321 | if __name__ == '__main__': 322 | logging.basicConfig(level=logging.INFO) 323 | app.run(host='0.0.0.0', port=8080) -------------------------------------------------------------------------------- /nulll.well-known/ai-plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_version": "v1", 3 | "name_for_human": "First ChatGPT Plugin", 4 | "name_for_model": "", 5 | "description_for_human": "API for creating ChatGPT plugins from Swagger files.", 6 | "description_for_model": "API for creating ChatGPT plugins from Swagger files.", 7 | "auth": { 8 | "type": "none" 9 | }, 10 | "api": { 11 | "type": "openapi", 12 | "url": "https://chatgpt-swagger-plug-in-creator.ruvnet.repl.co/plugins/spec_1680666056.yaml", 13 | "is_user_authenticated": false 14 | }, 15 | "logo_url": "https://ChatGPT-Swagger-Plug-in-Creator.ruvnet.repl.co/logo.png", 16 | "contact_email": "ruv@ruv.net", 17 | "legal_info_url": "https://ChatGPT-Swagger-Plug-in-Creator.ruvnet.repl.co/legal" 18 | } 19 | -------------------------------------------------------------------------------- /plugins/ai-plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_version": "v1", 3 | "name_for_human": "ChatGPT Ai Plugin Creator", 4 | "name_for_model": "AiPromptProgramming", 5 | "description_for_human": "A Plugin to Create New Plugins & Bots. Type /start to begin", 6 | "description_for_model": "A Plugin to Create New Plugins & Bots. Type /start to start, /help, /random, or /convert_curl", 7 | "auth": { 8 | "type": "none" 9 | }, 10 | "api": { 11 | "type": "openapi", 12 | "url": "https://chatgpt-dev-1.ruvnet.repl.co/.well-known/spec.yaml", 13 | "is_user_authenticated": false 14 | }, 15 | "logo_url": "https://chatgpt-dev-1.ruvnet.repl.co/.well-known/logo.jpg", 16 | "contact_email": "ruv@ruv.net", 17 | "legal_info_url": "https://chatgpt-dev-1.ruvnet.repl.co/legal" 18 | } 19 | -------------------------------------------------------------------------------- /plugins/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/plugins/logo.jpg -------------------------------------------------------------------------------- /plugins/manifest-d2ca5b25-467e-4b70-afc1-1712bc4a0d92.yaml: -------------------------------------------------------------------------------- 1 | api: 2 | is_user_authenticated: false 3 | type: openapi 4 | url: https://chatgpt-swagger-plug-in-creator.ruvnet.repl.co/plugins/spec_1680666056.yaml 5 | auth: 6 | type: none 7 | contact_email: ruv@ruv.net 8 | description_for_human: API for creating ChatGPT plugins from Swagger files. 9 | description_for_model: API for creating ChatGPT plugins from Swagger files. 10 | legal_info_url: https://ChatGPT-Swagger-Plug-in-Creator.ruvnet.repl.co/legal 11 | logo_url: https://ChatGPT-Swagger-Plug-in-Creator.ruvnet.repl.co/logo.png 12 | name_for_human: First ChatGPT Plugin 13 | schema_version: v1 14 | 15 | 16 | { 17 | "schema_version": "v1", 18 | "name_for_human": "TODO Plugin", 19 | "name_for_model": "todo", 20 | "description_for_human": "Plugin for managing a TODO list. You can add, remove and view your TODOs.", 21 | "description_for_model": "Plugin for managing a TODO list. You can add, remove and view your TODOs.", 22 | "auth": { 23 | "type": "none" 24 | }, 25 | "api": { 26 | "type": "openapi", 27 | "url": "http://localhost:3333/openapi.yaml", 28 | "is_user_authenticated": false 29 | }, 30 | "logo_url": "http://localhost:3333/logo.png", 31 | "contact_email": "support@example.com", 32 | "legal_info_url": "http://www.example.com/legal" 33 | } -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "aiohttp" 3 | version = "3.8.3" 4 | description = "Async http client/server framework (asyncio)" 5 | category = "main" 6 | optional = false 7 | python-versions = ">=3.6" 8 | 9 | [package.dependencies] 10 | aiosignal = ">=1.1.2" 11 | async-timeout = ">=4.0.0a3,<5.0" 12 | attrs = ">=17.3.0" 13 | charset-normalizer = ">=2.0,<3.0" 14 | frozenlist = ">=1.1.1" 15 | multidict = ">=4.5,<7.0" 16 | yarl = ">=1.0,<2.0" 17 | 18 | [package.extras] 19 | speedups = ["aiodns", "brotli", "cchardet"] 20 | 21 | [[package]] 22 | name = "aiosignal" 23 | version = "1.3.1" 24 | description = "aiosignal: a list of registered asynchronous callbacks" 25 | category = "main" 26 | optional = false 27 | python-versions = ">=3.7" 28 | 29 | [package.dependencies] 30 | frozenlist = ">=1.1.0" 31 | 32 | [[package]] 33 | name = "argon2-cffi" 34 | version = "21.3.0" 35 | description = "The secure Argon2 password hashing algorithm." 36 | category = "main" 37 | optional = false 38 | python-versions = ">=3.6" 39 | 40 | [package.dependencies] 41 | argon2-cffi-bindings = "*" 42 | 43 | [package.extras] 44 | dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] 45 | docs = ["sphinx", "sphinx-notfound-page", "furo"] 46 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] 47 | 48 | [[package]] 49 | name = "argon2-cffi-bindings" 50 | version = "21.2.0" 51 | description = "Low-level CFFI bindings for Argon2" 52 | category = "main" 53 | optional = false 54 | python-versions = ">=3.6" 55 | 56 | [package.dependencies] 57 | cffi = ">=1.0.1" 58 | 59 | [package.extras] 60 | dev = ["pytest", "cogapp", "pre-commit", "wheel"] 61 | tests = ["pytest"] 62 | 63 | [[package]] 64 | name = "async-timeout" 65 | version = "4.0.2" 66 | description = "Timeout context manager for asyncio programs" 67 | category = "main" 68 | optional = false 69 | python-versions = ">=3.6" 70 | 71 | [[package]] 72 | name = "attrs" 73 | version = "22.2.0" 74 | description = "Classes Without Boilerplate" 75 | category = "main" 76 | optional = false 77 | python-versions = ">=3.6" 78 | 79 | [package.extras] 80 | cov = ["attrs", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] 81 | dev = ["attrs"] 82 | docs = ["furo", "sphinx", "myst-parser", "zope.interface", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] 83 | tests = ["attrs", "zope.interface"] 84 | tests-no-zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] 85 | tests_no_zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] 86 | 87 | [[package]] 88 | name = "certifi" 89 | version = "2022.12.7" 90 | description = "Python package for providing Mozilla's CA Bundle." 91 | category = "main" 92 | optional = false 93 | python-versions = ">=3.6" 94 | 95 | [[package]] 96 | name = "cffi" 97 | version = "1.15.1" 98 | description = "Foreign Function Interface for Python calling C code." 99 | category = "main" 100 | optional = false 101 | python-versions = "*" 102 | 103 | [package.dependencies] 104 | pycparser = "*" 105 | 106 | [[package]] 107 | name = "charset-normalizer" 108 | version = "2.1.1" 109 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 110 | category = "main" 111 | optional = false 112 | python-versions = ">=3.6.0" 113 | 114 | [package.extras] 115 | unicode_backport = ["unicodedata2"] 116 | 117 | [[package]] 118 | name = "click" 119 | version = "8.1.3" 120 | description = "Composable command line interface toolkit" 121 | category = "main" 122 | optional = false 123 | python-versions = ">=3.7" 124 | 125 | [package.dependencies] 126 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 127 | 128 | [[package]] 129 | name = "colorama" 130 | version = "0.4.6" 131 | description = "Cross-platform colored terminal text." 132 | category = "main" 133 | optional = false 134 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 135 | 136 | [[package]] 137 | name = "cryptography" 138 | version = "38.0.4" 139 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 140 | category = "main" 141 | optional = false 142 | python-versions = ">=3.6" 143 | 144 | [package.dependencies] 145 | cffi = ">=1.12" 146 | 147 | [package.extras] 148 | docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] 149 | docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] 150 | pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] 151 | sdist = ["setuptools-rust (>=0.11.4)"] 152 | ssh = ["bcrypt (>=3.1.5)"] 153 | test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] 154 | 155 | [[package]] 156 | name = "debugpy" 157 | version = "1.6.5" 158 | description = "An implementation of the Debug Adapter Protocol for Python" 159 | category = "dev" 160 | optional = false 161 | python-versions = ">=3.7" 162 | 163 | [[package]] 164 | name = "flask" 165 | version = "2.2.2" 166 | description = "A simple framework for building complex web applications." 167 | category = "main" 168 | optional = false 169 | python-versions = ">=3.7" 170 | 171 | [package.dependencies] 172 | click = ">=8.0" 173 | itsdangerous = ">=2.0" 174 | Jinja2 = ">=3.0" 175 | Werkzeug = ">=2.2.2" 176 | 177 | [package.extras] 178 | async = ["asgiref (>=3.2)"] 179 | dotenv = ["python-dotenv"] 180 | 181 | [[package]] 182 | name = "frozenlist" 183 | version = "1.3.3" 184 | description = "A list-like structure which implements collections.abc.MutableSequence" 185 | category = "main" 186 | optional = false 187 | python-versions = ">=3.7" 188 | 189 | [[package]] 190 | name = "idna" 191 | version = "3.4" 192 | description = "Internationalized Domain Names in Applications (IDNA)" 193 | category = "main" 194 | optional = false 195 | python-versions = ">=3.5" 196 | 197 | [[package]] 198 | name = "iso8601" 199 | version = "1.1.0" 200 | description = "Simple module to parse ISO 8601 dates" 201 | category = "main" 202 | optional = false 203 | python-versions = ">=3.6.2,<4.0" 204 | 205 | [[package]] 206 | name = "itsdangerous" 207 | version = "2.1.2" 208 | description = "Safely pass data to untrusted environments and back." 209 | category = "main" 210 | optional = false 211 | python-versions = ">=3.7" 212 | 213 | [[package]] 214 | name = "jedi" 215 | version = "0.18.2" 216 | description = "An autocompletion tool for Python that can be used for text editors." 217 | category = "dev" 218 | optional = false 219 | python-versions = ">=3.6" 220 | 221 | [package.dependencies] 222 | parso = ">=0.8.0,<0.9.0" 223 | 224 | [package.extras] 225 | docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx-rtd-theme (==0.4.3)", "sphinx (==1.8.5)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] 226 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 227 | testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] 228 | 229 | [[package]] 230 | name = "jinja2" 231 | version = "3.1.2" 232 | description = "A very fast and expressive template engine." 233 | category = "main" 234 | optional = false 235 | python-versions = ">=3.7" 236 | 237 | [package.dependencies] 238 | MarkupSafe = ">=2.0" 239 | 240 | [package.extras] 241 | i18n = ["Babel (>=2.7)"] 242 | 243 | [[package]] 244 | name = "markupsafe" 245 | version = "2.1.2" 246 | description = "Safely add untrusted strings to HTML/XML markup." 247 | category = "main" 248 | optional = false 249 | python-versions = ">=3.7" 250 | 251 | [[package]] 252 | name = "multidict" 253 | version = "6.0.4" 254 | description = "multidict implementation" 255 | category = "main" 256 | optional = false 257 | python-versions = ">=3.7" 258 | 259 | [[package]] 260 | name = "packaging" 261 | version = "23.0" 262 | description = "Core utilities for Python packages" 263 | category = "dev" 264 | optional = false 265 | python-versions = ">=3.7" 266 | 267 | [[package]] 268 | name = "parso" 269 | version = "0.8.3" 270 | description = "A Python Parser" 271 | category = "dev" 272 | optional = false 273 | python-versions = ">=3.6" 274 | 275 | [package.extras] 276 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 277 | testing = ["docopt", "pytest (<6.0.0)"] 278 | 279 | [[package]] 280 | name = "passlib" 281 | version = "1.7.4" 282 | description = "comprehensive password hashing framework supporting over 30 schemes" 283 | category = "main" 284 | optional = false 285 | python-versions = "*" 286 | 287 | [package.dependencies] 288 | argon2-cffi = {version = ">=18.2.0", optional = true, markers = "extra == \"argon2\""} 289 | 290 | [package.extras] 291 | argon2 = ["argon2-cffi (>=18.2.0)"] 292 | bcrypt = ["bcrypt (>=3.1.0)"] 293 | build_docs = ["sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)", "cloud-sptheme (>=1.10.1)"] 294 | totp = ["cryptography"] 295 | 296 | [[package]] 297 | name = "platformdirs" 298 | version = "2.6.2" 299 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 300 | category = "dev" 301 | optional = false 302 | python-versions = ">=3.7" 303 | 304 | [package.extras] 305 | docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.19.5)", "sphinx (>=5.3)"] 306 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2)"] 307 | 308 | [[package]] 309 | name = "pluggy" 310 | version = "1.0.0" 311 | description = "plugin and hook calling mechanisms for python" 312 | category = "dev" 313 | optional = false 314 | python-versions = ">=3.6" 315 | 316 | [package.extras] 317 | dev = ["pre-commit", "tox"] 318 | testing = ["pytest", "pytest-benchmark"] 319 | 320 | [[package]] 321 | name = "protobuf" 322 | version = "4.21.12" 323 | description = "" 324 | category = "main" 325 | optional = false 326 | python-versions = ">=3.7" 327 | 328 | [[package]] 329 | name = "pycparser" 330 | version = "2.21" 331 | description = "C parser in Python" 332 | category = "main" 333 | optional = false 334 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 335 | 336 | [[package]] 337 | name = "pycryptodomex" 338 | version = "3.16.0" 339 | description = "Cryptographic library for Python" 340 | category = "main" 341 | optional = false 342 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 343 | 344 | [[package]] 345 | name = "pyflakes" 346 | version = "2.5.0" 347 | description = "passive checker of Python programs" 348 | category = "dev" 349 | optional = false 350 | python-versions = ">=3.6" 351 | 352 | [[package]] 353 | name = "pyseto" 354 | version = "1.7.0" 355 | description = "A Python implementation of PASETO/PASERK." 356 | category = "main" 357 | optional = false 358 | python-versions = ">=3.7,<4.0" 359 | 360 | [package.dependencies] 361 | cryptography = ">=36,<39" 362 | iso8601 = ">=1.0.2,<2.0.0" 363 | passlib = {version = ">=1.7.4,<2.0.0", extras = ["argon2"]} 364 | pycryptodomex = ">=3.12.0,<4.0.0" 365 | 366 | [package.extras] 367 | docs = ["Sphinx[docs] (>=4.3.2,<6.0.0)", "sphinx-autodoc-typehints[docs] (==1.12.0)", "sphinx-rtd-theme[docs] (>=1.0.0,<2.0.0)"] 368 | 369 | [[package]] 370 | name = "python-lsp-jsonrpc" 371 | version = "1.0.0" 372 | description = "JSON RPC 2.0 server library" 373 | category = "dev" 374 | optional = false 375 | python-versions = "*" 376 | 377 | [package.dependencies] 378 | ujson = ">=3.0.0" 379 | 380 | [package.extras] 381 | test = ["pylint", "pycodestyle", "pyflakes", "pytest", "pytest-cov", "coverage"] 382 | 383 | [[package]] 384 | name = "pytoolconfig" 385 | version = "1.2.5" 386 | description = "Python tool configuration" 387 | category = "dev" 388 | optional = false 389 | python-versions = ">=3.7" 390 | 391 | [package.dependencies] 392 | packaging = ">=22.0" 393 | platformdirs = {version = ">=1.4.4", optional = true, markers = "extra == \"global\""} 394 | tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} 395 | 396 | [package.extras] 397 | doc = ["tabulate (>=0.8.9)", "sphinx (>=4.5.0)"] 398 | gendocs = ["sphinx (>=4.5.0)", "sphinx-autodoc-typehints (>=1.18.1)", "sphinx-rtd-theme (>=1.0.0)", "pytoolconfig"] 399 | global = ["platformdirs (>=1.4.4)"] 400 | validation = ["pydantic (>=1.7.4)"] 401 | 402 | [[package]] 403 | name = "pyyaml" 404 | version = "6.0" 405 | description = "YAML parser and emitter for Python" 406 | category = "main" 407 | optional = false 408 | python-versions = ">=3.6" 409 | 410 | [[package]] 411 | name = "replit" 412 | version = "3.2.5" 413 | description = "A library for interacting with features of repl.it" 414 | category = "main" 415 | optional = false 416 | python-versions = ">=3.8,<4.0" 417 | 418 | [package.dependencies] 419 | aiohttp = ">=3.6.2,<4.0.0" 420 | Flask = ">=2.0.0,<3.0.0" 421 | protobuf = ">=4.21.8,<5.0.0" 422 | pyseto = ">=1.6.11,<2.0.0" 423 | requests = ">=2.25.1,<3.0.0" 424 | typing_extensions = ">=3.7.4,<4.0.0" 425 | Werkzeug = ">=2.0.0,<3.0.0" 426 | 427 | [[package]] 428 | name = "replit-python-lsp-server" 429 | version = "1.15.9" 430 | description = "Python Language Server for the Language Server Protocol" 431 | category = "dev" 432 | optional = false 433 | python-versions = ">=3.7" 434 | 435 | [package.dependencies] 436 | jedi = ">=0.17.2,<0.19.0" 437 | pluggy = ">=1.0.0" 438 | pyflakes = {version = ">=2.5.0,<2.6.0", optional = true, markers = "extra == \"pyflakes\""} 439 | python-lsp-jsonrpc = ">=1.0.0" 440 | rope = {version = ">0.10.5", optional = true, markers = "extra == \"rope\""} 441 | toml = ">=0.10.2" 442 | ujson = ">=3.0.0" 443 | whatthepatch = {version = ">=1.0.2,<2.0.0", optional = true, markers = "extra == \"yapf\""} 444 | yapf = {version = "*", optional = true, markers = "extra == \"yapf\""} 445 | 446 | [package.extras] 447 | all = ["autopep8 (>=1.6.0,<1.7.0)", "flake8 (>=5.0.0,<5.1.0)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.9.0,<2.10.0)", "pydocstyle (>=2.0.0)", "pyflakes (>=2.5.0,<2.6.0)", "pylint (>=2.5.0)", "rope (>=0.10.5)", "yapf", "whatthepatch"] 448 | autopep8 = ["autopep8 (>=1.6.0,<1.7.0)"] 449 | flake8 = ["flake8 (>=5.0.0,<5.1.0)"] 450 | mccabe = ["mccabe (>=0.7.0,<0.8.0)"] 451 | pycodestyle = ["pycodestyle (>=2.9.0,<2.10.0)"] 452 | pydocstyle = ["pydocstyle (>=2.0.0)"] 453 | pyflakes = ["pyflakes (>=2.5.0,<2.6.0)"] 454 | pylint = ["pylint (>=2.5.0)"] 455 | rope = ["rope (>0.10.5)"] 456 | test = ["pylint (>=2.5.0)", "pytest", "pytest-cov", "coverage", "numpy (<1.23)", "pandas", "matplotlib", "pyqt5", "flaky"] 457 | websockets = ["websockets (>=10.3)"] 458 | yapf = ["yapf", "whatthepatch (>=1.0.2,<2.0.0)"] 459 | 460 | [[package]] 461 | name = "requests" 462 | version = "2.28.2" 463 | description = "Python HTTP for Humans." 464 | category = "main" 465 | optional = false 466 | python-versions = ">=3.7, <4" 467 | 468 | [package.dependencies] 469 | certifi = ">=2017.4.17" 470 | charset-normalizer = ">=2,<4" 471 | idna = ">=2.5,<4" 472 | urllib3 = ">=1.21.1,<1.27" 473 | 474 | [package.extras] 475 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 476 | use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] 477 | 478 | [[package]] 479 | name = "rope" 480 | version = "1.7.0" 481 | description = "a python refactoring library..." 482 | category = "dev" 483 | optional = false 484 | python-versions = ">=3.7" 485 | 486 | [package.dependencies] 487 | pytoolconfig = {version = ">=1.2.2", extras = ["global"]} 488 | 489 | [package.extras] 490 | dev = ["pytest (>=7.0.1)", "pytest-timeout (>=2.1.0)", "build (>=0.7.0)", "pre-commit (>=2.20.0)"] 491 | doc = ["pytoolconfig", "sphinx (>=4.5.0)", "sphinx-autodoc-typehints (>=1.18.1)", "sphinx-rtd-theme (>=1.0.0)"] 492 | 493 | [[package]] 494 | name = "toml" 495 | version = "0.10.2" 496 | description = "Python Library for Tom's Obvious, Minimal Language" 497 | category = "dev" 498 | optional = false 499 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 500 | 501 | [[package]] 502 | name = "tomli" 503 | version = "2.0.1" 504 | description = "A lil' TOML parser" 505 | category = "dev" 506 | optional = false 507 | python-versions = ">=3.7" 508 | 509 | [[package]] 510 | name = "typing-extensions" 511 | version = "3.10.0.2" 512 | description = "Backported and Experimental Type Hints for Python 3.5+" 513 | category = "main" 514 | optional = false 515 | python-versions = "*" 516 | 517 | [[package]] 518 | name = "ujson" 519 | version = "5.7.0" 520 | description = "Ultra fast JSON encoder and decoder for Python" 521 | category = "dev" 522 | optional = false 523 | python-versions = ">=3.7" 524 | 525 | [[package]] 526 | name = "urllib3" 527 | version = "1.26.14" 528 | description = "HTTP library with thread-safe connection pooling, file post, and more." 529 | category = "main" 530 | optional = false 531 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 532 | 533 | [package.extras] 534 | brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] 535 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] 536 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 537 | 538 | [[package]] 539 | name = "werkzeug" 540 | version = "2.2.2" 541 | description = "The comprehensive WSGI web application library." 542 | category = "main" 543 | optional = false 544 | python-versions = ">=3.7" 545 | 546 | [package.dependencies] 547 | MarkupSafe = ">=2.1.1" 548 | 549 | [package.extras] 550 | watchdog = ["watchdog"] 551 | 552 | [[package]] 553 | name = "whatthepatch" 554 | version = "1.0.3" 555 | description = "A patch parsing and application library." 556 | category = "dev" 557 | optional = false 558 | python-versions = ">=3.7" 559 | 560 | [[package]] 561 | name = "yapf" 562 | version = "0.32.0" 563 | description = "A formatter for Python code." 564 | category = "dev" 565 | optional = false 566 | python-versions = "*" 567 | 568 | [[package]] 569 | name = "yarl" 570 | version = "1.8.2" 571 | description = "Yet another URL library" 572 | category = "main" 573 | optional = false 574 | python-versions = ">=3.7" 575 | 576 | [package.dependencies] 577 | idna = ">=2.0" 578 | multidict = ">=4.0" 579 | 580 | [metadata] 581 | lock-version = "1.1" 582 | python-versions = ">=3.10.0,<3.11" 583 | content-hash = "64ed8db51778c8fcc0f43786a4d91c9572bd264e69adc7077da78d077809e924" 584 | 585 | [metadata.files] 586 | aiohttp = [] 587 | aiosignal = [] 588 | argon2-cffi = [] 589 | argon2-cffi-bindings = [] 590 | async-timeout = [] 591 | attrs = [] 592 | certifi = [] 593 | cffi = [] 594 | charset-normalizer = [] 595 | click = [] 596 | colorama = [] 597 | cryptography = [] 598 | debugpy = [] 599 | flask = [] 600 | frozenlist = [] 601 | idna = [] 602 | iso8601 = [] 603 | itsdangerous = [] 604 | jedi = [] 605 | jinja2 = [] 606 | markupsafe = [] 607 | multidict = [] 608 | packaging = [] 609 | parso = [] 610 | passlib = [] 611 | platformdirs = [] 612 | pluggy = [] 613 | protobuf = [] 614 | pycparser = [] 615 | pycryptodomex = [] 616 | pyflakes = [] 617 | pyseto = [] 618 | python-lsp-jsonrpc = [] 619 | pytoolconfig = [] 620 | pyyaml = [] 621 | replit = [] 622 | replit-python-lsp-server = [] 623 | requests = [] 624 | rope = [] 625 | toml = [] 626 | tomli = [] 627 | typing-extensions = [] 628 | ujson = [] 629 | urllib3 = [] 630 | werkzeug = [] 631 | whatthepatch = [] 632 | yapf = [] 633 | yarl = [] 634 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "python-template" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Your Name "] 6 | 7 | [tool.poetry.dependencies] 8 | python = ">=3.10.0,<3.11" 9 | replit = "^3.2.4" 10 | Flask = "^2.1.3" 11 | PyYAML = "^6.0" 12 | 13 | [tool.poetry.dev-dependencies] 14 | debugpy = "^1.6.2" 15 | replit-python-lsp-server = {extras = ["yapf", "rope", "pyflakes"], version = "^1.5.9"} 16 | toml = "^0.10.2" 17 | 18 | [build-system] 19 | requires = ["poetry-core>=1.0.0"] 20 | build-backend = "poetry.core.masonry.api" -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # ChatGPT Plugin Creator - From Swagger 2 | ChatGPT Plugin Creator is an open-source project that helps you convert Swagger 3 | specifications into ChatGPT plugin manifests and API specifications. This enables developers to create plugins for various APIs and integrate them with ChatGPT easily. 4 | 5 | ## Use Cases 6 | ChatGPT Plugin Creator is ideal for: 7 | 8 | * Developers who want to create plugins for their APIs and enable users to interact with them using ChatGPT. 9 | * API providers looking to expand their user base by allowing ChatGPT users to access their services. 10 | * ChatGPT users who want to integrate third-party APIs into their ChatGPT experience. 11 | 12 | ## Installation 13 | To get started with ChatGPT Plugin Creator, follow these steps: 14 | 15 | ## Clone the repository: 16 | * git clone https://github.com/ruvnet/Swagger-ChatGPT-Plugin-Creator.git 17 | 18 | Change to the project directory: 19 | * cd chatgpt-plugin-creator 20 | 21 | Create a virtual environment and activate it: 22 | * python3 -m venv venv 23 | * source venv/bin/activate 24 | 25 | Install the required packages: 26 | * pip install -r requirements.txt 27 | 28 | Run the application: 29 | * python main.py 30 | 31 | Now, you can access the application at http://localhost:5000. 32 | -------------------------------------------------------------------------------- /replit.nix: -------------------------------------------------------------------------------- 1 | { pkgs }: { 2 | deps = [ 3 | pkgs.python310Full 4 | pkgs.replitPackages.prybar-python310 5 | pkgs.replitPackages.stderred 6 | ]; 7 | env = { 8 | PYTHON_LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [ 9 | # Needed for pandas / numpy 10 | pkgs.stdenv.cc.cc.lib 11 | pkgs.zlib 12 | # Needed for pygame 13 | pkgs.glib 14 | # Needed for matplotlib 15 | pkgs.xorg.libX11 16 | ]; 17 | PYTHONBIN = "${pkgs.python310Full}/bin/python3.10"; 18 | LANG = "en_US.UTF-8"; 19 | STDERREDBIN = "${pkgs.replitPackages.stderred}/bin/stderred"; 20 | PRYBAR_PYTHON_BIN = "${pkgs.replitPackages.prybar-python310}/bin/prybar-python310"; 21 | }; 22 | } -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # requirements.txt 2 | 3 | Flask==2.1.1 4 | PyYAML==6.0 -------------------------------------------------------------------------------- /templates/action.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/templates/action.html -------------------------------------------------------------------------------- /templates/commands.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/templates/commands.html -------------------------------------------------------------------------------- /templates/context.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Swagger to ChatGPT Converter 5 | 6 | 7 | 8 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
35 |

ChatGPT Plugin Creator - From Swagger

36 |
37 |
38 |
39 | 40 | 41 |
42 |
43 | 44 | 45 |
46 |
47 | 48 | 49 |
50 |
51 | 52 | 53 |
54 |
55 | 56 | 60 |
61 |
62 | 63 | 64 |
65 |
66 | 67 | 68 |
69 |
70 | 71 | 72 |
73 | 74 |
75 |
76 | 77 | 90 |
91 | 92 | 98 | 99 | 148 | 149 | 150 | 151 | 152 | 189 | 200 | 201 | -------------------------------------------------------------------------------- /templates/errors.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/templates/errors.html -------------------------------------------------------------------------------- /templates/examples.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/templates/examples.html -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Swagger to ChatGPT Converter 5 | 6 | 7 | 8 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | ChatGPT Plugin Creator 35 | 36 | -------------------------------------------------------------------------------- /templates/initialize.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/templates/initialize.html -------------------------------------------------------------------------------- /templates/introduction.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/templates/introduction.html -------------------------------------------------------------------------------- /templates/purpose.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/templates/purpose.html -------------------------------------------------------------------------------- /templates/random.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruvnet/Swagger-ChatGPT-Plugin-Creator/b2e39f1fd717d0db20346048fed972ed9d508ee1/templates/random.html -------------------------------------------------------------------------------- /templates/results.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Conversion Results 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |

Conversion Results

17 |
18 |
ChatGPT Manifest
19 |
20 |
{{ manifest }}
21 | Download manifest.yaml 22 |
23 |
24 |
25 |
ChatGPT OpenAPI Specification
26 |
27 |
{{ openapi_spec }}
28 | Download openapi.yaml 29 |
30 |
31 |
32 | Back 33 |
34 |
35 | 36 | 37 | -------------------------------------------------------------------------------- /templates/swagger.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Swagger to ChatGPT Converter 5 | 6 | 7 | 8 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
35 |

ChatGPT Plugin Creator - From Swagger

36 |
37 |
38 |
39 | 40 | 41 |
42 |
43 | 44 | 45 |
46 |
47 | 48 | 49 |
50 |
51 | 52 | 53 |
54 |
55 | 56 | 60 |
61 |
62 | 63 | 64 |
65 |
66 | 67 | 68 |
69 |
70 | 71 | 72 |
73 | 74 |
75 |
76 | 77 | 90 |
91 | 92 | 98 | 99 | 148 | 149 | 150 | 151 | 152 | 189 | 200 | 201 | --------------------------------------------------------------------------------