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 +2 -0
- sunholo/chunker/loaders.py +1 -1
- sunholo/cli/cli.py +3 -0
- sunholo/excel/__init__.py +1 -0
- sunholo/excel/plugin.py +97 -0
- sunholo/invoke/async_class.py +60 -1
- sunholo/invoke/direct_vac_func.py +22 -25
- sunholo/qna/parsers.py +8 -0
- sunholo/utils/config_class.py +2 -0
- {sunholo-0.84.11.dist-info → sunholo-0.85.2.dist-info}/METADATA +7 -2
- {sunholo-0.84.11.dist-info → sunholo-0.85.2.dist-info}/RECORD +15 -13
- {sunholo-0.84.11.dist-info → sunholo-0.85.2.dist-info}/WHEEL +1 -1
- {sunholo-0.84.11.dist-info → sunholo-0.85.2.dist-info}/LICENSE.txt +0 -0
- {sunholo-0.84.11.dist-info → sunholo-0.85.2.dist-info}/entry_points.txt +0 -0
- {sunholo-0.84.11.dist-info → sunholo-0.85.2.dist-info}/top_level.txt +0 -0
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',
|
sunholo/chunker/loaders.py
CHANGED
|
@@ -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"
|
|
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
|
sunholo/excel/plugin.py
ADDED
|
@@ -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)
|
sunholo/invoke/async_class.py
CHANGED
|
@@ -8,7 +8,8 @@ logger = logging.getLogger(__name__)
|
|
|
8
8
|
|
|
9
9
|
class AsyncTaskRunner:
|
|
10
10
|
"""
|
|
11
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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}")
|
sunholo/utils/config_class.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
90
|
-
sunholo/invoke/direct_vac_func.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
142
|
-
sunholo-0.
|
|
143
|
-
sunholo-0.
|
|
144
|
-
sunholo-0.
|
|
145
|
-
sunholo-0.
|
|
146
|
-
sunholo-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|