diff --git a/services/inference/.env.example b/.env.example similarity index 100% rename from services/inference/.env.example rename to .env.example diff --git a/.github/workflows/dockerize.yaml b/.github/workflows/dockerize.yaml new file mode 100644 index 0000000..e9c5ed5 --- /dev/null +++ b/.github/workflows/dockerize.yaml @@ -0,0 +1,44 @@ +name: Build and push Docker images + +on: + push: + branches: main + +jobs: + build-and-push-worker-image: + name: Push Docker image to Docker Hub + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Manipulate tag for docker + id: branch_name + run: | + SOURCE_TAG=${GITHUB_REF#refs/tags/} + echo Source Tag: $SOURCE_TAG + + VERSION_TAG=${SOURCE_TAG#@openfn/apollo} + echo Version Tag: $VERSION_TAG + + DOCKER_TAG=${VERSION_TAG#@} + echo Docker Tag: $DOCKER_TAG + + echo "DOCKER_TAG=$DOCKER_TAG" >> $GITHUB_ENV + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + target: apollo + tags: | + openfn/apollo:latest + openfn/apollo:v${{ env.DOCKER_TAG }} diff --git a/.gitignore b/.gitignore index 9e6b8ba..2935142 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,12 @@ .vscode/ # Poetry specific files and directories -poetry.lock .poetry/ __pypackages__/ +.venv + +# node.js stuff +node_modules/ # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 80d9bfe..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,27 +0,0 @@ -repos: -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v3.2.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-added-large-files - -- repo: https://github.com/psf/black - rev: 23.9.1 - hooks: - - id: black - name: black - args: - - "--config" - - "./pyproject.toml" - # It is recommended to specify the latest version of Python - # supported by your project here, or alternatively use - # pre-commit's default_language_version, see - # https://pre-commit.com/#top_level-default_language_version - language_version: python3.9 - -- repo: https://github.com/charliermarsh/ruff-pre-commit - rev: 'v0.0.261' - hooks: - - id: ruff diff --git a/CHANGES.md b/CHANGES.md deleted file mode 100644 index 261c9ae..0000000 --- a/CHANGES.md +++ /dev/null @@ -1,303 +0,0 @@ -// A place to paste each output iteration of the "implementation" step here. - -// Paste the output of the "signature" step here. - -// Latest -/** - * Retrieves a list of breeds and includes it in the state data. - * Sends a GET request to the /breeds endpoint. - * @parameter callback {Function} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from the endpoint - * @returns A function that updates the state with the retrieved list of breeds. - */ -declare function getBreeds(callback: (fn: (inState: State) => State)): (outState: State) => State; -type Breed = { breed: string; country: string; origin: string; coat: string; pattern: string; }; -type C = { url: string; } -type State = { configuration: C; data: Breed[]; }; - - - -/** - * Retrieves a list of breeds and includes it in the state data. - * Sends a GET request to the /breeds endpoint. - * @parameter callback {Function} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from the endpoint - * @returns A function that updates the state with the retrieved list of breeds. - */ -declare function getBreeds(callback: (fn: (inState: State) => State)): (outState: State) => State; -type Breed = { breed: string; country: string; origin: string; coat: string; pattern: string; }; -type C = { url: string; } -type State = { configuration: C; data: Breed[]; }; - - - -// Output 1 -declare function GetRandomCat(callback: (fn: (state: State) => State)): (state: State) => State; -type Cat = { name: string; age: number; }; -type State = { configuration: { [key: string]: any }; cat: Cat; }; - -// Output 2 -/* Retrieves a random cat and includes it in the state data. -* Sends a GET request to the /cat endpoint of Cat. -* @parameter callback {Function} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from Cat -* @returns A function that updates the state with the retrieved cat. -*/ -declare function GetRandomCat(callback: (fn: (inState: State) => State)): (outState: State) => State; -type Cat = { name: string; age: number; }; - -type State = { configuration: C; data: D; }; - - -// Signature latest -/** - * Retrieves a random cat and includes it in the state data. - * Sends a GET request to the /cat endpoint of Cat. - * @parameter callback {Function} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from Cat - * @returns A function that updates the state with the retrieved cat. - */ -declare function GetRandomCat(callback: (fn: (inState: State) => State)): (outState: State) => State; -type Cat = { name: string; age: number; }; - -type State = { configuration: C; data: Cat; }; - - - - - -// Latest -import { http } from "@openfn/language-common"; - -/** - * Retrieves a list of breeds and includes it in the state data. - * Sends a GET request to the /breeds endpoint. - * @parameter callback {Function} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from the endpoint - * @returns A function that updates the state with the retrieved list of breeds. - */ -export const getBreeds = async (callback: (fn: (inState: State) => State)): Promise<(outState: State) => State> => { - return async (outState: State): Promise => { - const { url } = outState.configuration; - const response = await http.get(`${url}/breeds`); - const data = await response.json(); - const newState = { ...outState, data }; - return callback(newState); - }; -}; - - -// Embeds parameters like url into State.configuration -/** - * Retrieves a list of breeds and includes it in the state data. - * Sends a GET request to the /breeds endpoint. - * @parameter callback {Function} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from the endpoint - * @returns A function that updates the state with the retrieved list of breeds. - */ -import { http } from "@openfn/language-common"; - -async function getBreeds(callback: (fn: (inState: State) => State)): Promise<(outState: State) => State> { - return async (outState: State): Promise => { - const { url } = outState.configuration; - const response = await http.get(`${url}/breeds`); - const data = response.data as Breed[]; - const newState = { ...outState, data }; - return callback(newState); - }; -} - -// V1 -// - Uses any Http lib, no OpenFn Fn requirements - -// const GetCatBreeds = (callback: (fn: (inState: State) => State) => (outState: State) => { -// const request = new XMLHttpRequest(); -// request.open('GET', '/breeds', true); -// request.onload = () => { -// if (request.status >= 200 && request.status < 400) { -// const breeds: Breed[] = JSON.parse(request.responseText); -// const newState: State = { -// configuration: outState.configuration, -// data: breeds -// }; -// const updatedState = callback(newState); -// return updatedState; -// } else { -// console.error('Error retrieving breeds'); -// } -// }; -// request.send(); -// }; - - -// V2 -// - Uses fetch - -// function GetCatBreeds(callback: (fn: (inState: State) => State)): (outState: State) => State { -// return (outState: State) => { -// fetch('/breeds') -// .then(response => response.json()) -// .then(data => { -// const newState: State = { -// configuration: outState.configuration, -// data: data -// }; -// return callback(newState); -// }); -// }; -// } - - -// V3 -// - uses await -// const GetCatBreeds = async (callback: (fn: (inState: State) => State) => (outState: State) => State) => { -// const response = await fetch('/breeds'); -// const data = await response.json(); -// const newState = { ...state, data: data }; -// return callback(newState); -// }; - - -// V4 -// - uses fns from common, uses expandReference (likely incorrect) - -// const GetCatBreeds = async (callback: (fn: (inState: State) => State) => (outState: State) => State) => { -// const response = await http.get('/breeds'); -// const breeds = await expandReferences(response.data); -// const newState = { ...state, data: breeds }; -// return callback(newState); -// }; - - -// V5 -// - mostly code reformatting -// const GetCatBreeds = async (callback: (fn: (inState: State) => State) => (outState: State) => State) => { -// const response = await http.get('/breeds'); -// const data = response.data; -// const newState = { ...state, data: data }; -// return callback(newState); -// }; - -// V6 -// - Adds url to State.configuration, header comments added - -// const GetCatBreeds = async (callback: (fn: (inState: State) => State) => (outState: State) => State) => { -// /** -// * Retrieves a list of breeds and includes it in the state data. -// * Sends a GET request to the /breeds endpoint. -// * @parameter callback {{Function}} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from Cat -// * @returns A function that updates the state with the retrieved list of breeds. -// */ -// return async (state: State): Promise => { -// const { configuration } = state; -// const { url } = configuration; -// const response = await http.get(`${url}/breeds`); -// const data = response.data as Breed[]; -// const newState = { ...state, data }; -// return callback(newState); -// }; -// }; - - -// V7 -// - Moved comments to top -// /** -// * Retrieves a list of breeds and includes it in the state data. -// * Sends a GET request to the /breeds endpoint. -// * @parameter callback {{Function}} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from Cat -// * @returns A function that updates the state with the retrieved list of breeds. -// */ -// import { http } from "@openfn/language-common"; - -// declare type Breed = { breed: string; country: string; origin: string; coat: string; pattern: string; }; - -// type State = { configuration: C; data: Breed[]; }; - -// async function GetCatBreeds(callback: (fn: (inState: State) => State)): Promise<(outState: State) => State> { -// return async (state: State): Promise => { -// const { data } = await http.get("/breeds"); -// const newState = { ...state, data }; -// return callback(newState); -// }; -// } - -// V8 -// - Function name matches camelCase convention - -// /** -// * Retrieves a list of breeds and includes it in the state data. -// * Sends a GET request to the /breeds endpoint. -// * @parameter callback {{Function}} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from Cat -// * @returns A function that updates the state with the retrieved list of breeds. -// */ -// async function getCatBreeds(callback: (fn: (inState: State) => State)): Promise<(outState: State) => State> { -// return async (outState: State): Promise => { -// const response = await http.get('/breeds'); -// const data = response.data as Breed[]; -// const newState = { ...outState, data }; -// return callback(newState); -// }; -// } - - -// V9 -// Adds imports - -// import http from "@openfn/language-common"; - -// /** -// * Retrieves a list of breeds and includes it in the state data. -// * Sends a GET request to the /breeds endpoint. -// * @parameter callback {{Function}} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from Cat -// * @returns A function that updates the state with the retrieved list of breeds. -// */ -// async function GetCatBreeds(callback: (fn: (inState: State) => State)): Promise<(outState: State) => State> { -// return async (outState: State): Promise => { -// const response = await http.get("/breeds"); -// const breeds = response.data as Breed[]; -// const newState = { -// ...outState, -// data: breeds -// }; -// return callback(newState); -// }; -// } - -// type Breed = { breed: string; country: string; origin: string; coat: string; pattern: string; }; - - -// V10 -// Embeds parameters like url into State.configuration -// /** -// * Retrieves a list of breeds and includes it in the state data. -// * Sends a GET request to the /breeds endpoint. -// * @parameter callback {Function} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from the endpoint -// * @returns A function that updates the state with the retrieved list of breeds. -// */ -// import { http } from "@openfn/language-common"; - -// async function getBreeds(callback: (fn: (inState: State) => State)): Promise<(outState: State) => State> { -// return async (outState: State): Promise => { -// const { url } = outState.configuration; -// const response = await http.get(`${url}/breeds`); -// const data = response.data as Breed[]; -// const newState = { ...outState, data }; -// return callback(newState); -// }; -// } - - -// V11 -// - JS instead of TS - -// /** -// * Retrieves a list of breeds and includes it in the state data. -// * Sends a GET request to the /breeds endpoint. -// * @parameter callback {Function} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from the endpoint -// * @returns A function that updates the state with the retrieved list of breeds. -// */ -// import { http } from "@openfn/language-common"; - -// const getBreeds = async (callback: (fn: (inState: State) => State)): (outState: State) => State => { -// return async (outState: State): Promise => { -// const { baseUrl } = outState.configuration; -// const response = await http.get(`${baseUrl}/breeds`); -// const data = response.data as Breed[]; -// const newState = { ...outState, data: data }; -// return callback(newState); -// }; -// }; diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..3148ec9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,145 @@ +# Contributing + +Want to contribute to OpenFn Apollo? Read on. + +For technical details about the server architecture (including how the JS server +calls python modules), see the main readme. + +## Adding a Python Module + +Your python service can be your own little world inside Apollo. We give you a +subfolder and couple of conventions to stick to, and that's it. + +Any subfolder not starting with `_` in the `services` folder will be +automatically mounted at + +``` +/services/ +``` + +You need a `.py` file in the root folder with a `main()` function. +This will be called by the web server when someone makes a post request to your +endpoint, passing the JSON payload as a dict. + +The main function will be called by the server and should return a JSON payload, +which will be appended to the response body and sent back to the client via +HTTP. + +Inside your module folder, you can use whatever structure you like. Run +`poetry add ` to add dependencies (they'll be installed at the root +level `pyproject.toml`). + +**You should use relative paths to import py files in the same service, or +absolute module names (relative to `/services/`) to import from other +services.** + +ie, from `services/example/example.py`, to load `services/example/util.py`, do: + +```python +from .util import my_function +``` + +To load from a different module (like `inference`), do: + +```python +from inference import inference + +inference.generate('gpt3', 'do the thing') +``` + +The Javascript bridge will always call into `entry.py` and dynamically invoke +your service's main function, so technically speaking all imports are relative +to `entry.py`. + +## Documentation + +All modules should come with basic documentation. + +Include a `README.md` (case sensitive) with your repo which explains basic +usage. + +The readme will be displayed from the server root as documentation for users, +with the first text paragraph used as a summary. + +For example best practice, see `services/adaptor_gen` + +## Calling python Directly + +Debugging through the web server can be hard because error messages are pretty +terse. + +You can call straight into your python - with the poetry environment all set up +and everything - from the CLI. + +From the repo root, just run: + +```bash +bun py [path/to/input.json] +``` + +For example: + +```bash +bun py echo tmp/payload.json +``` + +This will call the `echo` service via `entry.py`, which sets up the right paths +etc. You can optionally include a path to the payload, which will be loaded as +JSON and passed to the module. + +Running code this way is exactly the same as doing it through the webserver - +you're bypassing the HTTP layer but otherwise invoking your python the same way. + +You don't need to create your own `if __name__ == "__main__":` logic inside oyur +python scripts - `entry.py` will do all that for you. + +## Use Env + +If your services requires an API key, you should: + +- accept the key on your json payload +- if no key is provided, load a from the environment + +Use a `.env` file at root and add your own keys to it (see `.env.example`) + +dotenvs are only suitable for local development. + +## Python Dependencies + +Python dependencies are managed by poetry using a pyproject.toml in the root +directly. + +To add a new dependency, run this anywhere in the repo: + +``` +poetry add numpy +``` + +## Installing models + +To add models as python packages: + +- Copy the `.whl` file to `/models` at the repo root +- Add the file to poetry (you should be able to do + `poetry add models/.whl`) + +## Code Style + +--TODO-- + +Code should be formated with black + +I need to: + +1. install a linter which can fail in CI (or locally) if there are formatting + issues +2. encourage here a format-on-save approach +3. make it really easy to install and configure Black? + +Update: actually, for JS we use prettier. Why not just use prettier for both +languages?! We just need to ensure the setup is minimal + +## Releasing + +When your contribution is ready, please open a Pull Request at +[openfn/gen](https://www.github.com/openfn/gen) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..cbd0ac5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM python:3.11-bullseye + +WORKDIR /app + +COPY ./pyproject.toml ./poetry.lock poetry.toml ./ +COPY ./package.json bun.lockb ./ + +COPY ./platform/ ./platform +COPY ./services/ ./services +COPY ./models/ ./models + +RUN python -m pip install --user pipx +RUN python -m pipx install poetry +ENV PATH="${PATH}:/root/.local/bin/" +RUN poetry install --only main --no-root + +RUN curl -fsSL https://bun.sh/install | bash +ENV PATH="${PATH}:/root/.bun/bin/" + +# node-gyp will fail to run unless node.js is installed +RUN curl -sL https://deb.nodesource.com/setup_20.x | /bin/bash - +RUN apt-get install nodejs + +RUN bun install + +EXPOSE 3000 + +CMD ["bun", "start"] diff --git a/README.md b/README.md index 222c09f..b7e5e20 100644 --- a/README.md +++ b/README.md @@ -1,140 +1,170 @@ -# Built-time AI Code Generation from API +# Apollo Server -This repository contains a Python application that utilizes AI models to generate code based on instructions received through an API URL. The application processes the instructions, runs the relevant AI models, and returns the generated code as a response. +Apollo is OpenFn's knowledge, AI and data platform, providing services to +support the OpenFn toolchain. -## Project Architecture +Apollo is known as the God of (among other things) truth, prophecy and oracles. -The project architecture is designed as a two-tier system. The first tier (current repo) handles the request processing, interacts with the API, and triggers the AI models. The second tier hosts AI inference and utilises the received preprocessed data to execute an AI model inference. The architecture diagram below provides an overview of the system: +This repo contains: -![Architecture Diagram](./assets/system-architecture.png) +- A bunjs-based webserver +- A number of python-based AI services +- (soon) A numberof Typescript-based data services -## Running with Docker Compose +## Requirements -To run the application using Docker Compose, follow these steps: +To run this server locally, you'll need the following dependencies to be +installed: -1. Navigate to the root directory of the project: +- python 3.11 (yes, 3.11 exactly, see Python Setup) +- poetry +- bunjs - ```bash - cd /path/to/your/gen/repo - ``` +You also need `python3-dev`, `g++` and `make` to be installted: -2. Build and start the services using Docker Compose: +``` +sudo apt install python3-dev make g++ +``` + +## Getting Started + +To run the server locally, run: - ```bash - docker-compose up --build - ``` +- `poetry install` +- `bun install` + +To start the server for local developement, run: + +```bash +bun dev +``` - The `--build` option ensures that Docker Compose builds the images before starting the services if non existent +Any changes to the typescript files will trigger the server to be re-loaded. All +python scripts will be re-laoded on each call. So you should rarely, if ever, +need to restart the server. -3. The services should now be running, and you can access them using the specified ports: +To start in production mode, run: - - Signature Generator: [http://localhost:8001](http://localhost:8001) - - Code Generator: [http://localhost:8002](http://localhost:8002) - - Inference: [http://localhost:8003](http://localhost:8003) +```bash +bun start +``` -4. To stop the services, press `Ctrl+C` in the terminal where Docker Compose is running. +In production mode, nothing will hot reload and python modules are cached. -**Note:** No docker image is stored at the time of writing and have to be built locally as shown above. +To see an index of the available language services, head to `localhost:3000`. -**Note:** Ensure that you have Docker and Docker Compose installed on your machine. +## CLI -For more detailed instructions or troubleshooting, refer to the Docker documentation: [Get Docker](https://docs.docker.com/get-docker/) and [Install Docker Compose](https://docs.docker.com/compose/install/). +To communicate with and test the server, you can use `@openfn/cli`. +Use the `apollo` command with your service name and pass a json file: -## Installation +``` +openfn apollo echo tmp/payload.json +``` -To set up the project and ensure proper functionality, follow these steps: +Pass `--staging`, `--production` or `--local` to call different deployments of +apollo. -1. Clone the repository to your local machine: +To default to using your local server, you can set an env var: - ```bash - git clone https://github.com/OpenFn/gen.git - ``` +``` +export OPENFN_APOLLO_DEFAULT_ENV=local +``` -2. Copy the example env and set your API keys as required: +Or pass an explicit URL if you're not running on the default port: - ```bash - cp ./services/inference/.env.example ./services/inference/.env - ``` +``` +export OPENFN_APOLLO_DEFAULT_ENV=http://locahost:6666 +``` -3. Navigate to the desired module's directory: +Output will be shown in stdout by default. Pass `-o path/to/output/.json` to +save the output to disk. - ```bash - cd services/ - ``` +You can get more help with: -4. Install the required dependencies using Poetry: +``` +openfn apollo help +``` - ```bash - poetry install - ``` +Note that if a service returns `{ files: {} }` object in the payload, an you +pass `-o` with a folder, those files will be written to disk . -Repeat these steps for each module under the `services` directory that you want to use. +## API Keys & Env vars -## Usage +Some services require API keys. -## Starting Services +Rather than coding these into your JSON payloads directly, keys can be loaded +from the `.env` file at the root. -You can initiate each service using the following steps: +Also note that `tmp` dirs are untracked, so if you do want to store credentials +in your json, keep in inside a tmp dir and it'll remain safe and secret. -1. Navigate to the desired service module: +## Server Architecture - ```bash - cd services/ - ``` +The Apollo server uses bunjs with the Elysia framework. -2. Run the service using Poetry: +It is a very lightweight server, with at the time of writing no authentication +or governance included. - ```bash - poetry run ./run.sh - ``` +Python services are hosted at `/services/`. Each services expects a POST +request with a JSON body, and will return JSON. -Additionally, each module includes a `demo.py` file that can be executed. To run the entire flow: +There is very little standard for formality in the JSON structures to date. The +server may soon establish some conventions for better interopability with the +CLI. -1. Navigate to the `services` directory: +The JS engine calls out to a long-running python process using +`node-calls-python`. Python modules are pretty free-form but must adhere to a +minimal structure. See the Contribution Guide for details. - ```bash - cd services/ - ``` +## Python Setup -2. Run the demo: +This repo uses `poetry` to manage dependencies. - ```bash - poetry run python demo.py - ``` -## Demo +We use an "in-project" venv , which means a `.venv` folder will be created when +you run `poetry install`. -To execute the entire generation process for the provided samples, run the following command: +We call out to a live python environment from node, using a library called +`node-calls-python`. We pass in the path to the local `.venv` folder so that the +node-python bindings can see your poetry environment. -```bash -cd services/ -python3 demo.py -``` +The `node-calls-python` setup currently relies on a hard-coded python version. +If the python version is changed, this value will need updating. -This prepares the data, performs requests and saves the outputs (Adaptor.d.ts, Adapter.js, and Adapter.test.js). +All python is invoked through `entry.py`, which loads the environment properly +so that relative imports work. -## Project Structure +You can invoke entry.py directly (ie, without HTTP) through bun from the root: -The project structure is organized as follows: +``` +bun py echo tmp/payload.json +``` -- `services/`: Contains the three services and demo file. -- `utils/`: Directory containing utility functions and helper modules for processing instructions and generating code. -- `tests/`: Directory containing test files for the application. +## Installation Troubleshooting -## API Documentation +- Ensure all dependencies are installed +- Ensure you've run `bun install` (unusual for Bun) +- Maybe install node-gyp explicitly? +- Ensure that `node-calls-python` has been built. In + `node_modules/node-calls-python` there should be a `Relesae` folder with stuff + inside. -The service APIs are documented using OpenAPI (FastAPI). You can view the API documentation for each running service by navigating to the `/docs` endpoint. Here are the URLs for each service: +## Docker -- **Signature Generator Service:** [http://localhost:8001/docs](http://localhost:8001/docs) -- **Code Generator Service:** [http://localhost:8002/docs](http://localhost:8002/docs) -- **Inference Service:** [http://localhost:8003/docs](http://localhost:8003/docs) +To build the docker image: -Simply access the respective URL to explore and interact with the API documentation. Replace the endpoints with the actual service endpoints. +```bash +docker build . -t openfn-apollo +``` -## Contributing +To run it on port 3000 -Contributions to this project are welcome. Feel free to open issues or submit pull requests for improvements, bug fixes, or new features. +```bash +docker run -p 3000:3000 openfn-apollo +``` -## License +## Contributing -This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. +See the Contribution Guide for more details about how and where to contribute to +the Apollo platform. diff --git a/assets/system-architecture.png b/assets/system-architecture.png deleted file mode 100644 index 0e6d896..0000000 Binary files a/assets/system-architecture.png and /dev/null differ diff --git a/assets/system-proposal.png b/assets/system-proposal.png deleted file mode 100644 index 2ba860a..0000000 Binary files a/assets/system-proposal.png and /dev/null differ diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000..eaefecd Binary files /dev/null and b/bun.lockb differ diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index a3a9fe1..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,35 +0,0 @@ -services: - signature_generator: - image: openfn/ai-gen/signature_generator:v1.0.0 - build: - context: ./services/signature_generator - dockerfile: Dockerfile - ports: - - "8001:8001" - env_file: - - ./services/signature_generator/.env.example - - code_generator: - image: openfn/ai-gen/code_generator:v1.0.0 - build: - context: ./services/code_generator - dockerfile: Dockerfile - ports: - - "8002:8002" - env_file: - - ./services/code_generator/.env.example - - inference: - image: openfn/ai-gen/inference:v1.0.0 - build: - context: ./services/inference - dockerfile: Dockerfile - ports: - - "8003:8003" - env_file: - - ./services/inference/.env - # tty: true - # Uncomment the following lines to set environment variables in place of env_file - # environment: - # - OPENAI_API_KEY=sk-YOUR-API-KEY-HERE - # - HF_ACCESS_TOKEN=hf_YOUR-API-KEY-HERE diff --git a/finetuning/README.md b/finetuning/README.md new file mode 100644 index 0000000..a487429 --- /dev/null +++ b/finetuning/README.md @@ -0,0 +1,10 @@ +# Finetuning + +This folder contains code to handle fine-tuning of various language models. + +It used to be called `openfn_llama`. + +We need to do some tidying in here to: + +- a) ensure code is re-usable +- b) ensure that previously trained models can be accessed diff --git a/services/openfn_llama/__init__.py b/finetuning/__init__.py similarity index 100% rename from services/openfn_llama/__init__.py rename to finetuning/__init__.py diff --git a/services/openfn_llama/datasets/adaptors/adaptor_functions.json b/finetuning/datasets/adaptors/adaptor_functions.json similarity index 100% rename from services/openfn_llama/datasets/adaptors/adaptor_functions.json rename to finetuning/datasets/adaptors/adaptor_functions.json diff --git a/services/openfn_llama/datasets/adaptors/adaptor_functions_instr.json b/finetuning/datasets/adaptors/adaptor_functions_instr.json similarity index 100% rename from services/openfn_llama/datasets/adaptors/adaptor_functions_instr.json rename to finetuning/datasets/adaptors/adaptor_functions_instr.json diff --git a/services/openfn_llama/datasets/adaptors/adaptor_functions_prompts.json b/finetuning/datasets/adaptors/adaptor_functions_prompts.json similarity index 100% rename from services/openfn_llama/datasets/adaptors/adaptor_functions_prompts.json rename to finetuning/datasets/adaptors/adaptor_functions_prompts.json diff --git a/services/openfn_llama/datasets/adaptors/adaptors.json b/finetuning/datasets/adaptors/adaptors.json similarity index 100% rename from services/openfn_llama/datasets/adaptors/adaptors.json rename to finetuning/datasets/adaptors/adaptors.json diff --git a/services/openfn_llama/datasets/adaptors/adaptors.jsonl b/finetuning/datasets/adaptors/adaptors.jsonl similarity index 100% rename from services/openfn_llama/datasets/adaptors/adaptors.jsonl rename to finetuning/datasets/adaptors/adaptors.jsonl diff --git a/services/openfn_llama/datasets/adaptors/dataset.jsonl b/finetuning/datasets/adaptors/dataset.jsonl similarity index 100% rename from services/openfn_llama/datasets/adaptors/dataset.jsonl rename to finetuning/datasets/adaptors/dataset.jsonl diff --git a/services/openfn_llama/datasets/adaptors/dhis2.js b/finetuning/datasets/adaptors/dhis2.js similarity index 100% rename from services/openfn_llama/datasets/adaptors/dhis2.js rename to finetuning/datasets/adaptors/dhis2.js diff --git a/services/openfn_llama/datasets/adaptors/gpt_generated.jsonl b/finetuning/datasets/adaptors/gpt_generated.jsonl similarity index 100% rename from services/openfn_llama/datasets/adaptors/gpt_generated.jsonl rename to finetuning/datasets/adaptors/gpt_generated.jsonl diff --git a/services/openfn_llama/datasets/adaptors/msgraph_sig.js b/finetuning/datasets/adaptors/msgraph_sig.js similarity index 100% rename from services/openfn_llama/datasets/adaptors/msgraph_sig.js rename to finetuning/datasets/adaptors/msgraph_sig.js diff --git a/services/openfn_llama/datasets/alpaca_data.json b/finetuning/datasets/alpaca_data.json similarity index 100% rename from services/openfn_llama/datasets/alpaca_data.json rename to finetuning/datasets/alpaca_data.json diff --git a/services/openfn_llama/datasets/processed_data/adaptors.jsonl b/finetuning/datasets/processed_data/adaptors.jsonl similarity index 100% rename from services/openfn_llama/datasets/processed_data/adaptors.jsonl rename to finetuning/datasets/processed_data/adaptors.jsonl diff --git a/services/openfn_llama/datasets/processed_data/dataset.jsonl b/finetuning/datasets/processed_data/dataset.jsonl similarity index 100% rename from services/openfn_llama/datasets/processed_data/dataset.jsonl rename to finetuning/datasets/processed_data/dataset.jsonl diff --git a/services/openfn_llama/datasets/processed_data/generated_data.json b/finetuning/datasets/processed_data/generated_data.json similarity index 100% rename from services/openfn_llama/datasets/processed_data/generated_data.json rename to finetuning/datasets/processed_data/generated_data.json diff --git a/services/openfn_llama/datasets/processed_data/test.json b/finetuning/datasets/processed_data/test.json similarity index 100% rename from services/openfn_llama/datasets/processed_data/test.json rename to finetuning/datasets/processed_data/test.json diff --git a/services/openfn_llama/datasets/processed_data/test.jsonl b/finetuning/datasets/processed_data/test.jsonl similarity index 100% rename from services/openfn_llama/datasets/processed_data/test.jsonl rename to finetuning/datasets/processed_data/test.jsonl diff --git a/services/openfn_llama/datasets/processed_data/tests.jsonl b/finetuning/datasets/processed_data/tests.jsonl similarity index 100% rename from services/openfn_llama/datasets/processed_data/tests.jsonl rename to finetuning/datasets/processed_data/tests.jsonl diff --git a/services/openfn_llama/datasets/processed_data/train.json b/finetuning/datasets/processed_data/train.json similarity index 100% rename from services/openfn_llama/datasets/processed_data/train.json rename to finetuning/datasets/processed_data/train.json diff --git a/services/openfn_llama/datasets/processed_data/train.jsonl b/finetuning/datasets/processed_data/train.jsonl similarity index 100% rename from services/openfn_llama/datasets/processed_data/train.jsonl rename to finetuning/datasets/processed_data/train.jsonl diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/adaptors/createTask.js b/finetuning/datasets/rest_adaptors/asana/adaptors/createTask.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/adaptors/createTask.js rename to finetuning/datasets/rest_adaptors/asana/adaptors/createTask.js diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/adaptors/execute.js b/finetuning/datasets/rest_adaptors/asana/adaptors/execute.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/adaptors/execute.js rename to finetuning/datasets/rest_adaptors/asana/adaptors/execute.js diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/adaptors/getTask.js b/finetuning/datasets/rest_adaptors/asana/adaptors/getTask.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/adaptors/getTask.js rename to finetuning/datasets/rest_adaptors/asana/adaptors/getTask.js diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/adaptors/getTasks.js b/finetuning/datasets/rest_adaptors/asana/adaptors/getTasks.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/adaptors/getTasks.js rename to finetuning/datasets/rest_adaptors/asana/adaptors/getTasks.js diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/adaptors/updateTask.js b/finetuning/datasets/rest_adaptors/asana/adaptors/updateTask.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/adaptors/updateTask.js rename to finetuning/datasets/rest_adaptors/asana/adaptors/updateTask.js diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/adaptors/upsertTask.js b/finetuning/datasets/rest_adaptors/asana/adaptors/upsertTask.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/adaptors/upsertTask.js rename to finetuning/datasets/rest_adaptors/asana/adaptors/upsertTask.js diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/signatures/createTask.d.ts b/finetuning/datasets/rest_adaptors/asana/signatures/createTask.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/signatures/createTask.d.ts rename to finetuning/datasets/rest_adaptors/asana/signatures/createTask.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/signatures/execute.d.ts b/finetuning/datasets/rest_adaptors/asana/signatures/execute.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/signatures/execute.d.ts rename to finetuning/datasets/rest_adaptors/asana/signatures/execute.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/signatures/getTask.d.ts b/finetuning/datasets/rest_adaptors/asana/signatures/getTask.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/signatures/getTask.d.ts rename to finetuning/datasets/rest_adaptors/asana/signatures/getTask.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/signatures/getTasks.d.ts b/finetuning/datasets/rest_adaptors/asana/signatures/getTasks.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/signatures/getTasks.d.ts rename to finetuning/datasets/rest_adaptors/asana/signatures/getTasks.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/signatures/updateTask.d.ts b/finetuning/datasets/rest_adaptors/asana/signatures/updateTask.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/signatures/updateTask.d.ts rename to finetuning/datasets/rest_adaptors/asana/signatures/updateTask.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/asana/signatures/upsertTask.d.ts b/finetuning/datasets/rest_adaptors/asana/signatures/upsertTask.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/asana/signatures/upsertTask.d.ts rename to finetuning/datasets/rest_adaptors/asana/signatures/upsertTask.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/beyonic/adaptors/createCollectionRequest.js b/finetuning/datasets/rest_adaptors/beyonic/adaptors/createCollectionRequest.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/beyonic/adaptors/createCollectionRequest.js rename to finetuning/datasets/rest_adaptors/beyonic/adaptors/createCollectionRequest.js diff --git a/services/openfn_llama/datasets/rest_adaptors/beyonic/adaptors/createContact.js b/finetuning/datasets/rest_adaptors/beyonic/adaptors/createContact.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/beyonic/adaptors/createContact.js rename to finetuning/datasets/rest_adaptors/beyonic/adaptors/createContact.js diff --git a/services/openfn_llama/datasets/rest_adaptors/beyonic/adaptors/createPayment.js b/finetuning/datasets/rest_adaptors/beyonic/adaptors/createPayment.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/beyonic/adaptors/createPayment.js rename to finetuning/datasets/rest_adaptors/beyonic/adaptors/createPayment.js diff --git a/services/openfn_llama/datasets/rest_adaptors/beyonic/signatures/createCollectionRequest.d.ts b/finetuning/datasets/rest_adaptors/beyonic/signatures/createCollectionRequest.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/beyonic/signatures/createCollectionRequest.d.ts rename to finetuning/datasets/rest_adaptors/beyonic/signatures/createCollectionRequest.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/beyonic/signatures/createContact.d.ts b/finetuning/datasets/rest_adaptors/beyonic/signatures/createContact.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/beyonic/signatures/createContact.d.ts rename to finetuning/datasets/rest_adaptors/beyonic/signatures/createContact.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/beyonic/signatures/createPayment.d.ts b/finetuning/datasets/rest_adaptors/beyonic/signatures/createPayment.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/beyonic/signatures/createPayment.d.ts rename to finetuning/datasets/rest_adaptors/beyonic/signatures/createPayment.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/cartodb/adaptors/addRow.js b/finetuning/datasets/rest_adaptors/cartodb/adaptors/addRow.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/cartodb/adaptors/addRow.js rename to finetuning/datasets/rest_adaptors/cartodb/adaptors/addRow.js diff --git a/services/openfn_llama/datasets/rest_adaptors/cartodb/adaptors/sql.js b/finetuning/datasets/rest_adaptors/cartodb/adaptors/sql.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/cartodb/adaptors/sql.js rename to finetuning/datasets/rest_adaptors/cartodb/adaptors/sql.js diff --git a/services/openfn_llama/datasets/rest_adaptors/cartodb/signatures/addRow.d.ts b/finetuning/datasets/rest_adaptors/cartodb/signatures/addRow.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/cartodb/signatures/addRow.d.ts rename to finetuning/datasets/rest_adaptors/cartodb/signatures/addRow.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/cartodb/signatures/sql.d.ts b/finetuning/datasets/rest_adaptors/cartodb/signatures/sql.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/cartodb/signatures/sql.d.ts rename to finetuning/datasets/rest_adaptors/cartodb/signatures/sql.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/clientPost.js b/finetuning/datasets/rest_adaptors/commcare/adaptors/clientPost.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/clientPost.js rename to finetuning/datasets/rest_adaptors/commcare/adaptors/clientPost.js diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/execute.js b/finetuning/datasets/rest_adaptors/commcare/adaptors/execute.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/execute.js rename to finetuning/datasets/rest_adaptors/commcare/adaptors/execute.js diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/fetchReportData.js b/finetuning/datasets/rest_adaptors/commcare/adaptors/fetchReportData.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/fetchReportData.js rename to finetuning/datasets/rest_adaptors/commcare/adaptors/fetchReportData.js diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/submit.js b/finetuning/datasets/rest_adaptors/commcare/adaptors/submit.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/submit.js rename to finetuning/datasets/rest_adaptors/commcare/adaptors/submit.js diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/submitXls.js b/finetuning/datasets/rest_adaptors/commcare/adaptors/submitXls.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/adaptors/submitXls.js rename to finetuning/datasets/rest_adaptors/commcare/adaptors/submitXls.js diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/signatures/clientPost.d.ts b/finetuning/datasets/rest_adaptors/commcare/signatures/clientPost.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/signatures/clientPost.d.ts rename to finetuning/datasets/rest_adaptors/commcare/signatures/clientPost.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/signatures/execute.d.ts b/finetuning/datasets/rest_adaptors/commcare/signatures/execute.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/signatures/execute.d.ts rename to finetuning/datasets/rest_adaptors/commcare/signatures/execute.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/signatures/fetchReportData.d.ts b/finetuning/datasets/rest_adaptors/commcare/signatures/fetchReportData.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/signatures/fetchReportData.d.ts rename to finetuning/datasets/rest_adaptors/commcare/signatures/fetchReportData.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/signatures/submit.d.ts b/finetuning/datasets/rest_adaptors/commcare/signatures/submit.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/signatures/submit.d.ts rename to finetuning/datasets/rest_adaptors/commcare/signatures/submit.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/commcare/signatures/submitXls.d.ts b/finetuning/datasets/rest_adaptors/commcare/signatures/submitXls.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/commcare/signatures/submitXls.d.ts rename to finetuning/datasets/rest_adaptors/commcare/signatures/submitXls.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/create.js b/finetuning/datasets/rest_adaptors/dhis2/adaptors/create.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/create.js rename to finetuning/datasets/rest_adaptors/dhis2/adaptors/create.js diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/destroy.js b/finetuning/datasets/rest_adaptors/dhis2/adaptors/destroy.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/destroy.js rename to finetuning/datasets/rest_adaptors/dhis2/adaptors/destroy.js diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/get.js b/finetuning/datasets/rest_adaptors/dhis2/adaptors/get.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/get.js rename to finetuning/datasets/rest_adaptors/dhis2/adaptors/get.js diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/update.js b/finetuning/datasets/rest_adaptors/dhis2/adaptors/update.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/update.js rename to finetuning/datasets/rest_adaptors/dhis2/adaptors/update.js diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/upsert.js b/finetuning/datasets/rest_adaptors/dhis2/adaptors/upsert.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/adaptors/upsert.js rename to finetuning/datasets/rest_adaptors/dhis2/adaptors/upsert.js diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/create.d.ts b/finetuning/datasets/rest_adaptors/dhis2/signatures/create.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/create.d.ts rename to finetuning/datasets/rest_adaptors/dhis2/signatures/create.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/destroy.d.ts b/finetuning/datasets/rest_adaptors/dhis2/signatures/destroy.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/destroy.d.ts rename to finetuning/datasets/rest_adaptors/dhis2/signatures/destroy.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/get.d.ts b/finetuning/datasets/rest_adaptors/dhis2/signatures/get.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/get.d.ts rename to finetuning/datasets/rest_adaptors/dhis2/signatures/get.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/update.d.ts b/finetuning/datasets/rest_adaptors/dhis2/signatures/update.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/update.d.ts rename to finetuning/datasets/rest_adaptors/dhis2/signatures/update.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/upsert.d.ts b/finetuning/datasets/rest_adaptors/dhis2/signatures/upsert.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dhis2/signatures/upsert.d.ts rename to finetuning/datasets/rest_adaptors/dhis2/signatures/upsert.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/dynamics/adaptors/createEntity.js b/finetuning/datasets/rest_adaptors/dynamics/adaptors/createEntity.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dynamics/adaptors/createEntity.js rename to finetuning/datasets/rest_adaptors/dynamics/adaptors/createEntity.js diff --git a/services/openfn_llama/datasets/rest_adaptors/dynamics/signatures/createEntity.d.ts b/finetuning/datasets/rest_adaptors/dynamics/signatures/createEntity.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/dynamics/signatures/createEntity.d.ts rename to finetuning/datasets/rest_adaptors/dynamics/signatures/createEntity.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/facebook/adaptors/postMessage.js b/finetuning/datasets/rest_adaptors/facebook/adaptors/postMessage.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/facebook/adaptors/postMessage.js rename to finetuning/datasets/rest_adaptors/facebook/adaptors/postMessage.js diff --git a/services/openfn_llama/datasets/rest_adaptors/facebook/signatures/postMessage.d.ts b/finetuning/datasets/rest_adaptors/facebook/signatures/postMessage.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/facebook/signatures/postMessage.d.ts rename to finetuning/datasets/rest_adaptors/facebook/signatures/postMessage.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/fhir/adaptors/create.js b/finetuning/datasets/rest_adaptors/fhir/adaptors/create.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/fhir/adaptors/create.js rename to finetuning/datasets/rest_adaptors/fhir/adaptors/create.js diff --git a/services/openfn_llama/datasets/rest_adaptors/fhir/adaptors/createTransactionBundle.js b/finetuning/datasets/rest_adaptors/fhir/adaptors/createTransactionBundle.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/fhir/adaptors/createTransactionBundle.js rename to finetuning/datasets/rest_adaptors/fhir/adaptors/createTransactionBundle.js diff --git a/services/openfn_llama/datasets/rest_adaptors/fhir/adaptors/get.js b/finetuning/datasets/rest_adaptors/fhir/adaptors/get.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/fhir/adaptors/get.js rename to finetuning/datasets/rest_adaptors/fhir/adaptors/get.js diff --git a/services/openfn_llama/datasets/rest_adaptors/fhir/adaptors/getClaim.js b/finetuning/datasets/rest_adaptors/fhir/adaptors/getClaim.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/fhir/adaptors/getClaim.js rename to finetuning/datasets/rest_adaptors/fhir/adaptors/getClaim.js diff --git a/services/openfn_llama/datasets/rest_adaptors/fhir/signatures/create.d.ts b/finetuning/datasets/rest_adaptors/fhir/signatures/create.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/fhir/signatures/create.d.ts rename to finetuning/datasets/rest_adaptors/fhir/signatures/create.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/fhir/signatures/createTransactionBundle.d.ts b/finetuning/datasets/rest_adaptors/fhir/signatures/createTransactionBundle.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/fhir/signatures/createTransactionBundle.d.ts rename to finetuning/datasets/rest_adaptors/fhir/signatures/createTransactionBundle.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/fhir/signatures/get.d.ts b/finetuning/datasets/rest_adaptors/fhir/signatures/get.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/fhir/signatures/get.d.ts rename to finetuning/datasets/rest_adaptors/fhir/signatures/get.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/fhir/signatures/getClaim.d.ts b/finetuning/datasets/rest_adaptors/fhir/signatures/getClaim.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/fhir/signatures/getClaim.d.ts rename to finetuning/datasets/rest_adaptors/fhir/signatures/getClaim.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/execute.js b/finetuning/datasets/rest_adaptors/godata/adaptors/execute.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/execute.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/execute.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getCase.js b/finetuning/datasets/rest_adaptors/godata/adaptors/getCase.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getCase.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/getCase.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getContact.js b/finetuning/datasets/rest_adaptors/godata/adaptors/getContact.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getContact.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/getContact.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getLocation.js b/finetuning/datasets/rest_adaptors/godata/adaptors/getLocation.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getLocation.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/getLocation.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getOutbreak.js b/finetuning/datasets/rest_adaptors/godata/adaptors/getOutbreak.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getOutbreak.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/getOutbreak.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getReferenceData.js b/finetuning/datasets/rest_adaptors/godata/adaptors/getReferenceData.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/getReferenceData.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/getReferenceData.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listCases.js b/finetuning/datasets/rest_adaptors/godata/adaptors/listCases.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listCases.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/listCases.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listContacts.js b/finetuning/datasets/rest_adaptors/godata/adaptors/listContacts.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listContacts.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/listContacts.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listLocations.js b/finetuning/datasets/rest_adaptors/godata/adaptors/listLocations.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listLocations.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/listLocations.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listOutbreaks.js b/finetuning/datasets/rest_adaptors/godata/adaptors/listOutbreaks.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listOutbreaks.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/listOutbreaks.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listReferenceData.js b/finetuning/datasets/rest_adaptors/godata/adaptors/listReferenceData.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/listReferenceData.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/listReferenceData.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertCase.js b/finetuning/datasets/rest_adaptors/godata/adaptors/upsertCase.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertCase.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/upsertCase.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertContact.js b/finetuning/datasets/rest_adaptors/godata/adaptors/upsertContact.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertContact.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/upsertContact.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertLocation.js b/finetuning/datasets/rest_adaptors/godata/adaptors/upsertLocation.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertLocation.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/upsertLocation.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertOutbreak.js b/finetuning/datasets/rest_adaptors/godata/adaptors/upsertOutbreak.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertOutbreak.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/upsertOutbreak.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertReferenceData.js b/finetuning/datasets/rest_adaptors/godata/adaptors/upsertReferenceData.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/adaptors/upsertReferenceData.js rename to finetuning/datasets/rest_adaptors/godata/adaptors/upsertReferenceData.js diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/execute.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/execute.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/execute.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/execute.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/getCase.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/getCase.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/getCase.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/getCase.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/getContact.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/getContact.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/getContact.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/getContact.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/getLocation.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/getLocation.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/getLocation.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/getLocation.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/getOutbreak.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/getOutbreak.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/getOutbreak.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/getOutbreak.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/getReferenceData.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/getReferenceData.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/getReferenceData.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/getReferenceData.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/listCases.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/listCases.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/listCases.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/listCases.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/listContacts.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/listContacts.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/listContacts.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/listContacts.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/listLocations.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/listLocations.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/listLocations.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/listLocations.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/listOutbreaks.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/listOutbreaks.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/listOutbreaks.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/listOutbreaks.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/listReferenceData.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/listReferenceData.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/listReferenceData.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/listReferenceData.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertCase.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/upsertCase.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertCase.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/upsertCase.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertContact.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/upsertContact.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertContact.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/upsertContact.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertLocation.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/upsertLocation.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertLocation.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/upsertLocation.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertOutbreak.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/upsertOutbreak.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertOutbreak.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/upsertOutbreak.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertReferenceData.d.ts b/finetuning/datasets/rest_adaptors/godata/signatures/upsertReferenceData.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/godata/signatures/upsertReferenceData.d.ts rename to finetuning/datasets/rest_adaptors/godata/signatures/upsertReferenceData.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/googlehealthcare/adaptors/createFhirResource.js b/finetuning/datasets/rest_adaptors/googlehealthcare/adaptors/createFhirResource.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/googlehealthcare/adaptors/createFhirResource.js rename to finetuning/datasets/rest_adaptors/googlehealthcare/adaptors/createFhirResource.js diff --git a/services/openfn_llama/datasets/rest_adaptors/googlehealthcare/adaptors/execute.js b/finetuning/datasets/rest_adaptors/googlehealthcare/adaptors/execute.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/googlehealthcare/adaptors/execute.js rename to finetuning/datasets/rest_adaptors/googlehealthcare/adaptors/execute.js diff --git a/services/openfn_llama/datasets/rest_adaptors/googlehealthcare/signatures/createFhirResource.d.ts b/finetuning/datasets/rest_adaptors/googlehealthcare/signatures/createFhirResource.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/googlehealthcare/signatures/createFhirResource.d.ts rename to finetuning/datasets/rest_adaptors/googlehealthcare/signatures/createFhirResource.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/googlehealthcare/signatures/execute.d.ts b/finetuning/datasets/rest_adaptors/googlehealthcare/signatures/execute.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/googlehealthcare/signatures/execute.d.ts rename to finetuning/datasets/rest_adaptors/googlehealthcare/signatures/execute.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/khanacademy/adaptors/execute.js b/finetuning/datasets/rest_adaptors/khanacademy/adaptors/execute.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/khanacademy/adaptors/execute.js rename to finetuning/datasets/rest_adaptors/khanacademy/adaptors/execute.js diff --git a/services/openfn_llama/datasets/rest_adaptors/khanacademy/adaptors/fetch.js b/finetuning/datasets/rest_adaptors/khanacademy/adaptors/fetch.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/khanacademy/adaptors/fetch.js rename to finetuning/datasets/rest_adaptors/khanacademy/adaptors/fetch.js diff --git a/services/openfn_llama/datasets/rest_adaptors/khanacademy/signatures/execute.d.ts b/finetuning/datasets/rest_adaptors/khanacademy/signatures/execute.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/khanacademy/signatures/execute.d.ts rename to finetuning/datasets/rest_adaptors/khanacademy/signatures/execute.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/khanacademy/signatures/fetch.d.ts b/finetuning/datasets/rest_adaptors/khanacademy/signatures/fetch.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/khanacademy/signatures/fetch.d.ts rename to finetuning/datasets/rest_adaptors/khanacademy/signatures/fetch.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/kobotoolbox/adaptors/getDeploymentInfo.js b/finetuning/datasets/rest_adaptors/kobotoolbox/adaptors/getDeploymentInfo.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/kobotoolbox/adaptors/getDeploymentInfo.js rename to finetuning/datasets/rest_adaptors/kobotoolbox/adaptors/getDeploymentInfo.js diff --git a/services/openfn_llama/datasets/rest_adaptors/kobotoolbox/adaptors/getForms.js b/finetuning/datasets/rest_adaptors/kobotoolbox/adaptors/getForms.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/kobotoolbox/adaptors/getForms.js rename to finetuning/datasets/rest_adaptors/kobotoolbox/adaptors/getForms.js diff --git a/services/openfn_llama/datasets/rest_adaptors/kobotoolbox/adaptors/getSubmissions.js b/finetuning/datasets/rest_adaptors/kobotoolbox/adaptors/getSubmissions.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/kobotoolbox/adaptors/getSubmissions.js rename to finetuning/datasets/rest_adaptors/kobotoolbox/adaptors/getSubmissions.js diff --git a/services/openfn_llama/datasets/rest_adaptors/kobotoolbox/signatures/getDeploymentInfo.d.ts b/finetuning/datasets/rest_adaptors/kobotoolbox/signatures/getDeploymentInfo.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/kobotoolbox/signatures/getDeploymentInfo.d.ts rename to finetuning/datasets/rest_adaptors/kobotoolbox/signatures/getDeploymentInfo.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/kobotoolbox/signatures/getForms.d.ts b/finetuning/datasets/rest_adaptors/kobotoolbox/signatures/getForms.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/kobotoolbox/signatures/getForms.d.ts rename to finetuning/datasets/rest_adaptors/kobotoolbox/signatures/getForms.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/kobotoolbox/signatures/getSubmissions.d.ts b/finetuning/datasets/rest_adaptors/kobotoolbox/signatures/getSubmissions.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/kobotoolbox/signatures/getSubmissions.d.ts rename to finetuning/datasets/rest_adaptors/kobotoolbox/signatures/getSubmissions.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/msgraph/adaptors/create.js b/finetuning/datasets/rest_adaptors/msgraph/adaptors/create.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/msgraph/adaptors/create.js rename to finetuning/datasets/rest_adaptors/msgraph/adaptors/create.js diff --git a/services/openfn_llama/datasets/rest_adaptors/msgraph/adaptors/get.js b/finetuning/datasets/rest_adaptors/msgraph/adaptors/get.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/msgraph/adaptors/get.js rename to finetuning/datasets/rest_adaptors/msgraph/adaptors/get.js diff --git a/services/openfn_llama/datasets/rest_adaptors/msgraph/adaptors/getDrive.js b/finetuning/datasets/rest_adaptors/msgraph/adaptors/getDrive.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/msgraph/adaptors/getDrive.js rename to finetuning/datasets/rest_adaptors/msgraph/adaptors/getDrive.js diff --git a/services/openfn_llama/datasets/rest_adaptors/msgraph/signatures/create.d.ts b/finetuning/datasets/rest_adaptors/msgraph/signatures/create.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/msgraph/signatures/create.d.ts rename to finetuning/datasets/rest_adaptors/msgraph/signatures/create.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/msgraph/signatures/get.d.ts b/finetuning/datasets/rest_adaptors/msgraph/signatures/get.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/msgraph/signatures/get.d.ts rename to finetuning/datasets/rest_adaptors/msgraph/signatures/get.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/msgraph/signatures/getDrive.d.ts b/finetuning/datasets/rest_adaptors/msgraph/signatures/getDrive.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/msgraph/signatures/getDrive.d.ts rename to finetuning/datasets/rest_adaptors/msgraph/signatures/getDrive.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openhim/adaptors/encounter.js b/finetuning/datasets/rest_adaptors/openhim/adaptors/encounter.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openhim/adaptors/encounter.js rename to finetuning/datasets/rest_adaptors/openhim/adaptors/encounter.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openhim/signatures/encounter.d.ts b/finetuning/datasets/rest_adaptors/openhim/signatures/encounter.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openhim/signatures/encounter.d.ts rename to finetuning/datasets/rest_adaptors/openhim/signatures/encounter.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/create.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/create.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/create.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/create.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/createEncounter.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/createEncounter.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/createEncounter.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/createEncounter.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/createPatient.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/createPatient.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/createPatient.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/createPatient.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/get.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/get.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/get.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/get.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/getEncounter.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/getEncounter.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/getEncounter.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/getEncounter.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/getEncounters.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/getEncounters.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/getEncounters.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/getEncounters.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/getPatient.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/getPatient.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/getPatient.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/getPatient.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/post.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/post.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/post.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/post.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/searchPatient.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/searchPatient.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/searchPatient.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/searchPatient.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/searchPerson.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/searchPerson.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/searchPerson.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/searchPerson.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/update.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/update.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/update.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/update.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/upsert.js b/finetuning/datasets/rest_adaptors/openmrs/adaptors/upsert.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/adaptors/upsert.js rename to finetuning/datasets/rest_adaptors/openmrs/adaptors/upsert.js diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/create.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/create.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/create.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/create.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/createEncounter.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/createEncounter.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/createEncounter.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/createEncounter.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/createPatient.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/createPatient.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/createPatient.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/createPatient.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/get.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/get.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/get.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/get.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/getEncounter.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/getEncounter.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/getEncounter.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/getEncounter.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/getEncounters.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/getEncounters.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/getEncounters.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/getEncounters.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/getPatient.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/getPatient.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/getPatient.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/getPatient.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/post.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/post.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/post.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/post.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/searchPatient.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/searchPatient.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/searchPatient.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/searchPatient.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/searchPerson.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/searchPerson.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/searchPerson.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/searchPerson.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/update.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/update.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/update.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/update.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/upsert.d.ts b/finetuning/datasets/rest_adaptors/openmrs/signatures/upsert.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/openmrs/signatures/upsert.d.ts rename to finetuning/datasets/rest_adaptors/openmrs/signatures/upsert.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/createCase.js b/finetuning/datasets/rest_adaptors/primero/adaptors/createCase.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/createCase.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/createCase.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/createReferrals.js b/finetuning/datasets/rest_adaptors/primero/adaptors/createReferrals.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/createReferrals.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/createReferrals.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getCases.js b/finetuning/datasets/rest_adaptors/primero/adaptors/getCases.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getCases.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/getCases.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getForms.js b/finetuning/datasets/rest_adaptors/primero/adaptors/getForms.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getForms.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/getForms.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getLocations.js b/finetuning/datasets/rest_adaptors/primero/adaptors/getLocations.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getLocations.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/getLocations.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getLookups.js b/finetuning/datasets/rest_adaptors/primero/adaptors/getLookups.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getLookups.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/getLookups.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getReferrals.js b/finetuning/datasets/rest_adaptors/primero/adaptors/getReferrals.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/getReferrals.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/getReferrals.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/updateCase.js b/finetuning/datasets/rest_adaptors/primero/adaptors/updateCase.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/updateCase.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/updateCase.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/updateReferral.js b/finetuning/datasets/rest_adaptors/primero/adaptors/updateReferral.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/updateReferral.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/updateReferral.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/adaptors/upsertCase.js b/finetuning/datasets/rest_adaptors/primero/adaptors/upsertCase.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/adaptors/upsertCase.js rename to finetuning/datasets/rest_adaptors/primero/adaptors/upsertCase.js diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/createCase.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/createCase.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/createCase.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/createCase.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/createReferrals.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/createReferrals.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/createReferrals.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/createReferrals.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/getCases.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/getCases.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/getCases.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/getCases.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/getForms.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/getForms.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/getForms.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/getForms.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/getLocations.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/getLocations.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/getLocations.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/getLocations.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/getLookups.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/getLookups.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/getLookups.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/getLookups.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/getReferrals.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/getReferrals.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/getReferrals.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/getReferrals.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/updateCase.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/updateCase.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/updateCase.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/updateCase.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/updateReferral.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/updateReferral.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/updateReferral.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/updateReferral.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/primero/signatures/upsertCase.d.ts b/finetuning/datasets/rest_adaptors/primero/signatures/upsertCase.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/primero/signatures/upsertCase.d.ts rename to finetuning/datasets/rest_adaptors/primero/signatures/upsertCase.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/progres/adaptors/postData.js b/finetuning/datasets/rest_adaptors/progres/adaptors/postData.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/progres/adaptors/postData.js rename to finetuning/datasets/rest_adaptors/progres/adaptors/postData.js diff --git a/services/openfn_llama/datasets/rest_adaptors/progres/signatures/postData.d.ts b/finetuning/datasets/rest_adaptors/progres/signatures/postData.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/progres/signatures/postData.d.ts rename to finetuning/datasets/rest_adaptors/progres/signatures/postData.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/rapidpro/adaptors/addContact.js b/finetuning/datasets/rest_adaptors/rapidpro/adaptors/addContact.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/rapidpro/adaptors/addContact.js rename to finetuning/datasets/rest_adaptors/rapidpro/adaptors/addContact.js diff --git a/services/openfn_llama/datasets/rest_adaptors/rapidpro/adaptors/sendBroadcast.js b/finetuning/datasets/rest_adaptors/rapidpro/adaptors/sendBroadcast.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/rapidpro/adaptors/sendBroadcast.js rename to finetuning/datasets/rest_adaptors/rapidpro/adaptors/sendBroadcast.js diff --git a/services/openfn_llama/datasets/rest_adaptors/rapidpro/adaptors/startFlow.js b/finetuning/datasets/rest_adaptors/rapidpro/adaptors/startFlow.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/rapidpro/adaptors/startFlow.js rename to finetuning/datasets/rest_adaptors/rapidpro/adaptors/startFlow.js diff --git a/services/openfn_llama/datasets/rest_adaptors/rapidpro/adaptors/upsertContact.js b/finetuning/datasets/rest_adaptors/rapidpro/adaptors/upsertContact.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/rapidpro/adaptors/upsertContact.js rename to finetuning/datasets/rest_adaptors/rapidpro/adaptors/upsertContact.js diff --git a/services/openfn_llama/datasets/rest_adaptors/rapidpro/signatures/addContact.d.ts b/finetuning/datasets/rest_adaptors/rapidpro/signatures/addContact.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/rapidpro/signatures/addContact.d.ts rename to finetuning/datasets/rest_adaptors/rapidpro/signatures/addContact.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/rapidpro/signatures/sendBroadcast.d.ts b/finetuning/datasets/rest_adaptors/rapidpro/signatures/sendBroadcast.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/rapidpro/signatures/sendBroadcast.d.ts rename to finetuning/datasets/rest_adaptors/rapidpro/signatures/sendBroadcast.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/rapidpro/signatures/startFlow.d.ts b/finetuning/datasets/rest_adaptors/rapidpro/signatures/startFlow.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/rapidpro/signatures/startFlow.d.ts rename to finetuning/datasets/rest_adaptors/rapidpro/signatures/startFlow.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/rapidpro/signatures/upsertContact.d.ts b/finetuning/datasets/rest_adaptors/rapidpro/signatures/upsertContact.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/rapidpro/signatures/upsertContact.d.ts rename to finetuning/datasets/rest_adaptors/rapidpro/signatures/upsertContact.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/resourcemap/adaptors/submitSite.js b/finetuning/datasets/rest_adaptors/resourcemap/adaptors/submitSite.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/resourcemap/adaptors/submitSite.js rename to finetuning/datasets/rest_adaptors/resourcemap/adaptors/submitSite.js diff --git a/services/openfn_llama/datasets/rest_adaptors/resourcemap/signatures/submitSite.d.ts b/finetuning/datasets/rest_adaptors/resourcemap/signatures/submitSite.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/resourcemap/signatures/submitSite.d.ts rename to finetuning/datasets/rest_adaptors/resourcemap/signatures/submitSite.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/smpp/adaptors/send.js b/finetuning/datasets/rest_adaptors/smpp/adaptors/send.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/smpp/adaptors/send.js rename to finetuning/datasets/rest_adaptors/smpp/adaptors/send.js diff --git a/services/openfn_llama/datasets/rest_adaptors/smpp/signatures/send.d.ts b/finetuning/datasets/rest_adaptors/smpp/signatures/send.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/smpp/signatures/send.d.ts rename to finetuning/datasets/rest_adaptors/smpp/signatures/send.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/telerivet/adaptors/execute.js b/finetuning/datasets/rest_adaptors/telerivet/adaptors/execute.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/telerivet/adaptors/execute.js rename to finetuning/datasets/rest_adaptors/telerivet/adaptors/execute.js diff --git a/services/openfn_llama/datasets/rest_adaptors/telerivet/adaptors/send.js b/finetuning/datasets/rest_adaptors/telerivet/adaptors/send.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/telerivet/adaptors/send.js rename to finetuning/datasets/rest_adaptors/telerivet/adaptors/send.js diff --git a/services/openfn_llama/datasets/rest_adaptors/telerivet/signatures/execute.d.ts b/finetuning/datasets/rest_adaptors/telerivet/signatures/execute.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/telerivet/signatures/execute.d.ts rename to finetuning/datasets/rest_adaptors/telerivet/signatures/execute.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/telerivet/signatures/send.d.ts b/finetuning/datasets/rest_adaptors/telerivet/signatures/send.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/telerivet/signatures/send.d.ts rename to finetuning/datasets/rest_adaptors/telerivet/signatures/send.d.ts diff --git a/services/openfn_llama/datasets/rest_adaptors/zoho/adaptors/addRow.js b/finetuning/datasets/rest_adaptors/zoho/adaptors/addRow.js similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/zoho/adaptors/addRow.js rename to finetuning/datasets/rest_adaptors/zoho/adaptors/addRow.js diff --git a/services/openfn_llama/datasets/rest_adaptors/zoho/signatures/addRow.d.ts b/finetuning/datasets/rest_adaptors/zoho/signatures/addRow.d.ts similarity index 100% rename from services/openfn_llama/datasets/rest_adaptors/zoho/signatures/addRow.d.ts rename to finetuning/datasets/rest_adaptors/zoho/signatures/addRow.d.ts diff --git a/services/openfn_llama/datasets/rest_tests/del.js b/finetuning/datasets/rest_tests/del.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/del.js rename to finetuning/datasets/rest_tests/del.js diff --git a/services/openfn_llama/datasets/rest_tests/del.test.js b/finetuning/datasets/rest_tests/del.test.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/del.test.js rename to finetuning/datasets/rest_tests/del.test.js diff --git a/services/openfn_llama/datasets/rest_tests/get.js b/finetuning/datasets/rest_tests/get.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/get.js rename to finetuning/datasets/rest_tests/get.js diff --git a/services/openfn_llama/datasets/rest_tests/get.test.js b/finetuning/datasets/rest_tests/get.test.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/get.test.js rename to finetuning/datasets/rest_tests/get.test.js diff --git a/services/openfn_llama/datasets/rest_tests/getDrive.agent.js b/finetuning/datasets/rest_tests/getDrive.agent.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/getDrive.agent.js rename to finetuning/datasets/rest_tests/getDrive.agent.js diff --git a/services/openfn_llama/datasets/rest_tests/getDrive.js b/finetuning/datasets/rest_tests/getDrive.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/getDrive.js rename to finetuning/datasets/rest_tests/getDrive.js diff --git a/services/openfn_llama/datasets/rest_tests/getDrive.test.js b/finetuning/datasets/rest_tests/getDrive.test.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/getDrive.test.js rename to finetuning/datasets/rest_tests/getDrive.test.js diff --git a/services/openfn_llama/datasets/rest_tests/post.js b/finetuning/datasets/rest_tests/post.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/post.js rename to finetuning/datasets/rest_tests/post.js diff --git a/services/openfn_llama/datasets/rest_tests/post.test.js b/finetuning/datasets/rest_tests/post.test.js similarity index 100% rename from services/openfn_llama/datasets/rest_tests/post.test.js rename to finetuning/datasets/rest_tests/post.test.js diff --git a/services/openfn_llama/openfn_llama/__init__.py b/finetuning/openfn_llama/__init__.py similarity index 100% rename from services/openfn_llama/openfn_llama/__init__.py rename to finetuning/openfn_llama/__init__.py diff --git a/services/openfn_llama/openfn_llama/finetune.py b/finetuning/openfn_llama/finetune.py similarity index 100% rename from services/openfn_llama/openfn_llama/finetune.py rename to finetuning/openfn_llama/finetune.py diff --git a/services/openfn_llama/openfn_llama/gpt_finetune.py b/finetuning/openfn_llama/gpt_finetune.py similarity index 100% rename from services/openfn_llama/openfn_llama/gpt_finetune.py rename to finetuning/openfn_llama/gpt_finetune.py diff --git a/services/openfn_llama/openfn_llama/inference.py b/finetuning/openfn_llama/inference.py old mode 100755 new mode 100644 similarity index 100% rename from services/openfn_llama/openfn_llama/inference.py rename to finetuning/openfn_llama/inference.py diff --git a/services/openfn_llama/openfn_llama/llama2.py b/finetuning/openfn_llama/llama2.py similarity index 100% rename from services/openfn_llama/openfn_llama/llama2.py rename to finetuning/openfn_llama/llama2.py diff --git a/services/openfn_llama/openfn_llama/main.py b/finetuning/openfn_llama/main.py similarity index 100% rename from services/openfn_llama/openfn_llama/main.py rename to finetuning/openfn_llama/main.py diff --git a/services/openfn_llama/openfn_llama/ngrok.sh b/finetuning/openfn_llama/ngrok.sh similarity index 100% rename from services/openfn_llama/openfn_llama/ngrok.sh rename to finetuning/openfn_llama/ngrok.sh diff --git a/services/openfn_llama/openfn_llama/preprocess.py b/finetuning/openfn_llama/preprocess.py similarity index 100% rename from services/openfn_llama/openfn_llama/preprocess.py rename to finetuning/openfn_llama/preprocess.py diff --git a/services/openfn_llama/openfn_llama/utils/constants.py b/finetuning/openfn_llama/utils/constants.py similarity index 100% rename from services/openfn_llama/openfn_llama/utils/constants.py rename to finetuning/openfn_llama/utils/constants.py diff --git a/services/openfn_llama/openfn_llama/utils/fetch_adaptors.py b/finetuning/openfn_llama/utils/fetch_adaptors.py similarity index 100% rename from services/openfn_llama/openfn_llama/utils/fetch_adaptors.py rename to finetuning/openfn_llama/utils/fetch_adaptors.py diff --git a/services/openfn_llama/openfn_llama/utils/fetch_signatures.py b/finetuning/openfn_llama/utils/fetch_signatures.py similarity index 100% rename from services/openfn_llama/openfn_llama/utils/fetch_signatures.py rename to finetuning/openfn_llama/utils/fetch_signatures.py diff --git a/services/openfn_llama/openfn_llama/utils/prompts.py b/finetuning/openfn_llama/utils/prompts.py similarity index 100% rename from services/openfn_llama/openfn_llama/utils/prompts.py rename to finetuning/openfn_llama/utils/prompts.py diff --git a/services/openfn_llama/openfn_llama/utils/schemas.py b/finetuning/openfn_llama/utils/schemas.py similarity index 100% rename from services/openfn_llama/openfn_llama/utils/schemas.py rename to finetuning/openfn_llama/utils/schemas.py diff --git a/services/openfn_llama/openfn_llama/utils/utils.py b/finetuning/openfn_llama/utils/utils.py similarity index 100% rename from services/openfn_llama/openfn_llama/utils/utils.py rename to finetuning/openfn_llama/utils/utils.py diff --git a/services/openfn_llama/pyproject.toml b/finetuning/pyproject.toml similarity index 100% rename from services/openfn_llama/pyproject.toml rename to finetuning/pyproject.toml diff --git a/services/openfn_llama/run.sh b/finetuning/run.sh old mode 100755 new mode 100644 similarity index 100% rename from services/openfn_llama/run.sh rename to finetuning/run.sh diff --git a/services/signature_generator/en_core_web_sm-3.7.1-py3-none-any.whl b/models/en_core_web_sm-3.7.1-py3-none-any.whl similarity index 100% rename from services/signature_generator/en_core_web_sm-3.7.1-py3-none-any.whl rename to models/en_core_web_sm-3.7.1-py3-none-any.whl diff --git a/package.json b/package.json new file mode 100644 index 0000000..04aae3d --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "apollo", + "module": "platform/index.ts", + "version": "0.1.0", + "type": "module", + "scripts": { + "start": "NODE_ENV=production bun platform/src/index.ts", + "dev": "bun --watch platform/src/index.ts", + "build": "bun build platform/src/index.ts", + "test": "bun test platform/test ", + "py": "poetry run python services/entry.py " + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@elysiajs/html": "^1.0.2", + "elysia": "^1.0.13", + "node-calls-python": "1.9.1", + "node-gyp": "^10.1.0" + }, + "trustedDependencies": [ + "node-calls-python" + ], + "nodemonConfig": { + "watch": ["platform/src", "services"], + "ext": "ts, py" + } +} \ No newline at end of file diff --git a/platform/src/bridge.ts b/platform/src/bridge.ts new file mode 100644 index 0000000..054742c --- /dev/null +++ b/platform/src/bridge.ts @@ -0,0 +1,57 @@ +// node-python bridge +import { $ } from "bun"; +import { interpreter as py } from "node-calls-python"; +import path from "node:path"; + +// Use the major.minor python version to find the local poetry venv +// see https://github.com/OpenFn/gen/issues/45 +const PYTHON_VERSION = "3.11"; + +const allowReimport = process.env.NODE_ENV !== "production"; + +if (allowReimport) { + console.log( + "Running server in dev mode. Python scripts will be re-loaded on every call." + ); +} + +export const run = async (scriptName: string, args: JSON) => { + try { + // poetry should be configured to use a vnv in the local filesystem + // This makes it really easy to tell node-calls-python about the right env! + // IMPORTANT: if the python version changes, this path needs to be manually updated! + py.addImportPath( + path.resolve(`.venv/lib/python${PYTHON_VERSION}/site-packages`) + ); + py.addImportPath(path.resolve("services")); + + if (allowReimport) { + // In production, only import a module once + // But in dev, re-import every time + py.reimport("/services/"); + } + + // import from a top level entry point + const pymodule = await py.import( + path.resolve(`./services/entry.py`), + allowReimport + ); + + const result = await py.call(pymodule, "main", [scriptName, args]); + return result; + } catch (e) { + // Note that the error coming out will be a string with no stack trace :( + console.log(e); + } +}; + +// Try to dynamically lookup the python version +// This is super unreliable - we're actually better +// off witha hard-coded value +const lookupPythonVersion = async () => { + // TOOD what is the python executable? + // Is this even what poetry is using? + const version = await $`python3 --version`.text(); // absolutely sick, unbelievable + // this is too hard - is there a better way to do it? + return version.replace("Python ", "").split(".").slice(0, 2).join("."); +}; diff --git a/platform/src/index.ts b/platform/src/index.ts new file mode 100644 index 0000000..380787e --- /dev/null +++ b/platform/src/index.ts @@ -0,0 +1,3 @@ +import start from "./server"; + +start(process.env.PORT); diff --git a/platform/src/middleware/dir.tsx b/platform/src/middleware/dir.tsx new file mode 100644 index 0000000..1ee1416 --- /dev/null +++ b/platform/src/middleware/dir.tsx @@ -0,0 +1,51 @@ +import { Elysia } from "elysia"; +import path from "node:path"; +import describeModules, { type ModuleDescription } from "../util/describe-modules"; + + +/** + * TODO + * + * - sort services alphabetically + * - link to (and serve!) readme + * - include the first section of the readme in the listing (basic formattitng). Maybe show first sentence + expand? + */ + +/** + * Generates a listing of the available services + */ +export default async (app: Elysia) => { + // jsx templates! + // https://elysiajs.com/patterns/mvc.html#view + + const modules = await describeModules(path.resolve("./services")); + app.get("/", () => { + return ( + + + OpenFn Apollo Service Listing + + +

OpenFn Apollo Service Listing

+
+
    + {modules.map((m) => service(m))} +
+
+
+ © Open Function Group {new Date().getUTCFullYear()} +
+ + + ); + }); +}; + +function service(srv: ModuleDescription) { + return
  • +

    {srv.name} README

    +

    + {srv.summary} +

    +
  • +} \ No newline at end of file diff --git a/platform/src/middleware/services.ts b/platform/src/middleware/services.ts new file mode 100644 index 0000000..f1a72cc --- /dev/null +++ b/platform/src/middleware/services.ts @@ -0,0 +1,31 @@ +// middleware to route to python services +import { Elysia } from "elysia"; +import path from "node:path"; + +import { run } from "../bridge"; +import describeModules from "../util/describe-modules"; + +export default async (app: Elysia) => { + console.log("Loading routes:"); + const modules = await describeModules(path.resolve("./services")); + app.group("/services", (app) => { + modules.forEach(({ name, readme }) => { + console.log(" - mounted /services/" + name); + app.post(name, async (ctx) => { + // Note that elysia handles json parsing for me - neat! + const payload = ctx.body; + const result = await run(name, payload as any); + + // elysia will also stringify and set the headers if I return json + return result; + }); + + // TODO: it would be lovely to render the markdown into nice rich html + app.get(`/${name}/README.md`, async (ctx) => readme); + }); + + return app; + }); + + return app; +}; diff --git a/platform/src/server.ts b/platform/src/server.ts new file mode 100644 index 0000000..5837e47 --- /dev/null +++ b/platform/src/server.ts @@ -0,0 +1,17 @@ +import { Elysia } from "elysia"; + +import setupDir from "./middleware/dir"; +import setupServices from "./middleware/services"; +import { html } from "@elysiajs/html"; + +export const app = new Elysia(); + +app.use(html()); + +setupDir(app); +await setupServices(app); + +export default (port: number | string = 3000) => { + console.log("Apollo Server listening on ", port); + app.listen(port); +}; diff --git a/platform/src/util/describe-modules.ts b/platform/src/util/describe-modules.ts new file mode 100644 index 0000000..cdb16b3 --- /dev/null +++ b/platform/src/util/describe-modules.ts @@ -0,0 +1,56 @@ +import { readFile, readdir } from "node:fs/promises"; // no bun api yet + +export type ModuleDescription = { + name: string; + + // TODO - pull out metadata from each + summary?: string; + readme?: string; +}; + +// TODO this is just a stub right now +export default async (location: string): Promise => { + const dirs = await readdir(location, { withFileTypes: true }); + const services = dirs.filter( + (dirent) => dirent.isDirectory() && !dirent.name.startsWith("_") + ); + + const result: ModuleDescription[] = []; + for (const srv of services) { + const s: ModuleDescription = { + name: srv.name, + }; + try { + const rm = await readFile(`${location}/${srv.name}/README.md`, "utf8"); + + const lines = rm.split("\n"); + // for a summary, find the first non-empty, non-title line + let summary = ""; + for (const l of lines) { + if (l.length && !l.startsWith("#")) { + summary += " " + l; + } else if (summary) { + break; + } + } + + s.readme = rm; + s.summary = summary; + } catch (e) { + s.readme = "No readme file found for this service"; + s.summary = "Service description not available"; + } + + result.push(s); + } + + return result.sort((a, b) => { + if (a.name > b.name) { + return 1; + } + if (a.name < b.name) { + return -1; + } + return 0; + }); +}; diff --git a/platform/test/fixtures/services/echo/README.md b/platform/test/fixtures/services/echo/README.md new file mode 100644 index 0000000..f842eaf --- /dev/null +++ b/platform/test/fixtures/services/echo/README.md @@ -0,0 +1,10 @@ +# Echo + +This is a test "echo" service. It is dumb as rocks and this line must break onto +the next line. + +This is a detail section which should be excluded from the summary + +## Other stuff + +This should basically be ingored diff --git a/platform/test/fixtures/services/echo/echo.py b/platform/test/fixtures/services/echo/echo.py new file mode 100644 index 0000000..399740c --- /dev/null +++ b/platform/test/fixtures/services/echo/echo.py @@ -0,0 +1,2 @@ +def main(x): + return x \ No newline at end of file diff --git a/platform/test/fixtures/services/hello/hello.py b/platform/test/fixtures/services/hello/hello.py new file mode 100644 index 0000000..1b6a48b --- /dev/null +++ b/platform/test/fixtures/services/hello/hello.py @@ -0,0 +1,2 @@ +def main(): + return "hello world" \ No newline at end of file diff --git a/app/__init__.py b/platform/test/fixtures/services/ignore.py similarity index 100% rename from app/__init__.py rename to platform/test/fixtures/services/ignore.py diff --git a/platform/test/server.test.ts b/platform/test/server.test.ts new file mode 100644 index 0000000..7d308e2 --- /dev/null +++ b/platform/test/server.test.ts @@ -0,0 +1,56 @@ +import { describe, expect, it } from "bun:test"; +import { app } from "../src/server"; + +const port = 9865; + +const baseUrl = `http://localhost:${port}`; + +app.listen(port); + +const get = (path: string) => { + return new Request(`${baseUrl}/${path}`); +}; + +const post = (path: string, data: any) => { + return new Request(`${baseUrl}/${path}`, { + method: "POST", + body: typeof data === "string" ? data : JSON.stringify(data), + headers: { + "Content-Type": `application/${ + typeof data === "string" ? "text" : "json" + }`, + }, + }); +}; + +// I am not sure how appropriate unit tests are going to be here - but we'll add a few! +describe("Main server", () => { + it("return 200 at root", async () => { + const response = await app.handle(get("")); + + const status = response.status; + + expect(status).toBe(200); + }); +}); + +// It won't be appropriate at all to unit test many of these +// but we can use the test echo service at least +describe("Python Services", () => { + describe("Python echo", () => { + it("returns a 200", async () => { + const json = { x: 1 }; + const response = await app.handle(post("services/echo", json)); + + expect(response.status).toBe(200); + }); + + it("echoes back an object", async () => { + const json = { x: 1 }; + const response = await app.handle(post("services/echo", json)); + + const text = await response.json(); + expect(text).toEqual(json); + }); + }); +}); diff --git a/platform/test/util/describe-modules.test.ts b/platform/test/util/describe-modules.test.ts new file mode 100644 index 0000000..c98c88d --- /dev/null +++ b/platform/test/util/describe-modules.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, it } from "bun:test"; +import path from "node:path"; +import findModules from "../../src/util/describe-modules"; + +describe("utils.findModules", () => { + it("returns a list of folders, ignoring names and underscores", async () => { + const fixtures = path.resolve("./platform/test/fixtures/services"); + const list = await findModules(fixtures); + + const orderedNames = list.map((s) => s.name); + + expect(orderedNames).toEqual(["echo", "hello"]); + }); + + it("includes the readme content", async () => { + const fixtures = path.resolve("./platform/test/fixtures/services"); + const [echo] = await findModules(fixtures); + + const readme = Bun.file(`${fixtures}/echo/README.md`); + const content = await readme.text(); + + expect(echo.readme).toEqual(content); + }); + + it("includes a summary of the readme", async () => { + const fixtures = path.resolve("./platform/test/fixtures/services"); + const [echo] = await findModules(fixtures); + + expect(echo.summary).toEqual( + ' This is a test "echo" service. It is dumb as rocks and this line must break onto the next line.' + ); + }); +}); diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..28653ef --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2278 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[[package]] +name = "anyio" +version = "4.3.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "black" +version = "24.4.2" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blis" +version = "0.7.11" +description = "The Blis BLAS-like linear algebra library, as a self-contained C-extension." +optional = false +python-versions = "*" +files = [ + {file = "blis-0.7.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd5fba34c5775e4c440d80e4dea8acb40e2d3855b546e07c4e21fad8f972404c"}, + {file = "blis-0.7.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:31273d9086cab9c56986d478e3ed6da6752fa4cdd0f7b5e8e5db30827912d90d"}, + {file = "blis-0.7.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d06883f83d4c8de8264154f7c4a420b4af323050ed07398c1ff201c34c25c0d2"}, + {file = "blis-0.7.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee493683e3043650d4413d531e79e580d28a3c7bdd184f1b9cfa565497bda1e7"}, + {file = "blis-0.7.11-cp310-cp310-win_amd64.whl", hash = "sha256:a73945a9d635eea528bccfdfcaa59dd35bd5f82a4a40d5ca31f08f507f3a6f81"}, + {file = "blis-0.7.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1b68df4d01d62f9adaef3dad6f96418787265a6878891fc4e0fabafd6d02afba"}, + {file = "blis-0.7.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:162e60d941a8151418d558a94ee5547cb1bbeed9f26b3b6f89ec9243f111a201"}, + {file = "blis-0.7.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:686a7d0111d5ba727cd62f374748952fd6eb74701b18177f525b16209a253c01"}, + {file = "blis-0.7.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0421d6e44cda202b113a34761f9a062b53f8c2ae8e4ec8325a76e709fca93b6e"}, + {file = "blis-0.7.11-cp311-cp311-win_amd64.whl", hash = "sha256:0dc9dcb3843045b6b8b00432409fd5ee96b8344a324e031bfec7303838c41a1a"}, + {file = "blis-0.7.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dadf8713ea51d91444d14ad4104a5493fa7ecc401bbb5f4a203ff6448fadb113"}, + {file = "blis-0.7.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5bcdaf370f03adaf4171d6405a89fa66cb3c09399d75fc02e1230a78cd2759e4"}, + {file = "blis-0.7.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7de19264b1d49a178bf8035406d0ae77831f3bfaa3ce02942964a81a202abb03"}, + {file = "blis-0.7.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea55c6a4a60fcbf6a0fdce40df6e254451ce636988323a34b9c94b583fc11e5"}, + {file = "blis-0.7.11-cp312-cp312-win_amd64.whl", hash = "sha256:5a305dbfc96d202a20d0edd6edf74a406b7e1404f4fa4397d24c68454e60b1b4"}, + {file = "blis-0.7.11-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:68544a1cbc3564db7ba54d2bf8988356b8c7acd025966e8e9313561b19f0fe2e"}, + {file = "blis-0.7.11-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:075431b13b9dd7b411894d4afbd4212acf4d0f56c5a20628f4b34902e90225f1"}, + {file = "blis-0.7.11-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:324fdf62af9075831aa62b51481960e8465674b7723f977684e32af708bb7448"}, + {file = "blis-0.7.11-cp36-cp36m-win_amd64.whl", hash = "sha256:afebdb02d2dcf9059f23ce1244585d3ce7e95c02a77fd45a500e4a55b7b23583"}, + {file = "blis-0.7.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2e62cd14b20e960f21547fee01f3a0b2ac201034d819842865a667c969c355d1"}, + {file = "blis-0.7.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b01c05a5754edc0b9a3b69be52cbee03f645b2ec69651d12216ea83b8122f0"}, + {file = "blis-0.7.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfee5ec52ba1e9002311d9191f7129d7b0ecdff211e88536fb24c865d102b50d"}, + {file = "blis-0.7.11-cp37-cp37m-win_amd64.whl", hash = "sha256:844b6377e3e7f3a2e92e7333cc644095386548ad5a027fdc150122703c009956"}, + {file = "blis-0.7.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6df00c24128e323174cde5d80ebe3657df39615322098ce06613845433057614"}, + {file = "blis-0.7.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:809d1da1331108935bf06e22f3cf07ef73a41a572ecd81575bdedb67defe3465"}, + {file = "blis-0.7.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bfabd5272bbbe504702b8dfe30093653d278057656126716ff500d9c184b35a6"}, + {file = "blis-0.7.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca684f5c2f05269f17aefe7812360286e9a1cee3afb96d416485efd825dbcf19"}, + {file = "blis-0.7.11-cp38-cp38-win_amd64.whl", hash = "sha256:688a8b21d2521c2124ee8dfcbaf2c385981ccc27e313e052113d5db113e27d3b"}, + {file = "blis-0.7.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2ff7abd784033836b284ff9f4d0d7cb0737b7684daebb01a4c9fe145ffa5a31e"}, + {file = "blis-0.7.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9caffcd14795bfe52add95a0dd8426d44e737b55fcb69e2b797816f4da0b1d2"}, + {file = "blis-0.7.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fb36989ed61233cfd48915896802ee6d3d87882190000f8cfe0cf4a3819f9a8"}, + {file = "blis-0.7.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ea09f961871f880d5dc622dce6c370e4859559f0ead897ae9b20ddafd6b07a2"}, + {file = "blis-0.7.11-cp39-cp39-win_amd64.whl", hash = "sha256:5bb38adabbb22f69f22c74bad025a010ae3b14de711bf5c715353980869d491d"}, + {file = "blis-0.7.11.tar.gz", hash = "sha256:cec6d48f75f7ac328ae1b6fbb372dde8c8a57c89559172277f66e01ff08d4d42"}, +] + +[package.dependencies] +numpy = {version = ">=1.19.0", markers = "python_version >= \"3.9\""} + +[[package]] +name = "catalogue" +version = "2.0.10" +description = "Super lightweight function registries for your library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "catalogue-2.0.10-py3-none-any.whl", hash = "sha256:58c2de0020aa90f4a2da7dfad161bf7b3b054c86a5f09fcedc0b2b740c109a9f"}, + {file = "catalogue-2.0.10.tar.gz", hash = "sha256:4f56daa940913d3f09d589c191c74e5a6d51762b3a9e37dd53b7437afd6cda15"}, +] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cloudpathlib" +version = "0.16.0" +description = "pathlib-style classes for cloud storage services." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cloudpathlib-0.16.0-py3-none-any.whl", hash = "sha256:f46267556bf91f03db52b5df7a152548596a15aabca1c8731ef32b0b25a1a6a3"}, + {file = "cloudpathlib-0.16.0.tar.gz", hash = "sha256:cdfcd35d46d529587d744154a0bdf962aca953b725c8784cd2ec478354ea63a3"}, +] + +[package.extras] +all = ["cloudpathlib[azure]", "cloudpathlib[gs]", "cloudpathlib[s3]"] +azure = ["azure-storage-blob (>=12)"] +gs = ["google-cloud-storage"] +s3 = ["boto3"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "confection" +version = "0.1.4" +description = "The sweetest config system for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "confection-0.1.4-py3-none-any.whl", hash = "sha256:a658818d004939069c3e2b3db74a2cb9d956a5e61a1c9ad61788e0ee09a7090f"}, + {file = "confection-0.1.4.tar.gz", hash = "sha256:e80f22fd008b5231a2e8852fac6de9e28f2276a04031d0536cff74fe4a990c8f"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.0.0" +srsly = ">=2.4.0,<3.0.0" + +[[package]] +name = "cymem" +version = "2.0.8" +description = "Manage calls to calloc/free through Cython" +optional = false +python-versions = "*" +files = [ + {file = "cymem-2.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77b5d3a73c41a394efd5913ab7e48512054cd2dabb9582d489535456641c7666"}, + {file = "cymem-2.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bd33da892fb560ba85ea14b1528c381ff474048e861accc3366c8b491035a378"}, + {file = "cymem-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29a551eda23eebd6d076b855f77a5ed14a1d1cae5946f7b3cb5de502e21b39b0"}, + {file = "cymem-2.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8260445652ae5ab19fff6851f32969a7b774f309162e83367dd0f69aac5dbf7"}, + {file = "cymem-2.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:a63a2bef4c7e0aec7c9908bca0a503bf91ac7ec18d41dd50dc7dff5d994e4387"}, + {file = "cymem-2.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b84b780d52cb2db53d4494fe0083c4c5ee1f7b5380ceaea5b824569009ee5bd"}, + {file = "cymem-2.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d5f83dc3cb5a39f0e32653cceb7c8ce0183d82f1162ca418356f4a8ed9e203e"}, + {file = "cymem-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ac218cf8a43a761dc6b2f14ae8d183aca2bbb85b60fe316fd6613693b2a7914"}, + {file = "cymem-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42c993589d1811ec665d37437d5677b8757f53afadd927bf8516ac8ce2d3a50c"}, + {file = "cymem-2.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:ab3cf20e0eabee9b6025ceb0245dadd534a96710d43fb7a91a35e0b9e672ee44"}, + {file = "cymem-2.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cb51fddf1b920abb1f2742d1d385469bc7b4b8083e1cfa60255e19bc0900ccb5"}, + {file = "cymem-2.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9235957f8c6bc2574a6a506a1687164ad629d0b4451ded89d49ebfc61b52660c"}, + {file = "cymem-2.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2cc38930ff5409f8d61f69a01e39ecb185c175785a1c9bec13bcd3ac8a614ba"}, + {file = "cymem-2.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bf49e3ea2c441f7b7848d5c61b50803e8cbd49541a70bb41ad22fce76d87603"}, + {file = "cymem-2.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:ecd12e3bacf3eed5486e4cd8ede3c12da66ee0e0a9d0ae046962bc2bb503acef"}, + {file = "cymem-2.0.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:167d8019db3b40308aabf8183fd3fbbc256323b645e0cbf2035301058c439cd0"}, + {file = "cymem-2.0.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17cd2c2791c8f6b52f269a756ba7463f75bf7265785388a2592623b84bb02bf8"}, + {file = "cymem-2.0.8-cp36-cp36m-win_amd64.whl", hash = "sha256:6204f0a3307bf45d109bf698ba37997ce765f21e359284328e4306c7500fcde8"}, + {file = "cymem-2.0.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9c05db55ea338648f8e5f51dd596568c7f62c5ae32bf3fa5b1460117910ebae"}, + {file = "cymem-2.0.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ce641f7ba0489bd1b42a4335a36f38c8507daffc29a512681afaba94a0257d2"}, + {file = "cymem-2.0.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6b83a5972a64f62796118da79dfeed71f4e1e770b2b7455e889c909504c2358"}, + {file = "cymem-2.0.8-cp37-cp37m-win_amd64.whl", hash = "sha256:ada6eb022e4a0f4f11e6356a5d804ceaa917174e6cf33c0b3e371dbea4dd2601"}, + {file = "cymem-2.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e593cd57e2e19eb50c7ddaf7e230b73c890227834425b9dadcd4a86834ef2ab"}, + {file = "cymem-2.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d513f0d5c6d76facdc605e42aa42c8d50bb7dedca3144ec2b47526381764deb0"}, + {file = "cymem-2.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e370dd54359101b125bfb191aca0542718077b4edb90ccccba1a28116640fed"}, + {file = "cymem-2.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84f8c58cde71b8fc7024883031a4eec66c0a9a4d36b7850c3065493652695156"}, + {file = "cymem-2.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:6a6edddb30dd000a27987fcbc6f3c23b7fe1d74f539656952cb086288c0e4e29"}, + {file = "cymem-2.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b896c83c08dadafe8102a521f83b7369a9c5cc3e7768eca35875764f56703f4c"}, + {file = "cymem-2.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a4f8f2bfee34f6f38b206997727d29976666c89843c071a968add7d61a1e8024"}, + {file = "cymem-2.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7372e2820fa66fd47d3b135f3eb574ab015f90780c3a21cfd4809b54f23a4723"}, + {file = "cymem-2.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4e57bee56d35b90fc2cba93e75b2ce76feaca05251936e28a96cf812a1f5dda"}, + {file = "cymem-2.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ceeab3ce2a92c7f3b2d90854efb32cb203e78cb24c836a5a9a2cac221930303b"}, + {file = "cymem-2.0.8.tar.gz", hash = "sha256:8fb09d222e21dcf1c7e907dc85cf74501d4cea6c4ed4ac6c9e016f98fb59cbbf"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "en-core-web-sm" +version = "3.7.1" +description = "English pipeline optimized for CPU. Components: tok2vec, tagger, parser, senter, ner, attribute_ruler, lemmatizer." +optional = false +python-versions = "*" +files = [ + {file = "en_core_web_sm-3.7.1-py3-none-any.whl", hash = "sha256:86cc141f63942d4b2c5fcee06630fd6f904788d2f0ab005cce45aadb8fb73889"}, +] + +[package.dependencies] +spacy = ">=3.7.2,<3.8.0" + +[package.source] +type = "file" +url = "models/en_core_web_sm-3.7.1-py3-none-any.whl" + +[[package]] +name = "fastapi" +version = "0.110.3" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"}, + {file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "filelock" +version = "3.14.0" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, + {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "fsspec" +version = "2024.3.1" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, + {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.22.2" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.22.2-py3-none-any.whl", hash = "sha256:3429e25f38ccb834d310804a3b711e7e4953db5a9e420cc147a5e194ca90fd17"}, + {file = "huggingface_hub-0.22.2.tar.gz", hash = "sha256:32e9a9a6843c92f253ff9ca16b9985def4d80a93fb357af5353f770ef74a81be"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "intel-openmp" +version = "2021.4.0" +description = "Intel OpenMP* Runtime Library" +optional = false +python-versions = "*" +files = [ + {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, +] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "langcodes" +version = "3.4.0" +description = "Tools for labeling human languages with IETF language tags" +optional = false +python-versions = ">=3.8" +files = [ + {file = "langcodes-3.4.0-py3-none-any.whl", hash = "sha256:10a4cc078b8e8937d8485d3352312a0a89a3125190db9f2bb2074250eef654e9"}, + {file = "langcodes-3.4.0.tar.gz", hash = "sha256:ae5a77d1a01d0d1e91854a671890892b7ce9abb601ab7327fc5c874f899e1979"}, +] + +[package.dependencies] +language-data = ">=1.2" + +[package.extras] +build = ["build", "twine"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "language-data" +version = "1.2.0" +description = "Supplementary data about languages used by the langcodes module" +optional = false +python-versions = "*" +files = [ + {file = "language_data-1.2.0-py3-none-any.whl", hash = "sha256:77d5cab917f91ee0b2f1aa7018443e911cf8985ef734ca2ba3940770f6a3816b"}, + {file = "language_data-1.2.0.tar.gz", hash = "sha256:82a86050bbd677bfde87d97885b17566cfe75dad3ac4f5ce44b52c28f752e773"}, +] + +[package.dependencies] +marisa-trie = ">=0.7.7" + +[package.extras] +build = ["build", "twine"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "marisa-trie" +version = "1.1.0" +description = "Static memory-efficient and fast Trie-like structures for Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "marisa-trie-1.1.0.tar.gz", hash = "sha256:5bf43ed0cf36af4578fe7b034cf95f532439766516680e4bd603723611ebd56b"}, + {file = "marisa_trie-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed1b37ef1444083ab11e15d9150861874d8dd7be70c8899eccf1b986d37823a5"}, + {file = "marisa_trie-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:119366f9db9f53242439f69c3d49a3f1a3912970bc29b9af6ed9b6d0b7ef8c9e"}, + {file = "marisa_trie-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6964bfa23af502591094712e79886974a631d8047eb72cdf646babc62b03ae5e"}, + {file = "marisa_trie-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab8ec133daabb288e832d448fdff2e71756e7ba5ea7ff1b7b7645b010b2c23ac"}, + {file = "marisa_trie-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61a52a0e5ef404bfdcc2117cd39cb572595ff01f73f27feb5fc9e92889adbae0"}, + {file = "marisa_trie-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9ce60c2ed4f4138ef78e346d43b105185977c6be7bce0609b48bb14092110612"}, + {file = "marisa_trie-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3b90a422eb660bd111ffe54290bfbabf98a30fccfe8a594a512b3ba81fda8aa5"}, + {file = "marisa_trie-1.1.0-cp310-cp310-win32.whl", hash = "sha256:6b92cd77787aeb92fd815a5ad00d4828f528d30032c1314d5f17571afe125cbe"}, + {file = "marisa_trie-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:d415c11aada47f7f4afb818ce92e46c8f1b55611d325c09df7070088cfaa24bb"}, + {file = "marisa_trie-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:68a71ebb12498ad82e1579f41efe52c91839d92c0823a79389924057094c0a68"}, + {file = "marisa_trie-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1de6df9686175feb48f1e271a9252f6bf7ce1a4669a5bab3a97dffb8b11b13e6"}, + {file = "marisa_trie-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:789374ab88afe9e8ecfbd03a213f7b11fbefb3a8286c8fad88a2da0d7e5e0ef9"}, + {file = "marisa_trie-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0f1b05f7dcde6ca2b460126519a37707fde53808b9e29e6d5b44de737262104"}, + {file = "marisa_trie-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312e414001e5777506f459fa3032c3a5827e80a32babfd44ab528dd0fb824e61"}, + {file = "marisa_trie-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:571f68432d3dbf06b715cbb6aed1eed9898c149619045d65e6d82407d4eb4c9e"}, + {file = "marisa_trie-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1d98fe7da386c7f789526d8cf0b824b87fa1019e52619f8ad5e877912cc0f71"}, + {file = "marisa_trie-1.1.0-cp311-cp311-win32.whl", hash = "sha256:953400c8d7639349df9ef3f899f67c158852416a0470e7221fb06f19e3b1d0f6"}, + {file = "marisa_trie-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:c423e651daec5931371fa3d480fb5ac59164ed7dea968d8f51b1ba369bac4975"}, + {file = "marisa_trie-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9f4a37a17b9a551d1678b909c44841109b9979d12e72a9ed6e922a51f41889f1"}, + {file = "marisa_trie-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bbc118727474d710851db69d2762b4a3936ad1d2ffebb519c3f8f42a925fa118"}, + {file = "marisa_trie-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8c74557386eb62ce6526a9d0ad44410530e973feee5e0cabebf57b4d72696b2a"}, + {file = "marisa_trie-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4af7893ffc7099b68fd9d667fecc50d38e3e49405fcd6be97bc5ec72816ffa2"}, + {file = "marisa_trie-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:690eb9af9c0f4c677b74077843d0afafd08e543cdb3905b8a354aa0b0a2c06c3"}, + {file = "marisa_trie-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7e1771bedce1d9c37931c5efffac23aaed32f1364b99420673fa9417a0b5a6f1"}, + {file = "marisa_trie-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:38a64b1b4cbab19c23cfabed654c99e072af1c574f54b57ededd81357382d679"}, + {file = "marisa_trie-1.1.0-cp312-cp312-win32.whl", hash = "sha256:92cfb535174d711c3dbb3a9f3bbbd5abd180e778cd8ba2839a34565294c33190"}, + {file = "marisa_trie-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9f0cd1d11f7f7022a044a32a59632f18af91ee31fa84ff98c914cb5b9fae449d"}, + {file = "marisa_trie-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1d95308e0453302706d5246935beb9e3255c20238a633d0637b3d345de428aa3"}, + {file = "marisa_trie-1.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dbff54cf950dccc8bded31ad130571330efd1d6849fbcc7825e62ac5063bd0a"}, + {file = "marisa_trie-1.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c14e494b28f78f806f5320f02b8625770d598bff0a4ea45f825f55257efcaf52"}, + {file = "marisa_trie-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2484e83b9c233b337f45bb09740a74aeb510081856cdd4b293b48b970c710c1d"}, + {file = "marisa_trie-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f661d79e5fef5c38ab41fd5a16c29f8bd9d46a0de6c407b88ebbf24c7637ac84"}, + {file = "marisa_trie-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:5998b16395cefd76c52ce8cae35b837254ff097d3a357023f592218ff9d2112b"}, + {file = "marisa_trie-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0b5d97515d9d65f237049ba01d385455fe5cc8dfb9c97b4a5b976382b9aff6c1"}, + {file = "marisa_trie-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4407e7ec82cdb501015188f1895bbdcac1a5ecb0e5ecc5cbbba028d5940499f2"}, + {file = "marisa_trie-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de62a115afd157fe6cfc8e4194905605c4603c6664eac30788f3f6866b67345f"}, + {file = "marisa_trie-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7e17abb08ada031c86835e358242b6a2dc6645e1a872e30e1ce1c1b1cd6317d"}, + {file = "marisa_trie-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac288cb48e09927d96d00f4b2ad7bbfad91ce2e20fc6e6bb8b61dda05dbc28d2"}, + {file = "marisa_trie-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da0d59b93a327d772b49d9a79ef11f2e1c23aaafcefeab95376447794318d189"}, + {file = "marisa_trie-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d810f95a548751484bd57cfe5940ea5423d4e39678a10c9582b3f102fac27bbe"}, + {file = "marisa_trie-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:521a954dd469a336e3c8a307f7fe7ba272032d77cc8f801edebf2d11549ac1c2"}, + {file = "marisa_trie-1.1.0-cp38-cp38-win32.whl", hash = "sha256:1b25422875673ca5a15e236f2158f6a277f7252057272bb0b51272f4a9d3c401"}, + {file = "marisa_trie-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c80b85559e09ec7f69b9f623ea06fd5cfe25ead20bb4a09c20e879cd1851db35"}, + {file = "marisa_trie-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:844a56eebe32b098b6d97af28bfa9ca576400b5560be8a09c021a521faadee4a"}, + {file = "marisa_trie-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:917ef793e0e90bd01fc436cebf93707de1ac31f2feadc4d4b0ddbdb9522617d5"}, + {file = "marisa_trie-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e09cb17288a5a43431e23737d2d91bd54e6d694380740267960dbc7ab96ad69d"}, + {file = "marisa_trie-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5353d3c8c48524aac40c325794d6227c59e517a68746d3a0524608a20438a1e9"}, + {file = "marisa_trie-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d4dd18d1c67a949eeaba16385ab2c1a3e1eb7a2acb982c3744193a59df30cfd"}, + {file = "marisa_trie-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4a9a17507211700c77849d1caf4e6a64756536e491327cda3ea12259ce70eae5"}, + {file = "marisa_trie-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6699b0d3ca090172713bfbb9ef8063bfe27cae8d05121d5f71d1c4048b57936d"}, + {file = "marisa_trie-1.1.0-cp39-cp39-win32.whl", hash = "sha256:b4450a4917af45614edc3da1ab1b927b96de01e5742719c330e6d4a0e36fee7d"}, + {file = "marisa_trie-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:89ba0ba6a05683d1ea966afe7aeae114d13fd8f354c6692a90bc2b181657ccbf"}, + {file = "marisa_trie-1.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:10665a17a7965c2a49b2dda6beb14cf206f6932f013ca0337105a8744d67395d"}, + {file = "marisa_trie-1.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86365aac6dde7228b0090d0e993f3ed557a43111cbe3b397f1bad77febbab342"}, + {file = "marisa_trie-1.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:086d7c2b45b03185c70431450e7b92e76d3f3333074bf9b3aabb2eb6e1b85f89"}, + {file = "marisa_trie-1.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9e5450eb023bf7a232cdaaf18fbe67fe45ed724d5cb30dd35f48c3a723ad3a4f"}, + {file = "marisa_trie-1.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:206db942691d82310cdb6c59e34acbe648766ddb569c13de8b534e17892c608c"}, + {file = "marisa_trie-1.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e12de8aea7fde90b4128bb8340a99cfb4a55e4c41b6336d187660e899385"}, + {file = "marisa_trie-1.1.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8652141e4623b36017275a6ae6efe7a2ece3b304b984d4f66acb620a78eed9"}, + {file = "marisa_trie-1.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7916ddd3cf621a20285256e4e5e5e7e6c86aa29356faa31cc8de535b8b71afe3"}, + {file = "marisa_trie-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c57f2d6caa71829973a18b80c70b422337328686d3c7ea4519082f0b291fa01"}, + {file = "marisa_trie-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd45429b25098034a9ca2fc78877e3edc9d59f88ca8b3c69cff5f299c728d771"}, + {file = "marisa_trie-1.1.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71ee2edb2574b87a2173d64dd3f79c8e1af2e8d7bd1469bdcfe5fd895ada913a"}, + {file = "marisa_trie-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:427ce824566382309a300a8d080a84ccf6795325204c834839bdcb41203591f4"}, + {file = "marisa_trie-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37fcb2265d73a5c04829b25af7cdf819a27d71a898a6e1b54822e006f1843c94"}, + {file = "marisa_trie-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b34ea73a92c35577171bf9d8216e6c57acdf08b77b5d84f1efad8cf721159da"}, + {file = "marisa_trie-1.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fdd7445f2f2785c02c18d46acf0c14baffafa6e7e73b3e9052b512e1f7dadbb3"}, + {file = "marisa_trie-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e0f4c47fca455bd75cab9e2181138d3978721ed546e2ed18e83b0852c49eca4f"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +test = ["hypothesis", "pytest", "readme-renderer"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "mkl" +version = "2021.4.0" +description = "Intel® oneAPI Math Kernel Library" +optional = false +python-versions = "*" +files = [ + {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, + {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, + {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, +] + +[package.dependencies] +intel-openmp = "==2021.*" +tbb = "==2021.*" + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "murmurhash" +version = "1.0.10" +description = "Cython bindings for MurmurHash" +optional = false +python-versions = ">=3.6" +files = [ + {file = "murmurhash-1.0.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e90eef568adca5e17a91f96975e9a782ace3a617bbb3f8c8c2d917096e9bfeb"}, + {file = "murmurhash-1.0.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f8ecb00cc1ab57e4b065f9fb3ea923b55160c402d959c69a0b6dbbe8bc73efc3"}, + {file = "murmurhash-1.0.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3310101004d9e2e0530c2fed30174448d998ffd1b50dcbfb7677e95db101aa4b"}, + {file = "murmurhash-1.0.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65401a6f1778676253cbf89c1f45a8a7feb7d73038e483925df7d5943c08ed9"}, + {file = "murmurhash-1.0.10-cp310-cp310-win_amd64.whl", hash = "sha256:f23f2dfc7174de2cdc5007c0771ab8376a2a3f48247f32cac4a5563e40c6adcc"}, + {file = "murmurhash-1.0.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90ed37ee2cace9381b83d56068334f77e3e30bc521169a1f886a2a2800e965d6"}, + {file = "murmurhash-1.0.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:22e9926fdbec9d24ced9b0a42f0fee68c730438be3cfb00c2499fd495caec226"}, + {file = "murmurhash-1.0.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54bfbfd68baa99717239b8844600db627f336a08b1caf4df89762999f681cdd1"}, + {file = "murmurhash-1.0.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b9d200a09d48ef67f6840b77c14f151f2b6c48fd69661eb75c7276ebdb146c"}, + {file = "murmurhash-1.0.10-cp311-cp311-win_amd64.whl", hash = "sha256:e5d7cfe392c0a28129226271008e61e77bf307afc24abf34f386771daa7b28b0"}, + {file = "murmurhash-1.0.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:96f0a070344d4802ea76a160e0d4c88b7dc10454d2426f48814482ba60b38b9e"}, + {file = "murmurhash-1.0.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9f61862060d677c84556610ac0300a0776cb13cb3155f5075ed97e80f86e55d9"}, + {file = "murmurhash-1.0.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3b6d2d877d8881a08be66d906856d05944be0faf22b9a0390338bcf45299989"}, + {file = "murmurhash-1.0.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f54b0031d8696fed17ed6e9628f339cdea0ba2367ca051e18ff59193f52687"}, + {file = "murmurhash-1.0.10-cp312-cp312-win_amd64.whl", hash = "sha256:97e09d675de2359e586f09de1d0de1ab39f9911edffc65c9255fb5e04f7c1f85"}, + {file = "murmurhash-1.0.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b64e5332932993fef598e78d633b1ba664789ab73032ed511f3dc615a631a1a"}, + {file = "murmurhash-1.0.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e2a38437a8497e082408aa015c6d90554b9e00c2c221fdfa79728a2d99a739e"}, + {file = "murmurhash-1.0.10-cp36-cp36m-win_amd64.whl", hash = "sha256:55f4e4f9291a53c36070330950b472d72ba7d331e4ce3ce1ab349a4f458f7bc4"}, + {file = "murmurhash-1.0.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:16ef9f0855952493fe08929d23865425906a8c0c40607ac8a949a378652ba6a9"}, + {file = "murmurhash-1.0.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cc3351ae92b89c2fcdc6e41ac6f17176dbd9b3554c96109fd0713695d8663e7"}, + {file = "murmurhash-1.0.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6559fef7c2e7349a42a63549067709b656d6d1580752bd76be1541d8b2d65718"}, + {file = "murmurhash-1.0.10-cp37-cp37m-win_amd64.whl", hash = "sha256:8bf49e3bb33febb7057ae3a5d284ef81243a1e55eaa62bdcd79007cddbdc0461"}, + {file = "murmurhash-1.0.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f1605fde07030516eb63d77a598dd164fb9bf217fd937dbac588fe7e47a28c40"}, + {file = "murmurhash-1.0.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4904f7e68674a64eb2b08823c72015a5e14653e0b4b109ea00c652a005a59bad"}, + {file = "murmurhash-1.0.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0438f0cb44cf1cd26251f72c1428213c4197d40a4e3f48b1efc3aea12ce18517"}, + {file = "murmurhash-1.0.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db1171a3f9a10571931764cdbfaa5371f4cf5c23c680639762125cb075b833a5"}, + {file = "murmurhash-1.0.10-cp38-cp38-win_amd64.whl", hash = "sha256:1c9fbcd7646ad8ba67b895f71d361d232c6765754370ecea473dd97d77afe99f"}, + {file = "murmurhash-1.0.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7024ab3498434f22f8e642ae31448322ad8228c65c8d9e5dc2d563d57c14c9b8"}, + {file = "murmurhash-1.0.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a99dedfb7f0cc5a4cd76eb409ee98d3d50eba024f934e705914f6f4d765aef2c"}, + {file = "murmurhash-1.0.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b580b8503647de5dd7972746b7613ea586270f17ac92a44872a9b1b52c36d68"}, + {file = "murmurhash-1.0.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75840212bf75eb1352c946c3cf1622dacddd6d6bdda34368237d1eb3568f23a"}, + {file = "murmurhash-1.0.10-cp39-cp39-win_amd64.whl", hash = "sha256:a4209962b9f85de397c3203ea4b3a554da01ae9fd220fdab38757d4e9eba8d1a"}, + {file = "murmurhash-1.0.10.tar.gz", hash = "sha256:5282aab1317804c6ebd6dd7f69f15ba9075aee671c44a34be2bde0f1b11ef88a"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.20.5" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + +[[package]] +name = "openai" +version = "1.25.0" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.25.0-py3-none-any.whl", hash = "sha256:d0cfdf6afb31a5dabf3b95966cb31f3c757a0edaf3228715409cb404b9933de0"}, + {file = "openai-1.25.0.tar.gz", hash = "sha256:22c35b26b8281cd2759b1a4c05ac99e2f2b26a9df71f90a0b4ddb75aa27adc81"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "platformdirs" +version = "4.2.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, + {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + +[[package]] +name = "preshed" +version = "3.0.9" +description = "Cython hash table that trusts the keys are pre-hashed" +optional = false +python-versions = ">=3.6" +files = [ + {file = "preshed-3.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f96ef4caf9847b2bb9868574dcbe2496f974e41c2b83d6621c24fb4c3fc57e3"}, + {file = "preshed-3.0.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a61302cf8bd30568631adcdaf9e6b21d40491bd89ba8ebf67324f98b6c2a2c05"}, + {file = "preshed-3.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99499e8a58f58949d3f591295a97bca4e197066049c96f5d34944dd21a497193"}, + {file = "preshed-3.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea6b6566997dc3acd8c6ee11a89539ac85c77275b4dcefb2dc746d11053a5af8"}, + {file = "preshed-3.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:bfd523085a84b1338ff18f61538e1cfcdedc4b9e76002589a301c364d19a2e36"}, + {file = "preshed-3.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7c2364da27f2875524ce1ca754dc071515a9ad26eb5def4c7e69129a13c9a59"}, + {file = "preshed-3.0.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182138033c0730c683a6d97e567ceb8a3e83f3bff5704f300d582238dbd384b3"}, + {file = "preshed-3.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:345a10be3b86bcc6c0591d343a6dc2bfd86aa6838c30ced4256dfcfa836c3a64"}, + {file = "preshed-3.0.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51d0192274aa061699b284f9fd08416065348edbafd64840c3889617ee1609de"}, + {file = "preshed-3.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:96b857d7a62cbccc3845ac8c41fd23addf052821be4eb987f2eb0da3d8745aa1"}, + {file = "preshed-3.0.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4fe6720012c62e6d550d6a5c1c7ad88cacef8388d186dad4bafea4140d9d198"}, + {file = "preshed-3.0.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e04f05758875be9751e483bd3c519c22b00d3b07f5a64441ec328bb9e3c03700"}, + {file = "preshed-3.0.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a55091d0e395f1fdb62ab43401bb9f8b46c7d7794d5b071813c29dc1ab22fd0"}, + {file = "preshed-3.0.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7de8f5138bcac7870424e09684dc3dd33c8e30e81b269f6c9ede3d8c7bb8e257"}, + {file = "preshed-3.0.9-cp312-cp312-win_amd64.whl", hash = "sha256:24229c77364628743bc29c5620c5d6607ed104f0e02ae31f8a030f99a78a5ceb"}, + {file = "preshed-3.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73b0f7ecc58095ebbc6ca26ec806008ef780190fe685ce471b550e7eef58dc2"}, + {file = "preshed-3.0.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cb90ecd5bec71c21d95962db1a7922364d6db2abe284a8c4b196df8bbcc871e"}, + {file = "preshed-3.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:e304a0a8c9d625b70ba850c59d4e67082a6be9c16c4517b97850a17a282ebee6"}, + {file = "preshed-3.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1fa6d3d5529b08296ff9b7b4da1485c080311fd8744bbf3a86019ff88007b382"}, + {file = "preshed-3.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1e5173809d85edd420fc79563b286b88b4049746b797845ba672cf9435c0e7"}, + {file = "preshed-3.0.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fe81eb21c7d99e8b9a802cc313b998c5f791bda592903c732b607f78a6b7dc4"}, + {file = "preshed-3.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:78590a4a952747c3766e605ce8b747741005bdb1a5aa691a18aae67b09ece0e6"}, + {file = "preshed-3.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3452b64d97ce630e200c415073040aa494ceec6b7038f7a2a3400cbd7858e952"}, + {file = "preshed-3.0.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ac970d97b905e9e817ec13d31befd5b07c9cfec046de73b551d11a6375834b79"}, + {file = "preshed-3.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eebaa96ece6641cd981491cba995b68c249e0b6877c84af74971eacf8990aa19"}, + {file = "preshed-3.0.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d473c5f6856e07a88d41fe00bb6c206ecf7b34c381d30de0b818ba2ebaf9406"}, + {file = "preshed-3.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:0de63a560f10107a3f0a9e252cc3183b8fdedcb5f81a86938fd9f1dcf8a64adf"}, + {file = "preshed-3.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3a9ad9f738084e048a7c94c90f40f727217387115b2c9a95c77f0ce943879fcd"}, + {file = "preshed-3.0.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a671dfa30b67baa09391faf90408b69c8a9a7f81cb9d83d16c39a182355fbfce"}, + {file = "preshed-3.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23906d114fc97c17c5f8433342495d7562e96ecfd871289c2bb2ed9a9df57c3f"}, + {file = "preshed-3.0.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:778cf71f82cedd2719b256f3980d556d6fb56ec552334ba79b49d16e26e854a0"}, + {file = "preshed-3.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:a6e579439b329eb93f32219ff27cb358b55fbb52a4862c31a915a098c8a22ac2"}, + {file = "preshed-3.0.9.tar.gz", hash = "sha256:721863c5244ffcd2651ad0928951a2c7c77b102f4e11a251ad85d37ee7621660"}, +] + +[package.dependencies] +cymem = ">=2.0.2,<2.1.0" +murmurhash = ">=0.28.0,<1.1.0" + +[[package]] +name = "pydantic" +version = "2.7.1" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, + {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.2" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, + {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, + {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, + {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, + {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, + {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, + {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, + {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, + {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, + {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, + {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, + {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, + {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, + {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "regex" +version = "2024.4.28" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea"}, + {file = "regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d"}, + {file = "regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f"}, + {file = "regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630"}, + {file = "regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6"}, + {file = "regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17"}, + {file = "regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150"}, + {file = "regex-2024.4.28-cp38-cp38-win32.whl", hash = "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58"}, + {file = "regex-2024.4.28-cp38-cp38-win_amd64.whl", hash = "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1"}, + {file = "regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc"}, + {file = "regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962"}, + {file = "regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "safetensors" +version = "0.4.3" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "safetensors-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd"}, + {file = "safetensors-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb4f8c5d0358a31e9a08daeebb68f5e161cdd4018855426d3f0c23bb51087055"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a5319ef409e7f88686a46607cbc3c428271069d8b770076feaf913664a07ac"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb9c65bd82f9ef3ce4970dc19ee86be5f6f93d032159acf35e663c6bea02b237"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edb5698a7bc282089f64c96c477846950358a46ede85a1c040e0230344fdde10"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efcc860be094b8d19ac61b452ec635c7acb9afa77beb218b1d7784c6d41fe8ad"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88b33980222085dd6001ae2cad87c6068e0991d4f5ccf44975d216db3b57376"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5fc6775529fb9f0ce2266edd3e5d3f10aab068e49f765e11f6f2a63b5367021d"}, + {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9c6ad011c1b4e3acff058d6b090f1da8e55a332fbf84695cf3100c649cc452d1"}, + {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c496c5401c1b9c46d41a7688e8ff5b0310a3b9bae31ce0f0ae870e1ea2b8caf"}, + {file = "safetensors-0.4.3-cp310-none-win32.whl", hash = "sha256:38e2a8666178224a51cca61d3cb4c88704f696eac8f72a49a598a93bbd8a4af9"}, + {file = "safetensors-0.4.3-cp310-none-win_amd64.whl", hash = "sha256:393e6e391467d1b2b829c77e47d726f3b9b93630e6a045b1d1fca67dc78bf632"}, + {file = "safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a"}, + {file = "safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8c5093206ef4b198600ae484230402af6713dab1bd5b8e231905d754022bec7"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0b2104df1579d6ba9052c0ae0e3137c9698b2d85b0645507e6fd1813b70931a"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cf18888606dad030455d18f6c381720e57fc6a4170ee1966adb7ebc98d4d6a3"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:585c9ae13a205807b63bef8a37994f30c917ff800ab8a1ca9c9b5d73024f97ee"}, + {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faefeb3b81bdfb4e5a55b9bbdf3d8d8753f65506e1d67d03f5c851a6c87150e9"}, + {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:befdf0167ad626f22f6aac6163477fcefa342224a22f11fdd05abb3995c1783c"}, + {file = "safetensors-0.4.3-cp311-none-win32.whl", hash = "sha256:a7cef55929dcbef24af3eb40bedec35d82c3c2fa46338bb13ecf3c5720af8a61"}, + {file = "safetensors-0.4.3-cp311-none-win_amd64.whl", hash = "sha256:840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67"}, + {file = "safetensors-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:22d21760dc6ebae42e9c058d75aa9907d9f35e38f896e3c69ba0e7b213033856"}, + {file = "safetensors-0.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d22c1a10dff3f64d0d68abb8298a3fd88ccff79f408a3e15b3e7f637ef5c980"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1648568667f820b8c48317c7006221dc40aced1869908c187f493838a1362bc"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:446e9fe52c051aeab12aac63d1017e0f68a02a92a027b901c4f8e931b24e5397"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fef5d70683643618244a4f5221053567ca3e77c2531e42ad48ae05fae909f542"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a1f4430cc0c9d6afa01214a4b3919d0a029637df8e09675ceef1ca3f0dfa0df"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d603846a8585b9432a0fd415db1d4c57c0f860eb4aea21f92559ff9902bae4d"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a844cdb5d7cbc22f5f16c7e2a0271170750763c4db08381b7f696dbd2c78a361"}, + {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:88887f69f7a00cf02b954cdc3034ffb383b2303bc0ab481d4716e2da51ddc10e"}, + {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ee463219d9ec6c2be1d331ab13a8e0cd50d2f32240a81d498266d77d07b7e71e"}, + {file = "safetensors-0.4.3-cp312-none-win32.whl", hash = "sha256:d0dd4a1db09db2dba0f94d15addc7e7cd3a7b0d393aa4c7518c39ae7374623c3"}, + {file = "safetensors-0.4.3-cp312-none-win_amd64.whl", hash = "sha256:d14d30c25897b2bf19b6fb5ff7e26cc40006ad53fd4a88244fdf26517d852dd7"}, + {file = "safetensors-0.4.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d1456f814655b224d4bf6e7915c51ce74e389b413be791203092b7ff78c936dd"}, + {file = "safetensors-0.4.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:455d538aa1aae4a8b279344a08136d3f16334247907b18a5c3c7fa88ef0d3c46"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf476bca34e1340ee3294ef13e2c625833f83d096cfdf69a5342475602004f95"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02ef3a24face643456020536591fbd3c717c5abaa2737ec428ccbbc86dffa7a4"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7de32d0d34b6623bb56ca278f90db081f85fb9c5d327e3c18fd23ac64f465768"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a0deb16a1d3ea90c244ceb42d2c6c276059616be21a19ac7101aa97da448faf"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c59d51f182c729f47e841510b70b967b0752039f79f1de23bcdd86462a9b09ee"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f598b713cc1a4eb31d3b3203557ac308acf21c8f41104cdd74bf640c6e538e3"}, + {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5757e4688f20df083e233b47de43845d1adb7e17b6cf7da5f8444416fc53828d"}, + {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fe746d03ed8d193674a26105e4f0fe6c726f5bb602ffc695b409eaf02f04763d"}, + {file = "safetensors-0.4.3-cp37-none-win32.whl", hash = "sha256:0d5ffc6a80f715c30af253e0e288ad1cd97a3d0086c9c87995e5093ebc075e50"}, + {file = "safetensors-0.4.3-cp37-none-win_amd64.whl", hash = "sha256:a11c374eb63a9c16c5ed146457241182f310902bd2a9c18255781bb832b6748b"}, + {file = "safetensors-0.4.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1e31be7945f66be23f4ec1682bb47faa3df34cb89fc68527de6554d3c4258a4"}, + {file = "safetensors-0.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:03a4447c784917c9bf01d8f2ac5080bc15c41692202cd5f406afba16629e84d6"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d244bcafeb1bc06d47cfee71727e775bca88a8efda77a13e7306aae3813fa7e4"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53c4879b9c6bd7cd25d114ee0ef95420e2812e676314300624594940a8d6a91f"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74707624b81f1b7f2b93f5619d4a9f00934d5948005a03f2c1845ffbfff42212"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d52c958dc210265157573f81d34adf54e255bc2b59ded6218500c9b15a750eb"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9568f380f513a60139971169c4a358b8731509cc19112369902eddb33faa4d"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9cd8e1560dfc514b6d7859247dc6a86ad2f83151a62c577428d5102d872721"}, + {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:89f9f17b0dacb913ed87d57afbc8aad85ea42c1085bd5de2f20d83d13e9fc4b2"}, + {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1139eb436fd201c133d03c81209d39ac57e129f5e74e34bb9ab60f8d9b726270"}, + {file = "safetensors-0.4.3-cp38-none-win32.whl", hash = "sha256:d9c289f140a9ae4853fc2236a2ffc9a9f2d5eae0cb673167e0f1b8c18c0961ac"}, + {file = "safetensors-0.4.3-cp38-none-win_amd64.whl", hash = "sha256:622afd28968ef3e9786562d352659a37de4481a4070f4ebac883f98c5836563e"}, + {file = "safetensors-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8651c7299cbd8b4161a36cd6a322fa07d39cd23535b144d02f1c1972d0c62f3c"}, + {file = "safetensors-0.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e375d975159ac534c7161269de24ddcd490df2157b55c1a6eeace6cbb56903f0"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084fc436e317f83f7071fc6a62ca1c513b2103db325cd09952914b50f51cf78f"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41a727a7f5e6ad9f1db6951adee21bbdadc632363d79dc434876369a17de6ad6"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7dbbde64b6c534548696808a0e01276d28ea5773bc9a2dfb97a88cd3dffe3df"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbae3b4b9d997971431c346edbfe6e41e98424a097860ee872721e176040a893"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e4b22e3284cd866edeabe4f4d896229495da457229408d2e1e4810c5187121"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dd37306546b58d3043eb044c8103a02792cc024b51d1dd16bd3dd1f334cb3ed"}, + {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8815b5e1dac85fc534a97fd339e12404db557878c090f90442247e87c8aeaea"}, + {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e011cc162503c19f4b1fd63dfcddf73739c7a243a17dac09b78e57a00983ab35"}, + {file = "safetensors-0.4.3-cp39-none-win32.whl", hash = "sha256:01feb3089e5932d7e662eda77c3ecc389f97c0883c4a12b5cfdc32b589a811c3"}, + {file = "safetensors-0.4.3-cp39-none-win_amd64.whl", hash = "sha256:3f9cdca09052f585e62328c1c2923c70f46814715c795be65f0b93f57ec98a02"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1b89381517891a7bb7d1405d828b2bf5d75528299f8231e9346b8eba092227f9"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cd6fff9e56df398abc5866b19a32124815b656613c1c5ec0f9350906fd798aac"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840caf38d86aa7014fe37ade5d0d84e23dcfbc798b8078015831996ecbc206a3"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9650713b2cfa9537a2baf7dd9fee458b24a0aaaa6cafcea8bdd5fb2b8efdc34"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4119532cd10dba04b423e0f86aecb96cfa5a602238c0aa012f70c3a40c44b50"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e066e8861eef6387b7c772344d1fe1f9a72800e04ee9a54239d460c400c72aab"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90964917f5b0fa0fa07e9a051fbef100250c04d150b7026ccbf87a34a54012e0"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c41e1893d1206aa7054029681778d9a58b3529d4c807002c156d58426c225173"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae7613a119a71a497d012ccc83775c308b9c1dab454806291427f84397d852fd"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9bac020faba7f5dc481e881b14b6425265feabb5bfc552551d21189c0eddc3"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:420a98f593ff9930f5822560d14c395ccbc57342ddff3b463bc0b3d6b1951550"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f5e6883af9a68c0028f70a4c19d5a6ab6238a379be36ad300a22318316c00cb0"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cdd0a3b5da66e7f377474599814dbf5cbf135ff059cc73694de129b58a5e8a2c"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9bfb92f82574d9e58401d79c70c716985dc049b635fef6eecbb024c79b2c46ad"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3615a96dd2dcc30eb66d82bc76cda2565f4f7bfa89fcb0e31ba3cea8a1a9ecbb"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:868ad1b6fc41209ab6bd12f63923e8baeb1a086814cb2e81a65ed3d497e0cf8f"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffba80aa49bd09195145a7fd233a7781173b422eeb995096f2b30591639517"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0acbe31340ab150423347e5b9cc595867d814244ac14218932a5cf1dd38eb39"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19bbdf95de2cf64f25cd614c5236c8b06eb2cfa47cbf64311f4b5d80224623a3"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b852e47eb08475c2c1bd8131207b405793bfc20d6f45aff893d3baaad449ed14"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d07cbca5b99babb692d76d8151bec46f461f8ad8daafbfd96b2fca40cadae65"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ab6527a20586d94291c96e00a668fa03f86189b8a9defa2cdd34a1a01acc7d5"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02318f01e332cc23ffb4f6716e05a492c5f18b1d13e343c49265149396284a44"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4b52ce9a396260eb9731eb6aea41a7320de22ed73a1042c2230af0212758ce"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:018b691383026a2436a22b648873ed11444a364324e7088b99cd2503dd828400"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:309b10dbcab63269ecbf0e2ca10ce59223bb756ca5d431ce9c9eeabd446569da"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b277482120df46e27a58082df06a15aebda4481e30a1c21eefd0921ae7e03f65"}, + {file = "safetensors-0.4.3.tar.gz", hash = "sha256:2f85fc50c4e07a21e95c24e07460fe6f7e2859d0ce88092838352b798ce711c2"}, +] + +[package.extras] +all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] +dev = ["safetensors[all]"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] +mlx = ["mlx (>=0.0.9)"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] +pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"] +torch = ["safetensors[numpy]", "torch (>=1.10)"] + +[[package]] +name = "setuptools" +version = "69.5.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "smart-open" +version = "6.4.0" +description = "Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...)" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "smart_open-6.4.0-py3-none-any.whl", hash = "sha256:8d3ef7e6997e8e42dd55c74166ed21e6ac70664caa32dd940b26d54a8f6b4142"}, + {file = "smart_open-6.4.0.tar.gz", hash = "sha256:be3c92c246fbe80ebce8fbacb180494a481a77fcdcb7c1aadb2ea5b9c2bee8b9"}, +] + +[package.extras] +all = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "paramiko", "requests"] +azure = ["azure-common", "azure-core", "azure-storage-blob"] +gcs = ["google-cloud-storage (>=2.6.0)"] +http = ["requests"] +s3 = ["boto3"] +ssh = ["paramiko"] +test = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "paramiko", "pytest", "pytest-rerunfailures", "requests", "responses"] +webhdfs = ["requests"] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "spacy" +version = "3.7.4" +description = "Industrial-strength Natural Language Processing (NLP) in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "spacy-3.7.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0f748625192f573c07ddea5fcd324919dbfbf4f4a2f7a1fc731e6dcba7321ea1"}, + {file = "spacy-3.7.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6288dca7b3a5489b3d7ce68404bc432ca22f826c662a12af47ef7bdb264307fb"}, + {file = "spacy-3.7.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef59db99b12a72d2646be3888d87f94c59e11cd07adc2f50a8130e83f07eb1cf"}, + {file = "spacy-3.7.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f07477a4027711c22b3865e78dc9076335c03fcf318a6736159bf07e2a923125"}, + {file = "spacy-3.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:787ce42a837f7edfbd4185356eea893a81b7dd75743d0047f2b9bf179775f970"}, + {file = "spacy-3.7.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e82b9da21853d4aee46811804dc7e136895f087fda25c7585172d95eb9b70833"}, + {file = "spacy-3.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07ffedf51899441070fb70432f8f873696f39e0e31c9ce7403101c459f8a1281"}, + {file = "spacy-3.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba57bcc111eca7b086ee33a9636df775cfd4b14302f7d0ffbc11e95ac0fb3f0e"}, + {file = "spacy-3.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7580d1565f4d1ccbee9a18531f993a5b9b37ced96f145153dd4e98ceec607a55"}, + {file = "spacy-3.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:df99c6f0085b1ec8e88beb5fd96d4371cef6fc19c202c41fc4fadc2afd55a157"}, + {file = "spacy-3.7.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b982ebab417189346acb4722637c573830d62e157ba336c3eb6c417249344be1"}, + {file = "spacy-3.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e7c29e152d8ea060af60da9410fa8ef038f3c9068a206905ee5c704de78f6e87"}, + {file = "spacy-3.7.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:023c9a008328f55c4717c56c4f8a28073b9961547f7d38a9405c967a52e66d59"}, + {file = "spacy-3.7.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1969d3d0fd0c811b7485438460f0ae8cfe16d46b54bcb8d1c26e70914e67e3d"}, + {file = "spacy-3.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:040f7df5096c817450820eaaa426d54ed266254d16974e9a707a32f5b0f139ae"}, + {file = "spacy-3.7.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6757e8fbfd35dc0ed830296d5756f46d5b8d4b0353925dbe2f9aa33b82c5308"}, + {file = "spacy-3.7.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c500c1bad9e0488814a75077089aeef64a6b520ae8131578f266a08168106fa3"}, + {file = "spacy-3.7.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c992e2c5c0cd06c7f3e74fe8d758885117090013931c7938277d1421660bf71f"}, + {file = "spacy-3.7.4-cp37-cp37m-win_amd64.whl", hash = "sha256:2463c56ab1378f2b9a675340a2e3dfb618989d0da8cdce06429bc9b1dad4f294"}, + {file = "spacy-3.7.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b43e92edfa99f34dbb9dd30175f41158d20945e3179055d0071fee19394add96"}, + {file = "spacy-3.7.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c26a81d33c93e4a8e3360d61dcce0802fb886de79f666a487ea5abbd3ce4b30b"}, + {file = "spacy-3.7.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d7910ca7a91bf423febd8a9a10ca6a4cfcb5c99abdec79df1eb7b67ea3e3c90"}, + {file = "spacy-3.7.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b16768b9e5c350b8a383a6bd84cd0481ccdf10ae6231f568598890638065f69"}, + {file = "spacy-3.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:ed99fb176979b1e3cf6830161f8e881beae54e80147b05fca31d9a67cb12fbca"}, + {file = "spacy-3.7.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ca8112330982dbeef125cc5eb40e0349493055835a0ebe29028a0953a25d8522"}, + {file = "spacy-3.7.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:977f37493d7cf0b5dca155f0450d47890378703283c29919cdcc220db994a775"}, + {file = "spacy-3.7.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ad5e931c294d100ec3edb40e40f2722ef505cea16312839dd6467e81d665740"}, + {file = "spacy-3.7.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11ebf6054cd3ec3638801d7ff9b709e32fb9c15512b347b489bfe2ccb1102c9f"}, + {file = "spacy-3.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:f5b930753027ac599f70bb7e77d6a2256191fe582e6f3f0cd624d88f6c279fa4"}, + {file = "spacy-3.7.4.tar.gz", hash = "sha256:525f2ced2e40761562c8cace93ef6a1e6e8c483f27bd564bc1b15f608efbe85b"}, +] + +[package.dependencies] +catalogue = ">=2.0.6,<2.1.0" +cymem = ">=2.0.2,<2.1.0" +jinja2 = "*" +langcodes = ">=3.2.0,<4.0.0" +murmurhash = ">=0.28.0,<1.1.0" +numpy = {version = ">=1.19.0", markers = "python_version >= \"3.9\""} +packaging = ">=20.0" +preshed = ">=3.0.2,<3.1.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.0.0" +requests = ">=2.13.0,<3.0.0" +setuptools = "*" +smart-open = ">=5.2.1,<7.0.0" +spacy-legacy = ">=3.0.11,<3.1.0" +spacy-loggers = ">=1.0.0,<2.0.0" +srsly = ">=2.4.3,<3.0.0" +thinc = ">=8.2.2,<8.3.0" +tqdm = ">=4.38.0,<5.0.0" +typer = ">=0.3.0,<0.10.0" +wasabi = ">=0.9.1,<1.2.0" +weasel = ">=0.1.0,<0.4.0" + +[package.extras] +apple = ["thinc-apple-ops (>=0.1.0.dev0,<1.0.0)"] +cuda = ["cupy (>=5.0.0b4,<13.0.0)"] +cuda-autodetect = ["cupy-wheel (>=11.0.0,<13.0.0)"] +cuda100 = ["cupy-cuda100 (>=5.0.0b4,<13.0.0)"] +cuda101 = ["cupy-cuda101 (>=5.0.0b4,<13.0.0)"] +cuda102 = ["cupy-cuda102 (>=5.0.0b4,<13.0.0)"] +cuda110 = ["cupy-cuda110 (>=5.0.0b4,<13.0.0)"] +cuda111 = ["cupy-cuda111 (>=5.0.0b4,<13.0.0)"] +cuda112 = ["cupy-cuda112 (>=5.0.0b4,<13.0.0)"] +cuda113 = ["cupy-cuda113 (>=5.0.0b4,<13.0.0)"] +cuda114 = ["cupy-cuda114 (>=5.0.0b4,<13.0.0)"] +cuda115 = ["cupy-cuda115 (>=5.0.0b4,<13.0.0)"] +cuda116 = ["cupy-cuda116 (>=5.0.0b4,<13.0.0)"] +cuda117 = ["cupy-cuda117 (>=5.0.0b4,<13.0.0)"] +cuda11x = ["cupy-cuda11x (>=11.0.0,<13.0.0)"] +cuda12x = ["cupy-cuda12x (>=11.5.0,<13.0.0)"] +cuda80 = ["cupy-cuda80 (>=5.0.0b4,<13.0.0)"] +cuda90 = ["cupy-cuda90 (>=5.0.0b4,<13.0.0)"] +cuda91 = ["cupy-cuda91 (>=5.0.0b4,<13.0.0)"] +cuda92 = ["cupy-cuda92 (>=5.0.0b4,<13.0.0)"] +ja = ["sudachidict-core (>=20211220)", "sudachipy (>=0.5.2,!=0.6.1)"] +ko = ["natto-py (>=0.9.0)"] +lookups = ["spacy-lookups-data (>=1.0.3,<1.1.0)"] +th = ["pythainlp (>=2.0)"] +transformers = ["spacy-transformers (>=1.1.2,<1.4.0)"] + +[[package]] +name = "spacy-legacy" +version = "3.0.12" +description = "Legacy registered functions for spaCy backwards compatibility" +optional = false +python-versions = ">=3.6" +files = [ + {file = "spacy-legacy-3.0.12.tar.gz", hash = "sha256:b37d6e0c9b6e1d7ca1cf5bc7152ab64a4c4671f59c85adaf7a3fcb870357a774"}, + {file = "spacy_legacy-3.0.12-py2.py3-none-any.whl", hash = "sha256:476e3bd0d05f8c339ed60f40986c07387c0a71479245d6d0f4298dbd52cda55f"}, +] + +[[package]] +name = "spacy-loggers" +version = "1.0.5" +description = "Logging utilities for SpaCy" +optional = false +python-versions = ">=3.6" +files = [ + {file = "spacy-loggers-1.0.5.tar.gz", hash = "sha256:d60b0bdbf915a60e516cc2e653baeff946f0cfc461b452d11a4d5458c6fe5f24"}, + {file = "spacy_loggers-1.0.5-py3-none-any.whl", hash = "sha256:196284c9c446cc0cdb944005384270d775fdeaf4f494d8e269466cfa497ef645"}, +] + +[[package]] +name = "srsly" +version = "2.4.8" +description = "Modern high-performance serialization utilities for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "srsly-2.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:17f3bcb418bb4cf443ed3d4dcb210e491bd9c1b7b0185e6ab10b6af3271e63b2"}, + {file = "srsly-2.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b070a58e21ab0e878fd949f932385abb4c53dd0acb6d3a7ee75d95d447bc609"}, + {file = "srsly-2.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98286d20014ed2067ad02b0be1e17c7e522255b188346e79ff266af51a54eb33"}, + {file = "srsly-2.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18685084e2e0cc47c25158cbbf3e44690e494ef77d6418c2aae0598c893f35b0"}, + {file = "srsly-2.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:980a179cbf4eb5bc56f7507e53f76720d031bcf0cef52cd53c815720eb2fc30c"}, + {file = "srsly-2.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5472ed9f581e10c32e79424c996cf54c46c42237759f4224806a0cd4bb770993"}, + {file = "srsly-2.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:50f10afe9230072c5aad9f6636115ea99b32c102f4c61e8236d8642c73ec7a13"}, + {file = "srsly-2.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c994a89ba247a4d4f63ef9fdefb93aa3e1f98740e4800d5351ebd56992ac75e3"}, + {file = "srsly-2.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7ed4a0c20fa54d90032be32f9c656b6d75445168da78d14fe9080a0c208ad"}, + {file = "srsly-2.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:7a919236a090fb93081fbd1cec030f675910f3863825b34a9afbcae71f643127"}, + {file = "srsly-2.4.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7583c03d114b4478b7a357a1915305163e9eac2dfe080da900555c975cca2a11"}, + {file = "srsly-2.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:94ccdd2f6db824c31266aaf93e0f31c1c43b8bc531cd2b3a1d924e3c26a4f294"}, + {file = "srsly-2.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db72d2974f91aee652d606c7def98744ca6b899bd7dd3009fd75ebe0b5a51034"}, + {file = "srsly-2.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a60c905fd2c15e848ce1fc315fd34d8a9cc72c1dee022a0d8f4c62991131307"}, + {file = "srsly-2.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:e0b8d5722057000694edf105b8f492e7eb2f3aa6247a5f0c9170d1e0d074151c"}, + {file = "srsly-2.4.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:196b4261f9d6372d1d3d16d1216b90c7e370b4141471322777b7b3c39afd1210"}, + {file = "srsly-2.4.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4750017e6d78590b02b12653e97edd25aefa4734281386cc27501d59b7481e4e"}, + {file = "srsly-2.4.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa034cd582ba9e4a120c8f19efa263fcad0f10fc481e73fb8c0d603085f941c4"}, + {file = "srsly-2.4.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5a78ab9e9d177ee8731e950feb48c57380036d462b49e3fb61a67ce529ff5f60"}, + {file = "srsly-2.4.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:087e36439af517e259843df93eb34bb9e2d2881c34fa0f541589bcfbc757be97"}, + {file = "srsly-2.4.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad141d8a130cb085a0ed3a6638b643e2b591cb98a4591996780597a632acfe20"}, + {file = "srsly-2.4.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d05367b2571c0d08d00459636b951e3ca2a1e9216318c157331f09c33489d3"}, + {file = "srsly-2.4.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3fd661a1c4848deea2849b78f432a70c75d10968e902ca83c07c89c9b7050ab8"}, + {file = "srsly-2.4.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec37233fe39af97b00bf20dc2ceda04d39b9ea19ce0ee605e16ece9785e11f65"}, + {file = "srsly-2.4.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2fd4bc081f1d6a6063396b6d97b00d98e86d9d3a3ac2949dba574a84e148080"}, + {file = "srsly-2.4.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7347cff1eb4ef3fc335d9d4acc89588051b2df43799e5d944696ef43da79c873"}, + {file = "srsly-2.4.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9dc1da5cc94d77056b91ba38365c72ae08556b6345bef06257c7e9eccabafe"}, + {file = "srsly-2.4.8-cp38-cp38-win_amd64.whl", hash = "sha256:dc0bf7b6f23c9ecb49ec0924dc645620276b41e160e9b283ed44ca004c060d79"}, + {file = "srsly-2.4.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ff8df21d00d73c371bead542cefef365ee87ca3a5660de292444021ff84e3b8c"}, + {file = "srsly-2.4.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ac3e340e65a9fe265105705586aa56054dc3902789fcb9a8f860a218d6c0a00"}, + {file = "srsly-2.4.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d1733f4275eff4448e96521cc7dcd8fdabd68ba9b54ca012dcfa2690db2644"}, + {file = "srsly-2.4.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be5b751ad88fdb58fb73871d456248c88204f213aaa3c9aab49b6a1802b3fa8d"}, + {file = "srsly-2.4.8-cp39-cp39-win_amd64.whl", hash = "sha256:822a38b8cf112348f3accbc73274a94b7bf82515cb14a85ba586d126a5a72851"}, + {file = "srsly-2.4.8.tar.gz", hash = "sha256:b24d95a65009c2447e0b49cda043ac53fecf4f09e358d87a57446458f91b8a91"}, +] + +[package.dependencies] +catalogue = ">=2.0.3,<2.1.0" + +[[package]] +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tbb" +version = "2021.12.0" +description = "Intel® oneAPI Threading Building Blocks (oneTBB)" +optional = false +python-versions = "*" +files = [ + {file = "tbb-2021.12.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:f2cc9a7f8ababaa506cbff796ce97c3bf91062ba521e15054394f773375d81d8"}, + {file = "tbb-2021.12.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:a925e9a7c77d3a46ae31c34b0bb7f801c4118e857d137b68f68a8e458fcf2bd7"}, + {file = "tbb-2021.12.0-py3-none-win32.whl", hash = "sha256:b1725b30c174048edc8be70bd43bb95473f396ce895d91151a474d0fa9f450a8"}, + {file = "tbb-2021.12.0-py3-none-win_amd64.whl", hash = "sha256:fc2772d850229f2f3df85f1109c4844c495a2db7433d38200959ee9265b34789"}, +] + +[[package]] +name = "thinc" +version = "8.2.3" +description = "A refreshing functional take on deep learning, compatible with your favorite libraries" +optional = false +python-versions = ">=3.6" +files = [ + {file = "thinc-8.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:27950dc8a14e1ead09dec329ad98edf1b8f7cc71ec9d5ce5f301073de9d7dadf"}, + {file = "thinc-8.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fce09571619f344983f915f5deb5b8346304b56d3a9ae1bc5ac8c5872eee0738"}, + {file = "thinc-8.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0fb4e534c978ff4b429678ab28db2f81503549f97ed61b2b752c07c08b2083"}, + {file = "thinc-8.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607223c178ae5fba36a3b35fa82d94a453694551bcfbe7f9ac04a01a9e87ebad"}, + {file = "thinc-8.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:53b48a6ae43b0e4054816a378163237b1d2120a49c71994682037437d64b7f84"}, + {file = "thinc-8.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9db67f460dae2e3aada1ff166394ce13c2dabb4db93d6bd79cd256f5beab9599"}, + {file = "thinc-8.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d57bdf43e0acd1406d681bf988179f677cf1b385c86f744bf314d827383ce31"}, + {file = "thinc-8.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78311a593b8bf3f03af52bf71d6b364463c598f3540ea8387c00017d2a0e0a5d"}, + {file = "thinc-8.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9489ae7fec427064a50a0c3e7c661a95251756032e31316add2c8c13f98f93c"}, + {file = "thinc-8.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:d0bf3840d434e3dbdf294643e6d54d2042d0e652abc68dee16673f28269fc456"}, + {file = "thinc-8.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bb7c64d0cb8066c47af9441cd611e89a0e2b28b85f2fffbdec791724c81e1915"}, + {file = "thinc-8.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c11ab3236e56311568f1e84099bfbeea3a4ee2434758a32982b224ddf8bad9c5"}, + {file = "thinc-8.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0a7f29ad534b6e761ee24d0c9e7402447e8ed4e772922795f77c98d88d7f99c"}, + {file = "thinc-8.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2817bde75c92f98fee747efdbebca68d16158b808401c5a922ba54a5f2619e9b"}, + {file = "thinc-8.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:a336f8cae7374d1768a52e63a5084a1208e30b8761eede113d2703e43e7839f1"}, + {file = "thinc-8.2.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:45c1a2880329eae53da1d77a4898b7fd30faad445b28fdf92c5557dbf6492ff0"}, + {file = "thinc-8.2.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c899b25442ed915bc77fa4cf07e908dea1bccab7c4b8d854cc0b261026d6a06"}, + {file = "thinc-8.2.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83a6b46d5f0accf0c2b2e5ff05b1bffd4d99721513b6d0374574009b0aab292c"}, + {file = "thinc-8.2.3-cp36-cp36m-win_amd64.whl", hash = "sha256:9a29a9ca7a5060c923866f16ba7823a4540cfd708eafa7202ee89ac029e0b78b"}, + {file = "thinc-8.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bd25b781faae71c52ba053157ab1865f4163be1a6485e70a007855a037ba060f"}, + {file = "thinc-8.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01a7107c36c4fc60b60fdbda30d76a0ac9bc8f4f9c7f6872db62250e2f836a5"}, + {file = "thinc-8.2.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa65182424efda03be9359c3540928bf2985792f89826a76ee475c7c6b2ec64f"}, + {file = "thinc-8.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4d448c8a870f594125cbfadc91024ce67683eae5698207101d2ea4793ab222a1"}, + {file = "thinc-8.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97605421b898441733fda24c6dda74a85325fbeebc808176857b0a8e6e7a9d47"}, + {file = "thinc-8.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8b0309d14bcfdad24b1e8bb87f8b245acfd7eb5305be466c284c788adf026ffa"}, + {file = "thinc-8.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aead20abe233adade3c37daeb9d08e5429dfcada81856b1f2b1b7e4a67a671a0"}, + {file = "thinc-8.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:324e5d2c98f787d82d239cf33cee425e1c11e34a3c96cb3f4e1ee5661abef50c"}, + {file = "thinc-8.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:45e6416e56d5101d0557e31cd06235d80fc89e9ac455ef1b444c440cb3c1ce64"}, + {file = "thinc-8.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5e6ebf63a185d7691b38655a184e30554fbe589805a802d97230eed07af8ea39"}, + {file = "thinc-8.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d29ee871cfd0d40f4a0436e154640c0965b163b91a088a85bcd5658c1cc3ed4"}, + {file = "thinc-8.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8709d114131680bc7c02b0c97817bd7692eda50beb7849c7908666cf15a6cfd"}, + {file = "thinc-8.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9b81e3c1e89c8ed6dff5a8440f584cda623ec77a3bd8c0ed059936405b8a7ca"}, + {file = "thinc-8.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:1df983af74952d4818703e6bac8af64fad338eaaef8b017fa05d372e3c68e577"}, + {file = "thinc-8.2.3.tar.gz", hash = "sha256:f5afc5222912a80bda8bdcec958362a2ba538d7027dc8db6154845d2859dca76"}, +] + +[package.dependencies] +blis = ">=0.7.8,<0.8.0" +catalogue = ">=2.0.4,<2.1.0" +confection = ">=0.0.1,<1.0.0" +cymem = ">=2.0.2,<2.1.0" +murmurhash = ">=1.0.2,<1.1.0" +numpy = {version = ">=1.19.0", markers = "python_version >= \"3.9\""} +packaging = ">=20.0" +preshed = ">=3.0.2,<3.1.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.0.0" +setuptools = "*" +srsly = ">=2.4.0,<3.0.0" +wasabi = ">=0.8.1,<1.2.0" + +[package.extras] +cuda = ["cupy (>=5.0.0b4)"] +cuda-autodetect = ["cupy-wheel (>=11.0.0)"] +cuda100 = ["cupy-cuda100 (>=5.0.0b4)"] +cuda101 = ["cupy-cuda101 (>=5.0.0b4)"] +cuda102 = ["cupy-cuda102 (>=5.0.0b4)"] +cuda110 = ["cupy-cuda110 (>=5.0.0b4)"] +cuda111 = ["cupy-cuda111 (>=5.0.0b4)"] +cuda112 = ["cupy-cuda112 (>=5.0.0b4)"] +cuda113 = ["cupy-cuda113 (>=5.0.0b4)"] +cuda114 = ["cupy-cuda114 (>=5.0.0b4)"] +cuda115 = ["cupy-cuda115 (>=5.0.0b4)"] +cuda116 = ["cupy-cuda116 (>=5.0.0b4)"] +cuda117 = ["cupy-cuda117 (>=5.0.0b4)"] +cuda11x = ["cupy-cuda11x (>=11.0.0)"] +cuda12x = ["cupy-cuda12x (>=11.5.0)"] +cuda80 = ["cupy-cuda80 (>=5.0.0b4)"] +cuda90 = ["cupy-cuda90 (>=5.0.0b4)"] +cuda91 = ["cupy-cuda91 (>=5.0.0b4)"] +cuda92 = ["cupy-cuda92 (>=5.0.0b4)"] +datasets = ["ml-datasets (>=0.2.0,<0.3.0)"] +mxnet = ["mxnet (>=1.5.1,<1.6.0)"] +tensorflow = ["tensorflow (>=2.0.0,<2.6.0)"] +torch = ["torch (>=1.6.0)"] + +[[package]] +name = "tokenizers" +version = "0.19.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] + +[[package]] +name = "torch" +version = "2.3.0" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.3.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d8ea5a465dbfd8501f33c937d1f693176c9aef9d1c1b0ca1d44ed7b0a18c52ac"}, + {file = "torch-2.3.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09c81c5859a5b819956c6925a405ef1cdda393c9d8a01ce3851453f699d3358c"}, + {file = "torch-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:1bf023aa20902586f614f7682fedfa463e773e26c58820b74158a72470259459"}, + {file = "torch-2.3.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:758ef938de87a2653bba74b91f703458c15569f1562bf4b6c63c62d9c5a0c1f5"}, + {file = "torch-2.3.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:493d54ee2f9df100b5ce1d18c96dbb8d14908721f76351e908c9d2622773a788"}, + {file = "torch-2.3.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bce43af735c3da16cc14c7de2be7ad038e2fbf75654c2e274e575c6c05772ace"}, + {file = "torch-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:729804e97b7cf19ae9ab4181f91f5e612af07956f35c8b2c8e9d9f3596a8e877"}, + {file = "torch-2.3.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:d24e328226d8e2af7cf80fcb1d2f1d108e0de32777fab4aaa2b37b9765d8be73"}, + {file = "torch-2.3.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b0de2bdc0486ea7b14fc47ff805172df44e421a7318b7c4d92ef589a75d27410"}, + {file = "torch-2.3.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a306c87a3eead1ed47457822c01dfbd459fe2920f2d38cbdf90de18f23f72542"}, + {file = "torch-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:f9b98bf1a3c8af2d4c41f0bf1433920900896c446d1ddc128290ff146d1eb4bd"}, + {file = "torch-2.3.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:dca986214267b34065a79000cee54232e62b41dff1ec2cab9abc3fc8b3dee0ad"}, + {file = "torch-2.3.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:20572f426965dd8a04e92a473d7e445fa579e09943cc0354f3e6fef6130ce061"}, + {file = "torch-2.3.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e65ba85ae292909cde0dde6369826d51165a3fc8823dc1854cd9432d7f79b932"}, + {file = "torch-2.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:5515503a193781fd1b3f5c474e89c9dfa2faaa782b2795cc4a7ab7e67de923f6"}, + {file = "torch-2.3.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:6ae9f64b09516baa4ef890af0672dc981c20b1f0d829ce115d4420a247e88fba"}, + {file = "torch-2.3.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cd0dc498b961ab19cb3f8dbf0c6c50e244f2f37dbfa05754ab44ea057c944ef9"}, + {file = "torch-2.3.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e05f836559251e4096f3786ee99f4a8cbe67bc7fbedba8ad5e799681e47c5e80"}, + {file = "torch-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:4fb27b35dbb32303c2927da86e27b54a92209ddfb7234afb1949ea2b3effffea"}, + {file = "torch-2.3.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:760f8bedff506ce9e6e103498f9b1e9e15809e008368594c3a66bf74a8a51380"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "2.3.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] + +[[package]] +name = "tqdm" +version = "4.66.2" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "transformers" +version = "4.40.1" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "transformers-4.40.1-py3-none-any.whl", hash = "sha256:9d5ee0c8142a60501faf9e49a0b42f8e9cb8611823bce4f195a9325a6816337e"}, + {file = "transformers-4.40.1.tar.gz", hash = "sha256:55e1697e6f18b58273e7117bb469cdffc11be28995462d8d5e422fef38d2de36"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.19.3,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.4.1" +tokenizers = ">=0.19,<0.20" +tqdm = ">=4.27" + +[package.extras] +accelerate = ["accelerate (>=0.21.0)"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "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", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +docs-specific = ["hf-doc-builder"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +natten = ["natten (>=0.14.6,<0.15.0)"] +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)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +ray = ["ray[tune] (>=2.7.0)"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["protobuf", "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", "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", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +timm = ["timm"] +tokenizers = ["tokenizers (>=0.19,<0.20)"] +torch = ["accelerate (>=0.21.0)", "torch"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +video = ["av (==9.2.0)", "decord (==0.6.0)"] +vision = ["Pillow (>=10.0.1,<=15.0)"] + +[[package]] +name = "triton" +version = "2.3.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce4b8ff70c48e47274c66f269cce8861cf1dc347ceeb7a67414ca151b1822d8"}, + {file = "triton-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c3d9607f85103afdb279938fc1dd2a66e4f5999a58eb48a346bd42738f986dd"}, + {file = "triton-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:218d742e67480d9581bafb73ed598416cc8a56f6316152e5562ee65e33de01c0"}, + {file = "triton-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381ec6b3dac06922d3e4099cfc943ef032893b25415de295e82b1a82b0359d2c"}, + {file = "triton-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038e06a09c06a164fef9c48de3af1e13a63dc1ba3c792871e61a8e79720ea440"}, + {file = "triton-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8f636e0341ac348899a47a057c3daea99ea7db31528a225a3ba4ded28ccc65"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] +tutorials = ["matplotlib", "pandas", "tabulate", "torch"] + +[[package]] +name = "typer" +version = "0.9.4" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.6" +files = [ + {file = "typer-0.9.4-py3-none-any.whl", hash = "sha256:aa6c4a4e2329d868b80ecbaf16f807f2b54e192209d7ac9dd42691d63f7a54eb"}, + {file = "typer-0.9.4.tar.gz", hash = "sha256:f714c2d90afae3a7929fcd72a3abb08df305e1ff61719381384211c4070af57f"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.971)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + +[[package]] +name = "typing-extensions" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wasabi" +version = "1.1.2" +description = "A lightweight console printing and formatting toolkit" +optional = false +python-versions = ">=3.6" +files = [ + {file = "wasabi-1.1.2-py3-none-any.whl", hash = "sha256:0a3f933c4bf0ed3f93071132c1b87549733256d6c8de6473c5f7ed2e171b5cf9"}, + {file = "wasabi-1.1.2.tar.gz", hash = "sha256:1aaef3aceaa32edb9c91330d29d3936c0c39fdb965743549c173cb54b16c30b5"}, +] + +[package.dependencies] +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\" and python_version >= \"3.7\""} + +[[package]] +name = "weasel" +version = "0.3.4" +description = "Weasel: A small and easy workflow system" +optional = false +python-versions = ">=3.6" +files = [ + {file = "weasel-0.3.4-py3-none-any.whl", hash = "sha256:ee48a944f051d007201c2ea1661d0c41035028c5d5a8bcb29a0b10f1100206ae"}, + {file = "weasel-0.3.4.tar.gz", hash = "sha256:eb16f92dc9f1a3ffa89c165e3a9acd28018ebb656e0da4da02c0d7d8ae3f6178"}, +] + +[package.dependencies] +cloudpathlib = ">=0.7.0,<0.17.0" +confection = ">=0.0.4,<0.2.0" +packaging = ">=20.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.0.0" +requests = ">=2.13.0,<3.0.0" +smart-open = ">=5.2.1,<7.0.0" +srsly = ">=2.4.3,<3.0.0" +typer = ">=0.3.0,<0.10.0" +wasabi = ">=0.9.1,<1.2.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "b75f98b1ad4132a7bd571bc41a7d726086dab8610ba825ed9d4ac181e2bad274" diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 0000000..7e8d7ce --- /dev/null +++ b/poetry.toml @@ -0,0 +1,2 @@ +# set up a .venv in this project +virtualenvs.in-project = true diff --git a/prompt.txt b/prompt.txt deleted file mode 100644 index 860c384..0000000 --- a/prompt.txt +++ /dev/null @@ -1,19 +0,0 @@ -Given the following OpenFn instruction: - -### Instruction: -Create an OpenFn function that fetches all non-retired patients that match specified parameters - -Provide the implementation code that corresponds to the following OpenFn signature. Ensure that all imports are from '@openfn/': - -### Signature: -/** - * Fetch all non-retired patients that match any specified parameters - * @example - * searchPatient({ q: Sarah }) - * @function - * @param {object} query - Object with query for the patient - * @returns {Operation} - */ -export function searchPatient(query: object): Operation; - -### Implementation: \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index ce81955..a858e86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,23 @@ [tool.poetry] -name = "code-generator" -version = "0.1.0" +name = "apollo" +version = "1.0.0" description = "A python monorepo for AI code generation" authors = ["Isma-Ilou Sadou "] license = "LGPLv3" readme = "README.md" +package-mode = false [tool.poetry.dependencies] -python = "^3.9" +python = "^3.11" requests = "^2.31.0" +fastapi = "^0.110.2" +spacy = "^3.7.4" +en-core-web-sm = { path = "models/en_core_web_sm-3.7.1-py3-none-any.whl" } +openai = "^1.23.3" +transformers = "^4.40.1" +torch = "^2.3.0" +black = "^24.4.2" +python-dotenv = "^1.0.1" [build-system] @@ -20,34 +29,34 @@ line-length = 120 [tool.ruff] select = [ - "E", # pycodestyle - "F", # pyflakes - "W", # pycodestyle (warnings) - "I", # isort - "N", # pep8-naming - "UP", # pyupgrade - "ANN", # flake8-annotations - "B", # flake8-bugbear - "A", # flake8-builtins - "COM", # flake8-commas - "C4", # flake8-comprehensions - "DTZ", # flake8-datetimez - "EXE", # flake8-executable - "PIE", # flake8-pie - "T20", # flake8-print - "PT", # flake8-pytest - "SIM", # flake8-simplify - "ARG", # flake8-unused-arguments - "PTH", # flake8--use-pathlib - "ERA", # flake8-eradicate - "RUF", # ruff specific rules - "PL", # pylint + "E", # pycodestyle + "F", # pyflakes + "W", # pycodestyle (warnings) + "I", # isort + "N", # pep8-naming + "UP", # pyupgrade + "ANN", # flake8-annotations + "B", # flake8-bugbear + "A", # flake8-builtins + "COM", # flake8-commas + "C4", # flake8-comprehensions + "DTZ", # flake8-datetimez + "EXE", # flake8-executable + "PIE", # flake8-pie + "T20", # flake8-print + "PT", # flake8-pytest + "SIM", # flake8-simplify + "ARG", # flake8-unused-arguments + "PTH", # flake8--use-pathlib + "ERA", # flake8-eradicate + "RUF", # ruff specific rules + "PL", # pylint ] ignore = [ "ANN101", # Missing type annotation for self in method "ANN204", # Missing type annotation for special method "ANN003", # Missing type annotation for `**kwargs` - "UP007", # Use `X | Y` for type annotations instead of Union + "UP007", # Use `X | Y` for type annotations instead of Union "E501", ] line-length = 120 diff --git a/services/adaptor_gen/README.md b/services/adaptor_gen/README.md new file mode 100644 index 0000000..60eba05 --- /dev/null +++ b/services/adaptor_gen/README.md @@ -0,0 +1,48 @@ +# Adaptor Generator + +This service generates an adaptor function based on an endpoint within an +OpenAPI spec. + +It is designed at this stage to only generate a single function for a single +endpoint. + +It returns a list of files and their contents (basically an Adaptor.js) + +## Implementation Notes + +This service uses a pipepline of other services to generate an adaptor function: + +- First a signature is generated, in Typescript, from the openAPI spec. This + uses the `signature_generator` and `inference` services. +- Then code is generated for that signature, using the `code_generator` and + `inference` services. +- (TODO) Unit tests can also be generated + +The resulting code is returned as a list of files in the JSON payload: + +```json +{ + "Adaptor.js": "..." +} +``` + +## Usage + +To use this service, call the endpoint: + +```bash +curl -X POST localhost:3000/services/adaptor_gen --json @tmp/payload.json +``` + +The payload should include the following: + +```json +{ + "endpoint": "/facts", + "model": "gpt3_turbo", + "api_key": "", + "open_api_spec": "{ .. }" +} +``` + +In dev the key can be loaded through an env var. diff --git a/services/adaptor_gen/adaptor_gen.py b/services/adaptor_gen/adaptor_gen.py new file mode 100644 index 0000000..18ea947 --- /dev/null +++ b/services/adaptor_gen/adaptor_gen.py @@ -0,0 +1,36 @@ +import logging +from util import DictObj + +from signature_generator import signature_generator as sig_gen +from code_generator import code_generator as code_gen + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +class Payload(DictObj): + api_key: str + open_api_spec: DictObj + endpoint: str + + +def main(dataDict): + data = Payload(dataDict) + + result = {} + + logger.info("Generating adaptor template for {}".format(data.endpoint)) + + # TODO the signature should probably handle this + prompt = "Create an OpenFn function that accesses the /{} endpoint".format(data.endpoint) + + logger.info("prompt: " + prompt) + + # TODO actually there's no point in returning the d.ts right? It's academic at this point + sig = sig_gen.generate(data.model, dataDict["open_api_spec"], prompt, data.get("api_key")) + result["Adaptor.d.ts"] = sig + + code = code_gen.generate(data.model, sig, data.get("api_key")) + result["Adaptor.js"] = code + + return result diff --git a/samples/cat-facts/Adaptor.d.ts b/services/adaptor_gen/samples/cat-facts/Adaptor.d.ts similarity index 100% rename from samples/cat-facts/Adaptor.d.ts rename to services/adaptor_gen/samples/cat-facts/Adaptor.d.ts diff --git a/samples/cat-facts/Adaptor.js b/services/adaptor_gen/samples/cat-facts/Adaptor.js similarity index 100% rename from samples/cat-facts/Adaptor.js rename to services/adaptor_gen/samples/cat-facts/Adaptor.js diff --git a/samples/cat-facts/Adaptor.test.js b/services/adaptor_gen/samples/cat-facts/Adaptor.test.js similarity index 100% rename from samples/cat-facts/Adaptor.test.js rename to services/adaptor_gen/samples/cat-facts/Adaptor.test.js diff --git a/samples/cat-facts/instruction.txt b/services/adaptor_gen/samples/cat-facts/instruction.txt similarity index 100% rename from samples/cat-facts/instruction.txt rename to services/adaptor_gen/samples/cat-facts/instruction.txt diff --git a/samples/cat-facts/spec.json b/services/adaptor_gen/samples/cat-facts/spec.json similarity index 100% rename from samples/cat-facts/spec.json rename to services/adaptor_gen/samples/cat-facts/spec.json diff --git a/samples/dhis2/Adaptor.d.ts b/services/adaptor_gen/samples/dhis2/Adaptor.d.ts similarity index 100% rename from samples/dhis2/Adaptor.d.ts rename to services/adaptor_gen/samples/dhis2/Adaptor.d.ts diff --git a/samples/dhis2/Adaptor.js b/services/adaptor_gen/samples/dhis2/Adaptor.js similarity index 100% rename from samples/dhis2/Adaptor.js rename to services/adaptor_gen/samples/dhis2/Adaptor.js diff --git a/samples/dhis2/Adaptor.test.js b/services/adaptor_gen/samples/dhis2/Adaptor.test.js similarity index 100% rename from samples/dhis2/Adaptor.test.js rename to services/adaptor_gen/samples/dhis2/Adaptor.test.js diff --git a/samples/dhis2/instruction.txt b/services/adaptor_gen/samples/dhis2/instruction.txt similarity index 100% rename from samples/dhis2/instruction.txt rename to services/adaptor_gen/samples/dhis2/instruction.txt diff --git a/samples/dhis2/spec.json b/services/adaptor_gen/samples/dhis2/spec.json similarity index 100% rename from samples/dhis2/spec.json rename to services/adaptor_gen/samples/dhis2/spec.json diff --git a/samples/fhir/Adaptor.d.ts b/services/adaptor_gen/samples/fhir/Adaptor.d.ts similarity index 100% rename from samples/fhir/Adaptor.d.ts rename to services/adaptor_gen/samples/fhir/Adaptor.d.ts diff --git a/samples/fhir/Adaptor.js b/services/adaptor_gen/samples/fhir/Adaptor.js similarity index 100% rename from samples/fhir/Adaptor.js rename to services/adaptor_gen/samples/fhir/Adaptor.js diff --git a/samples/fhir/Adaptor.test.js b/services/adaptor_gen/samples/fhir/Adaptor.test.js similarity index 100% rename from samples/fhir/Adaptor.test.js rename to services/adaptor_gen/samples/fhir/Adaptor.test.js diff --git a/samples/fhir/instruction.txt b/services/adaptor_gen/samples/fhir/instruction.txt similarity index 100% rename from samples/fhir/instruction.txt rename to services/adaptor_gen/samples/fhir/instruction.txt diff --git a/samples/fhir/spec.json b/services/adaptor_gen/samples/fhir/spec.json similarity index 100% rename from samples/fhir/spec.json rename to services/adaptor_gen/samples/fhir/spec.json diff --git a/samples/mailchimp/Adaptor.d.ts b/services/adaptor_gen/samples/mailchimp/Adaptor.d.ts similarity index 100% rename from samples/mailchimp/Adaptor.d.ts rename to services/adaptor_gen/samples/mailchimp/Adaptor.d.ts diff --git a/samples/mailchimp/Adaptor.js b/services/adaptor_gen/samples/mailchimp/Adaptor.js similarity index 100% rename from samples/mailchimp/Adaptor.js rename to services/adaptor_gen/samples/mailchimp/Adaptor.js diff --git a/samples/mailchimp/Adaptor.test.js b/services/adaptor_gen/samples/mailchimp/Adaptor.test.js similarity index 100% rename from samples/mailchimp/Adaptor.test.js rename to services/adaptor_gen/samples/mailchimp/Adaptor.test.js diff --git a/samples/mailchimp/instruction.txt b/services/adaptor_gen/samples/mailchimp/instruction.txt similarity index 100% rename from samples/mailchimp/instruction.txt rename to services/adaptor_gen/samples/mailchimp/instruction.txt diff --git a/samples/mailchimp/spec.json b/services/adaptor_gen/samples/mailchimp/spec.json similarity index 100% rename from samples/mailchimp/spec.json rename to services/adaptor_gen/samples/mailchimp/spec.json diff --git a/samples/opencrvs/instructions.txt b/services/adaptor_gen/samples/opencrvs/instructions.txt similarity index 100% rename from samples/opencrvs/instructions.txt rename to services/adaptor_gen/samples/opencrvs/instructions.txt diff --git a/samples/opencrvs/spec.json b/services/adaptor_gen/samples/opencrvs/spec.json similarity index 100% rename from samples/opencrvs/spec.json rename to services/adaptor_gen/samples/opencrvs/spec.json diff --git a/services/code_generator/.dockerignore b/services/code_generator/.dockerignore deleted file mode 100644 index e89968c..0000000 --- a/services/code_generator/.dockerignore +++ /dev/null @@ -1,15 +0,0 @@ -# Ignore .env files -*.env - -# Ignore log files -*.log - -# Ignore datasets -*.csv -*.json -*.jsonl - -# .gitignore content -.git -__pycache__ -.cache \ No newline at end of file diff --git a/services/code_generator/.env.example b/services/code_generator/.env.example deleted file mode 100644 index 5d962ea..0000000 --- a/services/code_generator/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -# INFERENCE_BASEURL='http://localhost:8003/' -INFERENCE_BASEURL='http://inference:8003/' # when using docker \ No newline at end of file diff --git a/services/code_generator/Dockerfile b/services/code_generator/Dockerfile deleted file mode 100644 index 8ca4202..0000000 --- a/services/code_generator/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 - -WORKDIR /app - -COPY ./pyproject.toml ./ -COPY ./poetry.lock* ./ - -ENV POETRY_VERSION=1.6.1 -RUN pip install "poetry==$POETRY_VERSION" -ENV POETRY_VIRTUALENVS_CREATE=false - -RUN poetry install --no-dev --no-root - -COPY ./ . - -EXPOSE 8002 - -CMD ["uvicorn", "code_generator.main:app", "--host", "0.0.0.0", "--port", "8002"] \ No newline at end of file diff --git a/services/code_generator/README.md b/services/code_generator/README.md index e69de29..c0658b8 100644 --- a/services/code_generator/README.md +++ b/services/code_generator/README.md @@ -0,0 +1,26 @@ +# Code Generator + +(TODO rename to adaptor code generator) + +This service generates code to satisfy a function signature specified in +Typescript + +This service is designed for use in the adaptor generator pipeline. + +## Usage + +Call the endpoint at `services/code_generator` + +```bash +curl -X POST localhost:3000/services/code_generator --json @tmp/sig-cat.json +``` + +The payload should include a model and a signature: + +```json +{ + "model": "gpt3_turbo", + "api_key": "", + "signature": "\"/**\\n * Retrieves information about cat breeds and includes it in the state data.\\n * Sends a GET request to the /breeds endpoint of Cat.\\n * @example\\n * getCatBreeds(callback)\\n * @function\\n * @param {Function} callback - A callback which is invoked with the resulting state at the end of this operation. Allows users to customize the resulting state. State.data includes the response from Cat breeds endpoint.\\n * @example Get information about cat breeds\\n * getCatBreeds()\\n * @returns {Function} A function that updates the state with the retrieved cat breeds information.\\n */\\n export function getCatBreeds(callback?: Function): Operation;\"" +} +``` diff --git a/services/code_generator/__init__.py b/services/code_generator/__init__.py deleted file mode 100644 index 12e451b..0000000 --- a/services/code_generator/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -import sys -from dotenv import load_dotenv -from pathlib import Path - -# Add the path to the root directory of the package to the Python path -PACKAGE_ROOT = Path(__file__).resolve().parent -sys.path.insert(0, str(PACKAGE_ROOT)) - -env = PACKAGE_ROOT / ".env" -load_dotenv(env) \ No newline at end of file diff --git a/services/code_generator/code_generator.py b/services/code_generator/code_generator.py new file mode 100644 index 0000000..ccb3f8c --- /dev/null +++ b/services/code_generator/code_generator.py @@ -0,0 +1,35 @@ +import logging +from util import DictObj + +from .utils import ( + generate_code_prompt, +) + +from inference import inference + + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +class Payload(DictObj): + api_key: str + signature: str + model: str + + +# generate adaptor code based on a model and signature +def main(dataDict) -> str: + data = Payload(dataDict) + + result = generate(data.model, data.signature, data.get("api_key")) + + return result + + +def generate(model, signature, key) -> str: + prompt = generate_code_prompt(model, signature) + + result = inference.generate(model, prompt, {"key": key}) + + return result diff --git a/services/code_generator/code_generator/__init__.py b/services/code_generator/code_generator/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/code_generator/code_generator/api/__init__.py b/services/code_generator/code_generator/api/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/code_generator/code_generator/api/routers.py b/services/code_generator/code_generator/api/routers.py deleted file mode 100644 index 03aa85d..0000000 --- a/services/code_generator/code_generator/api/routers.py +++ /dev/null @@ -1,34 +0,0 @@ -import logging -from fastapi import APIRouter -from code_generator.utils.models import CodeInput, TestInput -from code_generator.utils.utils import ( - create_code_generator, - generate_code_prompt, - generate_test_prompt, - trim_test, -) - -router = APIRouter() - -# Configure logging -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - - -@router.post("/generate_code", response_model=dict) -async def generate_code(data: CodeInput) -> dict: - generator = create_code_generator(data.model) - prompt = generate_code_prompt(data.model, data.signature) - logger.info("Code generation..") - code = generator.generate(prompt)[0] - return {"implementation": code} - - -@router.post("/generate_test", response_model=dict) -async def generate_test(data: TestInput) -> dict: - generator = create_code_generator(data.model) - prompt = generate_test_prompt(data.model, data.implementation) - logger.info("Test generation..") - test = generator.generate(prompt)[0] - logger.info("Test generation complete.") - return {"test": trim_test(test)} diff --git a/services/code_generator/code_generator/main.py b/services/code_generator/code_generator/main.py deleted file mode 100644 index d7632cd..0000000 --- a/services/code_generator/code_generator/main.py +++ /dev/null @@ -1,32 +0,0 @@ -import logging - -from fastapi import FastAPI - -from code_generator.api.routers import router -from code_generator.utils.constants import HOST, PORT - -# Configure logging -logging.basicConfig( - filename="app.log", - level=logging.ERROR, - format="%(asctime)s %(levelname)s %(name)s %(message)s", -) - -app = FastAPI(title="Code Generator Service", openapi_url="/openapi.json") - - -@app.get("/", status_code=200) -async def root() -> dict: - """ - Root GET - """ - return {"Code Generation Service": "running"} - - -app.include_router(router, tags=["Code generation"]) - -if __name__ == "__main__": - # Use this for debugging purposes only - import uvicorn - - uvicorn.run(app, host=HOST, port=PORT, log_level="debug") diff --git a/services/code_generator/code_generator/utils/constants.py b/services/code_generator/code_generator/utils/constants.py deleted file mode 100644 index 5efe1d0..0000000 --- a/services/code_generator/code_generator/utils/constants.py +++ /dev/null @@ -1,6 +0,0 @@ -# API Constants -HOST = "0.0.0.0" -PORT = 8002 - -# Response Codes -SUCCESS_CODE: int = 200 diff --git a/services/code_generator/code_generator/utils/models.py b/services/code_generator/code_generator/utils/models.py deleted file mode 100644 index bdd6c05..0000000 --- a/services/code_generator/code_generator/utils/models.py +++ /dev/null @@ -1,43 +0,0 @@ -import requests -import logging -from fastapi import HTTPException -from pydantic import BaseModel - -logging.basicConfig(level=logging.INFO) - - -class CodeGenerator: - def __init__(self, endpoint_url: str): - self.endpoint_url = endpoint_url - self.logger = logging.getLogger(__name__) - - def generate(self, prompt: str) -> str: - try: - headers = {"Content-Type": "application/json"} - data = {"prompt": prompt} - - response = requests.post(self.endpoint_url, headers=headers, json=data) - response.raise_for_status() - return response.json().get("generated_code") - except requests.exceptions.HTTPError as e: - error_message = ( - f"HTTP error occurred: {e.response.status_code}, {e.response.text}" - ) - self.logger.error(error_message) - raise HTTPException( - status_code=e.response.status_code, detail=error_message - ) from e - except Exception as e: - error_message = f"An unexpected error occurred in code gen: {e}" - self.logger.error(error_message) - raise HTTPException(status_code=500, detail=error_message) - - -class CodeInput(BaseModel): - signature: str - model: str = "gpt_ft" - - -class TestInput(BaseModel): - implementation: str - model: str = "gpt_ft" diff --git a/services/code_generator/code_generator/utils/utils.py b/services/code_generator/code_generator/utils/utils.py deleted file mode 100644 index d722c32..0000000 --- a/services/code_generator/code_generator/utils/utils.py +++ /dev/null @@ -1,53 +0,0 @@ -import logging -import os -from code_generator.utils.models import CodeGenerator -from code_generator.utils.prompts import generate_prompt - -# Configure logging -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - - -def create_code_generator(model): - return CodeGenerator(get_model_endpoint(model)) - - -def generate_code_prompt(model, signature): - prompt_template = ( - "code" - if model == "gpt3_turbo" - else "code_ft" - if model == "gpt_ft" - else "code_text" - ) - return generate_prompt(prompt_template, signature=signature) - - -def generate_test_prompt(model, implementation): - return generate_prompt("test", implementation=implementation) - - -def trim_test(test): - end_tokens = "/* Test */" - if end_tokens in test: - logger.info("Trimming the end token from test") - return test[test.find(end_tokens) :] - else: - logger.warning("End token not found in the test") - return test - - -def get_model_endpoint(model_name: str) -> str: - """ - Get the endpoint for the model - """ - base_url = os.getenv("INFERENCE_BASEURL", "http://localhost:8003/") - - if model_name.lower() == "llama2": - endpoint = ( - f"http://localhost:8005/llama2/generate_code/" # Llama2 model is offline - ) - else: - endpoint = f"{base_url}{model_name.lower()}/generate_code/" - - return endpoint diff --git a/services/code_generator/code_generator/utils/prompts.py b/services/code_generator/prompts.py similarity index 100% rename from services/code_generator/code_generator/utils/prompts.py rename to services/code_generator/prompts.py diff --git a/services/code_generator/pyproject.toml b/services/code_generator/pyproject.toml deleted file mode 100644 index f0645ec..0000000 --- a/services/code_generator/pyproject.toml +++ /dev/null @@ -1,24 +0,0 @@ -[tool.poetry] -name = "code-generator" -version = "0.1.0" -description = "" -authors = ["Isma-Ilou Sadou "] -readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.9" -openai = "^1.2.4" -fastapi = "^0.104.1" -requests = "^2.31.0" -uvicorn = "^0.24.0.post1" - - -[tool.poetry.group.dev.dependencies] -black = "^23.10.1" -ruff = "^0.1.1" -pre-commit = "^3.5.0" -pytest = "^7.4.2" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/services/code_generator/run.sh b/services/code_generator/run.sh deleted file mode 100755 index 07c4cf3..0000000 --- a/services/code_generator/run.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -source "$(poetry env info --path)/bin/activate" - -echo $(poetry env info --path) - -python --version - -export APP_MODULE=${APP_MODULE-code_generator.main:app} -export HOST=${HOST:-0.0.0.0} -export PORT=${PORT:-8002} - -exec uvicorn --reload --host $HOST --port $PORT "$APP_MODULE" diff --git a/services/code_generator/tests/__init__.py b/services/code_generator/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/code_generator/utils.py b/services/code_generator/utils.py new file mode 100644 index 0000000..a0366bd --- /dev/null +++ b/services/code_generator/utils.py @@ -0,0 +1,26 @@ +import logging +import os +from .prompts import generate_prompt + +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def generate_code_prompt(model, signature): + prompt_template = "code" if model == "gpt3_turbo" else "code_ft" if model == "gpt_ft" else "code_text" + return generate_prompt(prompt_template, signature=signature) + + +def generate_test_prompt(model, implementation): + return generate_prompt("test", implementation=implementation) + + +def trim_test(test): + end_tokens = "/* Test */" + if end_tokens in test: + logger.info("Trimming the end token from test") + return test[test.find(end_tokens) :] + else: + logger.warning("End token not found in the test") + return test diff --git a/services/demo.py b/services/demo.py deleted file mode 100644 index 24825d5..0000000 --- a/services/demo.py +++ /dev/null @@ -1,101 +0,0 @@ -import json -import logging -from pathlib import Path -import requests - -# Setup logging -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -# API endpoints -# ENDPOINT_SIGNATURE = "http://localhost:8003/generate_signature/" -# ENDPOINT_CODE = "http://localhost:8004/generate_code/" -# ENDPOINT_TEST = "http://localhost:8004/generate_test/" - -ENDPOINT_SIGNATURE = "http://0.0.0.0:8001/generate_signature/" -ENDPOINT_CODE = "http://0.0.0.0:8002/generate_code/" -ENDPOINT_TEST = "http://0.0.0.0:8002/generate_test/" - -# ENDPOINT_SIGNATURE = "http://localhost:8001/signature/generate_signature/" -# ENDPOINT_CODE = "http://localhost:8001/code/generate_code/" -# ENDPOINT_TEST = "http://localhost:8001/code/generate_test/" - -# Samples and models for generation -SAMPLES = ["mailchimp", "cat-facts", "dhis2", "fhir"] -FT_MODEL_NAME = "gpt_ft" -MODEL_NAME = "gpt3_turbo" -# MODELS = ["codeT5", "gpt2", "gpt3_turbo", "gpt_ft", "llama2"] - - -def post_request(endpoint, payload): - """Send a POST request to a specified endpoint with the given payload.""" - try: - response = requests.post(endpoint, json=payload) - response.raise_for_status() # Raise an HTTPError if the HTTP request returned an unsuccessful status code - return response.json() - except requests.exceptions.RequestException as e: - logger.error(f"Request failed: {e}") - return None - - -def write_to_file(path, content): - """Write content to a file at the specified path.""" - with path.open("w") as file: - file.write(content) - logger.info(f"Content written to {path}") - - -def main(): - for sample in SAMPLES: - logger.info(f"Processing sample: {sample}") - base_path = Path(f"../samples/{sample}") - - # Load spec and instruction - with (base_path / "spec.json").open("r") as spec_file: - full_spec = json.load(spec_file) - with (base_path / "instruction.txt").open() as instr_file: - instruction = instr_file.read() - - # Generate signature - logger.info(f"Generating signature for {sample}") - signature_payload = { - "open_api_spec": full_spec, - "instruction": instruction, - "model": MODEL_NAME, - } - signature_response = post_request(ENDPOINT_SIGNATURE, signature_payload) - - if signature_response: - signature = signature_response.get("signature") - write_to_file(base_path / "Adaptor.d.ts", signature) - - # Generate code - logger.info(f"Generating code for {sample}") - code_payload = {"signature": signature, "model": FT_MODEL_NAME} - code_response = post_request(ENDPOINT_CODE, code_payload) - - if code_response: - implementation = code_response.get("implementation") - write_to_file(base_path / "Adaptor.js", implementation) - - # Generate test - logger.info(f"Generating test for {sample}") - test_payload = { - "implementation": implementation, - "model": FT_MODEL_NAME, - } - test_response = post_request(ENDPOINT_TEST, test_payload) - - if test_response: - test_code = test_response.get("test") - write_to_file(base_path / "Adaptor.test.js", test_code) - else: - logger.error(f"Failed to generate tests for {sample}") - else: - logger.error(f"Failed to generate code for {sample}") - else: - logger.error(f"Failed to generate signature for {sample}") - - -if __name__ == "__main__": - main() diff --git a/services/echo/README.md b/services/echo/README.md new file mode 100644 index 0000000..26efc3d --- /dev/null +++ b/services/echo/README.md @@ -0,0 +1,13 @@ +## Echo + +A simple test service which returns whatever is passed into it. + +## Usage + +Call the endpoint at `services/echo` + +```bash +curl -X POST localhost:3000/services/echo --json @tmp/data.json +``` + +Whatever you include in the body will be be returned straight back. diff --git a/services/echo/echo.py b/services/echo/echo.py new file mode 100644 index 0000000..0c44e7a --- /dev/null +++ b/services/echo/echo.py @@ -0,0 +1,9 @@ +# relative imports work well! +from .log import log + + +# Simple python service to echo requests back to the caller +# Used in test +def main(x): + log(x) + return x diff --git a/services/echo/log.py b/services/echo/log.py new file mode 100644 index 0000000..5702d31 --- /dev/null +++ b/services/echo/log.py @@ -0,0 +1,3 @@ +def log(x): + print("[echo]: Echoing request") + print("[echo]: " + str(x)) diff --git a/services/entry.py b/services/entry.py new file mode 100644 index 0000000..f535a26 --- /dev/null +++ b/services/entry.py @@ -0,0 +1,42 @@ +import sys +import json +from dotenv import load_dotenv + +# This will load from the ../.env file (at root) +load_dotenv() + + +# This module is a sort of "router" +# Given a module name (ie, inference) +# it will import it dynamically and invoke the main +# function with the second argument +# args is a list of the form (serviceName, args) +def main(args): + service = args[0] + json = args[1] + + module_name = "{0}.{0}".format(service) + m = __import__(module_name, fromlist=["main"]) + return m.main(json) + + +# when called from main, look for +# a) a service name +# b) a path to input +# Then call the module via main() +if __name__ == "__main__": + mod_name = sys.argv[1] + data = None + + print("Calling services/{} ...".format(mod_name)) + + if len(sys.argv) >= 2: + json_path = sys.argv[2] + data = json.load(open(json_path)) + print(" loaded input JSON OK!") + + print() + result = main([mod_name, data]) + print() + print("Done!") + print(result) diff --git a/services/inference/.dockerignore b/services/inference/.dockerignore deleted file mode 100644 index 1f505ab..0000000 --- a/services/inference/.dockerignore +++ /dev/null @@ -1,15 +0,0 @@ -# Ignore .env files -*.env - -# Ignore log files -*.log - -# Ignore datasets -*.csv -*.json -*.jsonl - -# .gitignore -.git -__pycache__ -.cache \ No newline at end of file diff --git a/services/inference/Dockerfile b/services/inference/Dockerfile deleted file mode 100644 index f566551..0000000 --- a/services/inference/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 - -WORKDIR /app - -COPY ./pyproject.toml ./poetry.lock ./ - -ENV POETRY_VERSION=1.6.1 -RUN pip install "poetry==$POETRY_VERSION" -ENV POETRY_VIRTUALENVS_CREATE=false - -RUN poetry install --no-dev --no-root - -COPY ./ . - -EXPOSE 8003 - -CMD ["uvicorn", "inference.main:app", "--host", "0.0.0.0", "--port", "8003"] \ No newline at end of file diff --git a/services/inference/README.md b/services/inference/README.md index e69de29..8644276 100644 --- a/services/inference/README.md +++ b/services/inference/README.md @@ -0,0 +1,35 @@ +# Inference + +The inference service is designed as an entry-point to a number of langauge +models. + +It takes an input prompt and a model name, and returns a single result. While it +was created for code generation, it could be used for anything. + +It is generally used by other services. + +## HTTP access + +Although the inference service is designed to be called from python, you can +call it through HTTP: + +```bash +curl -x POST localhost:3000/services/inference --json @tmp/input.json +``` + +The input data must contain a propt and a model. It can also contain extra +arguments, which will be passed through to the particular model you want to +call. + +```json +{ + "prompt": "what is openfn?", + "model": "gpt3_turbo", + "args": { + "key": "" + } +} +``` + +Note that different models are likely to have different arguments - check the +specific model.py file for details! diff --git a/services/inference/__init__.py b/services/inference/__init__.py deleted file mode 100644 index c351a86..0000000 --- a/services/inference/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -import sys -from pathlib import Path -from dotenv import load_dotenv - -# Add the path to the root directory of the package to the Python path -PACKAGE_ROOT = Path(__file__).resolve().parent -sys.path.insert(0, str(PACKAGE_ROOT)) - -env = PACKAGE_ROOT / ".env" -load_dotenv(env) diff --git a/services/inference/demo.py b/services/inference/demo.py deleted file mode 100644 index 73d925b..0000000 --- a/services/inference/demo.py +++ /dev/null @@ -1,35 +0,0 @@ -import requests - -# Define the URL of the FastAPI endpoint -endpoint_url = "http://localhost:8003/gpt3_turbo/generate_code/" - -input_data = {"text": "def greet(user): print(f'hello !')"} -input_data2 = {"text": "Generate Javascript: get weather for a city"} -prompt = { - "prompt": """ -Generate TypeScript implementation for the function signature below. The comments above the function signature describe what it does. -Guides: -- Use async/await instead of promise chains. -- Create a new state via spread syntax: `const newState = { ...state, data: data }`. -- Ensure you import and use http from @openfn/language-common for HTTP requests (assume available). -- Copy the comments (see /**/) and include before function definition. -- Do not include the given type and function definitions in the output. - -Signature: -/** -* Retrieves a list of breeds and includes it in the state data. -* Sends a GET request to the /breeds endpoint. -* @parameter callback {{Function}} - a callback which is invoked with the resulting state at the end of this operation. Allows users to customise the resulting state. State.data includes the response from Cat -* @returns A function that updates the state with the retrieved list of breeds. -*/ -declare function GetCatBreeds(callback: (fn: (inState: State) => State)): (outState: State) => State; -type Breed = {{ breed: string; country: string; origin: string; coat: string; pattern: string; }}; - -type State = {{ configuration: C; data: Breed[];}}; - -Code: -/* */ -""", -} -response = requests.post(endpoint_url, json=prompt) -# print response json() ["generate_code"] [0] diff --git a/services/inference/inference.py b/services/inference/inference.py new file mode 100644 index 0000000..e4df2bb --- /dev/null +++ b/services/inference/inference.py @@ -0,0 +1,54 @@ +import logging + +from .models.gpt3_turbo import generate as gpt3_turbo +from .models.codet5 import generate as codet5 +from .models.gpt_ft import generate as gpt_ft +from util import DictObj + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +# all http calls to inference need a model and prompt, and optionally an args dict +class Payload: + def __init__(self, dict): + self.model = dict["model"] + self.prompt = dict["prompt"] + if "args" in dict: + self.args = DictObj(dict.get("args", {})) + else: + self.args = DictObj({}) + + +# This is interface for calls from js-land (via http) +def main(dataDict): + data = Payload(dataDict) + + result = generate(data.model, data.prompt, data.args) + + logger.info(result) + + return result + + +# This is an internal entrypoint, used by other modules +def generate(model, prompt, args): + result = "" + + if model == "gpt3_turbo": + if isinstance(prompt, str): + prompt = [{"role": "user", "content": prompt}] + result = gpt3_turbo(prompt, args.get("key")) + + # This is likely to be unstable + if model == "gpt3_ft": + if isinstance(prompt, str): + prompt = [{"role": "user", "content": prompt}] + result = gpt_ft(prompt, args.get("key")) + + if model == "codet5": + result = codet5(prompt) + + # TODO llama2 is broken + + return result diff --git a/services/inference/inference/__init__.py b/services/inference/inference/__init__.py deleted file mode 100644 index ae1f588..0000000 --- a/services/inference/inference/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from dotenv import load_dotenv -from pathlib import Path - -path = Path(__file__).parent.parent / ".env" -load_dotenv(path) diff --git a/services/inference/inference/api/__init__.py b/services/inference/inference/api/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/inference/inference/api/codet5.py b/services/inference/inference/api/codet5.py deleted file mode 100644 index e95fba3..0000000 --- a/services/inference/inference/api/codet5.py +++ /dev/null @@ -1,34 +0,0 @@ -import logging - -from fastapi import APIRouter, HTTPException - -from inference.models.codet5 import CodeT5 -from inference.schemas.models import CodeOutput, PromptInput - -logger = logging.getLogger(__name__) -router = APIRouter() - -# Initialize the CodeT5 model -code_t5 = CodeT5() - - -@router.post("/generate_code") -def generate_code(input_data: PromptInput) -> CodeOutput: - """ - Generate code based on the provided input text using the CodeT5 model. - The function handles HTTP POST requests and returns the generated code, - or an appropriate error message if an issue occurs during code generation. - """ - - try: - text = input_data.prompt - generated_code = code_t5.generate_code(text) - if generated_code is None: - raise HTTPException( - status_code=500, - detail="An error occurred during code generation", - ) - return {"generated_code": generated_code} - except Exception as e: - logger.error(f"An error occurred during code generation: {e}") - raise HTTPException(status_code=500, detail=f"An error occurred: {e}") from None diff --git a/services/inference/inference/api/gpt2.py b/services/inference/inference/api/gpt2.py deleted file mode 100644 index d925e85..0000000 --- a/services/inference/inference/api/gpt2.py +++ /dev/null @@ -1,34 +0,0 @@ -import logging - -from fastapi import APIRouter, HTTPException - -from inference.models.gpt2 import GPT2 -from inference.schemas.models import CodeOutput, PromptInput - -logger = logging.getLogger(__name__) -router = APIRouter() - -# Initialize the GPT2 model -gpt2 = GPT2() - - -@router.post("/generate_code") -def generate_code(input_data: PromptInput) -> CodeOutput: - """ - Generate code based on the provided input text using the GPT-2 model. - The function handles HTTP POST requests and returns the generated code, - or an appropriate error message if an issue occurs during code generation. - """ - - try: - prompt = input_data.prompt - generated_code = gpt2.generate(prompt) - if generated_code is None: - raise HTTPException( - status_code=500, - detail="An error occurred during code generation", - ) - return {"generated_code": generated_code} - except Exception as e: - logger.error(f"An error occurred during code generation: {e}") - raise HTTPException(status_code=500, detail=f"An error occurred: {e}") from None diff --git a/services/inference/inference/api/gpt3.py b/services/inference/inference/api/gpt3.py deleted file mode 100644 index fdf9aec..0000000 --- a/services/inference/inference/api/gpt3.py +++ /dev/null @@ -1,34 +0,0 @@ -import logging - -from fastapi import APIRouter, HTTPException - -from inference.models.gpt3 import GPT3 -from inference.schemas.models import CodeOutput, PromptInput - -logger = logging.getLogger(__name__) -router = APIRouter() - -# Initialize the GPT3 model -gpt3 = GPT3() - - -@router.post("/generate_code") -def generate_code(input_data: PromptInput) -> CodeOutput: - """ - Generate code based on the provided input text using the GPT-3 model. - The function handles HTTP POST requests and returns the generated code, - or an appropriate error message if an issue occurs during code generation. - """ - - try: - prompt = input_data.prompt - generated_code = gpt3.generate(prompt) - if generated_code is None: - raise HTTPException( - status_code=500, - detail="An error occurred during code generation", - ) - return {"generated_code": [generated_code]} - except Exception as e: - logger.error(f"An error occurred during code generation: {e}") - raise HTTPException(status_code=500, detail=f"An error occurred: {e}") from None diff --git a/services/inference/inference/api/gpt3_turbo.py b/services/inference/inference/api/gpt3_turbo.py deleted file mode 100644 index 6c5af66..0000000 --- a/services/inference/inference/api/gpt3_turbo.py +++ /dev/null @@ -1,36 +0,0 @@ -import logging - -from fastapi import APIRouter, HTTPException - -from inference.models.gpt3_turbo import GPT3Turbo -from inference.schemas.models import CodeOutput, MessageInput - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) -router = APIRouter() - -# Initialize the GPT3 model -gpt3 = GPT3Turbo() - - -@router.post("/generate_code") -def generate_code(input_data: MessageInput) -> CodeOutput: - """ - Generate code based on the provided input text using the GPT-3 model. - The function handles HTTP POST requests and returns the generated code, - or an appropriate error message if an issue occurs during code generation. - """ - - try: - messages = input_data.prompt - generated_code = gpt3.generate(messages) - if generated_code is None: - logger.error("An error occurred during code generation") - raise HTTPException( - status_code=500, - detail="An error occurred during code generation", - ) - return {"generated_code": [generated_code]} - except Exception as e: - logger.error(f"An error occurred during code generation: {e}") - raise HTTPException(status_code=500, detail=f"An error occurred: {e}") from None diff --git a/services/inference/inference/api/gpt_ft.py b/services/inference/inference/api/gpt_ft.py deleted file mode 100644 index 0910358..0000000 --- a/services/inference/inference/api/gpt_ft.py +++ /dev/null @@ -1,35 +0,0 @@ -import logging - -from fastapi import APIRouter, HTTPException - -from inference.models.gpt_ft import GPT3Turbo -from inference.schemas.models import CodeOutput, MessageInput - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) -router = APIRouter() - -# Initialize the finetune GPT3.5-turbo model -gpt3 = GPT3Turbo() - - -@router.post("/generate_code") -def generate_code(input_data: MessageInput) -> CodeOutput: - """ - Generate code based on the provided input text using the finetuned GPT-3.5-turbo model. - The function handles HTTP POST requests and returns the generated code, - or an appropriate error message if an issue occurs during code generation. - """ - - try: - messages = input_data.prompt - generated_code = gpt3.generate(messages) - if generated_code is None: - raise HTTPException( - status_code=500, - detail="An error occurred during code generation", - ) - return {"generated_code": [generated_code]} - except Exception as e: - logger.error(f"An error occurred during code generation: {e}") - raise HTTPException(status_code=500, detail=f"An error occurred: {e}") from None diff --git a/services/inference/inference/main.py b/services/inference/inference/main.py deleted file mode 100644 index 69df366..0000000 --- a/services/inference/inference/main.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -import logging - -from fastapi import FastAPI - -from inference.api import codet5, gpt2, gpt3, gpt3_turbo, gpt_ft, llama2 -from inference.schemas.constants import HOST, PORT - -# Configure logging -logging.basicConfig( - filename="app.log", - level=logging.ERROR, - format="%(asctime)s %(levelname)s %(name)s %(message)s", -) - -app = FastAPI(title="Code Generation Inference Service", openapi_url="/openapi.json") - - -@app.get("/", status_code=200) -async def root() -> dict: - """ - Root GET - """ - return {"Inference Service": "running"} - - -# app.include_router(codet5.router, prefix="/codet5", tags=["CodeT5 generation"]) -# app.include_router(gpt2.router, prefix="/gpt2", tags=["GPT2 generation"]) -# app.include_router(gpt3.router, prefix="/gpt3", tags=["GPT3 generation"]) -app.include_router( - gpt3_turbo.router, prefix="/gpt3_turbo", tags=["GPT3.5 Turbo generation"] -) -app.include_router(gpt_ft.router, prefix="/gpt_ft", tags=["GPT-FT generation"]) -# app.include_router(llama2.router, prefix="/llama2", tags=["LLaMA-2 generation"]) - -if __name__ == "__main__": - # Use this for debugging purposes only - import uvicorn - - uvicorn.run(app, host=HOST, port=PORT, log_level="debug") diff --git a/services/inference/inference/models/__init__.py b/services/inference/inference/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/inference/inference/models/codet5.py b/services/inference/inference/models/codet5.py deleted file mode 100644 index 5c14a26..0000000 --- a/services/inference/inference/models/codet5.py +++ /dev/null @@ -1,46 +0,0 @@ -import logging - -from transformers import RobertaTokenizer, T5ForConditionalGeneration - -# Create a logger -logger = logging.getLogger(__name__) - - -class CodeT5: - def __init__(self): - # Initialize the CodeT5 model with the pretrained model and tokenizer - self.model_name = "Salesforce/codet5-base" - self.tokenizer = RobertaTokenizer.from_pretrained(self.model_name) - self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) - logger.info(f"Model {self.model_name} loaded.") - - def generate_code( - self, - text: str, - max_length: int = 1024, - num_return_sequences: int = 1, - ) -> list[str]: - """ - Generate code from text using the CodeT5 model - :param text: Input text to generate code - :param max_length: Maximum length of the generated code - :param num_return_sequences: Number of code sequences to return - :return: Generated code in a list - """ - try: - # Encode the text and generate the code - input_ids = self.tokenizer.encode(text, return_tensors="pt") - outputs = self.model.generate( - input_ids, - max_length=max_length, - num_return_sequences=num_return_sequences, - ) - response = [ - self.tokenizer.decode(output, skip_special_tokens=True) - for output in outputs - ] - return response - except Exception as e: - # logs error if an exception occurs during code generation - logger.error(f"An error occurred during code generation: {e}") - return None diff --git a/services/inference/inference/models/gpt2.py b/services/inference/inference/models/gpt2.py deleted file mode 100644 index 711be94..0000000 --- a/services/inference/inference/models/gpt2.py +++ /dev/null @@ -1,42 +0,0 @@ -import logging - -from transformers import GPT2LMHeadModel, GPT2Tokenizer - -# Create a logger -logger = logging.getLogger(__name__) - - -class GPT2: - def __init__(self): - self.model_name = "gpt2" - self.tokenizer = GPT2Tokenizer.from_pretrained("gpt2") - self.model = GPT2LMHeadModel.from_pretrained("gpt2") - logger.info(f"Model {self.model_name} loaded.") - - def generate( - self, text: str, max_length: int = 1024, num_return_sequences: int = 1 - ) -> str: - """ - Generates text using the GPT-2 model - :param text: Input text to generate continuation from - :param max_length: Maximum length of the generated text - :param num_return_sequences: Number of text sequences to return - :return: Generated text in a list - """ - try: - inputs = self.tokenizer( - text, return_tensors="pt", max_length=max_length, truncation=True - ) - outputs = self.model.generate( - inputs.input_ids, - max_length=max_length, - num_return_sequences=num_return_sequences, - ) - response = [ - self.tokenizer.decode(output, skip_special_tokens=True) - for output in outputs - ] - return response - except Exception as e: - logger.error(f"An error occurred during GPT-2 generation: {e}") - return None diff --git a/services/inference/inference/models/gpt3.py b/services/inference/inference/models/gpt3.py deleted file mode 100644 index d047668..0000000 --- a/services/inference/inference/models/gpt3.py +++ /dev/null @@ -1,40 +0,0 @@ -import logging -import os - -from openai import OpenAI - -# Create a logger -logger = logging.getLogger(__name__) - -OPENAI_API_KEY = os.getenv( - "OPENAI_API_KEY", -) - -client = OpenAI(api_key=OPENAI_API_KEY) - - -class GPT3: - def __init__(self, open_api_key: str = OPENAI_API_KEY): - self.model_name = "text-davinci-003" - self.api_key = open_api_key - logger.info(f"Model {self.model_name} loaded.") - - def generate(self, prompt: str, max_tokens: int = 256) -> str: - """ - Generates a completion from the GPT-3 model - :param prompt: The text used to prompt the model - :param max_tokens: Maximum number of tokens in the completion - :return: The completion generated by the GPT-3 model - """ - try: - logger.info("Generating..") - response = client.completions.create( - engine="text-davinci-003", - prompt=prompt, - max_tokens=max_tokens, - temperature=0, - ) - return response.choices[0].text - except Exception as e: - logger.error(f"An error occurred during GPT-3 completion: {e}") - return None diff --git a/services/inference/inference/models/gpt3_turbo.py b/services/inference/inference/models/gpt3_turbo.py deleted file mode 100644 index 355d797..0000000 --- a/services/inference/inference/models/gpt3_turbo.py +++ /dev/null @@ -1,40 +0,0 @@ -import logging -import os - -from openai import OpenAI - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -OPENAI_API_KEY = os.getenv( - "OPENAI_API_KEY", -) - - -class GPT3Turbo: - def __init__(self, open_api_key: str = OPENAI_API_KEY): - self.model_name = "gpt-3.5-turbo" - self.api_key = open_api_key - self.client = OpenAI(api_key=open_api_key) - logger.info(f"OpenAI {self.model_name} client loaded.") - - def generate(self, messages: list, max_tokens: int = 256) -> str: - """ - Generates a completion from the GPT-3.5 Turbo model - :param messages: A list of message objects for conversation format - :param max_tokens: Maximum number of tokens in the completion - :return: The stripped content of the completion generated by the GPT-3.5 Turbo model - """ - try: - logger.info("Generating") - response = self.client.chat.completions.create( - messages=messages, - model="gpt-3.5-turbo", - temperature=0, - max_tokens=max_tokens, - ) - return response.choices[0].message.content.strip() - except Exception as e: - error_message = f"An error occurred during GPT-3.5 Turbo completion: {e}" - logger.error(error_message) - raise Exception(status_code=500, detail=error_message) diff --git a/services/inference/inference/models/gpt_ft.py b/services/inference/inference/models/gpt_ft.py deleted file mode 100644 index d419739..0000000 --- a/services/inference/inference/models/gpt_ft.py +++ /dev/null @@ -1,39 +0,0 @@ -import logging -import os - -from openai import OpenAI - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -OPENAI_API_KEY = os.getenv( - "OPENAI_API_KEY", -) - - -class GPT3Turbo: - def __init__(self, open_api_key: str = OPENAI_API_KEY): - self.model_name = "ft:gpt-3.5-turbo-1106:openfn::8XNmyYHo" # "ft:gpt-3.5-turbo-0613:openfn::8YbBJOlD" best 2 models - self.api_key = open_api_key - self.client = OpenAI(api_key=open_api_key) - logger.info(f"OpenAI {self.model_name} client loaded.") - - def generate(self, messages: list, max_tokens: int = 1024) -> str: - """ - Generates a completion from the finetuned GPT-3.5 Turbo model - :param messages: A list of message objects for conversation format - :param max_tokens: Maximum number of tokens in the completion - :return: The stripped content of the completion generated by the GPT-3.5 Turbo model - """ - try: - response = self.client.chat.completions.create( - messages=messages, - model=self.model_name, - temperature=0, - max_tokens=max_tokens, - ) - return response.choices[0].message.content.strip() - except Exception as e: - error_message = f"An error occurred during GPT-ft Turbo completion: {e}" - logger.error(error_message) - raise Exception(status_code=500, detail=error_message) diff --git a/services/inference/inference/schemas/__init__.py b/services/inference/inference/schemas/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/inference/inference/schemas/constants.py b/services/inference/inference/schemas/constants.py deleted file mode 100644 index 56eda2d..0000000 --- a/services/inference/inference/schemas/constants.py +++ /dev/null @@ -1,3 +0,0 @@ -# API Constants -HOST = "0.0.0.0" -PORT = 8003 diff --git a/services/inference/inference/tmp/keys.py b/services/inference/inference/tmp/keys.py deleted file mode 100644 index 9297c49..0000000 --- a/services/inference/inference/tmp/keys.py +++ /dev/null @@ -1,2 +0,0 @@ -# API KEYS -open_api_key = "YOUR_API_KEY" diff --git a/services/inference/models/codet5.py b/services/inference/models/codet5.py new file mode 100644 index 0000000..a70cdae --- /dev/null +++ b/services/inference/models/codet5.py @@ -0,0 +1,41 @@ +import logging +import os + +from transformers import RobertaTokenizer, T5ForConditionalGeneration + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +""" +Generate from text using the CodeT5 model +:param prompt: Input text to generate from +:param max_length: Maximum length of the generated text +:param num_return_sequences: Number of text sequences to return +:return: Generated text +""" + + +def generate( + prompt, + max_length: int = 1024, + num_return_sequences: int = 1, +) -> str: + + try: + model_name = "Salesforce/codet5-base" + tokenizer = RobertaTokenizer.from_pretrained(model_name) + model = T5ForConditionalGeneration.from_pretrained(model_name) + logger.info(f"Model {model_name} loaded.") + + logger.info("Generating") + input_ids = tokenizer.encode(prompt, return_tensors="pt") + outputs = model.generate( + input_ids, + max_length=max_length, + num_return_sequences=num_return_sequences, + ) + response = [tokenizer.decode(output, skip_special_tokens=True) for output in outputs] + return response[0] + except Exception as e: + logger.error(f"An error occurred during codet5 generation: {e}") diff --git a/services/inference/models/gpt3_turbo.py b/services/inference/models/gpt3_turbo.py new file mode 100644 index 0000000..5b99dc8 --- /dev/null +++ b/services/inference/models/gpt3_turbo.py @@ -0,0 +1,45 @@ +import logging +import os + +from openai import OpenAI + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +OPENAI_API_KEY = os.getenv( + "OPENAI_API_KEY", +) + +""" +Generates a response from the GPT-3.5 Turbo model +""" + + +def generate(prompt, api_key) -> str: + if api_key is None and isinstance(OPENAI_API_KEY, str): + logger.warn("Using default API key from environment") + api_key = OPENAI_API_KEY + + # for now we'll create a new client for every request + # idk the pros or cons of this - check the docs I guess! + client = OpenAI(api_key=api_key) + logger.info(f"OpenAI GPT-3.5 Turbo client loaded.") + + try: + logger.info("Generating") + max_tokens = 256 # TODO maybe take an option for this? + response = client.chat.completions.create( + messages=prompt, + model="gpt-3.5-turbo", + temperature=0, + max_tokens=max_tokens, + ) + result = response.choices[0].message.content.strip() + if result is None: + logger.error("An error occurred during GPT-3.5 Turbocode generation") + else: + logger.info("done") + + return result + except Exception as e: + logger.error(f"An error occurred during GPT-3.5 Turbo code generation: {e}") diff --git a/services/inference/models/gpt_ft.py b/services/inference/models/gpt_ft.py new file mode 100644 index 0000000..deffd37 --- /dev/null +++ b/services/inference/models/gpt_ft.py @@ -0,0 +1,37 @@ +import logging +import os + +from openai import OpenAI + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +OPENAI_API_KEY = os.getenv( + "OPENAI_API_KEY", +) + +""" +Generates a response from the finetuned GPT-3.5 Turbo model +""" + + +def generate(prompt, api_key) -> str: + if api_key is None and isinstance(OPENAI_API_KEY, str): + logger.warn("Using default API key from environment") + api_key = OPENAI_API_KEY + + try: + model_name = "ft:gpt-3.5-turbo-1106:openfn::8XNmyYHo" # "ft:gpt-3.5-turbo-0613:openfn::8YbBJOlD" best 2 models + client = OpenAI(api_key=api_key) + logger.info(f"OpenAI {model_name} client loaded.") + + response = client.chat.completions.create( + messages=prompt, + model=model_name, + temperature=0, + max_tokens=256, + ) + return response.choices[0].message.content.strip() + except Exception as e: + error_message = f"An error occurred during GPT-ft Turbo completion: {e}" + logger.error(error_message) diff --git a/services/inference/inference/api/llama2.py b/services/inference/models/llama2.py similarity index 74% rename from services/inference/inference/api/llama2.py rename to services/inference/models/llama2.py index 9107e4a..0930435 100644 --- a/services/inference/inference/api/llama2.py +++ b/services/inference/models/llama2.py @@ -3,8 +3,6 @@ from fastapi import APIRouter, HTTPException -from inference.schemas.models import CodeOutput, PromptInput - logger = logging.getLogger(__name__) router = APIRouter() @@ -12,8 +10,8 @@ llama2_endpoint = "https://9a1b-31-12-82-146.ngrok-free.app/generate_code" # Offline -@router.post("/generate_code") -def generate_code(input_data: PromptInput) -> CodeOutput: +# TODO this is likely broken +def generate_code(prompt: str) -> str: """ Generate code based on the provided input text using the Llama-2-7b-hf model. The function handles HTTP POST requests and returns the generated code, @@ -21,13 +19,13 @@ def generate_code(input_data: PromptInput) -> CodeOutput: """ try: - payload = {"prompt": input_data.prompt} + payload = {"prompt": prompt} response = requests.post(llama2_endpoint, json=payload) # Check if the request was successful (status code 200) if response.status_code == 200: - generated_code = response.json().get("generated_code") - return {"generated_code": generated_code} + result = response.json().get("generated_code") + return result else: raise HTTPException( status_code=response.status_code, diff --git a/services/inference/pyproject.toml b/services/inference/pyproject.toml deleted file mode 100644 index 385c193..0000000 --- a/services/inference/pyproject.toml +++ /dev/null @@ -1,27 +0,0 @@ -[tool.poetry] -name = "inference" -version = "0.1.0" -description = "" -authors = ["Isma-Ilou Sadou "] -readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.9" -transformers = "^4.34.1" -torch = "^2.1.0" -openai = "^1.2.4" -fastapi = "^0.104.1" -pydantic = "1.10.11" -uvicorn = "^0.24.0.post1" -python-dotenv = "^1.0.0" - - -[tool.poetry.group.dev.dependencies] -black = "^23.10.1" -ruff = "^0.1.1" -pre-commit = "^3.5.0" -pytest = "^7.4.2" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/services/inference/run.sh b/services/inference/run.sh deleted file mode 100755 index 9c663ee..0000000 --- a/services/inference/run.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -source "$(poetry env info --path)/bin/activate" - -echo $(poetry env info --path) - -python --version - -export APP_MODULE=${APP_MODULE-inference.main:app} -export HOST=${HOST:-0.0.0.0} -export PORT=${PORT:-8003} - -exec uvicorn --reload --host $HOST --port $PORT "$APP_MODULE" diff --git a/services/inference/inference/schemas/models.py b/services/inference/schemas.py similarity index 64% rename from services/inference/inference/schemas/models.py rename to services/inference/schemas.py index 73c5e37..bc24894 100644 --- a/services/inference/inference/schemas/models.py +++ b/services/inference/schemas.py @@ -16,3 +16,13 @@ class MessageInput(BaseModel): class CodeOutput(BaseModel): generated_code: list[str] + + +class GenOutput: + text: str + + def __init__(self, result): + self.text = result + + def __repr__(self): + return self.text diff --git a/services/inference/tests/__init__.py b/services/inference/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/openfn_llama/.env.example b/services/openfn_llama/.env.example deleted file mode 100644 index 368a2db..0000000 --- a/services/openfn_llama/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -OPENAI_API_KEY=sk-YOUR-API-KEY-HERE -HF_ACCESS_TOKEN=hf_YOUR-API-KEY-HERE # llama2 base \ No newline at end of file diff --git a/services/openfn_llama/README.md b/services/openfn_llama/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/services/openfn_llama/datasets/.DS_Store b/services/openfn_llama/datasets/.DS_Store deleted file mode 100644 index 8cb2b9a..0000000 Binary files a/services/openfn_llama/datasets/.DS_Store and /dev/null differ diff --git a/services/openfn_llama/datasets/rest_adaptors/openmrs/.DS_Store b/services/openfn_llama/datasets/rest_adaptors/openmrs/.DS_Store deleted file mode 100644 index 8cb2b9a..0000000 Binary files a/services/openfn_llama/datasets/rest_adaptors/openmrs/.DS_Store and /dev/null differ diff --git a/services/openfn_llama/tests/__init__.py b/services/openfn_llama/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/signature_generator/.dockerignore b/services/signature_generator/.dockerignore deleted file mode 100644 index e89968c..0000000 --- a/services/signature_generator/.dockerignore +++ /dev/null @@ -1,15 +0,0 @@ -# Ignore .env files -*.env - -# Ignore log files -*.log - -# Ignore datasets -*.csv -*.json -*.jsonl - -# .gitignore content -.git -__pycache__ -.cache \ No newline at end of file diff --git a/services/signature_generator/.env.example b/services/signature_generator/.env.example deleted file mode 100644 index 5d962ea..0000000 --- a/services/signature_generator/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -# INFERENCE_BASEURL='http://localhost:8003/' -INFERENCE_BASEURL='http://inference:8003/' # when using docker \ No newline at end of file diff --git a/services/signature_generator/Dockerfile b/services/signature_generator/Dockerfile deleted file mode 100644 index 1a4c7a8..0000000 --- a/services/signature_generator/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 - -WORKDIR /app - -COPY ./pyproject.toml ./en_core_web_sm-3.7.1-py3-none-any.whl ./ -COPY ./poetry.lock* ./ - -ENV POETRY_VERSION=1.6.1 -RUN pip install "poetry==$POETRY_VERSION" -ENV POETRY_VIRTUALENVS_CREATE=false - -RUN poetry install --no-dev --no-root - -COPY ./ . - -EXPOSE 8001 - -CMD ["uvicorn", "signature_generator.main:app", "--host", "0.0.0.0", "--port", "8001"] \ No newline at end of file diff --git a/services/signature_generator/README.md b/services/signature_generator/README.md index e69de29..9f954c3 100644 --- a/services/signature_generator/README.md +++ b/services/signature_generator/README.md @@ -0,0 +1,46 @@ +## Signature Generator + +This service generates a Typescript signature for an adaptor to serve ONE +endpoint of a REST API. + +An OpenAPI spec of the Rest API must be included in the request. + +This service is designed for use in the adaptor generator pipeline. + +## Usage + +Call the endpoint at `services/signature_generator` + +```bash +curl -X POST localhost:3000/services/signature_generator --json @tmp/sig-cat.json +``` + +## Payload + +To call the service, include the following JSON payload: + +```json +{ + "model": "gpt3_turbo", // the only model supported right now + "instruction": "Create an OpenFn function that accesses the /breeds endpoint", // A prompt to pass to the model (TODO: this should just be the endpoint name) + "open_api_spec": {}, // A JSON OpenAPI spc to generate against + "api_key": "..." // An API key for the model (openai) +} +``` + +## API Keys + +You should include an `api_key` in your JSON payload in order for the inference +to run. + +For local testing, if an api key is not included in the payload, the inference +service may try to load one from the environment. A warning will be logged if +this is the case. + +## Implementation Details + +This service is mostly concerned with generating the prompt that will be sent to +the model. The heavy-lifting is handled by the inference service. + +The service is intentionally restricted to only generate a single signature for +a single endpoint. diff --git a/services/signature_generator/__init__.py b/services/signature_generator/__init__.py deleted file mode 100644 index fe0d025..0000000 --- a/services/signature_generator/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -import sys -from dotenv import load_dotenv -from pathlib import Path - -# Add the path to the root directory of the package to the Python path -PACKAGE_ROOT = Path(__file__).resolve().parent -sys.path.insert(0, str(PACKAGE_ROOT)) - -env = PACKAGE_ROOT / ".env" -load_dotenv(env) diff --git a/services/signature_generator/demo.py b/services/signature_generator/demo.py deleted file mode 100644 index 642d7a2..0000000 --- a/services/signature_generator/demo.py +++ /dev/null @@ -1,47 +0,0 @@ -import json -import logging -from pathlib import Path - -import requests - -logger = logging.getLogger(__name__) -end_point = "http://localhost:8003/generate_signature/" - - -# Opening JSON file -file_path = Path("tmp/spec.json") -with file_path.open("r") as file: - full_spec = json.load(file) - -spec = """ -GET /cat -Response 200: -- Cat: - name: string - age: number -""" - -instruction = """Create an OpenFn function that accesses the /breeds endpoint""" - - -data = { - "open_api_spec": spec, - "instruction": instruction, - "model": "gpt3", -} -data_full = { - "open_api_spec": full_spec, - "instruction": instruction, - "model": "gpt3", -} -data_default = {"open_api_spec": spec, "instruction": instruction} - -#### v1 -# For V1 use endpoint requests.post(end_point, json=data) - - -#### v2 - -end_point = "http://localhost:8003/generate_signature_v2/" -response = requests.post(end_point, json=data_full) -# results in response json() ["signature"] diff --git a/services/signature_generator/signature_generator/utils/prompts.py b/services/signature_generator/prompts.py similarity index 100% rename from services/signature_generator/signature_generator/utils/prompts.py rename to services/signature_generator/prompts.py diff --git a/services/signature_generator/pyproject.toml b/services/signature_generator/pyproject.toml deleted file mode 100644 index 7cbf2ab..0000000 --- a/services/signature_generator/pyproject.toml +++ /dev/null @@ -1,26 +0,0 @@ -[tool.poetry] -name = "signature-generator" -version = "0.1.0" -description = "" -authors = ["Isma-Ilou Sadou "] -readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.9" -requests = "^2.31.0" -fastapi = "^0.104.0" -spacy = "^3.7.2" -pathlib = "^1.0.1" -uvicorn = "^0.24.0.post1" -en-core-web-sm = { file = "en_core_web_sm-3.7.1-py3-none-any.whl" } - - -[tool.poetry.group.dev.dependencies] -black = "^23.10.1" -ruff = "^0.1.3" -pre-commit = "^3.5.0" -pytest = "^7.4.3" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/services/signature_generator/run.sh b/services/signature_generator/run.sh deleted file mode 100755 index 6a31f1d..0000000 --- a/services/signature_generator/run.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -export APP_MODULE=${APP_MODULE-signature_generator.main:app} -export HOST=${HOST:-0.0.0.0} -export PORT=${PORT:-8001} - -exec uvicorn --reload --host $HOST --port $PORT "$APP_MODULE" diff --git a/services/signature_generator/signature_generator.py b/services/signature_generator/signature_generator.py new file mode 100644 index 0000000..dc771e5 --- /dev/null +++ b/services/signature_generator/signature_generator.py @@ -0,0 +1,62 @@ +import logging + +import inference.inference + +from .prompts import generate_prompt +from .utils import ( + extract_api_info, + parse_openapi_spec, + trim_signature, +) +from util import DictObj + +from inference import inference + +# TODO the platform should deal with logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +class Payload(DictObj): + api_key: str + open_api_spec: dict + instruction: str + model: str + + +def main(dataDict) -> dict: + data = Payload(dataDict) + + # TODO: validate args and throw if anything looks amiss + + # TODO passing the spec as a DictObj fails - this is annoying. + result = generate(data.model, dataDict["open_api_spec"], data.instruction, data.get("api_key")) + + return result + + +# TODO the final argument needs to be more broad to support different models +def generate(model, spec, instruction, key): + logger.info(f"Generating signature for model {model}") + + logger.info("Parsing OpenAPI specification") + parsed_spec = parse_openapi_spec(spec) + + logger.info("Extracting API information from parsed spec with provided instruction") + api_info = extract_api_info(parsed_spec, instruction) + + prompt_template = "signature" if model == "gpt3_turbo" else "signature_text" + logger.info(f"Generating {model} prompt for signature generation") + + prompt = generate_prompt(prompt_template, spec=api_info, instruction=instruction) + + signature = inference.generate(model, prompt, {"key": key}) + signature = trim_signature(signature) + + logger.info("Signature generation complete") + return signature + + +# for local testing +if __name__ == "__main__": + main({"model": "turbo"}) diff --git a/services/signature_generator/signature_generator/__init__.py b/services/signature_generator/signature_generator/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/signature_generator/signature_generator/api/__init__.py b/services/signature_generator/signature_generator/api/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/signature_generator/signature_generator/api/routers.py b/services/signature_generator/signature_generator/api/routers.py deleted file mode 100644 index 4291628..0000000 --- a/services/signature_generator/signature_generator/api/routers.py +++ /dev/null @@ -1,72 +0,0 @@ -import logging -from fastapi import APIRouter -from signature_generator.utils.models import SignatureGenerator, SignatureInput -from signature_generator.utils.prompts import generate_prompt -from signature_generator.utils.utils import ( - extract_api_info, - get_model_endpoint, - parse_openapi_spec, - trim_signature, -) - -# Configure logger -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -router = APIRouter() - -router.post("/generate_signature", response_model=dict) - - -@router.post("/generate_signature") -async def generate_signature(data: SignatureInput) -> dict: - logger.info(f"Generating signature for model {data.model}") - generator = SignatureGenerator(get_model_endpoint(data.model)) - logger.info("Parsing OpenAPI specification") - parsed_spec = parse_openapi_spec(data.open_api_spec) - logger.info("Extracting API information from parsed spec with provided instruction") - api_info = extract_api_info(parsed_spec, data.instruction) - prompt_template = "signature" if data.model == "gpt3_turbo" else "signature_text" - logger.info(f"Generating {data.model} prompt for signature generation") - prompt = generate_prompt( - prompt_template, spec=api_info, instruction=data.instruction - ) - - signature = generator.generate(prompt)[0] - signature = trim_signature(signature) - - logger.info("Signature generation complete") - return {"signature": signature} - - -# @router.post("/generate_signature") -# async def generate_signature(data: SignatureInput) -> dict: -# """ -# Generate signature for a given OpenAPI spec and instruction. -# """ -# logger.info(f"Generating signature for model {data.model}") -# generator = SignatureGenerator(get_model_endpoint(data.model)) - -# logger.info("Parsing OpenAPI specification") -# parsed_spec = parse_openapi_spec(data.open_api_spec) - -# logger.info("Extracting API information from parsed spec with provided instruction") -# api_info = extract_api_info(parsed_spec, data.instruction) - -# prompt_template = "signature" if data.model == "gpt3_turbo" else "signature_text" -# prompt = generate_prompt( -# prompt_template, spec=api_info, instruction=data.instruction -# ) - -# logger.info(f"Generating {data.model} prompt for signature generation") -# signature = generator.generate(prompt)[0] - -# end_tokens = "===" -# if end_tokens in signature: -# logger.info("Trimming the signature at the end token") -# signature = signature[: signature.find(end_tokens)] -# else: -# logger.warning("End token not found in the signature") - -# logger.info("Signature generation complete") -# return {"signature": signature} diff --git a/services/signature_generator/signature_generator/main.py b/services/signature_generator/signature_generator/main.py deleted file mode 100644 index 946af36..0000000 --- a/services/signature_generator/signature_generator/main.py +++ /dev/null @@ -1,32 +0,0 @@ -import logging - -from fastapi import FastAPI - -from signature_generator.api.routers import router -from signature_generator.utils.constants import HOST, PORT - -# Configure logging -logging.basicConfig( - filename="app.log", - level=logging.ERROR, - format="%(asctime)s %(levelname)s %(name)s %(message)s", -) - -app = FastAPI(title="Signature Generation Service", openapi_url="/openapi.json") - - -@app.get("/", status_code=200) -async def root() -> dict: - """ - Root GET - """ - return {"message": "The Signature Generator API is running!"} - - -app.include_router(router, tags=["Signature generation"]) - -if __name__ == "__main__": - # Use this for debugging purposes only - import uvicorn - - uvicorn.run(app, host=HOST, port=PORT, log_level="debug") diff --git a/services/signature_generator/signature_generator/utils/__init__.py b/services/signature_generator/signature_generator/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/signature_generator/signature_generator/utils/constants.py b/services/signature_generator/signature_generator/utils/constants.py deleted file mode 100644 index b14d375..0000000 --- a/services/signature_generator/signature_generator/utils/constants.py +++ /dev/null @@ -1,9 +0,0 @@ -# API Constants -HOST = "0.0.0.0" -PORT = 8001 - -# Inference Endpoints -# CODET5_ENDPOINT = "http://localhost:8002/codet5/generate_code/" - -# codes -SUCCESS_CODE: int = 200 diff --git a/services/signature_generator/signature_generator/utils/models.py b/services/signature_generator/signature_generator/utils/models.py deleted file mode 100644 index 3f2ea4a..0000000 --- a/services/signature_generator/signature_generator/utils/models.py +++ /dev/null @@ -1,39 +0,0 @@ -import logging -from typing import Union -from fastapi import HTTPException - -import requests -from pydantic import BaseModel - -logging.basicConfig(level=logging.INFO) - - -class SignatureGenerator: - def __init__(self, endpoint_url: str): - self.endpoint_url = endpoint_url - self.logger = logging.getLogger(__name__) - - def generate(self, prompt: str) -> str: - try: - headers = {"Content-Type": "application/json"} - data = {"prompt": prompt} - - response = requests.post(self.endpoint_url, headers=headers, json=data) - response.raise_for_status() - return response.json().get("generated_code") - except requests.exceptions.HTTPError as e: - error_message = f"HTTP error occurred: {e.response.status_code}, {e.response.text}, {self.endpoint_url}" - self.logger.error(error_message) - raise HTTPException( - status_code=e.response.status_code, detail=error_message - ) from e - except Exception as e: - error_message = f"An unexpected error occurred in code gen: {e}" - self.logger.error(error_message) - raise HTTPException(status_code=500, detail=error_message) - - -class SignatureInput(BaseModel): - open_api_spec: Union[str, dict] - instruction: str - model: str = "codet5" diff --git a/services/signature_generator/test/test.py b/services/signature_generator/test/test.py new file mode 100644 index 0000000..775b034 --- /dev/null +++ b/services/signature_generator/test/test.py @@ -0,0 +1 @@ +# tests go here \ No newline at end of file diff --git a/services/signature_generator/tests/__init__.py b/services/signature_generator/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/services/signature_generator/signature_generator/utils/utils.py b/services/signature_generator/utils.py similarity index 83% rename from services/signature_generator/signature_generator/utils/utils.py rename to services/signature_generator/utils.py index fa951f8..deb1181 100644 --- a/services/signature_generator/signature_generator/utils/utils.py +++ b/services/signature_generator/utils.py @@ -10,14 +10,6 @@ nlp = spacy.load("en_core_web_sm") -def get_model_endpoint(model_name: str) -> str: - """ - Get the endpoint for the model - """ - base_url = os.getenv("INFERENCE_BASEURL", "http://localhost:8003/") - return f"{base_url}{model_name.lower()}/generate_code/" - - def trim_signature(signature: str) -> str: end_tokens = "===" if end_tokens in signature: @@ -58,24 +50,18 @@ def get_schema_info(schema: dict[str, any], spec: dict[str, any]) -> list[dict]: if "$ref" in schema: schema_type = schema["$ref"].split("/")[-1] properties = spec["components"]["schemas"][schema_type]["properties"] - return schema_type, [ - {"name": key, "type": value["type"]} for key, value in properties.items() - ] + return schema_type, [{"name": key, "type": value["type"]} for key, value in properties.items()] elif "items" in schema: items = schema["items"] if "$ref" in items: schema_type = items["$ref"].split("/")[-1] properties = spec["components"]["schemas"][schema_type]["properties"] schema_type = f"list[{schema_type}]" - return schema_type, [ - {"name": key, "type": value["type"]} - for key, value in properties.items() - ] + return schema_type, [{"name": key, "type": value["type"]} for key, value in properties.items()] else: schema_type = schema.get("type") return schema_type, [ - {"name": key, "type": value["type"]} - for key, value in schema.get("properties", {}).items() + {"name": key, "type": value["type"]} for key, value in schema.get("properties", {}).items() ] @@ -88,12 +74,7 @@ def parse_openapi_spec(spec: dict[str, any]) -> list[dict]: current_operation = { "method": method.upper(), "parameters": [ - param - for param in ( - extract_parameter(p) - for p in operation.get("parameters", []) - ) - if param + param for param in (extract_parameter(p) for p in operation.get("parameters", [])) if param ], "responses": [ extract_schema(response_code, response, spec) @@ -120,9 +101,7 @@ def lemmatize_action(action: str) -> str: def find_closest_verb(endpoint_token: Token) -> str: # Iterate over the ancestors of the token (including itself) until a verb is found current_token = endpoint_token - while current_token is not None and ( - current_token.pos_ != "VERB" or current_token.text.lower() == "endpoint" - ): + while current_token is not None and (current_token.pos_ != "VERB" or current_token.text.lower() == "endpoint"): current_token = current_token.head # If a verb is found, return it; otherwise, return None @@ -136,11 +115,7 @@ def find_closest_verb(endpoint_token: Token) -> str: def find_related_verb(endpoint_token: Token, doc: Doc) -> str: # Find the verb related to the endpoint by searching for the nearest verb to the endpoint for token in doc: - if ( - token.head == endpoint_token - and token.pos_ == "VERB" - and token.text.lower() != "endpoint" - ): + if token.head == endpoint_token and token.pos_ == "VERB" and token.text.lower() != "endpoint": return lemmatize_action(token.text.lower()) return None @@ -212,11 +187,7 @@ def extract_api_info(api_spec: dict, instruction: str) -> dict[str, any]: operations = endpoint_info.get("operations", []) for operation in operations: method = action_method_mapping.get(action) - if ( - method - and "method" in operation - and operation["method"].upper() == method - ): + if method and "method" in operation and operation["method"].upper() == method: api_info = { "endpoint": endpoint, "action": action, diff --git a/services/util.py b/services/util.py new file mode 100644 index 0000000..d48f2ef --- /dev/null +++ b/services/util.py @@ -0,0 +1,15 @@ +# Thanks Joel! https://joelmccune.com/python-dictionary-as-object/ +class DictObj: + def __init__(self, in_dict: dict): + self._dict = in_dict + assert isinstance(in_dict, dict) + for key, val in in_dict.items(): + if isinstance(val, (list, tuple)): + setattr(self, key, [DictObj(x) if isinstance(x, dict) else x for x in val]) + else: + setattr(self, key, DictObj(val) if isinstance(val, dict) else val) + + def get(self, key): + if key in self._dict: + return self._dict[key] + return None diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4fc6e10 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "allowJs": true, + //"jsx": "react-jsx", + + // elysia wants this + "jsx": "react", + "jsxFactory": "Html.createElement", + "jsxFragmentFactory": "Html.Fragment", + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + + } +}