sunholo 0.140.11__tar.gz → 0.140.13__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 (191) hide show
  1. sunholo-0.140.13/PKG-INFO +546 -0
  2. sunholo-0.140.13/README.md +360 -0
  3. {sunholo-0.140.11 → sunholo-0.140.13}/pyproject.toml +1 -1
  4. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/chat_history.py +2 -2
  5. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/config_class.py +94 -2
  6. sunholo-0.140.13/src/sunholo.egg-info/PKG-INFO +546 -0
  7. sunholo-0.140.11/PKG-INFO +0 -249
  8. sunholo-0.140.11/README.md +0 -63
  9. sunholo-0.140.11/src/sunholo.egg-info/PKG-INFO +0 -249
  10. {sunholo-0.140.11 → sunholo-0.140.13}/LICENSE.txt +0 -0
  11. {sunholo-0.140.11 → sunholo-0.140.13}/MANIFEST.in +0 -0
  12. {sunholo-0.140.11 → sunholo-0.140.13}/setup.cfg +0 -0
  13. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/__init__.py +0 -0
  14. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/__init__.py +0 -0
  15. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/dispatch_to_qa.py +0 -0
  16. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/fastapi/__init__.py +0 -0
  17. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/fastapi/base.py +0 -0
  18. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/fastapi/qna_routes.py +0 -0
  19. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/flask/__init__.py +0 -0
  20. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/flask/base.py +0 -0
  21. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/flask/vac_routes.py +0 -0
  22. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/langserve.py +0 -0
  23. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/pubsub.py +0 -0
  24. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/route.py +0 -0
  25. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/special_commands.py +0 -0
  26. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/agents/swagger.py +0 -0
  27. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/archive/__init__.py +0 -0
  28. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/archive/archive.py +0 -0
  29. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/auth/__init__.py +0 -0
  30. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/auth/gcloud.py +0 -0
  31. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/auth/refresh.py +0 -0
  32. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/auth/run.py +0 -0
  33. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/azure/__init__.py +0 -0
  34. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/azure/auth.py +0 -0
  35. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/azure/blobs.py +0 -0
  36. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/azure/event_grid.py +0 -0
  37. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/bots/__init__.py +0 -0
  38. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/bots/discord.py +0 -0
  39. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/bots/github_webhook.py +0 -0
  40. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/bots/webapp.py +0 -0
  41. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/__init__.py +0 -0
  42. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/azure.py +0 -0
  43. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/doc_handling.py +0 -0
  44. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/encode_metadata.py +0 -0
  45. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/images.py +0 -0
  46. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/loaders.py +0 -0
  47. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/message_data.py +0 -0
  48. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/pdfs.py +0 -0
  49. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/process_chunker_data.py +0 -0
  50. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/publish.py +0 -0
  51. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/pubsub.py +0 -0
  52. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/chunker/splitter.py +0 -0
  53. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/__init__.py +0 -0
  54. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/chat_vac.py +0 -0
  55. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/cli.py +0 -0
  56. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/cli_init.py +0 -0
  57. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/configs.py +0 -0
  58. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/deploy.py +0 -0
  59. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/embedder.py +0 -0
  60. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/merge_texts.py +0 -0
  61. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/run_proxy.py +0 -0
  62. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/sun_rich.py +0 -0
  63. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/swagger.py +0 -0
  64. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/cli/vertex.py +0 -0
  65. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/components/__init__.py +0 -0
  66. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/components/llm.py +0 -0
  67. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/components/retriever.py +0 -0
  68. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/components/vectorstore.py +0 -0
  69. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/custom_logging.py +0 -0
  70. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/__init__.py +0 -0
  71. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/alloydb.py +0 -0
  72. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/alloydb_client.py +0 -0
  73. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/database.py +0 -0
  74. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/lancedb.py +0 -0
  75. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/sql/sb/create_function.sql +0 -0
  76. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/sql/sb/create_function_time.sql +0 -0
  77. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/sql/sb/create_table.sql +0 -0
  78. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/sql/sb/delete_source_row.sql +0 -0
  79. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/sql/sb/return_sources.sql +0 -0
  80. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/sql/sb/setup.sql +0 -0
  81. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/static_dbs.py +0 -0
  82. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/database/uuid.py +0 -0
  83. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/discovery_engine/__init__.py +0 -0
  84. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/discovery_engine/chunker_handler.py +0 -0
  85. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/discovery_engine/cli.py +0 -0
  86. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/discovery_engine/create_new.py +0 -0
  87. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/discovery_engine/discovery_engine_client.py +0 -0
  88. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/discovery_engine/get_ai_search_chunks.py +0 -0
  89. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/embedder/__init__.py +0 -0
  90. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/embedder/embed_chunk.py +0 -0
  91. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/embedder/embed_metadata.py +0 -0
  92. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/excel/__init__.py +0 -0
  93. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/excel/plugin.py +0 -0
  94. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/gcs/__init__.py +0 -0
  95. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/gcs/add_file.py +0 -0
  96. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/gcs/download_folder.py +0 -0
  97. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/gcs/download_gcs_text.py +0 -0
  98. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/gcs/download_url.py +0 -0
  99. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/gcs/extract_and_sign.py +0 -0
  100. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/gcs/metadata.py +0 -0
  101. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/genai/__init__.py +0 -0
  102. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/genai/file_handling.py +0 -0
  103. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/genai/genaiv2.py +0 -0
  104. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/genai/images.py +0 -0
  105. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/genai/init.py +0 -0
  106. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/genai/process_funcs_cls.py +0 -0
  107. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/genai/safety.py +0 -0
  108. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/invoke/__init__.py +0 -0
  109. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/invoke/async_class.py +0 -0
  110. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/invoke/direct_vac_func.py +0 -0
  111. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/invoke/invoke_vac_utils.py +0 -0
  112. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/langchain_types.py +0 -0
  113. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/langfuse/__init__.py +0 -0
  114. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/langfuse/callback.py +0 -0
  115. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/langfuse/evals.py +0 -0
  116. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/langfuse/prompts.py +0 -0
  117. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/llamaindex/__init__.py +0 -0
  118. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/llamaindex/get_files.py +0 -0
  119. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/llamaindex/import_files.py +0 -0
  120. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/llamaindex/llamaindex_class.py +0 -0
  121. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/llamaindex/user_history.py +0 -0
  122. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/lookup/__init__.py +0 -0
  123. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/lookup/model_lookup.yaml +0 -0
  124. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/mcp/__init__.py +0 -0
  125. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/mcp/cli.py +0 -0
  126. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/ollama/__init__.py +0 -0
  127. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/ollama/ollama_images.py +0 -0
  128. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/pubsub/__init__.py +0 -0
  129. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/pubsub/process_pubsub.py +0 -0
  130. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/pubsub/pubsub_manager.py +0 -0
  131. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/qna/__init__.py +0 -0
  132. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/qna/parsers.py +0 -0
  133. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/qna/retry.py +0 -0
  134. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/senses/__init__.py +0 -0
  135. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/senses/stream_voice.py +0 -0
  136. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/streaming/__init__.py +0 -0
  137. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/streaming/content_buffer.py +0 -0
  138. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/streaming/langserve.py +0 -0
  139. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/streaming/stream_lookup.py +0 -0
  140. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/streaming/streaming.py +0 -0
  141. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/summarise/__init__.py +0 -0
  142. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/summarise/summarise.py +0 -0
  143. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/agent/__init__.py +0 -0
  144. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/agent/agent_service.py +0 -0
  145. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/agent/app.py +0 -0
  146. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/agent/my_log.py +0 -0
  147. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/agent/tools/__init__.py +0 -0
  148. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/agent/tools/your_agent.py +0 -0
  149. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/agent/vac_service.py +0 -0
  150. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/project/__init__.py +0 -0
  151. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/project/app.py +0 -0
  152. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/project/my_log.py +0 -0
  153. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/project/vac_service.py +0 -0
  154. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/system_services/__init__.py +0 -0
  155. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/system_services/app.py +0 -0
  156. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/templates/system_services/my_log.py +0 -0
  157. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/terraform/__init__.py +0 -0
  158. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/terraform/tfvars_editor.py +0 -0
  159. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/tools/__init__.py +0 -0
  160. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/tools/web_browser.py +0 -0
  161. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/__init__.py +0 -0
  162. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/api_key.py +0 -0
  163. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/big_context.py +0 -0
  164. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/config.py +0 -0
  165. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/config_schema.py +0 -0
  166. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/gcp.py +0 -0
  167. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/gcp_project.py +0 -0
  168. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/mime.py +0 -0
  169. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/parsers.py +0 -0
  170. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/timedelta.py +0 -0
  171. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/user_ids.py +0 -0
  172. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/utils/version.py +0 -0
  173. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/vertex/__init__.py +0 -0
  174. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/vertex/extensions_call.py +0 -0
  175. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/vertex/extensions_class.py +0 -0
  176. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/vertex/genai_functions.py +0 -0
  177. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/vertex/init.py +0 -0
  178. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/vertex/memory_tools.py +0 -0
  179. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/vertex/safety.py +0 -0
  180. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo/vertex/type_dict_to_json.py +0 -0
  181. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo.egg-info/SOURCES.txt +0 -0
  182. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo.egg-info/dependency_links.txt +0 -0
  183. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo.egg-info/entry_points.txt +0 -0
  184. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo.egg-info/requires.txt +0 -0
  185. {sunholo-0.140.11 → sunholo-0.140.13}/src/sunholo.egg-info/top_level.txt +0 -0
  186. {sunholo-0.140.11 → sunholo-0.140.13}/tests/test_async.py +0 -0
  187. {sunholo-0.140.11 → sunholo-0.140.13}/tests/test_async_genai2.py +0 -0
  188. {sunholo-0.140.11 → sunholo-0.140.13}/tests/test_chat_history.py +0 -0
  189. {sunholo-0.140.11 → sunholo-0.140.13}/tests/test_config.py +0 -0
  190. {sunholo-0.140.11 → sunholo-0.140.13}/tests/test_genai2.py +0 -0
  191. {sunholo-0.140.11 → sunholo-0.140.13}/tests/test_unstructured.py +0 -0
