sunholo 0.71.15__tar.gz → 0.71.17__tar.gz

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.
Files changed (134) hide show
  1. {sunholo-0.71.15 → sunholo-0.71.17}/PKG-INFO +2 -2
  2. {sunholo-0.71.15 → sunholo-0.71.17}/setup.py +1 -1
  3. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/flask/qna_routes.py +1 -2
  4. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/chat_vac.py +33 -2
  5. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/gcs/add_file.py +46 -18
  6. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/vertex/extensions_class.py +36 -3
  7. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo.egg-info/PKG-INFO +2 -2
  8. {sunholo-0.71.15 → sunholo-0.71.17}/LICENSE.txt +0 -0
  9. {sunholo-0.71.15 → sunholo-0.71.17}/MANIFEST.in +0 -0
  10. {sunholo-0.71.15 → sunholo-0.71.17}/README.md +0 -0
  11. {sunholo-0.71.15 → sunholo-0.71.17}/setup.cfg +0 -0
  12. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/__init__.py +0 -0
  13. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/__init__.py +0 -0
  14. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/chat_history.py +0 -0
  15. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/dispatch_to_qa.py +0 -0
  16. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/fastapi/__init__.py +0 -0
  17. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/fastapi/base.py +0 -0
  18. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/fastapi/qna_routes.py +0 -0
  19. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/flask/__init__.py +0 -0
  20. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/flask/base.py +0 -0
  21. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/flask/vac_routes.py +0 -0
  22. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/langserve.py +0 -0
  23. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/pubsub.py +0 -0
  24. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/route.py +0 -0
  25. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/special_commands.py +0 -0
  26. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/agents/swagger.py +0 -0
  27. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/archive/__init__.py +0 -0
  28. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/archive/archive.py +0 -0
  29. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/auth/__init__.py +0 -0
  30. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/auth/run.py +0 -0
  31. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/bots/__init__.py +0 -0
  32. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/bots/discord.py +0 -0
  33. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/bots/github_webhook.py +0 -0
  34. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/bots/webapp.py +0 -0
  35. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/__init__.py +0 -0
  36. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/data_to_embed_pubsub.py +0 -0
  37. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/doc_handling.py +0 -0
  38. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/images.py +0 -0
  39. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/loaders.py +0 -0
  40. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/message_data.py +0 -0
  41. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/pdfs.py +0 -0
  42. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/publish.py +0 -0
  43. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/chunker/splitter.py +0 -0
  44. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/__init__.py +0 -0
  45. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/cli.py +0 -0
  46. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/cli_init.py +0 -0
  47. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/configs.py +0 -0
  48. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/deploy.py +0 -0
  49. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/embedder.py +0 -0
  50. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/merge_texts.py +0 -0
  51. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/run_proxy.py +0 -0
  52. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/sun_rich.py +0 -0
  53. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/cli/swagger.py +0 -0
  54. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/components/__init__.py +0 -0
  55. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/components/llm.py +0 -0
  56. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/components/retriever.py +0 -0
  57. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/components/vectorstore.py +0 -0
  58. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/__init__.py +0 -0
  59. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/alloydb.py +0 -0
  60. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/alloydb_client.py +0 -0
  61. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/database.py +0 -0
  62. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/lancedb.py +0 -0
  63. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/sql/sb/create_function.sql +0 -0
  64. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/sql/sb/create_function_time.sql +0 -0
  65. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/sql/sb/create_table.sql +0 -0
  66. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/sql/sb/delete_source_row.sql +0 -0
  67. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/sql/sb/return_sources.sql +0 -0
  68. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/sql/sb/setup.sql +0 -0
  69. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/static_dbs.py +0 -0
  70. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/database/uuid.py +0 -0
  71. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/discovery_engine/__init__.py +0 -0
  72. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/discovery_engine/chunker_handler.py +0 -0
  73. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/discovery_engine/create_new.py +0 -0
  74. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/discovery_engine/discovery_engine_client.py +0 -0
  75. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/embedder/__init__.py +0 -0
  76. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/embedder/embed_chunk.py +0 -0
  77. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/gcs/__init__.py +0 -0
  78. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/gcs/download_url.py +0 -0
  79. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/gcs/metadata.py +0 -0
  80. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/langfuse/__init__.py +0 -0
  81. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/langfuse/callback.py +0 -0
  82. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/langfuse/prompts.py +0 -0
  83. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/llamaindex/__init__.py +0 -0
  84. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/llamaindex/generate.py +0 -0
  85. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/llamaindex/get_files.py +0 -0
  86. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/llamaindex/import_files.py +0 -0
  87. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/logging.py +0 -0
  88. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/lookup/__init__.py +0 -0
  89. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/lookup/model_lookup.yaml +0 -0
  90. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/patches/__init__.py +0 -0
  91. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/patches/langchain/__init__.py +0 -0
  92. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/patches/langchain/lancedb.py +0 -0
  93. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/patches/langchain/vertexai.py +0 -0
  94. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/pubsub/__init__.py +0 -0
  95. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/pubsub/process_pubsub.py +0 -0
  96. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/pubsub/pubsub_manager.py +0 -0
  97. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/qna/__init__.py +0 -0
  98. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/qna/parsers.py +0 -0
  99. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/qna/retry.py +0 -0
  100. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/streaming/__init__.py +0 -0
  101. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/streaming/content_buffer.py +0 -0
  102. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/streaming/langserve.py +0 -0
  103. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/streaming/stream_lookup.py +0 -0
  104. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/streaming/streaming.py +0 -0
  105. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/summarise/__init__.py +0 -0
  106. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/summarise/summarise.py +0 -0
  107. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/tools/__init__.py +0 -0
  108. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/tools/web_browser.py +0 -0
  109. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/__init__.py +0 -0
  110. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/api_key.py +0 -0
  111. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/big_context.py +0 -0
  112. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/config.py +0 -0
  113. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/config_schema.py +0 -0
  114. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/gcp.py +0 -0
  115. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/gcp_project.py +0 -0
  116. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/parsers.py +0 -0
  117. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/timedelta.py +0 -0
  118. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/user_ids.py +0 -0
  119. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/utils/version.py +0 -0
  120. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/vertex/__init__.py +0 -0
  121. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/vertex/extensions.py +0 -0
  122. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/vertex/init.py +0 -0
  123. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/vertex/memory_tools.py +0 -0
  124. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo/vertex/safety.py +0 -0
  125. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo.egg-info/SOURCES.txt +0 -0
  126. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo.egg-info/dependency_links.txt +0 -0
  127. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo.egg-info/entry_points.txt +0 -0
  128. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo.egg-info/requires.txt +0 -0
  129. {sunholo-0.71.15 → sunholo-0.71.17}/sunholo.egg-info/top_level.txt +0 -0
  130. {sunholo-0.71.15 → sunholo-0.71.17}/tests/test_chat_history.py +0 -0
  131. {sunholo-0.71.15 → sunholo-0.71.17}/tests/test_chunker.py +0 -0
  132. {sunholo-0.71.15 → sunholo-0.71.17}/tests/test_config.py +0 -0
  133. {sunholo-0.71.15 → sunholo-0.71.17}/tests/test_dispatch_to_qa.py +0 -0
  134. {sunholo-0.71.15 → sunholo-0.71.17}/tests/test_swagger.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.71.15
