Skip to main content

Sunholo Python Library

PyPi Version License Python Version

🚀 AI DevOps framework for building GenAI applications on Google Cloud Platform

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.

🎯 What is Sunholo?

Sunholo helps you:

  • 🤖 Build conversational AI agents with any LLM provider (Vertex AI, OpenAI, Anthropic, Ollama)
  • ☁️ Deploy to Google Cloud Run with automatic scaling
  • 🗄️ Use AlloyDB and Discovery Engine for vector storage and search
  • 🔄 Handle streaming responses and async processing
  • 📄 Process documents with chunking and embedding pipelines
  • 🔧 Manage complex configurations with YAML files
  • 🎨 Create APIs, web apps, and chat bots

🚀 Quick Start

Prerequisites

Install uv - a fast, modern Python package manager:

# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Installation

# Install with CLI tools (recommended)
uv tool install --from "sunholo[cli]" sunholo

# Install with all features including GCP
uv tool install --from "sunholo[cli]" sunholo --with "sunholo[all]"

Your First VAC

  1. Initialize a new project:
sunholo init my-ai-agent
cd my-ai-agent
  1. Configure your AI agent: Edit config/vac_config.yaml:
kind: vacConfig
apiVersion: v1
vac:
  my-agent:
    llm: vertex
    model: gemini-1.5-pro
    agent: simple
    description: "My AI agent powered by Google Cloud"
  1. Chat with your agent locally:
sunholo vac chat my-agent
  1. Run your agent as a local Flask app:
sunholo deploy my-agent

📋 Features

Core Capabilities

  • Multi-Model Support: Integrate Vertex AI, OpenAI, Anthropic, Ollama in one app
  • Document Processing: Chunk, embed, and index documents with Discovery Engine
  • Vector Databases: Native support for AlloyDB, LanceDB, Supabase
  • Streaming: Real-time response streaming for chat applications
  • Async Processing: Pub/Sub integration for background tasks
  • Authentication: Built-in Google Cloud IAM and custom auth

Google Cloud Integration

  • Vertex AI: Access Gemini, PaLM, and custom models
  • AlloyDB: PostgreSQL-compatible vector database
  • Discovery Engine: Enterprise search and RAG
  • Cloud Run: Serverless deployment
  • Cloud Storage: Document and file management
  • Pub/Sub: Asynchronous message processing
  • Cloud Logging: Centralized logging

Framework Support

  • Web Frameworks: Flask and FastAPI templates
  • AI Frameworks: LangChain and LlamaIndex integration
  • MCP Integration: Model Context Protocol server and client support
  • Observability: Langfuse for tracing and monitoring
  • API Standards: OpenAI-compatible endpoints

🛠 Installation Options

Using uv

# Core CLI features
uv tool install --from "sunholo[cli]" sunholo

# With Google Cloud Platform integration
uv tool install --from "sunholo[cli]" sunholo --with "sunholo[gcp]"

# With specific LLM providers
uv tool install --from "sunholo[cli]" sunholo --with "sunholo[openai]"
uv tool install --from "sunholo[cli]" sunholo --with "sunholo[anthropic]"

# With database support
uv tool install --from "sunholo[cli]" sunholo --with "sunholo[database]"

# Everything
uv tool install --from "sunholo[cli]" sunholo --with "sunholo[all]"

Managing Installations

# Upgrade
uv tool upgrade sunholo

# List installed
uv tool list

# Uninstall
uv tool uninstall sunholo

Development Setup

# Clone repository
git clone https://github.com/sunholo-data/sunholo-py.git
cd sunholo-py

# Install in development mode
uv venv
uv pip install -e ".[all]"

# Run tests
pytest tests/

⚙️ Configuration

Sunholo uses YAML configuration files:

# config/vac_config.yaml
kind: vacConfig
apiVersion: v1
gcp_config:
  project_id: my-gcp-project
  location: us-central1
vac:
  my-agent:
    llm: vertex
    model: gemini-1.5-pro
    agent: langchain
    memory:
      - alloydb:
          project_id: my-gcp-project
          region: us-central1
          cluster: my-cluster
          instance: my-instance
    tools:
      - search
      - calculator

🔧 CLI Commands

# Project Management
sunholo init <project-name>              # Create new project from template
sunholo list-configs                     # List all configurations
sunholo list-configs --validate          # Validate configurations

# Development
sunholo vac chat <vac-name>             # Chat with a VAC locally
sunholo vac list                        # List available VACs  
sunholo vac get-url <vac-name>          # Get Cloud Run URL for a VAC
sunholo proxy start <service>           # Start local proxy to cloud service
sunholo proxy list                      # List running proxies
sunholo deploy <vac-name>               # Run Flask app locally

