sunholo 0.90.6__tar.gz → 0.91.1__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 (160) hide show
  1. {sunholo-0.90.6 → sunholo-0.91.1}/PKG-INFO +2 -2
  2. {sunholo-0.90.6 → sunholo-0.91.1}/setup.py +1 -1
  3. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/alloydb_client.py +54 -1
  4. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/llamaindex/llamaindex_class.py +2 -0
  5. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo.egg-info/PKG-INFO +2 -2
  6. {sunholo-0.90.6 → sunholo-0.91.1}/LICENSE.txt +0 -0
  7. {sunholo-0.90.6 → sunholo-0.91.1}/MANIFEST.in +0 -0
  8. {sunholo-0.90.6 → sunholo-0.91.1}/README.md +0 -0
  9. {sunholo-0.90.6 → sunholo-0.91.1}/setup.cfg +0 -0
  10. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/__init__.py +0 -0
  11. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/__init__.py +0 -0
  12. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/chat_history.py +0 -0
  13. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/dispatch_to_qa.py +0 -0
  14. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/fastapi/__init__.py +0 -0
  15. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/fastapi/base.py +0 -0
  16. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/fastapi/qna_routes.py +0 -0
  17. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/flask/__init__.py +0 -0
  18. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/flask/base.py +0 -0
  19. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/flask/qna_routes.py +0 -0
  20. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/flask/vac_routes.py +0 -0
  21. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/langserve.py +0 -0
  22. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/pubsub.py +0 -0
  23. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/route.py +0 -0
  24. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/special_commands.py +0 -0
  25. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/agents/swagger.py +0 -0
  26. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/archive/__init__.py +0 -0
  27. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/archive/archive.py +0 -0
  28. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/auth/__init__.py +0 -0
  29. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/auth/gcloud.py +0 -0
  30. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/auth/refresh.py +0 -0
  31. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/auth/run.py +0 -0
  32. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/azure/__init__.py +0 -0
  33. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/azure/auth.py +0 -0
  34. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/azure/blobs.py +0 -0
  35. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/azure/event_grid.py +0 -0
  36. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/bots/__init__.py +0 -0
  37. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/bots/discord.py +0 -0
  38. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/bots/github_webhook.py +0 -0
  39. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/bots/webapp.py +0 -0
  40. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/__init__.py +0 -0
  41. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/azure.py +0 -0
  42. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/doc_handling.py +0 -0
  43. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/encode_metadata.py +0 -0
  44. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/images.py +0 -0
  45. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/loaders.py +0 -0
  46. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/message_data.py +0 -0
  47. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/pdfs.py +0 -0
  48. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/process_chunker_data.py +0 -0
  49. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/publish.py +0 -0
  50. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/pubsub.py +0 -0
  51. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/chunker/splitter.py +0 -0
  52. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/__init__.py +0 -0
  53. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/chat_vac.py +0 -0
  54. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/cli.py +0 -0
  55. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/cli_init.py +0 -0
  56. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/configs.py +0 -0
  57. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/deploy.py +0 -0
  58. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/embedder.py +0 -0
  59. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/merge_texts.py +0 -0
  60. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/run_proxy.py +0 -0
  61. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/sun_rich.py +0 -0
  62. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/swagger.py +0 -0
  63. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/cli/vertex.py +0 -0
  64. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/components/__init__.py +0 -0
  65. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/components/llm.py +0 -0
  66. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/components/retriever.py +0 -0
  67. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/components/vectorstore.py +0 -0
  68. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/custom_logging.py +0 -0
  69. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/__init__.py +0 -0
  70. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/alloydb.py +0 -0
  71. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/database.py +0 -0
  72. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/lancedb.py +0 -0
  73. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/sql/sb/create_function.sql +0 -0
  74. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/sql/sb/create_function_time.sql +0 -0
  75. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/sql/sb/create_table.sql +0 -0
  76. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/sql/sb/delete_source_row.sql +0 -0
  77. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/sql/sb/return_sources.sql +0 -0
  78. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/sql/sb/setup.sql +0 -0
  79. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/static_dbs.py +0 -0
  80. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/database/uuid.py +0 -0
  81. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/discovery_engine/__init__.py +0 -0
  82. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/discovery_engine/chunker_handler.py +0 -0
  83. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/discovery_engine/create_new.py +0 -0
  84. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/discovery_engine/discovery_engine_client.py +0 -0
  85. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/discovery_engine/get_ai_search_chunks.py +0 -0
  86. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/embedder/__init__.py +0 -0
  87. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/embedder/embed_chunk.py +0 -0
  88. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/excel/__init__.py +0 -0
  89. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/excel/plugin.py +0 -0
  90. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/gcs/__init__.py +0 -0
  91. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/gcs/add_file.py +0 -0
  92. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/gcs/download_folder.py +0 -0
  93. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/gcs/download_url.py +0 -0
  94. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/gcs/metadata.py +0 -0
  95. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/genai/__init__.py +0 -0
  96. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/genai/init.py +0 -0
  97. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/genai/process_funcs_cls.py +0 -0
  98. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/genai/safety.py +0 -0
  99. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/invoke/__init__.py +0 -0
  100. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/invoke/async_class.py +0 -0
  101. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/invoke/direct_vac_func.py +0 -0
  102. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/invoke/invoke_vac_utils.py +0 -0
  103. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/langfuse/__init__.py +0 -0
  104. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/langfuse/callback.py +0 -0
  105. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/langfuse/evals.py +0 -0
  106. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/langfuse/prompts.py +0 -0
  107. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/llamaindex/__init__.py +0 -0
  108. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/llamaindex/get_files.py +0 -0
  109. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/llamaindex/import_files.py +0 -0
  110. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/llamaindex/user_history.py +0 -0
  111. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/lookup/__init__.py +0 -0
  112. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/lookup/model_lookup.yaml +0 -0
  113. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/patches/__init__.py +0 -0
  114. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/patches/langchain/__init__.py +0 -0
  115. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/patches/langchain/lancedb.py +0 -0
  116. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/patches/langchain/vertexai.py +0 -0
  117. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/pubsub/__init__.py +0 -0
  118. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/pubsub/process_pubsub.py +0 -0
  119. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/pubsub/pubsub_manager.py +0 -0
  120. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/qna/__init__.py +0 -0
  121. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/qna/parsers.py +0 -0
  122. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/qna/retry.py +0 -0
  123. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/streaming/__init__.py +0 -0
  124. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/streaming/content_buffer.py +0 -0
  125. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/streaming/langserve.py +0 -0
  126. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/streaming/stream_lookup.py +0 -0
  127. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/streaming/streaming.py +0 -0
  128. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/summarise/__init__.py +0 -0
  129. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/summarise/summarise.py +0 -0
  130. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/terraform/__init__.py +0 -0
  131. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/terraform/tfvars_editor.py +0 -0
  132. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/tools/__init__.py +0 -0
  133. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/tools/web_browser.py +0 -0
  134. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/__init__.py +0 -0
  135. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/api_key.py +0 -0
  136. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/big_context.py +0 -0
  137. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/config.py +0 -0
  138. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/config_class.py +0 -0
  139. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/config_schema.py +0 -0
  140. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/gcp.py +0 -0
  141. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/gcp_project.py +0 -0
  142. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/parsers.py +0 -0
  143. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/timedelta.py +0 -0
  144. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/user_ids.py +0 -0
  145. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/utils/version.py +0 -0
  146. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/vertex/__init__.py +0 -0
  147. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/vertex/extensions_call.py +0 -0
  148. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/vertex/extensions_class.py +0 -0
  149. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/vertex/genai_functions.py +0 -0
  150. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/vertex/init.py +0 -0
  151. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/vertex/memory_tools.py +0 -0
  152. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/vertex/safety.py +0 -0
  153. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo/vertex/type_dict_to_json.py +0 -0
  154. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo.egg-info/SOURCES.txt +0 -0
  155. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo.egg-info/dependency_links.txt +0 -0
  156. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo.egg-info/entry_points.txt +0 -0
  157. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo.egg-info/requires.txt +0 -0
  158. {sunholo-0.90.6 → sunholo-0.91.1}/sunholo.egg-info/top_level.txt +0 -0
  159. {sunholo-0.90.6 → sunholo-0.91.1}/tests/test_chat_history.py +0 -0
  160. {sunholo-0.90.6 → sunholo-0.91.1}/tests/test_config.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.90.6