3
+ Version: 0.71.17
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.71.15.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.71.17.tar.gz
7
7
  Author: Holosun ApS
8
8
  Author-email: multivac@sunholo.com
9
9
  License: Apache License, Version 2.0
@@ -1,7 +1,7 @@
1
1
  from setuptools import setup, find_packages
2
2
 
3
3
  # Define your base version
4
- version = '0.71.15'
4
+ version = '0.71.17'
5
5
 
6
6
  setup(
7
7
  name='sunholo',
@@ -15,7 +15,6 @@
15
15
 
16
16
  import json
17
17
  import traceback
18
- import datetime
19
18
  import uuid
20
19
 
21
20
  from ...agents import extract_chat_history, handle_special_commands
@@ -142,7 +141,7 @@ def register_qna_routes(app, stream_interpreter, vac_interpreter):
142
141
  name="start_streaming_chat",
143
142
  metadata=vac_config,
144
143
  input = all_input,
145
- completion_start_time=datetime.datetime.now(),
144
+ completion_start_time=datetime.now(),
146
145
  model=vac_config.get("model") or vac_config.get("llm")
147
146
  )
148
147
 
@@ -5,9 +5,11 @@ from ..utils.config import load_config_key
5
5
  from ..utils.api_key import has_multivac_api_key
6
6
  from ..logging import log
7
7
  from ..qna.parsers import parse_output
8
+ from ..gcs.add_file import add_file_to_gcs
8
9
  from .run_proxy import clean_proxy_list, start_proxy, stop_proxy
9
10
 
10
11
  import uuid
12
+ import os
11
13
  import sys
12
14
  import subprocess
13
15
  import json
@@ -44,6 +46,17 @@ def get_service_url(vac_name, project, region, no_config=False):
44
46
 
45
47
  return url
46
48
 