# Document Processing
sunholo embed <vac-name>                # Process and embed documents
sunholo merge-text <folder> <output>    # Merge files for context

# Cloud Services
sunholo discovery-engine create <name>   # Create Discovery Engine instance
sunholo vertex list-extensions          # List Vertex AI extensions
sunholo swagger <vac-name>              # Generate OpenAPI spec

# Integration Tools
sunholo excel-init                      # Initialize Excel plugin
sunholo llamaindex <query>              # Query with LlamaIndex
sunholo mcp list-tools                  # List MCP tools
sunholo tts <text>                      # Text-to-speech synthesis

📝 Examples

Chat with History Extraction

from sunholo.utils import ConfigManager
from sunholo.components import pick_llm
from sunholo.agents import extract_chat_history

config = ConfigManager('my-agent')
llm = pick_llm(config=config)

# Extract chat history from messages
chat_history = [
    {"role": "user", "content": "Hello"},
    {"role": "assistant", "content": "Hi there!"}
]
history_str = extract_chat_history(chat_history)

# Use in prompt
response = llm.invoke(f"Given this history:\n{history_str}\n\nUser: How are you?")

Document Processing with Chunker

from sunholo.chunker import direct_file_to_embed
from sunholo.utils import ConfigManager

config = ConfigManager('my-agent')

# Process a file directly
result = direct_file_to_embed(
    "document.pdf",
    embed_prefix="doc",
    metadata={"source": "user_upload"},
    vectorstore=config.vacConfig("vectorstore")
)

Vertex AI with Memory Tools

from sunholo.vertex import get_vertex_memories
from sunholo.utils import ConfigManager

config = ConfigManager('my-agent')

# Get Vertex AI memory configuration
memory_config = get_vertex_memories(config)

# Use with Vertex AI
if memory_config:
    print(f"Memory tools configured: {memory_config}")

Streaming Response with Flask

from sunholo.agents import send_to_qa
from flask import Response, request

@app.route('/vac/streaming/<vac_name>', methods=['POST'])
def streaming_endpoint(vac_name):
    question = request.json.get('user_input')
    
    def generate():
        # Stream responses from the QA system
        response = send_to_qa(
            question, 
            vac_name=vac_name,
            stream=True
        )
        if hasattr(response, '__iter__'):
            for chunk in response:
                yield f"data: {chunk}\n\n"
        else:
            yield f"data: {response}\n\n"
    
    return Response(generate(), content_type='text/event-stream')

Discovery Engine Integration

from sunholo.discovery_engine import DiscoveryEngineClient

# Initialize client
client = DiscoveryEngineClient(
    project_id='my-project',
    data_store_id='my-datastore'
)

# Search documents
results = client.search("What is Vertex AI?")
for result in results:
    print(f"Content: {result.chunk.content}")
    print(f"Score: {result.relevance_score}")

🧪 Testing

# Run all tests
pytest tests/

# Run specific test file
pytest tests/test_config.py

# Run with coverage
pytest --cov=src/sunholo tests/

# Run async tests
pytest tests/test_async_genai2.py

📚 Documentation

🤝 Contributing

We welcome contributions! See our Contributing Guidelines.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

📜 License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Copyright [2024] [Holosun ApS]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

🙏 Support

Release files for sunholo 0.146.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sunholo 0.146.1
File Size Uploaded
sunholo-0.146.1.tar.gz 335.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sunholo 0.146.1
File Interpreter ABI Platform
sunholo-0.146.1-py3-none-any.whl Python 3 none any Details

Total release size: 739.7 kB

Release files / sunholo-0.146.1.tar.gz

Download URL sunholo-0.146.1.tar.gz
Size 335.5 kB
Tags Source
SHA-256 checksum
How to use checksums
ca32a9618e3e0a883c4959e910a2370827b44ca7ed90b77090c573d8466f433d
BLAKE2b-256 checksum
How to use checksums
b3e9cc985a213083c95cf9fc3f22bf7cc55baf8c4618b06da44beb1ee60f9bc1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release files / sunholo-0.146.1-py3-none-any.whl

Download URL sunholo-0.146.1-py3-none-any.whl
Size 404.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0e44826dbae392c25c1a617682e66cb970d74e94e91a045b9478c3c744c75c0b
BLAKE2b-256 checksum
How to use checksums
2ab597c4c56cbb6577f3aa9058c39bfc173be85763802be2bc13d687f401c99d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release history Release notifications | RSS feed

This release

0.146.1 This release

2 release files

