Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
375c0be
feat(galileo-adk): rebrand to SPLUNK_AO_* env vars and SplunkAO* clas…
adityamehra Jun 16, 2026
788e932
fix(galileo-adk): rename package to splunk-ao-adk and reset to v0.1.0
adityamehra Jun 16, 2026
97db4ff
Merge branch 'main' into fix/splunk-ao-adk-pyproject
adityamehra Jun 17, 2026
67476e6
refactor(galileo-adk): rename dir to splunk-ao-adk and module to splu…
adityamehra Jun 17, 2026
bcdc1a5
fix(splunk-ao-adk): correct version ranges and restore galileo-core[t…
adityamehra Jun 18, 2026
9a60083
Merge branch 'main' into fix/splunk-ao-adk-pyproject
adityamehra Jun 18, 2026
5c7b5ff
ci: add GitHub Actions workflow to test splunk-ao-adk
adityamehra Jun 23, 2026
143c00b
fix(ci): use uv run pip list to avoid VIRTUAL_ENV override in show-ve…
adityamehra Jun 23, 2026
b8c1baf
fix(ci): use pip show instead of pip list grep for installed versions…
adityamehra Jun 23, 2026
3f6e4d9
fix(ci): use uv tree --depth 1 for show-versions step to avoid VIRTUA…
adityamehra Jun 23, 2026
ca6ce24
fix(dev): pin PyPI as default uv index to bypass Splunk Artifactory i…
adityamehra Jun 23, 2026
e369895
fix(dev): add uv.toml to splunk-ao-adk to replace global Artifactory …
adityamehra Jun 23, 2026
c9eda22
fix(ci): update python matrix
adityamehra Jun 23, 2026
0adcca2
fix(dev): rename missed galileo logger
adityamehra Jun 23, 2026
653bc4d
fix(ci): Add cache
adityamehra Jun 24, 2026
abf7d4e
fix(ci): cache for uv not supported
adityamehra Jun 24, 2026
18c0829
fix(ci): point uv cache-dependency-glob to action's uv.lock for prope…
adityamehra Jun 24, 2026
bd8ea35
fix(ci): point uv cache-dependency-glob to action's pyproject.toml
adityamehra Jun 24, 2026
7d50a76
fix(ci): point uv cache-dependency-glob to action's pyproject.toml
adityamehra Jun 24, 2026
07cae2a
feat(ci): add Test PyPI release workflow for splunk-ao
adityamehra Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .github/workflows/ci-tests-splunk-ao-adk.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Test splunk-ao-adk

on:
push:
branches: [main]
paths:
- 'splunk-ao-adk/**'
- '.github/workflows/ci-tests-splunk-ao-adk.yaml'
pull_request:
paths:
- 'splunk-ao-adk/**'
- '.github/workflows/ci-tests-splunk-ao-adk.yaml'

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

jobs:
test:
name: Python ${{ matrix.python-version }}
strategy:
fail-fast: false
matrix:
python-version: ["3.11", "3.12", "3.13", "3.14"]

runs-on: ubuntu-latest
# Hard cap per matrix job to bail out fast on real hangs.
timeout-minutes: 30

defaults:
run:
working-directory: splunk-ao-adk

steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: ${{ matrix.python-version }}

- name: Install uv
uses: astral-sh/setup-uv@681c641aba71e4a1c380be3ab5e12ad51f415867 # v7.1.6
with:
enable-cache: true
cache-dependency-glob: "**/splunk-ao-adk/pyproject.toml"

# uv sources in pyproject.toml pins splunk-ao to the local monorepo root
# as an editable install, so this always tests against the latest local code.
# pytest pythonpath includes ".." (the repo root) so test_support is importable.
- name: Install dependencies
run: uv sync --dev

- name: Show installed versions
run: uv pip list | grep -E "^(galileo|google-adk|splunk-ao)"

- name: Run type check
run: uv run mypy src/

- name: Run tests
run: uv run pytest --cov=splunk_ao_adk --cov-report=xml
71 changes: 71 additions & 0 deletions .github/workflows/release-splunk-ao-test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Release splunk-ao to Test PyPI

on:
workflow_dispatch:
inputs:
version:
description: 'Version to publish (e.g., 1.2.3, 2.0.0b1). Leave empty to use the version already in pyproject.toml.'
required: false
type: string

jobs:
build:
name: Build package
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get-version.outputs.version }}
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Install Poetry
run: pipx install poetry==2.4.1

- name: Override version
if: inputs.version != ''
env:
INPUT_VERSION: ${{ inputs.version }}
run: |
poetry version "$INPUT_VERSION"
sed -i "s/__version__ = \".*\"/__version__ = \"${INPUT_VERSION}\"/" src/splunk_ao/__init__.py

- name: Get current version
id: get-version
run: echo "version=$(poetry version --short)" >> "$GITHUB_OUTPUT"

- name: Build package
run: poetry build

- name: Upload distributables
uses: actions/upload-artifact@v4
with:
name: splunk-ao-${{ steps.get-version.outputs.version }}
path: dist/