49
+ def handle_file_upload(file, vector_name):
50
+ if not Path(file).is_file():
51
+ return None
52
+
53
+ file_url = add_file_to_gcs(file,
54
+ vector_name=vector_name,
55
+ metadata={"type": "cli"},
56
+ bucket_filepath=f"{vector_name}/uploads/{os.path.basename(file)}")
57
+
58
+ return file_url
59
+
47
60
  def stream_chat_session(service_url, service_name, stream=True):
48
61
 
49
62
  user_id = generate_user_id()
@@ -62,7 +75,25 @@ def stream_chat_session(service_url, service_name, stream=True):
62
75
 
63
76
  if special_reply:
64
77
  console.print(f"[bold yellow]{service_name}:[/bold yellow] {special_reply}", end='\n')
65
- continue
78
+ continue
79
+
80
+ if user_input.lower().startswith("upload"):
81
+ file_path = user_input.split(" ", 1)[1] if " " in user_input else None
82
+ if not file_path:
83
+ console.print("[bold red]Please provide a valid file path.[/bold red]")
84
+ continue
85
+
86
+ try:
87
+ file_reply = handle_file_upload(file_path, vector_name=service_name)
88
+ if not file_reply:
89
+ console.print("[bold red]Invalid file upload[/bold red]")
90
+ continue
91
+
92
+ console.print(f"[bold yellow]{service_name}:[/bold yellow] Uploaded {file_path} to {file_reply}", end='\n')
93
+
94
+ except FileNotFoundError:
95
+ console.print("[bold red]File not found. Please check the path and try again.[/bold red]")
96
+ continue
66
97
 
67
98
  if not stream:
