sunholo 0.79.1__py3-none-any.whl → 0.79.3__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.
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  from ..custom_logging import log
15
15
  from .vectorstore import pick_vectorstore
16
- from ..utils import load_config_key, ConfigManager
16
+ from ..utils import ConfigManager
17
17
  from .llm import get_embeddings
18
18
  from ..utils.gcp_project import get_gcp_project
19
19
 
@@ -1,3 +1,6 @@
1
+ import os
2
+ import tempfile
3
+
1
4
  try:
2
5
  from vertexai.preview import rag
3
6
  except ImportError:
@@ -46,6 +49,60 @@ class LlamaIndexVertexCorpusManager:
46
49
  self.location = self.config.vacConfig('location') or location
47
50
 
48
51
  init_vertex(location=self.location, project_id=self.project_id)
52
+
53
+ def upload_text(self, text: str, corpus_display_name: str, description: str = None):
54
+ """
55
+ Uploads a text string to a specified corpus by saving it to a temporary file first.
56
+
57
+ Args:
58
+ text (str): The text content to upload.
59
+ corpus_display_name (str): The display name of the corpus.
60
+ description (str, optional): Description of the text upload.
61
+
62
+ Returns:
63
+ The uploaded file object.
64
+ """
65
+ # Create a temporary file and write the text to it
66
+ with tempfile.NamedTemporaryFile(delete=False, suffix='.txt') as temp_file:
67
+ temp_file.write(text.encode('utf-8'))
68
+ temp_filename = temp_file.name
69
+
70
+ try:
71
+ # Upload the temporary file
72
+ uploaded_file = self.upload_file(temp_filename, corpus_display_name, description or text[:50])
73
+ finally:
74
+ # Clean up the temporary file
75
+ os.remove(temp_filename)
76
+
77
+ return uploaded_file
78
+
79
+ def upload_file(self, filename:str, corpus_display_name:str, description:str=None):
80
+ corpus = self.find_corpus_from_list(corpus_display_name)
81
+
82
+ rag_file = rag.upload_file(
83
+ corpus_name=corpus.name,
84
+ path=filename,
85
+ display_name=filename,
86
+ description=description or f"Upload for {filename}",
87
+ )
88
+ log.info("Uploaded file: {rag_file}")
89
+
90
+ return rag_file
91
+
92
+ def import_files(self, file_imports:list[str], corpus_display_name:str):
93
+ corpus = self.find_corpus_from_list(corpus_display_name)
94
+
95
+ log.info(f"Importing files: {file_imports} into {corpus.name}")
96
+ response = rag.import_files(
97
+ corpus_name=corpus.name,
98
+ paths=file_imports,
99
+ chunk_size=512, # Optional
100
+ chunk_overlap=100, # Optional
101
+ max_embedding_requests_per_min=900, # Optional
102
+ )
103
+ log.info(f"Imported files: {response}")
104
+
105
+ return response
49
106
 
50
107
  def list_corpora(self):
51
108
  """
@@ -83,7 +140,6 @@ class LlamaIndexVertexCorpusManager:
83
140
  """
84
141
  corp = self.find_corpus_from_list(display_name)
85
142
  if corp:
86
-
87
143
  return corp
88
144
 
89
145
  corpus = rag.create_corpus(display_name=display_name, description=description or f"Corpus for {display_name}")
@@ -130,7 +186,6 @@ class LlamaIndexVertexCorpusManager:
130
186
  return rag.get_corpus(name=corp.name)
131
187
 
132
188
  def llamaindex_command(args):
133
-
134
189
  if console is None:
135
190
  raise ImportError("Need cli tools to use `sunholo llamaindex` - install via `pip install sunholo[cli]`")
136
191
 
@@ -148,8 +203,14 @@ def llamaindex_command(args):
148
203
  corpus = manager.find_corpus_from_list(display_name=args.display_name)
149
204
  console.print(corpus)
150
205
  elif args.action == "list":
151
- corpura = manager.list_corpora()
152
- console.print(corpura)
206
+ corpora = manager.list_corpora()
207
+ console.print(corpora)
208
+ elif args.action == "import_files":
209
+ manager.import_files(file_imports=args.file_imports, corpus_display_name=args.display_name)
210
+ elif args.action == "upload_file":
211
+ manager.upload_file(filename=args.filename, corpus_display_name=args.display_name, description=args.description)
212
+ elif args.action == "upload_text":
213
+ manager.upload_text(text=args.text, corpus_display_name=args.display_name, description=args.description)
153
214
  else:
154
215
  console.print(f"Unknown action: {args.action}")
155
216
 
@@ -186,7 +247,28 @@ def setup_llamaindex_subparser(subparsers):
186
247
  find_parser.add_argument('vac', nargs='?', default="global", help='The VAC config to set it up for')
187
248
 
188
249
  # LlamaIndex list command
189
- find_parser = llamaindex_subparsers.add_parser('list', help='List all corpus')
190
- find_parser.add_argument('vac', nargs='?', default="global", help='The VAC config to set it up for')
250
+ list_parser = llamaindex_subparsers.add_parser('list', help='List all corpus')
251
+ list_parser.add_argument('vac', nargs='?', default="global", help='The VAC config to set it up for')
252
+
253
+ # LlamaIndex import_files command
254
+ import_files_parser = llamaindex_subparsers.add_parser('import_files', help='Import files from URLs to a corpus')
255
+ import_files_parser.add_argument('display_name', help='The name of the corpus')
256
+ import_files_parser.add_argument('vac', nargs='?', default="global", help='The VAC config to set it up for')
257
+ import_files_parser.add_argument('file_imports', nargs='+', help='The list of file URLs to import')
258
+
259
+ # LlamaIndex upload_file command
260
+ upload_file_parser = llamaindex_subparsers.add_parser('upload_file', help='Upload a local file to a corpus')
261
+ upload_file_parser.add_argument('display_name', help='The name of the corpus')
262
+ upload_file_parser.add_argument('vac', nargs='?', default="global", help='The VAC config to set it up for')
263
+ upload_file_parser.add_argument('filename', help='The local file path to upload')
264
+ upload_file_parser.add_argument('--description', help='Description of the file upload', default=None)
265
+
266
+ # LlamaIndex upload_text command
267
+ upload_text_parser = llamaindex_subparsers.add_parser('upload_text', help='Upload text to a corpus')
268
+ upload_text_parser.add_argument('display_name', help='The name of the corpus')
269
+ upload_text_parser.add_argument('vac', nargs='?', default="global", help='The VAC config to set it up for')
270
+ upload_text_parser.add_argument('text', help='The text content to upload')
271
+ upload_text_parser.add_argument('--description', help='Description of the text upload', default=None)
191
272
 
192
273
  llamaindex_parser.set_defaults(func=llamaindex_command)
274
+
@@ -6,7 +6,7 @@ from collections import defaultdict
6
6
  from .timedelta import format_timedelta
7
7
 
8
8
  class ConfigManager:
9
- def __init__(self, vector_name: str):
9
+ def __init__(self, vector_name: str, validate:bool=True):
10
10
  """
11
11
  Initialize the ConfigManager with a vector name.
12
12
  Requires a local config/ folder holding your configuration files or the env var VAC_CONFIG_FOLDER to be set.
@@ -15,6 +15,7 @@ class ConfigManager:
15
15
 
16
16
  Args:
17
17
  vector_name (str): The name of the vector in the configuration files.
18
+ validate (bool): Whether to validate the configurations
18
19
 
19
20
  Example:
20
21
  ```python
@@ -38,7 +39,7 @@ class ConfigManager:
38
39
  self.configs_by_kind = self.load_all_configs()
39
40
 
40
41
  test_agent = self.vacConfig("agent")
41
- if not test_agent and self.vector_name != "global":
42
+ if not test_agent and self.vector_name != "global" and validate:
42
43
  print(f"WARNING: No vacConfig.agent found for {self.vector_name} - are you in right folder? {local_config_folder=} {self.config_folder=}")
43
44
 
44
45
  def load_all_configs(self):
@@ -12,7 +12,7 @@ from ..discovery_engine.discovery_engine_client import DiscoveryEngineClient
12
12
  from ..utils.gcp_project import get_gcp_project
13
13
  from ..utils import ConfigManager
14
14
 
15
- def get_vertex_memories(vector_name:str=None, config:ConfigManager=None):
15
+ def get_vertex_memories(config:ConfigManager):
16
16
  """
17
17
  Retrieves a LlamaIndex corpus from Vertex AI based on the provided Google Cloud configuration.
18
18
 
@@ -40,10 +40,6 @@ def get_vertex_memories(vector_name:str=None, config:ConfigManager=None):
40
40
  print("Error fetching corpus:", str(e))
