sunholo 0.71.14__tar.gz → 0.71.16__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.14 → sunholo-0.71.16}/PKG-INFO +2 -2
  2. {sunholo-0.71.14 → sunholo-0.71.16}/setup.py +1 -1
  3. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/flask/qna_routes.py +1 -2
  4. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/gcs/add_file.py +45 -17
  5. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/vertex/__init__.py +1 -0
  6. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/vertex/extensions_class.py +74 -12
  7. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo.egg-info/PKG-INFO +2 -2
  8. {sunholo-0.71.14 → sunholo-0.71.16}/LICENSE.txt +0 -0
  9. {sunholo-0.71.14 → sunholo-0.71.16}/MANIFEST.in +0 -0
  10. {sunholo-0.71.14 → sunholo-0.71.16}/README.md +0 -0
  11. {sunholo-0.71.14 → sunholo-0.71.16}/setup.cfg +0 -0
  12. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/__init__.py +0 -0
  13. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/__init__.py +0 -0
  14. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/chat_history.py +0 -0
  15. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/dispatch_to_qa.py +0 -0
  16. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/fastapi/__init__.py +0 -0
  17. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/fastapi/base.py +0 -0
  18. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/fastapi/qna_routes.py +0 -0
  19. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/flask/__init__.py +0 -0
  20. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/flask/base.py +0 -0
  21. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/flask/vac_routes.py +0 -0
  22. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/langserve.py +0 -0
  23. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/pubsub.py +0 -0
  24. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/route.py +0 -0
  25. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/special_commands.py +0 -0
  26. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/agents/swagger.py +0 -0
  27. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/archive/__init__.py +0 -0
  28. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/archive/archive.py +0 -0
  29. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/auth/__init__.py +0 -0
  30. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/auth/run.py +0 -0
  31. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/bots/__init__.py +0 -0
  32. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/bots/discord.py +0 -0
  33. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/bots/github_webhook.py +0 -0
  34. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/bots/webapp.py +0 -0
  35. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/__init__.py +0 -0
  36. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/data_to_embed_pubsub.py +0 -0
  37. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/doc_handling.py +0 -0
  38. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/images.py +0 -0
  39. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/loaders.py +0 -0
  40. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/message_data.py +0 -0
  41. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/pdfs.py +0 -0
  42. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/publish.py +0 -0
  43. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/chunker/splitter.py +0 -0
  44. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/__init__.py +0 -0
  45. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/chat_vac.py +0 -0
  46. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/cli.py +0 -0
  47. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/cli_init.py +0 -0
  48. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/configs.py +0 -0
  49. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/deploy.py +0 -0
  50. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/embedder.py +0 -0
  51. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/merge_texts.py +0 -0
  52. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/run_proxy.py +0 -0
  53. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/sun_rich.py +0 -0
  54. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/cli/swagger.py +0 -0
  55. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/components/__init__.py +0 -0
  56. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/components/llm.py +0 -0
  57. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/components/retriever.py +0 -0
  58. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/components/vectorstore.py +0 -0
  59. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/__init__.py +0 -0
  60. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/alloydb.py +0 -0
  61. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/alloydb_client.py +0 -0
  62. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/database.py +0 -0
  63. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/lancedb.py +0 -0
  64. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/sql/sb/create_function.sql +0 -0
  65. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/sql/sb/create_function_time.sql +0 -0
  66. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/sql/sb/create_table.sql +0 -0
  67. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/sql/sb/delete_source_row.sql +0 -0
  68. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/sql/sb/return_sources.sql +0 -0
  69. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/sql/sb/setup.sql +0 -0
  70. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/static_dbs.py +0 -0
  71. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/database/uuid.py +0 -0
  72. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/discovery_engine/__init__.py +0 -0
  73. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/discovery_engine/chunker_handler.py +0 -0
  74. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/discovery_engine/create_new.py +0 -0
  75. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/discovery_engine/discovery_engine_client.py +0 -0
  76. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/embedder/__init__.py +0 -0
  77. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/embedder/embed_chunk.py +0 -0
  78. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/gcs/__init__.py +0 -0
  79. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/gcs/download_url.py +0 -0
  80. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/gcs/metadata.py +0 -0
  81. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/langfuse/__init__.py +0 -0
  82. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/langfuse/callback.py +0 -0
  83. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/langfuse/prompts.py +0 -0
  84. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/llamaindex/__init__.py +0 -0
  85. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/llamaindex/generate.py +0 -0
  86. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/llamaindex/get_files.py +0 -0
  87. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/llamaindex/import_files.py +0 -0
  88. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/logging.py +0 -0
  89. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/lookup/__init__.py +0 -0
  90. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/lookup/model_lookup.yaml +0 -0
  91. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/patches/__init__.py +0 -0
  92. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/patches/langchain/__init__.py +0 -0
  93. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/patches/langchain/lancedb.py +0 -0
  94. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/patches/langchain/vertexai.py +0 -0
  95. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/pubsub/__init__.py +0 -0
  96. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/pubsub/process_pubsub.py +0 -0
  97. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/pubsub/pubsub_manager.py +0 -0
  98. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/qna/__init__.py +0 -0
  99. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/qna/parsers.py +0 -0
  100. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/qna/retry.py +0 -0
  101. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/streaming/__init__.py +0 -0
  102. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/streaming/content_buffer.py +0 -0
  103. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/streaming/langserve.py +0 -0
  104. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/streaming/stream_lookup.py +0 -0
  105. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/streaming/streaming.py +0 -0
  106. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/summarise/__init__.py +0 -0
  107. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/summarise/summarise.py +0 -0
  108. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/tools/__init__.py +0 -0
  109. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/tools/web_browser.py +0 -0
  110. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/__init__.py +0 -0
  111. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/api_key.py +0 -0
  112. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/big_context.py +0 -0
  113. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/config.py +0 -0
  114. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/config_schema.py +0 -0
  115. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/gcp.py +0 -0
  116. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/gcp_project.py +0 -0
  117. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/parsers.py +0 -0
  118. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/timedelta.py +0 -0
  119. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/user_ids.py +0 -0
  120. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/utils/version.py +0 -0
  121. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/vertex/extensions.py +0 -0
  122. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/vertex/init.py +0 -0
  123. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/vertex/memory_tools.py +0 -0
  124. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo/vertex/safety.py +0 -0
  125. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo.egg-info/SOURCES.txt +0 -0
  126. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo.egg-info/dependency_links.txt +0 -0
  127. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo.egg-info/entry_points.txt +0 -0
  128. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo.egg-info/requires.txt +0 -0
  129. {sunholo-0.71.14 → sunholo-0.71.16}/sunholo.egg-info/top_level.txt +0 -0
  130. {sunholo-0.71.14 → sunholo-0.71.16}/tests/test_chat_history.py +0 -0
  131. {sunholo-0.71.14 → sunholo-0.71.16}/tests/test_chunker.py +0 -0
  132. {sunholo-0.71.14 → sunholo-0.71.16}/tests/test_config.py +0 -0
  133. {sunholo-0.71.14 → sunholo-0.71.16}/tests/test_dispatch_to_qa.py +0 -0
  134. {sunholo-0.71.14 → sunholo-0.71.16}/tests/test_swagger.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.71.14