publish:
name: Publish to Test PyPI
needs: build
runs-on: ubuntu-latest
permissions:
id-token: write # Required for OIDC trusted publishing
environment:
name: testpypi
url: https://test.pypi.org/project/splunk-ao/

steps:
- name: Download distributables
uses: actions/download-artifact@v4
with:
name: splunk-ao-${{ needs.build.outputs.version }}
path: dist/

- name: Publish to Test PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
repository-url: https://test.pypi.org/legacy/
verbose: true
print-hash: true
13 changes: 0 additions & 13 deletions galileo-adk/src/galileo_adk/__init__.py

This file was deleted.

File renamed without changes.
File renamed without changes.
4 changes: 2 additions & 2 deletions galileo-adk/CONTRIBUTING.md → splunk-ao-adk/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ This package is part of the [galileo-python](https://github.com/rungalileo/galil
galileo-python/
├── src/splunk_ao/ ← Main Galileo SDK
└── galileo-adk/
├── src/galileo_adk/
├── src/splunk_ao_adk/
├── tests/
├── pyproject.toml
└── README.md
Expand Down Expand Up @@ -124,7 +124,7 @@ source .venv/bin/activate
pytest tests -v

# Run with coverage
pytest tests --cov=galileo_adk --cov-report=term-missing
pytest tests --cov=splunk_ao_adk --cov-report=term-missing

# Run linting
ruff check src/
Expand Down
64 changes: 32 additions & 32 deletions galileo-adk/README.md → splunk-ao-adk/README.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
# galileo-adk
# splunk-ao-adk

[![PyPI version](https://img.shields.io/pypi/v/galileo-adk.svg)](https://pypi.org/project/galileo-adk/)
[![Python versions](https://img.shields.io/pypi/pyversions/galileo-adk.svg)](https://pypi.org/project/galileo-adk/)
[![License](https://img.shields.io/pypi/l/galileo-adk.svg)](https://github.com/rungalileo/galileo-python/blob/main/LICENSE)
[![PyPI version](https://img.shields.io/pypi/v/splunk-ao-adk.svg)](https://pypi.org/project/splunk-ao-adk/)
[![Python versions](https://img.shields.io/pypi/pyversions/splunk-ao-adk.svg)](https://pypi.org/project/splunk-ao-adk/)
[![License](https://img.shields.io/pypi/l/splunk-ao-adk.svg)](https://github.com/splunk/splunk-ao-python/blob/main/LICENSE)

Galileo observability for [Google ADK](https://github.com/google/adk-python) agents. Automatic tracing of agent runs, LLM calls, and tool executions.
Splunk AO observability for [Google ADK](https://github.com/google/adk-python) agents. Automatic tracing of agent runs, LLM calls, and tool executions.

## Installation

```bash
pip install galileo-adk
pip install splunk-ao-adk
```

**Requirements:** Python 3.10+, a [Galileo API key](https://www.rungalileo.io/), and a [Google AI API key](https://aistudio.google.com/apikey)
**Requirements:** Python 3.10+, a [Splunk AO API key](https://www.splunk.com/), and a [Google AI API key](https://aistudio.google.com/apikey)

## Quick Start

```python
import asyncio
from galileo_adk import GalileoADKPlugin
from splunk_ao_adk import SplunkAOADKPlugin
from google.adk.runners import Runner
from google.adk.agents import LlmAgent
from google.genai import types

async def main():
plugin = GalileoADKPlugin(project="my-project", log_stream="production")
plugin = SplunkAOADKPlugin(project="my-project", log_stream="production")
agent = LlmAgent(name="assistant", model="gemini-2.0-flash", instruction="You are helpful.")
runner = Runner(agent=agent, plugins=[plugin])

Expand All @@ -34,33 +34,33 @@ async def main():
print(event.content.parts[0].text)

if __name__ == "__main__":
# Set environment variables: GALILEO_API_KEY, GOOGLE_API_KEY
# Set environment variables: SPLUNK_AO_API_KEY, GOOGLE_API_KEY
asyncio.run(main())
```

## Configuration

| Parameter | Environment Variable | Description |
|-----------|---------------------|-------------|
| `project` | `GALILEO_PROJECT` | Project name (required unless `ingestion_hook` provided) |
| `log_stream` | `GALILEO_LOG_STREAM` | Log stream name (required unless `ingestion_hook` provided) |
| `ingestion_hook` | - | Custom callback for trace data (bypasses Galileo backend) |
| `project` | `SPLUNK_AO_PROJECT` | Project name (required unless `ingestion_hook` provided) |
| `log_stream` | `SPLUNK_AO_LOG_STREAM` | Log stream name (required unless `ingestion_hook` provided) |
| `ingestion_hook` | - | Custom callback for trace data (bypasses Splunk AO backend) |

## Features

### Session Tracking

All traces with the same `session_id` are automatically grouped into a Galileo session, enabling conversation-level tracking:
All traces with the same `session_id` are automatically grouped into a Splunk AO session, enabling conversation-level tracking:

```python
import asyncio
from galileo_adk import GalileoADKPlugin
from splunk_ao_adk import SplunkAOADKPlugin
from google.adk.runners import Runner
from google.adk.agents import LlmAgent
from google.genai import types

async def main():
plugin = GalileoADKPlugin(project="my-project", log_stream="production")
plugin = SplunkAOADKPlugin(project="my-project", log_stream="production")
agent = LlmAgent(name="assistant", model="gemini-2.0-flash", instruction="You are helpful.")
runner = Runner(agent=agent, plugins=[plugin])

Expand All @@ -80,7 +80,7 @@ async def main():
print(f"Response 2: {event.content.parts[0].text}")

if __name__ == "__main__":
# Set environment variables: GALILEO_API_KEY, GOOGLE_API_KEY
# Set environment variables: SPLUNK_AO_API_KEY, GOOGLE_API_KEY
asyncio.run(main())
```

Expand All @@ -90,14 +90,14 @@ Attach custom metadata to traces using ADK's `RunConfig`. Metadata is propagated

```python
import asyncio
from galileo_adk import GalileoADKPlugin
from splunk_ao_adk import SplunkAOADKPlugin
from google.adk.runners import Runner
from google.adk.agents import LlmAgent
from google.adk.agents.run_config import RunConfig
from google.genai import types

async def main():
plugin = GalileoADKPlugin(project="my-project", log_stream="production")
plugin = SplunkAOADKPlugin(project="my-project", log_stream="production")
agent = LlmAgent(name="assistant", model="gemini-2.0-flash", instruction="You are helpful.")
runner = Runner(agent=agent, plugins=[plugin])

Expand All @@ -121,7 +121,7 @@ async def main():
print(event.content.parts[0].text)

if __name__ == "__main__":
# Set environment variables: GALILEO_API_KEY, GOOGLE_API_KEY
# Set environment variables: SPLUNK_AO_API_KEY, GOOGLE_API_KEY
asyncio.run(main())
```

Expand All @@ -131,13 +131,13 @@ For granular control over which callbacks to use, attach them directly to your a

```python
import asyncio
from galileo_adk import GalileoADKCallback
from splunk_ao_adk import SplunkAOADKCallback
from google.adk.runners import Runner
from google.adk.agents import LlmAgent
from google.genai import types

async def main():
callback = GalileoADKCallback(project="my-project", log_stream="production")
callback = SplunkAOADKCallback(project="my-project", log_stream="production")

agent = LlmAgent(
name="assistant",
Expand All @@ -158,16 +158,16 @@ async def main():
print(event.content.parts[0].text)

if __name__ == "__main__":
# Set environment variables: GALILEO_API_KEY, GOOGLE_API_KEY
# Set environment variables: SPLUNK_AO_API_KEY, GOOGLE_API_KEY
asyncio.run(main())
```

### Retriever Spans

By default, all `FunctionTool` calls are logged as tool spans. To log a retriever function as a **retriever span** (enabling RAG quality metrics in Galileo), decorate it with `@splunk_ao_retriever`:
By default, all `FunctionTool` calls are logged as tool spans. To log a retriever function as a **retriever span** (enabling RAG quality metrics in Splunk AO), decorate it with `@splunk_ao_retriever`:

```python
from galileo_adk import splunk_ao_retriever
from splunk_ao_adk import splunk_ao_retriever
from google.adk.tools import FunctionTool

@splunk_ao_retriever
Expand All @@ -181,20 +181,20 @@ tool = FunctionTool(search_docs)

### Ingestion Hook

Intercept traces for custom processing before forwarding to Galileo:
Intercept traces for custom processing before forwarding to Splunk AO:

```python
import asyncio
import os
from splunk_ao import GalileoLogger
from galileo_adk import GalileoADKPlugin
from splunk_ao_adk import SplunkAOADKPlugin
from google.adk.runners import Runner
from google.adk.agents import LlmAgent
from google.genai import types

logger = GalileoLogger(
project=os.getenv("GALILEO_PROJECT", "my-project"),
log_stream=os.getenv("GALILEO_LOG_STREAM", "dev"),
project=os.getenv("SPLUNK_AO_PROJECT", "my-project"),
log_stream=os.getenv("SPLUNK_AO_LOG_STREAM", "dev"),
)

def my_ingestion_hook(request):
Expand All @@ -214,7 +214,7 @@ def my_ingestion_hook(request):
logger.ingest_traces(request)

async def main():
plugin = GalileoADKPlugin(ingestion_hook=my_ingestion_hook)
plugin = SplunkAOADKPlugin(ingestion_hook=my_ingestion_hook)
agent = LlmAgent(name="assistant", model="gemini-2.0-flash", instruction="You are helpful.")
runner = Runner(agent=agent, plugins=[plugin])

Expand All @@ -224,13 +224,13 @@ async def main():
print(event.content.parts[0].text)

if __name__ == "__main__":
# Set environment variables: GALILEO_API_KEY, GOOGLE_API_KEY
# Set environment variables: SPLUNK_AO_API_KEY, GOOGLE_API_KEY
asyncio.run(main())
```

## Resources

- [Galileo Documentation](https://docs.rungalileo.io/)
- [Splunk AO Documentation](https://docs.splunk.com/)
- [Google ADK Documentation](https://google.github.io/adk-docs/)

## License
Expand Down
Loading
Loading