sunholo 0.62.4__tar.gz → 0.62.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.62.4 → sunholo-0.62.6}/PKG-INFO +2 -2
- {sunholo-0.62.4 → sunholo-0.62.6}/setup.py +1 -1
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/dispatch_to_qa.py +3 -1
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/special_commands.py +2 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/chat_vac.py +20 -6
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/cli.py +0 -3
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/embedder/embed_chunk.py +1 -1
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/gcs/add_file.py +6 -2
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/streaming/stream_lookup.py +1 -1
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/utils/config.py +3 -2
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/utils/gcp.py +11 -3
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo.egg-info/PKG-INFO +2 -2
- {sunholo-0.62.4 → sunholo-0.62.6}/LICENSE.txt +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/MANIFEST.in +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/README.md +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/setup.cfg +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/chat_history.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/fastapi/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/fastapi/base.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/fastapi/qna_routes.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/flask/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/flask/base.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/flask/qna_routes.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/langserve.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/pubsub.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/agents/route.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/archive/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/archive/archive.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/auth/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/auth/run.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/bots/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/bots/discord.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/bots/github_webhook.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/bots/webapp.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/data_to_embed_pubsub.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/doc_handling.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/images.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/loaders.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/message_data.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/pdfs.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/publish.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/chunker/splitter.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/cli_init.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/configs.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/deploy.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/embedder.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/merge_texts.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/run_proxy.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/cli/sun_rich.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/components/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/components/llm.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/components/retriever.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/components/vectorstore.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/alloydb.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/database.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/lancedb.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/sql/sb/create_function.sql +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/sql/sb/create_function_time.sql +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/sql/sb/create_table.sql +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/sql/sb/delete_source_row.sql +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/sql/sb/return_sources.sql +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/sql/sb/setup.sql +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/static_dbs.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/database/uuid.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/embedder/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/gcs/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/gcs/download_url.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/gcs/metadata.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/langfuse/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/langfuse/callback.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/langfuse/prompts.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/llamaindex/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/llamaindex/generate.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/llamaindex/get_files.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/llamaindex/import_files.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/logging.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/lookup/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/lookup/model_lookup.yaml +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/patches/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/patches/langchain/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/patches/langchain/lancedb.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/patches/langchain/vertexai.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/pubsub/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/pubsub/process_pubsub.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/pubsub/pubsub_manager.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/qna/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/qna/parsers.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/qna/retry.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/streaming/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/streaming/content_buffer.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/streaming/langserve.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/streaming/streaming.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/summarise/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/summarise/summarise.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/utils/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/utils/big_context.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/utils/config_schema.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/utils/parsers.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/utils/timedelta.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/utils/user_ids.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/vertex/__init__.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/vertex/init.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo/vertex/memory_tools.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo.egg-info/SOURCES.txt +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo.egg-info/dependency_links.txt +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo.egg-info/entry_points.txt +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo.egg-info/requires.txt +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/sunholo.egg-info/top_level.txt +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/tests/test_chat_history.py +0 -0
- {sunholo-0.62.4 → sunholo-0.62.6}/tests/test_config.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sunholo
|
|
3
|
-
Version: 0.62.
|
|
3
|
+
Version: 0.62.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.62.
|
|
6
|
+
Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.62.6.tar.gz
|
|
7
7
|
Author: Holosun ApS
|
|
8
8
|
Author-email: multivac@sunholo.com
|
|
9
9
|
License: Apache License, Version 2.0
|
|
@@ -70,11 +70,13 @@ def prep_request_payload(user_input, chat_history, vector_name, stream, **kwargs
|
|
|
70
70
|
# Base qna_data dictionary
|
|
71
71
|
qna_data = {
|
|
72
72
|
'user_input': user_input,
|
|
73
|
-
'vector_name': vector_name,
|
|
74
73
|
}
|
|
75
74
|
# Update qna_data with optional values from kwargs
|
|
76
75
|
qna_data.update(kwargs)
|
|
77
76
|
|
|
77
|
+
if not 'vector_name' not in qna_data:
|
|
78
|
+
qna_data['vector_name'] = vector_name
|
|
79
|
+
|
|
78
80
|
return qna_endpoint, qna_data
|
|
79
81
|
|
|
80
82
|
def send_to_qa(user_input, vector_name, chat_history, stream=False, **kwargs):
|
|
@@ -46,6 +46,8 @@ def handle_special_commands(user_input,
|
|
|
46
46
|
hourmin = now.strftime("%H%M%S")
|
|
47
47
|
the_datetime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
48
48
|
|
|
49
|
+
user_input = user_input.strip()
|
|
50
|
+
|
|
49
51
|
if not cmds:
|
|
50
52
|
cmds = load_config_key("user_special_cmds", vector_name=vector_name, kind="vacConfig")
|
|
51
53
|
if not cmds:
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
from ..agents import send_to_qa
|
|
1
|
+
from ..agents import send_to_qa, handle_special_commands
|
|
2
2
|
from ..streaming import generate_proxy_stream, can_agent_stream
|
|
3
3
|
from ..utils.user_ids import generate_user_id
|
|
4
4
|
from ..utils.config import load_config_key
|
|
5
5
|
from ..logging import log
|
|
6
|
-
|
|
6
|
+
from ..qna.parsers import parse_output
|
|
7
7
|
from .run_proxy import clean_proxy_list, start_proxy, stop_proxy
|
|
8
8
|
|
|
9
9
|
import uuid
|
|
@@ -53,6 +53,15 @@ def stream_chat_session(service_url, service_name, stream=True):
|
|
|
53
53
|
if user_input.lower() in ["exit", "quit"]:
|
|
54
54
|
console.print("[bold red]Exiting chat session.[/bold red]")
|
|
55
55
|
break
|
|
56
|
+
|
|
57
|
+
special_reply = handle_special_commands(
|
|
58
|
+
user_input,
|
|
59
|
+
vector_name=service_name,
|
|
60
|
+
chat_history=chat_history)
|
|
61
|
+
|
|
62
|
+
if special_reply:
|
|
63
|
+
console.print(f"[bold yellow]{service_name}:[/bold yellow] {special_reply}", end='\n')
|
|
64
|
+
continue
|
|
56
65
|
|
|
57
66
|
if not stream:
|
|
58
67
|
vac_response = send_to_qa(user_input,
|
|
@@ -75,7 +84,10 @@ def stream_chat_session(service_url, service_name, stream=True):
|
|
|
75
84
|
message_source="cli",
|
|
76
85
|
override_endpoint=service_url)
|
|
77
86
|
|
|
78
|
-
|
|
87
|
+
# ensures {'answer': answer}
|
|
88
|
+
answer = parse_output(vac_response)
|
|
89
|
+
|
|
90
|
+
console.print(f"[bold yellow]{service_name}:[/bold yellow] {answer.get('answer')}", end='\n')
|
|
79
91
|
else:
|
|
80
92
|
|
|
81
93
|
def stream_response():
|
|
@@ -224,7 +236,7 @@ def vac_command(args):
|
|
|
224
236
|
agent_name = load_config_key("agent", args.vac_name, kind="vacConfig")
|
|
225
237
|
|
|
226
238
|
streamer = can_agent_stream(agent_name)
|
|
227
|
-
log.
|
|
239
|
+
log.debug(f"streamer: {streamer}")
|
|
228
240
|
if not streamer:
|
|
229
241
|
console.print(f"Non streaming agent: {args.vac_name}")
|
|
230
242
|
|
|
@@ -235,11 +247,13 @@ def vac_command(args):
|
|
|
235
247
|
description = load_config_key("description", vector_name=args.vac_name, kind="vacConfig")
|
|
236
248
|
endpoints_config = load_config_key(agent_name, "dummy_value", kind="agentConfig")
|
|
237
249
|
|
|
238
|
-
display_endpoints = '
|
|
250
|
+
display_endpoints = ' '.join(f"{key}: {value}" for key, value in endpoints_config.items())
|
|
251
|
+
display_endpoints = display_endpoints.replace("{stem}", service_url).replace("{vector_name}", args.vac_name)
|
|
252
|
+
|
|
239
253
|
if agent_name == "langserve":
|
|
240
254
|
subtitle = f"{service_url}/{args.vac_name}/playground/"
|
|
241
255
|
else:
|
|
242
|
-
subtitle =
|
|
256
|
+
subtitle = display_endpoints
|
|
243
257
|
|
|
244
258
|
print(
|
|
245
259
|
Panel(description or "Starting VAC chat session",
|
|
@@ -45,9 +45,6 @@ class CustomHelpAction(argparse.Action):
|
|
|
45
45
|
parser.exit()
|
|
46
46
|
|
|
47
47
|
def main(args=None):
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
48
|
"""
|
|
52
49
|
Entry point for the sunholo console script. This function parses command line arguments
|
|
53
50
|
and invokes the appropriate functionality based on the user input.
|
|
@@ -66,7 +66,7 @@ def embed_pubsub_chunk(data: dict):
|
|
|
66
66
|
log.info(f"Embedding: {vector_name} page_content: {page_content[:30]}...[{len(page_content)}] - {metadata}")
|
|
67
67
|
|
|
68
68
|
if 'eventTime' not in metadata:
|
|
69
|
-
metadata['eventTime'] = datetime.datetime.now(
|
|
69
|
+
metadata['eventTime'] = datetime.datetime.now().isoformat(timespec='microseconds') + "Z"
|
|
70
70
|
metadata['eventtime'] = metadata['eventTime']
|
|
71
71
|
|
|
72
72
|
if 'source' not in metadata:
|
|
@@ -20,8 +20,7 @@ except ImportError:
|
|
|
20
20
|
storage = None
|
|
21
21
|
|
|
22
22
|
from ..logging import log
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
from ..utils.config import load_config_key
|
|
25
24
|
|
|
26
25
|
def add_file_to_gcs(filename: str, vector_name:str, bucket_name: str=None, metadata:dict=None, bucket_filepath:str=None):
|
|
27
26
|
|
|
@@ -33,6 +32,11 @@ def add_file_to_gcs(filename: str, vector_name:str, bucket_name: str=None, metad
|
|
|
33
32
|
except Exception as err:
|
|
34
33
|
log.error(f"Error creating storage client: {str(err)}")
|
|
35
34
|
return None
|
|
35
|
+
|
|
36
|
+
bucket_config = load_config_key("upload", vector_name, "vacConfig")
|
|
37
|
+
if bucket_config:
|
|
38
|
+
if bucket_config.get("buckets"):
|
|
39
|
+
bucket_name = bucket_config.get("buckets").get("all")
|
|
36
40
|
|
|
37
41
|
bucket_name = bucket_name if bucket_name else os.getenv('GCS_BUCKET', None)
|
|
38
42
|
if bucket_name is None:
|
|
@@ -3,7 +3,7 @@ from ..logging import log
|
|
|
3
3
|
|
|
4
4
|
def can_agent_stream(agent_name: str):
|
|
5
5
|
|
|
6
|
-
log.
|
|
6
|
+
log.debug(f"agent_type: {agent_name} checking streaming...")
|
|
7
7
|
endpoints_config = load_config_key(agent_name, "dummy_value", kind="agentConfig")
|
|
8
8
|
|
|
9
9
|
return 'stream' in endpoints_config
|
|
@@ -192,8 +192,9 @@ def load_config_key(key: str, vector_name: str, kind: str):
|
|
|
192
192
|
print(f'API URL: {api_url}')
|
|
193
193
|
```
|
|
194
194
|
"""
|
|
195
|
-
|
|
196
|
-
|
|
195
|
+
import logging # can't use sunholo.logging due to circular import
|
|
196
|
+
log = logging.getLogger("sunholo")
|
|
197
|
+
|
|
197
198
|
if kind != 'agentConfig':
|
|
198
199
|
assert isinstance(key, str), f"key must be a string got a {type(key)}"
|
|
199
200
|
|
|
@@ -17,6 +17,8 @@ import socket
|
|
|
17
17
|
# can't install due to circular import sunholo.logging
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
|
+
from .config import load_config_key
|
|
21
|
+
|
|
20
22
|
def is_running_on_cloudrun():
|
|
21
23
|
"""
|
|
22
24
|
Check if the current environment is a Google Cloud Run instance.
|
|
@@ -127,9 +129,11 @@ def get_gcp_project():
|
|
|
127
129
|
Returns:
|
|
128
130
|
str or None: The project ID if found, None otherwise.
|
|
129
131
|
"""
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
gcp_config = load_config_key("gcp_config", "global", "vacConfig")
|
|
133
|
+
if gcp_config:
|
|
134
|
+
if gcp_config.get('project_id'):
|
|
135
|
+
return gcp_config.get('project_id')
|
|
136
|
+
|
|
133
137
|
project_id = get_env_project_id()
|
|
134
138
|
if project_id:
|
|
135
139
|
return project_id
|
|
@@ -137,6 +141,10 @@ def get_gcp_project():
|
|
|
137
141
|
project_id = get_metadata('project/project-id')
|
|
138
142
|
if project_id:
|
|
139
143
|
os.environ["GCP_PROJECT"] = project_id
|
|
144
|
+
return project_id
|
|
145
|
+
|
|
146
|
+
if not is_running_on_gcp():
|
|
147
|
+
return None
|
|
140
148
|
|
|
141
149
|
logging.warning("GCP Project ID not found. Ensure you are running on GCP or have the GCP_PROJECT environment variable set.")
|
|
142
150
|
return None
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sunholo
|
|
3
|
-
Version: 0.62.
|
|
3
|
+
Version: 0.62.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.62.
|
|
6
|
+
Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.62.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
|