From bb5a9a5096421d5d90969c3c638a74a83cb960d8 Mon Sep 17 00:00:00 2001 From: Joe Nudell Date: Tue, 19 Aug 2025 11:01:04 -0400 Subject: [PATCH] add gitignore for python and cleanup --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 204 ++++++++++++++++ __pycache__/model.cpython-39.pyc | Bin 1534 -> 0 bytes tests/.DS_Store | Bin 8196 -> 0 bytes tests/data/.DS_Store | Bin 6148 -> 0 bytes tests/out/.DS_Store | Bin 6148 -> 0 bytes twix.egg-info/PKG-INFO | 225 ------------------ twix.egg-info/SOURCES.txt | 17 -- twix.egg-info/dependency_links.txt | 1 - twix.egg-info/requires.txt | 9 - twix.egg-info/top_level.txt | 1 - twix/__pycache__/__init__.cpython-39.pyc | Bin 589 -> 0 bytes twix/__pycache__/baselines.cpython-39.pyc | Bin 4530 -> 0 bytes twix/__pycache__/cost.cpython-39.pyc | Bin 955 -> 0 bytes twix/__pycache__/eval.cpython-39.pyc | Bin 8345 -> 0 bytes twix/__pycache__/extract.cpython-39.pyc | Bin 27821 -> 0 bytes twix/__pycache__/key.cpython-39.pyc | Bin 9795 -> 0 bytes twix/__pycache__/main.cpython-39.pyc | Bin 1003 -> 0 bytes twix/__pycache__/model.cpython-39.pyc | Bin 805 -> 0 bytes twix/__pycache__/pattern.cpython-39.pyc | Bin 30060 -> 0 bytes twix/__pycache__/transform.cpython-39.pyc | Bin 677 -> 0 bytes twix/__pycache__/user_apis.cpython-39.pyc | Bin 2595 -> 0 bytes twix/models/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 157 -> 0 bytes .../__pycache__/ai21_model.cpython-39.pyc | Bin 850 -> 0 bytes .../__pycache__/bert_model.cpython-39.pyc | Bin 899 -> 0 bytes .../flan_t5_base_model.cpython-39.pyc | Bin 623 -> 0 bytes .../flan_t5_large_model.cpython-39.pyc | Bin 626 -> 0 bytes .../flan_t5_small_model.cpython-39.pyc | Bin 626 -> 0 bytes .../__pycache__/gpt_35_azure.cpython-39.pyc | Bin 1404 -> 0 bytes .../__pycache__/gpt_35_long.cpython-39.pyc | Bin 1005 -> 0 bytes .../__pycache__/gpt_35_model.cpython-39.pyc | Bin 681 -> 0 bytes .../__pycache__/gpt_4_azure.cpython-39.pyc | Bin 1402 -> 0 bytes .../__pycache__/gpt_4_long.cpython-39.pyc | Bin 1406 -> 0 bytes .../__pycache__/gpt_4_model.cpython-39.pyc | Bin 668 -> 0 bytes .../__pycache__/gpt_4_vision.cpython-39.pyc | Bin 1210 -> 0 bytes twix/models/__pycache__/gpt_4o.cpython-39.pyc | Bin 742 -> 0 bytes .../__pycache__/gpt_4o_mini.cpython-39.pyc | Bin 762 -> 0 bytes .../gpt_4o_mini_vision.cpython-39.pyc | Bin 1165 -> 0 bytes .../__pycache__/gpt_4o_vision.cpython-39.pyc | Bin 1150 -> 0 bytes 40 files changed, 204 insertions(+), 253 deletions(-) delete mode 100644 .DS_Store create mode 100644 .gitignore delete mode 100644 __pycache__/model.cpython-39.pyc delete mode 100644 tests/.DS_Store delete mode 100644 tests/data/.DS_Store delete mode 100644 tests/out/.DS_Store delete mode 100644 twix.egg-info/PKG-INFO delete mode 100644 twix.egg-info/SOURCES.txt delete mode 100644 twix.egg-info/dependency_links.txt delete mode 100644 twix.egg-info/requires.txt delete mode 100644 twix.egg-info/top_level.txt delete mode 100644 twix/__pycache__/__init__.cpython-39.pyc delete mode 100644 twix/__pycache__/baselines.cpython-39.pyc delete mode 100644 twix/__pycache__/cost.cpython-39.pyc delete mode 100644 twix/__pycache__/eval.cpython-39.pyc delete mode 100644 twix/__pycache__/extract.cpython-39.pyc delete mode 100644 twix/__pycache__/key.cpython-39.pyc delete mode 100644 twix/__pycache__/main.cpython-39.pyc delete mode 100644 twix/__pycache__/model.cpython-39.pyc delete mode 100644 twix/__pycache__/pattern.cpython-39.pyc delete mode 100644 twix/__pycache__/transform.cpython-39.pyc delete mode 100644 twix/__pycache__/user_apis.cpython-39.pyc create mode 100644 twix/models/__init__.py delete mode 100644 twix/models/__pycache__/__init__.cpython-39.pyc delete mode 100644 twix/models/__pycache__/ai21_model.cpython-39.pyc delete mode 100644 twix/models/__pycache__/bert_model.cpython-39.pyc delete mode 100644 twix/models/__pycache__/flan_t5_base_model.cpython-39.pyc delete mode 100644 twix/models/__pycache__/flan_t5_large_model.cpython-39.pyc delete mode 100644 twix/models/__pycache__/flan_t5_small_model.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_35_azure.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_35_long.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_35_model.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_4_azure.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_4_long.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_4_model.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_4_vision.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_4o.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_4o_mini.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_4o_mini_vision.cpython-39.pyc delete mode 100644 twix/models/__pycache__/gpt_4o_vision.cpython-39.pyc diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 0f656c771a579c3892c7794ce0257d3020467fd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&5ja55U$>3b&zN{xMq(Ny?7uiEbbEG1(7{?@Umm{pk`zkvJi)9!hmQ92{-@V zz=N;g&G-a9f^Xpic+#)BdvO5Si^*zCSJM4ecUARFf78`HO+=zT3QI(JB63g|GZ#?( zM%d0}MK(;&C7@7aw5Ulf>QI~f6>r;N8L$leYYcGi=8&yE_30&Y_gDV&Sl=^(4dO_~ z$LM4KEFIAyX5XNDz+LK5xWvpyczsAQvqeMffC=hk(Nlb1@A=nRtX2!|UZwhnET-nZ z#A610jHyd6mN;SV)9lUtQjB~$^L2G)GQmnJl`E(4@fvRqS-YyDdw8n7-&sHQ(pN}5UafAlom{%p>Xre^fMoy-@ag9o ztQnkXWE0!f6#$swHVbtASzvSx)(p-x!U7RG6sSXmxnc+%j(*qp)eO!w>TnX~@*&KV zg}I>!^>mEyDt8h!jkdN7SOyju*woEDpZ|x*;WhXF#UR_V3|I#KD+WZS;Wg@*k~v#f xCdX&3i}DnOh5cq4RR}6`94m#7;vEzvu(_-NYX)Z;(F3tR0*VG(Sq9FOfuCI!5Lo~K diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0bd001c --- /dev/null +++ b/.gitignore @@ -0,0 +1,204 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[codz] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py.cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock +#poetry.toml + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. +# https://pdm-project.org/en/latest/usage/project/#working-with-version-control +#pdm.lock +#pdm.toml +.pdm-python +.pdm-build/ + +# pixi +# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. +#pixi.lock +# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one +# in the .venv directory. It is recommended not to include this directory in version control. +.pixi + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.envrc +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Abstra +# Abstra is an AI-powered process automation framework. +# Ignore directories containing user credentials, local state, and settings. +# Learn more at https://abstra.io/docs +.abstra/ + +# Visual Studio Code +# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore +# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +# and can be added to the global gitignore or merged into this file. However, if you prefer, +# you could uncomment the following to ignore the entire vscode folder +# .vscode/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +# Marimo +marimo/_static/ +marimo/_lsp/ +__marimo__/ + +# Streamlit +.streamlit/secrets.toml + diff --git a/__pycache__/model.cpython-39.pyc b/__pycache__/model.cpython-39.pyc deleted file mode 100644 index ce497a4b4aa745c3c3571c06de84cece7cbb7fe4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1534 zcmai!J8#rL5XaYdzL)QOj|B1}K-z0^0vstq2!WtRNIZnDu?%(&i(UJ)_C*lI6_gYd z6nq5e`3!srmr&6{M}hdy*fB>C!qTpH=C?aL`=7Nv+qMLrZx=ou+-wQ)g^cB=4&w$| z(nsf;zTwwi8B^ic?}>3E7f*&GlV!6zOfK`+pqa`DU^}b4RKsQHeMR{ zh?!vfU=3MQ^~?k_E7k&&u;Wj#RXJ3n ztP9qy*qMcRWAORU$`!Sm^+0?TT(NeFVBG*VKB}2klpMi|HZg zIk}-WvjOO!qT5X0f}WRK>RdJi9TwETfXZFGlbeqNoqna#jSXGHYucF2(<^&pBX45h zUfG*=+2MLe3mw4SE8K-W?J$&aGy|fUSmBa6HDNe#Qasn;mlL0ab>iG2ei$ZU9Kmbz ztk^9a9M*|d7=|$QM)O6wqhddhJAND_J5ikO1kb}H9dA!Z>`!({ zQJ2SspsS^y0zsUDn3TgQ!V2pKk(EE!kf6GG8aQPve6V6_FRgH5-8miKDW%ojzrqyC z>K=iuG7Kr|rh6{yT<$|!Pd86ZAkj-s!v7V3D^O0LDpWF2F-kudWckQtB{cm?ss+Cb zp;zD^k8+E1aU)L!d2_B~HBWOZRNgFb=U)1h<=3P%i^>9O5{uPgA^6aIiTK*^J>mPo zTk}32gkHm%AN!LBNuZO-ixBs4Cc|iQJASfIL6jzwTeuM<#N@7j;OgKI^MVN{w>y84 zH+V#OBoEOEqiyui{@+`F%&~aYzk0oa$aiqN@x!HWnM_W6sauCHZ(l)L@FcEz)KJX#|)R_3959*^a@dba*ojcpK3+06<8s{c+&pqd! zb7#((@66fL0swa9jST?x0Kn+tRIR4zCWG(u>xLnP626IK54&wQo3Y&t@#+oQksyjd z6oDuLQ3Rq0L=pHmM1X2GA8d}gFLt9jia->B|78UD_aROfr^%2`2^xGlXbM^YqLm~L z2Caji{zT(kKr|WBDM3j>1BEG3VTxgkfnn!>!kqS#q5hPh!W=NTGo2IO8N&_*!^Q*S zfjVGP&}fb#5Jlj|2=KJ21Os&NK`-myJ85s-pTP(Wr}Z*LZ#?YtFJ#7T%kx`WuAx*> zId6UyW2~ATPK~<7l&|}FuS?GzGOKG`zh!^=xIN~$ zXN0R5elB34;HT$jX*KPS?G?I(KNZVM{(N2XM^>t}fk9<>*vh(2$~tYP)kPjTw42zy zIkP~H3}szAKjwI8b#Yd=vw2(h%}(3q%HFVVp7iFndUw zOl$Z_edE66I^Lj}^N2PkTf_s)=N8n(R^EGm%f`(QcJJELcV*#Si&UjXsU0dIfw1uc$>0s&}d8i;f7s4848tgB`>;9hhh0{E{H~NgQkt}qdE=4G|1`t zrOQ-ppO#|kWwKE%r(h9`>0Jmkv&LkTcqOwUBG*m>ODuRfTMjFs4YtBw7@-6!!gFvI zUWT{e9Gr)b;dA&BF2hy02H(OD@H6}h*Kr!JNZLjG%!CO)0Fr;Rgo*9gsXTN? z6Xu%*JVh4QEUB$q(YR)9V$+uG(?AlqD?x20gag#hdb0s)gX}3soX905HbAg8PtKK6 zY86jEc7H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0=3.6 -Description-Content-Type: text/markdown - -# TWIX: Reconstructing Structured Data from Templatized Documents - -[![Paper](https://img.shields.io/badge/Paper-arXiv-red)](https://arxiv.org/abs/2501.06659) - -- [🚀 Getting Started](#-getting-started) -- [📦 Python Package](#-python-package) -- [🖥️ User Interface](#️-user-interface) -- [📚 TWIX API Reference](#-twix-api-reference) - - -TWIX is a tool for automatically extracting structured data from templatized documents that are programmatically generated by populating fields in a visual template. -TWIX infers the underlying template and then performs data extraction, offering a scalable solution with high accuracy and low cost. In particular, TWIX offers, - -1. A Python package for extracting structured data from documents step by step, designed for production pipeline deployment, with optional user feedback to monitor and refine the extraction process. -2. An interactive UI playground for data extraction that allows users to edit the inferred template, enabling more confident and accurate extraction. - -![TWIX Figure](docs/assets/image/blog_example.png) - - - -# 🚀 Getting Started - -- Python 3.10 or later -- OpenAI API key - -1. Clone the repository - -```bash -git clone https://github.com/yiminl18/TWIX.git -``` - -2. Install packages. - -```bash -pip install -e . -``` - -3. Set OpenAI API key as environment variable - -[You can refer to this document](https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety) - -# 📦 Python Package - -If you want to use TWIX as a Python package, see detailed Python API references in [TWIX API Reference](#twix-api-reference), and examples below. - -1. To use TWIX to extract structured data step by step, check out [`tests/test_twix.ipynb`](tests/test_twix.ipynb). -2. To use TWIX to extract structured data with a single API call, check out [`tests/test_twix_transform.ipynb`](tests/test_twix_transform.ipynb). -3. To edit the inferred template with user input, check out [`tests/test_twix_users.ipynb`](tests/test_twix_users.ipynb). - -# 🖥️ User Interface - -If you want to use TWIX in our user interfaces: - -1. Start the frontend server. In the `/twix-ui/` directory, run: - - ```bash - npm start - ``` - -2. Start the backend server. In the `/twix-ui/backend/` directory, run: - - ```bash - python3 app.py - ``` -[Watch the TWIX Demo](docs/assets/video/Twix_Demo.mp4) -![TWIX Figure](docs/assets/image/UI.png) - -# 📚 TWIX API Reference - -This document provides an overview of the available APIs in the TWIX Python package. Each API is described with its functionality, parameters, and return values. - ---- - -## API List - -```python -__all__ = [ - "predict_field", - "predict_template", - "extract_data", - "extract_phrase", - "transform", - "remove_template_node", - "modify_template_node", - "add_fields", - "remove_fields" -] -``` - -Below is a detailed description of each API: - ---- - -### 1. extract_phrase - -Extracts phrases from PDFs by using OCR tools. - -- **Parameters:** - - `data_files` (list): Stores a list of paths to documents that are created using the same template. - - `result_folder` (str): The path to store results. - - `LLM_model_name` (str, optional): Specify the LLM model name. - - `page_to_infer_fields` (int, optional): TWIX extracts all phrases from each input document by default. For field prediction, it separately creates a small document sample by specifying `page_to_infer_fields` (by default is 5), which determines how many pages are used for inferring fields. -- **Returns:** - - `dict`: A dict of phrases per input document. The key in the dict stores the document name. The value corresponds to the raw extracted phrases and their bounding box, which are also written in the result folder. - - `cost` (float): The cost incurred during the function call. - ---- - -### 2. predict_field - -Predicts a list of fields from documents. Fields refer to phrases in table headers or keywords in key-value pairs. - -- **Parameters:** - - `data_files` (list): Stores a list of paths to documents that are created using the same template. - - `result_folder` (str): The path to store results. - - `LLM_model_name` (str, optional): Specify the LLM model name. -- **Returns:** - - `list`: A list of predicted phrases. TWIX also writes the results in the local result folder, naming the file as `twix_key.txt`. - - `cost` (float): The cost incurred during the function call. ---- - -### 3. predict_template - -Predicts the template from documents. A template is defined as a tree (refer to the paper for details) and stored as a JSON. Each tree node (JSON object) corresponds to the abstract of a data block, storing the type and fields of the node. - -- **Parameters:** - - `data_files` (list): Stores a list of paths to documents that are created using the same template. - - `result_folder` (str): The path to store results. - - - `LLM_model_name` (str, optional): Specify the LLM model name. -- **Returns:** - - `list`: The template as a list of nodes, stored locally in the result folder, naming the file as `template.json`. - - `cost` (float): The cost incurred during the function call. ---- - -### 4. extract_data - -Extracts data based on a template. - -- **Parameters:** - - `data_files` (list): Stores a list of paths to documents that are created using the same template. - - `template` (list, optional): The template output from `predict_template`. If not specified, TWIX will look in the local result folder to read the predicted template. - - `result_folder` (str): The path to store results. -- **Returns:** - - `dict`: A dictionary of extraction results, where the key is the file path, and the value is the extraction object of that file. Each extraction object is a list of data blocks containing either table blocks or key-value blocks. Results will be written locally in the result folder, naming the file as `extracted.json`. - - `cost` (float): The cost incurred during the function call. ---- - -### 5. transform - -Provides an end-to-end API to directly extract data from PDFs. - -- **Parameters:** - - `data_files` (list): Stores a list of paths to documents that are created using the same template. - - `result_folder` (str): The path to store results. -- **Returns:** - - `fields` (list): A list of strings representing the predicted fields. - - `template` (list): The template as a list of nodes, stored locally in the result folder, naming the file as `template.json`. - - `extraction_object` (dict): A dictionary of extraction results, where the key is the file path, and the value is the extraction object of that file. Each extraction object is a list of data blocks containing either table blocks or key-value blocks. Results will be written locally in the result folder, naming the file as `extracted.json`. - - `cost` (float): The cost incurred during the function call. ---- - -### 6. add_fields - -Allows users to add fields to the predicted fields. - -- **Parameters:** - - `added_fields` (list): A list of fields to add based on the predicted fields. - - `data_files` (list, optional): Stores a list of paths to documents that are created using the same template. At least one of `data_files` or `result_folder` must be specified. - - `result_folder` (str, optional): The path to store results. If not specified, TWIX will automatically create a folder under `root/tests/out/file_name/`. - ---- - -### 7. remove_fields - -Allows users to delete fields from the predicted fields. - -- **Parameters:** - - `removed_fields` (list): A list of fields to delete based on the predicted fields. - - `data_files` (list, optional): Stores a list of paths to documents that are created using the same template. At least one of `data_files` or `result_folder` must be specified. - - `result_folder` (str, optional): The path to store results. If not specified, TWIX will automatically create a folder under `root/tests/out/file_name/`. - ---- - -### 8. remove_template_node - -Allows users to remove nodes in the predicted template. - -- **Parameters:** - - `node_ids` (list): A list of node IDs. Each node ID is an integer. - - `data_files` (list, optional): Stores a list of paths to documents that are created using the same template. At least one of `data_files` or `result_folder` must be specified. - - `result_folder` (str, optional): The path to store results. If not specified, TWIX will automatically create a folder under `root/tests/out/file_name/`. - ---- - -### 9. modify_template_node - -Allows users to update nodes in the predicted template. - -- **Parameters:** - - `node_id` (int): The integer node ID to update. - - `type` (str): The type of the node to update, either `"kv"` or `"table"`. - - `fields` (list): A list of fields (strings) to update. - - `data_files` (list, optional): Stores a list of paths to documents that are created using the same template. At least one of `data_files` or `result_folder` must be specified. - - `result_folder` (str, optional): The path to store results. If not specified, TWIX will automatically create a folder under `root/tests/out/file_name/`. - - - - - - diff --git a/twix.egg-info/SOURCES.txt b/twix.egg-info/SOURCES.txt deleted file mode 100644 index f491a78..0000000 --- a/twix.egg-info/SOURCES.txt +++ /dev/null @@ -1,17 +0,0 @@ -README.md -setup.py -twix/__init__.py -twix/cost.py -twix/extract.py -twix/key.py -twix/model.py -twix/pattern.py -twix/transform.py -twix/user_apis.py -twix.egg-info/PKG-INFO -twix.egg-info/SOURCES.txt -twix.egg-info/dependency_links.txt -twix.egg-info/requires.txt -twix.egg-info/top_level.txt -twix/models/gpt_4o.py -twix/models/gpt_4o_mini.py \ No newline at end of file diff --git a/twix.egg-info/dependency_links.txt b/twix.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/twix.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/twix.egg-info/requires.txt b/twix.egg-info/requires.txt deleted file mode 100644 index 47daa96..0000000 --- a/twix.egg-info/requires.txt +++ /dev/null @@ -1,9 +0,0 @@ -pytesseract -pdfplumber -pandas -numpy -scipy -tiktoken -pdf2image -gurobipy -openai diff --git a/twix.egg-info/top_level.txt b/twix.egg-info/top_level.txt deleted file mode 100644 index 632b84c..0000000 --- a/twix.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -twix diff --git a/twix/__pycache__/__init__.cpython-39.pyc b/twix/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index c02d731bb99a50a0a38c9f3157107f6b8b44dadd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 589 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 diff --git a/twix/__pycache__/extract.cpython-39.pyc b/twix/__pycache__/extract.cpython-39.pyc deleted file mode 100644 index a8f3795ecc6e16d8b267cda77ecfcc4ac0eee7db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27821 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 l$g48)5f{x^ga7j6Im diff --git a/twix/__pycache__/key.cpython-39.pyc b/twix/__pycache__/key.cpython-39.pyc deleted file mode 100644 index e8fbee40f84b7ccfbc2fcb4c101c0e35283c8cd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9795 zcma)C*>4<2dhe?4p6R(Lil!t|zQ)Je8d)YqT0UZHWvwlH*S1VMmiI_!?MZX0Nwzo_ ztDB@n^t^=LjgiCa4Y1f?lK^Cp0P#zZKOir850Ljp9s=Yc@k_8k-i!dw@B6A}I5SiL z57Bj3^;h5hea)a&D_i)z^Urfz=by8z|DewJ&qn7ap7=9iS;|tPZTY4azED!xZP~GX zyW{wdFypRY;B`gc{521cky{jHpk6@;*9#wUWJf6}5_$4fUM5hLOwaef7M00VB_-7u8D` zxuSkoy{ulr$g}FY`YuM6)D872>Sc9PeGm0j^_qGe^@_Ts-ax&o-c;X5{ha!NdJFY6 z^?`a@y@L~;SK^M# z^|ieyj(T0c(rT|a%l)=yAC0_jABJ4Atb6q{CReN-KQ0!P-d^-H6qdq7vm#$_7bG|NO z2Nz$zvi!ps;4I&ZI#GAC9d(y)^;)}~u$#oouY)s)_RH_9jix4?p`GkUpDY7&OZ|IU z`Fa~DYV|t(8|QK2|KPC>zOxx7&5bB*tGKy-uX+3SyGz&Gy;jhUZ=f+;|FuXpvD8;| zlZNn1OvPq*x6>$U7h~C3!-Y-e&t^C1gt$w;9VJ;g=_NtCNerwB30Zk;O|{kA?Iz8n zw;gulhLcsy!TliFigACiPd~{#9mahSD$EK7(i4p63cvi+CC*|vW(6o6Srzm4BT_G7 zY=SJL0_kDFAe1E55k%sc#6zY6Vjxoq!icqoos}5I=pfWtA?&t*?96V5UCcNMq%!+2X%dSk zmyFEWh}vQ1(3~c6OrzvHQBH?#Na9}DB*tTrd>l(zP%Po#uPQwt$wNIOE(zVhY>OZo z{)mVpWW9_IBS`>B4*_90{_g z8WPGc(I|wb9Zp}Tysx7qY^tc0T*cy;_}vm!p_fok(3ij;f&3CWBakl+pqc?P^WiCg zFOLJ9!eo3Y*Yso9pM$KQK^q9~1*#$S)7()(5==u{($KIB=ryb{tO!8?c307#0F?xv zz-2KZn8ASJg2B~6wG$=*yP<2l7^=O*5Z_5AMdj=lQ@w86V=X5tABBj8BSF%Aga)H(td z6u4?&DLb|HEPa{B9Ob6Kjw)QRXs%n$M+?+T32Vi*%!a|rO1W_lm0wekBA}sV=Aa7&v?H8^V{oRhcIHp<=Jjdb)XO+-$e2%{&8hq-C+%EQWQ}cOm2#7$$&zMvupVcw z4!WCR!_DO03ZB(WY-cXK-U6+(P(`ye6m}MJ}gU6-or}o4p_DFD2Re!1rA~0gJ#30+QCQ#z2b|%FIpASdXp-x% zNE9Z}a0UY-dH64M;IG+um^pC$0x6?o(x#96R1S&*4}|r=>BQp;X#qALVKFr80)j7* z7IOLc&7hPP($bllT<=a9cQWVNo`xs}*yiIhlwmc)B+ z52`q;iZg0BtA=_et>G+7|HIA~iIY~+8OSc!6wLPpowWdlPHQ+9r&EtT$r?lX#m+6v zIU6H(bTb#uPbX%E)J%*Y00}HajWby#_X(SOVT+04KhO??m~>AI!Q#+$l$|~#IqU@e zOhVH>MJJHw=-af9d0O@($akdQqhZ;<>&v~n(`>ykq-4;JHoHv(b}<4u1Wlh}Q%ufT z&frYgDqKq%0i6d;vg^L30)+?WV4 zy79lDV|2Z_uYw8#S6)}}T`3;HeXc`XC2RQ^#)GYFzSkv6AedDH@;BfzF|G=@zYR&i zZeDjAYal(qXfbuM;wO-y!jXGy>7N6u!_&IT9(ZXH^9zub(oq4}EP#VQSI)qLJpKL7 z=c%V`jQrF1E^a&go-QXe+%-*j&Sba8dc~NSqT%PCVn#DRGiMVevSJjgXfsL-8Olrs z{SnQG7||g-2jW-Vq~Z^#_!x!nLF2MY&SbxRif?n*c@u#mWlta-CieYDY&Cof6+|Wq zJj;|~YDrSi9w;bzjAjbxS7lY|E$p1|_=tifJg?J{q{4DVoM~4kj!YfYX{kfNar8~05d}FkR*wd zdaKt>f~XtU`@J}h*4v!cpYcD2wA-8*8YPwXBe=i2$#@Ru3U43g zd+K4(+8U;T^4!l`8_4}|4kRjNl2(5R(W}}Z9l?$k(Q#25#@IP zYEU=f?Na?fVmFx{!y<@*@AjfDXF~J?G)w};*$z$Vo`%bmM|PtNp4e?sjGGk+7v!W- z=E1N|ky>1^Rhly*N|7dX7v*N+f5nQpiUQh8Qs$s+FG<}-e?m@c7#O)Je~S)ejCB&# zq@~yj{Tx=vf!hMpdkF6guFB<|dC(laK>^kS(g^AoVHZrxOI)&7*i{;om4qE4nVW}A zsip$b?n4eMkhlJhpH@iT;?H1#99Xycw2az9ZKp-JLN?-vLTY4>#=vjPGn!2331TjzDZCN!jXJ-o?(q=&BMx@AtX+}V+Mjnn8WuumPx$=**GEkT&yL_h= zsaOX%E3?sL0vReS(D~%W7@56HOI#zcVq;ofDSN3R1i)bv3_7$kaH+yJyi3se->^L< zD`wf0%77bzFk7;$mLZ=cy(G^CcC@Nb>KH5kbAx~X{pti!i809Ju-KBhQE;_kE+Dk? zlo(=F3$eAJLgleQ{??_;?Xi$>K`1#yBX^5O9uzdk6%Uda!>Aui><2m00+Yd6%klo( zSDC%@o^`WPf@*|y4zv#LF)cEOkdI7XD?)-1$;%*#eLD_2nMi!Q-`@b?RsgAAKA}%0 z;E#7R(a9t-dSYt|qq>9j7a?1D+&2UCEQq?`@fI=l@JGgoaKiZbb2MO#z}ysOEK-=^ zaG%2t?z>?A0-ho{GhoJ-Q@S-w3;b{}JbFc_JeZE$@w!0{8v4b&e`Qc2977m9dIMTT za?3~=<}TC6lt3f@eCOkxHS*PspKcqzW#d8Wwo%Sx3n5BtRsRrOc7|ZRG16Z3?QUy@ zidADf$j6z&Pk(>BXt-IP43VCk42gVhTvi6 zDndipT_^(z&k7^V!Wbjb2zLe12{|%vvnxx%8!$6kRU-TV&mZor0&h?<6c5k}oMj&( z27*Ceg=1u=E*W7cj_S@TPK5a|cyq>to***40_QYFkZtC7{|2abKFen0YVQWc(=kZ8!kutba{}IlZ5LdFY zHXdfr$I)QjOMcEg^dC?F@7numa@=)%m>h?fC&I4hUsAd$)*4((hGRl={)f0#8FNS;U=XDO(J3H z_0|0KoHcldK%j#yq5l-+#7hYygc*M6lW34N$`ff2F0|oUFc>CLgE0V8SUd12$+%2; zvx0Gv#u7FFbZ?20vidqsY}mesbqtH|Ax*7&@CWXj`=)DTB%IO1IJ<%dI0*tt z@8zraB2^OBkuL{Th2@ z(6W;x*N+Hx;vb5r$OolI{}TOgkGbVeh?lD-)6INUYp#=*2G0?VPkendG!(B%6l&<32om^{-AloAp%d!pO|0}#=BEd6@fsqIHTXe|7VAt8vv#AWo zTR>71uC&xoB@&j60xEc7Gz!lQVJ`b61=v5z7s8Hm?Qy@5AYF4vf?R+nQcfMrc~}FN z`=~-T61|ebPGKcg@=A;&jxnsnSPf|*?@(g2GN@t{XJd2*R=Av2&A0nOEjfc;4Q~BR zGMjow6`VhF2pZvCGnD>;F{&hI8O}4wTzV$09OAoKT1g&Y-_SD|w}Xps(kJ73Ux)Oq z3vO;5zMoFwrKP2V3wi3L&Th%r#A0q&v2C|YA>r5_9X@+vbx$Ttd?nbRH|C8W#Q_$v zh@XEw9Q)S9Vy}rcSpn&rXd#6kB8N{cw~rK1!e4^3D#r=&c8)AP3|FS^&TQd}AXVH%cY*?-Qi}_KRkW#|g%Y0=m_cem{|$CEgnn_Xl1v(X#|$N=B6Waue_|>UmBtJFMN0ONb6^$Z5qtK|$U=1(D{@q=n$~Lx*`)P XUd_8vE_!q2vtAMFU99u)6si6{_g;45 diff --git a/twix/__pycache__/main.cpython-39.pyc b/twix/__pycache__/main.cpython-39.pyc deleted file mode 100644 index 559a8442f2eac5f236e5c832023e03eee4bb1d2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 zcmYjQy-pl45cc2h`VNjz5TZyFR7lsbDN>|B5egKcK~W$|bV{^Z&c4gS{+;bRIJ8^A z1LP6z%Dj@>RJ;OJ#^y&@8hd6u9(%rToc4NM1S8!4GycpF`sa+7gMzUSqTM8rz&R@L z02gFH3Ob+|2_k6D226BCAi`Tb2t*|KEgFO}5}ga8_GEa2Ada4({>mMOG<|C6g`C@{ zPK}YOw2{0rDjk|T*hI(oY_}GpA#ujz;IM`u2O#F_n`2 zz>-Q^cA4fEmcc`RTXtS$r47@%mZj)(<$$y6qb!FS5?Ewn=C!n4ua;>c;kc?QW0}a5 zwt@45%PqF^9P}5d4M=pq7k|@I>3E(MSvk(LGCr(^(?XU;#|M>=XQ`I)7cokdoI#w7 z&1H5K7im`R)^od}hiRFNs$56~G$QSCBFyjx=6DT+cv-`06Z}KB`7{DhoOo;nC=S;p zYEc7hzdmAslhT<)oRm|nZ29cbfHk1AEHgQ*?X2y?;#{4NO4Ksf7? zRi?IK$MPg`1SUxzdkFg6B42}lqOVrD)_*AO>4C*? M0{^7D$~QUw4`U$xQvd(} diff --git a/twix/__pycache__/model.cpython-39.pyc b/twix/__pycache__/model.cpython-39.pyc deleted file mode 100644 index 53fe12c295d936a3da77721cee50858c9d97de9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 805 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 diff --git a/twix/__pycache__/transform.cpython-39.pyc b/twix/__pycache__/transform.cpython-39.pyc deleted file mode 100644 index 68a47e6f24c2508fea8a5cc40a437feeb131b79c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmY*Xy>1jS5cc2xT*O7uC3y$7VM`i>K%q>cNQh>Iv~t!yZV!8RW&0o}`8q13yhBp* zN^Yt005nvLH<#lw(u_Ux+4J++d^$ZqAjdyvi$4UR-_h9@h@p3&_9YmB1Xf7n3Tsjk zO)H9#Ac87ZF~LOg167HjA5oD$U^rgTK)=d$$Oi75G+oH#jWfJ)4*;UehQ?(p6Ic__ zGf?Zn2)v;VEwM))dm_j!{Y*A&lX&Wr*9b7Oq|dN)4`a*Z8J6v1cWK1#3FOQF$9?KE zpZjFapnrO4VlxE}hv(-PweE#fb;q?VGQ$7}hucZ&VPUwHCejq9gOQ?bTs?245+;rp zj-Fyp>OpZQ!;7b@f;(PJ!ekKh8W>vGFf-Dw6x{EXkY)^;G-f$)z2mBGdh3AAv7`-b zbknhz4f(FXY+Io1ySl$#%EsAW$Q(nSzwgUW(5x-jt!}$7s_n`TeY4WCbGAH#A+KSU z@(TJf@*A9!rTgCAl<;Pqo%cq+8rEU5^CCm`1PsCqpWu9_N3b`i5HHezMruYb9+@M( a9kH>YJrfg!{0&gOQu1y5J~lE9dFemZsIY1P diff --git a/twix/__pycache__/user_apis.cpython-39.pyc b/twix/__pycache__/user_apis.cpython-39.pyc deleted file mode 100644 index fafbaa681b76418b7d2f5fc584bf10ef24d48ef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2595 zcmd5;%WfP+6z%HQ^z^iihe?N z1u`E15+7h^5h;5fg{b0=9?2rc~X|GvEO z%Q?&XhX&98Yz)4_SCZfsXPGr+LpHUC_S6|V%;Gk8GI!{5mwUfjLy!BsgVyH(@1pJS zkoV9A+_`V{qh}0e`cBmmyGkZwRXLktuj&+uQbOj>uxQ;K)0y*M4;>HRZG7e55X#c* zka4zY%S(!J`;fs0>%OJzBS*7ic3`9DY8yQVJ zMO+qQoKE&)o~UFrNi$K#GZ{-!Ze?mTnPptawfN-gI4$FRrsBzLE9Y^V$7(~w&6^7z z7aJ1BPOXkN#CX%_zSV+K5H=q7zULtC1bp@_p<%gNFr7w0Kwqn*QH-0D?k; ziK{Ip{xXPh8^k=;VT+K*(C%rcMNkL?J=MK-{b`G!$RH@vy#_%*G!WDSg8UjmC%3;9 z)7iH84-m~!1eG%=0%izB0EhJP*!#C$iKRjco{oWu=7biYuYi*5z>W+c`U}HFX&jrU zhFqq#^CVVCyiMW)iHjsIkys^h8DhAciyfpK-E3~43TdtefqaKFDS>P89(sfv(r;AO zFjd}wc!N~5U7M0|(T;5QY+7Ey{xfMwFV&{y9~itrTDm`bM?Mj?yskjLHD%`!2+^67 zIugQFUD(3RAwyzZKJc`sEhNSR?H++bwYOT6_JcM#Y*_1QDgn>at9weX@&h<{^2v8% zT4bQLn9snX#Fk<=Efuk4HXA2d%u^}GY9{yAPF7lF5NpeZk?g{fqzYPd;W?r_)!416 z&YqQ(YpBsrOG-8ALY<-lo}8;zo=oy}A>X2<#hM7`YkhwhKTVmhoe=`i0kBHKUW+%kqZ%?ctTP!)&?^u(52Lr6>xpfjc$%zyL(G&TkL zPju>Ny{14rD8a6(Bad?2MBWtUmm=?*$OGCY^4C$OJKEZGWR7wjYR{D42grubDwS!b z1Mc3iw2jt7OFBWVV=|*YnKHxIZj%`(@}LbLnbE0f!(@j15VxpYwO5E5lOJI$uR`>@ zRi_DsBs#B`4T3+V;b#!Ti10XnT}gPWT-x+fAf_`84r*0RAoihNUW0gDASfuNLQp_Z zH{_Slg#jP7%87@{y75!`??TbZ~?MoP-(71$2?!56{h Fe*tWxjWz%P diff --git a/twix/models/__init__.py b/twix/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/twix/models/__pycache__/__init__.cpython-39.pyc b/twix/models/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 4fa8029a36d440dabbd12d7a266cbc51ac663c96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmYe~<>g`k0`JF*(?IlN5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HMerR!OQL%ny zW^QI)dQN7ZzDs^`X>Mv>NwL0jeoAUmVsWZ|KuTJCQEC}bU8;UAP%x)hKR!M)FS8^* XUaz3?7KaT`urw#t4rKOcAZ7png9Rqe diff --git a/twix/models/__pycache__/ai21_model.cpython-39.pyc b/twix/models/__pycache__/ai21_model.cpython-39.pyc deleted file mode 100644 index d0b6c7144908c746d422acca7e730a94c120fa1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 850 zcma)4J#Q2-5cSu7011i$0wNk35GRo{p+XTtkVK-p1`y(!$gG{*UiNm4?StIut~y$T zM4cijY56&Bsqz<)keJzA5jt%7&Frja#(vLgb@eKN@!j>zPe#Zu{J1tTaIiV7U08k_AdnffUa)U>=5$6+=^2@`cW@j5bHOR8*S3g% z_?Xakz6YGKQ+7t+7_1km>+mQVYw9SRQ933*xYAx4nK&y0xf^P zl5f3nUQWtUSszwqE%%yYJc1ow?l#(dP~ONl<~Z!_v}P0R2;!BOc+36P@7hVsvFHAg znIw3f6oAkb_JF!;;7zyxrwttKpge5r$_u|6j>A8k2`GjQTF#z=gN$t;vJIm737b6)^(Dhq`l za_AwF?HJ{Zy9b=6swj*N)0HKkn_*&2TzxqXgT|H9HVMiK%!}CoxB-?sNzCAVAWO(s z+sT7GjSrEJT@^(DraL00)-@v=VrJE(YLs^Ca7s+^wy8lclNs?wAQvT4!-bYg)7U7Rx~&Y2tL!Q*xmcJ}8Wo~$Oj=31c{ItIAU8{!RQa=EKaEL>)?M(2*iE)g#@e`u9;CveP>qY^Fxl|Pd zR?r=!?4O__ApPbXijdaOES16dF=dBLS-*q%0Qw%;v^L=jK+%-^rER*lZ?|x0!;(MJ C#QhQg diff --git a/twix/models/__pycache__/flan_t5_base_model.cpython-39.pyc b/twix/models/__pycache__/flan_t5_base_model.cpython-39.pyc deleted file mode 100644 index 81da737b42773aa7ceb9ec1fea37fd3eeb6b3e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 623 zcmYjO!EO^V5VgI@CXEuBQX$k&$RR93$^{_=wBkg=q2ZFtYP+5++wR(nJuA^Fx%FBO zd;v&Yxbro>a_TQ|VrGRw6sH)0*@{+XD?ca$Y&Dm;4KqCK@5s<+mi!KY`0cc)>( z;g!7vQ(l9+J}j&)Do8d}X6Cq6df_EBk@@5B#NzM1-ELa zP+q8wD8*L&kYD63LU9poBi+~Wts-rMrQ_0fOhGj`li`5_Y@JCFjJM9OD0JvA%O>>= z+>`8MKMm$hla4@C@en=$bRE`PmA^FSMAdJyv#&4{vskc)Ub^Q5Ze?#)q nhDPJE(tvh*e8eTX)K2m}I^dk)3+mlg@REn?x#v`k>(^d%B4aGXvK*}l^QO&tlafv*>=}n#$Jh5$&G6{ z@C2>Ig(u)$eC5T);2R*zd5pZxLA;WAq{}~L3UWH2yK#f2Zk*q(!CF~BmK#kS zoR3T0w9fj0X>(^d%B4aGXvK*}l^QO&tlafv*>=}n>{*Fc$&G6{ z@C2>Ig(u)$eC5yMSMuvEN~H-y+()A-ESriYZ>P zny+{*R)RC&H<1#zeANT-&+Ds5^}e!Itoo-ciSHbJC4wKHNz6ZG3UWH2yK!Sp-JsvC!8ut#mK#kS z(8r~2T6BJ3S`5xlW~U_P&q?~xfpzI+S(mz~N}V2=ysat4rH54WOgc!H@CA?Fb<2#_ zPK4`5m*G6?MwfNL=gp;m5JrmgE*et{HzZ||HvGTe rUDE@yhK6HhsX^JDa1=^(sh#M1^eE&EUs3b6g4bcZF7%v=5g&=a>R+ln diff --git a/twix/models/__pycache__/gpt_35_azure.cpython-39.pyc b/twix/models/__pycache__/gpt_35_azure.cpython-39.pyc deleted file mode 100644 index d819822132eddd8e2edd03247bfbb0bad5381b2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcma)6&yO256t+Fi%xorMQzTRtA%r+}4%yjmSqUMaY+DKKWvN6FU?GiW$4++A`BmE~ zn^kh!UMv0q4(*Zu2>A%7UN|EpB;K1O(k>@#&GV1g&+mQT_mT~VeFE*b-`}3R?o!}6{sB< zy!1q04rC~IUQiLqzKr0`K+g!h3$0wH$l5dUDCRr3!QBTXF zP98P+yi&C_$-_pfv&^U@Z|X@gO&Yk86`NI>p_hGoVRMR}Hw_XbA$$+v>k_hL2`OE% zpFdjBC4EI-lNDRCS4^_kbme^qiE`*y9wqhYE-{A(gm(Q0uuD&RduVxQd!6<7$b>^e z!KtI#(Z0s#-*krI%mWj9j$^crYn4gYGi_Pem^o?`Q)|yKo^so<3EJ02~`ch0p;D=^d(X!Tj>s zxwWnNG)XM_k!SmBfcMwP=1sLlT&lKg7Hd-QtUMdTTjP62Nq(MLAf#$bWs9aZ_p`Pb zKLCLzV!e+gh50r(cj?Y1EF%w)j zrP4$2b~(I}Qt=@WIGuFu&-)#@ap-y-#3HPeG1*iZ7g<%cN@o^CDEd`)k=o{|s*UK` zrcGOMYogV&xvKL;imEN`LW}?e13PNFWCcB9ykC6s%|3|_@jgCYTT_Q-9rqELMF3aj5c?U2;?UlY^LQ_P&-YLJfA z@4@bWLmOOI^Bp)~PzQvLsQv&(aDpWl4;^ca@Yl-K7?6(8puk0V{P-lbi&m{?_+KI- z+}p}7zy*j=gj?n5+jtu@?Vh<76;`M2Pzyf;HOx!(1xC<87Se&oS-3NzoNZwH$M^fY F{{o}mXYT+2 diff --git a/twix/models/__pycache__/gpt_35_long.cpython-39.pyc b/twix/models/__pycache__/gpt_35_long.cpython-39.pyc deleted file mode 100644 index d8a5f9cdbd27541984bc3115d7d7e18511a39f3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 zcma))&ubGw6vt;~e`K3BS`pMBUObsYver@$QbbHa4^mK<58SaAnC2OT zWRmA>$fOu@=}G^L4TTblpYo4Fv5|-A%Ox4e@Qe=w*^m)lgp$8yo#rL<+2CX|erJ?6 z@o_fEiZsuPc&i*wC#tX}?w3;SCPu~Mve?VgxU5u>WQ$YJ9@#M`Ba7iR5VoO#k~ll0qcPaxi4 z;J9|YsmbLfiH_%dipcp|CDH|^$}`*XonIw(-}!r4u3Q6=Tjb&bWTwnFrdOc(x zC$?Wss$AKuEL=E7u2#YN&4tEjL08{~S3+T`vOqM%_)4_s$MP74UcK2FB~?aH3<>6i zT!`qG5aMST>HE0(tD6WM0jpu%!-jeZ9f4kNv%750(Ou|sVDScZ9-8{E!)r^x5mp+Z zTiwR(KLK4UA~`ms%J?eR53s^U-ChlS2PaK6t!wF4N}VP}c9PUM8pwtUUpuT7ueqrS a)X7JiD8)2a&&j5t@1jS5cb%+-sLU_>EOf*ut>=kQ96WxL_%o}Btqlnw6V=)SNkX1ClPe1l9o51 zM?40v;g%||fP`S|JEV-{8ILvd%{QN1&1MsV_VcOv^c@KK6_WeLFnNW?K0~L7f|hh3 z0EmVgBB;s~RqPf7Q;AA%iAWUxK#Keht4RT#zZ-S``b^T0?<_#3cuw%x=ja@1prH*@ zpy-Au_KmJ!11kB-uIYw02s|fE+5}*}_%d6K?%?R~_`t2r#o&{*)ux~#F+;0;CWqeX z-WANJ-JoeCbIwz0GH8`??8$fB&G4mI=?Yh-30}UIN J+@qXL@_%Upnr{FA diff --git a/twix/models/__pycache__/gpt_4_azure.cpython-39.pyc b/twix/models/__pycache__/gpt_4_azure.cpython-39.pyc deleted file mode 100644 index 269847b089d261938a45b7e0b2ba365a2f569fcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1402 zcma)6%Z}SN6eTHI(pYxKK^N(C)7K_icr=*?Xb|KzNq{z+X@I6^OB4_kllI8bDN z+7o>_kfGdpMMWh0GJ-P$NxvcS@Ev$3$1!!$(b+<)uNzezJwAJod~1|8$uckVYF6Y` z@~ECHN>y2tJglX9mKl{y>S~(Lk{XU=c{fTk^s;YH?S!J|u0Vn$gzq7IZ9U)dVXB;=MIS!mZDRLA7M>s`v0Z&*05-p15q|PUBanOa( z#tw?w?Z#=RCVdrh5`*n55`{uA4X~qHg>B3Twz&u|{PM}u6u8)f3G)G%jYt^1RR8k( z`V&~Y^wy9iRC~(|9>tdiZv@!cBUj0q!rPdQ@5anw?PbxLfyp(TEs#+@Hh*1MwGJ-wSRoSzxyv_^J=#M diff --git a/twix/models/__pycache__/gpt_4_long.cpython-39.pyc b/twix/models/__pycache__/gpt_4_long.cpython-39.pyc deleted file mode 100644 index 4bec3c98da213a07e62bf205521a0c445ae8e1f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcma)6O^X{h7?w1ekM&2_Iki4D6bf;{JDW|QrKCwW34}n|2Aa}#C=9bB**o6(iXfM;BZ#0SN$|@`TCs#tBD};CT=*|Z!X=m91^t;Pei9^M5{V$$kxWK1lsh84 z^pcL~iAe0cq)AtFL>Kn-1pSVT`ftHIIT}&hJv^T)`E4uf!^h|MkPx52WI41j@eqSWG1Yy+p;htZh4!T6U!$>DQyT<8K~3xP_@**5w#0D z|9bR)0C_6U%)|RJe#Y>v0H{*O)7GT7)3T|jd+owT7&<+bixAvu#Dvfui|7riu0j9Y zoEX#UFXPyt7je9|hIem`Yu;2_yoGGbX0fIO*NWpYL>k{7-#R#r^OMW~BUM{UQ#7@{ zm$k+CIWP)?uMYMPZjJXpAMf8Bw@N-QU?P6!M)PCT?rm_}oQ`9C$D7Otc zMF~4jzkrUQz$yEcP3ejmGNUs#1E!V?MJfWY9ON5bMk{aW&0sVnGk+EUXVH=6bI{v} z0W(c0RUf>a58kiJQCeIFCZ`kE{3NC$+)$V4TZX~6KP?qg&XR$n#gKmK!>14Jx166=^yD^>%b0sG{pUPnt-2pAkOL-SFaDYX$=W!P83@B$C(EbjB&h9^` CDsXTB diff --git a/twix/models/__pycache__/gpt_4_model.cpython-39.pyc b/twix/models/__pycache__/gpt_4_model.cpython-39.pyc deleted file mode 100644 index d07d929e3ec9ad19dfbf9af3c3dec42f4f15876e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668 zcmYjO&1w`u5U%Q;KQ@Vpg6O`1Bj{ZAD5At5BCG-RGM8bTu54zQKe~H`$mWz>^9J5L z`5Hb(UvtVU2%^=K6;jaOboEqy{ngjy-rfv2-e3PX`Go-2KDir`lUKaV69xqeTj(%H z1i}l*g^HC>@)C2Y0u^3D9;oOeq{$6eLy9i?FjD{eT_t?J4Nn>JI^<=ZGFWJ^5sg%+ z#0Hf7E>^ff6ByLJMaJz|>PFI~U2D=jBc!p5sH z_+IJuw|TL>Q^$Pn5>000e)@L#>zQ?W8EVpolEl1!HYEj`FyWBa!Ehd;iA>)+0A5p8q8LzE^n@~fwCH}bJz8@cE$uQkoo#^!2sc`aPtTnpD%-^SQFl!L(P!CZlMVLo=_gvmdQt=(h8btPMJ$R*r zRKY>gO?vG#=>;#dxZf2$t%4P}!9Ead@|{qMJ@6BO{*dekUD!!g(9U((2=@||WWD?O zfvJsS2#Y7DZ1xlw!Zj?d7F%G>2Ls^(q#P8E3z*0p8sV?#8yS+);#^o9jXR{{bf_&B zX9LVDN5mFtKoZQWrR=|&>gq{X}x)PjYm3qT!b5R za?yS=#`B)EeeGSl3eUJ+|4PItqjB;P5#sTINIRj>S z6_|CDSt?8=&UzYv1%q1vXuPga3aX=guK>ufI8DIA(0Dh}W-`vYc`7uZt6&QXtL-hj zSrQ9nD&=80Yad}|@^7KRJC|@)w@M>~6fRy?9vDvwmBYotu&l51zApM<%<49!>9)|J z?XoBd#~wB%br%@IGe90D4iF}1)Fqgm^PiyqCTDDRipX2w`%l&FXSK8V8n!0}ct~vB z2V`VF8gBZyIORL?25iflz|560)v!eH|4{2iBW7hMF2Iqp@hFyeK=Z4RWRZ!qEhug8 z8ImbEX9Wg{ir${7M0pav69+{piXe)^mmae}Mi$_BPoaYSR6MgiqAV~qz{3)wRhS<2 GuKxk?*ee?5`}oWO-SO%_EuW7J+)W< zfCCjLe#zIK`U^-1#@PjRqM3Lc&%8G;&WFPRK|8(saem7PxpT=w^DsF=*KaWhB4|w- zno{c4tS0ID%~A&Rnxr1E@4oPEX&OKPBnw0&d=cExlnXAx87O~Foxr`gPjP{Q(vgd7L=MOm zHDpDvDN5;0doAvJL1^Cz)#RN*DU903(teC}c#Nra$|JJ_Tx%Z#q5D+1ET(H&Bg-XT zfV@>KO(>1T9HL zV@mBeD@nY5vzP(BAh84Nn=72}H1@y)l6WEzuJA5t%mo+zC5e5(UXgI?3cHbz8h+A3 zJsMBU&dKz6G8!kN={R|D{4PT-|IKpn(2vm7eGHluv|xoJs9-B1oUd#~S5&xPoO8Bf z1tJbf;T0T__~dhc*6M@9=Ag>!+_(z`GGxY;O$o-&np#7xL&tbkBcL=v1xlqeP^Pb; zYC)!YAwg0^4SmD2GRN)4&E}~#{j90l5_I0w3V%sRwQV_X@(k$)z@Po+PxbXXV^adHKXqhA5S((?-lO|hKh^nF^r1(Bn5KYC0M8YZVgGhhM z&!UdJig428uu1Hs585RXM4C^huamUR2iRO~V<4=@g1?NhKirddG0*I9*JgFMdUsmi z!w=M#4sB#ZvQN&bCM$YDQCVlwsdCjxL%U9>D{m!=qUA1@b_1=$9ZZcqh--TLxS(7N zgzi#lvyiS;4h(PbQlz=GTnuZJv{%&d8Q@W!8Xt#AKEkp?>?&{ISP5kZ7Cb~v79~8g Q{L~JHZ5rUi-JbQ{KXN*@ga7~l diff --git a/twix/models/__pycache__/gpt_4o_mini_vision.cpython-39.pyc b/twix/models/__pycache__/gpt_4o_mini_vision.cpython-39.pyc deleted file mode 100644 index 82246ac0e7454a1ab75b4ce81a00cb7bc9272653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1165 zcmZWo&2JPp6!-IZytA84Xd+b<2^A#hVI;yd(kiOjswI3JBBUh{LB(E1ld-dz?d;CT z_NFA-oR%x%$N`X&Bma`GJ@GGq6nOS75Wtq7zutR(@ArGo78hFt+u!`+-iwfs|J~+n z3vhD-hkk@Y5CJ6_LJz>LX-Rssnf9pP2faYTl=PSkjzbZgK#xlqdcOK{96y}ZM9O1ZyL*GPU z$OPk>(&tx?z`!w`z;SRwPT-gcdIJ9tiZL?m(*VdeStGjhD*@jhqZD`+2VG0m&S5w< zyQ{y&p=A{YV);&{<$A|9ch);{lvhGprer287t-xwYFouH>&vvx%-*N_RN}cp;lXj{U zEsJ!&&_y-6ULV-@ERxheyyP%oCL7 z0UZPbCIUy%1O$IYMMFdrT7YQ2qJ1h_C_yYdqesCc7=!|?2Yk>tViShYwY!JsMP{kyj&w*x^CwF|yH6YK;WwIP%$Bo|gq`SeEZ)#xCU5ur8%R=rmp-cgA_y ztBPD|+n5`xAKfFNUHHN!YS#*F(Z%Pu(lr|?scZBlEw9F=9vjc{Of0%AmiyAAu6D8_ zooToP^kozTR%iq?zz+13g%tQHdylIR^pu}pqUs9je8ryodTx039JdodzOdLQbn3nh zbYt*VaiD(2Yjp{QJvYxPorCplh%4Wh)f(E(tB8U61$S`^GxTXFS5JyN&$QC&C%533 yr5x?sMphT;zw*FC?<4WXXI^xlKzU@MKasI9x diff --git a/twix/models/__pycache__/gpt_4o_vision.cpython-39.pyc b/twix/models/__pycache__/gpt_4o_vision.cpython-39.pyc deleted file mode 100644 index eb0465d872d5a804e783ca4c2c122da5c39befeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZ8g&2AGh5cYVz&L&OEkAwh$03j|b0ZXL_AwY;yI8>lefdG-qYP)vR4V&!Bb_%W1 zQ@B<<03fwTUddNZyaGstu@l6PEss6+j6L&x<7{!UMX;UY=ePDlLcTiX?-rnPABTR4 zLJ$EZ8A1=ht!YVmvzhj&*MnXlVM=;T1_z-C4xz^-mn7waiSRw?H3Sz8oFfs5CeBSk zpOd)t4eur~SpKw@qm{L;U3$9ysJpV3uB@-6j~~6x!5PdO#W}*UibFp@VaNpIn$izf z_Q1daoxnkGNDkqE33>>x2*nr~_Gtj*IawyUbAy2IuTcuzi-WGEYGXGXo6T#t;?S}R z1F?J~)ADA=HaBi|D^=47ZFGRI5vhPol7g{Qv z>=eUd)Gv!s^03OsLpd@!S;ZUN1IfDBOqJY5JDHfb#k*vPC#6pMwMjcwx?Sj^8eOk< zYfc;)=`$1r+Mt}4J7j)0a| zKT**T(S#NtnxAN&iWW)`3;T30m;{4Rp!a|e8hdQQ5Vdx9_q51NcH0M(3~JfGGlT4^ za*XYAOyOFmvTTefSZ3rqgP1Y1Q%iLm4Qz7;-&mD4KoL`Q0=Lyk6wXjprL>K_8W}_k zH$sn$jfPTdgk8sxPu%jnEYQNTd@D0{A+LsYDGj2g@dz0+?v|~p$fdT8xwAUu9trKj z9|qC7R_JSb^GysXUAB>uy2iVt<<;2KW8=AoHgL%7YT!MY6`Fyyq%GJ3!hH`OaAjIEz?x@fR4P8ukDH