0.99.9

2 release files

0.99.8

2 release files

0.99.7

2 release files

0.99.6

2 release files

0.99.5

2 release files

0.99.4

2 release files

0.99.3

2 release files

0.99.2

2 release files

0.99.1

2 release files

0.99.0

2 release files

0.98.8

2 release files

0.98.7

2 release files

0.98.6

2 release files

0.98.5

2 release files

0.98.4

2 release files

0.98.3

2 release files

0.98.2

2 release files

0.98.1

2 release files

0.98.0

2 release files

0.97.9

2 release files

0.97.8

2 release files

0.97.7

2 release files

0.97.6

2 release files

0.97.2

2 release files

0.97.1

2 release files

0.96.9

2 release files

0.96.8

2 release files

0.96.7

2 release files

0.96.6

2 release files

0.96.5

2 release files

0.96.3

2 release files

0.96.2

2 release files

0.96.1

2 release files

0.96.0

2 release files

0.95.5

2 release files

0.95.4

2 release files

0.95.3

2 release files

0.95.2

2 release files

0.95.1

2 release files

0.95.0

2 release files

0.94.0

2 release files

0.93.0

2 release files

0.92.6

2 release files

0.92.5

2 release files

0.92.4

2 release files

0.92.3

2 release files

0.89.1

2 release files

0.88.4

2 release files

0.88.3

2 release files

0.88.2

2 release files

0.88.0

2 release files

0.87.0

2 release files

0.86.1

2 release files

0.86.0

2 release files

0.85.3

2 release files

0.85.2

2 release files

0.84.9

2 release files

0.84.8

2 release files

0.84.7

2 release files

0.84.5

2 release files

0.84.3

2 release files

0.84.2

2 release files

0.84.1

2 release files

0.84.0

2 release files

0.80.4

2 release files

0.80.3

2 release files

0.80.2

2 release files

0.80.1

2 release files

0.80.0

2 release files

0.79.6

2 release files

0.79.5

2 release files

0.79.4

2 release files

0.79.3

2 release files

0.79.2

2 release files

0.79.1

2 release files

0.79.0

2 release files

0.78.5

2 release files

0.78.4

2 release files

0.78.3

2 release files

0.78.2

2 release files

0.78.1

2 release files

0.77.4

2 release files

0.77.3

2 release files

0.77.2

2 release files

0.77.1

2 release files

0.77.0

2 release files

0.76.9

2 release files

0.76.8

2 release files

0.76.7

2 release files

0.76.6

2 release files

0.76.5

2 release files

0.76.4

2 release files

0.76.3

2 release files

0.76.2

2 release files

0.75.1

2 release files

0.75.0

2 release files

0.70.6

2 release files

0.70.5

2 release files

0.70.4

2 release files

0.70.3

2 release files

0.70.2

2 release files

0.70.1

2 release files

0.70.0

2 release files

0.69.9

2 release files

0.69.8

2 release files

0.69.6

2 release files

0.69.5

2 release files

0.69.4

2 release files

0.69.3

2 release files

0.69.2

2 release files

0.69.0

2 release files

0.68.1

2 release files

0.68.0

2 release files

0.67.8

2 release files

0.67.7

2 release files

0.67.6

2 release files

0.67.5

2 release files

0.67.4

2 release files

0.67.3

2 release files

0.67.2

2 release files

0.67.0

2 release files

0.66.9

2 release files

0.66.8

2 release files

0.66.7

2 release files

0.66.5

2 release files

0.66.4

2 release files

0.66.3

2 release files

0.66.2

2 release files

0.66.1

2 release files

0.66.0

2 release files

0.64.9

2 release files

0.64.8

2 release files

0.64.6

2 release files

0.64.5

2 release files

0.64.4

2 release files

0.64.3

2 release files

0.63.0

2 release files

0.60.3

2 release files

0.60.2

2 release files

0.60.1

2 release files

0.60.0

2 release files

0.59.7

2 release files

0.59.6

2 release files

0.59.5

2 release files

0.59.4

2 release files

0.59.3

2 release files

0.59.2

2 release files

0.59.1

2 release files

0.59.0

2 release files

0.58.5

2 release files

0.58.4

2 release files

0.58.3

2 release files

0.58.2

2 release files

0.58.0

2 release files

0.57.2

2 release files

0.57.1

2 release files

0.57.0

2 release files

0.56.7

2 release files

0.56.6

2 release files

0.56.5

2 release files

0.56.3

2 release files

0.56.2

2 release files

0.56.1

2 release files

0.55.9

2 release files

0.55.8

2 release files

0.55.7

2 release files

