An extensible AI assistant platform for open science projects, built with LangGraph/LangChain and FastAPI.
OSA provides domain-specific AI assistants for open science tools with:
- HED Assistant: Hierarchical Event Descriptors for neuroimaging annotation
- BIDS Assistant: Brain Imaging Data Structure (coming soon)
- EEGLAB Assistant: EEG analysis toolbox (coming soon)
Features:
- YAML-driven community registry - add a new assistant with just a config file
- Modular tool system for document retrieval, validation, and code execution
- Multi-source knowledge bases (GitHub, OpenALEX, Discourse forums, mailing lists)
- Embeddable chat widget for any website
- Production-ready observability via LangFuse
# From PyPI
pip install open-science-assistant
# Or with uv (recommended)
uv pip install open-science-assistant# Clone and install in development mode
git clone https://github.com/OpenScience-Collective/osa.git
cd osa
uv sync --extra dev
# Install pre-commit hooks
uv run pre-commit install# Show available assistants
osa
# Ask the HED assistant a question
osa hed ask "What is HED?"
# Start an interactive chat session
osa hed chat
# Show all commands
osa --help
osa hed --help# Start the API server
osa serve
# Or with uvicorn directly
uv run uvicorn src.api.main:app --reload --port 38528# Show current config
osa config show
# Set API keys for BYOK (Bring Your Own Key)
osa config set --openrouter-key YOUR_KEY
# Connect to remote server (uses BYOK)
osa hed ask "What is HED?" --url https://api.osc.earth/osa-devOSA can be deployed via Docker:
# Pull and run
docker pull ghcr.io/openscience-collective/osa:latest
docker run -d --name osa -p 38528:38528 \
-e OPENROUTER_API_KEY=your-key \
ghcr.io/openscience-collective/osa:latest
# Check health
curl http://localhost:38528/healthSee deploy/DEPLOYMENT_ARCHITECTURE.md for detailed deployment options including Apache reverse proxy and BYOK configuration.
OSA uses a YAML-driven registry to configure community assistants. Each community has a config.yaml that declares its documentation, system prompt, knowledge sources, and specialized tools.
# Directory structure
src/assistants/
hed/config.yaml # HED assistant configuration
bids/config.yaml # BIDS assistant (planned)- Create
src/assistants/my-tool/config.yaml:
id: my-tool
name: My Tool
description: A research tool for neuroscience
status: available
# Required: Per-community OpenRouter API key for cost attribution
# Set the environment variable on your backend server
openrouter_api_key_env_var: "OPENROUTER_API_KEY_MY_TOOL"
system_prompt: |
You are a technical assistant for {name}.
{preloaded_docs_section}
{available_docs_section}
documentation:
- title: Getting Started
url: https://my-tool.org/docs
source_url: https://raw.githubusercontent.com/org/my-tool/main/docs/intro.md
preload: true
github:
repos:
- org/my-tool- Set the API key environment variable on your backend:
export OPENROUTER_API_KEY_MY_TOOL="your-openrouter-key"- Validate your configuration:
uv run osa validate src/assistants/my-tool/config.yaml- Start the server - the
/{community-id}/askendpoint is auto-created.
Documentation:
- Community Onboarding Guide - Step-by-step onboarding process
- Configuration Reference - Complete reference for all config fields
- Troubleshooting Guide - Common issues and solutions
- Community Onboarding Guide - Complete walkthrough for adding your community to OSA (target: <15 minutes)
- Configuration Reference - Comprehensive reference for all
config.yamlfields - Troubleshooting Guide - Solutions for common configuration and deployment issues
- Deployment Architecture - Production deployment patterns and infrastructure options
The HED assistant can suggest valid HED tags from natural language using the hed-lsp CLI tool.
# Clone and build hed-lsp
git clone https://github.com/hed-standard/hed-lsp.git
cd hed-lsp/server
npm install
npm run compileSet the HED_LSP_PATH environment variable:
export HED_LSP_PATH=/path/to/hed-lspOr install globally:
cd hed-lsp/server
npm link # Makes hed-suggest available globally# Run tests with coverage
uv run pytest --cov
# Format code
uv run ruff check --fix . && uv run ruff format .MIT