From cf8d585bf7f4bb0893f165e907a5f4a5afdb2033 Mon Sep 17 00:00:00 2001
From: Onur Solmaz
Date: Sun, 20 Nov 2022 20:57:36 +0100
Subject: [PATCH 1/2] New magics: %var, %export, %bake. Improved prompt dialog
and generation caching (#32)
* Code cell output is now included in ICortexHistory
* Serialize ExecutionResult and include in ICortexHistory
* Adding %var magic, wip
* wip
* Added %export magic for exporting context to .icx files
* Created Cell classes
* First successful run of icortex run ...
* Refactored, got rid of ICortexContext._dict
* Added cli 'icortex freeze'
* Refactored
* Minor
* Renamed freeze -> bake
* Began refactor
* Restructured generation logic, introduced GenerationResult
* Refactored the rest of the services
* Code cleanup
* Improved prompt parser
* Bumped version
---
docs/source/_templates/base.html | 105 ++
docs/source/_templates/page.html | 216 +++++
docs/source/conf.py | 6 +-
docs/source/index.rst | 2 +
icortex/cli.py | 50 +
icortex/context.py | 374 +++++++-
icortex/defaults.py | 2 +-
icortex/helper.py | 97 +-
icortex/kernel/__init__.py | 329 +++----
icortex/magics.py | 26 +-
icortex/parser.py | 40 +
icortex/services/__init__.py | 48 +-
icortex/services/echo.py | 35 +-
icortex/services/generation_result.py | 17 +
icortex/services/huggingface.py | 41 +-
icortex/services/openai.py | 40 +-
icortex/services/service_base.py | 165 +++-
icortex/services/service_interaction.py | 57 ++
icortex/services/textcortex.py | 55 +-
icortex/var.py | 123 +++
poetry.lock | 1163 ++++++++++++++++++++++-
pyproject.toml | 26 +-
tests/test_parser.py | 66 ++
23 files changed, 2643 insertions(+), 440 deletions(-)
create mode 100644 docs/source/_templates/base.html
create mode 100644 docs/source/_templates/page.html
create mode 100644 icortex/parser.py
create mode 100644 icortex/services/generation_result.py
create mode 100644 icortex/services/service_interaction.py
create mode 100644 icortex/var.py
create mode 100644 tests/test_parser.py
diff --git a/docs/source/_templates/base.html b/docs/source/_templates/base.html
new file mode 100644
index 0000000..4a39d04
--- /dev/null
+++ b/docs/source/_templates/base.html
@@ -0,0 +1,105 @@
+
+
+
+ {%- block site_meta -%}
+
+
+
+
+ {%- if metatags %}{{ metatags }}{% endif -%}
+
+ {%- block linktags %}
+ {%- if hasdoc('about') -%}
+
+ {%- endif -%}
+ {%- if hasdoc('genindex') -%}
+
+ {%- endif -%}
+ {%- if hasdoc('search') -%}
+
+ {%- endif -%}
+ {%- if hasdoc('copyright') -%}
+
+ {%- endif -%}
+ {%- if next -%}
+
+ {%- endif -%}
+ {%- if prev -%}
+
+ {%- endif -%}
+ {#- rel="canonical" (set by html_baseurl) -#}
+ {%- if pageurl %}
+
+ {%- endif %}
+ {%- endblock linktags %}
+
+ {# Favicon #}
+ {%- if favicon_url -%}
+
+ {%- endif -%}
+
+
+
+ {%- endblock site_meta -%}
+
+ {#- Site title -#}
+ {%- block htmltitle -%}
+ {% if not docstitle %}
+ {{ title|striptags|e }}
+ {% elif pagename == master_doc %}
+ {{ docstitle|striptags|e }}
+ {% else %}
+ {{ title|striptags|e }} - {{ docstitle|striptags|e }}
+ {% endif %}
+ {%- endblock -%}
+
+ {%- block styles -%}
+
+ {# Custom stylesheets #}
+ {%- block regular_styles -%}
+ {%- for css in css_files -%}
+ {% if css|attr("filename") -%}
+ {{ css_tag(css) }}
+ {%- else -%}
+
+ {%- endif %}
+ {% endfor -%}
+ {%- endblock regular_styles -%}
+
+ {#- Theme-related stylesheets -#}
+ {%- block theme_styles %}
+ {% include "partials/_head_css_variables.html" with context %}
+ {%- endblock -%}
+
+ {%- block extra_styles %}
+ {%- endblock -%}
+
+ {%- endblock styles -%}
+
+ {#- Custom front matter #}
+ {%- block extrahead -%}{%- endblock -%}
+
+
+ {% block body %}
+
+ {% endblock %}
+
+ {%- block scripts -%}
+
+ {# Custom JS #}
+ {%- block regular_scripts -%}
+ {% for path in script_files -%}
+ {{ js_tag(path) }}
+ {% endfor -%}
+ {%- endblock regular_scripts -%}
+
+ {# Theme-related JavaScript code #}
+ {%- block theme_scripts -%}
+ {%- endblock -%}
+
+ {%- endblock scripts -%}
+
+
+
diff --git a/docs/source/_templates/page.html b/docs/source/_templates/page.html
new file mode 100644
index 0000000..c49fb91
--- /dev/null
+++ b/docs/source/_templates/page.html
@@ -0,0 +1,216 @@
+{% extends "base.html" %}
+
+{% block body -%}
+{{ super() }}
+{% include "partials/icons.html" %}
+
+
+
+
+
+ Hide table of contents sidebar
+
+
+{% if theme_announcement -%}
+
+
+ {% block announcement %} {{ theme_announcement }} {% endblock announcement %}
+
+
+{%- endif %}
+
+
+
+
+
+
+
+
+
+
+
+ {% trans %}Back to top{% endtrans %}
+
+
+
+ {% if theme_top_of_page_button == "edit" -%}
+ {%- include "components/edit-this-page.html" with context -%}
+ {%- elif theme_top_of_page_button != None -%}
+ {{ warning("Got an unsupported value for 'top_of_page_button'") }}
+ {%- endif -%}
+ {#- Theme toggle -#}
+
+
+ Toggle Light / Dark / Auto color theme
+
+
+
+
+
+
+ Toggle table of contents sidebar
+
+
+
+
+ {% block content %}{{ body }}{% endblock %}
+
+
+
+
+
+
+
+{%- endblock %}
diff --git a/docs/source/conf.py b/docs/source/conf.py
index db07b26..f4e43e1 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -31,6 +31,8 @@
templates_path = ["_templates"]
exclude_patterns = []
+# For autodoc
+add_module_names = False
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
@@ -39,10 +41,10 @@
html_static_path = ["_static"]
html_theme_options = {
- "source_repository": "https://github.com/textcortex/ICortex/",
+ "source_repository": "https://github.com/textcortex/icortex/",
"source_branch": "main",
"source_directory": "docs/source/",
- "top_of_page_button": None,
+ # "top_of_page_button": None,
"light_logo": "logo-bottom-light-bg.svg",
"dark_logo": "logo-bottom-dark-bg.svg",
"announcement": "TextCortex loves Open Source ❤️ Join our Discord to become part of our developer community!",
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 504f109..5f6d820 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -3,6 +3,8 @@
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
+:page_template: page.html
+
ICortex
=======
diff --git a/icortex/cli.py b/icortex/cli.py
index a202df3..62e5659 100644
--- a/icortex/cli.py
+++ b/icortex/cli.py
@@ -2,6 +2,7 @@
import shlex
import sys
import argparse
+from icortex.context import ICortexContext
from icortex.services import get_available_services
from icortex.defaults import DEFAULT_ICORTEX_CONFIG_PATH
from icortex.kernel.install import is_kernel_installed, main as install_kernel
@@ -38,6 +39,49 @@ def get_parser(prog=None):
default=DEFAULT_ICORTEX_CONFIG_PATH,
)
+ ##############################
+ # Run a notebook as a script #
+ ##############################
+
+ # icortex run
+ parser_run = subparsers.add_parser(
+ "run",
+ help="Run an ICortex notebook",
+ add_help=False,
+ )
+
+ # Check whether the notebook exists
+ parser_run.add_argument(
+ "notebook",
+ type=str,
+ help="Path to the ICortex notebook to be run",
+ )
+ # A catch-all for the rest of the arguments
+ parser_run.add_argument("notebook_args", nargs=argparse.REMAINDER)
+
+ ########################################
+ # Bake a notebook into a Python script #
+ ########################################
+
+ # icortex bake
+ parser_bake = subparsers.add_parser(
+ "bake",
+ help="Bake an ICortex notebook into a Python script",
+ add_help=False,
+ )
+
+ parser_bake.add_argument(
+ "notebook",
+ type=str,
+ help="Path of the ICortex notebook to be run",
+ )
+
+ parser_bake.add_argument(
+ "destination",
+ type=str,
+ help="Path of the destination Python file",
+ )
+
##########################
# Shell related commands #
##########################
@@ -183,6 +227,12 @@ def main(argv=None, prog=None, kernel=None):
parser_service.print_help()
elif args.command == "help":
parser.print_help()
+ elif args.command == "run":
+ context = ICortexContext.from_file(args.notebook)
+ context.run(args.notebook_args)
+ elif args.command == "bake":
+ context = ICortexContext.from_file(args.notebook)
+ context.bake(args.destination)
elif args.command == "shell" or args.command is None:
from icortex.kernel import get_icortex
from icortex.kernel.app import ZMQTerminalICortexApp
diff --git a/icortex/context.py b/icortex/context.py
index b56e7f6..6d8bf73 100644
--- a/icortex/context.py
+++ b/icortex/context.py
@@ -1,12 +1,28 @@
+import json
+import logging
+import os
import typing as t
+import argparse
+from icortex.var import Var
import importlib_metadata
+from abc import ABC, abstractclassmethod
from copy import deepcopy
import platform
-from icortex.defaults import DEFAULT_HISTORY_VAR
+from icortex.defaults import DEFAULT_CONTEXT_VAR
+from icortex.services.service_interaction import ServiceInteraction
+from IPython.core.interactiveshell import ExecutionResult, ExecutionInfo
+
+from icortex.helper import (
+ comment_out,
+ unescape_quotes,
+ serialize_execution_result,
+ deserialize_execution_result,
+ is_magic,
+)
icortex_version = importlib_metadata.version("icortex")
-INITIAL_HISTORY_VAL = {
+EMPTY_CONTEXT = {
"metadata": {
"kernelspec": {
"display_name": "ICortex (Python 3)",
@@ -31,64 +47,350 @@
}
-class ICortexHistory:
- """Interface to construct a history variable in globals for storing
- notebook context.
- The constructed dict maps to JSON, and the schema is compatible
- with the
- `Jupyter notebook format `__:
- """
+class Cell(ABC):
+ def __init__(self, execution_result: ExecutionResult = None):
+ self.execution_result = execution_result
- def __init__(self, scope: t.Dict[str, t.Any]):
- self.scope = scope
- self._check_init()
+ @abstractclassmethod
+ def get_code(self) -> str:
+ raise NotImplementedError
- def _check_init(self):
- if DEFAULT_HISTORY_VAR not in self.scope:
- self.scope[DEFAULT_HISTORY_VAR] = deepcopy(INITIAL_HISTORY_VAL)
+ @abstractclassmethod
+ def to_dict(self) -> t.Dict[str, t.Any]:
+ raise NotImplementedError
- self._dict = self.scope[DEFAULT_HISTORY_VAR]
+ @property
+ def success(self) -> bool:
+ if self.execution_result is None:
+ return False
+ return self.execution_result.success
- def get_dict(self, omit_last_cell=False):
- ret = deepcopy(self._dict)
- if omit_last_cell:
- if len(ret["cells"]) > 0:
- del ret["cells"][-1]
- return ret
- def add_code(self, code: str, outputs: t.List[t.Any]):
- self._check_init()
+class CodeCell(Cell):
+ def __init__(
+ self,
+ code: str,
+ outputs: t.List[t.Any],
+ execution_result: ExecutionResult = None,
+ ):
+ self.code = code
+ self.outputs = outputs
+ super().__init__(execution_result=execution_result)
+
+ def get_code(self):
+ return self.code
+ def to_dict(self):
ret = {
"cell_type": "code",
- "metadata": {},
- "source": code,
- "outputs": outputs,
+ "metadata": {"source_type": "code"},
+ "source": self.code,
+ "outputs": self.outputs,
}
+ if self.execution_result:
+ ret["metadata"]["execution_result"] = serialize_execution_result(
+ self.execution_result
+ )
- self._dict["cells"].append(ret)
return ret
- def add_prompt(
+ def from_dict(d: t.Dict[str, t.Any]):
+ return CodeCell(
+ d["source"],
+ d["outputs"],
+ execution_result=deserialize_execution_result(
+ d["metadata"]["execution_result"]
+ ),
+ )
+
+ def get_code(self) -> str:
+ return self.code
+
+
+class PromptCell(Cell):
+ def __init__(
self,
prompt: str,
outputs: t.List[t.Any],
- service_interaction: t.Dict[str, t.Any],
+ service_interaction: ServiceInteraction,
+ execution_result: ExecutionResult = None,
):
- self._check_init()
+ self.prompt = prompt
+ self.outputs = outputs
+ self.service_interaction = service_interaction
+ super().__init__(execution_result=execution_result)
+ def to_dict(self):
ret = {
"cell_type": "code",
# It is actually a prompt, but "code" here refers to the Jupyter cell type
"metadata": {
# Any ICortex specific information needs to be stored here to
# adhere to the Jupyter notebook format
- "source_type": "prompt", # This tells that the input was a prompt
- "service": service_interaction,
+ "source_type": "prompt", # This tells that the input was a prompt
+ "service": self.service_interaction.to_dict(),
},
- "source": prompt,
- "outputs": outputs,
+ "source": self.prompt,
+ "outputs": self.outputs,
}
+ if self.execution_result:
+ ret["metadata"]["execution_result"] = serialize_execution_result(
+ self.execution_result
+ )
+ return ret
+
+ def from_dict(d: t.Dict[str, t.Any]):
+ return PromptCell(
+ d["source"],
+ d["outputs"],
+ ServiceInteraction.from_dict(d["metadata"]["service"]),
+ deserialize_execution_result(d["metadata"]["execution_result"]),
+ )
+
+ def get_code(self) -> str:
+ return self.service_interaction.get_code()
+
+ def get_commented_code(self):
+ # Add the prompt as a comment
+ ret = comment_out(self.prompt.rstrip()) + "\n\n"
+ # Add the generated code
+ ret += self.get_code().rstrip().replace("\n\n", "\n")
+ return ret
+
+
+class VarCell(Cell):
+ def __init__(
+ self,
+ var_line: str,
+ var: Var,
+ code: str,
+ outputs: t.List[t.Any],
+ execution_result: ExecutionResult = None,
+ ):
+ self.var_line = var_line
+ self.var = var
+ self.code = code
+ self.outputs = outputs
+ super().__init__(execution_result=execution_result)
+
+ def to_dict(self):
+ ret = {
+ "cell_type": "code",
+ "metadata": {
+ "source_type": "var",
+ "var": self.var.to_dict(),
+ "code": self.code,
+ },
+ "source": self.var_line,
+ "outputs": self.outputs,
+ }
+ if self.execution_result:
+ ret["metadata"]["execution_result"] = serialize_execution_result(
+ self.execution_result
+ )
- self._dict["cells"].append(ret)
return ret
+
+ def from_dict(d: t.Dict[str, t.Any]):
+ return VarCell(
+ d["source"],
+ Var.from_dict(d["metadata"]["var"]),
+ d["metadata"]["code"],
+ d["outputs"],
+ deserialize_execution_result(d["metadata"]["execution_result"]),
+ )
+
+ def get_code(self):
+ return self.code
+
+
+class ICortexContext:
+ """Interface to construct a history variable in globals for storing
+ notebook context.
+ The constructed dict maps to JSON, and the schema is compatible
+ with the
+ `Jupyter notebook format `__:
+ """
+
+ def __init__(self, scope: t.Dict[str, t.Any] = None):
+ self.scope = scope
+ self._cells = []
+ self._vars = []
+ self._check_init()
+
+ def _check_init(self):
+ if self.scope is None:
+ return
+
+ if self.scope.get(DEFAULT_CONTEXT_VAR) != self:
+ self.scope[DEFAULT_CONTEXT_VAR] = self
+
+ # if DEFAULT_CONTEXT_VAR not in self.scope:
+
+ # self._dict = self.scope[DEFAULT_CONTEXT_VAR]
+
+ def to_dict(self, omit_last_cell=False):
+ ret = deepcopy(EMPTY_CONTEXT)
+ # ret = deepcopy(self._dict)
+ # Serialize cells and add to the return value
+ cells = [cell.to_dict() for cell in self._cells]
+ ret.update({"cells": cells})
+ # Serialize vars and add to the return value
+ vars = [var.to_dict() for var in self._vars]
+ ret["metadata"].update({"variables": vars})
+
+ if omit_last_cell:
+ if len(ret["cells"]) > 0:
+ del ret["cells"][-1]
+ return ret
+
+ def define_var(self, var: Var):
+ self._vars.append(var)
+ # self._check_init()
+ # if "variables" not in self._dict["metadata"]:
+ # self._dict["metadata"]["variables"] = []
+
+ # self._dict["metadata"]["variables"].append(var.to_dict())
+ return
+
+ def add_code_cell(self, *args, **kwargs):
+ self._check_init()
+ cell = CodeCell(*args, **kwargs)
+ self._cells.append(cell)
+ return cell
+
+ def add_var_cell(self, *args, **kwargs):
+ self._check_init()
+ cell = VarCell(*args, **kwargs)
+ self._cells.append(cell)
+ return cell
+
+ def add_prompt_cell(self, *args, **kwargs):
+ self._check_init()
+ cell = PromptCell(*args, **kwargs)
+ self._cells.append(cell)
+ return cell
+
+ def save_to_file(self, path: str):
+ self._check_init()
+ with open(path, "w") as f:
+ json.dump(self.to_dict(), f, indent=2)
+
+ print("Exported to", path)
+
+ def from_file(path: str, scope: t.Dict[str, t.Any] = None):
+ # Check if the file exists
+ if not os.path.exists(path):
+ raise FileNotFoundError(f"File {path} does not exist")
+
+ with open(path, "r") as f:
+ dict_ = json.load(f)
+
+ ret = ICortexContext(scope=scope)
+
+ for cell_dict in dict_["cells"]:
+ if cell_dict["metadata"]["source_type"] == "code":
+ cell = CodeCell.from_dict(cell_dict)
+ elif cell_dict["metadata"]["source_type"] == "var":
+ cell = VarCell.from_dict(cell_dict)
+ elif cell_dict["metadata"]["source_type"] == "prompt":
+ cell = PromptCell.from_dict(cell_dict)
+ else:
+ raise ValueError(
+ f"Unknown cell type {cell_dict['metadata']['source_type']}"
+ )
+ ret._cells.append(cell)
+
+ ret._vars = [Var.from_dict(v) for v in dict_["metadata"]["variables"]]
+
+ return ret
+
+ @property
+ def vars(self):
+ """Returns a list of all variables defined in the notebook"""
+ return self._vars
+
+ def iter_cells(self) -> t.Iterator[Cell]:
+ for cell in self._cells:
+ yield cell
+
+ def run(self, notebook_args: t.List[str]):
+ """Run the notebook with the given arguments"""
+
+ vars = self.vars
+ parsed_args = get_notebook_arg_parser(vars).parse_args(notebook_args)
+ scope = locals()
+
+ for cell in self.iter_cells():
+ if cell.success:
+ if isinstance(cell, VarCell):
+ var = cell.var
+ # Change the value to that of the parsed argument
+ var.value = var._type(getattr(parsed_args, var.arg))
+ code = var.get_code()
+ else:
+ code = cell.get_code()
+ # Execute the returned code
+ exec(code, scope)
+
+ def bake(self, dest_path: str, format=True):
+ """Bake the notebook to a Python script"""
+
+ # Warn if the extension is not .py
+ if not dest_path.endswith(".py"):
+ print(
+ f"Warning: {dest_path} does not have the .py extension. "
+ "It is recommended that you use the .py extension for "
+ "frozen files."
+ )
+
+ vars = self.vars
+ scope = locals()
+
+ output = "import argparse\n\nparser = argparse.ArgumentParser()\n"
+ for var in vars:
+ output += f"parser.add_argument({var.arg!r}, type={var._type.__name__})\n"
+ output += "args = parser.parse_args()\n\n"
+
+ for cell in self.iter_cells():
+ if cell.success:
+ if isinstance(cell, VarCell):
+ var = cell.var
+ # Change the value to that of the parsed argument
+ # var.value = var._type(getattr(parsed_args, var.arg))
+ code = f"{var.name} = args.{var.arg}\n\n"
+ # code = var.get_code()
+ elif isinstance(cell, CodeCell):
+ if not is_magic(cell.get_code()):
+ code = cell.get_code().rstrip() + "\n\n"
+ else:
+ continue
+ elif isinstance(cell, PromptCell):
+ code = cell.get_commented_code().rstrip() + "\n\n"
+
+ # Execute the returned code
+ output += code
+
+ # Run black over output
+ if format:
+ import black
+ try:
+ output = black.format_str(output, mode=black.FileMode())
+ except:
+ logging.warning("Failed to format code with black")
+
+ with open(dest_path, "w") as f:
+ f.write(output)
+
+ print("Baked to", dest_path)
+
+
+def get_notebook_arg_parser(vars: t.List[Var]):
+ parser = argparse.ArgumentParser(add_help=False)
+ for var in vars:
+ parser.add_argument(
+ var.arg,
+ type=var._type,
+ help=var.description,
+ )
+ return parser
diff --git a/icortex/defaults.py b/icortex/defaults.py
index 409404a..36b4ff4 100644
--- a/icortex/defaults.py
+++ b/icortex/defaults.py
@@ -6,4 +6,4 @@
DEFAULT_AUTO_EXECUTE = False
DEFAULT_QUIET = False
DEFAULT_SERVICE = "textcortex"
-DEFAULT_HISTORY_VAR = "_icortex_history"
+DEFAULT_CONTEXT_VAR = "_icortex_context"
diff --git a/icortex/helper.py b/icortex/helper.py
index 786bf37..b0e4b48 100644
--- a/icortex/helper.py
+++ b/icortex/helper.py
@@ -1,7 +1,10 @@
+import traceback
from pygments import highlight
from pygments.formatters import Terminal256Formatter
from pygments.lexers import PythonLexer
+from IPython.core.interactiveshell import ExecutionResult, ExecutionInfo
+
def unescape(s) -> str:
return s.encode("utf-8").decode("unicode_escape")
@@ -24,15 +27,19 @@ def escape_quotes(s: str) -> str:
return s.replace('"', r"\"").replace("'", r"\'")
-def extract_prompt(input: str) -> str:
- tokens = input.strip().split(" ", 1)
- if len(tokens) == 1:
- return ""
- else:
- return tokens[1]
+def unescape_quotes(s: str) -> str:
+ return s.replace(r"\"", '"').replace(r"\'", "'")
+
+# def extract_prompt(input: str) -> str:
+# tokens = input.strip().split(" ", 1)
+# if len(tokens) == 1:
+# return ""
+# else:
+# return tokens[1]
-extract_cli = extract_prompt
+
+# extract_cli = extract_prompt
def yes_no_input(message: str, default=True) -> bool:
@@ -64,3 +71,79 @@ def prompt_input(message: str, type=str, default=None, press_enter=False):
def highlight_python(code: str):
return highlight(code, PythonLexer(), Terminal256Formatter())
+
+
+def serialize_exception(exception):
+ ret = {
+ "name": exception.__class__.__name__,
+ "message": str(exception),
+ }
+ try:
+ # This raises errors for certain exceptions.
+ # Can't consider every edge case now, let's hope
+ # "message" will contain enough information
+ ret["traceback"] = traceback.format_exc(exception)
+ except:
+ pass
+
+ return ret
+
+
+def serialize_execution_result(execution_result: ExecutionResult):
+ ret = {}
+ if execution_result.error_before_exec is not None:
+ ret["error_before_exec"] = serialize_exception(
+ execution_result.error_before_exec
+ )
+ if execution_result.error_in_exec is not None:
+ ret["error_in_exec"] = serialize_exception(execution_result.error_in_exec)
+ if execution_result.result is not None:
+ # TODO: Are we ever going to need deeper serialization?
+ ret["result"] = str(execution_result.result)
+ ret["success"] = execution_result.success
+ return ret
+
+
+def deserialize_execution_result(execution_result: dict):
+ # TODO: Deserialize the execution result and info better
+ ret = ExecutionResult(ExecutionInfo("", False, None, None, None))
+
+ # No need to set success, it's a property. See ExecutionResult.success
+ # ret.success = execution_result["success"]
+ if "error_before_exec" in execution_result:
+ ret.error_before_exec = deserialize_exception(
+ execution_result["error_before_exec"]
+ )
+ if "error_in_exec" in execution_result:
+ ret.error_in_exec = deserialize_exception(execution_result["error_in_exec"])
+ if "result" in execution_result:
+ ret.result = execution_result["result"]
+ return ret
+
+
+def deserialize_exception(exception: dict):
+ # TODO: This is a hack, we need to deserialize the exception properly
+ return Exception(exception["message"])
+
+
+def is_icortex_magic(raw_cell: str) -> bool:
+ raw_cell = raw_cell.strip()
+ return (
+ raw_cell.startswith(r"%icortex ")
+ or raw_cell.startswith(r"%prompt ")
+ or raw_cell.startswith(r"%%prompt ")
+ or raw_cell.startswith(r"%p ")
+ or raw_cell.startswith(r"%%p ")
+ or raw_cell.startswith(r"%var ")
+ )
+
+
+def is_magic(raw_cell: str) -> bool:
+ raw_cell = raw_cell.strip()
+ return raw_cell.startswith("%")
+
+
+def comment_out(input: str) -> str:
+ ret = "# " + input
+ ret = ret.replace("\n", "\n# ")
+ return ret
diff --git a/icortex/kernel/__init__.py b/icortex/kernel/__init__.py
index 9ef982e..1ec3fe9 100644
--- a/icortex/kernel/__init__.py
+++ b/icortex/kernel/__init__.py
@@ -2,28 +2,27 @@
# https://jupyter-client.readthedocs.io/en/latest/wrapperkernels.html
# https://github.com/jupyter/jupyter/wiki/Jupyter-kernels
-from logging import warning
-import shlex
import sys
import types
import typing as t
+from enum import Enum
+from logging import warning
from icortex.config import ICortexConfig
from icortex.cli import eval_cli
-from icortex.context import ICortexHistory
+from icortex.context import ICortexContext
from ipykernel.ipkernel import IPythonKernel
from IPython import InteractiveShell, get_ipython
-from IPython.utils.io import capture_output
-from traitlets.config.configurable import SingletonConfigurable
+from IPython.core.interactiveshell import ExecutionResult, ExecutionInfo
from icortex.helper import (
escape_quotes,
- yes_no_input,
- highlight_python,
+ is_icortex_magic,
)
-from icortex.services import ServiceBase, ServiceInteraction, get_available_services
-from icortex.pypi import install_missing_packages, get_missing_modules
+from icortex.services import get_available_services
+from icortex.services.service_base import ServiceBase
from icortex.defaults import *
+from icortex.var import Var
import importlib_metadata
__version__ = importlib_metadata.version("icortex")
@@ -34,6 +33,14 @@
)
+class InputType(Enum):
+ """Enum for input cell type."""
+
+ CODE = 0
+ PROMPT = 1
+ VAR = 2
+
+
def stream_to_list(stream_str: str) -> t.List[str]:
ret = []
for line in stream_str.splitlines():
@@ -49,98 +56,34 @@ def __init__(self, *args, **kwargs):
def _init_icortex_shell(self):
self.service = None
scope = self.user_ns
- self.history = ICortexHistory(scope)
+ self.history = ICortexContext(scope)
from icortex.magics import load_ipython_extension
load_ipython_extension(self)
self.user_ns["get_icortex"] = get_icortex
+ # self.var_parser = get_var_magic_parser()
+
# Initialize bound methods
# TODO: make less hacky
self.set_service = types.MethodType(ICortexShell.set_service, self)
- self._run_dialog = types.MethodType(ICortexShell._run_dialog, self)
+ # self._run_dialog = types.MethodType(ICortexShell._run_dialog, self)
self._check_service = types.MethodType(ICortexShell._check_service, self)
self.print_service_help = types.MethodType(
ICortexShell.print_service_help, self
)
+ self.run_cell = types.MethodType(ICortexShell.run_cell, self)
self.cli = types.MethodType(ICortexShell.cli, self)
self.prompt = types.MethodType(ICortexShell.prompt, self)
- self.eval_prompt = types.MethodType(ICortexShell.eval_prompt, self)
+ # self.eval_prompt = types.MethodType(ICortexShell.eval_prompt, self)
+ self.eval_var = types.MethodType(ICortexShell.eval_var, self)
+ self.export = types.MethodType(ICortexShell.export, self)
+ self.bake = types.MethodType(ICortexShell.bake, self)
def set_service(self, service: t.Type[ServiceBase]):
self.service = service
return True
- def _run_dialog(
- self,
- code: str,
- auto_execute: bool = DEFAULT_AUTO_EXECUTE,
- auto_install_packages: bool = DEFAULT_AUTO_INSTALL_PACKAGES,
- quiet: bool = DEFAULT_QUIET,
- nonint: bool = False,
- ) -> ServiceInteraction:
-
- if not quiet:
- print(highlight_python(code))
-
- missing_modules = get_missing_modules(code)
-
- install_packages_yesno = False
- if len(missing_modules) > 0 and not auto_install_packages and not nonint:
- install_packages_yesno = yes_no_input(
- f"The following modules are missing in your environment: {', '.join(missing_modules)}\nAttempt to find and install corresponding PyPI packages?"
- )
- install_packages = auto_install_packages or install_packages_yesno
-
- unresolved_modules = []
- if install_packages:
- # Unresolved modules are modules that cannot be mapped
- # to any PyPI packages according to the local data in this library
- unresolved_modules = install_missing_packages(code)
- if len(unresolved_modules) > 0:
- print(
- f"""The following imported modules could not be resolved to PyPI packages: {', '.join(unresolved_modules)}
- Install them manually and try again.
- """
- )
-
- # Modules that are still missing regardless of
- # whether the user tried to auto-install them or not:
- still_missing_modules = get_missing_modules(code)
-
- execute_yesno = False
- if not auto_execute and not nonint and len(still_missing_modules) == 0:
- execute_yesno = yes_no_input("Proceed to execute?")
-
- execute = auto_execute or execute_yesno
-
- if execute and len(still_missing_modules) > 0:
- execute = False
- if auto_install_packages:
- bermuda_modules = [
- module
- for module in still_missing_modules
- if module not in unresolved_modules
- ]
- print(
- f"""These modules should have been installed at this point, but they are still missing: {', '.join(bermuda_modules)}
- This might be due to an installer issue, please resolve manually.""",
- )
- print(
- f"Skipping execution due to missing modules: {', '.join(still_missing_modules)}."
- )
-
- return ServiceInteraction(
- name=self.service.name,
- execute=execute,
- outputs=[code],
- quiet=quiet,
- install_packages=install_packages,
- missing_modules=missing_modules,
- # unresolved_modules=unresolved_modules,
- # still_missing_modules=still_missing_modules,
- )
-
def _check_service(self):
if self.service is None:
conf = ICortexConfig(DEFAULT_ICORTEX_CONFIG_PATH)
@@ -156,81 +99,144 @@ def print_service_help(self):
else:
print(INIT_SERVICE_MSG)
- def prompt(self, input_: str):
- prompt = escape_quotes(input_)
- if self._check_service():
- service_interaction = self.eval_prompt(prompt)
+ # Wrap run_cell
+ def run_cell(
+ self,
+ raw_cell,
+ store_history=False,
+ silent=False,
+ shell_futures=True,
+ cell_id=None,
+ input_type=InputType.CODE,
+ ):
+
+ # Execute generated code
+ stdout = ""
+ stderr = ""
+ # with capture_output() as io:
+ # self.run_cell(
+ # code,
+ # store_history=False,
+ # silent=False,
+ # cell_id=self.execution_count,
+ # )
+ # stdout = io.stdout
+ # stderr = io.stderr
+ # # TODO: Make capture_output() forward streams and display outputs
+ # # This doesn't cause a problem with ipython for some reason but only icortex
+
+ is_icortex_magic_ = is_icortex_magic(raw_cell)
+ result = ExecutionResult(ExecutionInfo("", None, None, None, None))
+
+ # print("Called run_cell ", input_type)
+ if input_type == InputType.CODE:
+
+ result = InteractiveShell.run_cell(
+ self,
+ raw_cell,
+ store_history=store_history,
+ silent=silent,
+ shell_futures=shell_futures,
+ cell_id=cell_id,
+ )
+ elif input_type == InputType.PROMPT:
+ service_interaction = self.service.eval_prompt(raw_cell, self.history)
code = service_interaction.get_code()
- # Execute generated code
- stdout = ""
- stderr = ""
- # with capture_output() as io:
- # self.run_cell(
- # code,
- # store_history=False,
- # silent=False,
- # cell_id=self.execution_count,
- # )
- # stdout = io.stdout
- # stderr = io.stderr
- # # TODO: Make capture_output() forward streams and display outputs
- # # This doesn't cause a problem with ipython for some reason but only icortex
-
- self.run_cell(
+ result = InteractiveShell.run_cell(
+ self,
code,
store_history=False,
silent=False,
cell_id=self.execution_count,
)
-
- # Get the output from InteractiveShell.history_manager.
- # run_cell should be called with store_history=False in order for
- # self.execution_count to match with the respective output
- outputs = []
- try:
- if self.execution_count in self.history_manager.output_hist_reprs:
- output = self.history_manager.output_hist_reprs[
- self.execution_count
- ]
- # If the cell has an output, add it to the outputs
- # according to nbformat
- outputs.append(
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [output],
- },
- }
- )
- except:
- warning("There was an issue with saving execution output to history")
-
- # If cell has an output stream, add it to the outputs
- # TODO: Decide whether to include fields `execution_count`, `metadata`, etc.
- if stdout != "":
- outputs.append(
- {
- "name": "stdout",
- "output_type": "stream",
- "data": {
- "text/plain": stream_to_list(stdout),
- },
- }
- )
- # Same for stderr
- if stderr != "":
+ elif input_type == InputType.VAR:
+ # args = self.var_parser.parse_args(raw_cell.split())
+ # code, arg_name, var_name, value = line_to_code(raw_cell)
+ var = Var.from_var_magic(raw_cell)
+ code = var.get_code()
+ result = InteractiveShell.run_cell(
+ self,
+ code,
+ store_history=False,
+ silent=False,
+ cell_id=self.execution_count,
+ )
+ self.history.define_var(var)
+
+ # Get the output from InteractiveShell.history_manager.
+ # run_cell should be called with store_history=False in order for
+ # self.execution_count to match with the respective output
+ outputs = []
+ try:
+ if self.execution_count in self.history_manager.output_hist_reprs:
+ output = self.history_manager.output_hist_reprs[self.execution_count]
+ # If the cell has an output, add it to the outputs
+ # according to nbformat
outputs.append(
{
- "name": "stderr",
- "output_type": "stream",
+ "output_type": "execute_result",
"data": {
- "text/plain": stream_to_list(stderr),
+ "text/plain": [output],
},
}
)
+ except:
+ warning("There was an issue with saving execution output to history")
+
+ # If cell has an output stream, add it to the outputs
+ # TODO: Decide whether to include fields `execution_count`, `metadata`, etc.
+ if stdout != "":
+ outputs.append(
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "data": {
+ "text/plain": stream_to_list(stdout),
+ },
+ }
+ )
+ # Same for stderr
+ if stderr != "":
+ outputs.append(
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "data": {
+ "text/plain": stream_to_list(stderr),
+ },
+ }
+ )
+
+ if input_type == InputType.CODE and not is_icortex_magic_:
+ self.history.add_code_cell(
+ raw_cell,
+ outputs,
+ execution_result=result,
+ )
+ elif input_type == InputType.PROMPT:
# Store history with the input and corresponding output
- self.history.add_prompt(input_, outputs, service_interaction.to_dict())
+ self.history.add_prompt_cell(
+ raw_cell,
+ outputs,
+ service_interaction,
+ execution_result=result,
+ )
+ elif input_type == InputType.VAR:
+ self.history.add_var_cell(
+ raw_cell,
+ var,
+ code,
+ outputs,
+ execution_result=result,
+ )
+
+ return result
+
+ def prompt(self, input_: str):
+ if self._check_service():
+
+ result = self.run_cell(input_, input_type=InputType.PROMPT)
else:
print(INIT_SERVICE_MSG)
@@ -238,25 +244,26 @@ def cli(self, input_: str):
prompt = escape_quotes(input_)
eval_cli(prompt)
- def eval_prompt(self, prompt_with_args: str) -> ServiceInteraction:
- # Print help if the user has typed `/help`
- argv = shlex.split(prompt_with_args)
- args = self.service.prompt_parser.parse_args(argv)
+ def eval_var(self, line: str):
+ "Evaluate var magic"
+ # args = self.var_parser.parse_args(line.split())
+ self.run_cell(line, input_type=InputType.VAR)
- # Otherwise, generate with the prompt
- response = self.service.generate(
- prompt_with_args, context=self.history.get_dict(omit_last_cell=True)
- )
- # TODO: Account for multiple response values
- code_: str = response[0]["text"]
-
- return self._run_dialog(
- code_,
- auto_execute=args.execute,
- auto_install_packages=args.auto_install_packages,
- quiet=args.quiet,
- nonint=args.nonint,
- )
+ def export(self, line: str):
+ "Export notebook to a file"
+ dest = line.split(" ")[0].strip()
+ if dest == "":
+ raise ValueError("Please specify a destination")
+
+ self.history.save_to_file(dest + ".icx")
+
+ def bake(self, line: str):
+ "Bake notebook into a Python script"
+ dest = line.split(" ")[0].strip()
+ if dest == "":
+ raise ValueError("Please specify a destination")
+
+ self.history.bake(dest + ".py")
class ICortexKernel(IPythonKernel):
diff --git a/icortex/magics.py b/icortex/magics.py
index 6781258..06e3d3a 100644
--- a/icortex/magics.py
+++ b/icortex/magics.py
@@ -16,10 +16,28 @@ def help(self, line):
print_service_help()
return
+ @line_magic
+ def var(self, line):
+ "Define a variable"
+ shell = get_icortex()
+ return shell.eval_var(line)
+
+ @line_magic
+ def export(self, line):
+ "Export ICortex notebook"
+ shell = get_icortex()
+ return shell.export(line)
+
+ @line_magic
+ def bake(self, line):
+ "Bake ICortex notebook"
+ shell = get_icortex()
+ return shell.bake(line)
+
@line_magic
def icortex(self, line):
- kernel = get_icortex()
- return kernel.cli(line)
+ shell = get_icortex()
+ return shell.cli(line)
@line_cell_magic
def prompt(self, line, cell=None):
@@ -34,8 +52,8 @@ def p(self, line, cell=None):
return self.prompt(line, cell=cell)
def _prompt(self, input_):
- kernel = get_icortex()
- return kernel.prompt(input_)
+ shell = get_icortex()
+ return shell.prompt(input_)
def load_ipython_extension(ipython):
diff --git a/icortex/parser.py b/icortex/parser.py
new file mode 100644
index 0000000..a2e874a
--- /dev/null
+++ b/icortex/parser.py
@@ -0,0 +1,40 @@
+import re
+
+
+def extract_quoted_string(s):
+ s = s.lstrip()
+ if s[0] == '"' or s[0] == "'":
+ ret = s[1 : s.find(s[0], 1)]
+ rest = s[s.find(s[0], 1) + 1 :].strip()
+ surrounded = True
+ else:
+ ret = s
+ rest = ""
+ surrounded = False
+ return ret, rest, surrounded
+
+
+def extract_prompt(raw_prompt):
+ raw_prompt, rest, surrounded = extract_quoted_string(raw_prompt)
+ if surrounded:
+ return raw_prompt, rest
+
+ flag_regex = re.compile(r"(?:-[a-zA-Z]|--[a-zA-Z]+)")
+ flag_match = flag_regex.search(raw_prompt)
+
+ if flag_match:
+ ret = raw_prompt[: flag_match.start()].strip()
+ rest = raw_prompt[flag_match.start() :]
+ else:
+ ret = raw_prompt.strip()
+ rest = ""
+
+ return ret, rest
+
+
+def lex_prompt(raw_prompt):
+ prompt, rest = extract_prompt(raw_prompt)
+ ret = [prompt]
+ # Split rest and remove empty strings
+ ret.extend([s for s in rest.split() if s])
+ return ret
diff --git a/icortex/services/__init__.py b/icortex/services/__init__.py
index 53c1567..20d3f63 100644
--- a/icortex/services/__init__.py
+++ b/icortex/services/__init__.py
@@ -4,12 +4,7 @@
from icortex.services.service_base import ServiceBase, ServiceVariable
-from icortex.defaults import (
- DEFAULT_AUTO_EXECUTE,
- DEFAULT_AUTO_INSTALL_PACKAGES,
- DEFAULT_QUIET,
- DEFAULT_SERVICE,
-)
+from icortex.defaults import DEFAULT_SERVICE
#: A dictionary that maps unique service names to corresponding
#: classes that derive from :class:`icortex.services.service_base.ServiceBase`.
@@ -47,44 +42,3 @@ def get_available_services() -> t.List[str]:
sorted_services = [DEFAULT_SERVICE] + sorted_services
return sorted_services
-
-
-class ServiceInteraction:
- def __init__(
- self,
- name: str = None,
- outputs: t.List[str] = None,
- execute: bool = None,
- install_packages: bool = None,
- missing_modules: t.List[str] = None,
- quiet: bool = None,
- # still_missing_modules: t.List[str] = None,
- # unresolved_modules: t.List[str] = None,
- ):
- self.name = name
- self.outputs = outputs
- self.install_packages = install_packages
- self.missing_modules = missing_modules
- self.execute = execute
- self.quiet = quiet
- # self.still_missing_modules = still_missing_modules
- # self.unresolved_modules = unresolved_modules
-
- def to_dict(self):
- ret = {
- ret: val
- for ret, val in deepcopy(self.__dict__).items()
- if val is not None and val != []
- }
- if self.install_packages == DEFAULT_AUTO_INSTALL_PACKAGES:
- del ret["install_packages"]
- if self.quiet == DEFAULT_QUIET:
- del ret["quiet"]
-
- return ret
-
- def get_code(self):
- if self.execute:
- return self.outputs[0]
- else:
- return ""
diff --git a/icortex/services/echo.py b/icortex/services/echo.py
index cecac49..1b1aef3 100644
--- a/icortex/services/echo.py
+++ b/icortex/services/echo.py
@@ -1,9 +1,9 @@
-import shlex
import typing as t
+from icortex.context import ICortexContext
from icortex.defaults import *
from icortex.services import ServiceBase, ServiceVariable
from icortex.helper import escape_quotes
-
+from icortex.services.generation_result import GenerationResult
class EchoService(ServiceBase):
name = "echo"
@@ -21,16 +21,9 @@ class EchoService(ServiceBase):
def generate(
self,
prompt: str,
- context: t.Dict[str, t.Any] = {},
- ) -> t.List[t.Dict[t.Any, t.Any]]:
- argv = shlex.split(prompt)
-
- # Remove the module name flag from the prompt
- # Argparse adds this automatically, so we need to sanitize user input
- if "-m" in argv:
- argv.remove("-m")
-
- args = self.prompt_parser.parse_args(argv)
+ args,
+ context: ICortexContext = None,
+ ) -> GenerationResult:
# Prepare request data
payload = {
@@ -44,21 +37,19 @@ def generate(
"data": payload,
}
- # If the the same request is found in the cache, return the cached response
- if not args.regenerate:
- cached_response = self.find_cached_response(
- cached_request_dict, cache_path=DEFAULT_CACHE_PATH
- )
- if cached_response is not None:
- return cached_response["generated_text"]
-
desired_output = args.prefix + " ".join(args.prompt)
code = 'print("""' + escape_quotes(desired_output) + '""")'
response_dict = {"generated_text": [{"text": code}]}
- self.cache_response(
+ self.cache_interaction(
cached_request_dict, response_dict, cache_path=DEFAULT_CACHE_PATH
)
- return response_dict["generated_text"]
+ return GenerationResult(cached_request_dict, response_dict)
+
+ def get_outputs_from_result(
+ self, generation_result: GenerationResult
+ ) -> t.List[str]:
+ ret = [i["text"] for i in generation_result.response_dict["generated_text"]]
+ return ret
diff --git a/icortex/services/generation_result.py b/icortex/services/generation_result.py
new file mode 100644
index 0000000..75c9cae
--- /dev/null
+++ b/icortex/services/generation_result.py
@@ -0,0 +1,17 @@
+import typing as t
+
+
+class GenerationResult:
+ def __init__(self, request_dict, response_dict):
+ self.request_dict = request_dict
+ self.response_dict = response_dict
+ # self.__dict__.update(kwargs)
+
+ def to_dict(self):
+ return {
+ "request_dict": self.request_dict,
+ "response_dict": self.response_dict,
+ }
+
+ def from_dict(d: dict):
+ return GenerationResult(d["request_dict"], d["response_dict"])
diff --git a/icortex/services/huggingface.py b/icortex/services/huggingface.py
index 3f1b5c0..4de48ab 100644
--- a/icortex/services/huggingface.py
+++ b/icortex/services/huggingface.py
@@ -1,10 +1,11 @@
import re
-import shlex
import typing as t
from icortex.defaults import *
from icortex.helper import unescape
from icortex.services import ServiceBase, ServiceVariable
+from icortex.context import ICortexContext
+from icortex.services.generation_result import GenerationResult
# TODO
# [x] Keep the ServiceBase object in memory and don't create a new one at every request
@@ -13,7 +14,7 @@
DEFAULT_MODEL = "TextCortex/codegen-350M-optimized"
-def create_prompt(input: str, prefix: str, suffix: str):
+def build_prompt(input: str, prefix: str, suffix: str):
return prefix + input + suffix
@@ -133,19 +134,12 @@ def __init__(self, **kwargs: t.Dict):
def generate(
self,
prompt: str,
- context: t.Dict[str, t.Any] = {},
- ) -> t.List[t.Dict[t.Any, t.Any]]:
- argv = shlex.split(prompt)
+ args,
+ context: ICortexContext = None,
+ ) -> GenerationResult:
- # Remove the module name flag from the prompt
- # Argparse adds this automatically, so we need to sanitize user input
- if "-m" in argv:
- argv.remove("-m")
-
- args = self.prompt_parser.parse_args(argv)
-
- prompt_text = create_prompt(
- " ".join(args.prompt),
+ prompt_text = build_prompt(
+ prompt,
unescape(args.prompt_prefix),
unescape(args.prompt_suffix),
)
@@ -167,21 +161,18 @@ def generate(
# If the the same request is found in the cache, return the cached response
if not args.regenerate:
- cached_response = self.find_cached_response(
+ cached_interaction = self.find_cached_interaction(
cached_request_dict, cache_path=DEFAULT_CACHE_PATH
)
- if cached_response is not None:
- return cached_response["generated_text"]
+ if cached_interaction is not None:
+ if cached_interaction.execute == True:
+ return cached_interaction.generation_result
# Inference
code = self._generate(**payload)
response_dict = {"generated_text": [{"text": code}]}
- self.cache_response(
- cached_request_dict, response_dict, cache_path=DEFAULT_CACHE_PATH
- )
-
- return response_dict["generated_text"]
+ return GenerationResult(cached_request_dict, response_dict)
def _generate(
self,
@@ -224,3 +215,9 @@ def get_token_id(self, seq):
self.token_id_cache[seq] = token_id
return token_id
+
+ def get_outputs_from_result(
+ self, generation_result: GenerationResult
+ ) -> t.List[str]:
+ ret = [i["text"] for i in generation_result.response_dict["generated_text"]]
+ return ret
diff --git a/icortex/services/openai.py b/icortex/services/openai.py
index c3739d4..1f1b7ab 100644
--- a/icortex/services/openai.py
+++ b/icortex/services/openai.py
@@ -1,11 +1,12 @@
import openai
-import shlex
import typing as t
from icortex.defaults import *
from icortex.services import ServiceBase, ServiceVariable
+from icortex.context import ICortexContext
from icortex.helper import unescape
+from icortex.services.generation_result import GenerationResult
MISSING_API_KEY_MSG = """The ICortex prompt requires an API key from OpenAI in order to work.
@@ -20,7 +21,7 @@
"""
-def create_prompt(input: str, prefix: str, suffix: str):
+def build_prompt(input: str, prefix: str, suffix: str):
return prefix + input + suffix
@@ -108,19 +109,12 @@ def __init__(self, **kwargs: t.Dict):
def generate(
self,
prompt: str,
- context: t.Dict[str, t.Any] = {},
- ) -> t.List[t.Dict[t.Any, t.Any]]:
+ args,
+ context: ICortexContext = None,
+ ) -> GenerationResult:
- argv = shlex.split(prompt)
-
- # Remove the module name flag from the prompt
- # Argparse adds this automatically, so we need to sanitize user input
- if "-m" in argv:
- argv.remove("-m")
-
- args = self.prompt_parser.parse_args(argv)
- openai_prompt = create_prompt(
- " ".join(args.prompt),
+ openai_prompt = build_prompt(
+ prompt,
unescape(args.prompt_prefix),
unescape(args.prompt_suffix),
)
@@ -144,17 +138,19 @@ def generate(
# If the the same request is found in the cache, return the cached response
if not args.regenerate:
- cached_response = self.find_cached_response(
+ cached_interaction = self.find_cached_interaction(
cached_request_dict, cache_path=DEFAULT_CACHE_PATH
)
- if cached_response is not None:
- return cached_response["choices"]
+ if cached_interaction is not None:
+ if cached_interaction.execute == True:
+ return cached_interaction.generation_result
# Otherwise, make the API call
response = openai.Completion.create(**request_dict)
+ return GenerationResult(cached_request_dict, response)
- self.cache_response(
- cached_request_dict, response, cache_path=DEFAULT_CACHE_PATH
- )
-
- return response["choices"]
+ def get_outputs_from_result(
+ self, generation_result: GenerationResult
+ ) -> t.List[str]:
+ ret = [i["text"] for i in generation_result.response_dict["choices"]]
+ return ret
diff --git a/icortex/services/service_base.py b/icortex/services/service_base.py
index aef2a6c..c00636c 100644
--- a/icortex/services/service_base.py
+++ b/icortex/services/service_base.py
@@ -2,11 +2,20 @@
import argparse
import json
import typing as t
-from abc import ABC, abstractmethod
-
-from icortex.defaults import DEFAULT_CACHE_PATH
-from icortex.helper import prompt_input
-
+from abc import ABC, abstractclassmethod
+
+from icortex.defaults import (
+ DEFAULT_AUTO_EXECUTE,
+ DEFAULT_AUTO_INSTALL_PACKAGES,
+ DEFAULT_CACHE_PATH,
+ DEFAULT_QUIET,
+)
+from icortex.context import ICortexContext
+from icortex.helper import escape_quotes, highlight_python, prompt_input, yes_no_input
+from icortex.pypi import get_missing_modules, install_missing_packages
+from icortex.services.generation_result import GenerationResult
+from icortex.services.service_interaction import ServiceInteraction
+from icortex.parser import lex_prompt
def is_str_repr(s: str):
quotes = ["'", '"']
@@ -30,6 +39,7 @@ class ServiceVariable:
the prompt parser will raise an error if the variable is not specified.
Defaults to False.
"""
+
def __init__(
self,
type_: type,
@@ -132,7 +142,7 @@ def __init__(self, **kwargs: t.Dict[str, t.Any]):
"-e",
"--execute",
action="store_true",
- required=False,
+ required=DEFAULT_AUTO_EXECUTE,
help="Execute the Python code returned by TextCortex API directly.",
)
self.prompt_parser.add_argument(
@@ -142,36 +152,15 @@ def __init__(self, **kwargs: t.Dict[str, t.Any]):
required=False,
help="Make the kernel ignore cached responses and make a new request to TextCortex API.",
)
- self.prompt_parser.add_argument(
- "-i",
- "--include-history",
- action="store_true",
- required=False,
- help="Submit notebook history along with the prompt.",
- )
self.prompt_parser.add_argument(
"-p",
"--auto-install-packages",
action="store_true",
- required=False,
+ required=DEFAULT_AUTO_INSTALL_PACKAGES,
help="Auto-install packages that are imported in the generated code but missing in the active Python environment.",
)
- self.prompt_parser.add_argument(
- "-o",
- "--nonint",
- action="store_true",
- required=False,
- help=f"Non-interactive, do not ask any questions.",
- )
- self.prompt_parser.add_argument(
- "-q",
- "--quiet",
- action="store_true",
- required=False,
- help="Do not print the generated code.",
- )
self.prompt_parser.usage = (
- "%%prompt your prompt goes here [-e] [-r] [-i] [-p] ..."
+ "%%prompt your prompt goes here [-e] [-r] [-p] ..."
)
self.prompt_parser.description = self.description
@@ -190,35 +179,36 @@ def __init__(self, **kwargs: t.Dict[str, t.Any]):
**var.argparse_kwargs,
)
- def find_cached_response(
+ def find_cached_interaction(
self,
request_dict: t.Dict,
cache_path: str = DEFAULT_CACHE_PATH,
- ):
+ ) -> ServiceInteraction:
cache = self._read_cache(cache_path)
# If the the same request is found in the cache, return the cached response
# Return the latest found response by default
for dict_ in reversed(cache):
- if dict_["request"] == request_dict:
- return dict_["response"]
+ interaction = ServiceInteraction.from_dict(dict_)
+ if interaction.generation_result.request_dict == request_dict:
+ return interaction
return None
- def cache_response(
+ def cache_interaction(
self,
- request_dict: t.Dict,
- response_dict: t.Dict,
+ interaction: ServiceInteraction,
cache_path: str = DEFAULT_CACHE_PATH,
):
cache = self._read_cache(DEFAULT_CACHE_PATH)
- cache.append({"request": request_dict, "response": response_dict})
+ cache.append(interaction.to_dict())
return self._write_cache(cache, cache_path)
- @abstractmethod
+ @abstractclassmethod
def generate(
self,
prompt: str,
- context: t.Dict[str, t.Any] = {},
- ) -> t.List[t.Dict[t.Any, t.Any]]:
+ args,
+ context: ICortexContext = None,
+ ) -> GenerationResult:
"""Implement the logic that generates code from user prompts here.
Args:
@@ -232,6 +222,20 @@ def generate(
"""
raise NotImplementedError
+ @abstractclassmethod
+ def get_outputs_from_result(
+ self, generation_result: GenerationResult
+ ) -> t.List[str]:
+ """Given a GenerationResult, return a dict that contains the response.
+
+ Args:
+ generation_result (GenerationResult): The result of the generation
+
+ Returns:
+ Dict[str, Any]: The response dict
+ """
+ raise NotImplementedError
+
def config_dialog(self, skip_defaults=False):
return_dict = {}
for key, var in self.variables.items():
@@ -295,3 +299,84 @@ def _write_cache(self, cache: t.List[t.Dict], cache_path):
with open(cache_path, "w") as f:
json.dump(cache, f, indent=2)
return True
+
+ def eval_prompt(self, raw_prompt: str, context) -> ServiceInteraction:
+ # Print help if the user has typed `/help`
+ argv = lex_prompt(raw_prompt)
+ args = self.prompt_parser.parse_args(argv)
+
+ args.prompt = " ".join(args.prompt)
+
+ # Otherwise, generate with the prompt
+ generation_result = self.generate(
+ args.prompt,
+ args,
+ context=context,
+ )
+ outputs = self.get_outputs_from_result(generation_result)
+
+ # TODO: Account for multiple response values
+ code_ = outputs[0]
+
+ # Print the generated code
+ print(highlight_python(code_))
+
+ # Search for any missing modules
+ missing_modules = get_missing_modules(code_)
+
+ install_packages_yesno = False
+ if len(missing_modules) > 0 and not args.auto_install_packages:
+ install_packages_yesno = yes_no_input(
+ f"The following modules are missing in your environment: {', '.join(missing_modules)}\nAttempt to find and install corresponding PyPI packages?"
+ )
+ install_packages = args.auto_install_packages or install_packages_yesno
+
+ unresolved_modules = []
+ if install_packages:
+ # Unresolved modules are modules that cannot be mapped
+ # to any PyPI packages according to the local data in this library
+ unresolved_modules = install_missing_packages(code_)
+ if len(unresolved_modules) > 0:
+ print(
+ f"""The following imported modules could not be resolved to PyPI packages: {', '.join(unresolved_modules)}
+ Install them manually and try again.
+ """
+ )
+
+ # Modules that are still missing regardless of
+ # whether the user tried to auto-install them or not:
+ still_missing_modules = get_missing_modules(code_)
+
+ execute_yesno = False
+ if not args.execute and len(still_missing_modules) == 0:
+ execute_yesno = yes_no_input("Proceed to execute?")
+
+ execute = args.execute or execute_yesno
+
+ if execute and len(still_missing_modules) > 0:
+ execute = False
+ if args.auto_install_packages:
+ bermuda_modules = [
+ module
+ for module in still_missing_modules
+ if module not in unresolved_modules
+ ]
+ print(
+ f"""These modules should have been installed at this point, but they are still missing: {', '.join(bermuda_modules)}
+ This might be due to an installer issue, please resolve manually.""",
+ )
+ print(
+ f"Skipping execution due to missing modules: {', '.join(still_missing_modules)}."
+ )
+
+ ret = ServiceInteraction(
+ name=self.name,
+ args=args.__dict__,
+ generation_result=generation_result,
+ execute=execute,
+ outputs=[code_],
+ install_packages=install_packages,
+ missing_modules=missing_modules,
+ )
+ self.cache_interaction(ret, cache_path=DEFAULT_CACHE_PATH)
+ return ret
diff --git a/icortex/services/service_interaction.py b/icortex/services/service_interaction.py
new file mode 100644
index 0000000..3f4124b
--- /dev/null
+++ b/icortex/services/service_interaction.py
@@ -0,0 +1,57 @@
+import typing as t
+from copy import deepcopy
+
+from icortex.defaults import (
+ DEFAULT_AUTO_INSTALL_PACKAGES,
+ DEFAULT_QUIET,
+)
+from icortex.services.generation_result import GenerationResult
+
+
+class ServiceInteraction:
+ def __init__(
+ self,
+ name: str = None,
+ args: t.List[str] = None,
+ generation_result: GenerationResult = None,
+ outputs: t.List[str] = None,
+ execute: bool = None,
+ install_packages: bool = None,
+ missing_modules: t.List[str] = None,
+ ):
+ self.name = name
+ self.args = args
+ self.generation_result = generation_result
+ self.outputs = outputs
+ self.install_packages = install_packages
+ self.missing_modules = missing_modules
+ self.execute = execute
+
+ def to_dict(self):
+ ret = {
+ ret: val
+ for ret, val in deepcopy(self.__dict__).items()
+ if val is not None and val != []
+ }
+ if self.install_packages == DEFAULT_AUTO_INSTALL_PACKAGES:
+ del ret["install_packages"]
+ ret["generation_result"] = self.generation_result.to_dict()
+ return ret
+
+ def from_dict(d: dict):
+ return ServiceInteraction(
+ name=d.get("name"),
+ args=d.get("args"),
+ generation_result=GenerationResult.from_dict(d.get("generation_result")),
+ outputs=d.get("outputs"),
+ install_packages=d.get("install_packages"),
+ missing_modules=d.get("missing_modules"),
+ execute=d.get("execute"),
+ )
+
+ def get_code(self) -> str:
+ if self.execute:
+ # TODO: Account for multiple generations
+ return self.outputs[0]
+ else:
+ return ""
diff --git a/icortex/services/textcortex.py b/icortex/services/textcortex.py
index 23ca00b..8100246 100644
--- a/icortex/services/textcortex.py
+++ b/icortex/services/textcortex.py
@@ -1,12 +1,14 @@
+import os
import requests
import json
import copy
-import shlex
import typing as t
+from icortex.context import ICortexContext
from icortex.defaults import *
from icortex.services import ServiceBase, ServiceVariable
+from icortex.services.generation_result import GenerationResult
ICORTEX_ENDPOINT_URI = "https://api.textcortex.com/hemingwai/generate_text_v3"
MISSING_API_KEY_MSG = """The ICortex prompt requires an API key from TextCortex in order to work.
@@ -22,9 +24,19 @@
api_key = "your-api-key-goes-here"
"""
+# Load alternative URI from the environment
+try:
+ from dotenv import load_dotenv
+
+ load_dotenv()
+ ICORTEX_ENDPOINT_URI = os.environ.get("ICORTEX_ENDPOINT_URI", ICORTEX_ENDPOINT_URI)
+except:
+ pass
+
class TextCortexService(ServiceBase):
"""Interface to TextCortex's code generation service"""
+
name = "textcortex"
description = "TextCortex Python code generator"
variables = {
@@ -71,24 +83,17 @@ def __init__(self, **kwargs: t.Dict):
def generate(
self,
prompt: str,
- context: t.Dict[str, t.Any] = {},
+ args,
+ context: ICortexContext = None,
) -> t.List[t.Dict[t.Any, t.Any]]:
""""""
- argv = shlex.split(prompt)
-
- # Remove the module name flag from the prompt
- # Argparse adds this automatically, so we need to sanitize user input
- if "-m" in argv:
- argv.remove("-m")
- args = self.prompt_parser.parse_args(argv)
- prompt_text = " ".join(args.prompt)
# Prepare request data
payload = {
"template_name": "icortex",
"prompt": {
- "instruction": prompt_text,
- "context": context,
+ "instruction": prompt,
+ "context": context.to_dict() if context else {},
},
"temperature": args.temperature,
"token_count": args.token_count,
@@ -103,6 +108,7 @@ def generate(
del cached_payload["api_key"]
# Delete the whole context for now:
del cached_payload["prompt"]["context"]
+
cached_request_dict = {
"service": self.name,
"params": {
@@ -115,11 +121,12 @@ def generate(
# If the the same request is found in the cache, return the cached response
if not args.regenerate:
- cached_response = self.find_cached_response(
+ cached_interaction = self.find_cached_interaction(
cached_request_dict, cache_path=DEFAULT_CACHE_PATH
)
- if cached_response is not None:
- return cached_response["generated_text"]
+ if cached_interaction is not None:
+ if cached_interaction.execute == True:
+ return cached_interaction.generation_result
# Otherwise, make the API call
response = requests.request(
@@ -127,12 +134,16 @@ def generate(
)
response_dict = response.json()
- if response_dict["status"] == "success":
- self.cache_response(
- cached_request_dict, response_dict, cache_path=DEFAULT_CACHE_PATH
- )
- return response_dict["generated_text"]
- elif response_dict["status"] == "fail":
+ if response_dict.get("status") == "success":
+ return GenerationResult(cached_request_dict, response_dict)
+ # return response_dict["generated_text"]
+ else:
raise Exception(
- f"There was an issue with generation: {response_dict['message']}"
+ f"There was an issue with generation: {response_dict.get('message', 'No message provided')}"
)
+
+ def get_outputs_from_result(
+ self, generation_result: GenerationResult
+ ) -> t.List[str]:
+ ret = [i["text"] for i in generation_result.response_dict["generated_text"]]
+ return ret
diff --git a/icortex/var.py b/icortex/var.py
new file mode 100644
index 0000000..599bc94
--- /dev/null
+++ b/icortex/var.py
@@ -0,0 +1,123 @@
+import argparse
+import typing as t
+
+from icortex.helper import escape_quotes
+
+VAR_NAME_PREFIX = "_"
+
+TYPE_STR_TO_TYPE = {
+ "str": str,
+ "int": int,
+ "float": float,
+ "bool": bool,
+ # "list": list,
+ # "dict": dict,
+ # "tuple": tuple,
+ # "set": set,
+}
+
+class Var:
+ def __init__(self, arg, name, value, type, description=None):
+ self.arg = arg
+ self.name = name
+ self.value = value
+ # TODO: Rename to type_str
+ self.type = type
+ self.description = description
+
+ self._type = TYPE_STR_TO_TYPE[type]
+
+ def from_var_magic(line):
+ args = get_var_magic_parser().parse_args(line.split())
+ var_name = VAR_NAME_PREFIX + args.name
+ value = parse_var(args.value, args.type)
+ return Var(args.name, var_name, value, args.type, args.description)
+
+ def get_code(self):
+ "Get code that assigns the variable value"
+ code = f"{self.name} = {repr(self.value)}\n"
+ code += f"{self.name}" # For showing in the output
+ return code
+
+ def to_dict(self):
+ "Convert to a dictionary"
+ ret = {
+ "arg": self.arg,
+ "name": self.name,
+ "value": self.value,
+ "type": self.type,
+ }
+ if self.description:
+ ret["description"] = self.description
+ return ret
+
+ def from_dict(d: t.Dict[str, t.Any]):
+ "Create a Var from a dictionary"
+ return Var(
+ d["arg"], d["name"], d["value"], d["type"], d.get("description", None)
+ )
+
+ def __repr__(self):
+ return f"Var({self.arg}={repr(self.value)})"
+
+
+def get_var_magic_parser():
+ parser = argparse.ArgumentParser(
+ add_help=False,
+ )
+ parser.add_argument(
+ "name",
+ type=str,
+ help="Name of the variable to be set",
+ )
+ parser.add_argument(
+ "value",
+ type=str,
+ help="Value of the variable to be set",
+ )
+ parser.add_argument(
+ "--type",
+ choices=[
+ "int",
+ "float",
+ "str",
+ "bool",
+ ], # TODO: Add more types, e.g. list, dict, etc.
+ default="str",
+ help="Type of the variable to be set",
+ )
+ parser.add_argument(
+ "--description",
+ type=str,
+ help="Description of the variable to be set",
+ )
+ return parser
+
+
+def parse_var(val: str, type: str):
+ if type == "str":
+ return val
+ elif type == "int":
+ return int(val)
+ elif type == "float":
+ return float(val)
+ elif type == "bool":
+ return bool(val)
+ else:
+ raise ValueError(f"Unknown type: {type}")
+
+
+# def escape_var(val):
+# if type == "str":
+# if "\n" in val:
+# return f'"""{escape_quotes(val)}"""'
+# else:
+# return f'"{escape_quotes(val)}"'
+# elif type == "int":
+# return str(int(val))
+# elif type == "float":
+# return str(float(val))
+# elif type == "bool":
+# return str(bool(val))
+# else:
+# raise ValueError(f"Unknown type: {type}")
diff --git a/poetry.lock b/poetry.lock
index 8ec7074..4e7fa5e 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -26,10 +26,10 @@ python-versions = ">=3.5"
dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"]
docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"]
tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"]
-tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"]
+tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"]
[[package]]
-name = "babel"
+name = "Babel"
version = "2.11.0"
description = "Internationalization utilities"
category = "dev"
@@ -62,6 +62,29 @@ soupsieve = ">1.2"
html5lib = ["html5lib"]
lxml = ["lxml"]
+[[package]]
+name = "black"
+version = "22.10.0"
+description = "The uncompromising code formatter."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+click = ">=8.0.0"
+mypy-extensions = ">=0.4.3"
+pathspec = ">=0.9.0"
+platformdirs = ">=2"
+tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""}
+typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""}
+typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
+
+[package.extras]
+colorama = ["colorama (>=0.4.3)"]
+d = ["aiohttp (>=3.7.4)"]
+jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
+uvloop = ["uvloop (>=0.15.2)"]
+
[[package]]
name = "certifi"
version = "2022.9.24"
@@ -90,7 +113,19 @@ optional = false
python-versions = ">=3.5.0"
[package.extras]
-unicode-backport = ["unicodedata2"]
+unicode_backport = ["unicodedata2"]
+
+[[package]]
+name = "click"
+version = "8.1.3"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
[[package]]
name = "colorama"
@@ -100,6 +135,20 @@ category = "main"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+[[package]]
+name = "coloredlogs"
+version = "15.0.1"
+description = "Colored terminal output for Python's logging module"
+category = "main"
+optional = true
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+humanfriendly = ">=9.1"
+
+[package.extras]
+cron = ["capturer (>=2.4)"]
+
[[package]]
name = "debugpy"
version = "1.6.3"
@@ -132,9 +181,17 @@ category = "main"
optional = false
python-versions = ">=3.6"
+[[package]]
+name = "et-xmlfile"
+version = "1.1.0"
+description = "An implementation of lxml.xmlfile for the standard library"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
[[package]]
name = "exceptiongroup"
-version = "1.0.1"
+version = "1.0.4"
description = "Backport of PEP 654 (exception groups)"
category = "dev"
optional = false
@@ -143,6 +200,26 @@ python-versions = ">=3.7"
[package.extras]
test = ["pytest (>=6)"]
+[[package]]
+name = "filelock"
+version = "3.8.0"
+description = "A platform independent file lock."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["furo (>=2022.6.21)", "sphinx (>=5.1.1)", "sphinx-autodoc-typehints (>=1.19.1)"]
+testing = ["covdefaults (>=2.2)", "coverage (>=6.4.2)", "pytest (>=7.1.2)", "pytest-cov (>=3)", "pytest-timeout (>=2.1)"]
+
+[[package]]
+name = "flatbuffers"
+version = "22.10.26"
+description = "The FlatBuffers serialization format for Python"
+category = "main"
+optional = true
+python-versions = "*"
+
[[package]]
name = "furo"
version = "2022.9.29"
@@ -157,6 +234,45 @@ pygments = ">=2.7"
sphinx = ">=4.0,<6.0"
sphinx-basic-ng = "*"
+[[package]]
+name = "huggingface-hub"
+version = "0.10.1"
+description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
+category = "main"
+optional = true
+python-versions = ">=3.7.0"
+
+[package.dependencies]
+filelock = "*"
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+packaging = ">=20.9"
+pyyaml = ">=5.1"
+requests = "*"
+tqdm = "*"
+typing-extensions = ">=3.7.4.3"
+
+[package.extras]
+all = ["InquirerPy (==0.3.4)", "Jinja2", "black (==22.3)", "flake8 (>=3.8.3)", "flake8-bugbear", "isort (>=5.5.4)", "jedi", "mypy", "pytest", "pytest-cov", "soundfile"]
+cli = ["InquirerPy (==0.3.4)"]
+dev = ["InquirerPy (==0.3.4)", "Jinja2", "black (==22.3)", "flake8 (>=3.8.3)", "flake8-bugbear", "isort (>=5.5.4)", "jedi", "mypy", "pytest", "pytest-cov", "soundfile"]
+fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
+quality = ["black (==22.3)", "flake8 (>=3.8.3)", "flake8-bugbear", "isort (>=5.5.4)", "mypy"]
+tensorflow = ["graphviz", "pydot", "tensorflow"]
+testing = ["InquirerPy (==0.3.4)", "Jinja2", "isort (>=5.5.4)", "jedi", "pytest", "pytest-cov", "soundfile"]
+torch = ["torch"]
+
+[[package]]
+name = "humanfriendly"
+version = "10.0"
+description = "Human friendly output for text interfaces using Python"
+category = "main"
+optional = true
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+pyreadline = {version = "*", markers = "sys_platform == \"win32\" and python_version < \"3.8\""}
+pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""}
+
[[package]]
name = "idna"
version = "3.4"
@@ -198,6 +314,20 @@ category = "dev"
optional = false
python-versions = "*"
+[[package]]
+name = "ipdb"
+version = "0.13.9"
+description = "IPython-enabled pdb"
+category = "dev"
+optional = false
+python-versions = ">=2.7"
+
+[package.dependencies]
+decorator = {version = "*", markers = "python_version > \"3.6\""}
+ipython = {version = ">=7.17.0", markers = "python_version > \"3.6\""}
+setuptools = "*"
+toml = {version = ">=0.10.2", markers = "python_version > \"3.6\""}
+
[[package]]
name = "ipykernel"
version = "6.16.2"
@@ -290,7 +420,7 @@ qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"]
[[package]]
-name = "jinja2"
+name = "Jinja2"
version = "3.1.2"
description = "A very fast and expressive template engine."
category = "dev"
@@ -305,7 +435,7 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "jupyter-client"
-version = "7.4.4"
+version = "7.4.6"
description = "Jupyter protocol implementation and client libraries"
category = "main"
optional = false
@@ -366,7 +496,7 @@ optional = false
python-versions = ">=3.7"
[[package]]
-name = "markupsafe"
+name = "MarkupSafe"
version = "2.1.1"
description = "Safely add untrusted strings to HTML/XML markup."
category = "dev"
@@ -384,6 +514,26 @@ python-versions = ">=3.5"
[package.dependencies]
traitlets = "*"
+[[package]]
+name = "mpmath"
+version = "1.2.1"
+description = "Python library for arbitrary-precision floating-point arithmetic"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.extras]
+develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"]
+tests = ["pytest (>=4.6)"]
+
+[[package]]
+name = "mypy-extensions"
+version = "0.4.3"
+description = "Experimental type system extensions for programs checked with the mypy typechecker."
+category = "main"
+optional = false
+python-versions = "*"
+
[[package]]
name = "nest-asyncio"
version = "1.5.6"
@@ -392,6 +542,158 @@ category = "main"
optional = false
python-versions = ">=3.5"
+[[package]]
+name = "numpy"
+version = "1.21.1"
+description = "NumPy is the fundamental package for array computing with Python."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[[package]]
+name = "nvidia-cublas-cu11"
+version = "11.10.3.66"
+description = "CUBLAS native runtime libraries"
+category = "main"
+optional = true
+python-versions = ">=3"
+
+[package.dependencies]
+setuptools = "*"
+wheel = "*"
+
+[[package]]
+name = "nvidia-cuda-nvrtc-cu11"
+version = "11.7.99"
+description = "NVRTC native runtime libraries"
+category = "main"
+optional = true
+python-versions = ">=3"
+
+[package.dependencies]
+setuptools = "*"
+wheel = "*"
+
+[[package]]
+name = "nvidia-cuda-runtime-cu11"
+version = "11.7.99"
+description = "CUDA Runtime native Libraries"
+category = "main"
+optional = true
+python-versions = ">=3"
+
+[package.dependencies]
+setuptools = "*"
+wheel = "*"
+
+[[package]]
+name = "nvidia-cudnn-cu11"
+version = "8.5.0.96"
+description = "cuDNN runtime libraries"
+category = "main"
+optional = true
+python-versions = ">=3"
+
+[package.dependencies]
+setuptools = "*"
+wheel = "*"
+
+[[package]]
+name = "onnx"
+version = "1.12.0"
+description = "Open Neural Network Exchange"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+numpy = ">=1.16.6"
+protobuf = ">=3.12.2,<=3.20.1"
+typing-extensions = ">=3.6.2.1"
+
+[package.extras]
+lint = ["clang-format (==13.0.0)", "flake8", "mypy (==0.782)", "types-protobuf (==3.18.4)"]
+
+[[package]]
+name = "onnxruntime"
+version = "1.12.1"
+description = "ONNX Runtime is a runtime accelerator for Machine Learning models"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+coloredlogs = "*"
+flatbuffers = "*"
+numpy = ">=1.21.0"
+packaging = "*"
+protobuf = "*"
+sympy = "*"
+
+[[package]]
+name = "openai"
+version = "0.23.1"
+description = "Python client library for the OpenAI API"
+category = "main"
+optional = true
+python-versions = ">=3.7.1"
+
+[package.dependencies]
+numpy = "*"
+openpyxl = ">=3.0.7"
+pandas = ">=1.2.3"
+pandas-stubs = ">=1.1.0.11"
+requests = ">=2.20"
+tqdm = "*"
+typing_extensions = "*"
+
+[package.extras]
+dev = ["black (>=21.6b0,<22.0)", "pytest (>=6.0.0,<7.0.0)"]
+embeddings = ["matplotlib", "plotly", "scikit-learn (>=1.0.2)", "sklearn", "tenacity (>=8.0.1)"]
+wandb = ["wandb"]
+
+[[package]]
+name = "openpyxl"
+version = "3.0.10"
+description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+et-xmlfile = "*"
+
+[[package]]
+name = "optimum"
+version = "1.4.1"
+description = "Optimum Library is an extension of the Hugging Face Transformers library, providing a framework to integrate third-party libraries from Hardware Partners and interface with their specific functionality."
+category = "main"
+optional = true
+python-versions = ">=3.7.0"
+
+[package.dependencies]
+coloredlogs = "*"
+huggingface_hub = ">=0.8.0"
+numpy = "*"
+packaging = "*"
+sympy = "*"
+torch = ">=1.9"
+transformers = {version = ">=4.20.1", extras = ["sentencepiece"]}
+
+[package.extras]
+benchmark = ["evaluate (>=0.2.0)", "optuna", "seqeval", "sklearn", "torchvision", "tqdm"]
+dev = ["Pillow", "black (>=22.0,<23.0)", "flake8 (>=3.8.3)", "isort (>=5.5.4)", "parameterized", "pytest", "pytest-xdist", "requests"]
+graphcore = ["optimum-graphcore"]
+habana = ["optimum-habana"]
+intel = ["optimum-intel"]
+neural-compressor = ["optimum-intel[neural-compressor]"]
+nncf = ["optimum-intel[nncf]"]
+onnxruntime = ["datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime (>=1.9.0)", "protobuf (==3.20.1)"]
+onnxruntime-gpu = ["datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime-gpu (>=1.9.0)", "protobuf (==3.20.1)"]
+openvino = ["optimum-intel[openvino]"]
+quality = ["black (>=22.0,<23.0)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"]
+tests = ["Pillow", "parameterized", "pytest", "pytest-xdist", "requests"]
+
[[package]]
name = "packaging"
version = "21.3"
@@ -403,6 +705,38 @@ python-versions = ">=3.6"
[package.dependencies]
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
+[[package]]
+name = "pandas"
+version = "1.3.5"
+description = "Powerful data structures for data analysis, time series, and statistics"
+category = "main"
+optional = true
+python-versions = ">=3.7.1"
+
+[package.dependencies]
+numpy = [
+ {version = ">=1.17.3", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""},
+ {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""},
+ {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""},
+ {version = ">=1.21.0", markers = "python_version >= \"3.10\""},
+]
+python-dateutil = ">=2.7.3"
+pytz = ">=2017.3"
+
+[package.extras]
+test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"]
+
+[[package]]
+name = "pandas-stubs"
+version = "1.2.0.62"
+description = "Type annotations for Pandas"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""}
+
[[package]]
name = "parso"
version = "0.8.3"
@@ -415,6 +749,14 @@ python-versions = ">=3.6"
qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
testing = ["docopt", "pytest (<6.0.0)"]
+[[package]]
+name = "pathspec"
+version = "0.10.2"
+description = "Utility library for gitignore style pattern matching of file paths."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
[[package]]
name = "pbr"
version = "5.11.0"
@@ -442,6 +784,18 @@ category = "main"
optional = false
python-versions = "*"
+[[package]]
+name = "platformdirs"
+version = "2.5.4"
+description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"]
+test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"]
+
[[package]]
name = "pluggy"
version = "1.0.0"
@@ -468,6 +822,14 @@ python-versions = ">=3.6.2"
[package.dependencies]
wcwidth = "*"
+[[package]]
+name = "protobuf"
+version = "3.20.1"
+description = "Protocol Buffers"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
[[package]]
name = "psutil"
version = "5.9.4"
@@ -504,7 +866,7 @@ optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
-name = "pygments"
+name = "Pygments"
version = "2.13.0"
description = "Pygments is a syntax highlighting package written in Python."
category = "main"
@@ -525,6 +887,22 @@ python-versions = ">=3.6.8"
[package.extras]
diagrams = ["jinja2", "railroad-diagrams"]
+[[package]]
+name = "pyreadline"
+version = "2.1"
+description = "A python implmementation of GNU readline."
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "pyreadline3"
+version = "3.4.1"
+description = "A python implementation of GNU readline."
+category = "main"
+optional = true
+python-versions = "*"
+
[[package]]
name = "pytest"
version = "7.2.0"
@@ -557,11 +935,22 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
[package.dependencies]
six = ">=1.5"
+[[package]]
+name = "python-dotenv"
+version = "0.21.0"
+description = "Read key-value pairs from a .env file and set them as environment variables"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+cli = ["click (>=5.0)"]
+
[[package]]
name = "pytz"
version = "2022.6"
description = "World timezone definitions, modern and historical"
-category = "dev"
+category = "main"
optional = false
python-versions = "*"
@@ -573,6 +962,14 @@ category = "main"
optional = false
python-versions = "*"
+[[package]]
+name = "PyYAML"
+version = "6.0"
+description = "YAML parser and emitter for Python"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
[[package]]
name = "pyzmq"
version = "24.0.1"
@@ -585,23 +982,39 @@ python-versions = ">=3.6"
cffi = {version = "*", markers = "implementation_name == \"pypy\""}
py = {version = "*", markers = "implementation_name == \"pypy\""}
+[[package]]
+name = "regex"
+version = "2022.10.31"
+description = "Alternative regular expression module, to replace re."
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
[[package]]
name = "requests"
-version = "2.27.1"
+version = "2.28.1"
description = "Python HTTP for Humans."
category = "main"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+python-versions = ">=3.7, <4"
[package.dependencies]
certifi = ">=2017.4.17"
-charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
-idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
+charset-normalizer = ">=2,<3"
+idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<1.27"
[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
-use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"]
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
+use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
+
+[[package]]
+name = "sentencepiece"
+version = "0.1.97"
+description = "SentencePiece python wrapper"
+category = "main"
+optional = true
+python-versions = "*"
[[package]]
name = "setuptools"
@@ -641,7 +1054,7 @@ optional = false
python-versions = ">=3.6"
[[package]]
-name = "sphinx"
+name = "Sphinx"
version = "5.3.0"
description = "Python documentation generator"
category = "dev"
@@ -688,18 +1101,18 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta
[[package]]
name = "sphinx-copybutton"
-version = "0.5.0"
+version = "0.5.1"
description = "Add a copy button to each of your code cells."
category = "dev"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
[package.dependencies]
sphinx = ">=1.8"
[package.extras]
-code-style = ["pre-commit (==2.12.1)"]
-rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme"]
+code_style = ["pre-commit (==2.12.1)"]
+rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"]
[[package]]
name = "sphinxcontrib-applehelp"
@@ -783,6 +1196,30 @@ python-versions = "*"
[package.dependencies]
pbr = "*"
+[[package]]
+name = "sympy"
+version = "1.10.1"
+description = "Computer algebra system (CAS) in Python"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+mpmath = ">=0.19"
+
+[[package]]
+name = "tokenizers"
+version = "0.13.2"
+description = "Fast and Customizable Tokenizers"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.extras]
+dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"]
+docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"]
+testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"]
+
[[package]]
name = "toml"
version = "0.10.2"
@@ -795,10 +1232,28 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
name = "tomli"
version = "2.0.1"
description = "A lil' TOML parser"
-category = "dev"
+category = "main"
optional = false
python-versions = ">=3.7"
+[[package]]
+name = "torch"
+version = "1.13.0"
+description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration"
+category = "main"
+optional = true
+python-versions = ">=3.7.0"
+
+[package.dependencies]
+nvidia-cublas-cu11 = "11.10.3.66"
+nvidia-cuda-nvrtc-cu11 = "11.7.99"
+nvidia-cuda-runtime-cu11 = "11.7.99"
+nvidia-cudnn-cu11 = "8.5.0.96"
+typing-extensions = "*"
+
+[package.extras]
+opt-einsum = ["opt-einsum (>=3.3)"]
+
[[package]]
name = "tornado"
version = "6.2"
@@ -807,6 +1262,23 @@ category = "main"
optional = false
python-versions = ">= 3.7"
+[[package]]
+name = "tqdm"
+version = "4.64.1"
+description = "Fast, Extensible Progress Meter"
+category = "main"
+optional = true
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+dev = ["py-make (>=0.1.0)", "twine", "wheel"]
+notebook = ["ipywidgets (>=6)"]
+slack = ["slack-sdk"]
+telegram = ["requests"]
+
[[package]]
name = "traitlets"
version = "5.5.0"
@@ -819,6 +1291,78 @@ python-versions = ">=3.7"
docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
test = ["pre-commit", "pytest"]
+[[package]]
+name = "transformers"
+version = "4.24.0"
+description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow"
+category = "main"
+optional = true
+python-versions = ">=3.7.0"
+
+[package.dependencies]
+filelock = "*"
+huggingface-hub = ">=0.10.0,<1.0"
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+numpy = ">=1.17"
+packaging = ">=20.0"
+protobuf = {version = "<=3.20.2", optional = true, markers = "extra == \"sentencepiece\""}
+pyyaml = ">=5.1"
+regex = "!=2019.12.17"
+requests = "*"
+sentencepiece = {version = ">=0.1.91,<0.1.92 || >0.1.92", optional = true, markers = "extra == \"sentencepiece\""}
+tokenizers = ">=0.11.1,<0.11.3 || >0.11.3,<0.14"
+tqdm = ">=4.27"
+
+[package.extras]
+accelerate = ["accelerate (>=0.10.0)"]
+all = ["Pillow", "accelerate (>=0.10.0)", "codecarbon (==1.2.0)", "flax (>=0.4.1)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "librosa", "onnxconverter-common", "optax (>=0.0.8)", "optuna", "phonemizer", "protobuf (<=3.20.2)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4)", "tensorflow-text", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.7,!=1.12.0)", "torchaudio"]
+audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
+codecarbon = ["codecarbon (==1.2.0)"]
+deepspeed = ["accelerate (>=0.10.0)", "deepspeed (>=0.6.5)"]
+deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.10.0)", "beautifulsoup4", "black (==22.3)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.6.5)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf (<=3.20.2)", "psutil", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "timeout-decorator"]
+dev = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.10.0)", "beautifulsoup4", "black (==22.3)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flake8 (>=3.8.3)", "flax (>=0.4.1)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pyknp (>=0.6.1)", "pytest", "pytest-timeout", "pytest-xdist", "ray[tune]", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.4)", "tensorflow-text", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.7,!=1.12.0)", "torchaudio", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"]
+dev-tensorflow = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (==22.3)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flake8 (>=3.8.3)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.4)", "tensorflow-text", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)"]
+dev-torch = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (==22.3)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flake8 (>=3.8.3)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pyknp (>=0.6.1)", "pytest", "pytest-timeout", "pytest-xdist", "ray[tune]", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.7,!=1.12.0)", "torchaudio", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"]
+docs = ["Pillow", "accelerate (>=0.10.0)", "codecarbon (==1.2.0)", "flax (>=0.4.1)", "hf-doc-builder", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "librosa", "onnxconverter-common", "optax (>=0.0.8)", "optuna", "phonemizer", "protobuf (<=3.20.2)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4)", "tensorflow-text", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.7,!=1.12.0)", "torchaudio"]
+docs_specific = ["hf-doc-builder"]
+fairscale = ["fairscale (>0.3)"]
+flax = ["flax (>=0.4.1)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "optax (>=0.0.8)"]
+flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
+ftfy = ["ftfy"]
+integrations = ["optuna", "ray[tune]", "sigopt"]
+ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "pyknp (>=0.6.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"]
+modelcreation = ["cookiecutter (==1.7.3)"]
+onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"]
+onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"]
+optuna = ["optuna"]
+quality = ["GitPython (<3.1.19)", "black (==22.3)", "datasets (!=2.5.0)", "flake8 (>=3.8.3)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)"]
+ray = ["ray[tune]"]
+retrieval = ["datasets (!=2.5.0)", "faiss-cpu"]
+sagemaker = ["sagemaker (>=2.31.0)"]
+sentencepiece = ["protobuf (<=3.20.2)", "sentencepiece (>=0.1.91,!=0.1.92)"]
+serving = ["fastapi", "pydantic", "starlette", "uvicorn"]
+sigopt = ["sigopt"]
+sklearn = ["scikit-learn"]
+speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"]
+testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (==22.3)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf (<=3.20.2)", "psutil", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "timeout-decorator"]
+tf = ["onnxconverter-common", "tensorflow (>=2.4)", "tensorflow-text", "tf2onnx"]
+tf-cpu = ["onnxconverter-common", "tensorflow-cpu (>=2.3)", "tensorflow-text", "tf2onnx"]
+tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
+timm = ["timm"]
+tokenizers = ["tokenizers (>=0.11.1,!=0.11.3,<0.14)"]
+torch = ["torch (>=1.7,!=1.12.0)"]
+torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"]
+torchhub = ["filelock", "huggingface-hub (>=0.10.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf (<=3.20.2)", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.7,!=1.12.0)", "tqdm (>=4.27)"]
+vision = ["Pillow"]
+
+[[package]]
+name = "typed-ast"
+version = "1.5.4"
+description = "a fork of Python 2 and 3 ast modules with type comment support"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
[[package]]
name = "typing-extensions"
version = "4.4.0"
@@ -829,14 +1373,15 @@ python-versions = ">=3.7"
[[package]]
name = "urllib3"
-version = "1.22"
+version = "1.26.12"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "main"
optional = false
-python-versions = "*"
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4"
[package.extras]
-secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
+secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
@@ -847,6 +1392,17 @@ category = "main"
optional = false
python-versions = "*"
+[[package]]
+name = "wheel"
+version = "0.38.4"
+description = "A built-package format for Python"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.extras]
+test = ["pytest (>=3.0.0)"]
+
[[package]]
name = "widgetsnbextension"
version = "4.0.3"
@@ -868,13 +1424,13 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker
testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
[extras]
-huggingface = []
-openai = []
+huggingface = ["onnxruntime", "onnx", "optimum", "transformers", "torch"]
+openai = ["openai"]
[metadata]
lock-version = "1.1"
-python-versions = ">=3.7"
-content-hash = "6ce2f18be1cf1dc29ee96854bcb7100b2a700c309d4ee6968f1486f629a26392"
+python-versions = ">=3.7.1,<4"
+content-hash = "d36f2f609f262fa1aeb4c62453d07634b4741451b9efbbbbd8f69da4968c1a14"
[metadata.files]
alabaster = [
@@ -889,7 +1445,7 @@ attrs = [
{file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"},
{file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"},
]
-babel = [
+Babel = [
{file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"},
{file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"},
]
@@ -901,6 +1457,29 @@ beautifulsoup4 = [
{file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"},
{file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"},
]
+black = [
+ {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"},
+ {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"},
+ {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"},
+ {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"},
+ {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"},
+ {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"},
+ {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"},
+ {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"},
+ {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"},
+ {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"},
+ {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"},
+ {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"},
+ {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"},
+ {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"},
+ {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"},
+ {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"},
+ {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"},
+ {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"},
+ {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"},
+ {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"},
+ {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"},
+]
certifi = [
{file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"},
{file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"},
@@ -975,10 +1554,18 @@ charset-normalizer = [
{file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"},
{file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"},
]
+click = [
+ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
+ {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
+]
colorama = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
+coloredlogs = [
+ {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"},
+ {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"},
+]
debugpy = [
{file = "debugpy-1.6.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c4b2bd5c245eeb49824bf7e539f95fb17f9a756186e51c3e513e32999d8846f3"},
{file = "debugpy-1.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b8deaeb779699350deeed835322730a3efec170b88927debc9ba07a1a38e2585"},
@@ -1011,14 +1598,34 @@ entrypoints = [
{file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"},
{file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"},
]
+et-xmlfile = [
+ {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"},
+ {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
+]
exceptiongroup = [
- {file = "exceptiongroup-1.0.1-py3-none-any.whl", hash = "sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a"},
- {file = "exceptiongroup-1.0.1.tar.gz", hash = "sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2"},
+ {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"},
+ {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"},
+]
+filelock = [
+ {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"},
+ {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"},
+]
+flatbuffers = [
+ {file = "flatbuffers-22.10.26-py2.py3-none-any.whl", hash = "sha256:e36d5ba7a5e9483ff0ec1d238fdc3011c866aab7f8ce77d5e9d445ac12071d84"},
+ {file = "flatbuffers-22.10.26.tar.gz", hash = "sha256:8698aaa635ca8cf805c7d8414d4a4a8ecbffadca0325fa60551cb3ca78612356"},
]
furo = [
{file = "furo-2022.9.29-py3-none-any.whl", hash = "sha256:559ee17999c0f52728481dcf6b1b0cf8c9743e68c5e3a18cb45a7992747869a9"},
{file = "furo-2022.9.29.tar.gz", hash = "sha256:d4238145629c623609c2deb5384f8d036e2a1ee2a101d64b67b4348112470dbd"},
]
+huggingface-hub = [
+ {file = "huggingface_hub-0.10.1-py3-none-any.whl", hash = "sha256:dc3b0e9a663fe6cad6a8522055c02a9d8673dbd527223288e2442bc028c253db"},
+ {file = "huggingface_hub-0.10.1.tar.gz", hash = "sha256:5c188d5b16bec4b78449f8681f9975ff9d321c16046cc29bcf0d7e464ff29276"},
+]
+humanfriendly = [
+ {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"},
+ {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"},
+]
idna = [
{file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
{file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
@@ -1035,6 +1642,9 @@ iniconfig = [
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
]
+ipdb = [
+ {file = "ipdb-0.13.9.tar.gz", hash = "sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5"},
+]
ipykernel = [
{file = "ipykernel-6.16.2-py3-none-any.whl", hash = "sha256:67daf93e5b52456cd8eea87a8b59405d2bb80ae411864a1ea206c3631d8179af"},
{file = "ipykernel-6.16.2.tar.gz", hash = "sha256:463f3d87a92e99969b1605cb7a5b4d7b36b7145a0e72d06e65918a6ddefbe630"},
@@ -1051,13 +1661,13 @@ jedi = [
{file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"},
{file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"},
]
-jinja2 = [
+Jinja2 = [
{file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
{file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
]
jupyter-client = [
- {file = "jupyter_client-7.4.4-py3-none-any.whl", hash = "sha256:1c1d418ef32a45a1fae0b243e6f01cc9bf65fa8ddbd491a034b9ba6ac6502951"},
- {file = "jupyter_client-7.4.4.tar.gz", hash = "sha256:5616db609ac720422e6a4b893d6572b8d655ff41e058367f4459a0d2c0726832"},
+ {file = "jupyter_client-7.4.6-py3-none-any.whl", hash = "sha256:540b6a5c9c2dc481c5dd54fd5acb260f03dfaaa7c5325b2ffb1f676710f8c7c4"},
+ {file = "jupyter_client-7.4.6.tar.gz", hash = "sha256:f7f9a9dc3a0ecd223ed6a5a00cf4140a5c252ec72e52d6de370748ed0aa083dd"},
]
jupyter-console = [
{file = "jupyter_console-6.4.4-py3-none-any.whl", hash = "sha256:756df7f4f60c986e7bc0172e4493d3830a7e6e75c08750bbe59c0a5403ad6dee"},
@@ -1071,7 +1681,7 @@ jupyterlab-widgets = [
{file = "jupyterlab_widgets-3.0.3-py3-none-any.whl", hash = "sha256:6aa1bc0045470d54d76b9c0b7609a8f8f0087573bae25700a370c11f82cb38c8"},
{file = "jupyterlab_widgets-3.0.3.tar.gz", hash = "sha256:c767181399b4ca8b647befe2d913b1260f51bf9d8ef9b7a14632d4c1a7b536bd"},
]
-markupsafe = [
+MarkupSafe = [
{file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"},
{file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"},
{file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"},
@@ -1117,18 +1727,170 @@ matplotlib-inline = [
{file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"},
{file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"},
]
+mpmath = [
+ {file = "mpmath-1.2.1-py3-none-any.whl", hash = "sha256:604bc21bd22d2322a177c73bdb573994ef76e62edd595d17e00aff24b0667e5c"},
+ {file = "mpmath-1.2.1.tar.gz", hash = "sha256:79ffb45cf9f4b101a807595bcb3e72e0396202e0b1d25d689134b48c4216a81a"},
+]
+mypy-extensions = [
+ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
+ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
+]
nest-asyncio = [
{file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"},
{file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"},
]
+numpy = [
+ {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"},
+ {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"},
+ {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"},
+ {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"},
+ {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"},
+ {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"},
+ {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"},
+ {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"},
+ {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"},
+ {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"},
+ {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"},
+ {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"},
+ {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"},
+ {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"},
+ {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"},
+ {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"},
+ {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"},
+ {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"},
+ {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"},
+ {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"},
+ {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"},
+ {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"},
+ {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"},
+ {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"},
+ {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"},
+ {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"},
+ {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"},
+ {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"},
+]
+nvidia-cublas-cu11 = [
+ {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded"},
+ {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e"},
+]
+nvidia-cuda-nvrtc-cu11 = [
+ {file = "nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03"},
+ {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7"},
+ {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3"},
+]
+nvidia-cuda-runtime-cu11 = [
+ {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31"},
+ {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7"},
+]
+nvidia-cudnn-cu11 = [
+ {file = "nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7"},
+ {file = "nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108"},
+]
+onnx = [
+ {file = "onnx-1.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bdbd2578424c70836f4d0f9dda16c21868ddb07cc8192f9e8a176908b43d694b"},
+ {file = "onnx-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213e73610173f6b2e99f99a4b0636f80b379c417312079d603806e48ada4ca8b"},
+ {file = "onnx-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fd2f4e23078df197bb76a59b9cd8f5a43a6ad2edc035edb3ecfb9042093e05a"},
+ {file = "onnx-1.12.0-cp310-cp310-win32.whl", hash = "sha256:23781594bb8b7ee985de1005b3c601648d5b0568a81e01365c48f91d1f5648e4"},
+ {file = "onnx-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:81a3555fd67be2518bf86096299b48fb9154652596219890abfe90bd43a9ec13"},
+ {file = "onnx-1.12.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:5578b93dc6c918cec4dee7fb7d9dd3b09d338301ee64ca8b4f28bc217ed42dca"},
+ {file = "onnx-1.12.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c11162ffc487167da140f1112f49c4f82d815824f06e58bc3095407699f05863"},
+ {file = "onnx-1.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341c7016e23273e9ffa9b6e301eee95b8c37d0f04df7cedbdb169d2c39524c96"},
+ {file = "onnx-1.12.0-cp37-cp37m-win32.whl", hash = "sha256:3c6e6bcffc3f5c1e148df3837dc667fa4c51999788c1b76b0b8fbba607e02da8"},
+ {file = "onnx-1.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8a7aa61aea339bd28f310f4af4f52ce6c4b876386228760b16308efd58f95059"},
+ {file = "onnx-1.12.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:56ceb7e094c43882b723cfaa107d85ad673cfdf91faeb28d7dcadacca4f43a07"},
+ {file = "onnx-1.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3629e8258db15d4e2c9b7f1be91a3186719dd94661c218c6f5fde3cc7de3d4d"},
+ {file = "onnx-1.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d9a7db54e75529160337232282a4816cc50667dc7dc34be178fd6f6b79d4705"},
+ {file = "onnx-1.12.0-cp38-cp38-win32.whl", hash = "sha256:fea5156a03398fe0e23248042d8651c1eaac5f6637d4dd683b4c1f1320b9f7b4"},
+ {file = "onnx-1.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:f66d2996e65f490a57b3ae952e4e9189b53cc9fe3f75e601d50d4db2dc1b1cd9"},
+ {file = "onnx-1.12.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c39a7a0352c856f1df30dccf527eb6cb4909052e5eaf6fa2772a637324c526aa"},
+ {file = "onnx-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fab13feb4d94342aae6d357d480f2e47d41b9f4e584367542b21ca6defda9e0a"},
+ {file = "onnx-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7a9b3ea02c30efc1d2662337e280266aca491a8e86be0d8a657f874b7cccd1e"},
+ {file = "onnx-1.12.0-cp39-cp39-win32.whl", hash = "sha256:f8800f28c746ab06e51ef8449fd1215621f4ddba91be3ffc264658937d38a2af"},
+ {file = "onnx-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:af90427ca04c6b7b8107c2021e1273227a3ef1a7a01f3073039cae7855a59833"},
+ {file = "onnx-1.12.0.tar.gz", hash = "sha256:13b3e77d27523b9dbf4f30dfc9c959455859d5e34e921c44f712d69b8369eff9"},
+]
+onnxruntime = [
+ {file = "onnxruntime-1.12.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:98bb8920036b6ae1bc71af1bb061cd42297717a4b25c0ba521f3471ef946e4f2"},
+ {file = "onnxruntime-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:977e4388c773a14cf2f71c6f4ac4f039691ab3ac7ade4e13e7f019d752eaa053"},
+ {file = "onnxruntime-1.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4749a89d2f820ae5d80704a55fedd233fa54dd2adaecf4423435eb68207dace7"},
+ {file = "onnxruntime-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2715aa4d0bc03acf92c79df3d52e7435ea9da3ab2ed2208ad66534a51d2e5de9"},
+ {file = "onnxruntime-1.12.1-cp310-cp310-manylinux_2_27_x86_64.whl", hash = "sha256:84176d930aabbdc6ad93021cf416e58af6a88f1c43a5d921f0b02c82c0491cd1"},
+ {file = "onnxruntime-1.12.1-cp310-cp310-win32.whl", hash = "sha256:51a8777018e464b9ba8091c028c53c9f399d64a5994a9ff9f17e88969e62bbe2"},
+ {file = "onnxruntime-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:65bdbb27ea50f0f84c2039ea66e97363c6a31022965575bca8e5f220a40b0c5c"},
+ {file = "onnxruntime-1.12.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:3b24c6323e7ae328ede4f76ccf7eb014ce29493cca013edee453e2ff342499b3"},
+ {file = "onnxruntime-1.12.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25179f463e8f641f7f37963dd13e3561f64d0f733287f3e740352ccba440e9f7"},
+ {file = "onnxruntime-1.12.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa5e0653fb7e1a24bb73a378f208b8fd9a7b1622f89f26be093efd93a4fe4f25"},
+ {file = "onnxruntime-1.12.1-cp37-cp37m-manylinux_2_27_x86_64.whl", hash = "sha256:0a376399d21ea070a173c81aae0901012955afd0acc9e5574d7f22d54ceaff65"},
+ {file = "onnxruntime-1.12.1-cp37-cp37m-win32.whl", hash = "sha256:e987ca0206a6dda3d0b70bb3ebee3dc5ff9ea59c6caa7c6586ce5bac87a7f0e3"},
+ {file = "onnxruntime-1.12.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c79b15b9136e68eafc0badc88d306c6c794611857c2b573d9cd8ee1dfaf25619"},
+ {file = "onnxruntime-1.12.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:00b07118bfe8beb44d6028813f14f1bfe4bd7896ac49be3ad9d76102f11ba744"},
+ {file = "onnxruntime-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9bd0ab5b99ef0d34331fd871603a3fd5f375fb0518bfc5ca09ce48194a813dfa"},
+ {file = "onnxruntime-1.12.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef3e24a703fb4896bd0e360dfa4fadd6b2b57f64a05b040e01ab717c4e2d5a0c"},
+ {file = "onnxruntime-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92d28a7bd547290c0e47d60ca64c52b4976a9bd51622bd83be85bccce316f413"},
+ {file = "onnxruntime-1.12.1-cp38-cp38-manylinux_2_27_x86_64.whl", hash = "sha256:a5c4f5332083dd3815b78ddb16d4a0cf4907a59edd956bcfe53992b71b8feac1"},
+ {file = "onnxruntime-1.12.1-cp38-cp38-win32.whl", hash = "sha256:ff9da60be6c5800dcc10c52dd54aa07ab9a0d86c1e99649881bee9d9838031e0"},
+ {file = "onnxruntime-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:f0104e0e8327c8468d646941540af9397b737155dffe078da4bf36da95d1c21e"},
+ {file = "onnxruntime-1.12.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:64152aae1c6ffd74598775c775b86407df7c4aea01f418db672c0d9d86f641f6"},
+ {file = "onnxruntime-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c7caab808df8fa323e1cfaced9785cd068d54701f3bf78ae8733e702a053ff4"},
+ {file = "onnxruntime-1.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d9578da310f324eb7fb4014458a50f53e2cbe1eaa98a5ac521675ad7158ca21"},
+ {file = "onnxruntime-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee2f32e4427005c788ed0c081dc74846b7417600705610648cfe7062c2270e8"},
+ {file = "onnxruntime-1.12.1-cp39-cp39-manylinux_2_27_x86_64.whl", hash = "sha256:9c28b8c06df60f986693d35aecc33d9edd494db53ab7915bbe9830c20471d654"},
+ {file = "onnxruntime-1.12.1-cp39-cp39-win32.whl", hash = "sha256:a9954f6ffab4a0a3877a4800d817950a236a6db4901399eec1ea52033f52da94"},
+ {file = "onnxruntime-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:76bbd92cbcc5b6b0f893565f072e33f921ae3350a77b74fb7c65757e683516c7"},
+]
+openai = [
+ {file = "openai-0.23.1.tar.gz", hash = "sha256:16703a2433c1fc71b913057062d00b86dd2ad714dfd7b2b1ab803ac9b31fba5f"},
+]
+openpyxl = [
+ {file = "openpyxl-3.0.10-py2.py3-none-any.whl", hash = "sha256:0ab6d25d01799f97a9464630abacbb34aafecdcaa0ef3cba6d6b3499867d0355"},
+ {file = "openpyxl-3.0.10.tar.gz", hash = "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449"},
+]
+optimum = [
+ {file = "optimum-1.4.1.tar.gz", hash = "sha256:f10fdc4e1a9045a375ec78ffd66aad006458d96dbd378e8a5fe0ee997ee10903"},
+]
packaging = [
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
]
+pandas = [
+ {file = "pandas-1.3.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:62d5b5ce965bae78f12c1c0df0d387899dd4211ec0bdc52822373f13a3a022b9"},
+ {file = "pandas-1.3.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:adfeb11be2d54f275142c8ba9bf67acee771b7186a5745249c7d5a06c670136b"},
+ {file = "pandas-1.3.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:60a8c055d58873ad81cae290d974d13dd479b82cbb975c3e1fa2cf1920715296"},
+ {file = "pandas-1.3.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd541ab09e1f80a2a1760032d665f6e032d8e44055d602d65eeea6e6e85498cb"},
+ {file = "pandas-1.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2651d75b9a167cc8cc572cf787ab512d16e316ae00ba81874b560586fa1325e0"},
+ {file = "pandas-1.3.5-cp310-cp310-win_amd64.whl", hash = "sha256:aaf183a615ad790801fa3cf2fa450e5b6d23a54684fe386f7e3208f8b9bfbef6"},
+ {file = "pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:344295811e67f8200de2390093aeb3c8309f5648951b684d8db7eee7d1c81fb7"},
+ {file = "pandas-1.3.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:552020bf83b7f9033b57cbae65589c01e7ef1544416122da0c79140c93288f56"},
+ {file = "pandas-1.3.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cce0c6bbeb266b0e39e35176ee615ce3585233092f685b6a82362523e59e5b4"},
+ {file = "pandas-1.3.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d28a3c65463fd0d0ba8bbb7696b23073efee0510783340a44b08f5e96ffce0c"},
+ {file = "pandas-1.3.5-cp37-cp37m-win32.whl", hash = "sha256:a62949c626dd0ef7de11de34b44c6475db76995c2064e2d99c6498c3dba7fe58"},
+ {file = "pandas-1.3.5-cp37-cp37m-win_amd64.whl", hash = "sha256:8025750767e138320b15ca16d70d5cdc1886e8f9cc56652d89735c016cd8aea6"},
+ {file = "pandas-1.3.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fe95bae4e2d579812865db2212bb733144e34d0c6785c0685329e5b60fcb85dd"},
+ {file = "pandas-1.3.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f261553a1e9c65b7a310302b9dbac31cf0049a51695c14ebe04e4bfd4a96f02"},
+ {file = "pandas-1.3.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b6dbec5f3e6d5dc80dcfee250e0a2a652b3f28663492f7dab9a24416a48ac39"},
+ {file = "pandas-1.3.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3bc49af96cd6285030a64779de5b3688633a07eb75c124b0747134a63f4c05f"},
+ {file = "pandas-1.3.5-cp38-cp38-win32.whl", hash = "sha256:b6b87b2fb39e6383ca28e2829cddef1d9fc9e27e55ad91ca9c435572cdba51bf"},
+ {file = "pandas-1.3.5-cp38-cp38-win_amd64.whl", hash = "sha256:a395692046fd8ce1edb4c6295c35184ae0c2bbe787ecbe384251da609e27edcb"},
+ {file = "pandas-1.3.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd971a3f08b745a75a86c00b97f3007c2ea175951286cdda6abe543e687e5f2f"},
+ {file = "pandas-1.3.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37f06b59e5bc05711a518aa10beaec10942188dccb48918bb5ae602ccbc9f1a0"},
+ {file = "pandas-1.3.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c21778a688d3712d35710501f8001cdbf96eb70a7c587a3d5613573299fdca6"},
+ {file = "pandas-1.3.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3345343206546545bc26a05b4602b6a24385b5ec7c75cb6059599e3d56831da2"},
+ {file = "pandas-1.3.5-cp39-cp39-win32.whl", hash = "sha256:c69406a2808ba6cf580c2255bcf260b3f214d2664a3a4197d0e640f573b46fd3"},
+ {file = "pandas-1.3.5-cp39-cp39-win_amd64.whl", hash = "sha256:32e1a26d5ade11b547721a72f9bfc4bd113396947606e00d5b4a5b79b3dcb006"},
+ {file = "pandas-1.3.5.tar.gz", hash = "sha256:1e4285f5de1012de20ca46b188ccf33521bff61ba5c5ebd78b4fb28e5416a9f1"},
+]
+pandas-stubs = [
+ {file = "pandas-stubs-1.2.0.62.tar.gz", hash = "sha256:89c022dad41d28e26a1290eb1585db1042ccb09e6951220bb5c9146e2f795147"},
+ {file = "pandas_stubs-1.2.0.62-py3-none-any.whl", hash = "sha256:32a9e04582173104d42c090135efacc64d70e08c003405455b7dfb1540bd7e6c"},
+]
parso = [
{file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"},
{file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"},
]
+pathspec = [
+ {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"},
+ {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"},
+]
pbr = [
{file = "pbr-5.11.0-py2.py3-none-any.whl", hash = "sha256:db2317ff07c84c4c63648c9064a79fe9d9f5c7ce85a9099d4b6258b3db83225a"},
{file = "pbr-5.11.0.tar.gz", hash = "sha256:b97bc6695b2aff02144133c2e7399d5885223d42b7912ffaec2ca3898e673bfe"},
@@ -1141,6 +1903,10 @@ pickleshare = [
{file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"},
{file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"},
]
+platformdirs = [
+ {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"},
+ {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"},
+]
pluggy = [
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
@@ -1149,6 +1915,32 @@ prompt-toolkit = [
{file = "prompt_toolkit-3.0.32-py3-none-any.whl", hash = "sha256:24becda58d49ceac4dc26232eb179ef2b21f133fecda7eed6018d341766ed76e"},
{file = "prompt_toolkit-3.0.32.tar.gz", hash = "sha256:e7f2129cba4ff3b3656bbdda0e74ee00d2f874a8bcdb9dd16f5fec7b3e173cae"},
]
+protobuf = [
+ {file = "protobuf-3.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996"},
+ {file = "protobuf-3.20.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3"},
+ {file = "protobuf-3.20.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde"},
+ {file = "protobuf-3.20.1-cp310-cp310-win32.whl", hash = "sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c"},
+ {file = "protobuf-3.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7"},
+ {file = "protobuf-3.20.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153"},
+ {file = "protobuf-3.20.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f"},
+ {file = "protobuf-3.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20"},
+ {file = "protobuf-3.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531"},
+ {file = "protobuf-3.20.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e"},
+ {file = "protobuf-3.20.1-cp37-cp37m-win32.whl", hash = "sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c"},
+ {file = "protobuf-3.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067"},
+ {file = "protobuf-3.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf"},
+ {file = "protobuf-3.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab"},
+ {file = "protobuf-3.20.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c"},
+ {file = "protobuf-3.20.1-cp38-cp38-win32.whl", hash = "sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7"},
+ {file = "protobuf-3.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739"},
+ {file = "protobuf-3.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7"},
+ {file = "protobuf-3.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f"},
+ {file = "protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9"},
+ {file = "protobuf-3.20.1-cp39-cp39-win32.whl", hash = "sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8"},
+ {file = "protobuf-3.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91"},
+ {file = "protobuf-3.20.1-py2.py3-none-any.whl", hash = "sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388"},
+ {file = "protobuf-3.20.1.tar.gz", hash = "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9"},
+]
psutil = [
{file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"},
{file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"},
@@ -1177,7 +1969,7 @@ pycparser = [
{file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
{file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
]
-pygments = [
+Pygments = [
{file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"},
{file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"},
]
@@ -1185,6 +1977,13 @@ pyparsing = [
{file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
]
+pyreadline = [
+ {file = "pyreadline-2.1.zip", hash = "sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1"},
+]
+pyreadline3 = [
+ {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"},
+ {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"},
+]
pytest = [
{file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"},
{file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"},
@@ -1193,6 +1992,10 @@ python-dateutil = [
{file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
{file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
]
+python-dotenv = [
+ {file = "python-dotenv-0.21.0.tar.gz", hash = "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045"},
+ {file = "python_dotenv-0.21.0-py3-none-any.whl", hash = "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5"},
+]
pytz = [
{file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"},
{file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"},
@@ -1213,6 +2016,48 @@ pywin32 = [
{file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"},
{file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"},
]
+PyYAML = [
+ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+ {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+ {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+ {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+ {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
+ {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
+ {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
+ {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
+ {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+ {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+ {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+ {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+ {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+ {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+ {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+ {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+ {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+ {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+ {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+ {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
pyzmq = [
{file = "pyzmq-24.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:28b119ba97129d3001673a697b7cce47fe6de1f7255d104c2f01108a5179a066"},
{file = "pyzmq-24.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bcbebd369493d68162cddb74a9c1fcebd139dfbb7ddb23d8f8e43e6c87bac3a6"},
@@ -1289,9 +2134,138 @@ pyzmq = [
{file = "pyzmq-24.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:687700f8371643916a1d2c61f3fdaa630407dd205c38afff936545d7b7466066"},
{file = "pyzmq-24.0.1.tar.gz", hash = "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77"},
]
+regex = [
+ {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"},
+ {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"},
+ {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"},
+ {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"},
+ {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"},
+ {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"},
+ {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"},
+ {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"},
+ {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"},
+ {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"},
+ {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"},
+ {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"},
+ {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"},
+ {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"},
+ {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"},
+ {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"},
+ {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"},
+ {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"},
+ {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"},
+ {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"},
+ {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"},
+ {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"},
+ {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"},
+ {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"},
+ {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"},
+ {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"},
+ {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"},
+ {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"},
+ {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"},
+ {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"},
+ {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"},
+ {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"},
+ {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"},
+ {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"},
+ {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"},
+ {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"},
+ {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"},
+ {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"},
+ {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"},
+ {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"},
+ {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"},
+ {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"},
+ {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"},
+ {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"},
+ {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"},
+ {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"},
+ {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"},
+ {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"},
+ {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"},
+ {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"},
+ {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"},
+ {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"},
+ {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"},
+ {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"},
+ {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"},
+ {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"},
+ {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"},
+ {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"},
+ {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"},
+ {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"},
+ {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"},
+ {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"},
+ {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"},
+ {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"},
+ {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"},
+ {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"},
+ {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"},
+ {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"},
+ {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"},
+ {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"},
+ {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"},
+ {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"},
+ {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"},
+ {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"},
+ {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"},
+ {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"},
+ {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"},
+ {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"},
+ {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"},
+ {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"},
+ {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"},
+ {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"},
+ {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"},
+ {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"},
+ {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"},
+ {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"},
+ {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"},
+ {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"},
+]
requests = [
- {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"},
- {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"},
+ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"},
+ {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"},
+]
+sentencepiece = [
+ {file = "sentencepiece-0.1.97-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6f249c8f1852893be86eae66b19d522c5fb30bbad4fe2d1b07f06fdc86e1907e"},
+ {file = "sentencepiece-0.1.97-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09e1bc53178de70c557a9ba4fece07364b4416ce3d36570726b3372b68aea135"},
+ {file = "sentencepiece-0.1.97-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667193c57fb48b238be7e3d7636cfc8da56cb5bac5559d8f0b647334e1175be8"},
+ {file = "sentencepiece-0.1.97-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2780531985af79c6163f63d4f200fec8a28b70b6768d2c19f70d01568a4524e8"},
+ {file = "sentencepiece-0.1.97-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:205050670c53ef9015e2a98cce3934bfbcf0aafaa14caa0c618dd5667bc217ee"},
+ {file = "sentencepiece-0.1.97-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b183dadef8e8b6b4645c1c20692d7be0a13ecc3ec1a07b3885c8905516675f"},
+ {file = "sentencepiece-0.1.97-cp310-cp310-win32.whl", hash = "sha256:ee3c9dbd558d8d85bb1617087b86df6ea2b856a528669630ce6cedeb4353b823"},
+ {file = "sentencepiece-0.1.97-cp310-cp310-win_amd64.whl", hash = "sha256:f7dc55379e2f7dee86537180283db2e5f8418c6825fdd2fe436c724eb5604c05"},
+ {file = "sentencepiece-0.1.97-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ba1b4154f9144c5a7528b00aff5cffaa1a896a1c6ca53ca78b6e74cd2dae5244"},
+ {file = "sentencepiece-0.1.97-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac3d90aee5581e55d029d124ac11b6ae2fbae0817863b664b2f2302e966ababb"},
+ {file = "sentencepiece-0.1.97-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c27400f1ac46518a01c87cb7703650e4e48728649feb115d2e3f1102a946a42"},
+ {file = "sentencepiece-0.1.97-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6e12a166eba75994ca749aadc4a5056b91b31405f805d6de6e8914cc9741c60"},
+ {file = "sentencepiece-0.1.97-cp36-cp36m-win32.whl", hash = "sha256:ed85dff5c0a9b3dd1a414c7e1119f2a19e863fc3f81da525bf7f885ebc883de0"},
+ {file = "sentencepiece-0.1.97-cp36-cp36m-win_amd64.whl", hash = "sha256:91a19ab6f40ffbae6d6127119953d2c6a85e93d734953dbc8629fde0d21ace66"},
+ {file = "sentencepiece-0.1.97-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bae580e4a35a9314ff49561ac7c06574fe6afc71b821ed6bb00534e571458156"},
+ {file = "sentencepiece-0.1.97-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad7262e7530c683b186672b5dd0082f82719a50a500a8cfbc4bbd7cde5bff8c"},
+ {file = "sentencepiece-0.1.97-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:620cee35279720016735a7c7103cddbd9b84fe5e2f098bd5e673834d69fee2b8"},
+ {file = "sentencepiece-0.1.97-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93b921b59914c0ec6697e8c6d5e6b44d99d1298fb1a0af56980a79ade0540c19"},
+ {file = "sentencepiece-0.1.97-cp37-cp37m-win32.whl", hash = "sha256:9b9a4c44a31d5f47616e9568dcf31e029b0bfa776e0a252c0b59247881598b09"},
+ {file = "sentencepiece-0.1.97-cp37-cp37m-win_amd64.whl", hash = "sha256:f31533cdacced56219e239d3459a003ece35116920dd64b2309d4ad047b77644"},
+ {file = "sentencepiece-0.1.97-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d643c01d1cad13b9206a276bbe5bc1a468e3d7cf6a26bde7783f945277f859d"},
+ {file = "sentencepiece-0.1.97-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:542f1985b1ee279a92bef7740ec0781452372028ce01e15aa88df3228b197ba3"},
+ {file = "sentencepiece-0.1.97-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93701da21fea906dd244bf88cdbe640385a89c45d3c1812b76dbadf8782cdbcd"},
+ {file = "sentencepiece-0.1.97-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a51514047b964047b7fadb480d88a5e0f72c02f6ca1ba96258fbbc6e79274a94"},
+ {file = "sentencepiece-0.1.97-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ae2e9b7a5b6f2aa64ec9240b0c185dabe597d0e787dc4344acfbaef1ffe0b2"},
+ {file = "sentencepiece-0.1.97-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923ee4af16dbae1f2ab358ed09f8a0eb89e40a8198a8b343bf54181482342721"},
+ {file = "sentencepiece-0.1.97-cp38-cp38-win32.whl", hash = "sha256:fa6f2b88850b5fae3a05053658824cf9f147c8e3c3b40eb64539a976c83d8a24"},
+ {file = "sentencepiece-0.1.97-cp38-cp38-win_amd64.whl", hash = "sha256:5137ff0d0b1cc574751d178650ef800ff8d90bf21eb9f71e9567d4a0548940a5"},
+ {file = "sentencepiece-0.1.97-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f92876271a10494671431ad955bff2d6f8ea59baaf957f5ae5946aff56dfcb90"},
+ {file = "sentencepiece-0.1.97-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35c227b6d55e473033db7e0ecc51b1e99e6ed7607cc08602fb5768132543c81d"},
+ {file = "sentencepiece-0.1.97-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1706a8a8188f7b3d4b7922db9bb00c64c4e16ee68ab4caaae79f55b3e18748c7"},
+ {file = "sentencepiece-0.1.97-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce61efc1862ccb18856c4aabbd930e13d5bfbb4b09b4f111081ac53a9dc62275"},
+ {file = "sentencepiece-0.1.97-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a78c03800ef9f02d320e0159f5768b15357f3e9ebea545c9c4ba7928ba8ba254"},
+ {file = "sentencepiece-0.1.97-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753b8088fd685ee787d9f54c84275ab347de558c7c4ebc6accb4c35bf7776f20"},
+ {file = "sentencepiece-0.1.97-cp39-cp39-win32.whl", hash = "sha256:24306fd86031c17a1a6ae92671e76a350390a3140a65620bc2843dad7db24e2a"},
+ {file = "sentencepiece-0.1.97-cp39-cp39-win_amd64.whl", hash = "sha256:c6641d0b7acec61fde5881ea6ebe098c169557ac9aa3bdabdf124eab5a5592bb"},
+ {file = "sentencepiece-0.1.97.tar.gz", hash = "sha256:c901305e0a710bbcd296f66d79e96f744e6e175b29812bd5178318437d4e1f6c"},
]
setuptools = [
{file = "setuptools-65.5.1-py3-none-any.whl", hash = "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31"},
@@ -1309,7 +2283,7 @@ soupsieve = [
{file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"},
{file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"},
]
-sphinx = [
+Sphinx = [
{file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"},
{file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"},
]
@@ -1318,8 +2292,8 @@ sphinx-basic-ng = [
{file = "sphinx_basic_ng-1.0.0b1.tar.gz", hash = "sha256:89374bd3ccd9452a301786781e28c8718e99960f2d4f411845ea75fc7bb5a9b0"},
]
sphinx-copybutton = [
- {file = "sphinx-copybutton-0.5.0.tar.gz", hash = "sha256:a0c059daadd03c27ba750da534a92a63e7a36a7736dcf684f26ee346199787f6"},
- {file = "sphinx_copybutton-0.5.0-py3-none-any.whl", hash = "sha256:9684dec7434bd73f0eea58dda93f9bb879d24bff2d8b187b1f2ec08dfe7b5f48"},
+ {file = "sphinx-copybutton-0.5.1.tar.gz", hash = "sha256:366251e28a6f6041514bfb5439425210418d6c750e98d3a695b73e56866a677a"},
+ {file = "sphinx_copybutton-0.5.1-py3-none-any.whl", hash = "sha256:0842851b5955087a7ec7fc870b622cb168618ad408dee42692e9a5c97d071da8"},
]
sphinxcontrib-applehelp = [
{file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
@@ -1349,6 +2323,48 @@ sphinxcontrib-video = [
{file = "sphinxcontrib-video-0.0.1.dev3.tar.gz", hash = "sha256:dc866c65a39a5ce0ab4f5c4ca14cf4e463261f7a5f7bddf951cb168ce34463a3"},
{file = "sphinxcontrib_video-0.0.1.dev3-py2.py3-none-any.whl", hash = "sha256:fe319afdab7ee44f34397f1165fa5e2e9196217ea43cfa4fc41d0edb968f3c5a"},
]
+sympy = [
+ {file = "sympy-1.10.1-py3-none-any.whl", hash = "sha256:df75d738930f6fe9ebe7034e59d56698f29e85f443f743e51e47df0caccc2130"},
+ {file = "sympy-1.10.1.tar.gz", hash = "sha256:5939eeffdf9e152172601463626c022a2c27e75cf6278de8d401d50c9d58787b"},
+]
+tokenizers = [
+ {file = "tokenizers-0.13.2-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:a6f36b1b499233bb4443b5e57e20630c5e02fba61109632f5e00dab970440157"},
+ {file = "tokenizers-0.13.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:bc6983282ee74d638a4b6d149e5dadd8bc7ff1d0d6de663d69f099e0c6bddbeb"},
+ {file = "tokenizers-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16756e6ab264b162f99c0c0a8d3d521328f428b33374c5ee161c0ebec42bf3c0"},
+ {file = "tokenizers-0.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b10db6e4b036c78212c6763cb56411566edcf2668c910baa1939afd50095ce48"},
+ {file = "tokenizers-0.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:238e879d1a0f4fddc2ce5b2d00f219125df08f8532e5f1f2ba9ad42f02b7da59"},
+ {file = "tokenizers-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47ef745dbf9f49281e900e9e72915356d69de3a4e4d8a475bda26bfdb5047736"},
+ {file = "tokenizers-0.13.2-cp310-cp310-win32.whl", hash = "sha256:96cedf83864bcc15a3ffd088a6f81a8a8f55b8b188eabd7a7f2a4469477036df"},
+ {file = "tokenizers-0.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:eda77de40a0262690c666134baf19ec5c4f5b8bde213055911d9f5a718c506e1"},
+ {file = "tokenizers-0.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a689654fc745135cce4eea3b15e29c372c3e0b01717c6978b563de5c38af9811"},
+ {file = "tokenizers-0.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3606528c07cda0566cff6cbfbda2b167f923661be595feac95701ffcdcbdbb21"},
+ {file = "tokenizers-0.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:41291d0160946084cbd53c8ec3d029df3dc2af2673d46b25ff1a7f31a9d55d51"},
+ {file = "tokenizers-0.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7892325f9ca1cc5fca0333d5bfd96a19044ce9b092ce2df625652109a3de16b8"},
+ {file = "tokenizers-0.13.2-cp311-cp311-win32.whl", hash = "sha256:93714958d4ebe5362d3de7a6bd73dc86c36b5af5941ebef6c325ac900fa58865"},
+ {file = "tokenizers-0.13.2-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:da521bfa94df6a08a6254bb8214ea04854bb9044d61063ae2529361688b5440a"},
+ {file = "tokenizers-0.13.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a739d4d973d422e1073989769723f3b6ad8b11e59e635a63de99aea4b2208188"},
+ {file = "tokenizers-0.13.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cac01fc0b868e4d0a3aa7c5c53396da0a0a63136e81475d32fcf5c348fcb2866"},
+ {file = "tokenizers-0.13.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0901a5c6538d2d2dc752c6b4bde7dab170fddce559ec75662cfad03b3187c8f6"},
+ {file = "tokenizers-0.13.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ba9baa76b5a3eefa78b6cc351315a216232fd727ee5e3ce0f7c6885d9fb531b"},
+ {file = "tokenizers-0.13.2-cp37-cp37m-win32.whl", hash = "sha256:a537061ee18ba104b7f3daa735060c39db3a22c8a9595845c55b6c01d36c5e87"},
+ {file = "tokenizers-0.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c82fb87b1cbfa984d8f05b2b3c3c73e428b216c1d4f0e286d0a3b27f521b32eb"},
+ {file = "tokenizers-0.13.2-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:ce298605a833ac7f81b8062d3102a42dcd9fa890493e8f756112c346339fe5c5"},
+ {file = "tokenizers-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a51b93932daba12ed07060935978a6779593a59709deab04a0d10e6fd5c29e60"},
+ {file = "tokenizers-0.13.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6969e5ea7ccb909ce7d6d4dfd009115dc72799b0362a2ea353267168667408c4"},
+ {file = "tokenizers-0.13.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92f040c4d938ea64683526b45dfc81c580e3b35aaebe847e7eec374961231734"},
+ {file = "tokenizers-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3bc9f7d7f4c1aa84bb6b8d642a60272c8a2c987669e9bb0ac26daf0c6a9fc8"},
+ {file = "tokenizers-0.13.2-cp38-cp38-win32.whl", hash = "sha256:efbf189fb9cf29bd29e98c0437bdb9809f9de686a1e6c10e0b954410e9ca2142"},
+ {file = "tokenizers-0.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b4cb2c60c094f31ea652f6cf9f349aae815f9243b860610c29a69ed0d7a88f8"},
+ {file = "tokenizers-0.13.2-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:b47d6212e7dd05784d7330b3b1e5a170809fa30e2b333ca5c93fba1463dec2b7"},
+ {file = "tokenizers-0.13.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:80a57501b61ec4f94fb7ce109e2b4a1a090352618efde87253b4ede6d458b605"},
+ {file = "tokenizers-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61507a9953f6e7dc3c972cbc57ba94c80c8f7f686fbc0876afe70ea2b8cc8b04"},
+ {file = "tokenizers-0.13.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c09f4fa620e879debdd1ec299bb81e3c961fd8f64f0e460e64df0818d29d845c"},
+ {file = "tokenizers-0.13.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:66c892d85385b202893ac6bc47b13390909e205280e5df89a41086cfec76fedb"},
+ {file = "tokenizers-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e306b0941ad35087ae7083919a5c410a6b672be0343609d79a1171a364ce79"},
+ {file = "tokenizers-0.13.2-cp39-cp39-win32.whl", hash = "sha256:79189e7f706c74dbc6b753450757af172240916d6a12ed4526af5cc6d3ceca26"},
+ {file = "tokenizers-0.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:486d637b413fddada845a10a45c74825d73d3725da42ccd8796ccd7a1c07a024"},
+ {file = "tokenizers-0.13.2.tar.gz", hash = "sha256:f9525375582fd1912ac3caa2f727d36c86ff8c0c6de45ae1aaff90f87f33b907"},
+]
toml = [
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
@@ -1357,6 +2373,29 @@ tomli = [
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
]
+torch = [
+ {file = "torch-1.13.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:f68edfea71ade3862039ba66bcedf954190a2db03b0c41a9b79afd72210abd97"},
+ {file = "torch-1.13.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d2d2753519415d154de4d3e64d2eaaeefdba6b6fd7d69d5ffaef595988117700"},
+ {file = "torch-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c227c16626e4ce766cca5351cc62a2358a11e8e466410a298487b9dff159eb1"},
+ {file = "torch-1.13.0-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:49a949b8136b32b2ec0724cbf4c6678b54e974b7d68f19f1231eea21cde5c23b"},
+ {file = "torch-1.13.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:0fdd38c96230947b1ed870fed4a560252f8d23c3a2bf4dab9d2d42b18f2e67c8"},
+ {file = "torch-1.13.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:43db0723fc66ad6486f86dc4890c497937f7cd27429f28f73fb7e4d74b7482e2"},
+ {file = "torch-1.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e643ac8d086706e82f77b5d4dfcf145a9dd37b69e03e64177fc23821754d2ed7"},
+ {file = "torch-1.13.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:bb33a911460475d1594a8c8cb73f58c08293211760796d99cae8c2509b86d7f1"},
+ {file = "torch-1.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:220325d0f4e69ee9edf00c04208244ef7cf22ebce083815ce272c7491f0603f5"},
+ {file = "torch-1.13.0-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:cd1e67db6575e1b173a626077a54e4911133178557aac50683db03a34e2b636a"},
+ {file = "torch-1.13.0-cp37-none-macosx_11_0_arm64.whl", hash = "sha256:9197ec216833b836b67e4d68e513d31fb38d9789d7cd998a08fba5b499c38454"},
+ {file = "torch-1.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fa768432ce4b8ffa29184c79a3376ab3de4a57b302cdf3c026a6be4c5a8ab75b"},
+ {file = "torch-1.13.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:635dbb99d981a6483ca533b3dc7be18ef08dd9e1e96fb0bb0e6a99d79e85a130"},
+ {file = "torch-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:857c7d5b1624c5fd979f66d2b074765733dba3f5e1cc97b7d6909155a2aae3ce"},
+ {file = "torch-1.13.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:ef934a21da6f6a516d0a9c712a80d09c56128abdc6af8dc151bee5199b4c3b4e"},
+ {file = "torch-1.13.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:f01a9ae0d4b69d2fc4145e8beab45b7877342dddbd4838a7d3c11ca7f6680745"},
+ {file = "torch-1.13.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:9ac382cedaf2f70afea41380ad8e7c06acef6b5b7e2aef3971cdad666ca6e185"},
+ {file = "torch-1.13.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e20df14d874b024851c58e8bb3846249cb120e677f7463f60c986e3661f88680"},
+ {file = "torch-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:4a378f5091307381abfb30eb821174e12986f39b1cf7c4522bf99155256819eb"},
+ {file = "torch-1.13.0-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:922a4910613b310fbeb87707f00cb76fec328eb60cc1349ed2173e7c9b6edcd8"},
+ {file = "torch-1.13.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:47fe6228386bff6d74319a2ffe9d4ed943e6e85473d78e80502518c607d644d2"},
+]
tornado = [
{file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"},
{file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"},
@@ -1370,22 +2409,60 @@ tornado = [
{file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"},
{file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"},
]
+tqdm = [
+ {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"},
+ {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"},
+]
traitlets = [
{file = "traitlets-5.5.0-py3-none-any.whl", hash = "sha256:1201b2c9f76097195989cdf7f65db9897593b0dfd69e4ac96016661bb6f0d30f"},
{file = "traitlets-5.5.0.tar.gz", hash = "sha256:b122f9ff2f2f6c1709dab289a05555be011c87828e911c0cf4074b85cb780a79"},
]
+transformers = [
+ {file = "transformers-4.24.0-py3-none-any.whl", hash = "sha256:b7ab50039ef9bf817eff14ab974f306fd20a72350bdc9df3a858fd009419322e"},
+ {file = "transformers-4.24.0.tar.gz", hash = "sha256:486f353a8e594002e48be0e2aba723d96eda839e63bfe274702a4b5eda85559b"},
+]
+typed-ast = [
+ {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"},
+ {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"},
+ {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"},
+ {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"},
+ {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"},
+ {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"},
+ {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"},
+ {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"},
+ {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"},
+ {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"},
+ {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"},
+ {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"},
+ {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"},
+ {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"},
+ {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"},
+ {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"},
+ {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"},
+ {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"},
+ {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"},
+ {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"},
+ {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"},
+ {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"},
+ {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"},
+ {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"},
+]
typing-extensions = [
{file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"},
{file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"},
]
urllib3 = [
- {file = "urllib3-1.22-py2.py3-none-any.whl", hash = "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b"},
- {file = "urllib3-1.22.tar.gz", hash = "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"},
+ {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"},
+ {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"},
]
wcwidth = [
{file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
{file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
]
+wheel = [
+ {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"},
+ {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"},
+]
widgetsnbextension = [
{file = "widgetsnbextension-4.0.3-py3-none-any.whl", hash = "sha256:7f3b0de8fda692d31ef03743b598620e31c2668b835edbd3962d080ccecf31eb"},
{file = "widgetsnbextension-4.0.3.tar.gz", hash = "sha256:34824864c062b0b3030ad78210db5ae6a3960dfb61d5b27562d6631774de0286"},
diff --git a/pyproject.toml b/pyproject.toml
index b5ca7bb..cc4e931 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "icortex"
-version = "0.1.2"
+version = "0.1.3"
description = "Jupyter kernel that can generate Python code from natural language prompts"
authors = ["TextCortex Team "]
license = "Apache"
@@ -44,11 +44,12 @@ classifiers = [
icortex = "icortex.cli:main"
[tool.poetry.dependencies]
-python = ">=3.7"
+python = ">=3.7.1,<4"
toml = "^0.10.2"
-requests = ">=2.0.0"
importlib-metadata = ">=4.0.0"
# ipykernel = "^5.5.5"
+requests = "^2.28.1"
+urllib3 = "^1.26.12"
ipykernel = "^6.16.0"
ipython = ">=7.0.0"
entrypoints = "^0.4"
@@ -58,16 +59,17 @@ jupyter-console = "^6.4.4"
jupyter-core = "^4.11.1"
jupyterlab-widgets = "^3.0.3"
Pygments = "^2.13.0"
+openai = { version = "^0.23.1", optional = true }
+onnxruntime = { version = "^1.12.1", optional = true }
+onnx = { version = "^1.12.0", optional = true }
+optimum = { version = "^1.4.0", optional = true }
+transformers = { version = "^4.23.1", optional = true }
+torch = { version = "^1.12.1", optional = true }
+black = "^22.10.0"
[tool.poetry.extras]
-openai = ["openai==^0.23.1"]
-huggingface = [
- "onnxruntime==^1.12.1",
- "onnx==^1.12.0",
- "optimum==^1.4.0",
- "transformers==^4.23.1",
- "torch==^1.12.1",
-]
+openai = ["openai"]
+huggingface = ["onnxruntime", "onnx", "optimum", "transformers", "torch"]
[tool.poetry.group.dev.dependencies]
Sphinx = "^5.3.0"
@@ -75,6 +77,8 @@ sphinxcontrib-video = "^0.0.1.dev3"
sphinx-copybutton = "^0.5.0"
furo = "^2022.9.29"
pytest = "^7.1.3"
+python-dotenv = "^0.21.0"
+ipdb = "^0.13.9"
[build-system]
requires = ["poetry-core"]
diff --git a/tests/test_parser.py b/tests/test_parser.py
new file mode 100644
index 0000000..ccd2921
--- /dev/null
+++ b/tests/test_parser.py
@@ -0,0 +1,66 @@
+from icortex.parser import extract_prompt, lex_prompt
+
+
+def test_extract_prompt():
+ assert extract_prompt("no flags in this")[0] == "no flags in this"
+ assert (
+ extract_prompt("this one hasn't a single quote")[0]
+ == "this one hasn't a single quote"
+ )
+ assert (
+ extract_prompt("this one hasn't a single quote and a --flag")[0]
+ == "this one hasn't a single quote and a"
+ )
+ assert (
+ extract_prompt('"this one hasn\'t a single quote and a --flag"')[0]
+ == "this one hasn't a single quote and a --flag"
+ )
+ assert extract_prompt(
+ '"this one hasn\'t a single quote and a --flag" --flag-outside'
+ ) == ("this one hasn't a single quote and a --flag", "--flag-outside")
+
+ assert extract_prompt("before before -a after after")[0] == "before before"
+ assert extract_prompt("before before --long after after")[0] == "before before"
+ assert (
+ extract_prompt("'before before -a after' after")[0] == "before before -a after"
+ )
+ assert (
+ extract_prompt('"before before -a after" after -e after')[0]
+ == "before before -a after"
+ )
+
+
+def test_lex_prompt():
+ assert lex_prompt("no flags in this") == ["no flags in this"]
+ assert lex_prompt("this one hasn't a single quote") == [
+ "this one hasn't a single quote"
+ ]
+ assert lex_prompt(
+ "this one hasn't a single quote and a --flag 123 --another-flag"
+ ) == ["this one hasn't a single quote and a", "--flag", "123", "--another-flag"]
+ assert lex_prompt(
+ '"this one hasn\'t a single quote and a --flag" --flag-outside'
+ ) == ["this one hasn't a single quote and a --flag", "--flag-outside"]
+
+ assert lex_prompt("before before -a after after") == [
+ "before before",
+ "-a",
+ "after",
+ "after",
+ ]
+ assert lex_prompt("before before --long after after") == [
+ "before before",
+ "--long",
+ "after",
+ "after",
+ ]
+ assert lex_prompt("'before before -a after' after") == [
+ "before before -a after",
+ "after",
+ ]
+ assert lex_prompt('"before before -a after" after -e after') == [
+ "before before -a after",
+ "after",
+ "-e",
+ "after",
+ ]
From 487f69a12c6733d2d35da19fa9f282d8defe2cc0 Mon Sep 17 00:00:00 2001
From: Onur Solmaz
Date: Sun, 20 Nov 2022 22:19:41 +0100
Subject: [PATCH 2/2] Update README, docs (#34)
* Updated README
* Minor
* Minor
---
README.md | 32 +++++++++++---------------------
docs/source/index.rst | 6 +-----
2 files changed, 12 insertions(+), 26 deletions(-)
diff --git a/README.md b/README.md
index d479ac2..733bfb8 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
- A Python library for soft-code development — program in plain English with AI code generation!
+ A no-code development framework — Let AI do the coding for you 🦾
@@ -19,31 +19,19 @@ tl;dr in goes English, out comes Python:
https://user-images.githubusercontent.com/2453968/199964302-0dbe1d7d-81c9-4244-a9f2-9d959775e471.mp4
-ICortex enables you to develop **soft programs**:
+ICortex is a no-code development framework that lets you to develop Python programs using plain English. Simply create a recipe that breaks down step-by-step what you want to do in plain English. Our code generating AI will follow your instructions and develop a Python program that suits your needs.
-> *Soft program:* a set of instructions (i.e. prompts) [written in natural language](https://en.wikipedia.org/wiki/Natural-language_programming) (e.g. English), processed by a language model that generates code at a lower layer of abstraction (e.g. Python), to perform work more flexibly than regular software.
+[Create a TextCortex account](https://app.textcortex.com/user/signup?registration_source=icortex) to receive free starter credits and start using ICortex.
-In other words, ICortex is a **natural language programming** (NLP) framework that enables you to write code in English, and then run it in Python. It aims to make programming more accessible to non-programmers.
+## Try it out
-ICortex is designed to be …
+[](https://mybinder.org/v2/gh/textcortex/icortex-binder/HEAD?filepath=basic_example.ipynb)
-- a drop-in replacement for the [IPython kernel](https://ipython.org/). Prompts are executed via [magic commands](https://ipython.readthedocs.io/en/stable/interactive/magics.html) such as `%prompt`.
-- interactive—automatically install missing packages, decide whether to execute the generated code or not, and so on, directly in the Jupyter Notebook cell.
-- open source and fully extensible—ICortex introduces a [domain-specific language](https://en.wikipedia.org/wiki/Domain-specific_language) for orchestrating various code generation services. If you think we are missing a model or an API, you can request it by creating an issue, or implement it yourself by subclassing `ServiceBase` under [`icortex/services`](icortex/services).
+You can try out ICortex directly in your browser. Launch a Binder instance by clicking [here](https://mybinder.org/v2/gh/textcortex/icortex-binder/HEAD?filepath=basic_example.ipynb), and follow the [instructions in our docs](https://docs.icortex.ai/en/latest/quickstart.html#using-icortex) to get started.
-ICortex is similar to [Github Copilot](https://github.com/features/copilot) but with certain differences that make it stand out:
+Alternatively, you can use ICortex in Google Colab if you have an account. See [below](#on-google-colab).
-| Feature | GitHub Copilot | ICortex |
-|---|:---:|:---:|
-| Generates code ... | In the text editor | At runtime through a [Jupyter kernel](https://docs.jupyter.org/en/latest/projects/kernels.html) |
-| Control over code generation context ... | No | Yes |
-| Natural language instructions are a ... | Second-class citizen (Code comes first) | First-class citizen (Prompts *are* the program) |
-| The resulting program is ... | Static | Dynamic—adapts to the context |
-| Can connect to different code generation APIs | No | Yes |
-
-The main difference between ICortex and a code-generation plugin like GitHub Copilot is that ICortex is a new paradigm for [Natural Language Programming](https://en.wikipedia.org/wiki/Natural-language_programming) where the *prompt* is the first-class citizen. GitHub Copilot, on the other hand, enhances the existing paradigm that are already used by developers.
-
-ICortex is currently in alpha, so expect breaking changes. We are giving free credits to our first users—[join our Discord](https://discord.textcortex.com/) to request more if you finish the starter credits.
+[Check out the documentation](https://docs.icortex.ai/) to learn more. [Join our Discord](https://discord.textcortex.com/) to get help.
## Installation
@@ -66,9 +54,11 @@ python -m icortex.kernel.install
import icortex.init
```
+Note that the package needs to be installed to every new Google Colab runtime—you may need to reinstall if it ever gets disconnected.
+
## Quickstart
-[Click here to visit the docs and get started using ICortex](https://icortex.readthedocs.io/en/latest/quickstart.html).
+[Click here to get started using ICortex](https://icortex.readthedocs.io/en/latest/quickstart.html).
## Getting help
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 5f6d820..2d04c1c 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -13,11 +13,7 @@ tl;dr in goes English, out comes Python:
.. video:: https://user-images.githubusercontent.com/2453968/199964302-0dbe1d7d-81c9-4244-a9f2-9d959775e471.mp4
:width: 100%
-ICortex enables you to develop **soft programs**:
-
- *Soft program:* a set of instructions (i.e. prompts) `written in natural language `__ (e.g. English), processed by a language model that generates code at a lower layer of abstraction (e.g. Python), to perform work more flexibly than regular software.
-
-In other words, ICortex is a **natural language programming** (NLP) framework that enables you to write code in English, and then run it in Python. It aims to make programming more accessible to non-programmers.
+ICortex is a no-code development framework that lets you to develop Python programs using plain English. Simply create a recipe that breaks down step-by-step what you want to do in plain English. Our code generating AI will follow your instructions and develop a Python program that suits your needs.
ICortex is designed to be …