sunholo 0.56.6__py3-none-any.whl → 0.57.0__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.
- sunholo/agents/flask/qna_routes.py +2 -2
- sunholo/chunker/splitter.py +7 -6
- sunholo/cli/cli.py +7 -7
- sunholo/components/vectorstore.py +2 -1
- sunholo/langfuse/prompts.py +16 -6
- sunholo/qna/parsers.py +20 -3
- sunholo/streaming/streaming.py +3 -10
- {sunholo-0.56.6.dist-info → sunholo-0.57.0.dist-info}/METADATA +2 -2
- {sunholo-0.56.6.dist-info → sunholo-0.57.0.dist-info}/RECORD +13 -13
- {sunholo-0.56.6.dist-info → sunholo-0.57.0.dist-info}/LICENSE.txt +0 -0
- {sunholo-0.56.6.dist-info → sunholo-0.57.0.dist-info}/WHEEL +0 -0
- {sunholo-0.56.6.dist-info → sunholo-0.57.0.dist-info}/entry_points.txt +0 -0
- {sunholo-0.56.6.dist-info → sunholo-0.57.0.dist-info}/top_level.txt +0 -0
|
@@ -77,9 +77,9 @@ def register_qna_routes(app, stream_interpreter, vac_interpreter):
|
|
|
77
77
|
generation.end(output=json.dumps(chunk))
|
|
78
78
|
span.end(output=json.dumps(chunk))
|
|
79
79
|
trace.update(output=json.dumps(chunk))
|
|
80
|
-
yield f"###JSON_START###{json.dumps(chunk)}###JSON_END###"
|
|
81
80
|
|
|
82
|
-
return
|
|
81
|
+
return json.dumps(chunk)
|
|
82
|
+
|
|
83
83
|
else:
|
|
84
84
|
# Otherwise, we yield the plain text chunks as they come in.
|
|
85
85
|
if chunk:
|
sunholo/chunker/splitter.py
CHANGED
|
@@ -32,12 +32,13 @@ def chunk_doc_to_docs(documents: list, extension: str = ".md", min_size: int = 8
|
|
|
32
32
|
docstore_doc_id, documents = send_doc_to_docstore(documents, vector_name=vector_name)
|
|
33
33
|
|
|
34
34
|
doc_summaries = summarise_docs(documents, vector_name=vector_name)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
if doc_summaries:
|
|
36
|
+
for doc in documents:
|
|
37
|
+
# Assuming each doc has a unique identifier in its metadata under 'objectId'
|
|
38
|
+
objectId = doc.metadata.get("objectId")
|
|
39
|
+
if objectId and objectId in doc_summaries:
|
|
40
|
+
# If the objectId is found in doc_summaries, add the summary location to the document's metadata
|
|
41
|
+
doc.metadata["summary_location"] = doc_summaries[objectId]
|
|
41
42
|
|
|
42
43
|
# Combine entire documents that are smaller than min_size
|
|
43
44
|
combined_documents_content = ""
|
sunholo/cli/cli.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
try:
|
|
3
|
-
from google.cloud import
|
|
3
|
+
from google.cloud.devtools import cloudbuild_v1
|
|
4
4
|
except ImportError:
|
|
5
|
-
|
|
5
|
+
cloudbuild_v1 = None
|
|
6
6
|
|
|
7
7
|
from ..logging import log
|
|
8
8
|
|
|
@@ -16,21 +16,21 @@ def trigger_build(args):
|
|
|
16
16
|
Example:
|
|
17
17
|
trigger_build(args) where args contains project_id, trigger_id, repo_name, and branch_name.
|
|
18
18
|
"""
|
|
19
|
-
if not
|
|
19
|
+
if not cloudbuild_v1:
|
|
20
20
|
log.warning("Can't deploy - google-cloud-build not installed, enable via `pip install sunholo[gcp]")
|
|
21
21
|
|
|
22
22
|
return None
|
|
23
23
|
|
|
24
|
-
client =
|
|
24
|
+
client = cloudbuild_v1.CloudBuildClient()
|
|
25
25
|
# Assuming the build source uses the path to the cloudbuild.yaml if specified.
|
|
26
|
-
source =
|
|
26
|
+
source = cloudbuild_v1.RepoSource(
|
|
27
27
|
project_id=args.project_id,
|
|
28
28
|
repo_name=args.repo_name,
|
|
29
29
|
branch_name=args.branch_name,
|
|
30
30
|
substitutions=args.substitutions,
|
|
31
31
|
dir=args.config_path # Path to directory containing cloudbuild.yaml
|
|
32
32
|
)
|
|
33
|
-
request =
|
|
33
|
+
request = cloudbuild_v1.RunBuildTriggerRequest(
|
|
34
34
|
project_id=args.project_id,
|
|
35
35
|
trigger_id=args.trigger_id,
|
|
36
36
|
source=source
|
|
@@ -62,7 +62,7 @@ def main(args=None):
|
|
|
62
62
|
|
|
63
63
|
Example commands:
|
|
64
64
|
```bash
|
|
65
|
-
sunholo deploy --
|
|
65
|
+
sunholo deploy --vac edmonbrain --config=llm_config.yaml
|
|
66
66
|
```
|
|
67
67
|
"""
|
|
68
68
|
parser = argparse.ArgumentParser(description="sunholo CLI tool for deploying applications using Google Cloud Build.")
|
|
@@ -19,7 +19,8 @@ def pick_vectorstore(vs_str, vector_name, embeddings):
|
|
|
19
19
|
|
|
20
20
|
if vs_str == 'supabase':
|
|
21
21
|
from supabase import Client, create_client
|
|
22
|
-
from
|
|
22
|
+
from langchain_community.vectorstores import SupabaseVectorStore
|
|
23
|
+
|
|
23
24
|
from ..database.database import setup_supabase
|
|
24
25
|
|
|
25
26
|
log.debug(f"Initiating Supabase store: {vector_name}")
|
sunholo/langfuse/prompts.py
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
from ..logging import log
|
|
2
2
|
from ..utils import load_config_key
|
|
3
|
-
import yaml
|
|
4
3
|
|
|
5
4
|
# Load the YAML file
|
|
6
5
|
def load_prompt_from_yaml(key, prefix="sunholo", file_path=None):
|
|
6
|
+
"""
|
|
7
|
+
Returns a string you can use with Langfuse PromptTemplate.from_template()
|
|
8
|
+
|
|
9
|
+
Will first try to load from the Langfuse prompt library, if unavailable will look in promptConfig type file.
|
|
10
|
+
|
|
11
|
+
Langfuse prompts have {{ two braces }}, Langchain prompts have { one brace }.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from sunholo.langfuse.prompts import load_prompt_from_yaml
|
|
17
|
+
from langchain_core.prompts import PromptTemplate
|
|
18
|
+
|
|
19
|
+
"""
|
|
7
20
|
from langfuse import Langfuse
|
|
8
21
|
|
|
9
22
|
# Initialize Langfuse client
|
|
@@ -20,9 +33,6 @@ def load_prompt_from_yaml(key, prefix="sunholo", file_path=None):
|
|
|
20
33
|
return langfuse_prompt.get_langchain_prompt()
|
|
21
34
|
|
|
22
35
|
except Exception as err:
|
|
23
|
-
|
|
24
|
-
log.error(f"Could not fine langfuse template {langfuse_template} and no file_path was provided {str(err)}")
|
|
25
|
-
raise
|
|
26
|
-
log.warning(f"Could not find langfuse template: {langfuse_template} - {str(err)} - attempting to load from {file_path}")
|
|
36
|
+
log.warning(f"Could not find langfuse template: {langfuse_template} - {str(err)} - attempting to load from promptConfig")
|
|
27
37
|
|
|
28
|
-
return load_config_key(key, vector_name=prefix,
|
|
38
|
+
return load_config_key(key, vector_name=prefix, kind="promptConfig")
|
sunholo/qna/parsers.py
CHANGED
|
@@ -21,18 +21,35 @@ def document_to_dict(document):
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
def parse_output(bot_output):
|
|
24
|
+
"""
|
|
25
|
+
Parses VAC output assuming it has an 'answer' and an optional 'source_documents' key
|
|
26
|
+
|
|
27
|
+
"""
|
|
24
28
|
if isinstance(bot_output, str):
|
|
29
|
+
|
|
25
30
|
return {"answer": bot_output}
|
|
31
|
+
|
|
26
32
|
if isinstance(bot_output, dict) and 'source_documents' in bot_output:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
33
|
+
bot_output['source_documents'] = [document_to_dict(doc) for doc in bot_output['source_documents']]
|
|
34
|
+
if not bot_output.get("answer") or bot_output.get("answer") == "":
|
|
35
|
+
bot_output['answer'] = "(No text was returned)"
|
|
36
|
+
|
|
37
|
+
return bot_output
|
|
38
|
+
|
|
39
|
+
elif isinstance(bot_output, dict) and 'metadata' in bot_output and isinstance(bot_output.get('metadata')) and 'source_documents' in bot_output.get('metadata'):
|
|
40
|
+
metadata = bot_output.get('metadata')
|
|
41
|
+
bot_output['source_documents'] = [document_to_dict(doc) for doc in metadata['source_documents']]
|
|
42
|
+
if not bot_output.get("answer") or bot_output.get("answer") == "":
|
|
30
43
|
bot_output['answer'] = "(No text was returned)"
|
|
44
|
+
|
|
31
45
|
return bot_output
|
|
46
|
+
|
|
32
47
|
elif isinstance(bot_output, dict):
|
|
33
48
|
if not bot_output.get("answer"):
|
|
34
49
|
raise ValueError(f"VAC output was not a string or a dict with the key 'answer' - got: {bot_output}")
|
|
35
50
|
else:
|
|
51
|
+
|
|
36
52
|
return bot_output
|
|
53
|
+
|
|
37
54
|
else:
|
|
38
55
|
log.error(f"Couldn't parse output for:\n {bot_output}")
|
sunholo/streaming/streaming.py
CHANGED
|
@@ -39,8 +39,6 @@ def start_streaming_chat(question,
|
|
|
39
39
|
if not check_kwargs_support(qna_func):
|
|
40
40
|
yield "No **kwargs in qna_func - please add it"
|
|
41
41
|
|
|
42
|
-
# Immediately yield to indicate the process has started.
|
|
43
|
-
yield "Thinking...\n"
|
|
44
42
|
log.info(f"Streaming chat with wait time {wait_time} seconds and timeout {timeout} seconds and kwargs {kwargs}")
|
|
45
43
|
# Initialize the chat
|
|
46
44
|
content_buffer = ContentBuffer()
|
|
@@ -82,12 +80,6 @@ def start_streaming_chat(question,
|
|
|
82
80
|
yield content_to_send
|
|
83
81
|
content_buffer.clear()
|
|
84
82
|
start = time.time() # reset timeout
|
|
85
|
-
else:
|
|
86
|
-
if time.time() - first_start < wait_time:
|
|
87
|
-
# If the initial wait period hasn't passed yet, keep sending "..."
|
|
88
|
-
yield "..."
|
|
89
|
-
else:
|
|
90
|
-
log.info("No content to send")
|
|
91
83
|
|
|
92
84
|
elapsed_time = time.time() - start
|
|
93
85
|
if elapsed_time > timeout: # If the elapsed time exceeds the timeout
|
|
@@ -162,9 +154,10 @@ async def start_streaming_chat_async(question, vector_name, qna_func, chat_histo
|
|
|
162
154
|
The `start_streaming_chat_async` function is used in a coroutine that prints messages as they are generated.
|
|
163
155
|
"""
|
|
164
156
|
|
|
165
|
-
yield "Thinking...\n"
|
|
166
157
|
log.info(f"Streaming chat with wait time {wait_time} seconds and timeout {timeout} seconds and kwargs {kwargs}")
|
|
167
|
-
|
|
158
|
+
if not check_kwargs_support(qna_func):
|
|
159
|
+
yield "No **kwargs in qna_func - please add it"
|
|
160
|
+
|
|
168
161
|
content_buffer = ContentBuffer()
|
|
169
162
|
chat_callback_handler = BufferStreamingStdOutCallbackHandler(content_buffer=content_buffer, tokens=".!?\n")
|
|
170
163
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sunholo
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.57.0
|
|
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.
|
|
6
|
+
Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.57.0.tar.gz
|
|
7
7
|
Author: Holosun ApS
|
|
8
8
|
Author-email: multivac@sunholo.com
|
|
9
9
|
License: Apache License, Version 2.0
|
|
@@ -13,7 +13,7 @@ sunholo/agents/fastapi/base.py,sha256=clk76cHbUAvU0OYJrRfCWX_5f0ACbhDsIzYBhI3wyo
|
|
|
13
13
|
sunholo/agents/fastapi/qna_routes.py,sha256=DgK4Btu5XriOC1JaRQ4G_nWEjJfnQ0J5pyLanF6eF1g,3857
|
|
14
14
|
sunholo/agents/flask/__init__.py,sha256=uqfHNw2Ru3EJ4dJEcbp86h_lkquBQPMxZbjhV_xe3rs,72
|
|
15
15
|
sunholo/agents/flask/base.py,sha256=RUGWBYWeV60FatYF5sMRrxD-INU97Vodsi6JaB6i93s,763
|
|
16
|
-
sunholo/agents/flask/qna_routes.py,sha256=
|
|
16
|
+
sunholo/agents/flask/qna_routes.py,sha256=k5nP_wXX4GVpuAHlVHuC0xMBnMeUc1uqYrGm7Gv_nFg,8382
|
|
17
17
|
sunholo/archive/__init__.py,sha256=qNHWm5rGPVOlxZBZCpA1wTYPbalizRT7f8X4rs2t290,31
|
|
18
18
|
sunholo/archive/archive.py,sha256=C-UhG5x-XtZ8VheQp92IYJqgD0V3NFQjniqlit94t18,1197
|
|
19
19
|
sunholo/auth/__init__.py,sha256=4owDjSaWYkbTlPK47UHTOC0gCWbZsqn4ZIEw5NWZTlg,28
|
|
@@ -29,14 +29,14 @@ sunholo/chunker/loaders.py,sha256=xiToUVgPz2ZzcqpUAq7aNP3PTenb_rBUAFzu0JPycIg,10
|
|
|
29
29
|
sunholo/chunker/message_data.py,sha256=iDP94dySU3Xct-gWGnB4NNRSh2luQmgJeCfQb7ktt3U,6760
|
|
30
30
|
sunholo/chunker/pdfs.py,sha256=daCZ1xjn1YvxlifIyxskWNpLJLe-Q9D_Jq12MWx3tZo,2473
|
|
31
31
|
sunholo/chunker/publish.py,sha256=PoT8q3XJeFCg10WrLkYhuaaXIrGVkvUD3-R9IfoWoH4,2703
|
|
32
|
-
sunholo/chunker/splitter.py,sha256=
|
|
32
|
+
sunholo/chunker/splitter.py,sha256=ug_v-h0wos3b7OkhmedVQs5jtLuDdFDWypvsZVYgxbU,6743
|
|
33
33
|
sunholo/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
-
sunholo/cli/cli.py,sha256=
|
|
34
|
+
sunholo/cli/cli.py,sha256=9ov0GgbdM3IDC4QgqLnG4EBSiCm2_8MlRS-6G45sXJg,3279
|
|
35
35
|
sunholo/components/__init__.py,sha256=RJGNEihwvRIiDScKis04RHJv4yZGI1UpXlOmuCptNZI,208
|
|
36
36
|
sunholo/components/llm.py,sha256=T4we3tGmqUj4tPwxQr9M6AXv_BALqZV_dRSvINan-oU,10374
|
|
37
37
|
sunholo/components/prompt.py,sha256=eZSghXkIlRzXiSrzgkG7e5ytUYq6R6LV-qjHU8jStig,6353
|
|
38
38
|
sunholo/components/retriever.py,sha256=TiM-axCeaZ6CZ8rGKGx-io16JKDe8z0pnMccBi1yqHw,3509
|
|
39
|
-
sunholo/components/vectorstore.py,sha256=
|
|
39
|
+
sunholo/components/vectorstore.py,sha256=04t_UctPMOYMaQUbLP4bRLQlCFykdAFDcBdwArA9jkg,4952
|
|
40
40
|
sunholo/database/__init__.py,sha256=Zz0Shcq-CtStf9rJGIYB_Ybzb8rY_Q9mfSj-nviM490,241
|
|
41
41
|
sunholo/database/alloydb.py,sha256=18Q4AG_W-Sz8udIj3gWMkGrMWmiEelqgOwJ7VKHElV0,14877
|
|
42
42
|
sunholo/database/database.py,sha256=reZrThKyKvMAQXe2RIiEKmKYmsRvGsn7e05OoXjWVSQ,7395
|
|
@@ -57,7 +57,7 @@ sunholo/gcs/download_url.py,sha256=PAwYShV-sRd9sNvuJrEOvfF1V34ovVP0omWbuwDkRrA,4
|
|
|
57
57
|
sunholo/gcs/metadata.py,sha256=C9sMPsHsq1ETetdQCqB3EBs3Kws8b8QHS9L7ei_v5aw,891
|
|
58
58
|
sunholo/langfuse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
59
|
sunholo/langfuse/callback.py,sha256=G9xcZHpLvyzolU57ycItLaooMCtRuM37QJSWjiwQEd0,1776
|
|
60
|
-
sunholo/langfuse/prompts.py,sha256=
|
|
60
|
+
sunholo/langfuse/prompts.py,sha256=HO4Zy9usn5tKooBPCKksuw4Lff3c03Ny5wqn4ce_xZM,1217
|
|
61
61
|
sunholo/llamaindex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
62
62
|
sunholo/llamaindex/generate.py,sha256=l1Picr-hVwkmAUD7XmTCa63qY9ERliFHQXwyX3BqB2Q,686
|
|
63
63
|
sunholo/llamaindex/import_files.py,sha256=QamEVtFXSD6Zk2La0HDgmtVPhFDdXpjzLACO--BAYpg,9378
|
|
@@ -71,21 +71,21 @@ sunholo/pubsub/__init__.py,sha256=wgkrtlL3h8uzNpnlWSHdVMOq0l5Q3D7gkxF_Rp1A6Ro,94
|
|
|
71
71
|
sunholo/pubsub/process_pubsub.py,sha256=64hvqMsxbBrf0WGJsprz_SXf9FpjeszAIsqUSBlJrA8,2780
|
|
72
72
|
sunholo/pubsub/pubsub_manager.py,sha256=M85QPCXYBPzmE8Ha0FYHdzpA-LRX9p3lu6b-UAHAyac,6400
|
|
73
73
|
sunholo/qna/__init__.py,sha256=F8q1uR_HreoSX0IfmKY1qoSwIgXhO2Q8kuDSxh9_-EE,28
|
|
74
|
-
sunholo/qna/parsers.py,sha256=
|
|
74
|
+
sunholo/qna/parsers.py,sha256=mH_SIgN2yXzvcoQZt9ITkdJSw3jgZGuu0p8q_H-kdSM,2140
|
|
75
75
|
sunholo/qna/retry.py,sha256=gFgOf9AxrZMIO9OwOYu1EW7rhNhyfnw_o4XAsNLBOVQ,2021
|
|
76
76
|
sunholo/streaming/__init__.py,sha256=k8dBqhzyS1Oi6NfADtRtWfnPtU1FU2kQz-YxH9yrNeQ,197
|
|
77
77
|
sunholo/streaming/content_buffer.py,sha256=hr2ySHOTK1zw_3u-JrKwoomsAAdda2VcOxjkvJLcUuM,6596
|
|
78
78
|
sunholo/streaming/langserve.py,sha256=6isOvFwZBfmiQY5N41PYPyrdJj9IgJXXHLfTzPvewGw,6299
|
|
79
|
-
sunholo/streaming/streaming.py,sha256=
|
|
79
|
+
sunholo/streaming/streaming.py,sha256=WoSRMnD-3sRxmeyxHz3miTtB6ECpj3Dw4SUCcnP0zB4,16473
|
|
80
80
|
sunholo/summarise/__init__.py,sha256=MZk3dblUMODcPb1crq4v-Z508NrFIpkSWNf9FIO8BcU,38
|
|
81
81
|
sunholo/summarise/summarise.py,sha256=C3HhjepTjUhUC8FLk4jMQIBvq1BcORniwuTFHjPVhVo,3784
|
|
82
82
|
sunholo/utils/__init__.py,sha256=G11nN_6ATjxpuMfG_BvcUr9UU8onPIgkpTK6CjOcbr8,48
|
|
83
83
|
sunholo/utils/config.py,sha256=NW2FFyNNTwCyopOvSzDQ0I0l92LAfJJ7hEzatSuoZho,8689
|
|
84
84
|
sunholo/utils/gcp.py,sha256=B2G1YKjeD7X9dqO86Jrp2vPuFwZ223Xl5Tg09Ndw-oc,5760
|
|
85
85
|
sunholo/utils/parsers.py,sha256=OrHmASqIbI45atVOhiGodgLvnfrzkvVzyHnSvAXD89I,3841
|
|
86
|
-
sunholo-0.
|
|
87
|
-
sunholo-0.
|
|
88
|
-
sunholo-0.
|
|
89
|
-
sunholo-0.
|
|
90
|
-
sunholo-0.
|
|
91
|
-
sunholo-0.
|
|
86
|
+
sunholo-0.57.0.dist-info/LICENSE.txt,sha256=SdE3QjnD3GEmqqg9EX3TM9f7WmtOzqS1KJve8rhbYmU,11345
|
|
87
|
+
sunholo-0.57.0.dist-info/METADATA,sha256=y3WkwDsEQAjtKnCr_X1rnoP4IINqlu4jtyEm0Lz4PCw,6617
|
|
88
|
+
sunholo-0.57.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
89
|
+
sunholo-0.57.0.dist-info/entry_points.txt,sha256=bZuN5AIHingMPt4Ro1b_T-FnQvZ3teBes-3OyO0asl4,49
|
|
90
|
+
sunholo-0.57.0.dist-info/top_level.txt,sha256=wt5tadn5--5JrZsjJz2LceoUvcrIvxjHJe-RxuudxAk,8
|
|
91
|
+
sunholo-0.57.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|