Skip to main content

kanoa

In-notebook AI interpretation of data science outputs, grounded in your project's knowledge base.

Tests Docs License: MIT Python 3.11+ Companion: kanoa-mlops

kanoa brings the power of a dedicated AI research assistant directly into your Python workflows — whether in Jupyter notebooks, Streamlit apps, or automated scripts. It programmatically interprets visualizations, tables, and results using multimodal LLMs (Molmo, Gemini, Claude, OpenAI), grounded in your project's documentation and literature.

Supported Backends

Backend Best For Getting Started
vllm Local inference with Molmo, Gemma 3, Olmo 3 Guide
gemini Free tier, native PDF support, Vertex AI RAG Engine Guide
gemini-deep-research Multi-step web research, GDrive integration Guide
claude Strong reasoning, vision support Guide
github-copilot GitHub Copilot SDK integration, GPT-5 models Guide
openai GPT models, Azure OpenAI Guide

For detailed backend comparison, see Backends Overview.

Features

  • Multi-Backend Support: Seamlessly switch between vLLM (local), Gemini, Claude, GitHub Copilot, and OpenAI.
  • Deep Research: Perform multi-step web research and synthesis using Gemini's Deep Research agent.
  • Real-time Streaming: Get immediate feedback with streaming responses.
  • Enterprise Grounding: Native integration with Vertex AI RAG Engine for scalable, secure knowledge retrieval from thousands of documents.
  • Native Vision: Uses multimodal capabilities to "see" complex plots and diagrams.
  • Cost Optimized: Intelligent context caching and token usage tracking.
  • Knowledge Base: Support for text (Markdown), PDF, and managed RAG knowledge bases.
  • Notebook-Native Logging: see the Logging Guide.

Quick Start

Check out 2 Minutes to kanoa for a hands-on introduction.

For a comprehensive feature overview, see the detailed quickstart.

Basic Usage: AI-assisted Debugging with Visual Interpretation

In this example, we use kanoa to identify a bug in a physics simulation.

import numpy as np
import matplotlib.pyplot as plt
from kanoa import AnalyticsInterpreter

# 1. Simulate a projectile (with a bug!)
t = np.linspace(0, 10, 100)
v0 = 50
g = 9.8
# BUG: Missing t**2 in the gravity term (should be 0.5 * g * t**2)
y = v0 * t - 0.5 * g * t

plt.figure(figsize=(10, 6))
plt.plot(t, y)
plt.title("Projectile Trajectory")

# 2. Ask kanoa to debug
interpreter = AnalyticsInterpreter(backend="gemini")
# Returns a stream by default
iterator = interpreter.interpret(
    fig=plt.gcf(),
    context="Simulating a projectile launch. Something looks wrong.",
    focus="Identify the physics error in the trajectory.",
)

# Consume the stream
for chunk in iterator:
    if chunk.type == "text":
        print(chunk.content, end="")

kanoa's response:

"The plot shows a linear relationship between height and time..."

Using Claude

# Ensure ANTHROPIC_API_KEY is set
interpreter = AnalyticsInterpreter(backend='claude')

# Use stream=False for blocking behavior (returns legacy result object)
result = interpreter.interpret(
    fig=plt.gcf(),
    context="Analyzing environmental data for climate trends",
    focus="Explain any regime changes in the data.",
    stream=False
)
print(result.text)

Using a Knowledge Base

# Point to a directory of Markdown or PDF files
interpreter = AnalyticsInterpreter(
    backend='gemini',
    kb_path='./docs/literature',
    kb_type='auto'  # Detects if PDFs are present
)

# The interpreter will now use the knowledge base to ground its analysis
result = interpreter.interpret(
    fig=plt.gcf(),
    context="Analyzing marine biologger data from a whale shark deployment",
    focus="Compare diving behavior with Braun et al. 2025 findings."
)
print(result.text)

Local Inference with vLLM

Connect to any model hosted via vLLM's OpenAI-compatible API. We've tested with Molmo from AI2 and Google's Gemma 3 12B — fully-open multimodal models. See kanoa-mlops for our local hosting setup.