0.55.6

2 release files

0.55.5

2 release files

0.55.4

2 release files

0.55.3

2 release files

0.55.2

2 release files

0.55.1

2 release files

0.55.0

2 release files

0.54.9

2 release files

0.54.8

2 release files

0.54.7

2 release files

0.54.6

2 release files

0.54.4

2 release files

0.54.3

2 release files

0.54.2

2 release files

0.54.1

2 release files

0.54.0

2 release files

0.53.3

2 release files

0.53.2

2 release files

0.53.1

2 release files

0.53.0

2 release files

0.52.2

2 release files

0.52.1

2 release files

0.52.0

2 release files

0.48.1

2 release files

0.48.0

2 release files

0.47.0

2 release files

0.46.4

2 release files

0.46.3

2 release files

0.46.2

2 release files

0.46.0

2 release files

0.45.2

2 release files

0.45.1

2 release files

0.45.0

2 release files

0.44.5

2 release files

0.44.4

2 release files

0.44.3

2 release files

0.44.2

2 release files

0.44.1

2 release files

0.44.0

2 release files

0.43.8

2 release files

0.43.7

2 release files

0.43.6

2 release files

0.43.5

2 release files

0.43.4

2 release files

0.43.3

2 release files

0.43.2

2 release files

0.43.1

2 release files

0.43.0

2 release files

0.42.8

2 release files

0.42.7

2 release files

0.42.6

2 release files

0.42.5

2 release files

0.42.4

2 release files

0.42.3

2 release files

0.42.2

2 release files

0.42.1

2 release files

0.42.0

2 release files

0.35.0

2 release files

0.34.8

2 release files

0.34.7

2 release files

0.34.6

2 release files

0.34.5

2 release files

0.34.4

2 release files

0.34.3

2 release files

0.34.2

2 release files

0.34.1

2 release files

0.34.0

2 release files

0.33.0

2 release files

0.32.9

2 release files

0.32.8

2 release files

0.32.7

2 release files

0.32.6

2 release files

0.32.5

2 release files

0.32.4

2 release files

0.32.3

2 release files

0.32.2

2 release files

0.32.1

2 release files

0.32.0

2 release files

0.31.9

2 release files

0.31.8

2 release files

0.31.7

2 release files

0.31.6

2 release files

0.31.5

2 release files

0.31.4

2 release files

0.31.3

2 release files

0.31.2

2 release files

0.31.1

2 release files

0.31.0

2 release files

0.30.9

2 release files

0.30.7

2 release files

0.30.6

2 release files

0.30.4

2 release files

0.30.3

2 release files

0.30.2

2 release files

0.30.1

2 release files

0.29.6

2 release files

0.29.5

2 release files

0.29.3

2 release files

0.29.2

2 release files

0.29.1

2 release files

0.29.0

2 release files

0.28.6

2 release files

0.28.5

2 release files

0.28.4

2 release files

0.28.3

2 release files

0.28.2

2 release files

0.28.1

2 release files

0.28.0

2 release files

0.27.8

2 release files

0.27.7

2 release files

0.27.6

2 release files

0.27.5

2 release files

0.27.4

2 release files

0.27.3

2 release files

0.27.2

2 release files

0.27.1

2 release files

0.27.0

2 release files

0.25.0

2 release files

0.24.0

2 release files

0.23.4

2 release files

0.23.3

2 release files

0.23.2

2 release files

0.23.1

2 release files

0.23.0

2 release files

0.22.0

2 release files

0.20.1

2 release files

0.20.0

2 release files

0.19.1

2 release files

0.19.0

2 release files

0.18.1

2 release files

0.18.0

2 release files

0.17.2

2 release files

0.17.1

2 release files

0.17.0

2 release files

0.16.1

2 release files

0.16.0

2 release files

0.15.2

2 release files

0.15.1

2 release files

0.15.0

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.8.18

2 release files

0.8.17

2 release files

0.8.16

2 release files

0.8.15

2 release files

0.8.14

2 release files

0.8.13

2 release files

0.8.12

2 release files

0.8.11

2 release files

0.8.10

2 release files

0.8.9

2 release files

0.8.8

2 release files

0.8.7

2 release files

0.8.6

2 release files

0.8.5

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.9

2 release files

0.7.8

2 release files

0.7.7

2 release files

0.7.6

2 release files

0.7.5

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.12

2 release files

0.6.11

2 release files

0.6.10

2 release files

0.6.9

2 release files

0.6.8

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.14

2 release files

0.3.13

2 release files

0.3.12

2 release files

0.3.11

2 release files

0.3.10

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.1.5

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page