3
+ Version: 0.91.1
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.90.6.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.91.1.tar.gz
7
7
  Author: Holosun ApS
8
8
  Author-email: multivac@sunholo.com
9
9
  License: Apache License, Version 2.0
@@ -1,6 +1,6 @@
1
1
  from setuptools import setup, find_packages
2
2
 
3
- version = '0.90.6'
3
+ version = '0.91.1'
4
4
 
5
5
  setup(
6
6
  name='sunholo',
@@ -3,7 +3,7 @@ try:
3
3
  import pg8000
4
4
  import sqlalchemy
5
5
  from sqlalchemy.exc import DatabaseError, ProgrammingError
6
- from langchain_google_alloydb_pg import AlloyDBEngine
6
+ from langchain_google_alloydb_pg import AlloyDBEngine, AlloyDBVectorStore
7
7
  except ImportError:
8
8
  AlloyDBEngine = None
9
9
  pass
@@ -12,6 +12,7 @@ from .database import get_vector_size
12
12
  from .uuid import generate_uuid_from_object_id
13
13
  from ..custom_logging import log
14
14
  from ..utils import ConfigManager
15
+ from ..components import get_embeddings
15
16
 
16
17
  class AlloyDBClient:
17
18
  """
@@ -62,6 +63,7 @@ class AlloyDBClient:
62
63
  if not alloydb_config:
63
64
  raise ValueError("Must specify vac.alloydb_config")
64
65
  self.config = alloydb_config
66
+ self.vector_name = self.config.get("vac")
65
67
  project_id = alloydb_config["project_id"]
66
68
  region = alloydb_config["region"]
67
69
  cluster_name = alloydb_config["cluster"]
@@ -87,6 +89,11 @@ class AlloyDBClient:
87
89
  log.info("Build with Langchain engine - will use default service account for auth")
88
90
  self.engine = self._create_engine()
89
91
  self.engine_type = "langchain"
92
+
93
+ if self.engine_type == "langchain":
94
+ self.vectorstore = self.get_vectorstore()
95
+ else:
96
+ self.vectorstore = None
90
97
 
91
98
  def _build_instance_uri(self, project_id, region, cluster_name, instance_name):
92
99
  return f"projects/{project_id}/locations/{region}/clusters/{cluster_name}/instances/{instance_name}"
@@ -134,6 +141,52 @@ class AlloyDBClient:
134
141
 
135
142
  return engine
136
143
 
144
+ def _get_embedder(self):
145
+ return get_embeddings(self.vector_name)
146
+
147
+ def get_vectorstore(self):
148
+ if self.engine_type != "langchain":
149
+ raise ValueError("Not available using pg8000 engine")
150
+
151
+ if self.vector_name is None:
152
+ raise ValueError("No vectorname found - init with ConfigManager?")
153
+
154
+ vector_size = get_vector_size(self.vector_name)
155
+ table_name = f"{self.vector_name}_vectorstore_{vector_size}"
156
+
157
+ log.info(f"Initialised AlloyDBClient with AlloyDBVectorStore: {table_name}")
158
+ self.vectorstore = AlloyDBVectorStore.create_sync(
159
+ engine=self.engine,
160
+ table_name=table_name,
161
+ embedding_service=self._get_embedder(),
162
+ metadata_columns=["source", "docstore_doc_id"]
163
+ #metadata_columns=["source", "eventTime"]
164
+ )
165
+
166
+ return self.vectorstore
167
+
168
+ def _similarity_search(self, query, source_filter:str="", free_filter:str=None):
169
+
170
+ if free_filter is None:
171
+ source_filter_cmd = f"source %LIKE% {source_filter}" if source_filter else None
172
+ else:
173
+ source_filter_cmd = free_filter
174
+
175
+ log.info(f"Similarity search for {query} and {source_filter_cmd}")
176
+
177
+ return query, source_filter_cmd
178
+
179
+ def similarity_search(self, query:str, source_filter:str="", free_filter:str=None, k:int=5):
180
+
181
+ query, source_filter_cmd = self._similarity_search(query, source_filter, free_filter)
182
+
183
+ return self.vectorstore.similarity_search(query, filter=source_filter_cmd, k=k)
184
+
185
+ async def asimilarity_search(self, query:str, source_filter:str="", free_filter:str=None, k:int=5):
186
+ query, source_filter_cmd = self._similarity_search(query, source_filter, free_filter)
187
+
188
+ return await self.vectorstore.asimilarity_search(query, filter=source_filter_cmd, k=k)
189
+
137
190
  def execute_sql(self, sql_statement):
138
191
  if self.engine_type == "pg8000":
139
192
  return self._execute_sql_pg8000(sql_statement)
@@ -178,6 +178,8 @@ class LlamaIndexVertexCorpusManager:
178
178
 
179
179
  def query_corpus(self, query:str, corpus_disply_name:str):
180
180
  corpus = self.find_corpus_from_list(corpus_disply_name)
181
+
182
+ log.info(f"Querying {corpus.name=} with {query=}")
181
183
 
182
184
  response:RetrieveContextsResponse = rag.retrieval_query(
183
185
  rag_resources=[
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.90.6
3
+ Version: 0.91.1
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.90.6.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.91.1.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