sunholo 0.60.1__py3-none-any.whl → 0.60.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/agents/dispatch_to_qa.py +1 -1
- sunholo/agents/flask/qna_routes.py +4 -0
- sunholo/cli/chat_vac.py +41 -33
- sunholo/cli/cli.py +11 -0
- sunholo/cli/run_proxy.py +20 -4
- sunholo/components/retriever.py +2 -1
- sunholo/components/vectorstore.py +27 -19
- sunholo/logging.py +8 -3
- sunholo/utils/config.py +0 -1
- sunholo/utils/user_ids.py +2 -31
- {sunholo-0.60.1.dist-info → sunholo-0.60.2.dist-info}/METADATA +2 -2
- {sunholo-0.60.1.dist-info → sunholo-0.60.2.dist-info}/RECORD +16 -16
- {sunholo-0.60.1.dist-info → sunholo-0.60.2.dist-info}/LICENSE.txt +0 -0
- {sunholo-0.60.1.dist-info → sunholo-0.60.2.dist-info}/WHEEL +0 -0
- {sunholo-0.60.1.dist-info → sunholo-0.60.2.dist-info}/entry_points.txt +0 -0
- {sunholo-0.60.1.dist-info → sunholo-0.60.2.dist-info}/top_level.txt +0 -0
sunholo/agents/dispatch_to_qa.py
CHANGED
|
@@ -52,7 +52,7 @@ def prep_request_payload(user_input, chat_history, vector_name, stream, **kwargs
|
|
|
52
52
|
agent = load_config_key("agent", vector_name=vector_name, kind="vacConfig")
|
|
53
53
|
agent_type = load_config_key("agent_type", vector_name=vector_name, kind="vacConfig")
|
|
54
54
|
|
|
55
|
-
override_endpoint = kwargs.get("
|
|
55
|
+
override_endpoint = kwargs.get("override_endpoint")
|
|
56
56
|
if override_endpoint:
|
|
57
57
|
log.info(f"Overriding endpoint with {override_endpoint}")
|
|
58
58
|
|
|
@@ -37,6 +37,10 @@ except ImportError as err:
|
|
|
37
37
|
|
|
38
38
|
def register_qna_routes(app, stream_interpreter, vac_interpreter):
|
|
39
39
|
|
|
40
|
+
@app.route("/")
|
|
41
|
+
def home():
|
|
42
|
+
return jsonify("OK")
|
|
43
|
+
|
|
40
44
|
@app.route('/vac/streaming/<vector_name>', methods=['POST'])
|
|
41
45
|
@observe()
|
|
42
46
|
def stream_qa(vector_name):
|
sunholo/cli/chat_vac.py
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
from ..agents import
|
|
2
|
-
from ..streaming import
|
|
3
|
-
from ..utils.user_ids import
|
|
1
|
+
from ..agents import send_to_qa
|
|
2
|
+
from ..streaming import generate_proxy_stream
|
|
3
|
+
from ..utils.user_ids import generate_user_id
|
|
4
4
|
|
|
5
|
-
from .run_proxy import
|
|
5
|
+
from .run_proxy import clean_proxy_list, start_proxy
|
|
6
6
|
|
|
7
7
|
import uuid
|
|
8
8
|
|
|
9
9
|
def get_service_url(service_name):
|
|
10
|
-
proxies =
|
|
10
|
+
proxies = clean_proxy_list()
|
|
11
11
|
if service_name in proxies:
|
|
12
12
|
port = proxies[service_name]['port']
|
|
13
13
|
return f"http://127.0.0.1:{port}"
|
|
@@ -15,10 +15,11 @@ def get_service_url(service_name):
|
|
|
15
15
|
print(f"No proxy found running for service: {service_name} - attempting to connect")
|
|
16
16
|
return start_proxy(service_name)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
def stream_chat_session(service_name):
|
|
19
19
|
|
|
20
20
|
service_url = get_service_url(service_name)
|
|
21
|
-
user_id =
|
|
21
|
+
user_id = generate_user_id()
|
|
22
|
+
chat_history = []
|
|
22
23
|
while True:
|
|
23
24
|
session_id = str(uuid.uuid4())
|
|
24
25
|
user_input = input("You: ")
|
|
@@ -26,13 +27,11 @@ async def stream_chat_session(service_name, chat_history):
|
|
|
26
27
|
print("Exiting chat session.")
|
|
27
28
|
break
|
|
28
29
|
|
|
29
|
-
chat_history.append({"role": "
|
|
30
|
+
chat_history.append({"role": "Human", "content": user_input})
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
generate = await generate_proxy_stream_async(
|
|
35
|
-
send_to_qa_async,
|
|
32
|
+
def stream_response():
|
|
33
|
+
generate = generate_proxy_stream(
|
|
34
|
+
send_to_qa,
|
|
36
35
|
user_input,
|
|
37
36
|
vector_name=service_name,
|
|
38
37
|
chat_history=chat_history,
|
|
@@ -56,28 +55,35 @@ async def stream_chat_session(service_name, chat_history):
|
|
|
56
55
|
message_source="cli",
|
|
57
56
|
override_endpoint=service_url
|
|
58
57
|
)
|
|
59
|
-
|
|
58
|
+
for part in generate():
|
|
60
59
|
yield part
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
response_started = False
|
|
62
|
+
vac_response = ""
|
|
63
|
+
for token in stream_response():
|
|
64
|
+
if not response_started:
|
|
65
|
+
print(f"VAC {service_name}: ", end='', flush=True)
|
|
66
|
+
response_started = True
|
|
67
|
+
|
|
64
68
|
if isinstance(token, bytes):
|
|
65
69
|
token = token.decode('utf-8')
|
|
66
70
|
print(token, end='', flush=True)
|
|
71
|
+
vac_response += token
|
|
67
72
|
|
|
68
|
-
chat_history.append({"role": "
|
|
73
|
+
chat_history.append({"role": "AI", "content": vac_response})
|
|
74
|
+
response_started = False
|
|
69
75
|
print() # For new line after streaming ends
|
|
70
76
|
|
|
71
|
-
|
|
77
|
+
def headless_mode(service_name, user_input, chat_history=None):
|
|
72
78
|
chat_history = chat_history or []
|
|
73
|
-
chat_history.append({"role": "
|
|
79
|
+
chat_history.append({"role": "Human", "content": user_input})
|
|
74
80
|
service_url = get_service_url(service_name)
|
|
75
|
-
user_id =
|
|
81
|
+
user_id = generate_user_id()
|
|
76
82
|
session_id = str(uuid.uuid4())
|
|
77
83
|
|
|
78
|
-
|
|
79
|
-
generate =
|
|
80
|
-
|
|
84
|
+
def stream_response():
|
|
85
|
+
generate = generate_proxy_stream(
|
|
86
|
+
send_to_qa,
|
|
81
87
|
user_input,
|
|
82
88
|
vector_name=service_name,
|
|
83
89
|
chat_history=chat_history,
|
|
@@ -101,30 +107,32 @@ async def headless_mode(service_name, user_input, chat_history=None):
|
|
|
101
107
|
message_source="cli",
|
|
102
108
|
override_endpoint=service_url
|
|
103
109
|
)
|
|
104
|
-
|
|
110
|
+
for part in generate():
|
|
105
111
|
yield part
|
|
106
112
|
|
|
107
|
-
print("
|
|
108
|
-
|
|
113
|
+
print(f"VAC {service_name}: ", end='', flush=True)
|
|
114
|
+
for token in stream_response():
|
|
109
115
|
if isinstance(token, bytes):
|
|
110
116
|
token = token.decode('utf-8')
|
|
111
117
|
print(token, end='', flush=True)
|
|
112
118
|
|
|
113
|
-
chat_history.append({"role": "
|
|
119
|
+
chat_history.append({"role": "AI", "content": token})
|
|
114
120
|
print() # For new line after streaming ends
|
|
115
121
|
|
|
122
|
+
return chat_history
|
|
123
|
+
|
|
116
124
|
|
|
117
125
|
def vac_command(args):
|
|
118
126
|
try:
|
|
119
127
|
service_url = get_service_url(args.service_name)
|
|
120
128
|
except ValueError as e:
|
|
121
|
-
print(e)
|
|
129
|
+
print(f"ERROR: Could not start {args.service_name} proxy URL: {str(e)}")
|
|
122
130
|
return
|
|
123
|
-
|
|
131
|
+
print(f"== Starting VAC chat session with {args.service_name} via proxy URL: {service_url}")
|
|
124
132
|
if args.headless:
|
|
125
|
-
headless_mode(
|
|
133
|
+
headless_mode(args.service_name, args.user_input, args.chat_history)
|
|
126
134
|
else:
|
|
127
|
-
stream_chat_session(
|
|
135
|
+
stream_chat_session(args.service_name)
|
|
128
136
|
|
|
129
137
|
def setup_vac_subparser(subparsers):
|
|
130
138
|
"""
|
|
@@ -133,9 +141,9 @@ def setup_vac_subparser(subparsers):
|
|
|
133
141
|
Args:
|
|
134
142
|
subparsers: The subparsers object from argparse.ArgumentParser().
|
|
135
143
|
"""
|
|
136
|
-
vac_parser = subparsers.add_parser('vac', help='Interact with
|
|
144
|
+
vac_parser = subparsers.add_parser('vac', help='Interact with deployed VAC services.')
|
|
137
145
|
vac_parser.add_argument('service_name', help='Name of the VAC service.')
|
|
138
|
-
vac_parser.add_argument('user_input', help='User input for the VAC service.', nargs='?', default=None)
|
|
146
|
+
vac_parser.add_argument('user_input', help='User input for the VAC service when in headless mode.', nargs='?', default=None)
|
|
139
147
|
vac_parser.add_argument('--headless', action='store_true', help='Run in headless mode.')
|
|
140
148
|
vac_parser.add_argument('--chat_history', help='Chat history for headless mode (as JSON string).', default=None)
|
|
141
149
|
vac_parser.set_defaults(func=vac_command)
|
sunholo/cli/cli.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import argparse
|
|
2
|
+
import logging
|
|
2
3
|
|
|
3
4
|
from .configs import setup_list_configs_subparser
|
|
4
5
|
from .deploy import setup_deploy_subparser
|
|
@@ -7,6 +8,7 @@ from .merge_texts import setup_merge_text_subparser
|
|
|
7
8
|
from .run_proxy import setup_proxy_subparser
|
|
8
9
|
from .chat_vac import setup_vac_subparser
|
|
9
10
|
|
|
11
|
+
from ..logging import log
|
|
10
12
|
|
|
11
13
|
def main(args=None):
|
|
12
14
|
"""
|
|
@@ -19,6 +21,8 @@ def main(args=None):
|
|
|
19
21
|
```
|
|
20
22
|
"""
|
|
21
23
|
parser = argparse.ArgumentParser(description="sunholo CLI tool for deploying GenAI VACs")
|
|
24
|
+
parser.add_argument('--debug', action='store_true', help='Enable debug output')
|
|
25
|
+
|
|
22
26
|
subparsers = parser.add_subparsers(title='commands',
|
|
23
27
|
description='Valid commands',
|
|
24
28
|
help='Commands',
|
|
@@ -40,6 +44,13 @@ def main(args=None):
|
|
|
40
44
|
|
|
41
45
|
args = parser.parse_args(args)
|
|
42
46
|
|
|
47
|
+
if args.debug:
|
|
48
|
+
log.setLevel(logging.INFO)
|
|
49
|
+
logging.getLogger().setLevel(logging.INFO)
|
|
50
|
+
else:
|
|
51
|
+
log.setLevel(logging.WARNING)
|
|
52
|
+
logging.getLogger().setLevel(logging.WARNING)
|
|
53
|
+
|
|
43
54
|
if hasattr(args, 'func'):
|
|
44
55
|
args.func(args)
|
|
45
56
|
else:
|
sunholo/cli/run_proxy.py
CHANGED
|
@@ -63,12 +63,28 @@ def check_gcloud():
|
|
|
63
63
|
print(f"ERROR: An unexpected error occurred: {e}")
|
|
64
64
|
return False
|
|
65
65
|
|
|
66
|
+
def is_process_running(pid):
|
|
67
|
+
try:
|
|
68
|
+
os.kill(pid, 0)
|
|
69
|
+
return True
|
|
70
|
+
except OSError:
|
|
71
|
+
print("WARNING: VAC Proxy lost connection")
|
|
72
|
+
return False
|
|
73
|
+
|
|
66
74
|
def load_proxies():
|
|
67
75
|
if os.path.exists(PROXY_TRACKER_FILE):
|
|
68
76
|
with open(PROXY_TRACKER_FILE, 'r') as file:
|
|
69
77
|
return json.load(file)
|
|
70
78
|
return {}
|
|
71
79
|
|
|
80
|
+
def clean_proxy_list():
|
|
81
|
+
proxies = load_proxies()
|
|
82
|
+
updated_proxies = {k: v for k, v in proxies.items() if is_process_running(v["pid"])}
|
|
83
|
+
if len(proxies) != len(updated_proxies):
|
|
84
|
+
save_proxies(updated_proxies)
|
|
85
|
+
|
|
86
|
+
return updated_proxies
|
|
87
|
+
|
|
72
88
|
def save_proxies(proxies):
|
|
73
89
|
with open(PROXY_TRACKER_FILE, 'w') as file:
|
|
74
90
|
json.dump(proxies, file, indent=4)
|
|
@@ -83,7 +99,7 @@ def start_proxy(service_name, region, project, port=None):
|
|
|
83
99
|
project (str): GCP project of the Cloud Run service.
|
|
84
100
|
port (int, optional): Port to run the proxy on. If not provided, auto-assigns the next available port.
|
|
85
101
|
"""
|
|
86
|
-
proxies =
|
|
102
|
+
proxies = clean_proxy_list()
|
|
87
103
|
|
|
88
104
|
if service_name in proxies:
|
|
89
105
|
print(f"Proxy for service {service_name} is already running on port {proxies[service_name]['port']}.")
|
|
@@ -109,7 +125,7 @@ def start_proxy(service_name, region, project, port=None):
|
|
|
109
125
|
|
|
110
126
|
print(f"Proxy for {service_name} setup complete on port {port}")
|
|
111
127
|
list_proxies()
|
|
112
|
-
|
|
128
|
+
|
|
113
129
|
return f"http://127.0.0.1:{port}"
|
|
114
130
|
|
|
115
131
|
|
|
@@ -120,7 +136,7 @@ def stop_proxy(service_name):
|
|
|
120
136
|
Args:
|
|
121
137
|
service_name (str): Name of the Cloud Run service.
|
|
122
138
|
"""
|
|
123
|
-
proxies =
|
|
139
|
+
proxies = clean_proxy_list()
|
|
124
140
|
|
|
125
141
|
if service_name not in proxies:
|
|
126
142
|
print(f"No proxy found for service: {service_name}")
|
|
@@ -143,7 +159,7 @@ def list_proxies():
|
|
|
143
159
|
"""
|
|
144
160
|
Lists all running proxies.
|
|
145
161
|
"""
|
|
146
|
-
proxies =
|
|
162
|
+
proxies = clean_proxy_list()
|
|
147
163
|
if not proxies:
|
|
148
164
|
print("No proxies currently running.")
|
|
149
165
|
else:
|
sunholo/components/retriever.py
CHANGED
|
@@ -48,7 +48,8 @@ def pick_retriever(vector_name, embeddings=None):
|
|
|
48
48
|
log.info(f"Found vectorstore {vectorstore}")
|
|
49
49
|
if embeddings is None:
|
|
50
50
|
embeddings = get_embeddings(vector_name)
|
|
51
|
-
|
|
51
|
+
read_only = value.get('readonly')
|
|
52
|
+
vectorstore = pick_vectorstore(vectorstore, vector_name=vector_name, embeddings=embeddings, read_only=read_only)
|
|
52
53
|
k_override = value.get('k', 3)
|
|
53
54
|
vs_retriever = vectorstore.as_retriever(search_kwargs=dict(k=k_override))
|
|
54
55
|
retriever_list.append(vs_retriever)
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import os
|
|
15
15
|
from ..logging import log
|
|
16
16
|
|
|
17
|
-
def pick_vectorstore(vs_str, vector_name, embeddings):
|
|
17
|
+
def pick_vectorstore(vs_str, vector_name, embeddings, read_only=None):
|
|
18
18
|
log.debug('Picking vectorstore')
|
|
19
19
|
|
|
20
20
|
if vs_str == 'supabase':
|
|
@@ -23,8 +23,9 @@ def pick_vectorstore(vs_str, vector_name, embeddings):
|
|
|
23
23
|
|
|
24
24
|
from ..database.database import setup_supabase
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
if not read_only:
|
|
27
|
+
log.debug(f"Initiating Supabase store: {vector_name}")
|
|
28
|
+
setup_supabase(vector_name)
|
|
28
29
|
|
|
29
30
|
# init embedding and vector store
|
|
30
31
|
supabase_url = os.getenv('SUPABASE_URL')
|
|
@@ -70,10 +71,14 @@ def pick_vectorstore(vs_str, vector_name, embeddings):
|
|
|
70
71
|
elif vs_str == 'alloydb':
|
|
71
72
|
from langchain_google_alloydb_pg import AlloyDBVectorStore
|
|
72
73
|
from ..database.alloydb import create_alloydb_table, create_alloydb_engine
|
|
74
|
+
from ..database.database import get_vector_size
|
|
73
75
|
|
|
76
|
+
vector_size = get_vector_size(vector_name)
|
|
74
77
|
engine = create_alloydb_engine(vector_name)
|
|
75
78
|
|
|
76
|
-
table_name =
|
|
79
|
+
table_name = f"{vector_name}_vectorstore_{vector_size}"
|
|
80
|
+
if not read_only:
|
|
81
|
+
table_name = create_alloydb_table(vector_name, engine)
|
|
77
82
|
|
|
78
83
|
log.info(f"Chose AlloyDB with table name {table_name}")
|
|
79
84
|
vectorstore = AlloyDBVectorStore.create_sync(
|
|
@@ -106,21 +111,24 @@ def pick_vectorstore(vs_str, vector_name, embeddings):
|
|
|
106
111
|
try:
|
|
107
112
|
table = db.open_table(vector_name)
|
|
108
113
|
except FileNotFoundError as err:
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
114
|
+
if not read_only:
|
|
115
|
+
log.info(f"{err} - Could not open table for {vector_name} - creating new table")
|
|
116
|
+
init = f"Creating new table for {vector_name}"
|
|
117
|
+
table = db.create_table(
|
|
118
|
+
vector_name,
|
|
119
|
+
data=[
|
|
120
|
+
{
|
|
121
|
+
"vector": embeddings.embed_query(init),
|
|
122
|
+
"text": init,
|
|
123
|
+
"id": "1",
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
mode="overwrite",
|
|
127
|
+
)
|
|
128
|
+
else:
|
|
129
|
+
log.info(f"{err} - Could not create table for {vector_name} as read_only=True")
|
|
130
|
+
|
|
131
|
+
log.info(f"Initiating LanceDB object for {vector_name} using {LANCEDB_BUCKET}")
|
|
124
132
|
vectorstore = LanceDB(
|
|
125
133
|
connection=table,
|
|
126
134
|
embedding=embeddings,
|
sunholo/logging.py
CHANGED
|
@@ -228,11 +228,16 @@ def setup_logging(logger_name=None, log_level=logging.INFO, project_id=None):
|
|
|
228
228
|
project_id = get_gcp_project()
|
|
229
229
|
# Instantiate the GoogleCloudLogging class
|
|
230
230
|
gc_logger = GoogleCloudLogging(project_id, log_level=log_level, logger_name=logger_name)
|
|
231
|
+
# Setup logging and return the logger instance
|
|
232
|
+
return gc_logger.setup_logging()
|
|
231
233
|
else:
|
|
232
|
-
|
|
234
|
+
if not logging.getLogger().hasHandlers():
|
|
235
|
+
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
236
|
+
log = logging.getLogger(logger_name)
|
|
237
|
+
|
|
238
|
+
return log
|
|
233
239
|
|
|
234
|
-
|
|
235
|
-
return gc_logger.setup_logging()
|
|
240
|
+
|
|
236
241
|
|
|
237
242
|
|
|
238
243
|
|
sunholo/utils/config.py
CHANGED
|
@@ -191,7 +191,6 @@ def load_config_key(key: str, vector_name: str, kind: str=None):
|
|
|
191
191
|
assert isinstance(vector_name, str), f"vector_name must be a string, got a {type(vector_name)}"
|
|
192
192
|
|
|
193
193
|
configs_by_kind = load_all_configs()
|
|
194
|
-
log.info(f"configs by kind: {configs_by_kind}")
|
|
195
194
|
|
|
196
195
|
if kind:
|
|
197
196
|
log.info(f"Got kind: {kind} - applying to configs")
|
sunholo/utils/user_ids.py
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import uuid
|
|
2
|
-
from google.auth import default
|
|
3
|
-
|
|
4
|
-
from ..logging import log
|
|
5
|
-
|
|
6
2
|
import hashlib
|
|
7
3
|
import platform
|
|
8
4
|
import socket
|
|
@@ -10,30 +6,5 @@ import socket
|
|
|
10
6
|
def generate_user_id():
|
|
11
7
|
data = f"{socket.gethostname()}-{platform.platform()}-{platform.processor()}"
|
|
12
8
|
hashed_id = hashlib.sha256(data.encode('utf-8')).hexdigest()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def generate_uuid_from_gcloud_user():
|
|
16
|
-
"""
|
|
17
|
-
Generates a UUID using the Google Cloud authorized user's email address, or if not available via os settings.
|
|
18
|
-
|
|
19
|
-
Returns:
|
|
20
|
-
str: The generated UUID as a string.
|
|
21
|
-
"""
|
|
22
|
-
_, credentials = default() # Get the default credentials
|
|
23
|
-
|
|
24
|
-
if credentials:
|
|
25
|
-
user_email = credentials.service_account_email # Get email for service accounts
|
|
26
|
-
if not user_email:
|
|
27
|
-
user_email = credentials.id_token['email'] # Get email for user accounts
|
|
28
|
-
|
|
29
|
-
if user_email:
|
|
30
|
-
# Create a UUID using the user's email as a source for randomness
|
|
31
|
-
user_uuid = uuid.uuid5(uuid.NAMESPACE_DNS, user_email)
|
|
32
|
-
return str(user_uuid)
|
|
33
|
-
else:
|
|
34
|
-
log.warning("Unable to get user email from Google Cloud credentials.")
|
|
35
|
-
|
|
36
|
-
else:
|
|
37
|
-
log.warning("No Google Cloud credentials found.")
|
|
38
|
-
|
|
39
|
-
return str(generate_user_id())
|
|
9
|
+
|
|
10
|
+
return str(uuid.uuid5(uuid.NAMESPACE_DNS, hashed_id))
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sunholo
|
|
3
|
-
Version: 0.60.
|
|
3
|
+
Version: 0.60.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.60.
|
|
6
|
+
Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.60.2.tar.gz
|
|
7
7
|
Author: Holosun ApS
|
|
8
8
|
Author-email: multivac@sunholo.com
|
|
9
9
|
License: Apache License, Version 2.0
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
sunholo/__init__.py,sha256=KfqJV0T-2WCIlabNxeX3CvLS-bBGCl9n5aWy091lr2M,841
|
|
2
|
-
sunholo/logging.py,sha256=
|
|
2
|
+
sunholo/logging.py,sha256=bwiNlbYNzC7FdsrbFOvnvmgfKaRjhA5T73gmYJaUd8I,11589
|
|
3
3
|
sunholo/agents/__init__.py,sha256=CnlbVohPt-Doth9PyROSlN3P8xMV9j9yS19YE-wCS90,341
|
|
4
4
|
sunholo/agents/chat_history.py,sha256=PbwYmw1TwzI8H-cwQIGgHZ6UIr2Qb-JWow0RG3ayLM8,5195
|
|
5
|
-
sunholo/agents/dispatch_to_qa.py,sha256=
|
|
5
|
+
sunholo/agents/dispatch_to_qa.py,sha256=h5qbcPqJ5JGa21T8Z5is7jbn4eG3P4xULLj_X25q3WM,8208
|
|
6
6
|
sunholo/agents/langserve.py,sha256=FdhQjorAY2bMn2rpuabNT6bU3uqSKWrl8DjpH3L_V7k,4375
|
|
7
7
|
sunholo/agents/pubsub.py,sha256=5hbbhbBGyVWRpt2sAGC5FEheYH1mCCwVUhZEB1S7vGg,1337
|
|
8
8
|
sunholo/agents/route.py,sha256=0klBifx-QtMGsjq8HB04s9Bytm0nFXPYaWKeyt-S9S4,2356
|
|
@@ -13,7 +13,7 @@ sunholo/agents/fastapi/base.py,sha256=clk76cHbUAvU0OYJrRfCWX_5f0ACbhDsIzYBhI3wyo
|
|
|
13
13
|
sunholo/agents/fastapi/qna_routes.py,sha256=DgK4Btu5XriOC1JaRQ4G_nWEjJfnQ0J5pyLanF6eF1g,3857
|
|
14
14
|
sunholo/agents/flask/__init__.py,sha256=uqfHNw2Ru3EJ4dJEcbp86h_lkquBQPMxZbjhV_xe3rs,72
|
|
15
15
|
sunholo/agents/flask/base.py,sha256=RUGWBYWeV60FatYF5sMRrxD-INU97Vodsi6JaB6i93s,763
|
|
16
|
-
sunholo/agents/flask/qna_routes.py,sha256=
|
|
16
|
+
sunholo/agents/flask/qna_routes.py,sha256=Pr2dxM7GKhXNKv6t7_J578BN6oMETAYFe6ydEm4D90g,8620
|
|
17
17
|
sunholo/archive/__init__.py,sha256=qNHWm5rGPVOlxZBZCpA1wTYPbalizRT7f8X4rs2t290,31
|
|
18
18
|
sunholo/archive/archive.py,sha256=C-UhG5x-XtZ8VheQp92IYJqgD0V3NFQjniqlit94t18,1197
|
|
19
19
|
sunholo/auth/__init__.py,sha256=4owDjSaWYkbTlPK47UHTOC0gCWbZsqn4ZIEw5NWZTlg,28
|
|
@@ -32,18 +32,18 @@ sunholo/chunker/pdfs.py,sha256=daCZ1xjn1YvxlifIyxskWNpLJLe-Q9D_Jq12MWx3tZo,2473
|
|
|
32
32
|
sunholo/chunker/publish.py,sha256=PoT8q3XJeFCg10WrLkYhuaaXIrGVkvUD3-R9IfoWoH4,2703
|
|
33
33
|
sunholo/chunker/splitter.py,sha256=FLkDhkePkg_zGQpFBK13Cznw575D-Rf9pcaCpc1HUxY,6726
|
|
34
34
|
sunholo/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
|
-
sunholo/cli/chat_vac.py,sha256=
|
|
36
|
-
sunholo/cli/cli.py,sha256=
|
|
35
|
+
sunholo/cli/chat_vac.py,sha256=8UHiEhnnApZBPfWdb9_BQoGuKsRCN84p4dKsPKzF_sU,5433
|
|
36
|
+
sunholo/cli/cli.py,sha256=2sPbnHsAhvmga-gWUXoVl0nbH1qaYj85kwPwxG0DfGo,1904
|
|
37
37
|
sunholo/cli/cli_init.py,sha256=JMZ9AX2cPDZ-_mv3adiv2ToFVNyRPtjk9Biszl1kiR0,2358
|
|
38
38
|
sunholo/cli/configs.py,sha256=QUM9DvKOdZmEQRM5uI3Nh887T0YDiSMr7O240zTLqws,4546
|
|
39
39
|
sunholo/cli/deploy.py,sha256=zxdwUsRTRMC8U5vyRv0JiKBLFn84Ug_Tc88-_h9hJSs,1609
|
|
40
40
|
sunholo/cli/merge_texts.py,sha256=U9vdMwKmcPoc6iPOWX5MKSxn49dNGbNzVLw8ui5PhEU,1823
|
|
41
|
-
sunholo/cli/run_proxy.py,sha256=
|
|
41
|
+
sunholo/cli/run_proxy.py,sha256=JOLenOmsd7VLePofeYqZUyJyQ9Mlfq4nnVa5cbEDXEY,6578
|
|
42
42
|
sunholo/components/__init__.py,sha256=RJGNEihwvRIiDScKis04RHJv4yZGI1UpXlOmuCptNZI,208
|
|
43
43
|
sunholo/components/llm.py,sha256=T4we3tGmqUj4tPwxQr9M6AXv_BALqZV_dRSvINan-oU,10374
|
|
44
44
|
sunholo/components/prompt.py,sha256=eZSghXkIlRzXiSrzgkG7e5ytUYq6R6LV-qjHU8jStig,6353
|
|
45
|
-
sunholo/components/retriever.py,sha256=
|
|
46
|
-
sunholo/components/vectorstore.py,sha256=
|
|
45
|
+
sunholo/components/retriever.py,sha256=_Lyt9RIgb2PD-rhV6oKAadiUs3ukT5uAYGW197tEskw,3755
|
|
46
|
+
sunholo/components/vectorstore.py,sha256=dzspqOBtuxSjCFxem5_50sqwUUjbZ4oBYERtCwxZR6E,5619
|
|
47
47
|
sunholo/database/__init__.py,sha256=Zz0Shcq-CtStf9rJGIYB_Ybzb8rY_Q9mfSj-nviM490,241
|
|
48
48
|
sunholo/database/alloydb.py,sha256=J4VzrW2ChIYyqtccUBCtoN-vClfn-iipEDJpxN7GJkY,14820
|
|
49
49
|
sunholo/database/database.py,sha256=doY05kG8BZBLL-arh4hq5ef1ouWOtGHqdsDc6M2YHgk,7345
|
|
@@ -88,16 +88,16 @@ sunholo/summarise/__init__.py,sha256=MZk3dblUMODcPb1crq4v-Z508NrFIpkSWNf9FIO8BcU
|
|
|
88
88
|
sunholo/summarise/summarise.py,sha256=C3HhjepTjUhUC8FLk4jMQIBvq1BcORniwuTFHjPVhVo,3784
|
|
89
89
|
sunholo/utils/__init__.py,sha256=G11nN_6ATjxpuMfG_BvcUr9UU8onPIgkpTK6CjOcbr8,48
|
|
90
90
|
sunholo/utils/big_context.py,sha256=gJIP7_ZL-YSLhOMq8jmFTMqH1wq8eB1NK7oKPeZAq2s,5578
|
|
91
|
-
sunholo/utils/config.py,sha256=
|
|
91
|
+
sunholo/utils/config.py,sha256=6n7foIi7kk6EKaS9MOAf0911oI7grkkgiTCya9k3LmI,8448
|
|
92
92
|
sunholo/utils/config_schema.py,sha256=Wv-ncitzljOhgbDaq9qnFqH5LCuxNv59dTGDWgd1qdk,4189
|
|
93
93
|
sunholo/utils/gcp.py,sha256=B2G1YKjeD7X9dqO86Jrp2vPuFwZ223Xl5Tg09Ndw-oc,5760
|
|
94
94
|
sunholo/utils/parsers.py,sha256=OrHmASqIbI45atVOhiGodgLvnfrzkvVzyHnSvAXD89I,3841
|
|
95
|
-
sunholo/utils/user_ids.py,sha256=
|
|
95
|
+
sunholo/utils/user_ids.py,sha256=SQd5_H7FE7vcTZp9AQuQDWBXd4FEEd7TeVMQe1H4Ny8,292
|
|
96
96
|
sunholo/vertex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
97
97
|
sunholo/vertex/init_vertex.py,sha256=JDMUaBRdednzbKF-5p33qqLit2LMsvgvWW-NRz0AqO0,1801
|
|
98
|
-
sunholo-0.60.
|
|
99
|
-
sunholo-0.60.
|
|
100
|
-
sunholo-0.60.
|
|
101
|
-
sunholo-0.60.
|
|
102
|
-
sunholo-0.60.
|
|
103
|
-
sunholo-0.60.
|
|
98
|
+
sunholo-0.60.2.dist-info/LICENSE.txt,sha256=SdE3QjnD3GEmqqg9EX3TM9f7WmtOzqS1KJve8rhbYmU,11345
|
|
99
|
+
sunholo-0.60.2.dist-info/METADATA,sha256=7tTs86ZrZTMa9ZJ-K1X18LX6ixQDsvMwqpjXe4gwcuE,7903
|
|
100
|
+
sunholo-0.60.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
101
|
+
sunholo-0.60.2.dist-info/entry_points.txt,sha256=bZuN5AIHingMPt4Ro1b_T-FnQvZ3teBes-3OyO0asl4,49
|
|
102
|
+
sunholo-0.60.2.dist-info/top_level.txt,sha256=wt5tadn5--5JrZsjJz2LceoUvcrIvxjHJe-RxuudxAk,8
|
|
103
|
+
sunholo-0.60.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|