sunholo 0.84.11__py3-none-any.whl → 0.85.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sunholo/__init__.py CHANGED
@@ -8,6 +8,7 @@ from . import components
8
8
  from . import database
9
9
  from . import discovery_engine
10
10
  from . import embedder
11
+ from . import excel
11
12
  from . import gcs
12
13
  from . import genai
13
14
  from . import invoke
@@ -34,6 +35,7 @@ __all__ = ['agents',
34
35
  'database',
35
36
  'discovery_engine',
36
37
  'embedder',
38
+ 'excel',
37
39
  'gcs',
38
40
  'genai',
39
41
  'invoke',
@@ -185,7 +185,7 @@ def read_file_to_documents(gs_file: pathlib.Path, metadata: dict = None):
185
185
  return []
186
186
 
187
187
  log.info(f"Sending {pdf_path} to UnstructuredAPIFileLoader")
188
- UNSTRUCTURED_URL = os.getenv("UNSTRUCTURED_URL", None)
188
+ UNSTRUCTURED_URL = os.getenv("UNSTRUCTURED_URL")
189
189
  unstructured_kwargs = {"pdf_infer_table_structure": True,
190
190
  "extract_image_block_types": ["Image", "Table"]
191
191
  }
sunholo/cli/cli.py CHANGED
@@ -11,6 +11,7 @@ from .embedder import setup_embedder_subparser
11
11
  from .swagger import setup_swagger_subparser
12
12
  from .vertex import setup_vertex_subparser
13
13
  from ..llamaindex import setup_llamaindex_subparser
14
+ from ..excel import setup_excel_subparser
14
15
 
15
16
  from ..utils import ConfigManager
16
17
  from ..utils.version import sunholo_version
@@ -92,6 +93,8 @@ def main(args=None):
92
93
  setup_vertex_subparser(subparsers)
93
94
  # llamaindex
94
95
  setup_llamaindex_subparser(subparsers)
96
+ # excel
97
+ setup_excel_subparser(subparsers)
95
98
 
96
99
  #TODO: add database setup commands: alloydb and supabase
97
100
 
@@ -0,0 +1 @@
1
+ from .plugin import excel_plugin, setup_excel_subparser
@@ -0,0 +1,97 @@
1
+ import os
2
+ import sys
3
+ import subprocess
4
+ import shutil
5
+ from ..custom_logging import log
6
+ from ..invoke import direct_vac
7
+
8
+ def setup_excel_plugin(args):
9
+ """
10
+ Sets up the Excel plugin by copying the VBA file and creating the xlwings.conf file
11
+ with the correct Python interpreter path.
12
+ """
13
+ from rich.panel import Panel
14
+ from ..cli.sun_rich import console
15
+
16
+ # Define the source directory (where the sunholo.excel package is located)
17
+ library_folder = os.path.dirname(__file__)
18
+
19
+ # Define the destination directory (current working directory)
20
+ destination_folder = os.getcwd()
21
+
22
+ # Define the paths
23
+ vba_file_template = "call_vac.vba.template" # A template file with a placeholder for the path
24
+ vba_file_output = "call_vac.vba"
25
+ source_vba_file = os.path.join(library_folder, vba_file_template)
26
+ destination_vba_file = os.path.join(destination_folder, vba_file_output)
27
+
28
+ # Ensure the .venv directory exists
29
+ if not os.path.exists(os.path.join(destination_folder, ".venv")):
30
+ console.print(f"ERROR: Virtual environment not found in {destination_folder}. "
31
+ "Please ensure you are working in correct folder. "
32
+ " This command needs to be run from location where venv is created via `python -m venv .venv`"
33
+ " and has installed this library via `pip install sunholo[excel]`")
34
+ return None
35
+
36
+ # Create the xlwings.conf file with the correct Python interpreter path
37
+ conf_file_path = os.path.join(destination_folder, "xlwings.conf")
38
+ python_executable = sys.executable
39
+
40
+ # Ensure the .venv directory exists
41
+ if not os.path.exists(os.path.dirname(python_executable)):
42
+ console.print(f"[bold red]ERROR: Python environment not found at {python_executable}. Please ensure it is created.[/bold red]")
43
+ return None
44
+
45
+ # Check if xlwings is installed
46
+ try:
47
+ subprocess.run([python_executable, "-c", "import xlwings"], check=True, capture_output=True)
48
+ console.print("xlwings is installed in the Python environment.")
49
+ except subprocess.CalledProcessError:
50
+ console.print("[bold red]WARNING: xlwings is not installed in the Python environment. Please install it using 'pip install sunholo\[excel]'[/bold red]")
51
+
52
+
53
+ # Write the xlwings.conf file
54
+ try:
55
+ with open(conf_file_path, "w") as conf_file:
56
+ conf_file.write("[Interpreter]\n")
57
+ conf_file.write(f"PYTHONPATH={python_executable}\n")
58
+ console.print(f"Created {conf_file_path} with PYTHONPATH set to {python_executable}")
59
+ except IOError as e:
60
+ console.print(f"[bold red]ERROR:[/bold red] Failed to create xlwings.conf: {e}")
61
+ return None
62
+
63
+ # Copy the VBA template file to the destination as the VBA file
64
+ try:
65
+ shutil.copy2(source_vba_file, destination_vba_file)
66
+ console.print(f"Created {destination_vba_file}")
67
+ except IOError as e:
68
+ console.print(f"[bold red]ERROR:[/bold red] Failed to copy VBA file: {e}")
69
+ return None
70
+
71
+ console.print(
72
+ Panel(("1. Open your Excel workbook.\n"
73
+ "2. Press Alt + F11 to open the VBA editor.\n"
74
+ "3. Insert a new module (Insert -> Module).\n"
75
+ f"4. Add the VBA code from {destination_vba_file} into the module.\n"
76
+ "5. Use =MULTIVAC() within your Excel cells"),
77
+ title="Next Steps")
78
+ )
79
+
80
+
81
+ def excel_plugin(input_data, vac_name):
82
+ log.info(f"Calling multivac plugin for {vac_name} with {input_data}")
83
+ response = direct_vac(input_data, vac_name=vac_name)
84
+ log.info(f"Plugin got {response}")
85
+ return response['answer']
86
+
87
+ def setup_excel_subparser(subparsers):
88
+ """
89
+ Sets up an argparse subparser for the 'excel' command.
90
+
91
+ Example command:
92
+ ```bash
93
+ sunholo excel-init
94
+ ```
95
+ """
96
+ deploy_parser = subparsers.add_parser('excel-init', help='Create Excel integrations with Sunholo VACs')
97
+ deploy_parser.set_defaults(func=setup_excel_plugin)
@@ -8,7 +8,8 @@ logger = logging.getLogger(__name__)
8
8
 
9
9
  class AsyncTaskRunner:
10
10
  """
11
- # Example async functions for testing
11
+ Example async functions for testing
12
+ ```python
12
13
  async def api_call_1(url, params):
13
14
  await asyncio.sleep(1)
14
15
  if "fail" in params:
@@ -44,6 +45,64 @@ class AsyncTaskRunner:
44
45
  results = runner.run_sync()
45
46
  for result in results:
46
47
  print(result)
48
+ ```
49
+
50
+ Example streaming fast and slow
51
+
52
+ ```python
53
+ import asyncio
54
+ from typing import AsyncGenerator
55
+
56
+ # Example streaming function that simulates yielding chunks of data
57
+ async def stream_chunks(url: str, params: dict) -> AsyncGenerator[str, None]:
58
+ # Simulate streaming with a series of chunks
59
+ for i in range(5):
60
+ await asyncio.sleep(1) # Simulate delay between chunks
61
+ yield f"Chunk {i+1} from {url} with params {params}"
62
+
63
+ # Example slow API call function
64
+ async def slow_api_call(url: str, params: dict) -> str:
65
+ await asyncio.sleep(5) # Simulate a slow API response
66
+ return f"Slow API response from {url} with params {params}"
67
+
68
+ # Function to manage streaming and slow API call
69
+ async def process_api_calls(stream_url: str, stream_params: dict, slow_url: str, slow_params: dict) -> AsyncGenerator[str, None]:
70
+ # Create the AsyncTaskRunner instance
71
+ runner = AsyncTaskRunner()
72
+
73
+ # Add the slow API call as a task
74
+ runner.add_task(slow_api_call, slow_url, slow_params)
75
+
76
+ # Run the slow API call concurrently with the streaming
77
+ slow_api_result_task = asyncio.create_task(runner.run_async())
78
+
79
+ # Process the streaming chunks and yield them
80
+ async for chunk in stream_chunks(stream_url, stream_params):
81
+ yield chunk
82
+
83
+ # Wait for the slow API call to complete and get the result
84
+ slow_api_results = await slow_api_result_task
85
+
86
+ # Yield the slow API response after streaming is finished
87
+ for result in slow_api_results:
88
+ yield result
89
+
90
+ # Example usage in an existing async function
91
+ async def example_usage():
92
+ # Define the URLs and parameters for the calls
93
+ stream_url = "http://streaming.example.com"
94
+ stream_params = {"key": "stream_value"}
95
+ slow_url = "http://slowapi.example.com"
96
+ slow_params = {"key": "slow_value"}
97
+
98
+ # Process the API calls and stream the results
99
+ async for output in process_api_calls(stream_url, stream_params, slow_url, slow_params):
100
+ print(output)
101
+
102
+ # Running the example usage
103
+ if __name__ == "__main__":
104
+ asyncio.run(example_usage())
105
+ ```
47
106
  """
48
107
  def __init__(self):
49
108
  self.tasks = []
@@ -13,11 +13,7 @@ def direct_vac(vac_input: dict, vac_name: str, chat_history=[]):
13
13
  log.info(f"Invoking VAC Q&A endpoints for {vac_name}")
14
14
 
15
15
  if 'user_input' not in vac_input:
16
- raise ValueError('vac_input must contain at least "user_input" key - got {vac_input}')
17
-
18
- user_id = vac_input.get('user_id')
19
- session_id = vac_input.get('session_id')
20
- image_uri = vac_input.get('image_url') or vac_input.get('image_uri')
16
+ raise ValueError(f'vac_input must contain at least "user_input" key - got {vac_input}')
21
17
 
22
18
  global_config = ConfigManager('global')
23
19
  config = ConfigManager(vac_name)
@@ -41,28 +37,29 @@ def direct_vac(vac_input: dict, vac_name: str, chat_history=[]):
41
37
  override_endpoint = agent_url or override_endpoint
42
38
 
43
39
  print(f"Using {override_endpoint=}")
44
- log.warning(f'Batch invoke_vac_qa {vac_name} with {vac_input=}')
45
- vac_response = send_to_qa(
46
- vac_input["user_input"],
47
- vector_name=vac_name,
48
- chat_history=chat_history,
49
- message_author=user_id,
50
- #TODO: populate these
51
- image_url=image_uri,
52
- source_filters=None,
53
- search_kwargs=None,
54
- private_docs=None,
55
- whole_document=False,
56
- source_filters_and_or=False,
57
- # system kwargs
58
- configurable={
40
+
41
+ # Prepare the kwargs for send_to_qa by copying vac_input and adding more values
42
+ qa_kwargs = vac_input.copy()
43
+
44
+ # Add additional arguments
45
+ qa_kwargs.update({
46
+ 'vector_name': vac_name,
47
+ 'chat_history': chat_history,
48
+ 'image_url': vac_input.get('image_url') or vac_input.get('image_uri'),
49
+ 'override_endpoint': override_endpoint,
50
+ 'message_source': "sunholo.invoke_vac_qa.invoke",
51
+ 'stream': False,
52
+ 'configurable': {
59
53
  "vector_name": vac_name,
60
54
  },
61
- user_id=user_id,
62
- session_id=session_id,
63
- message_source="sunholo.invoke_vac_qa.invoke",
64
- override_endpoint=override_endpoint,
65
- stream=False)
55
+ })
56
+
57
+ log.info(f'Batch invoke_vac_qa {vac_name} with {qa_kwargs=}')
58
+
59
+ vac_response = send_to_qa(
60
+ vac_input["user_input"],
61
+ **qa_kwargs
62
+ )
66
63
 
67
64
  # ensures {'answer': answer}
68
65
  answer = parse_output(vac_response)
sunholo/qna/parsers.py CHANGED
@@ -44,6 +44,14 @@ def parse_output(bot_output):
44
44
 
45
45
  return bot_output
46
46
 
47
+ elif isinstance(bot_output, dict) and 'output' in bot_output and isinstance(bot_output['output'], dict) and 'content' in bot_output['output']:
48
+ the_output = bot_output['output']
49
+
50
+ return {
51
+ 'answer': the_output.get('content'),
52
+ 'metadata': the_output.get('metadata')
53
+ }
54
+
47
55
  elif isinstance(bot_output, dict):
48
56
  if not bot_output.get("answer"):
49
57
  raise ValueError(f"VAC output was not a string or a dict with the key 'answer' - got: {bot_output}")
@@ -26,6 +26,8 @@ class ConfigManager:
26
26
  agent = config.vacConfig("agent")
27
27
  ```
28
28
  """
29
+ if os.getenv("VAC_CONFIG_FOLDER") is None:
30
+ print("WARNING: No VAC_CONFIG_FOLDER environment variable was specified")
29
31
  local_config_folder = os.path.join(os.getcwd(), "config")
30
32
  if os.path.isdir(local_config_folder):
31
33
  print(f"Found local config folder {local_config_folder} - will overwrite any global configurations")
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.84.11
3
+ Version: 0.85.2
4
4
  Summary: Large Language Model DevOps - a package to help deploy LLMs to the Cloud.
5
5
  Home-page: https://github.com/sunholo-data/sunholo-py
6
- Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.84.11.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.85.2.tar.gz
7
7
  Author: Holosun ApS
8
8
  Author-email: multivac@sunholo.com
9
9
  License: Apache License, Version 2.0
@@ -72,6 +72,7 @@ Requires-Dist: tabulate ; extra == 'all'
72
72
  Requires-Dist: tantivy ; extra == 'all'
73
73
  Requires-Dist: tiktoken ; extra == 'all'
74
74
  Requires-Dist: unstructured[local-inference] ==0.14.9 ; extra == 'all'
75
+ Requires-Dist: xlwings ; extra == 'all'
75
76
  Provides-Extra: anthropic
76
77
  Requires-Dist: langchain-anthropic >=0.1.13 ; extra == 'anthropic'
77
78
  Provides-Extra: azure
@@ -89,6 +90,10 @@ Requires-Dist: pgvector ; extra == 'database'
89
90
  Requires-Dist: psycopg2-binary ; extra == 'database'
90
91
  Requires-Dist: lancedb ; extra == 'database'
91
92
  Requires-Dist: tantivy ; extra == 'database'
93
+ Provides-Extra: excel
94
+ Requires-Dist: xlwings ; extra == 'excel'
95
+ Requires-Dist: requests ; extra == 'excel'
96
+ Requires-Dist: rich ; extra == 'excel'
92
97
  Provides-Extra: gcp
93
98
  Requires-Dist: google-api-python-client ; extra == 'gcp'
94
99
  Requires-Dist: google-cloud-alloydb-connector[pg8000] ; extra == 'gcp'
@@ -1,4 +1,4 @@
1
- sunholo/__init__.py,sha256=iqaTPbzNWVPtDzTKMv3jvWbA_TqedD4qQ2ID0vi7IBg,1048
1
+ sunholo/__init__.py,sha256=z2utHQ5CvmbkiM1WpB2XciqQ98aI-SFRBy0OZk_GkwY,1088
2
2
  sunholo/custom_logging.py,sha256=YfIN1oP3dOEkkYkyRBU8BGS3uJFGwUDsFCl8mIVbwvE,12225
3
3
  sunholo/agents/__init__.py,sha256=X2I3pPkGeKWjc3d0QgSpkTyqD8J8JtrEWqwrumf1MMc,391
4
4
  sunholo/agents/chat_history.py,sha256=Gph_CdlP2otYnNdR1q1Umyyyvcad2F6K3LxU5yBQ9l0,5387
@@ -34,7 +34,7 @@ sunholo/chunker/azure.py,sha256=MVF9_-QdKUoJqlpEJ49pv2sdjMDxEiMNxzmO7w5nWDQ,3270
34
34
  sunholo/chunker/doc_handling.py,sha256=UAf9BmUMpKCKRlAMl1qNZK6xDNYWk1z3ARoftWoa_54,8734
35
35
  sunholo/chunker/encode_metadata.py,sha256=hxxd9KU35Xi0Z_EL8kt_oD66pKfBLhEjBImC16ew-Eo,1919
36
36
  sunholo/chunker/images.py,sha256=id2PBu6XyGEOtgafq2v0c9_O6kxaC_pYFMnbsIitkSg,1868
37
- sunholo/chunker/loaders.py,sha256=CCB0IGigNAWT__2ImVin_j83W3eGS2Qe5I6U18YQzoM,10275
37
+ sunholo/chunker/loaders.py,sha256=n64UgXDB8ZkApnqJwb3VKc8lGTVo8TC1AXmARiaCsQY,10269
38
38
  sunholo/chunker/message_data.py,sha256=EaiY7_HClpcfPUAYaAm6Zk5ReeZ9s9F_jBVd0kDgI-4,10836
39
39
  sunholo/chunker/pdfs.py,sha256=njDPop751GMHi3cOwIKd2Yct-_lWR2gqcB7WykfHphs,2480
40
40
  sunholo/chunker/process_chunker_data.py,sha256=uO-YOEHIjAOy0ZMJ0vea9OMNsQBISHfhbtgoyuHiP6s,3598
@@ -43,7 +43,7 @@ sunholo/chunker/pubsub.py,sha256=48bhuAcszN7LGe3-ksPSLHHhq0uKxiXOrizck5qpcP0,101
43
43
  sunholo/chunker/splitter.py,sha256=QLAEsJOpEYFZr9-UGZUuAlNVyjfCWb8jvzCHg0rVShE,6751
44
44
  sunholo/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  sunholo/cli/chat_vac.py,sha256=jTmCt62U4uqJjeGp_XfIbxnafAAOhQAJMi8TxSkeKlM,23164
46
- sunholo/cli/cli.py,sha256=tnavBrQruyB-G56hGIQ86YkQbpCQQ4K3zvnoP8GrgCU,4135
46
+ sunholo/cli/cli.py,sha256=cWnsXG07IE6fLT1j68ua0GbG9CuoaW8oHRsfRKFt-rE,4227
47
47
  sunholo/cli/cli_init.py,sha256=JMZ9AX2cPDZ-_mv3adiv2ToFVNyRPtjk9Biszl1kiR0,2358
48
48
  sunholo/cli/configs.py,sha256=QUM9DvKOdZmEQRM5uI3Nh887T0YDiSMr7O240zTLqws,4546
49
49
  sunholo/cli/deploy.py,sha256=zxdwUsRTRMC8U5vyRv0JiKBLFn84Ug_Tc88-_h9hJSs,1609
@@ -77,6 +77,8 @@ sunholo/discovery_engine/discovery_engine_client.py,sha256=oORB2SVVqrYrz7E3srPrk
77
77
  sunholo/discovery_engine/get_ai_search_chunks.py,sha256=VPzdYoBP_E6Bko0KpX656QiIfJdwmje4sBnPtZs4JQ4,1963
78
78
  sunholo/embedder/__init__.py,sha256=sI4N_CqgEVcrMDxXgxKp1FsfsB4FpjoXgPGkl4N_u4I,44
79
79
  sunholo/embedder/embed_chunk.py,sha256=MCbTePWjUbIRVDFFhHJ94BvOZvIom62-mTr0PmfQyt0,6951
80
+ sunholo/excel/__init__.py,sha256=AqTMN9K4qJYi4maEgoORc5oxDVGO_eqmwzDaVP37JgY,56
81
+ sunholo/excel/plugin.py,sha256=rl3FoECZ6Ts8KKExPrbPwr3u3CegZfsevmcjgUXAlhE,4033
80
82
  sunholo/gcs/__init__.py,sha256=SZvbsMFDko40sIRHTHppA37IijvJTae54vrhooEF5-4,90
81
83
  sunholo/gcs/add_file.py,sha256=TRbdEd3j-lFnyC7kqs5IWEPMPlDMFLR68fdTWga06Wo,8096
82
84
  sunholo/gcs/download_folder.py,sha256=ijJTnS595JqZhBH8iHFErQilMbkuKgL-bnTCMLGuvlA,1614
@@ -86,8 +88,8 @@ sunholo/genai/__init__.py,sha256=o2c17UbgzIDxNKKF8deCLoctNpatAYgm9Cf9XDfpqvg,87
86
88
  sunholo/genai/process_funcs_cls.py,sha256=xnSxGGEHO7fYct8VkjaOKSBmHG-cEkvFTZqFLsN_oCc,11798
87
89
  sunholo/genai/safety.py,sha256=mkFDO_BeEgiKjQd9o2I4UxB6XI7a9U-oOFjZ8LGRUC4,1238
88
90
  sunholo/invoke/__init__.py,sha256=bELcqIjzKvaupcIN5OQmDgGx_8jARtH9T6PCe8UgcvE,99
89
- sunholo/invoke/async_class.py,sha256=J-qMgarhdi6nPQyOIFM5k0wF7nqr8aJGaz99-Ye6XGQ,3507
90
- sunholo/invoke/direct_vac_func.py,sha256=L_Gz7hEbZQqAZn2j5ehB-eIXmCEYmSZ7F95mjbYP9Nw,4489
91
+ sunholo/invoke/async_class.py,sha256=vmLT6DqE1YaPd4W88_QzPQvSzsjwLUAwt23vGZm-BEs,5767
92
+ sunholo/invoke/direct_vac_func.py,sha256=mJC4SEwzTVMWVAwtFy0Tqn2o1ddR1D225qXrcWlQ_DM,4315
91
93
  sunholo/invoke/invoke_vac_utils.py,sha256=sJc1edHTHMzMGXjji1N67c3iUaP7BmAL5nj82Qof63M,2053
92
94
  sunholo/langfuse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
95
  sunholo/langfuse/callback.py,sha256=jl0SZsFS53uMW9DGeM9SOL_EsRZsba0wwFGLqKzu9_U,1684
@@ -107,7 +109,7 @@ sunholo/pubsub/__init__.py,sha256=DfTEk4zmCfqn6gFxRrqDO0pOrvXTDqH-medpgYO4PGw,11
107
109
  sunholo/pubsub/process_pubsub.py,sha256=rN2N4WM6PZkMKDrdT8pnEfTvsXACRyJFqIHJQCbuxLs,3088
108
110
  sunholo/pubsub/pubsub_manager.py,sha256=19w_N0LiG-wgVWvgJ13b8BUeN8ZzgSPXAhPmL1HRRSI,6966
109
111
  sunholo/qna/__init__.py,sha256=F8q1uR_HreoSX0IfmKY1qoSwIgXhO2Q8kuDSxh9_-EE,28
110
- sunholo/qna/parsers.py,sha256=Ye3M0CUIIV9sSRU6yqM4p8bdJUh3QyrolSXbGnjMYD8,2153
112
+ sunholo/qna/parsers.py,sha256=or5BQ0M-bvYvozJ_ui_4OlRqDaihuLHr2AC_QxUvvPw,2475
111
113
  sunholo/qna/retry.py,sha256=yMw7RTkw-RXCzfENPJOt8c32mXlpvOR589EGkvK-6yI,2028
112
114
  sunholo/streaming/__init__.py,sha256=MpbydI2UYo_adttPQFkxNM33b-QRyNEbrKJx0C2AGPc,241
113
115
  sunholo/streaming/content_buffer.py,sha256=A9rVhlmLZxaFPvGYjVqCs5GfIsA1EMl_tyk-0VCDvo4,6462
@@ -122,7 +124,7 @@ sunholo/utils/__init__.py,sha256=Hv02T5L2zYWvCso5hzzwm8FQogwBq0OgtUbN_7Quzqc,89
122
124
  sunholo/utils/api_key.py,sha256=Ct4bIAQZxzPEw14hP586LpVxBAVi_W9Serpy0BK-7KI,244
123
125
  sunholo/utils/big_context.py,sha256=gJIP7_ZL-YSLhOMq8jmFTMqH1wq8eB1NK7oKPeZAq2s,5578
124
126
  sunholo/utils/config.py,sha256=aG29MXcL5qzQMtCMqcdy-2ysDCYf9Zn_ZLk5NNOQNSE,8982
125
- sunholo/utils/config_class.py,sha256=tp3mXrwbgOISvI1iT-NhEffD6QpIUK65ik7aT_gi-5o,9819
127
+ sunholo/utils/config_class.py,sha256=4uY7i7y18bDLvGNY1PiQ8c4LM-whopsjEWZerHEckwQ,9956
126
128
  sunholo/utils/config_schema.py,sha256=Wv-ncitzljOhgbDaq9qnFqH5LCuxNv59dTGDWgd1qdk,4189
127
129
  sunholo/utils/gcp.py,sha256=uueODEpA-P6O15-t0hmcGC9dONLO_hLfzSsSoQnkUss,4854
128
130
  sunholo/utils/gcp_project.py,sha256=Fa0IhCX12bZ1ctF_PKN8PNYd7hihEUfb90kilBfUDjg,1411
@@ -138,9 +140,9 @@ sunholo/vertex/init.py,sha256=1OQwcPBKZYBTDPdyU7IM4X4OmiXLdsNV30C-fee2scQ,2875
138
140
  sunholo/vertex/memory_tools.py,sha256=q_phxgGX2TG2j2MXNULF2xGzQnQPENwjPN9nZ_A9Gh0,7526
139
141
  sunholo/vertex/safety.py,sha256=S9PgQT1O_BQAkcqauWncRJaydiP8Q_Jzmu9gxYfy1VA,2482
140
142
  sunholo/vertex/type_dict_to_json.py,sha256=uTzL4o9tJRao4u-gJOFcACgWGkBOtqACmb6ihvCErL8,4694
141
- sunholo-0.84.11.dist-info/LICENSE.txt,sha256=SdE3QjnD3GEmqqg9EX3TM9f7WmtOzqS1KJve8rhbYmU,11345
142
- sunholo-0.84.11.dist-info/METADATA,sha256=RvW8QNW0Wr4RzLiPFpT3tmBHbF44W-wohn2jrsGgxYs,7414
143
- sunholo-0.84.11.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
144
- sunholo-0.84.11.dist-info/entry_points.txt,sha256=bZuN5AIHingMPt4Ro1b_T-FnQvZ3teBes-3OyO0asl4,49
145
- sunholo-0.84.11.dist-info/top_level.txt,sha256=wt5tadn5--5JrZsjJz2LceoUvcrIvxjHJe-RxuudxAk,8
146
- sunholo-0.84.11.dist-info/RECORD,,
143
+ sunholo-0.85.2.dist-info/LICENSE.txt,sha256=SdE3QjnD3GEmqqg9EX3TM9f7WmtOzqS1KJve8rhbYmU,11345
144
+ sunholo-0.85.2.dist-info/METADATA,sha256=AMueUx_w1eue9ymCTZG3dwVXAJ5WiLXP9PqvLVVgIls,7598
145
+ sunholo-0.85.2.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
146
+ sunholo-0.85.2.dist-info/entry_points.txt,sha256=bZuN5AIHingMPt4Ro1b_T-FnQvZ3teBes-3OyO0asl4,49
147
+ sunholo-0.85.2.dist-info/top_level.txt,sha256=wt5tadn5--5JrZsjJz2LceoUvcrIvxjHJe-RxuudxAk,8
148
+ sunholo-0.85.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.1.0)
2
+ Generator: setuptools (72.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5