sunholo 0.64.4__tar.gz → 0.64.6__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 (120) hide show
  1. {sunholo-0.64.4 → sunholo-0.64.6}/PKG-INFO +2 -2
  2. {sunholo-0.64.4 → sunholo-0.64.6}/setup.py +1 -1
  3. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/flask/qna_routes.py +29 -7
  4. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/gcs/add_file.py +18 -0
  5. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/PKG-INFO +2 -2
  6. {sunholo-0.64.4 → sunholo-0.64.6}/LICENSE.txt +0 -0
  7. {sunholo-0.64.4 → sunholo-0.64.6}/MANIFEST.in +0 -0
  8. {sunholo-0.64.4 → sunholo-0.64.6}/README.md +0 -0
  9. {sunholo-0.64.4 → sunholo-0.64.6}/setup.cfg +0 -0
  10. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/__init__.py +0 -0
  11. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/__init__.py +0 -0
  12. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/chat_history.py +0 -0
  13. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/dispatch_to_qa.py +0 -0
  14. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/fastapi/__init__.py +0 -0
  15. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/fastapi/base.py +0 -0
  16. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/fastapi/qna_routes.py +0 -0
  17. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/flask/__init__.py +0 -0
  18. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/flask/base.py +0 -0
  19. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/langserve.py +0 -0
  20. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/pubsub.py +0 -0
  21. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/route.py +0 -0
  22. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/special_commands.py +0 -0
  23. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/archive/__init__.py +0 -0
  24. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/archive/archive.py +0 -0
  25. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/auth/__init__.py +0 -0
  26. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/auth/run.py +0 -0
  27. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/bots/__init__.py +0 -0
  28. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/bots/discord.py +0 -0
  29. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/bots/github_webhook.py +0 -0
  30. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/bots/webapp.py +0 -0
  31. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/__init__.py +0 -0
  32. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/data_to_embed_pubsub.py +0 -0
  33. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/doc_handling.py +0 -0
  34. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/images.py +0 -0
  35. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/loaders.py +0 -0
  36. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/message_data.py +0 -0
  37. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/pdfs.py +0 -0
  38. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/publish.py +0 -0
  39. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/splitter.py +0 -0
  40. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/__init__.py +0 -0
  41. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/chat_vac.py +0 -0
  42. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/cli.py +0 -0
  43. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/cli_init.py +0 -0
  44. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/configs.py +0 -0
  45. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/deploy.py +0 -0
  46. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/embedder.py +0 -0
  47. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/merge_texts.py +0 -0
  48. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/run_proxy.py +0 -0
  49. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/sun_rich.py +0 -0
  50. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/components/__init__.py +0 -0
  51. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/components/llm.py +0 -0
  52. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/components/retriever.py +0 -0
  53. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/components/vectorstore.py +0 -0
  54. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/__init__.py +0 -0
  55. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/alloydb.py +0 -0
  56. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/database.py +0 -0
  57. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/lancedb.py +0 -0
  58. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/create_function.sql +0 -0
  59. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/create_function_time.sql +0 -0
  60. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/create_table.sql +0 -0
  61. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/delete_source_row.sql +0 -0
  62. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/return_sources.sql +0 -0
  63. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/setup.sql +0 -0
  64. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/static_dbs.py +0 -0
  65. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/uuid.py +0 -0
  66. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/embedder/__init__.py +0 -0
  67. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/embedder/embed_chunk.py +0 -0
  68. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/gcs/__init__.py +0 -0
  69. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/gcs/download_url.py +0 -0
  70. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/gcs/metadata.py +0 -0
  71. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/langfuse/__init__.py +0 -0
  72. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/langfuse/callback.py +0 -0
  73. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/langfuse/prompts.py +0 -0
  74. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/llamaindex/__init__.py +0 -0
  75. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/llamaindex/generate.py +0 -0
  76. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/llamaindex/get_files.py +0 -0
  77. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/llamaindex/import_files.py +0 -0
  78. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/logging.py +0 -0
  79. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/lookup/__init__.py +0 -0
  80. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/lookup/model_lookup.yaml +0 -0
  81. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/patches/__init__.py +0 -0
  82. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/patches/langchain/__init__.py +0 -0
  83. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/patches/langchain/lancedb.py +0 -0
  84. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/patches/langchain/vertexai.py +0 -0
  85. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/pubsub/__init__.py +0 -0
  86. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/pubsub/process_pubsub.py +0 -0
  87. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/pubsub/pubsub_manager.py +0 -0
  88. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/qna/__init__.py +0 -0
  89. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/qna/parsers.py +0 -0
  90. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/qna/retry.py +0 -0
  91. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/__init__.py +0 -0
  92. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/content_buffer.py +0 -0
  93. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/langserve.py +0 -0
  94. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/stream_lookup.py +0 -0
  95. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/streaming.py +0 -0
  96. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/summarise/__init__.py +0 -0
  97. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/summarise/summarise.py +0 -0
  98. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/__init__.py +0 -0
  99. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/big_context.py +0 -0
  100. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/config.py +0 -0
  101. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/config_schema.py +0 -0
  102. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/gcp.py +0 -0
  103. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/gcp_project.py +0 -0
  104. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/parsers.py +0 -0
  105. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/timedelta.py +0 -0
  106. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/user_ids.py +0 -0
  107. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/version.py +0 -0
  108. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/vertex/__init__.py +0 -0
  109. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/vertex/init.py +0 -0
  110. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/vertex/memory_tools.py +0 -0
  111. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/vertex/safety.py +0 -0
  112. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/SOURCES.txt +0 -0
  113. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/dependency_links.txt +0 -0
  114. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/entry_points.txt +0 -0
  115. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/requires.txt +0 -0
  116. {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/top_level.txt +0 -0
  117. {sunholo-0.64.4 → sunholo-0.64.6}/tests/test_chat_history.py +0 -0
  118. {sunholo-0.64.4 → sunholo-0.64.6}/tests/test_chunker.py +0 -0
  119. {sunholo-0.64.4 → sunholo-0.64.6}/tests/test_config.py +0 -0
  120. {sunholo-0.64.4 → sunholo-0.64.6}/tests/test_dispatch_to_qa.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.64.4
3
+ Version: 0.64.6
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.64.4.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.64.6.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.64.4'
4
+ version = '0.64.6'
5
5
 
6
6
  setup(
7
7
  name='sunholo',
@@ -26,7 +26,7 @@ from ...logging import log
26
26
  from ...utils.config import load_config
27
27
  from ...utils.version import sunholo_version
28
28
  import os
29
- from ...gcs.add_file import add_file_to_gcs
29
+ from ...gcs.add_file import add_file_to_gcs, handle_base64_image
30
30
 
31
31
 
32
32
  try:
@@ -168,21 +168,39 @@ def register_qna_routes(app, stream_interpreter, vac_interpreter):
168
168
  @app.route('/openai/v1/chat/completions/<vector_name>', methods=['POST'])
169
169
  def openai_compatible_endpoint(vector_name=None):
170
170
  data = request.get_json()
171
- log.info(f'openai_compatible_endpoint got data: {data}')
171
+ log.info(f'openai_compatible_endpoint got data: {data} for vector: {vector_name}')
172
172
 
173
173
  vector_name = vector_name or data.pop('model', None)
174
174
  messages = data.pop('messages', None)
175
175
  chat_history = data.pop('chat_history', None)
176
176
  stream = data.pop('stream', False)
177
177
 
178
- log.info(f'openai_compatible_endpoint got data: {data} for vector: {vector_name}')
179
-
180
178
  if not messages:
181
179
  return jsonify({"error": "No messages provided"}), 400
182
180
 
183
- user_message = next((msg['content'] for msg in messages if msg['role'] == 'user'), None)
181
+ user_message = None
182
+ image_uri = None
183
+ mime_type = None
184
+
185
+ for msg in reversed(messages):
186
+ if msg['role'] == 'user':
187
+ if isinstance(msg['content'], list):
188
+ for content_item in msg['content']:
189
+ if content_item['type'] == 'text':
190
+ user_message = content_item['text']
191
+ elif content_item['type'] == 'image_url':
192
+ base64_data = content_item['image_url']['url']
193
+ image_uri, mime_type = handle_base64_image(base64_data, vector_name)
194
+ else:
195
+ user_message = msg['content']
196
+ break
197
+
184
198
  if not user_message:
185
199
  return jsonify({"error": "No user message provided"}), 400
200
+
201
+ if image_uri:
202
+ data["image_uri"] = image_uri
203
+ data["mime"] = mime_type
186
204
 
187
205
  all_input = {
188
206
  "user_input": user_message,
@@ -192,7 +210,6 @@ def register_qna_routes(app, stream_interpreter, vac_interpreter):
192
210
 
193
211
  observed_stream_interpreter = observe()(stream_interpreter)
194
212
 
195
-
196
213
  response_id = str(uuid.uuid4())
197
214
 
198
215
  def generate_response_content():
@@ -238,10 +255,12 @@ def register_qna_routes(app, stream_interpreter, vac_interpreter):
238
255
  yield json.dumps(final_chunk) + "\n"
239
256
 
240
257
  if stream:
258
+ log.info("Streaming openai chunks")
241
259
  return Response(generate_response_content(), content_type='text/plain; charset=utf-8')
242
260
 
243
261
  try:
244
- bot_output = observed_stream_interpreter(
262
+ observed_vac_interpreter = observe()(vac_interpreter)
263
+ bot_output = observed_vac_interpreter(
245
264
  question=user_message,
246
265
  vector_name=vector_name,
247
266
  chat_history=all_input["chat_history"],
@@ -249,6 +268,8 @@ def register_qna_routes(app, stream_interpreter, vac_interpreter):
249
268
  )
250
269
  bot_output = parse_output(bot_output)
251
270
 
271
+ log.info(f"Bot output: {bot_output}")
272
+
252
273
  openai_response = {
253
274
  "id": response_id,
254
275
  "object": "chat.completion",
@@ -275,6 +296,7 @@ def register_qna_routes(app, stream_interpreter, vac_interpreter):
275
296
  return jsonify(openai_response)
276
297
 
277
298
  except Exception as err:
299
+ log.error(f"OpenAI response error: {err}")
278
300
  return jsonify({'error': f'QNA_ERROR: An error occurred: {str(err)} traceback: {traceback.format_exc()}'}), 500
279
301
 
280
302
 
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
  import datetime
15
15
  import os
16
+ import base64
17
+ import uuid
16
18
 
17
19
  try:
18
20
  from google.cloud import storage
@@ -22,6 +24,22 @@ except ImportError:
22
24
  from ..logging import log
23
25
  from ..utils.config import load_config_key
24
26
 
27
+
28
+ def handle_base64_image(base64_data, vector_name):
29
+ try:
30
+ header, encoded = base64_data.split(",", 1)
31
+ data = base64.b64decode(encoded)
32
+
33
+ filename = f"{uuid.uuid4()}.jpg"
34
+ with open(filename, "wb") as f:
35
+ f.write(data)
36
+
37
+ image_uri = add_file_to_gcs(filename, vector_name)
38
+ os.remove(filename) # Clean up the saved file
39
+ return image_uri, "image/jpeg"
40
+ except Exception as e:
41
+ raise Exception(f'Base64 image upload failed: {str(e)}')
42
+
25
43
  def add_file_to_gcs(filename: str, vector_name:str, bucket_name: str=None, metadata:dict=None, bucket_filepath:str=None):
26
44
 
27
45
  if not storage:
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.64.4
3
+ Version: 0.64.6
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.64.4.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.64.6.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
File without changes
File without changes
File without changes
File without changes
File without changes