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.
- {sunholo-0.64.4 → sunholo-0.64.6}/PKG-INFO +2 -2
- {sunholo-0.64.4 → sunholo-0.64.6}/setup.py +1 -1
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/flask/qna_routes.py +29 -7
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/gcs/add_file.py +18 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/PKG-INFO +2 -2
- {sunholo-0.64.4 → sunholo-0.64.6}/LICENSE.txt +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/MANIFEST.in +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/README.md +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/setup.cfg +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/chat_history.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/dispatch_to_qa.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/fastapi/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/fastapi/base.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/fastapi/qna_routes.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/flask/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/flask/base.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/langserve.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/pubsub.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/route.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/agents/special_commands.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/archive/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/archive/archive.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/auth/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/auth/run.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/bots/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/bots/discord.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/bots/github_webhook.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/bots/webapp.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/data_to_embed_pubsub.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/doc_handling.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/images.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/loaders.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/message_data.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/pdfs.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/publish.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/chunker/splitter.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/chat_vac.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/cli.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/cli_init.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/configs.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/deploy.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/embedder.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/merge_texts.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/run_proxy.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/cli/sun_rich.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/components/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/components/llm.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/components/retriever.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/components/vectorstore.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/alloydb.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/database.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/lancedb.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/create_function.sql +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/create_function_time.sql +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/create_table.sql +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/delete_source_row.sql +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/return_sources.sql +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/sql/sb/setup.sql +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/static_dbs.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/database/uuid.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/embedder/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/embedder/embed_chunk.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/gcs/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/gcs/download_url.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/gcs/metadata.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/langfuse/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/langfuse/callback.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/langfuse/prompts.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/llamaindex/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/llamaindex/generate.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/llamaindex/get_files.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/llamaindex/import_files.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/logging.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/lookup/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/lookup/model_lookup.yaml +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/patches/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/patches/langchain/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/patches/langchain/lancedb.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/patches/langchain/vertexai.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/pubsub/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/pubsub/process_pubsub.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/pubsub/pubsub_manager.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/qna/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/qna/parsers.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/qna/retry.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/content_buffer.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/langserve.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/stream_lookup.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/streaming/streaming.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/summarise/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/summarise/summarise.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/big_context.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/config.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/config_schema.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/gcp.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/gcp_project.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/parsers.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/timedelta.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/user_ids.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/utils/version.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/vertex/__init__.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/vertex/init.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/vertex/memory_tools.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo/vertex/safety.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/SOURCES.txt +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/dependency_links.txt +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/entry_points.txt +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/requires.txt +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/sunholo.egg-info/top_level.txt +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/tests/test_chat_history.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/tests/test_chunker.py +0 -0
- {sunholo-0.64.4 → sunholo-0.64.6}/tests/test_config.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
@@ -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 =
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|