# Molmo 7B (recommended for vision - 31 tok/s avg, 3x faster than Gemma)
interpreter = AnalyticsInterpreter(
    backend='openai',
    api_base='http://localhost:8000/v1',
    model='allenai/Molmo-7B-D-0924'
)

# Gemma 3 12B (recommended for text reasoning - 10.3 tok/s avg)
interpreter = AnalyticsInterpreter(
    backend='openai',
    api_base='http://localhost:8000/v1',
    model='google/gemma-3-12b-it'
)

result = interpreter.interpret(
    fig=plt.gcf(),
    context="Analyzing aquaculture sensor data",
    focus="Identify drivers of dissolved oxygen levels"
)

Local & Edge Deployment

Run state-of-the-art open weights models locally using our companion library, kanoa-mlops.

  • Privacy First: Your data never leaves your machine.
  • Models: Support for Gemma 3, Molmo, and Olmo 3.
  • Performance: Optimized for consumer hardware (RTX 4090/5080) and edge devices (NVIDIA Jetson Thor).

Benchmarks (NVIDIA RTX 5080)

Model Task Speed
Molmo-7B Complex Plot Interpretation 92.8 tokens/sec
Molmo-7B Data Interpretation 59.5 tokens/sec

Benchmarks (NVIDIA Jetson Thor)

Model Task Speed
Molmo-7B Complex Plot Interpretation 9.6 tokens/sec
Molmo-7B Data Interpretation 9.5 tokens/sec
Gemma 3 12B Vision (Chart Analysis) 4.3 tokens/sec
Gemma 3 12B Code Generation 4.4 tokens/sec

Installation

kanoa is modular — install only the backends you need:

# Local inference (vLLM — Molmo, Gemma 3)
pip install kanoa[local]

# Google Gemini (free tier available)
pip install kanoa[gemini]

# Anthropic Claude
pip install kanoa[claude]

# GitHub Copilot SDK
pip install kanoa[github-copilot]

# OpenAI API (GPT models, Azure OpenAI)
pip install kanoa[openai]

# Everything
pip install kanoa[all]
Development installation
git clone https://github.com/lhzn-io/kanoa.git
cd kanoa
pip install -e ".[dev]"

Pricing Configuration

kanoa includes up-to-date pricing for all supported models. You can override these values locally without waiting for a package update:

  1. Create ~/.config/kanoa/pricing.json
  2. Add your custom pricing (merges with defaults):
{
  "gemini": {
    "gemini-3.8-flash": {
      "input_price": 0.75,
      "output_price": 3.75
    },
    "gemini-3.1-pro-preview": {
      "input_price": 2.00,
      "output_price": 12.00
    }
  },
  "claude": {
    "claude-opus-4-5-20251101": {
      "input_price": 5.00,
      "output_price": 25.00
    }
  }
}

Pricing sources:

Documentation

📖 Full documentation — User guides, API reference, and examples.

Building docs locally
cd docs
pip install -r requirements-docs.txt
make html

Then open docs/build/html/index.html in your browser.

License

Copyright 2025 Long Horizon Observatory

This project is licensed under the MIT License — see the LICENSE file for details.

Metadata

Release files for kanoa 0.6.0

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

Source distribution (sdist)

Source distribution for kanoa 0.6.0
File Size Uploaded
kanoa-0.6.0.tar.gz 189.9 kB Details

Built distribution (wheel)

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

Total release size: 284.9 kB

Release files / kanoa-0.6.0.tar.gz

Download URL kanoa-0.6.0.tar.gz
Size 189.9 kB
Tags Source
SHA-256 checksum
How to use checksums
4780da488781c767cebec670e33aea018149a7d44fddb5e1a8f58ade7e93498c
BLAKE2b-256 checksum
How to use checksums
ab31f14f4533dd13e8e7ca0221b01f92fc0d348f9685f32f770970e10cd6678c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / kanoa-0.6.0-py3-none-any.whl

Download URL kanoa-0.6.0-py3-none-any.whl
Size 95.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a14c14fbd6a1f4e864d86d1f7ef8bfaf6f8c1594957172d59e00f49f8530c0e8
BLAKE2b-256 checksum
How to use checksums
4b34e8ac1288a8d96f6f8634128dfe5f982c468c7678d2ec2f2136ecc1018c99
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

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