68
99
  vac_response = send_to_qa(user_input,
@@ -70,7 +101,7 @@ def stream_chat_session(service_url, service_name, stream=True):
70
101
  chat_history=chat_history,
71
102
  message_author=user_id,
72
103
  #TODO: populate these
73
- image_url=None,
104
+ image_url=file_reply,
74
105
  source_filters=None,
75
106
  search_kwargs=None,
76
107
  private_docs=None,
@@ -25,25 +25,63 @@ from ..logging import log
25
25
  from ..utils.config import load_config_key
26
26
 
27
27
 
28
- def handle_base64_image(base64_data, vector_name):
28
+ def handle_base64_image(base64_data: str, vector_name: str, extension: str):
29
+ """
30
+ Handle base64 image data, decode it, save it as a file, upload it to GCS, and return the image URI and MIME type.
31
+
32
+ Args:
33
+ base64_data (str): The base64 encoded image data.
34
+ vector_name (str): The vector name for the GCS path.
35
+ extension (str): The file extension of the image (e.g., ".jpg", ".png").
36
+
37
+ Returns:
38
+ Tuple[str, str]: The URI of the uploaded image and the MIME type.
39
+ """
29
40
  model = load_config_key("llm", vector_name, "vacConfig")
30
- if model.startswith("openai"): # pass it to gpt directly
31
- return base64_data, base64_data.split(",",1)
32
-
41
+ if model.startswith("openai"): # pass it to gpt directly
42
+ return base64_data, base64_data.split(",", 1)
43
+
33
44
  try:
34
45
  header, encoded = base64_data.split(",", 1)
35
46
  data = base64.b64decode(encoded)
36
47
 
37
- filename = f"{uuid.uuid4()}.jpg"
48
+ filename = f"{uuid.uuid4()}{extension}"
38
49
  with open(filename, "wb") as f:
39
50
  f.write(data)
40
51
 
41
52
  image_uri = add_file_to_gcs(filename, vector_name)
42
53
  os.remove(filename) # Clean up the saved file
43
- return image_uri, "image/jpeg"
54
+
55
+ # Determine MIME type based on extension
56
+ mime_type = {
57
+ ".jpg": "image/jpeg",
58
+ ".jpeg": "image/jpeg",
59
+ ".png": "image/png",
60
+ ".gif": "image/gif",
61
+ ".bmp": "image/bmp",
62
+ ".tiff": "image/tiff"
63
+ }.get(extension.lower(), "application/octet-stream") # Default MIME type if unknown
64
+
65
+ return image_uri, mime_type
44
66
  except Exception as e:
45
67
  raise Exception(f'Base64 image upload failed: {str(e)}')
46
68
 
69
+
70
+ def resolve_bucket(vector_name):
71
+ bucket_config = load_config_key("upload", vector_name, "vacConfig")
72
+ if bucket_config:
73
+ if bucket_config.get("buckets"):
74
+ bucket_name = bucket_config.get("buckets").get("all")
75
+ else:
76
+ bucket_name = os.getenv('GCS_BUCKET')
77
+ if not bucket_name:
78
+ raise ValueError("No bucket found to upload to: GCS_BUCKET returned None")
79
+
80
+ if bucket_name.startswith("gs://"):
81
+ bucket_name = bucket_name.removeprefix("gs://")
82
+
83
+ return bucket_name
84
+
47
85
  def add_file_to_gcs(filename: str, vector_name:str, bucket_name: str=None, metadata:dict=None, bucket_filepath:str=None):
48
86
 
49
87
  if not storage:
@@ -55,18 +93,8 @@ def add_file_to_gcs(filename: str, vector_name:str, bucket_name: str=None, metad
55
93
  log.error(f"Error creating storage client: {str(err)}")
56
94
  return None
57
95
 
58
- if bucket_name is None:
59
- bucket_config = load_config_key("upload", vector_name, "vacConfig")
60
- if bucket_config:
61
- if bucket_config.get("buckets"):
62
- bucket_name = bucket_config.get("buckets").get("all")
63
-
64
- bucket_name = bucket_name if bucket_name else os.getenv('GCS_BUCKET', None)
65
- if bucket_name is None:
66
- raise ValueError("No bucket found to upload to: GCS_BUCKET returned None")
67
-
68
- if bucket_name.startswith("gs://"):
69
- bucket_name = bucket_name.removeprefix("gs://")
96
+ if not bucket_name:
97
+ bucket_name = resolve_bucket(vector_name)
70
98
 
71
99
  bucket = storage_client.get_bucket(bucket_name)
72
100
  now = datetime.datetime.now()
@@ -136,7 +136,11 @@ class VertexAIExtensions:
136
136
 
137
137
  return response
138
138
 
139
- def execute_code_extension(self, query: str, filenames: list[str] = None, gcs_files: list[str] = None):
139
+ def execute_code_extension(self,
140
+ query: str,
141
+ filenames: list[str] = None,
142
+ gcs_files: list[str] = None,
143
+ bucket_name: str = None):
140
144
  if filenames and gcs_files:
141
145
  raise ValueError("Can't specify both filenames and gcs_files")
142
146
 
@@ -149,7 +153,19 @@ class VertexAIExtensions:
149
153
  break
150
154
 
151
155
  if not code_interpreter_exists:
152
- extension_code_interpreter = extensions.Extension.from_hub("code_interpreter")
156
+ if bucket_name:
157
+ runtime_config = {
158
+ "codeInterpreterRuntimeConfig": {
159
+ "fileInputGcsBucket": f"{bucket_name}/extensions/input/",
160
+ "fileOutputGcsBucket": f"{bucket_name}/extensions/output/",
161
+ }
162
+ }
163
+ else:
164
+ runtime_config = {}
165
+
166
+ extension_code_interpreter = extensions.Extension.from_hub("code_interpreter", runtime_config=runtime_config)
167
+
168
+ # This field is only applicable when `file_output_gcs_bucket` is specified in `Extension.CodeInterpreterRuntimeConfig`.
153
169
 
154
170
  operation_params = {"query": query}
155
171
 
@@ -166,7 +182,7 @@ class VertexAIExtensions:
166
182
 
167
183
  if gcs_files:
168
184
  operation_params["file_gcs_uris"] = gcs_files
169
-
185
+ log.info("Executing code interpreter")
170
186
  response = extension_code_interpreter.execute(
171
187
  operation_id="generate_and_execute",
172
188
  operation_params=operation_params)
@@ -175,7 +191,24 @@ class VertexAIExtensions:
175
191
  [item['name'] for item in response['output_files']])
176
192
 
177
193
  if response.get('execution_error'):
194
+ #TODO: setup iteration many times with a timeout
178
195
  log.error(f"Code Execution Response failed with: {response.get('execution_error')} - maybe retry?")
196
+ new_query = f"""
197
+ <original_query>{query}</original_query>
198
+ <original_output>{response.get('generated_code')}</original_output>
199
+ The code above failed with this error:
200
+ <code_error>{response.get('execution_error')}</code_error>
201
+ Please try again again to satisfy the original query.
202
+ """
203
+ operation_params = {"query": new_query}
204
+ response = extension_code_interpreter.execute(
205
+ operation_id="generate_and_execute",
206
+ operation_params=operation_params)
207
+
208
+ self.CODE_INTERPRETER_WRITTEN_FILES.extend([item['name'] for item in response['output_files']])
209
+ if response.get('execution_error'):
210
+ log.error(f"Code Execution Response failed twice: {response.get('execution_error')}")
211
+
179
212
 
180
213
  return response
181
214
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.71.15
3
+ Version: 0.71.17
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.71.15.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.71.17.tar.gz
7
7
  Author: Holosun ApS
8
8
  Author-email: multivac@sunholo.com
9
9
  License: Apache License, Version 2.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes