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.
@@ -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("endpoint_url")
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 send_to_qa_async
2
- from ..streaming import generate_proxy_stream_async, generate_proxy_stream
3
- from ..utils.user_ids import generate_uuid_from_gcloud_user
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 load_proxies, start_proxy
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 = load_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
- async def stream_chat_session(service_name, chat_history):
18
+ def stream_chat_session(service_name):
19
19
 
20
20
  service_url = get_service_url(service_name)
21
- user_id = generate_uuid_from_gcloud_user()
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": "user", "content": user_input})
30
+ chat_history.append({"role": "Human", "content": user_input})
30
31
 
31
-
32
-
33
- async def stream_response():
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
- async for part in generate():
58
+ for part in generate():
60
59
  yield part
61
60
 
62
- print("Assistant: ", end='', flush=True)
63
- async for token in stream_response():
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": "assistant", "content": token})
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
- async def headless_mode(service_name, user_input, chat_history=None):
77
+ def headless_mode(service_name, user_input, chat_history=None):
72
78
  chat_history = chat_history or []
73
- chat_history.append({"role": "user", "content": user_input})
79
+ chat_history.append({"role": "Human", "content": user_input})
74
80
  service_url = get_service_url(service_name)
75
- user_id = generate_uuid_from_gcloud_user()
81
+ user_id = generate_user_id()
76
82
  session_id = str(uuid.uuid4())
77
83
 
78
- async def stream_response():
79
- generate = await generate_proxy_stream_async(
80
- send_to_qa_async,
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
- async for part in generate():
110
+ for part in generate():
105
111
  yield part
106
112
 
107
- print("Assistant: ", end='', flush=True)
108
- async for token in stream_response():
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": "assistant", "content": token})
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(service_url, args.user_input, args.chat_history)
133
+ headless_mode(args.service_name, args.user_input, args.chat_history)
126
134
  else:
127
- stream_chat_session(service_url)
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 the VAC service.')
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 = load_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 = load_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 = load_proxies()
162
+ proxies = clean_proxy_list()
147
163
  if not proxies:
148
164
  print("No proxies currently running.")
149
165
  else:
@@ -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
- vectorstore = pick_vectorstore(vectorstore, vector_name=vector_name, embeddings=embeddings)
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
- log.debug(f"Initiating Supabase store: {vector_name}")
27
- setup_supabase(vector_name)
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 = create_alloydb_table(vector_name, engine)
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
- log.info(f"{err} - Could not open table for {vector_name} - creating new table")
110
- init = f"Creating new table for {vector_name}"
111
- table = db.create_table(
112
- vector_name,
113
- data=[
114
- {
115
- "vector": embeddings.embed_query(init),
116
- "text": init,
117
- "id": "1",
118
- }
119
- ],
120
- mode="overwrite",
121
- )
122
-
123
- log.info(f"Inititaing LanceDB object for {vector_name} using {LANCEDB_BUCKET}")
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
- return logger
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
- # Setup logging and return the logger instance
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
- return hashed_id
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.1
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.1.tar.gz
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=JSzS_6HY6BIxy8bmVV2TDHXOjyfB1q5nI76OZXAtQDc,11372
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=1PENm1EV4JGwv4TafGkZVf51YwxqSYL_VSuKipgCjhM,8203
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=JLjYrVN2mGoWrGUM_o5N93um46gXpQa8LWdxjF2yN4Y,8554
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=2dhoVfTdtbw-Wz8_PdAnsMvlecY-aqOccOkWyFIwUSY,5136
36
- sunholo/cli/cli.py,sha256=titcQDSgV6ZBCaMBtwGKV0NpMZREb_-FcD5DxlEWAGY,1570
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=QAhylEmrdJ9P7uEJj116_MhPSxKzfOx3fhCBwx7n18A,6132
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=AxTg0QLR2E74FPbBrqB-ap8CTRK4gBOJnpqUk1CWSkY,3684
46
- sunholo/components/vectorstore.py,sha256=RB_Dgc9234G_TE3w3abCfBw1pqm2br2RrLP0UqshkvA,5172
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=WIcJstLkQsM8iMCl_GBpgYdrSWIcnnCJ_uOFHIQX1g8,8500
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=LjO6Gsg7Bk7Jxj3dgo4VyV5_6xYRrnzPF-vb7MfiR4I,1241
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.1.dist-info/LICENSE.txt,sha256=SdE3QjnD3GEmqqg9EX3TM9f7WmtOzqS1KJve8rhbYmU,11345
99
- sunholo-0.60.1.dist-info/METADATA,sha256=Ss12ALa6XeCzAyjVSWf9JTxTmwqFVH-GFEyp_Vs7ig4,7903
100
- sunholo-0.60.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
101
- sunholo-0.60.1.dist-info/entry_points.txt,sha256=bZuN5AIHingMPt4Ro1b_T-FnQvZ3teBes-3OyO0asl4,49
102
- sunholo-0.60.1.dist-info/top_level.txt,sha256=wt5tadn5--5JrZsjJz2LceoUvcrIvxjHJe-RxuudxAk,8
103
- sunholo-0.60.1.dist-info/RECORD,,
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,,