neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
The open-source enterprise AI agent platform with SAML/OIDC SSO, RBAC, audit logs, IP allowlist, and encryption key rotation. Self-host on your infrastructure — MIT licensed.
Developer toolsPython · TypeScriptGitHub @getsynkoraOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Open-source AI agent platform for building, deploying, and managing AI teammates. Role-based agents (PM, Engineer, Support, Marketing) with custom tools, knowledge bases, and 50+ integrations. Self-hosted, multi-provider LLM support, no vendor lock-in.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Self-hosted AI agent platform. No cloud dependency. No vendor lock-in. Your infrastructure, your LLM keys.
Deploy agents to Slack, WhatsApp, Teams, Telegram, web widget, and REST API — from one platform. MIT licensed.
LangChain gives you building blocks. AutoGen gives you patterns. Synkora gives you the entire platform.
Web UI, multi-tenant workspaces, RAG knowledge bases, 50+ tool integrations, multi-channel deployment, billing, scheduled tasks, HITL approval gates, and LLM observability — all self-hosted on your infrastructure, ready in minutes.
Why Synkora over building your own stack?Read the full README ↗Self-hosted AI agent platform. No cloud dependency. No vendor lock-in. Your infrastructure, your LLM keys.
Deploy agents to Slack, WhatsApp, Teams, Telegram, web widget, and REST API — from one platform. MIT licensed.
Features • Quick Start • Documentation • Contributing • Community
LangChain gives you building blocks. AutoGen gives you patterns. Synkora gives you the entire platform.
Web UI, multi-tenant workspaces, RAG knowledge bases, 50+ tool integrations, multi-channel deployment, billing, scheduled tasks, HITL approval gates, and LLM observability — all self-hosted on your infrastructure, ready in minutes.
Why Synkora over building your own stack?
| DIY with LangChain/CrewAI | Synkora | |
|---|---|---|
| Agent UI | Build it | Included |
| Multi-tenancy | Build it | Built-in |
| RAG pipeline | Build it | Built-in |
| Slack/WhatsApp/Teams bots | Build it | Built-in |
| Billing & quotas | Build it | Built-in |
| Human-in-the-loop approvals | Build it | Built-in |
| LLM cost tracking | Build it | Built-in |
| Self-hosted | Depends | Always |
Try it live at synkora.ai — no installation required.
For a comprehensive technical analysis, see ARCHITECTURE.md
┌─────────────────────────────────────────┐
│ Load Balancer │
└────────────────┬────────────────────────┘
│
┌──────────────────────┼──────────────────────┐
│ │ │
┌─────────▼─────────┐ ┌─────────▼─────────┐ ┌─────────▼─────────┐
│ FastAPI Pod 1 │ │ FastAPI Pod 2 │ │ FastAPI Pod N │
│ (API + WebSocket) │ │ (API + WebSocket) │ │ (API + WebSocket) │
└─────────┬─────────┘ └─────────┬─────────┘ └─────────┬─────────┘
│ │ │
┌─────────▼──────────────────────▼──────────────────────▼─────────┐
│ Redis (Pub/Sub + Cache) │
└─────────┬──────────────────────┬──────────────────────┬─────────┘
│ │ │
┌─────────▼─────────┐ ┌─────────▼─────────┐ ┌─────────▼─────────┐
│ Celery Workers │ │ Celery Beat │ │ Bot Workers │
│ (default+billing) │ │ (scheduler) │ │ (Slack/Telegram) │
└─────────┬─────────┘ └───────────────────┘ └─────────┬─────────┘
│ │
┌─────────▼──────────────────────────────────────────-▼─────────┐
│ synkora-ml (embeddings + reranking) │
│ synkora-scraper (browser automation + app-store scraping) │
└────────────────────────────────────────────────────────────────┘
│
┌─────────▼──────────────────────────────────────────────────────┐
│ │
│ PostgreSQL (pgvector) │ Qdrant │ MinIO/S3 │ Elasticsearch│
└─────────────────────────────────────────────────────────────────┘
Backend:
Frontend:
Infrastructure:
synkora/
├── api/ # Backend API (FastAPI)
│ ├── src/
│ │ ├── config/ # Configuration management
│ │ ├── core/ # Core functionality (database, cache, websocket)
│ │ ├── models/ # SQLAlchemy models
│ │ ├── schemas/ # Pydantic schemas
│ │ ├── controllers/ # API route handlers
│ │ ├── services/ # Business logic
│ │ ├── middleware/ # Custom middleware
│ │ └── tasks/ # Celery tasks
│ ├── migrations/ # Alembic database migrations
│ ├── tests/ # Test suite
│ └── pyproject.toml # Python dependencies
│
├── web/ # Frontend (Next.js)
│ ├── app/ # Next.js App Router pages
│ ├── components/ # React components
│ ├── lib/ # Utilities and API client
│ ├── hooks/ # Custom React hooks
│ └── types/ # TypeScript type definitions
│
├── services/
│ ├── ml/ # ML microservice (embeddings + reranking)
│ └── scraper/ # Scraper microservice (browser + app-store)
│
├── docker-compose.yml # Local development environment
├── helm/ # Kubernetes Helm charts
└── docs/ # Documentation
Five complementary optimizations reduce LLM API costs. Savings figures are either derived from provider-published pricing or from the benchmark script — no figures are estimated or invented.
| Optimization | Mechanism | Typical Savings | Notes |
|---|---|---|---|
| Anthropic Prompt Caching | cache_control injected automatically on system prompt + tools for supported models | ~90% on cached prompt tokens (cache reads billed at 10% of input rate — Anthropic pricing) | Automatic — no config needed. LLM still runs fresh; output quality unchanged. |
| OpenAI Automatic Caching | Provider-managed prefix caching; Synkora tracks cached_tokens in usage logs | 50% on cached prefix tokens (OpenAI pricing) | Automatic at provider level. No Synkora configuration required. |
| Response Cache | Redis exact-match cache with 6 correctness gates; bypasses LLM entirely on cache hit | 100% cost saving per cache-hit call | Opt-in: requires enable_response_cache: true in agent performance config. Only activates for deterministic calls (temp ≤ 0.1, no tool context, no time-sensitive content). |
| Cost-Opt Routing | Routes queries to the cheapest configured model that passes a complexity gate | Depends on model price gap — no universal figure | cost_opt mode in model_router.py. Savings vary entirely by which models are configured; no benchmark figure is claimed. |
| Batch API | Submits background LLM jobs via Anthropic/OpenAI batch endpoints via Celery | 50% discount on batch calls (Anthropic / OpenAI published pricing) | Applies to scheduled/async tasks only, not real-time chat. |
Generated by
api/tests/benchmarks/cost_benchmark.py. API-dependent tests requireANTHROPIC_API_KEY/OPENAI_API_KEY— run locally with real keys for live latency numbers.
Cost calculation — pricing resolution order: DB routing-rules override → _BUILTIN_COSTS → MODEL_COMPARISON_DATA → None (unknown).
| Model | In tokens | Out tokens | Cache read | Cache write | Input rate | Est. cost (USD) |
|---|---|---|---|---|---|---|
claude-haiku-4-5-20251001 | 1,000 | 500 | 0 | 0 | $0.00025/1k | $0.00275000 |
gpt-4o | 1,000 | 200 | 0 | 0 | $0.00500/1k | $0.00700000 |
gpt-4o-mini | 2,000 | 400 | 0 | 0 | $0.00500/1k | $0.01400000 |
claude-haiku-4-5-20251001 (with cache) | 500 | 200 | 300 | 100 | $0.00025/1k | $0.00106375 |
claude-sonnet-4-6 (with cache) | 1,000 | 300 | 500 | 200 | $0.00300/1k | $0.00630000 |
| Unknown model | 1,000 | 200 | 0 | 0 | unknown | — |
Anthropic prompt-cache savings — 2,000-token system prompt, 100 requests/day:
| Model | Daily cost (no cache) | Daily cost (with cache) | Saving |
|---|---|---|---|
claude-haiku-4-5-20251001 | $0.050000 | $0.005575 | 88.9% |
Response cache correctness gates — six gates prevent stale hits:
| Gate | Condition | Result |
|---|---|---|
| Opt-in | temp=0.0, role=user | ✓ cacheable |
| High temperature | temp=0.8, role=user | ✓ skipped |
| Tool context | temp=0.0, role=tool | ✓ skipped |
| Time-sensitive | "what is the current price?" | ✓ skipped |
Cache key stability — cache is automatically busted when the agent is edited:
| Scenario | Same key? |
|---|---|
| Identical inputs | ✓ yes |
Agent re-saved (agent_updated_at changed) | ✓ different |
| System prompt edited | ✓ different |
Unit tests: 23/23 passed — test_llm_cost_service.py (10) + test_llm_response_cache.py (13).
Implementation files:
| Feature | File |
|---|---|
| Cost calculation + analytics API | api/src/services/billing/llm_cost_service.py |
| Per-call token usage persistence (fire-and-forget) | api/src/services/billing/llm_cost_service.py |
| LLM response cache (Redis, 6 gates, NX write, 50 KB cap, 1 h TTL) | api/src/services/cache/llm_response_cache.py |
DB model (llm_token_usage) | api/src/models/llm_token_usage.py |
| Migration | api/migrations/versions/20260424_0001_add_llm_token_usage.py |
cd api && python -m tests.benchmarks.cost_benchmark --provider anthropic --api-key $ANTHROPIC_API_KEY
cd api && python -m tests.benchmarks.cost_benchmark --provider openai --api-key $OPENAI_API_KEY
Research methodology: Each platform was investigated against its official docs, GitHub issues/PRs, and changelogs as of April 2026. Every cell is sourced — see footnotes. Legend: ✅ Native built-in feature · ⚡ Partial (manual setup or limited scope) · ❌ Not supported
| Feature | Synkora | Dify | Flowise | LangFlow | n8n |
|---|---|---|---|---|---|
Anthropic prompt caching (cache_control) | ✅ | ⚡ ¹ | ❌ ² | ❌ ³ | ⚡ ⁴ |
| LLM response cache (Redis exact-match) | ✅ | ⚡ ⁵ | ✅ ⁶ | ❌ ⁷ | ⚡ ⁸ |
| Smart model routing (complexity/cost-based) | ✅ | ⚡ ⁹ | ⚡ ⁹ | ⚡ ¹⁰ | ⚡ |
¹ Dify prompt caching — Anthropic only, via official plugin v0.3.10 (Apr 2026). Six opt-in per-call parameters (prompt_caching_system_message, prompt_caching_tool_definitions, etc.) in the LLM node UI. OpenAI prefix caching is transparent at provider level (Dify does nothing special). Gemini explicitly declined as "not planned" (issue #2121). Known bug: Haiku 4.5 cache shows 0% (issue #1946).
² Flowise prompt caching — No cache_control implementation. Open feature request #4634 with no maintainer commitment. GitHub code search returns 0 matches for cache_control in the repo.
³ LangFlow prompt caching — No native support. A LangFlow blog post titled "Prompt Caching in LLMs" is educational only — it describes no LangFlow feature. LangChain's AnthropicPromptCachingMiddleware exists but is not exposed as a built-in LangFlow node.
⁴ n8n prompt caching — Anthropic cache_control (4-breakpoint strategy) was merged for the internal AI Workflow Builder (PR #20484, Oct 2025). The user-facing Anthropic Chat Model node PR (#22318) was still open as of Apr 2026.
⁵ Dify response cache — No generic Redis-backed LLM output cache. The nearest equivalent is Annotation Reply: a manually curated Q&A store with vector-similarity matching that short-circuits LLM calls. A workflow-level caching feature request (#23598) was closed "not planned" Sep 2025.
⁶ Flowise response cache — Documented, shipped feature. LangChain cache layer with four backends: InMemory, Redis, Upstash Redis, Momento. Connected to LLM nodes as an optional "Cache" input. (docs)
⁷ LangFlow response cache — No LLM output deduplication cache exists. The in-memory cache is for internal flow-graph state (component outputs within a run), not LLM response deduplication. Redis is documented as "experimental" for flow caching only.
⁸ n8n response cache — No first-class cache node. Achievable via Redis Vector Store node + manual workflow logic (community template), but requires authoring, not a one-click setting.
⁹ Dify / Flowise / n8n model routing — All three provide routing primitives (If/Else nodes, Condition nodes, Switch nodes) that can be manually wired to route to different models. None has a built-in automatic complexity classifier that routes to a cheaper model. n8n community has a workflow template using OpenRouter for this.
¹⁰ LangFlow model routing — Shipped a real LLM Router / LLM Selector component in v1.7 (PR #5475, Jan 2025) that uses OpenRouter's model-spec API and a judge LLM to pick among attached models by quality/speed/cost/balanced. Requires OpenRouter; incurs a live LLM judgment call per routing decision.
¹¹ Dify batch API — Explicitly declined as "not planned" (issue #13126, closed Mar 18, 2025).
¹² Flowise batch API — No evidence of Anthropic Message Batches or OpenAI Batch API integration. The batchSize field in the OpenAI node is LangChain-internal concurrency (embedding chunking), not the provider batch endpoint. Async response confirmed "not currently supported" (discussion #1212).
¹³ LangFlow batch API — No support. LangFlow's /v1/flows/batch/ endpoint is for creating/deleting multiple flow definitions, not for submitting LLM calls to provider batch APIs.
¹⁴ n8n batch API — Anthropic batch API is accessible via an HTTP Request node using a community workflow template. No dedicated node. OpenAI Batch API requires the same workaround.
¹⁵ Dify token & cost tracking — Per-node: execution_metadata.total_tokens, total_price (USD), currency in the node_finished SSE event (issue #8873). Visible in Run History / Debug view. Cache-aware: cache_creation_input_tokens (1.25×) and cache_read_input_tokens (0.1×) tracked in Anthropic plugin. Caveat: shows $0 for OpenAI-compatible third-party models without PLUGIN_BASED_TOKEN_COUNTING_ENABLED=true; fixed in v1.9.2+.
¹⁶ Flowise token & cost tracking — Token data is generated internally but only surfaced via third-party observability integrations (Langfuse, LangSmith, LunaryAI, LangWatch, Arize, Phoenix, Opik). No native per-call USD cost display in Flowise UI. Non-OpenAI providers (Gemini, DeepSeek) have incomplete cost data in traces (Langfuse issue #8293).
¹⁷ LangFlow token & cost tracking — Token counts added to the inspection UI in v1.8 (blog) and available in the OpenAI Responses API path. USD cost requires Langfuse / LangSmith / LangWatch integration; not calculated natively. Earlier feature request (#3261) was closed "not planned" Nov 2024.
¹⁸ n8n token & cost tracking — Token data is in the raw model output for providers that return it (OpenAI, Anthropic, Google) but not displayed natively in the n8n execution UI. Per-call tracking and a cost dashboard require a custom subworkflow (community template).
Run the interactive installer — it handles everything: prerequisite checks, .env generation, database migrations, seeding, and starting all services.
curl -fsSL https://raw.githubusercontent.com/getsynkora/synkora-ai/main/get.sh | bash
Installs into ~/synkora-ai by default. To choose a different directory:
curl -fsSL https://raw.githubusercontent.com/getsynkora/synkora-ai/main/get.sh | \
SYNKORA_INSTALL_DIR=~/my-synkora bash
For CI/CD and server deployments (no prompts):
curl -fsSL https://raw.githubusercontent.com/getsynkora/synkora-ai/main/get.sh | \
[email protected] \
SYNKORA_ADMIN_PASSWORD=securepass123 \
SYNKORA_LLM_PROVIDER=openai \
SYNKORA_LLM_API_KEY=sk-... \
bash -s -- --non-interactive
The installer will:
.env files with secure random secretsIf you prefer to set up manually:
# 1. Copy and edit environment files
cp api/.env.example api/.env
# Edit api/.env with your configuration
# 2. Start all services
docker compose up -d
# 3. Initialize the database
docker compose exec api alembic upgrade head
docker compose exec api python create_super_admin.py
docker compose exec api python seed_platform_config.py
cd api
# Install dependencies (using uv)
uv sync
# Or using pip
pip install -e .
# Set up environment
cp .env.example .env
# Edit .env with your configuration
# Initialize database
alembic upgrade head
python create_super_admin.py
python seed_platform_config.py
# Run development server
uvicorn src.app:app --reload --host 0.0.0.0 --port 5001
cd web
# Install dependencies
pnpm install
# Set up environment
cp .env.example .env.local
# Edit .env.local if needed
# Run development server
pnpm dev
api/.env)# Database
DATABASE_URL=postgresql://synkora:synkora@localhost:5432/synkora
# Redis
REDIS_URL=redis://localhost:6379/0
# Security
SECRET_KEY=your-secret-key
JWT_SECRET_KEY=your-jwt-secret
ENCRYPTION_KEY=your-encryption-key
# Application
APP_ENV=development
API_HOST=0.0.0.0
API_PORT=5001
# Storage
STORAGE_PROVIDER=s3
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=minioadmin
AWS_ENDPOINT_URL=http://localhost:9000
AWS_BUCKET_NAME=synkora-storage
# LLM Providers (optional)
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
# Langfuse (optional)
LANGFUSE_PUBLIC_KEY=pk-...
LANGFUSE_SECRET_KEY=sk-...
LANGFUSE_HOST=http://localhost:3001
web/.env.local)NEXT_PUBLIC_API_URL=http://localhost:5001
NEXT_PUBLIC_APP_URL=http://localhost:3005
Our CI/CD pipeline runs on every push and pull request:
Coverage reports are generated for every pull request with inline annotations.
cd api
pytest # Run all tests
pytest --cov=src # With coverage
pytest --cov=src --cov-report=html # Generate HTML coverage report
pytest tests/unit/ # Unit tests only
pytest tests/integration/ # Integration tests only
pytest -v -k "test_name" # Run specific test
pytest -x # Stop on first failure
cd web
pnpm test # Run tests
pnpm type-check # TypeScript type checking
pnpm lint # ESLint
You can run GitHub Actions locally using act:
# Install act (macOS)
brew install act
# Run API tests locally
act workflow_dispatch -W .github/workflows/api-tests.yml -j test --matrix python-version:3.11 -P ubuntu-latest=catthehacker/ubuntu:act-latest --container-architecture linux/amd64
# Create a new migration
cd api
alembic revision --autogenerate -m "Description"
# Apply migrations
alembic upgrade head
# Rollback
alembic downgrade -1
Backend:
cd api
ruff format . # Format code
ruff check . # Lint code
basedpyright # Type checking
Frontend:
cd web
pnpm lint # ESLint
pnpm type-check # TypeScript
Backend:
cd api
uv add package-name # Production dependency
uv add --dev package-name # Development dependency
Frontend:
cd web
pnpm add package-name # Production dependency
pnpm add -D package-name # Development dependency
# Build all images
docker-compose build
# Start all services
docker-compose up -d
Helm charts are provided in the helm/ directory:
# Install
helm install synkora ./helm/synkora
# Upgrade
helm upgrade synkora ./helm/synkora
# Uninstall
helm uninstall synkora
Synkora runs ~20 Docker containers. The installer checks your system and warns if below minimums.
| Minimum | Recommended | |
|---|---|---|
| RAM | 16 GB | 32 GB |
| CPU | 4 cores | 8+ cores |
| Free disk | 40 GB | 100 GB |
| OS | macOS 12+, Ubuntu 20.04+, Debian 11+, Fedora 36+, RHEL 8+ | — |
Why so much RAM? Elasticsearch is hard-capped at 2 GB. Redis is configured for up to 2 GB. The ML service loads sentence-transformer models (~1–2 GB). Total idle: ~10–12 GB plus OS overhead.
| Service | RAM (idle) | Purpose |
|---|---|---|
elasticsearch | ~1.5 GB | Full-text search (hard limit: 2 GB) |
redis | up to 2 GB | Cache, Celery broker, pub/sub |
synkora-ml | ~1–2 GB | Embeddings + reranking (sentence-transformers) |
synkora-scraper | ~512 MB | Browser automation (Playwright + Chromium) |
langfuse-clickhouse | ~512 MB | LLM observability analytics |
langfuse-web + langfuse-worker | ~512 MB | Langfuse UI + background jobs |
api | ~512 MB | FastAPI application server |
celery-worker (×4 workers) | ~1.5 GB | Background tasks |
postgres + postgres-test | ~384 MB | PostgreSQL with pgvector |
qdrant | ~256 MB | Vector database |
minio | ~256 MB | S3-compatible object storage |
bot-worker, celery-beat, docs | ~384 MB | Slack bots, scheduler, docs |
| Total | ~10–12 GB | Plus OS + Docker daemon (~2–3 GB overhead) |
| Tool | Version | Required for |
|---|---|---|
| Docker Engine | 24+ | All services |
| Docker Compose v2 | 2.20+ | Orchestration |
| Node.js | 20+ | Frontend (local dev only) |
| pnpm | 8+ | Frontend (local dev only) |
| openssl | any | Secret key generation |
| Port | Service |
|---|---|
3005 | Web frontend |
5001 | API (FastAPI) |
3001 | Langfuse UI |
9001 | MinIO console |
6333 | Qdrant HTTP |
9200 | Elasticsearch |
5438 | PostgreSQL |
6379 | Redis (localhost only) |
All ports are configurable in docker-compose.yml.
Detailed in ARCHITECTURE.md — Security
/metrics endpoint for scraping (request counts, latencies, LLM usage)/api/v1/stats/performance for connection pools, circuit breakers/health endpoint for liveness probesDetailed in ARCHITECTURE.md — Scalability
| Metric | Target | Achieved | Status |
|---|---|---|---|
| Health check p95 | < 100ms | 42ms | Pass |
| List agents p95 | < 500ms | 198ms | Pass |
| Chat stream p95 | < 5s | 2.8s | Pass |
| KB search p95 | < 1s | 342ms | Pass |
| Error rate | < 5% | 0.8% | Pass |
See Load Testing Guide for running your own tests.
We welcome contributions from the community! Whether you're fixing bugs, improving documentation, or proposing new features, your help is appreciated.
mainPlease read our Contributing Guidelines for detailed information.
New to the project? Look for issues labeled good first issue to get started.
This project adheres to a Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to the project maintainers.
See the Quick Start section for development environment setup instructions.
This project is licensed under the MIT License — see the LICENSE file for details.
You are free to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of this software for any purpose, including commercial use, without restriction.
See CHANGELOG.md for a list of changes and version history.
Built with amazing open source technologies:
/api/v1/docs when running locallySee CHANGELOG.md for recent changes and version history.
Synkora is actively maintained and in production use. We follow semantic versioning and maintain backward compatibility wherever possible.
synkora.ai · Documentation · Discussions · Issues
If Synkora saves you time, a star helps others find it.
| Batch API (Anthropic / OpenAI async 50% discount) | ✅ | ❌ ¹¹ | ❌ ¹² | ❌ ¹³ | ⚡ ¹⁴ |
| Per-call token & USD cost tracking | ✅ | ✅ ¹⁵ | ⚡ ¹⁶ | ⚡ ¹⁷ | ⚡ ¹⁸ |