3
+ Version: 0.71.16
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.14.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.71.16.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.14'
4
+ version = '0.71.16'
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
 
@@ -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
+
76
+ bucket_name = bucket_name if bucket_name else os.getenv('GCS_BUCKET', None)
77
+ if bucket_name is None:
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:
@@ -56,17 +94,7 @@ def add_file_to_gcs(filename: str, vector_name:str, bucket_name: str=None, metad
56
94
  return None
57
95
 
58
96
  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://")
97
+ bucket_name = resolve_bucket(vector_name)
70
98
 
71
99
  bucket = storage_client.get_bucket(bucket_name)
72
100
  now = datetime.datetime.now()
@@ -1,3 +1,4 @@
1
1
  from .init import init_vertex, init_genai
2
2
  from .memory_tools import get_vertex_memories, print_grounding_response, get_google_search_grounding
3
3
  from .safety import vertex_safety, genai_safety
4
+ from .extensions_class import VertexAIExtensions
@@ -1,4 +1,8 @@
1
- from vertexai.preview import extensions
1
+ try:
2
+ from vertexai.preview import extensions
3
+ except ImportError:
4
+ extensions = None
5
+
2
6
  from .init import init_vertex
3
7
  from ..logging import log
4
8
  from ..utils.gcp_project import get_gcp_project
@@ -9,6 +13,9 @@ from io import StringIO
9
13
 
10
14
  class VertexAIExtensions:
11
15
  def __init__(self):
16
+ if extensions is None:
17
+ raise ImportError("VertexAIExtensions needs vertexai.previewextensions to be installed. Install via `pip install sunholo[gcp]`")
18
+
12
19
  self.CODE_INTERPRETER_WRITTEN_FILES = []
13
20
  self.css_styles = """
14
21
  <style>
@@ -21,6 +28,20 @@ class VertexAIExtensions:
21
28
  self.IMAGE_FILE_EXTENSIONS = set(["jpg", "jpeg", "png"])
22
29
  self.location = "us-central1"
23
30
 
31
+ def list_extensions(self):
32
+ the_list = extensions.Extension.list()
33
+
34
+ extensions_list = []
35
+ for ext in the_list:
36
+ extensions_list.append({
37
+ "resource_name": getattr(ext, 'resource_name', ''),
38
+ "display_name": getattr(ext, 'display_name', 'N/A'),
39
+ "description": getattr(ext, 'description', 'N/A')
40
+ })
41
+
42
+ return extensions_list
43
+
44
+
24
45
  def get_extension_import_config(self, display_name: str, description: str,
25
46
  api_spec_gcs: dict, service_account_name: dict, tool_use_examples: list):
26
47
  tool_use_examples = [
@@ -115,11 +136,35 @@ class VertexAIExtensions:
115
136
 
116
137
  return response
117
138
 
118
- 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):
119
144
  if filenames and gcs_files:
120
145
  raise ValueError("Can't specify both filenames and gcs_files")
146
+
147
+ listed_extensions = self.list_extensions()
148
+ code_interpreter_exists = False
149
+ for ext in listed_extensions:
150
+ if ext.get('display_name') == 'Code Interpreter':
151
+ code_interpreter_exists = True
152
+ extension_code_interpreter = extensions.Extension(ext['resource_name'])
153
+ break
154
+
155
+ if not code_interpreter_exists:
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
+ extension_code_interpreter = extensions.Extension.from_hub("code_interpreter", runtime_config=runtime_config)
121
164
 
122
- extension_code_interpreter = extensions.Extension.from_hub("code_interpreter")
165
+ # This field is only applicable when `file_output_gcs_bucket` is specified in `Extension.CodeInterpreterRuntimeConfig`.
166
+
167
+ operation_params = {"query": query}
123
168
 
124
169
  file_arr = None
125
170
  if filenames:
@@ -130,20 +175,37 @@ class VertexAIExtensions:
130
175
  }
131
176
  for filename in filenames
132
177
  ]
133
-
178
+ operation_params["files"] = file_arr
179
+
180
+ if gcs_files:
181
+ operation_params["file_gcs_uris"] = gcs_files
182
+ log.info("Executing code interpreter")
134
183
  response = extension_code_interpreter.execute(
135
184
  operation_id="generate_and_execute",
136
- operation_params={
137
- "query": query,
138
- "files": file_arr,
139
- "file_gcs_uris": gcs_files
140
- })
185
+ operation_params=operation_params)
141
186
 
142
187
  self.CODE_INTERPRETER_WRITTEN_FILES.extend(
143
188
  [item['name'] for item in response['output_files']])
144
189
 
145
190
  if response.get('execution_error'):
191
+ #TODO: setup iteration many times with a timeout
146
192
  log.error(f"Code Execution Response failed with: {response.get('execution_error')} - maybe retry?")
193
+ new_query = f"""
194
+ <original_query>{query}</original_query>
195
+ <original_output>{response.get('generated_code')}</original_output>
196
+ The code above failed with this error:
197
+ <code_error>{response.get('execution_error')}</code_error>
198
+ Please try again again to satisfy the original query.
199
+ """
200
+ operation_params = {"query": new_query}
201
+ response = extension_code_interpreter.execute(
202
+ operation_id="generate_and_execute",
203
+ operation_params=operation_params)
204
+
205
+ self.CODE_INTERPRETER_WRITTEN_FILES.extend([item['name'] for item in response['output_files']])
206
+ if response.get('execution_error'):
207
+ log.error(f"Code Execution Response failed twice: {response.get('execution_error')}")
208
+
147
209
 
148
210
  return response
149
211
 
@@ -195,7 +257,7 @@ class VertexAIExtensions:
195
257
  buffer_html = [details_tml.format(**_file) for _file in file_list]
196
258
  return "".join(buffer_html)
197
259
 
198
- def process_response(self, response: dict, save_files_locally=None) -> str:
260
+ def process_response(self, response: dict, save_file_name=None) -> str:
199
261
  result_template = """
200
262
  <details open>
201
263
  <summary class='main_summary'>{summary}:</summary>
@@ -234,8 +296,8 @@ class VertexAIExtensions:
234
296
  {result}
235
297
  </div>
236
298
  """
237
- if save_files_locally:
238
- with open('code_execution_results.html', 'w') as file:
299
+ if save_file_name:
300
+ with open(save_file_name or 'code_execution_results.html', 'w') as file:
239
301
  file.write(html_content)
240
302
 
241
303
  return html_content
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.71.14
3
+ Version: 0.71.16
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.14.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.71.16.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