41
41
  ```
42
42
  """
43
- if config is None:
44
- if vector_name is None:
45
- raise ValueError("config or vector_name are required")
46
- config = ConfigManager(vector_name)
47
43
 
48
44
  gcp_config = config.vacConfig("gcp_config")
49
45
 
@@ -52,7 +48,7 @@ def get_vertex_memories(vector_name:str=None, config:ConfigManager=None):
52
48
 
53
49
  global_location = gcp_config.get('location')
54
50
 
55
- memories = load_memories(vector_name)
51
+ memories = load_memories(config=config)
56
52
  tools = []
57
53
 
58
54
  if not memories:
@@ -76,9 +72,9 @@ def get_vertex_memories(vector_name:str=None, config:ConfigManager=None):
76
72
  rag_id=rag_id
77
73
  )
78
74
  else:
79
- log.info(f"Using display_name {vector_name} to derive rag_id")
75
+ log.info(f"Using display_name {config.vector_name} to derive rag_id")
80
76
  manager = LlamaIndexVertexCorpusManager(project_id=project_id, location=location)
81
- corpus = manager.find_corpus_from_list(vector_name)
77
+ corpus = manager.find_corpus_from_list(config.vector_name)
82
78
 
83
79
  try:
84
80
  corpus_tool = Tool.from_retrieval(
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.79.1
3
+ Version: 0.79.3
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.79.1.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.79.3.tar.gz
7
7
  Author: Holosun ApS
8
8
  Author-email: multivac@sunholo.com
9
9
  License: Apache License, Version 2.0
@@ -55,7 +55,7 @@ sunholo/cli/swagger.py,sha256=absYKAU-7Yd2eiVNUY-g_WLl2zJfeRUNdWQ0oH8M_HM,1564
55
55
  sunholo/cli/vertex.py,sha256=8130YCarxHL1UC3aqblNmUwGZTXbkdL4Y_FOnZJsWiI,2056
56
56
  sunholo/components/__init__.py,sha256=IDoylb74zFKo6NIS3RQqUl0PDFBGVxM1dfUmO7OJ44U,176
57
57
  sunholo/components/llm.py,sha256=5wRVf7lIb7q1vRADNcdQp26L9l4vGHFIvjtUDurZN_s,11488
58
- sunholo/components/retriever.py,sha256=vT5ouRUDcpdL4PMZVK57SYm31wZREbMsXkgCq8PnCUo,6922
58
+ sunholo/components/retriever.py,sha256=KK8Df3NH8jNpEymPBfR2913rrQZN-PRMUGedtYNIV6k,6905
59
59
  sunholo/components/vectorstore.py,sha256=xKk7micTRwZckaI7U6PxvFz_ZSjCH48xPTDYiDcv2tc,5913
60
60
  sunholo/database/__init__.py,sha256=Zz0Shcq-CtStf9rJGIYB_Ybzb8rY_Q9mfSj-nviM490,241
61
61
  sunholo/database/alloydb.py,sha256=c1PEmK9fJCxYaVmKv4emvOoXrajV7KqaVK5mqpeksvM,11527
@@ -90,7 +90,7 @@ sunholo/langfuse/prompts.py,sha256=27BsVfihM6-h1jscbkGSO4HsATl-d4ZN6tcNCVztWoY,1
90
90
  sunholo/llamaindex/__init__.py,sha256=DlY_cHWCsVEV1C5WBgDdHRgOMlJc8pDoCRukUJ8PT9w,88
91
91
  sunholo/llamaindex/get_files.py,sha256=6rhXCDqQ_lrIapISQ_OYQDjiSATXvS_9m3qq53-oIl0,781
92
92
  sunholo/llamaindex/import_files.py,sha256=Bnic5wz8c61af9Kwq8KSrNBbc4imYnzMtBCb2jzSImI,6224
93
- sunholo/llamaindex/llamaindex_class.py,sha256=KAD9Unby2INIWVfxarthA4F5P6SiJC2fnAj3Cu1pEhw,7062
93
+ sunholo/llamaindex/llamaindex_class.py,sha256=45N_xU0gDdgUPNv5m36DopRmG9JHFErwmgssKZ3wOqA,11058
94
94
  sunholo/lookup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
95
  sunholo/lookup/model_lookup.yaml,sha256=O7o-jP53MLA06C8pI-ILwERShO-xf6z_258wtpZBv6A,739
96
96
  sunholo/patches/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -116,7 +116,7 @@ sunholo/utils/__init__.py,sha256=Hv02T5L2zYWvCso5hzzwm8FQogwBq0OgtUbN_7Quzqc,89
116
116
  sunholo/utils/api_key.py,sha256=Ct4bIAQZxzPEw14hP586LpVxBAVi_W9Serpy0BK-7KI,244
117
117
  sunholo/utils/big_context.py,sha256=gJIP7_ZL-YSLhOMq8jmFTMqH1wq8eB1NK7oKPeZAq2s,5578
118
118
  sunholo/utils/config.py,sha256=aG29MXcL5qzQMtCMqcdy-2ysDCYf9Zn_ZLk5NNOQNSE,8982
119
- sunholo/utils/config_class.py,sha256=BewBxf59vSKJs4jcYvuLi6PW9M6so8w3qz9HfNFIu0M,8862
119
+ sunholo/utils/config_class.py,sha256=DEY2w7ks5fXmtJ4SwqELhUF4NJFVOuRwxeVFZJlYPf0,8963
120
120
  sunholo/utils/config_schema.py,sha256=Wv-ncitzljOhgbDaq9qnFqH5LCuxNv59dTGDWgd1qdk,4189
121
121
  sunholo/utils/gcp.py,sha256=uueODEpA-P6O15-t0hmcGC9dONLO_hLfzSsSoQnkUss,4854
122
122
  sunholo/utils/gcp_project.py,sha256=0ozs6tzI4qEvEeXb8MxLnCdEVoWKxlM6OH05htj7_tc,1325
@@ -129,12 +129,12 @@ sunholo/vertex/extensions_call.py,sha256=VIVBYpJPMaDzGWxuBU5RF9GfAbrvrskGWH4eXpJ
129
129
  sunholo/vertex/extensions_class.py,sha256=2QGW28lNjoMEnaoVb3QcqEDwphclIsZthnpLUi5_Ivo,21033
130
130
  sunholo/vertex/genai_functions.py,sha256=2z6grM9H0Z79Yzx88l8mE1wXck3bRa0TWvnqZZ9ifDc,2051
131
131
  sunholo/vertex/init.py,sha256=1OQwcPBKZYBTDPdyU7IM4X4OmiXLdsNV30C-fee2scQ,2875
132
- sunholo/vertex/memory_tools.py,sha256=7nDQXjrF9IpCPKbX3Focn4A2PdKb7JhfZDLv4le5kWc,7498
132
+ sunholo/vertex/memory_tools.py,sha256=6SM9ANuG2OcgFarJNZxAXobWpWbdz0DNZ6ooMsAGfzA,7321
133
133
  sunholo/vertex/safety.py,sha256=S9PgQT1O_BQAkcqauWncRJaydiP8Q_Jzmu9gxYfy1VA,2482
134
134
  sunholo/vertex/type_dict_to_json.py,sha256=uTzL4o9tJRao4u-gJOFcACgWGkBOtqACmb6ihvCErL8,4694
135
- sunholo-0.79.1.dist-info/LICENSE.txt,sha256=SdE3QjnD3GEmqqg9EX3TM9f7WmtOzqS1KJve8rhbYmU,11345
136
- sunholo-0.79.1.dist-info/METADATA,sha256=lNLvJFenzRDXsw-prEyzwa6NY2jSvWpDyDZ-t-pRCYo,7348
137
- sunholo-0.79.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
138
- sunholo-0.79.1.dist-info/entry_points.txt,sha256=bZuN5AIHingMPt4Ro1b_T-FnQvZ3teBes-3OyO0asl4,49
139
- sunholo-0.79.1.dist-info/top_level.txt,sha256=wt5tadn5--5JrZsjJz2LceoUvcrIvxjHJe-RxuudxAk,8
140
- sunholo-0.79.1.dist-info/RECORD,,
135
+ sunholo-0.79.3.dist-info/LICENSE.txt,sha256=SdE3QjnD3GEmqqg9EX3TM9f7WmtOzqS1KJve8rhbYmU,11345
136
+ sunholo-0.79.3.dist-info/METADATA,sha256=qN4H8g0Xe_6N39qmwrYvI25G2aYZA3x-N218wLL-yjE,7348
137
+ sunholo-0.79.3.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
138
+ sunholo-0.79.3.dist-info/entry_points.txt,sha256=bZuN5AIHingMPt4Ro1b_T-FnQvZ3teBes-3OyO0asl4,49
139
+ sunholo-0.79.3.dist-info/top_level.txt,sha256=wt5tadn5--5JrZsjJz2LceoUvcrIvxjHJe-RxuudxAk,8
140
+ sunholo-0.79.3.dist-info/RECORD,,