@@ -0,0 +1,546 @@
1
+ Metadata-Version: 2.4
2
+ Name: sunholo
3
+ Version: 0.140.13
4
+ Summary: AI DevOps - a package to help deploy GenAI to the Cloud.
5
+ Author-email: Holosun ApS <multivac@sunholo.com>
6
+ License: Apache License, Version 2.0
7
+ Project-URL: Homepage, https://github.com/sunholo-data/sunholo-py
8
+ Project-URL: Download, https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.118.0.tar.gz
9
+ Keywords: llms,devops,google_cloud_platform
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Topic :: Software Development :: Build Tools
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Requires-Python: >=3.10
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE.txt
21
+ Requires-Dist: aiohttp
22
+ Requires-Dist: google-auth
23
+ Requires-Dist: ollama>=0.4.7
24
+ Requires-Dist: pillow>=11.0.0
25
+ Requires-Dist: pydantic
26
+ Requires-Dist: requests
27
+ Requires-Dist: ruamel.yaml
28
+ Requires-Dist: tenacity
29
+ Provides-Extra: test
30
+ Requires-Dist: pytest; extra == "test"
31
+ Requires-Dist: pytest-cov; extra == "test"
32
+ Provides-Extra: all
33
+ Requires-Dist: aiofiles; extra == "all"
34
+ Requires-Dist: aiohttp; extra == "all"
35
+ Requires-Dist: anthropic[vertex]; extra == "all"
36
+ Requires-Dist: asyncpg; extra == "all"
37
+ Requires-Dist: azure-identity; extra == "all"
38
+ Requires-Dist: azure-storage-blob; extra == "all"
39
+ Requires-Dist: fastapi; extra == "all"
40
+ Requires-Dist: flask; extra == "all"
41
+ Requires-Dist: google-auth; extra == "all"
42
+ Requires-Dist: google-auth-httplib2; extra == "all"
43
+ Requires-Dist: google-auth-oauthlib; extra == "all"
44
+ Requires-Dist: google-cloud-aiplatform>=1.58.0; extra == "all"
45
+ Requires-Dist: google-api-python-client; extra == "all"
46
+ Requires-Dist: google-cloud-alloydb-connector[pg8000]; extra == "all"
47
+ Requires-Dist: google-cloud-bigquery; extra == "all"
48
+ Requires-Dist: google-cloud-build; extra == "all"
49
+ Requires-Dist: google-cloud-service-control; extra == "all"
50
+ Requires-Dist: google-cloud-logging; extra == "all"
51
+ Requires-Dist: google-cloud-storage; extra == "all"
52
+ Requires-Dist: google-cloud-pubsub; extra == "all"
53
+ Requires-Dist: google-cloud-discoveryengine>=0.13.4; extra == "all"
54
+ Requires-Dist: google-cloud-texttospeech; extra == "all"
55
+ Requires-Dist: google-generativeai>=0.7.1; extra == "all"
56
+ Requires-Dist: google-genai>=0.2.2; extra == "all"
57
+ Requires-Dist: gunicorn; extra == "all"
58
+ Requires-Dist: httpcore; extra == "all"
59
+ Requires-Dist: httpx; extra == "all"
60
+ Requires-Dist: jsonschema; extra == "all"
61
+ Requires-Dist: lancedb; extra == "all"
62
+ Requires-Dist: langchain>=0.2.16; extra == "all"
63
+ Requires-Dist: langchain-experimental>=0.0.61; extra == "all"
64
+ Requires-Dist: langchain-community>=0.2.11; extra == "all"
65
+ Requires-Dist: langchain-openai>=0.3.2; extra == "all"
66
+ Requires-Dist: langchain-google-genai>=2.0.9; extra == "all"
67
+ Requires-Dist: langchain_google_alloydb_pg; extra == "all"
68
+ Requires-Dist: langchain-anthropic>=0.1.23; extra == "all"
69
+ Requires-Dist: langchain-google-vertexai; extra == "all"
70
+ Requires-Dist: langchain-unstructured; extra == "all"
71
+ Requires-Dist: langfuse; extra == "all"
72
+ Requires-Dist: mcp; extra == "all"
73
+ Requires-Dist: numpy; extra == "all"
74
+ Requires-Dist: opencv-python; extra == "all"
75
+ Requires-Dist: pg8000; extra == "all"
76
+ Requires-Dist: pgvector; extra == "all"
77
+ Requires-Dist: pillow; extra == "all"
78
+ Requires-Dist: playwright; extra == "all"
79
+ Requires-Dist: psutil; extra == "all"
80
+ Requires-Dist: psycopg2-binary; extra == "all"
81
+ Requires-Dist: pydantic; extra == "all"
82
+ Requires-Dist: pypdf; extra == "all"
83
+ Requires-Dist: python-hcl2; extra == "all"
84
+ Requires-Dist: python-socketio; extra == "all"
85
+ Requires-Dist: pytesseract; extra == "all"
86
+ Requires-Dist: requests; extra == "all"
87
+ Requires-Dist: rich; extra == "all"
88
+ Requires-Dist: sounddevice; extra == "all"
89
+ Requires-Dist: supabase; extra == "all"
90
+ Requires-Dist: tabulate; extra == "all"
91
+ Requires-Dist: tantivy; extra == "all"
92
+ Requires-Dist: tenacity; extra == "all"
93
+ Requires-Dist: tiktoken; extra == "all"
94
+ Requires-Dist: unstructured[all-docs,local-inference]; extra == "all"
95
+ Requires-Dist: xlwings; extra == "all"
96
+ Provides-Extra: langchain
97
+ Requires-Dist: langchain; extra == "langchain"
98
+ Requires-Dist: langchain_experimental; extra == "langchain"
99
+ Requires-Dist: langchain-community; extra == "langchain"
100
+ Requires-Dist: langsmith; extra == "langchain"
101
+ Requires-Dist: langchain-unstructured; extra == "langchain"
102
+ Provides-Extra: azure
103
+ Requires-Dist: azure-identity; extra == "azure"
104
+ Requires-Dist: azure-storage-blob; extra == "azure"
105
+ Provides-Extra: cli
106
+ Requires-Dist: jsonschema>=4.21.1; extra == "cli"
107
+ Requires-Dist: rich; extra == "cli"
108
+ Provides-Extra: database
109
+ Requires-Dist: asyncpg; extra == "database"
110
+ Requires-Dist: supabase; extra == "database"
111
+ Requires-Dist: sqlalchemy; extra == "database"
112
+ Requires-Dist: pg8000; extra == "database"
113
+ Requires-Dist: pgvector; extra == "database"
114
+ Requires-Dist: psycopg2-binary; extra == "database"
115
+ Requires-Dist: lancedb; extra == "database"
116
+ Requires-Dist: tantivy; extra == "database"
117
+ Provides-Extra: pipeline
118
+ Requires-Dist: GitPython; extra == "pipeline"
119
+ Requires-Dist: lark; extra == "pipeline"
120
+ Requires-Dist: langchain>=0.2.16; extra == "pipeline"
121
+ Requires-Dist: langchain-unstructured; extra == "pipeline"
122
+ Requires-Dist: psutil; extra == "pipeline"
123
+ Requires-Dist: pypdf; extra == "pipeline"
124
+ Requires-Dist: pytesseract; extra == "pipeline"
125
+ Requires-Dist: tabulate; extra == "pipeline"
126
+ Requires-Dist: unstructured[all-docs,local-inference]; extra == "pipeline"
127
+ Provides-Extra: gcp
128
+ Requires-Dist: aiofiles; extra == "gcp"
129
+ Requires-Dist: anthropic[vertex]; extra == "gcp"
130
+ Requires-Dist: google-api-python-client; extra == "gcp"
131
+ Requires-Dist: google-auth-httplib2; extra == "gcp"
132
+ Requires-Dist: google-auth-oauthlib; extra == "gcp"
133
+ Requires-Dist: google-cloud-alloydb-connector[pg8000]; extra == "gcp"
134
+ Requires-Dist: google-cloud-aiplatform>=1.58.0; extra == "gcp"
135
+ Requires-Dist: google-cloud-bigquery; extra == "gcp"
136
+ Requires-Dist: google-cloud-build; extra == "gcp"
137
+ Requires-Dist: google-cloud-service-control; extra == "gcp"
138
+ Requires-Dist: google-cloud-storage; extra == "gcp"
139
+ Requires-Dist: google-cloud-logging; extra == "gcp"
140
+ Requires-Dist: google-cloud-pubsub; extra == "gcp"
141
+ Requires-Dist: google-cloud-discoveryengine>=0.13.4; extra == "gcp"
142
+ Requires-Dist: google-cloud-texttospeech; extra == "gcp"
143
+ Requires-Dist: google-genai>=0.2.2; extra == "gcp"
144
+ Requires-Dist: google-generativeai>=0.8.3; extra == "gcp"
145
+ Requires-Dist: langchain; extra == "gcp"
146
+ Requires-Dist: langchain-google-genai>=2.0.0; extra == "gcp"
147
+ Requires-Dist: langchain_google_alloydb_pg>=0.2.2; extra == "gcp"
148
+ Requires-Dist: langchain-google-vertexai; extra == "gcp"
149
+ Requires-Dist: pillow; extra == "gcp"
150
+ Provides-Extra: ollama
151
+ Requires-Dist: pillow; extra == "ollama"
152
+ Requires-Dist: ollama>=0.4.7; extra == "ollama"
153
+ Provides-Extra: openai
154
+ Requires-Dist: langchain-openai>=0.3.2; extra == "openai"
155
+ Requires-Dist: tiktoken; extra == "openai"
156
+ Provides-Extra: anthropic
157
+ Requires-Dist: langchain-anthropic>=0.1.23; extra == "anthropic"
158
+ Requires-Dist: mcp; extra == "anthropic"
159
+ Provides-Extra: tools
160
+ Requires-Dist: openapi-spec-validator; extra == "tools"
161
+ Requires-Dist: playwright; extra == "tools"
162
+ Provides-Extra: http
163
+ Requires-Dist: fastapi; extra == "http"
164
+ Requires-Dist: flask; extra == "http"
165
+ Requires-Dist: gunicorn; extra == "http"
166
+ Requires-Dist: httpcore; extra == "http"
167
+ Requires-Dist: httpx; extra == "http"
168
+ Requires-Dist: langchain; extra == "http"
169
+ Requires-Dist: langfuse; extra == "http"
170
+ Requires-Dist: python-socketio; extra == "http"
171
+ Requires-Dist: requests; extra == "http"
172
+ Requires-Dist: tenacity; extra == "http"
173
+ Provides-Extra: excel
174
+ Requires-Dist: xlwings; extra == "excel"
175
+ Requires-Dist: requests; extra == "excel"
176
+ Requires-Dist: rich; extra == "excel"
177
+ Provides-Extra: iac
178
+ Requires-Dist: python-hcl2; extra == "iac"
179
+ Provides-Extra: tts
180
+ Requires-Dist: google-cloud-texttospeech; extra == "tts"
181
+ Requires-Dist: numpy; extra == "tts"
182
+ Requires-Dist: sounddevice; extra == "tts"
183
+ Provides-Extra: video
184
+ Requires-Dist: opencv-python; extra == "video"
185
+ Dynamic: license-file
186
+
187
+ # Sunholo Python Library
188
+
189
+ [![PyPi Version](https://img.shields.io/pypi/v/sunholo.svg)](https://pypi.python.org/pypi/sunholo/)
190
+ [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
191
+ [![Python Version](https://img.shields.io/pypi/pyversions/sunholo.svg)](https://pypi.python.org/pypi/sunholo/)
192
+
193
+ 🚀 **AI DevOps framework for building GenAI applications on Google Cloud Platform**
194
+
195
+ Sunholo is a comprehensive Python framework that streamlines the development, deployment, and management of Generative AI applications (VACs - Virtual Agent Computers). It provides a configuration-driven approach with deep integration into Google Cloud services while supporting multiple AI providers.
196
+
197
+ ## 🎯 What is Sunholo?
198
+
199
+ Sunholo helps you:
200
+ - 🤖 Build conversational AI agents with any LLM provider (Vertex AI, OpenAI, Anthropic, Ollama)
201
+ - ☁️ Deploy to Google Cloud Run with automatic scaling
202
+ - 🗄️ Use AlloyDB and Discovery Engine for vector storage and search
203
+ - 🔄 Handle streaming responses and async processing
204
+ - 📄 Process documents with chunking and embedding pipelines
205
+ - 🔧 Manage complex configurations with YAML files
206
+ - 🎨 Create APIs, web apps, and chat bots
207
+
208
+ ## 🚀 Quick Start
209
+
210
+ ### Prerequisites
211
+
212
+ Install [uv](https://docs.astral.sh/uv/) - a fast, modern Python package manager:
213
+
214
+ ```bash
215
+ # macOS/Linux
216
+ curl -LsSf https://astral.sh/uv/install.sh | sh
217
+
218
+ # Windows
219
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
220
+ ```
221
+
222
+ ### Installation
223
+
224
+ ```bash
225
+ # Install with CLI tools (recommended)
226
+ uv tool install --from "sunholo[cli]" sunholo
227
+
228
+ # Install with all features including GCP
229
+ uv tool install --from "sunholo[cli]" sunholo --with "sunholo[all]"
230
+ ```
231
+
232
+ ### Your First VAC
233
+
234
+ 1. **Initialize a new project:**
235
+ ```bash
236
+ sunholo init my-ai-agent
237
+ cd my-ai-agent
238
+ ```
239
+
240
+ 2. **Configure your AI agent:**
241
+ Edit `config/vac_config.yaml`:
242
+ ```yaml
243
+ kind: vacConfig
244
+ apiVersion: v1
245
+ vac:
246
+ my-agent:
247
+ llm: vertex
248
+ model: gemini-1.5-pro
249
+ agent: simple
250
+ description: "My AI agent powered by Google Cloud"
251
+ ```
252
+
253
+ 3. **Chat with your agent locally:**
254
+ ```bash
255
+ sunholo vac chat my-agent
256
+ ```
257
+
258
+ 4. **Deploy to Google Cloud Run:**
259
+ ```bash
260
+ sunholo deploy my-agent
261
+ ```
262
+
263
+ ## 📋 Features
264
+
265
+ ### Core Capabilities
266
+
267
+ - **Multi-Model Support**: Integrate Vertex AI, OpenAI, Anthropic, Ollama in one app
268
+ - **Document Processing**: Chunk, embed, and index documents with Discovery Engine
269
+ - **Vector Databases**: Native support for AlloyDB, LanceDB, Supabase
270
+ - **Streaming**: Real-time response streaming for chat applications
271
+ - **Async Processing**: Pub/Sub integration for background tasks
272
+ - **Authentication**: Built-in Google Cloud IAM and custom auth
273
+
274
+ ### Google Cloud Integration
275
+
276
+ - **Vertex AI**: Access Gemini, PaLM, and custom models
277
+ - **AlloyDB**: PostgreSQL-compatible vector database
278
+ - **Discovery Engine**: Enterprise search and RAG
279
+ - **Cloud Run**: Serverless deployment
280
+ - **Cloud Storage**: Document and file management
281
+ - **Pub/Sub**: Asynchronous message processing
282
+ - **Cloud Logging**: Centralized logging
283
+
284
+ ### Framework Support
285
+
286
+ - **Web Frameworks**: Flask and FastAPI templates
287
+ - **AI Frameworks**: LangChain and LlamaIndex integration
288
+ - **Observability**: Langfuse for tracing and monitoring
289
+ - **API Standards**: OpenAI-compatible endpoints
290
+
291
+ ## 🛠 Installation Options
292
+
293
+ ### Using uv
294
+
295
+ ```bash
296
+ # Core CLI features
297
+ uv tool install --from "sunholo[cli]" sunholo
298
+
299
+ # With Google Cloud Platform integration
300
+ uv tool install --from "sunholo[cli]" sunholo --with "sunholo[gcp]"
301
+
302
+ # With specific LLM providers
303
+ uv tool install --from "sunholo[cli]" sunholo --with "sunholo[openai]"
304
+ uv tool install --from "sunholo[cli]" sunholo --with "sunholo[anthropic]"
305
+
306
+ # With database support
307
+ uv tool install --from "sunholo[cli]" sunholo --with "sunholo[database]"
308
+
309
+ # Everything
310
+ uv tool install --from "sunholo[cli]" sunholo --with "sunholo[all]"
311
+ ```
312
+
313
+ ### Managing Installations
314
+
315
+ ```bash
316
+ # Upgrade
317
+ uv tool upgrade sunholo
318
+
319
+ # List installed
320
+ uv tool list
321
+
322
+ # Uninstall
323
+ uv tool uninstall sunholo
324
+ ```
325
+
326
+ ### Development Setup
327
+
328
+ ```bash
329
+ # Clone repository
330
+ git clone https://github.com/sunholo-data/sunholo-py.git
331
+ cd sunholo-py
332
+
333
+ # Install in development mode
334
+ uv venv
335
+ uv pip install -e ".[all]"
336
+
337
+ # Run tests
338
+ pytest tests/
339
+ ```
340
+
341
+ ## ⚙️ Configuration
342
+
343
+ Sunholo uses YAML configuration files:
344
+
345
+ ```yaml
346
+ # config/vac_config.yaml
347
+ kind: vacConfig
348
+ apiVersion: v1
349
+ gcp_config:
350
+ project_id: my-gcp-project
351
+ location: us-central1
352
+ vac:
353
+ my-agent:
354
+ llm: vertex
355
+ model: gemini-1.5-pro
356
+ agent: langchain
357
+ memory:
358
+ - alloydb:
359
+ project_id: my-gcp-project
360
+ region: us-central1
361
+ cluster: my-cluster
362
+ instance: my-instance
363
+ tools:
364
+ - search
365
+ - calculator
366
+ ```
367
+
368
+ ## 🔧 CLI Commands
369
+
370
+ ```bash
371
+ # Project Management
372
+ sunholo init <project-name> # Create new project
373
+ sunholo list-configs # List all configurations
374
+ sunholo list-configs --validate # Validate configs
375
+
376
+ # Development
377
+ sunholo vac chat <vac-name> # Chat with a VAC locally
378
+ sunholo vac list # List available VACs
379
+ sunholo proxy start <service> # Start local proxy to cloud service
380
+
381
+ # Deployment
382
+ sunholo deploy <vac-name> # Deploy to Cloud Run
383
+ sunholo deploy <vac-name> --dev # Deploy to dev environment
384
+
385
+ # Document Processing
386
+ sunholo embed <vac-name> # Embed documents
387
+ sunholo merge-text <folder> <output> # Merge files for context
388
+
389
+ # Cloud Services
390
+ sunholo discovery-engine create <name> # Create Discovery Engine
391
+ sunholo proxy list # List running proxies
392
+ ```
393
+
394
+ ## 📝 Examples
395
+
396
+ ### Chat with History Extraction
397
+
398
+ ```python
399
+ from sunholo.utils import ConfigManager
400
+ from sunholo.components import pick_llm
401
+ from sunholo.agents import extract_chat_history
402
+
403
+ config = ConfigManager('my-agent')
404
+ llm = pick_llm(config=config)
405
+
406
+ # Extract chat history from messages
407
+ chat_history = [
408
+ {"role": "user", "content": "Hello"},
409
+ {"role": "assistant", "content": "Hi there!"}
410
+ ]
411
+ history_str = extract_chat_history(chat_history)
412
+
413
+ # Use in prompt
414
+ response = llm.invoke(f"Given this history:\n{history_str}\n\nUser: How are you?")
415
+ ```
416
+
417
+ ### Document Processing with Chunker
418
+
419
+ ```python
420
+ from sunholo.chunker import direct_file_to_embed
421
+ from sunholo.utils import ConfigManager
422
+
423
+ config = ConfigManager('my-agent')
424
+
425
+ # Process a file directly
426
+ result = direct_file_to_embed(
427
+ "document.pdf",
428
+ embed_prefix="doc",
429
+ metadata={"source": "user_upload"},
430
+ vectorstore=config.vacConfig("vectorstore")
431
+ )
432
+ ```
433
+
434
+ ### Vertex AI with Memory Tools
435
+
436
+ ```python
437
+ from sunholo.vertex import get_vertex_memories
438
+ from sunholo.utils import ConfigManager
439
+
440
+ config = ConfigManager('my-agent')
441
+
442
+ # Get Vertex AI memory configuration
443
+ memory_config = get_vertex_memories(config)
444
+
445
+ # Use with Vertex AI
446
+ if memory_config:
447
+ print(f"Memory tools configured: {memory_config}")
448
+ ```
449
+
450
+ ### Streaming Response with Flask
451
+
452
+ ```python
453
+ from sunholo.agents import send_to_qa
454
+ from flask import Response, request
455
+
456
+ @app.route('/vac/streaming/<vac_name>', methods=['POST'])
457
+ def streaming_endpoint(vac_name):
458
+ question = request.json.get('user_input')
459
+
460
+ def generate():
461
+ # Stream responses from the QA system
462
+ response = send_to_qa(
463
+ question,
464
+ vac_name=vac_name,
465
+ stream=True
466
+ )
467
+ if hasattr(response, '__iter__'):
468
+ for chunk in response:
469
+ yield f"data: {chunk}\n\n"
470
+ else:
471
+ yield f"data: {response}\n\n"
472
+
473
+ return Response(generate(), content_type='text/event-stream')
474
+ ```
475
+
476
+ ### Discovery Engine Integration
477
+
478
+ ```python
479
+ from sunholo.discovery_engine import DiscoveryEngineClient
480
+
481
+ # Initialize client
482
+ client = DiscoveryEngineClient(
483
+ project_id='my-project',
484
+ data_store_id='my-datastore'
485
+ )
486
+
487
+ # Search documents
488
+ results = client.search("What is Vertex AI?")
489
+ for result in results:
490
+ print(f"Content: {result.chunk.content}")
491
+ print(f"Score: {result.relevance_score}")
492
+ ```
493
+
494
+ ## 🧪 Testing
495
+
496
+ ```bash
497
+ # Run all tests
498
+ pytest tests/
499
+
500
+ # Run specific test file
501
+ pytest tests/test_config.py
502
+
503
+ # Run with coverage
504
+ pytest --cov=src/sunholo tests/
505
+
506
+ # Run async tests
507
+ pytest tests/test_async_genai2.py
508
+ ```
509
+
510
+ ## 📚 Documentation
511
+
512
+ - 📖 **Full Documentation**: https://dev.sunholo.com/
513
+ - 🎓 **Tutorials**: https://dev.sunholo.com/docs/howto/
514
+ - 🤖 **VAC Examples**: https://github.com/sunholo-data/vacs-public
515
+ - 🎧 **Audio Overview**: [Listen to the NotebookLM podcast](https://drive.google.com/file/d/1GvwRmiYDjPjN2hXQ8plhnVDByu6TmgCQ/view?usp=drive_link)
516
+
517
+ ## 🤝 Contributing
518
+
519
+ We welcome contributions! See our [Contributing Guidelines](CONTRIBUTING.md).
520
+
521
+ 1. Fork the repository
522
+ 2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
523
+ 3. Commit your changes (`git commit -m 'Add AmazingFeature'`)
524
+ 4. Push to the branch (`git push origin feature/AmazingFeature`)
525
+ 5. Open a Pull Request
526
+
527
+ ## 📜 License
528
+
529
+ This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE.txt) file for details.
530
+
531
+ ```
532
+ Copyright [2024] [Holosun ApS]
533
+
534
+ Licensed under the Apache License, Version 2.0 (the "License");
535
+ you may not use this file except in compliance with the License.
536
+ You may obtain a copy of the License at
537
+
538
+ http://www.apache.org/licenses/LICENSE-2.0
539
+ ```
540
+
541
+ ## 🙏 Support
542
+
543
+ - 📧 Email: multivac@sunholo.com
544
+ - 🐛 Issues: [GitHub Issues](https://github.com/sunholo-data/sunholo-py/issues)
545
+ - 💬 Discussions: [GitHub Discussions](https://github.com/sunholo-data/sunholo-py/discussions)
546
+ - 📖 Documentation: https://dev.sunholo.com/