diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 92be5228..4211257e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -426,7 +426,7 @@ jobs:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
source venv/bin/activate
- cd demos/shared/test_runner && sh run_demo_tests.sh use_cases/preference_based_routing
+ cd demos/shared/test_runner && sh run_demo_tests.sh llm_routing/preference_based_routing
# ──────────────────────────────────────────────
# E2E: demo — currency conversion
@@ -476,4 +476,4 @@ jobs:
GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
run: |
source venv/bin/activate
- cd demos/shared/test_runner && sh run_demo_tests.sh samples_python/currency_exchange
+ cd demos/shared/test_runner && sh run_demo_tests.sh advanced/currency_exchange
diff --git a/README.md b/README.md
index 347d5781..db398507 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ Plano pulls rote plumbing out of your framework so you can stay focused on what
Plano handles **orchestration, model management, and observability** as modular building blocks - letting you configure only what you need (edge proxying for agentic orchestration and guardrails, or LLM routing from your services, or both together) to fit cleanly into existing architectures. Below is a simple multi-agent travel agent built with Plano that showcases all three core capabilities
-> 📁 **Full working code:** See [`demos/use_cases/travel_agents/`](demos/use_cases/travel_agents/) for complete weather and flight agents you can run locally.
+> 📁 **Full working code:** See [`demos/agent_orchestration/travel_agents/`](demos/agent_orchestration/travel_agents/) for complete weather and flight agents you can run locally.
@@ -113,7 +113,7 @@ async def chat(request: Request):
days = 7
# Your agent logic: fetch data, call APIs, run tools
- # See demos/use_cases/travel_agents/ for the full implementation
+ # See demos/agent_orchestration/travel_agents/ for the full implementation
weather_data = await get_weather_data(request, messages, days)
# Stream the response back through Plano
diff --git a/cli/planoai/templates/coding_agent_routing.yaml b/cli/planoai/templates/coding_agent_routing.yaml
index e41db0c0..b0e40000 100644
--- a/cli/planoai/templates/coding_agent_routing.yaml
+++ b/cli/planoai/templates/coding_agent_routing.yaml
@@ -1,13 +1,6 @@
-version: v0.1
+version: v0.3.0
-listeners:
- egress_traffic:
- address: 0.0.0.0
- port: 12000
- message_format: openai
- timeout: 30s
-
-llm_providers:
+model_providers:
# OpenAI Models
- model: openai/gpt-5-2025-08-07
access_key: $OPENAI_API_KEY
@@ -39,5 +32,10 @@ model_aliases:
arch.claude.code.small.fast:
target: claude-haiku-4-5
+listeners:
+ - type: model
+ name: model_listener
+ port: 12000
+
tracing:
random_sampling: 100
diff --git a/cli/planoai/templates/conversational_state_v1_responses.yaml b/cli/planoai/templates/conversational_state_v1_responses.yaml
index afc40910..403278a9 100644
--- a/cli/planoai/templates/conversational_state_v1_responses.yaml
+++ b/cli/planoai/templates/conversational_state_v1_responses.yaml
@@ -1,25 +1,36 @@
-version: v0.1
+version: v0.3.0
-listeners:
- egress_traffic:
- address: 0.0.0.0
- port: 12000
- message_format: openai
- timeout: 30s
-
-llm_providers:
+agents:
+ - id: assistant
+ url: http://localhost:10510
+model_providers:
# OpenAI Models
- model: openai/gpt-5-mini-2025-08-07
access_key: $OPENAI_API_KEY
default: true
- # Anthropic Models
+ # Anthropic Models
- model: anthropic/claude-sonnet-4-20250514
access_key: $ANTHROPIC_API_KEY
+listeners:
+ - type: agent
+ name: conversation_service
+ port: 8001
+ router: plano_orchestrator_v1
+ agents:
+ - id: assistant
+ description: |
+ A conversational assistant that maintains context across multi-turn
+ conversations. It can answer follow-up questions, remember previous
+ context, and provide coherent responses in ongoing dialogues.
+
# State storage configuration for v1/responses API
# Manages conversation state for multi-turn conversations
state_storage:
# Type: memory | postgres
type: memory
+
+tracing:
+ random_sampling: 100
diff --git a/cli/planoai/templates/preference_aware_routing.yaml b/cli/planoai/templates/preference_aware_routing.yaml
index cb9f685a..e38b3881 100644
--- a/cli/planoai/templates/preference_aware_routing.yaml
+++ b/cli/planoai/templates/preference_aware_routing.yaml
@@ -1,13 +1,6 @@
-version: v0.1.0
+version: v0.3.0
-listeners:
- egress_traffic:
- address: 0.0.0.0
- port: 12000
- message_format: openai
- timeout: 30s
-
-llm_providers:
+model_providers:
- model: openai/gpt-4o-mini
access_key: $OPENAI_API_KEY
@@ -25,5 +18,10 @@ llm_providers:
- name: code generation
description: generating new code snippets, functions, or boilerplate based on user prompts or requirements
+listeners:
+ - type: model
+ name: model_listener
+ port: 12000
+
tracing:
random_sampling: 100
diff --git a/cli/planoai/utils.py b/cli/planoai/utils.py
index 2ffe7b58..171006f1 100644
--- a/cli/planoai/utils.py
+++ b/cli/planoai/utils.py
@@ -154,7 +154,10 @@ def convert_legacy_listeners(
)
listener["model_providers"] = model_providers or []
model_provider_set = True
- llm_gateway_listener = listener
+ # Merge user listener values into defaults for the Envoy template
+ llm_gateway_listener = {**llm_gateway_listener, **listener}
+ elif listener.get("type") == "prompt":
+ prompt_gateway_listener = {**prompt_gateway_listener, **listener}
if not model_provider_set:
listeners.append(llm_gateway_listener)
diff --git a/cli/test/test_init.py b/cli/test/test_init.py
index b9665a2a..cfb7e6cb 100644
--- a/cli/test/test_init.py
+++ b/cli/test/test_init.py
@@ -26,7 +26,7 @@ def test_init_template_builtin_writes_config(tmp_path, monkeypatch):
config_path = tmp_path / "config.yaml"
assert config_path.exists()
config_text = config_path.read_text(encoding="utf-8")
- assert "llm_providers:" in config_text
+ assert "model_providers:" in config_text
def test_init_refuses_overwrite_without_force(tmp_path, monkeypatch):
diff --git a/config/docker-compose.dev.yaml b/config/docker-compose.dev.yaml
index 15d75a62..1384f955 100644
--- a/config/docker-compose.dev.yaml
+++ b/config/docker-compose.dev.yaml
@@ -8,7 +8,7 @@ services:
- "12000:12000"
- "19901:9901"
volumes:
- - ${PLANO_CONFIG_FILE:-../demos/samples_python/weather_forecast/plano_config.yaml}:/app/plano_config.yaml
+ - ${PLANO_CONFIG_FILE:-../demos/getting_started/weather_forecast/plano_config.yaml}:/app/plano_config.yaml
- /etc/ssl/cert.pem:/etc/ssl/cert.pem
- ./envoy.template.yaml:/app/envoy.template.yaml
- ./plano_config_schema.yaml:/app/plano_config_schema.yaml
diff --git a/demos/samples_python/currency_exchange/README.md b/demos/advanced/currency_exchange/README.md
similarity index 100%
rename from demos/samples_python/currency_exchange/README.md
rename to demos/advanced/currency_exchange/README.md
diff --git a/demos/samples_python/currency_exchange/config.yaml b/demos/advanced/currency_exchange/config.yaml
similarity index 91%
rename from demos/samples_python/currency_exchange/config.yaml
rename to demos/advanced/currency_exchange/config.yaml
index 064befa1..f99da77b 100644
--- a/demos/samples_python/currency_exchange/config.yaml
+++ b/demos/advanced/currency_exchange/config.yaml
@@ -1,13 +1,11 @@
-version: v0.1.0
+version: v0.3.0
listeners:
- ingress_traffic:
- address: 0.0.0.0
+ - type: prompt
+ name: prompt_listener
port: 10000
- message_format: openai
- timeout: 30s
-llm_providers:
+model_providers:
- model: openai/gpt-4o-mini
access_key: $OPENAI_API_KEY
default: true
diff --git a/demos/advanced/currency_exchange/docker-compose.yaml b/demos/advanced/currency_exchange/docker-compose.yaml
new file mode 100644
index 00000000..ff161662
--- /dev/null
+++ b/demos/advanced/currency_exchange/docker-compose.yaml
@@ -0,0 +1,25 @@
+services:
+ anythingllm:
+ image: mintplexlabs/anythingllm
+ restart: always
+ ports:
+ - "3001:3001"
+ cap_add:
+ - SYS_ADMIN
+ environment:
+ - STORAGE_DIR=/app/server/storage
+ - LLM_PROVIDER=generic-openai
+ - GENERIC_OPEN_AI_BASE_PATH=http://host.docker.internal:10000/v1
+ - GENERIC_OPEN_AI_MODEL_PREF=gpt-4o-mini
+ - GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT=128000
+ - GENERIC_OPEN_AI_API_KEY=sk-placeholder
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+
+ jaeger:
+ build:
+ context: ../../shared/jaeger
+ ports:
+ - "16686:16686"
+ - "4317:4317"
+ - "4318:4318"
diff --git a/demos/samples_python/currency_exchange/hurl_tests/simple.hurl b/demos/advanced/currency_exchange/hurl_tests/simple.hurl
similarity index 100%
rename from demos/samples_python/currency_exchange/hurl_tests/simple.hurl
rename to demos/advanced/currency_exchange/hurl_tests/simple.hurl
diff --git a/demos/samples_python/currency_exchange/hurl_tests/simple_stream.hurl b/demos/advanced/currency_exchange/hurl_tests/simple_stream.hurl
similarity index 100%
rename from demos/samples_python/currency_exchange/hurl_tests/simple_stream.hurl
rename to demos/advanced/currency_exchange/hurl_tests/simple_stream.hurl
diff --git a/demos/samples_java/weather_forcecast_service/run_demo.sh b/demos/advanced/currency_exchange/run_demo.sh
similarity index 100%
rename from demos/samples_java/weather_forcecast_service/run_demo.sh
rename to demos/advanced/currency_exchange/run_demo.sh
diff --git a/demos/samples_python/currency_exchange/test_data.yaml b/demos/advanced/currency_exchange/test_data.yaml
similarity index 100%
rename from demos/samples_python/currency_exchange/test_data.yaml
rename to demos/advanced/currency_exchange/test_data.yaml
diff --git a/demos/use_cases/model_choice_with_test_harness/README.md b/demos/advanced/model_choice_test_harness/README.md
similarity index 100%
rename from demos/use_cases/model_choice_with_test_harness/README.md
rename to demos/advanced/model_choice_test_harness/README.md
diff --git a/demos/use_cases/model_choice_with_test_harness/bench.py b/demos/advanced/model_choice_test_harness/bench.py
similarity index 100%
rename from demos/use_cases/model_choice_with_test_harness/bench.py
rename to demos/advanced/model_choice_test_harness/bench.py
diff --git a/demos/use_cases/model_choice_with_test_harness/evals_summarize.yaml b/demos/advanced/model_choice_test_harness/evals_summarize.yaml
similarity index 100%
rename from demos/use_cases/model_choice_with_test_harness/evals_summarize.yaml
rename to demos/advanced/model_choice_test_harness/evals_summarize.yaml
diff --git a/demos/use_cases/model_choice_with_test_harness/plano_config_with_aliases.yaml b/demos/advanced/model_choice_test_harness/plano_config_with_aliases.yaml
similarity index 69%
rename from demos/use_cases/model_choice_with_test_harness/plano_config_with_aliases.yaml
rename to demos/advanced/model_choice_test_harness/plano_config_with_aliases.yaml
index 3bd84b34..b25331e1 100644
--- a/demos/use_cases/model_choice_with_test_harness/plano_config_with_aliases.yaml
+++ b/demos/advanced/model_choice_test_harness/plano_config_with_aliases.yaml
@@ -1,13 +1,11 @@
-version: v0.1.0
+version: v0.3.0
listeners:
- egress_traffic:
- address: 0.0.0.0
+ - type: model
+ name: model_listener
port: 12000
- message_format: openai
- timeout: 30s
-llm_providers:
+model_providers:
- model: openai/gpt-4o-mini
access_key: $OPENAI_API_KEY
default: true
@@ -20,3 +18,6 @@ model_aliases:
target: gpt-4o-mini
arch.reason.v1:
target: o3
+
+tracing:
+ random_sampling: 100
diff --git a/demos/use_cases/model_choice_with_test_harness/pyproject.toml b/demos/advanced/model_choice_test_harness/pyproject.toml
similarity index 100%
rename from demos/use_cases/model_choice_with_test_harness/pyproject.toml
rename to demos/advanced/model_choice_test_harness/pyproject.toml
diff --git a/demos/use_cases/model_choice_with_test_harness/run_demo.sh b/demos/advanced/model_choice_test_harness/run_demo.sh
similarity index 100%
rename from demos/use_cases/model_choice_with_test_harness/run_demo.sh
rename to demos/advanced/model_choice_test_harness/run_demo.sh
diff --git a/demos/use_cases/model_choice_with_test_harness/uv.lock b/demos/advanced/model_choice_test_harness/uv.lock
similarity index 100%
rename from demos/use_cases/model_choice_with_test_harness/uv.lock
rename to demos/advanced/model_choice_test_harness/uv.lock
diff --git a/demos/samples_python/multi_turn_rag_agent/Dockerfile b/demos/advanced/multi_turn_rag/Dockerfile
similarity index 100%
rename from demos/samples_python/multi_turn_rag_agent/Dockerfile
rename to demos/advanced/multi_turn_rag/Dockerfile
diff --git a/demos/samples_python/multi_turn_rag_agent/README.md b/demos/advanced/multi_turn_rag/README.md
similarity index 100%
rename from demos/samples_python/multi_turn_rag_agent/README.md
rename to demos/advanced/multi_turn_rag/README.md
diff --git a/demos/samples_python/multi_turn_rag_agent/config.yaml b/demos/advanced/multi_turn_rag/config.yaml
similarity index 93%
rename from demos/samples_python/multi_turn_rag_agent/config.yaml
rename to demos/advanced/multi_turn_rag/config.yaml
index a29622ec..2c677eec 100644
--- a/demos/samples_python/multi_turn_rag_agent/config.yaml
+++ b/demos/advanced/multi_turn_rag/config.yaml
@@ -1,18 +1,16 @@
-version: v0.1.0
+version: v0.3.0
listeners:
- ingress_traffic:
- address: 0.0.0.0
+ - type: prompt
+ name: prompt_listener
port: 10000
- message_format: openai
- timeout: 30s
endpoints:
rag_energy_source_agent:
endpoint: host.docker.internal:18083
connect_timeout: 0.005s
-llm_providers:
+model_providers:
- access_key: $OPENAI_API_KEY
model: openai/gpt-4o-mini
default: true
diff --git a/demos/advanced/multi_turn_rag/docker-compose.yaml b/demos/advanced/multi_turn_rag/docker-compose.yaml
new file mode 100644
index 00000000..1c3ed73c
--- /dev/null
+++ b/demos/advanced/multi_turn_rag/docker-compose.yaml
@@ -0,0 +1,28 @@
+services:
+ rag_energy_source_agent:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ ports:
+ - "18083:80"
+ healthcheck:
+ test: ["CMD", "curl" ,"http://localhost:80/healthz"]
+ interval: 5s
+ retries: 20
+
+ anythingllm:
+ image: mintplexlabs/anythingllm
+ restart: always
+ ports:
+ - "3001:3001"
+ cap_add:
+ - SYS_ADMIN
+ environment:
+ - STORAGE_DIR=/app/server/storage
+ - LLM_PROVIDER=generic-openai
+ - GENERIC_OPEN_AI_BASE_PATH=http://host.docker.internal:10000/v1
+ - GENERIC_OPEN_AI_MODEL_PREF=gpt-4o-mini
+ - GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT=128000
+ - GENERIC_OPEN_AI_API_KEY=sk-placeholder
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
diff --git a/demos/samples_python/multi_turn_rag_agent/main.py b/demos/advanced/multi_turn_rag/main.py
similarity index 100%
rename from demos/samples_python/multi_turn_rag_agent/main.py
rename to demos/advanced/multi_turn_rag/main.py
diff --git a/demos/samples_python/multi_turn_rag_agent/mutli-turn-example.png b/demos/advanced/multi_turn_rag/mutli-turn-example.png
similarity index 100%
rename from demos/samples_python/multi_turn_rag_agent/mutli-turn-example.png
rename to demos/advanced/multi_turn_rag/mutli-turn-example.png
diff --git a/demos/samples_python/multi_turn_rag_agent/requirements.txt b/demos/advanced/multi_turn_rag/requirements.txt
similarity index 100%
rename from demos/samples_python/multi_turn_rag_agent/requirements.txt
rename to demos/advanced/multi_turn_rag/requirements.txt
diff --git a/demos/samples_python/multi_turn_rag_agent/run_demo.sh b/demos/advanced/multi_turn_rag/run_demo.sh
similarity index 100%
rename from demos/samples_python/multi_turn_rag_agent/run_demo.sh
rename to demos/advanced/multi_turn_rag/run_demo.sh
diff --git a/demos/samples_python/stock_quote/README.md b/demos/advanced/stock_quote/README.md
similarity index 100%
rename from demos/samples_python/stock_quote/README.md
rename to demos/advanced/stock_quote/README.md
diff --git a/demos/samples_python/stock_quote/config.yaml b/demos/advanced/stock_quote/config.yaml
similarity index 93%
rename from demos/samples_python/stock_quote/config.yaml
rename to demos/advanced/stock_quote/config.yaml
index 5cd20a44..bef46082 100644
--- a/demos/samples_python/stock_quote/config.yaml
+++ b/demos/advanced/stock_quote/config.yaml
@@ -1,13 +1,11 @@
-version: v0.1.0
+version: v0.3.0
listeners:
- ingress_traffic:
- address: 0.0.0.0
+ - type: prompt
+ name: prompt_listener
port: 10000
- message_format: openai
- timeout: 30s
-llm_providers:
+model_providers:
- access_key: $OPENAI_API_KEY
model: openai/gpt-4o
diff --git a/demos/advanced/stock_quote/docker-compose.yaml b/demos/advanced/stock_quote/docker-compose.yaml
new file mode 100644
index 00000000..ff161662
--- /dev/null
+++ b/demos/advanced/stock_quote/docker-compose.yaml
@@ -0,0 +1,25 @@
+services:
+ anythingllm:
+ image: mintplexlabs/anythingllm
+ restart: always
+ ports:
+ - "3001:3001"
+ cap_add:
+ - SYS_ADMIN
+ environment:
+ - STORAGE_DIR=/app/server/storage
+ - LLM_PROVIDER=generic-openai
+ - GENERIC_OPEN_AI_BASE_PATH=http://host.docker.internal:10000/v1
+ - GENERIC_OPEN_AI_MODEL_PREF=gpt-4o-mini
+ - GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT=128000
+ - GENERIC_OPEN_AI_API_KEY=sk-placeholder
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+
+ jaeger:
+ build:
+ context: ../../shared/jaeger
+ ports:
+ - "16686:16686"
+ - "4317:4317"
+ - "4318:4318"
diff --git a/demos/samples_python/currency_exchange/run_demo.sh b/demos/advanced/stock_quote/run_demo.sh
similarity index 100%
rename from demos/samples_python/currency_exchange/run_demo.sh
rename to demos/advanced/stock_quote/run_demo.sh
diff --git a/demos/samples_python/stock_quote/stock_quote_demo.png b/demos/advanced/stock_quote/stock_quote_demo.png
similarity index 100%
rename from demos/samples_python/stock_quote/stock_quote_demo.png
rename to demos/advanced/stock_quote/stock_quote_demo.png
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/Dockerfile b/demos/agent_orchestration/multi_agent_crewai_langchain/Dockerfile
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/Dockerfile
rename to demos/agent_orchestration/multi_agent_crewai_langchain/Dockerfile
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/README.md b/demos/agent_orchestration/multi_agent_crewai_langchain/README.md
similarity index 98%
rename from demos/use_cases/multi_agent_with_crewai_langchain/README.md
rename to demos/agent_orchestration/multi_agent_crewai_langchain/README.md
index e36af9a2..deedda23 100644
--- a/demos/use_cases/multi_agent_with_crewai_langchain/README.md
+++ b/demos/agent_orchestration/multi_agent_crewai_langchain/README.md
@@ -37,7 +37,7 @@ Plano acts as a **framework-agnostic proxy and data plane** that:
```bash
# From the demo directory
-cd demos/use_cases/multi_agent_with_crewai_langchain
+cd demos/agent_orchestration/multi_agent_crewai_langchain
# Build and start all services
docker-compose up -d
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/config.yaml b/demos/agent_orchestration/multi_agent_crewai_langchain/config.yaml
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/config.yaml
rename to demos/agent_orchestration/multi_agent_crewai_langchain/config.yaml
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/crewai/flight_agent.py b/demos/agent_orchestration/multi_agent_crewai_langchain/crewai/flight_agent.py
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/crewai/flight_agent.py
rename to demos/agent_orchestration/multi_agent_crewai_langchain/crewai/flight_agent.py
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/docker-compose.yaml b/demos/agent_orchestration/multi_agent_crewai_langchain/docker-compose.yaml
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/docker-compose.yaml
rename to demos/agent_orchestration/multi_agent_crewai_langchain/docker-compose.yaml
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/langchain/weather_agent.py b/demos/agent_orchestration/multi_agent_crewai_langchain/langchain/weather_agent.py
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/langchain/weather_agent.py
rename to demos/agent_orchestration/multi_agent_crewai_langchain/langchain/weather_agent.py
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/openai_protocol.py b/demos/agent_orchestration/multi_agent_crewai_langchain/openai_protocol.py
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/openai_protocol.py
rename to demos/agent_orchestration/multi_agent_crewai_langchain/openai_protocol.py
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/pyproject.toml b/demos/agent_orchestration/multi_agent_crewai_langchain/pyproject.toml
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/pyproject.toml
rename to demos/agent_orchestration/multi_agent_crewai_langchain/pyproject.toml
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/traces.png b/demos/agent_orchestration/multi_agent_crewai_langchain/traces.png
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/traces.png
rename to demos/agent_orchestration/multi_agent_crewai_langchain/traces.png
diff --git a/demos/use_cases/multi_agent_with_crewai_langchain/uv.lock b/demos/agent_orchestration/multi_agent_crewai_langchain/uv.lock
similarity index 100%
rename from demos/use_cases/multi_agent_with_crewai_langchain/uv.lock
rename to demos/agent_orchestration/multi_agent_crewai_langchain/uv.lock
diff --git a/demos/use_cases/travel_agents/Dockerfile b/demos/agent_orchestration/travel_agents/Dockerfile
similarity index 100%
rename from demos/use_cases/travel_agents/Dockerfile
rename to demos/agent_orchestration/travel_agents/Dockerfile
diff --git a/demos/use_cases/travel_agents/README.md b/demos/agent_orchestration/travel_agents/README.md
similarity index 100%
rename from demos/use_cases/travel_agents/README.md
rename to demos/agent_orchestration/travel_agents/README.md
diff --git a/demos/use_cases/travel_agents/config.yaml b/demos/agent_orchestration/travel_agents/config.yaml
similarity index 100%
rename from demos/use_cases/travel_agents/config.yaml
rename to demos/agent_orchestration/travel_agents/config.yaml
diff --git a/demos/use_cases/travel_agents/docker-compose.yaml b/demos/agent_orchestration/travel_agents/docker-compose.yaml
similarity index 100%
rename from demos/use_cases/travel_agents/docker-compose.yaml
rename to demos/agent_orchestration/travel_agents/docker-compose.yaml
diff --git a/demos/use_cases/travel_agents/pyproject.toml b/demos/agent_orchestration/travel_agents/pyproject.toml
similarity index 100%
rename from demos/use_cases/travel_agents/pyproject.toml
rename to demos/agent_orchestration/travel_agents/pyproject.toml
diff --git a/demos/use_cases/travel_agents/src/travel_agents/flight_agent.py b/demos/agent_orchestration/travel_agents/src/travel_agents/flight_agent.py
similarity index 100%
rename from demos/use_cases/travel_agents/src/travel_agents/flight_agent.py
rename to demos/agent_orchestration/travel_agents/src/travel_agents/flight_agent.py
diff --git a/demos/use_cases/travel_agents/src/travel_agents/weather_agent.py b/demos/agent_orchestration/travel_agents/src/travel_agents/weather_agent.py
similarity index 100%
rename from demos/use_cases/travel_agents/src/travel_agents/weather_agent.py
rename to demos/agent_orchestration/travel_agents/src/travel_agents/weather_agent.py
diff --git a/demos/use_cases/travel_agents/test.rest b/demos/agent_orchestration/travel_agents/test.rest
similarity index 100%
rename from demos/use_cases/travel_agents/test.rest
rename to demos/agent_orchestration/travel_agents/test.rest
diff --git a/demos/use_cases/travel_agents/tracing.png b/demos/agent_orchestration/travel_agents/tracing.png
similarity index 100%
rename from demos/use_cases/travel_agents/tracing.png
rename to demos/agent_orchestration/travel_agents/tracing.png
diff --git a/demos/use_cases/travel_agents/travel_agent_request.rest b/demos/agent_orchestration/travel_agents/travel_agent_request.rest
similarity index 100%
rename from demos/use_cases/travel_agents/travel_agent_request.rest
rename to demos/agent_orchestration/travel_agents/travel_agent_request.rest
diff --git a/demos/use_cases/travel_agents/uv.lock b/demos/agent_orchestration/travel_agents/uv.lock
similarity index 100%
rename from demos/use_cases/travel_agents/uv.lock
rename to demos/agent_orchestration/travel_agents/uv.lock
diff --git a/demos/use_cases/http_filter/Dockerfile b/demos/filter_chains/http_filter/Dockerfile
similarity index 100%
rename from demos/use_cases/http_filter/Dockerfile
rename to demos/filter_chains/http_filter/Dockerfile
diff --git a/demos/use_cases/http_filter/README.md b/demos/filter_chains/http_filter/README.md
similarity index 100%
rename from demos/use_cases/http_filter/README.md
rename to demos/filter_chains/http_filter/README.md
diff --git a/demos/use_cases/http_filter/config.yaml b/demos/filter_chains/http_filter/config.yaml
similarity index 100%
rename from demos/use_cases/http_filter/config.yaml
rename to demos/filter_chains/http_filter/config.yaml
diff --git a/demos/use_cases/http_filter/docker-compose.yaml b/demos/filter_chains/http_filter/docker-compose.yaml
similarity index 100%
rename from demos/use_cases/http_filter/docker-compose.yaml
rename to demos/filter_chains/http_filter/docker-compose.yaml
diff --git a/demos/use_cases/http_filter/http.rest b/demos/filter_chains/http_filter/http.rest
similarity index 100%
rename from demos/use_cases/http_filter/http.rest
rename to demos/filter_chains/http_filter/http.rest
diff --git a/demos/use_cases/http_filter/mcp_query.rest b/demos/filter_chains/http_filter/mcp_query.rest
similarity index 100%
rename from demos/use_cases/http_filter/mcp_query.rest
rename to demos/filter_chains/http_filter/mcp_query.rest
diff --git a/demos/use_cases/http_filter/pyproject.toml b/demos/filter_chains/http_filter/pyproject.toml
similarity index 100%
rename from demos/use_cases/http_filter/pyproject.toml
rename to demos/filter_chains/http_filter/pyproject.toml
diff --git a/demos/use_cases/http_filter/sample_queries.md b/demos/filter_chains/http_filter/sample_queries.md
similarity index 100%
rename from demos/use_cases/http_filter/sample_queries.md
rename to demos/filter_chains/http_filter/sample_queries.md
diff --git a/demos/use_cases/http_filter/src/rag_agent/__init__.py b/demos/filter_chains/http_filter/src/rag_agent/__init__.py
similarity index 100%
rename from demos/use_cases/http_filter/src/rag_agent/__init__.py
rename to demos/filter_chains/http_filter/src/rag_agent/__init__.py
diff --git a/demos/use_cases/http_filter/src/rag_agent/__main__.py b/demos/filter_chains/http_filter/src/rag_agent/__main__.py
similarity index 100%
rename from demos/use_cases/http_filter/src/rag_agent/__main__.py
rename to demos/filter_chains/http_filter/src/rag_agent/__main__.py
diff --git a/demos/use_cases/http_filter/src/rag_agent/api.py b/demos/filter_chains/http_filter/src/rag_agent/api.py
similarity index 100%
rename from demos/use_cases/http_filter/src/rag_agent/api.py
rename to demos/filter_chains/http_filter/src/rag_agent/api.py
diff --git a/demos/use_cases/http_filter/src/rag_agent/context_builder.py b/demos/filter_chains/http_filter/src/rag_agent/context_builder.py
similarity index 100%
rename from demos/use_cases/http_filter/src/rag_agent/context_builder.py
rename to demos/filter_chains/http_filter/src/rag_agent/context_builder.py
diff --git a/demos/use_cases/http_filter/src/rag_agent/input_guards.py b/demos/filter_chains/http_filter/src/rag_agent/input_guards.py
similarity index 100%
rename from demos/use_cases/http_filter/src/rag_agent/input_guards.py
rename to demos/filter_chains/http_filter/src/rag_agent/input_guards.py
diff --git a/demos/use_cases/http_filter/src/rag_agent/query_rewriter.py b/demos/filter_chains/http_filter/src/rag_agent/query_rewriter.py
similarity index 100%
rename from demos/use_cases/http_filter/src/rag_agent/query_rewriter.py
rename to demos/filter_chains/http_filter/src/rag_agent/query_rewriter.py
diff --git a/demos/use_cases/http_filter/src/rag_agent/rag_agent.py b/demos/filter_chains/http_filter/src/rag_agent/rag_agent.py
similarity index 100%
rename from demos/use_cases/http_filter/src/rag_agent/rag_agent.py
rename to demos/filter_chains/http_filter/src/rag_agent/rag_agent.py
diff --git a/demos/use_cases/http_filter/src/rag_agent/sample_knowledge_base.csv b/demos/filter_chains/http_filter/src/rag_agent/sample_knowledge_base.csv
similarity index 100%
rename from demos/use_cases/http_filter/src/rag_agent/sample_knowledge_base.csv
rename to demos/filter_chains/http_filter/src/rag_agent/sample_knowledge_base.csv
diff --git a/demos/use_cases/http_filter/start_agents.sh b/demos/filter_chains/http_filter/start_agents.sh
similarity index 100%
rename from demos/use_cases/http_filter/start_agents.sh
rename to demos/filter_chains/http_filter/start_agents.sh
diff --git a/demos/use_cases/http_filter/test.rest b/demos/filter_chains/http_filter/test.rest
similarity index 100%
rename from demos/use_cases/http_filter/test.rest
rename to demos/filter_chains/http_filter/test.rest
diff --git a/demos/use_cases/http_filter/uv.lock b/demos/filter_chains/http_filter/uv.lock
similarity index 100%
rename from demos/use_cases/http_filter/uv.lock
rename to demos/filter_chains/http_filter/uv.lock
diff --git a/demos/use_cases/mcp_filter/Dockerfile b/demos/filter_chains/mcp_filter/Dockerfile
similarity index 100%
rename from demos/use_cases/mcp_filter/Dockerfile
rename to demos/filter_chains/mcp_filter/Dockerfile
diff --git a/demos/use_cases/mcp_filter/README.md b/demos/filter_chains/mcp_filter/README.md
similarity index 100%
rename from demos/use_cases/mcp_filter/README.md
rename to demos/filter_chains/mcp_filter/README.md
diff --git a/demos/use_cases/mcp_filter/config.yaml b/demos/filter_chains/mcp_filter/config.yaml
similarity index 100%
rename from demos/use_cases/mcp_filter/config.yaml
rename to demos/filter_chains/mcp_filter/config.yaml
diff --git a/demos/use_cases/mcp_filter/docker-compose.yaml b/demos/filter_chains/mcp_filter/docker-compose.yaml
similarity index 100%
rename from demos/use_cases/mcp_filter/docker-compose.yaml
rename to demos/filter_chains/mcp_filter/docker-compose.yaml
diff --git a/demos/use_cases/mcp_filter/mcp_query.rest b/demos/filter_chains/mcp_filter/mcp_query.rest
similarity index 100%
rename from demos/use_cases/mcp_filter/mcp_query.rest
rename to demos/filter_chains/mcp_filter/mcp_query.rest
diff --git a/demos/use_cases/mcp_filter/pyproject.toml b/demos/filter_chains/mcp_filter/pyproject.toml
similarity index 100%
rename from demos/use_cases/mcp_filter/pyproject.toml
rename to demos/filter_chains/mcp_filter/pyproject.toml
diff --git a/demos/use_cases/mcp_filter/sample_queries.md b/demos/filter_chains/mcp_filter/sample_queries.md
similarity index 100%
rename from demos/use_cases/mcp_filter/sample_queries.md
rename to demos/filter_chains/mcp_filter/sample_queries.md
diff --git a/demos/use_cases/mcp_filter/src/rag_agent/__init__.py b/demos/filter_chains/mcp_filter/src/rag_agent/__init__.py
similarity index 100%
rename from demos/use_cases/mcp_filter/src/rag_agent/__init__.py
rename to demos/filter_chains/mcp_filter/src/rag_agent/__init__.py
diff --git a/demos/use_cases/mcp_filter/src/rag_agent/__main__.py b/demos/filter_chains/mcp_filter/src/rag_agent/__main__.py
similarity index 100%
rename from demos/use_cases/mcp_filter/src/rag_agent/__main__.py
rename to demos/filter_chains/mcp_filter/src/rag_agent/__main__.py
diff --git a/demos/use_cases/mcp_filter/src/rag_agent/api.py b/demos/filter_chains/mcp_filter/src/rag_agent/api.py
similarity index 100%
rename from demos/use_cases/mcp_filter/src/rag_agent/api.py
rename to demos/filter_chains/mcp_filter/src/rag_agent/api.py
diff --git a/demos/use_cases/mcp_filter/src/rag_agent/context_builder.py b/demos/filter_chains/mcp_filter/src/rag_agent/context_builder.py
similarity index 100%
rename from demos/use_cases/mcp_filter/src/rag_agent/context_builder.py
rename to demos/filter_chains/mcp_filter/src/rag_agent/context_builder.py
diff --git a/demos/use_cases/mcp_filter/src/rag_agent/input_guards.py b/demos/filter_chains/mcp_filter/src/rag_agent/input_guards.py
similarity index 100%
rename from demos/use_cases/mcp_filter/src/rag_agent/input_guards.py
rename to demos/filter_chains/mcp_filter/src/rag_agent/input_guards.py
diff --git a/demos/use_cases/mcp_filter/src/rag_agent/query_rewriter.py b/demos/filter_chains/mcp_filter/src/rag_agent/query_rewriter.py
similarity index 100%
rename from demos/use_cases/mcp_filter/src/rag_agent/query_rewriter.py
rename to demos/filter_chains/mcp_filter/src/rag_agent/query_rewriter.py
diff --git a/demos/use_cases/mcp_filter/src/rag_agent/rag_agent.py b/demos/filter_chains/mcp_filter/src/rag_agent/rag_agent.py
similarity index 100%
rename from demos/use_cases/mcp_filter/src/rag_agent/rag_agent.py
rename to demos/filter_chains/mcp_filter/src/rag_agent/rag_agent.py
diff --git a/demos/use_cases/mcp_filter/src/rag_agent/sample_knowledge_base.csv b/demos/filter_chains/mcp_filter/src/rag_agent/sample_knowledge_base.csv
similarity index 100%
rename from demos/use_cases/mcp_filter/src/rag_agent/sample_knowledge_base.csv
rename to demos/filter_chains/mcp_filter/src/rag_agent/sample_knowledge_base.csv
diff --git a/demos/use_cases/mcp_filter/start_agents.sh b/demos/filter_chains/mcp_filter/start_agents.sh
similarity index 100%
rename from demos/use_cases/mcp_filter/start_agents.sh
rename to demos/filter_chains/mcp_filter/start_agents.sh
diff --git a/demos/use_cases/mcp_filter/test.rest b/demos/filter_chains/mcp_filter/test.rest
similarity index 100%
rename from demos/use_cases/mcp_filter/test.rest
rename to demos/filter_chains/mcp_filter/test.rest
diff --git a/demos/use_cases/mcp_filter/uv.lock b/demos/filter_chains/mcp_filter/uv.lock
similarity index 100%
rename from demos/use_cases/mcp_filter/uv.lock
rename to demos/filter_chains/mcp_filter/uv.lock
diff --git a/demos/use_cases/llm_routing/README.md b/demos/getting_started/llm_gateway/README.md
similarity index 72%
rename from demos/use_cases/llm_routing/README.md
rename to demos/getting_started/llm_gateway/README.md
index 4b431603..e87467fc 100644
--- a/demos/use_cases/llm_routing/README.md
+++ b/demos/getting_started/llm_gateway/README.md
@@ -7,7 +7,7 @@ This demo shows how you can use Plano gateway to manage keys and route to upstre
```sh
sh run_demo.sh
```
-1. Navigate to http://localhost:18080/
+1. Navigate to http://localhost:3001/
Following screen shows an example of interaction with Plano gateway showing dynamic routing. You can select between different LLMs using "override model" option in the chat UI.
@@ -32,7 +32,7 @@ $ curl --header 'Content-Type: application/json' \
"messages": {
"role": "assistant",
"tool_calls": null,
- "content": "Hello! How can I assist you today? Let's chat about anything you'd like. 😊"
+ "content": "Hello! How can I assist you today? Let's chat about anything you'd like."
},
"finish_reason": "stop"
}
@@ -47,11 +47,7 @@ $ curl --header 'Content-Type: application/json' \
```
# Observability
-Plano gateway publishes stats endpoint at http://localhost:19901/stats. In this demo we are using prometheus to pull stats from Plano and we are using grafana to visualize the stats in dashboard. To see grafana dashboard follow instructions below,
-
-1. Navigate to http://localhost:3000/ to open grafana UI (use admin/grafana as credentials)
-1. From grafana left nav click on dashboards and select "Intelligent Gateway Overview" to view Plano gateway stats
-1. For tracing you can head over to http://localhost:16686/ to view recent traces.
+For tracing you can head over to http://localhost:16686/ to view recent traces.
Following is a screenshot of tracing UI showing call received by Plano gateway and making upstream call to LLM,
diff --git a/demos/use_cases/llm_routing/config.yaml b/demos/getting_started/llm_gateway/config.yaml
similarity index 100%
rename from demos/use_cases/llm_routing/config.yaml
rename to demos/getting_started/llm_gateway/config.yaml
diff --git a/demos/use_cases/llm_routing/docker-compose.yaml b/demos/getting_started/llm_gateway/docker-compose.yaml
similarity index 86%
rename from demos/use_cases/llm_routing/docker-compose.yaml
rename to demos/getting_started/llm_gateway/docker-compose.yaml
index 784578d0..52723fbf 100644
--- a/demos/use_cases/llm_routing/docker-compose.yaml
+++ b/demos/getting_started/llm_gateway/docker-compose.yaml
@@ -37,13 +37,3 @@ services:
- "16686:16686"
- "4317:4317"
- "4318:4318"
-
- prometheus:
- build:
- context: ../../shared/prometheus
-
- grafana:
- build:
- context: ../../shared/grafana
- ports:
- - "3000:3000"
diff --git a/demos/use_cases/llm_routing/jaeger_tracing_llm_routing.png b/demos/getting_started/llm_gateway/jaeger_tracing_llm_routing.png
similarity index 100%
rename from demos/use_cases/llm_routing/jaeger_tracing_llm_routing.png
rename to demos/getting_started/llm_gateway/jaeger_tracing_llm_routing.png
diff --git a/demos/use_cases/llm_routing/llm_routing_demo.png b/demos/getting_started/llm_gateway/llm_routing_demo.png
similarity index 100%
rename from demos/use_cases/llm_routing/llm_routing_demo.png
rename to demos/getting_started/llm_gateway/llm_routing_demo.png
diff --git a/demos/use_cases/llm_routing/run_demo.sh b/demos/getting_started/llm_gateway/run_demo.sh
similarity index 100%
rename from demos/use_cases/llm_routing/run_demo.sh
rename to demos/getting_started/llm_gateway/run_demo.sh
diff --git a/demos/samples_python/weather_forecast/Dockerfile b/demos/getting_started/weather_forecast/Dockerfile
similarity index 100%
rename from demos/samples_python/weather_forecast/Dockerfile
rename to demos/getting_started/weather_forecast/Dockerfile
diff --git a/demos/getting_started/weather_forecast/README.md b/demos/getting_started/weather_forecast/README.md
new file mode 100644
index 00000000..8a9eb6c0
--- /dev/null
+++ b/demos/getting_started/weather_forecast/README.md
@@ -0,0 +1,28 @@
+# Function calling
+
+This demo shows how you can use Plano's core function calling capabilities.
+
+# Starting the demo
+
+1. Please make sure the [pre-requisites](https://github.com/katanemo/arch/?tab=readme-ov-file#prerequisites) are installed correctly
+2. Start Plano
+
+3. ```sh
+ sh run_demo.sh
+ ```
+4. Navigate to http://localhost:3001/
+5. You can type in queries like "how is the weather?"
+
+Here is a sample interaction,
+
+
+## Tracing
+
+To see a tracing dashboard, navigate to http://localhost:16686/ to open Jaeger UI.
+
+### Stopping Demo
+
+1. To end the demo, run the following command:
+ ```sh
+ sh run_demo.sh down
+ ```
diff --git a/demos/samples_python/weather_forecast/config.yaml b/demos/getting_started/weather_forecast/config.yaml
similarity index 89%
rename from demos/samples_python/weather_forecast/config.yaml
rename to demos/getting_started/weather_forecast/config.yaml
index eba38764..69451552 100644
--- a/demos/samples_python/weather_forecast/config.yaml
+++ b/demos/getting_started/weather_forecast/config.yaml
@@ -1,17 +1,13 @@
-version: v0.1.0
+version: v0.3.0
listeners:
- ingress_traffic:
- address: 0.0.0.0
+ - type: prompt
+ name: prompt_listener
port: 10000
- message_format: openai
- timeout: 30s
- egress_traffic:
- address: 0.0.0.0
+ - type: model
+ name: model_listener
port: 12000
- message_format: openai
- timeout: 30s
endpoints:
weather_forecast_service:
@@ -22,7 +18,7 @@ overrides:
# confidence threshold for prompt target intent matching
prompt_target_intent_matching_threshold: 0.6
-llm_providers:
+model_providers:
- access_key: $GROQ_API_KEY
model: groq/llama-3.2-3b-preview
diff --git a/demos/getting_started/weather_forecast/docker-compose.yaml b/demos/getting_started/weather_forecast/docker-compose.yaml
new file mode 100644
index 00000000..84074ab9
--- /dev/null
+++ b/demos/getting_started/weather_forecast/docker-compose.yaml
@@ -0,0 +1,27 @@
+services:
+ weather_forecast_service:
+ build:
+ context: ./
+ environment:
+ - OLTP_HOST=http://jaeger:4317
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+ ports:
+ - "18083:80"
+
+ anythingllm:
+ image: mintplexlabs/anythingllm
+ restart: always
+ ports:
+ - "3001:3001"
+ cap_add:
+ - SYS_ADMIN
+ environment:
+ - STORAGE_DIR=/app/server/storage
+ - LLM_PROVIDER=generic-openai
+ - GENERIC_OPEN_AI_BASE_PATH=http://host.docker.internal:10000/v1
+ - GENERIC_OPEN_AI_MODEL_PREF=gpt-4o-mini
+ - GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT=128000
+ - GENERIC_OPEN_AI_API_KEY=sk-placeholder
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
diff --git a/demos/samples_python/weather_forecast/hurl_tests/simple.hurl b/demos/getting_started/weather_forecast/hurl_tests/simple.hurl
similarity index 100%
rename from demos/samples_python/weather_forecast/hurl_tests/simple.hurl
rename to demos/getting_started/weather_forecast/hurl_tests/simple.hurl
diff --git a/demos/samples_python/weather_forecast/hurl_tests/simple_stream.hurl b/demos/getting_started/weather_forecast/hurl_tests/simple_stream.hurl
similarity index 100%
rename from demos/samples_python/weather_forecast/hurl_tests/simple_stream.hurl
rename to demos/getting_started/weather_forecast/hurl_tests/simple_stream.hurl
diff --git a/demos/samples_python/weather_forecast/main.py b/demos/getting_started/weather_forecast/main.py
similarity index 100%
rename from demos/samples_python/weather_forecast/main.py
rename to demos/getting_started/weather_forecast/main.py
diff --git a/demos/samples_python/weather_forecast/pyproject.toml b/demos/getting_started/weather_forecast/pyproject.toml
similarity index 100%
rename from demos/samples_python/weather_forecast/pyproject.toml
rename to demos/getting_started/weather_forecast/pyproject.toml
diff --git a/demos/samples_python/weather_forecast/run_demo.sh b/demos/getting_started/weather_forecast/run_demo.sh
similarity index 100%
rename from demos/samples_python/weather_forecast/run_demo.sh
rename to demos/getting_started/weather_forecast/run_demo.sh
diff --git a/demos/samples_python/weather_forecast/uv.lock b/demos/getting_started/weather_forecast/uv.lock
similarity index 100%
rename from demos/samples_python/weather_forecast/uv.lock
rename to demos/getting_started/weather_forecast/uv.lock
diff --git a/demos/use_cases/ollama/README.md b/demos/integrations/ollama/README.md
similarity index 100%
rename from demos/use_cases/ollama/README.md
rename to demos/integrations/ollama/README.md
diff --git a/demos/use_cases/ollama/config.yaml b/demos/integrations/ollama/config.yaml
similarity index 90%
rename from demos/use_cases/ollama/config.yaml
rename to demos/integrations/ollama/config.yaml
index 911af238..c86fe002 100644
--- a/demos/use_cases/ollama/config.yaml
+++ b/demos/integrations/ollama/config.yaml
@@ -1,13 +1,11 @@
-version: v0.1.0
+version: v0.3.0
listeners:
- egress_traffic:
- address: 0.0.0.0
+ - type: model
+ name: model_listener
port: 12000
- message_format: openai
- timeout: 30s
-llm_providers:
+model_providers:
- model: my_llm_provider/llama3.2
provider_interface: openai
diff --git a/demos/integrations/ollama/docker-compose.yaml b/demos/integrations/ollama/docker-compose.yaml
new file mode 100644
index 00000000..c272dbca
--- /dev/null
+++ b/demos/integrations/ollama/docker-compose.yaml
@@ -0,0 +1,25 @@
+services:
+ anythingllm:
+ image: mintplexlabs/anythingllm
+ restart: always
+ ports:
+ - "3001:3001"
+ cap_add:
+ - SYS_ADMIN
+ environment:
+ - STORAGE_DIR=/app/server/storage
+ - LLM_PROVIDER=generic-openai
+ - GENERIC_OPEN_AI_BASE_PATH=http://host.docker.internal:12000/v1
+ - GENERIC_OPEN_AI_MODEL_PREF=gpt-4o-mini
+ - GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT=128000
+ - GENERIC_OPEN_AI_API_KEY=sk-placeholder
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+
+ jaeger:
+ build:
+ context: ../../shared/jaeger
+ ports:
+ - "16686:16686"
+ - "4317:4317"
+ - "4318:4318"
diff --git a/demos/samples_python/stock_quote/run_demo.sh b/demos/integrations/ollama/run_demo.sh
similarity index 100%
rename from demos/samples_python/stock_quote/run_demo.sh
rename to demos/integrations/ollama/run_demo.sh
diff --git a/demos/use_cases/spotify_bearer_auth/README.md b/demos/integrations/spotify_bearer_auth/README.md
similarity index 100%
rename from demos/use_cases/spotify_bearer_auth/README.md
rename to demos/integrations/spotify_bearer_auth/README.md
diff --git a/demos/use_cases/spotify_bearer_auth/config.yaml b/demos/integrations/spotify_bearer_auth/config.yaml
similarity index 95%
rename from demos/use_cases/spotify_bearer_auth/config.yaml
rename to demos/integrations/spotify_bearer_auth/config.yaml
index b848d718..5b1f82a9 100644
--- a/demos/use_cases/spotify_bearer_auth/config.yaml
+++ b/demos/integrations/spotify_bearer_auth/config.yaml
@@ -1,11 +1,9 @@
-version: v0.1.0
+version: v0.3.0
listeners:
- ingress_traffic:
- address: 0.0.0.0
+ - type: prompt
+ name: prompt_listener
port: 10000
- message_format: openai
- timeout: 30s
overrides:
optimize_context_window: true
@@ -84,14 +82,14 @@ system_prompt: |
Make sure your output is valid Markdown. And don't say "formatted in Markdown". Thanks!
-llm_providers:
+model_providers:
- access_key: $OPENAI_API_KEY
model: openai/gpt-4o
default: true
prompt_targets:
- name: get_new_releases
- description: Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player’s “Browse” tab).
+ description: Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player's "Browse" tab).
parameters:
- name: country
description: the country where the album is released
@@ -121,3 +119,6 @@ prompt_targets:
path: /v1/artists/{artist_id}/top-tracks
http_headers:
Authorization: "Bearer $SPOTIFY_CLIENT_KEY"
+
+tracing:
+ random_sampling: 100
diff --git a/demos/integrations/spotify_bearer_auth/docker-compose.yaml b/demos/integrations/spotify_bearer_auth/docker-compose.yaml
new file mode 100644
index 00000000..ff161662
--- /dev/null
+++ b/demos/integrations/spotify_bearer_auth/docker-compose.yaml
@@ -0,0 +1,25 @@
+services:
+ anythingllm:
+ image: mintplexlabs/anythingllm
+ restart: always
+ ports:
+ - "3001:3001"
+ cap_add:
+ - SYS_ADMIN
+ environment:
+ - STORAGE_DIR=/app/server/storage
+ - LLM_PROVIDER=generic-openai
+ - GENERIC_OPEN_AI_BASE_PATH=http://host.docker.internal:10000/v1
+ - GENERIC_OPEN_AI_MODEL_PREF=gpt-4o-mini
+ - GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT=128000
+ - GENERIC_OPEN_AI_API_KEY=sk-placeholder
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+
+ jaeger:
+ build:
+ context: ../../shared/jaeger
+ ports:
+ - "16686:16686"
+ - "4317:4317"
+ - "4318:4318"
diff --git a/demos/use_cases/ollama/run_demo.sh b/demos/integrations/spotify_bearer_auth/run_demo.sh
similarity index 100%
rename from demos/use_cases/ollama/run_demo.sh
rename to demos/integrations/spotify_bearer_auth/run_demo.sh
diff --git a/demos/use_cases/spotify_bearer_auth/spotify_bearer_auth.png b/demos/integrations/spotify_bearer_auth/spotify_bearer_auth.png
similarity index 100%
rename from demos/use_cases/spotify_bearer_auth/spotify_bearer_auth.png
rename to demos/integrations/spotify_bearer_auth/spotify_bearer_auth.png
diff --git a/demos/use_cases/claude_code_router/README.md b/demos/llm_routing/claude_code_router/README.md
similarity index 99%
rename from demos/use_cases/claude_code_router/README.md
rename to demos/llm_routing/claude_code_router/README.md
index ac7a2f7c..d7aeab9e 100644
--- a/demos/use_cases/claude_code_router/README.md
+++ b/demos/llm_routing/claude_code_router/README.md
@@ -47,7 +47,7 @@ docker --version
```bash
# Clone and navigate to demo
git clone https://github.com/katanemo/arch.git
-cd arch/demos/use_cases/claude_code
+cd arch/demos/llm_routing/claude_code_router
```
### Step 2: Set API Keys
diff --git a/demos/use_cases/claude_code_router/claude_code.png b/demos/llm_routing/claude_code_router/claude_code.png
similarity index 100%
rename from demos/use_cases/claude_code_router/claude_code.png
rename to demos/llm_routing/claude_code_router/claude_code.png
diff --git a/demos/use_cases/claude_code_router/config.yaml b/demos/llm_routing/claude_code_router/config.yaml
similarity index 89%
rename from demos/use_cases/claude_code_router/config.yaml
rename to demos/llm_routing/claude_code_router/config.yaml
index e41db0c0..be763325 100644
--- a/demos/use_cases/claude_code_router/config.yaml
+++ b/demos/llm_routing/claude_code_router/config.yaml
@@ -1,13 +1,11 @@
-version: v0.1
+version: v0.3.0
listeners:
- egress_traffic:
- address: 0.0.0.0
+ - type: model
+ name: model_listener
port: 12000
- message_format: openai
- timeout: 30s
-llm_providers:
+model_providers:
# OpenAI Models
- model: openai/gpt-5-2025-08-07
access_key: $OPENAI_API_KEY
diff --git a/demos/use_cases/claude_code_router/model_selection.png b/demos/llm_routing/claude_code_router/model_selection.png
similarity index 100%
rename from demos/use_cases/claude_code_router/model_selection.png
rename to demos/llm_routing/claude_code_router/model_selection.png
diff --git a/demos/use_cases/claude_code_router/pretty_model_resolution.sh b/demos/llm_routing/claude_code_router/pretty_model_resolution.sh
similarity index 100%
rename from demos/use_cases/claude_code_router/pretty_model_resolution.sh
rename to demos/llm_routing/claude_code_router/pretty_model_resolution.sh
diff --git a/demos/use_cases/model_alias_routing/README.md b/demos/llm_routing/model_alias_routing/README.md
similarity index 100%
rename from demos/use_cases/model_alias_routing/README.md
rename to demos/llm_routing/model_alias_routing/README.md
diff --git a/demos/use_cases/model_alias_routing/config_with_aliases.yaml b/demos/llm_routing/model_alias_routing/config_with_aliases.yaml
similarity index 94%
rename from demos/use_cases/model_alias_routing/config_with_aliases.yaml
rename to demos/llm_routing/model_alias_routing/config_with_aliases.yaml
index 891fa4fe..53b679ae 100644
--- a/demos/use_cases/model_alias_routing/config_with_aliases.yaml
+++ b/demos/llm_routing/model_alias_routing/config_with_aliases.yaml
@@ -1,13 +1,11 @@
-version: v0.1
+version: v0.3.0
listeners:
- egress_traffic:
- address: 0.0.0.0
+ - type: model
+ name: model_listener
port: 12000
- message_format: openai
- timeout: 30s
-llm_providers:
+model_providers:
# OpenAI Models
- model: openai/gpt-5-mini-2025-08-07
@@ -95,3 +93,6 @@ model_aliases:
# Alias for grok testing
arch.grok.v1:
target: grok-4-0709
+
+tracing:
+ random_sampling: 100
diff --git a/demos/use_cases/model_alias_routing/run_demo.sh b/demos/llm_routing/model_alias_routing/run_demo.sh
similarity index 100%
rename from demos/use_cases/model_alias_routing/run_demo.sh
rename to demos/llm_routing/model_alias_routing/run_demo.sh
diff --git a/demos/use_cases/preference_based_routing/README.md b/demos/llm_routing/preference_based_routing/README.md
similarity index 93%
rename from demos/use_cases/preference_based_routing/README.md
rename to demos/llm_routing/preference_based_routing/README.md
index 0f4530a1..4cf2ec05 100644
--- a/demos/use_cases/preference_based_routing/README.md
+++ b/demos/llm_routing/preference_based_routing/README.md
@@ -8,7 +8,7 @@ Make sure your machine is up to date with [latest version of plano]([url](https:
1. start anythingllm
```bash
-(venv) $ cd demos/use_cases/preference_based_routing
+(venv) $ cd demos/llm_routing/preference_based_routing
(venv) $ docker compose up -d
```
2. start plano in the foreground
@@ -16,7 +16,7 @@ Make sure your machine is up to date with [latest version of plano]([url](https:
(venv) $ planoai up --service plano --foreground
# Or if installed with uv: uvx planoai up --service plano --foreground
2025-05-30 18:00:09,953 - planoai.main - INFO - Starting plano cli version: 0.4.6
-2025-05-30 18:00:09,953 - planoai.main - INFO - Validating /Users/adilhafeez/src/intelligent-prompt-gateway/demos/use_cases/preference_based_routing/config.yaml
+2025-05-30 18:00:09,953 - planoai.main - INFO - Validating /Users/adilhafeez/src/intelligent-prompt-gateway/demos/llm_routing/preference_based_routing/config.yaml
2025-05-30 18:00:10,422 - cli.core - INFO - Starting plano gateway, image name: plano, tag: katanemo/plano:0.4.6
2025-05-30 18:00:10,662 - cli.core - INFO - plano status: running, health status: starting
2025-05-30 18:00:11,712 - cli.core - INFO - plano status: running, health status: starting
diff --git a/demos/use_cases/preference_based_routing/config.yaml b/demos/llm_routing/preference_based_routing/config.yaml
similarity index 84%
rename from demos/use_cases/preference_based_routing/config.yaml
rename to demos/llm_routing/preference_based_routing/config.yaml
index cb9f685a..38e8920a 100644
--- a/demos/use_cases/preference_based_routing/config.yaml
+++ b/demos/llm_routing/preference_based_routing/config.yaml
@@ -1,13 +1,11 @@
-version: v0.1.0
+version: v0.3.0
listeners:
- egress_traffic:
- address: 0.0.0.0
+ - type: model
+ name: model_listener
port: 12000
- message_format: openai
- timeout: 30s
-llm_providers:
+model_providers:
- model: openai/gpt-4o-mini
access_key: $OPENAI_API_KEY
diff --git a/demos/use_cases/preference_based_routing/docker-compose.yaml b/demos/llm_routing/preference_based_routing/docker-compose.yaml
similarity index 87%
rename from demos/use_cases/preference_based_routing/docker-compose.yaml
rename to demos/llm_routing/preference_based_routing/docker-compose.yaml
index 37af57e2..7c88594a 100644
--- a/demos/use_cases/preference_based_routing/docker-compose.yaml
+++ b/demos/llm_routing/preference_based_routing/docker-compose.yaml
@@ -40,13 +40,3 @@ services:
- "16686:16686"
- "4317:4317"
- "4318:4318"
-
- # prometheus:
- # build:
- # context: ../../shared/prometheus
-
- # grafana:
- # build:
- # context: ../../shared/grafana
- # ports:
- # - "3000:3000"
diff --git a/demos/use_cases/preference_based_routing/hurl_tests/simple.hurl b/demos/llm_routing/preference_based_routing/hurl_tests/simple.hurl
similarity index 100%
rename from demos/use_cases/preference_based_routing/hurl_tests/simple.hurl
rename to demos/llm_routing/preference_based_routing/hurl_tests/simple.hurl
diff --git a/demos/use_cases/preference_based_routing/hurl_tests/simple_stream.hurl b/demos/llm_routing/preference_based_routing/hurl_tests/simple_stream.hurl
similarity index 100%
rename from demos/use_cases/preference_based_routing/hurl_tests/simple_stream.hurl
rename to demos/llm_routing/preference_based_routing/hurl_tests/simple_stream.hurl
diff --git a/demos/use_cases/preference_based_routing/plano_config_local.yaml b/demos/llm_routing/preference_based_routing/plano_config_local.yaml
similarity index 87%
rename from demos/use_cases/preference_based_routing/plano_config_local.yaml
rename to demos/llm_routing/preference_based_routing/plano_config_local.yaml
index b965cd0c..0a3db8bf 100644
--- a/demos/use_cases/preference_based_routing/plano_config_local.yaml
+++ b/demos/llm_routing/preference_based_routing/plano_config_local.yaml
@@ -1,17 +1,15 @@
-version: v0.1.0
+version: v0.3.0
routing:
model: Arch-Router
llm_provider: arch-router
listeners:
- egress_traffic:
- address: 0.0.0.0
+ - type: model
+ name: model_listener
port: 12000
- message_format: openai
- timeout: 30s
-llm_providers:
+model_providers:
- name: arch-router
model: arch/hf.co/katanemo/Arch-Router-1.5B.gguf:Q4_K_M
diff --git a/demos/use_cases/preference_based_routing/test_router_endpoint.rest b/demos/llm_routing/preference_based_routing/test_router_endpoint.rest
similarity index 100%
rename from demos/use_cases/preference_based_routing/test_router_endpoint.rest
rename to demos/llm_routing/preference_based_routing/test_router_endpoint.rest
diff --git a/demos/samples_java/weather_forcecast_service/.classpath b/demos/samples_java/weather_forcecast_service/.classpath
deleted file mode 100644
index e16ec965..00000000
--- a/demos/samples_java/weather_forcecast_service/.classpath
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/demos/samples_java/weather_forcecast_service/.project b/demos/samples_java/weather_forcecast_service/.project
deleted file mode 100644
index efcdddf7..00000000
--- a/demos/samples_java/weather_forcecast_service/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
- weather-forecast-service
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
- org.eclipse.m2e.core.maven2Nature
-
-
-
- 1742579142020
-
- 30
-
- org.eclipse.core.resources.regexFilterMatcher
- node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
-
-
-
-
diff --git a/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.core.resources.prefs b/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index abdea9ac..00000000
--- a/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/main/resources=UTF-8
-encoding/=UTF-8
diff --git a/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.jdt.apt.core.prefs b/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.jdt.apt.core.prefs
deleted file mode 100644
index d4313d4b..00000000
--- a/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.jdt.apt.core.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.apt.aptEnabled=false
diff --git a/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.jdt.core.prefs b/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 951833c6..00000000
--- a/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,10 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
-org.eclipse.jdt.core.compiler.processAnnotations=disabled
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.m2e.core.prefs b/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1..00000000
--- a/demos/samples_java/weather_forcecast_service/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/demos/samples_java/weather_forcecast_service/.vscode/launch.json b/demos/samples_java/weather_forcecast_service/.vscode/launch.json
deleted file mode 100644
index a9232a53..00000000
--- a/demos/samples_java/weather_forcecast_service/.vscode/launch.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- // Use IntelliSense to learn about possible attributes.
- // Hover to view descriptions of existing attributes.
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
- "version": "0.2.0",
- "configurations": [
- {
- "type": "java",
- "name": "WeatherForecastApplication",
- "request": "launch",
- "mainClass": "weather.WeatherForecastApplication",
- "projectName": "weather-forecast-service"
- }
- ]
-}
diff --git a/demos/samples_java/weather_forcecast_service/Dockerfile b/demos/samples_java/weather_forcecast_service/Dockerfile
deleted file mode 100644
index 909d9796..00000000
--- a/demos/samples_java/weather_forcecast_service/Dockerfile
+++ /dev/null
@@ -1,23 +0,0 @@
-# Stage 1: Build the application using Maven
-FROM maven:3.8.7-openjdk-18-slim AS build
-WORKDIR /app
-# Copy pom.xml and download dependencies first (caching)
-COPY pom.xml .
-RUN mvn dependency:go-offline
-# Copy the source code and build the application
-COPY src ./src
-RUN mvn clean package -DskipTests
-
-# Stage 2: Run the application using a slim JDK image
-FROM openjdk:17-jdk-slim
-WORKDIR /app
-# Copy the built jar from the previous stage
-COPY --from=build /app/target/weather-forecast-service-0.0.1-SNAPSHOT.jar app.jar
-# Expose the port on which the app runs (default Spring Boot is 8080)
-
-# Expose the application port and the debug port
-EXPOSE 8081
-EXPOSE 5005
-
-# Start the application with remote debugging enabled
-ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "app.jar"]
diff --git a/demos/samples_java/weather_forcecast_service/config.yaml b/demos/samples_java/weather_forcecast_service/config.yaml
deleted file mode 100644
index 68c3841d..00000000
--- a/demos/samples_java/weather_forcecast_service/config.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-version: v0.1.0
-
-listeners:
- ingress_traffic:
- address: 0.0.0.0
- port: 10000
- message_format: openai
- timeout: 30s
-
-# Centralized way to manage LLMs, manage keys, retry logic, failover and limits in a central way
-llm_providers:
- - access_key: $OPENAI_API_KEY
- model: openai/gpt-4o-mini
- default: true
-
-# Arch creates a round-robin load balancing between different endpoints, managed via the cluster subsystem.
-endpoints:
- weather_forecast_service:
- # value could be ip address or a hostname with port
- # this could also be a list of endpoints for load balancing
- # for example endpoint: [ ip1:port, ip2:port ]
- endpoint: host.docker.internal:18081
- # max time to wait for a connection to be established
- connect_timeout: 0.005s
-
-# default system prompt used by all prompt targets
-system_prompt: |
- You are a helpful weather assistant.
-
-prompt_targets:
- - name: weather_forecast
- description: get the weather forecast
- parameters:
- - name: location
- description: the location for which to get the weather forecast
- required: true
- type: string
- format: City, State
- - name: days
- description: the number of days for the forecast
- required: true
- type: int
- endpoint:
- name: weather_forecast_service
- path: /weather
- http_method: POST
-
-tracing:
- random_sampling: 100
- trace_arch_internal: true
diff --git a/demos/samples_java/weather_forcecast_service/docker-compose.yaml b/demos/samples_java/weather_forcecast_service/docker-compose.yaml
deleted file mode 100644
index b3df0266..00000000
--- a/demos/samples_java/weather_forcecast_service/docker-compose.yaml
+++ /dev/null
@@ -1,29 +0,0 @@
-services:
- weather_forecast_service:
- build:
- context: .
- dockerfile: Dockerfile
- ports:
- - "18081:8081"
- - "5005:5005"
-
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- dockerfile: Dockerfile
- ports:
- - "18080:8080"
- environment:
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- jaeger:
- build:
- context: ../../shared/jaeger
- ports:
- - "16686:16686"
- - "4317:4317"
- - "4318:4318"
diff --git a/demos/samples_java/weather_forcecast_service/pom.xml b/demos/samples_java/weather_forcecast_service/pom.xml
deleted file mode 100644
index db65d95a..00000000
--- a/demos/samples_java/weather_forcecast_service/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
- 4.0.0
-
- weather
- weather-forecast-service
- 0.0.1-SNAPSHOT
- jar
-
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.7.10
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter
-
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.8.1
-
- true
- lines,vars,source
-
-
-
-
-
diff --git a/demos/samples_java/weather_forcecast_service/src/main/java/weather/WeatherForecastApplication.java b/demos/samples_java/weather_forcecast_service/src/main/java/weather/WeatherForecastApplication.java
deleted file mode 100644
index b31a3444..00000000
--- a/demos/samples_java/weather_forcecast_service/src/main/java/weather/WeatherForecastApplication.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// File: src/main/java/com/example/weather/WeatherForecastApplication.java
-package weather;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class WeatherForecastApplication {
- public static void main(String[] args) {
- SpringApplication.run(WeatherForecastApplication.class, args);
- }
-}
diff --git a/demos/samples_java/weather_forcecast_service/src/main/java/weather/controller/WeatherController.java b/demos/samples_java/weather_forcecast_service/src/main/java/weather/controller/WeatherController.java
deleted file mode 100644
index d7caeaf9..00000000
--- a/demos/samples_java/weather_forcecast_service/src/main/java/weather/controller/WeatherController.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package weather.controller;
-
-import weather.model.DayForecast;
-import weather.model.WeatherForecastResponse;
-import weather.model.WeatherRequest;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-@RestController
-public class WeatherController {
-
- private Random random = new Random();
-
- @PostMapping("/weather")
- public WeatherForecastResponse getRandomWeatherForecast(@RequestBody WeatherRequest req) {
- WeatherForecastResponse response = new WeatherForecastResponse();
- response.setLocation(req.getLocation());
- response.setUnits(req.getUnits());
-
- List forecasts = new ArrayList<>();
- for (int i = 0; i < req.getDays(); i++) {
- // Generate a random min temperature between 50 and 89 (inclusive)
- int minTemp = random.nextInt(90 - 50) + 50;
- // Generate a max temperature between (minTemp + 5) and (minTemp + 19)
- int maxTemp = random.nextInt(15) + (minTemp + 5);
-
- double finalMinTemp = minTemp;
- double finalMaxTemp = maxTemp;
-
- // Convert to Celsius if necessary
- if (req.getUnits().equalsIgnoreCase("celsius") || req.getUnits().equalsIgnoreCase("c")) {
- finalMinTemp = (minTemp - 32) * 5.0 / 9.0;
- finalMaxTemp = (maxTemp - 32) * 5.0 / 9.0;
- }
-
- DayForecast dayForecast = new DayForecast();
- dayForecast.setDate(LocalDate.now().plusDays(i).toString());
- dayForecast.setMin(finalMinTemp);
- dayForecast.setMax(finalMaxTemp);
- dayForecast.setUnits(req.getUnits());
-
- forecasts.add(dayForecast);
- }
- response.setDailyForecast(forecasts);
- return response;
- }
-}
diff --git a/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/DayForecast.java b/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/DayForecast.java
deleted file mode 100644
index 0077a3a7..00000000
--- a/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/DayForecast.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package weather.model;
-
-public class DayForecast {
- private String date;
- private String units;
- private double min;
- private double max;
-
- public DayForecast() {}
-
- // Getters and setters
- public String getDate() {
- return date;
- }
-
- public void setDate(String date) {
- this.date = date;
- }
-
- public String getUnits() {
- return units;
- }
-
- public void setUnits(String units) {
- this.units = units;
- }
-
- public double getMin() {
- return min;
- }
- public void setMin(double min) {
- this.min = min;
- }
- public double getMax() {
- return max;
- }
- public void setMax(double max) {
- this.max = max;
- }
-}
diff --git a/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/WeatherForecastResponse.java b/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/WeatherForecastResponse.java
deleted file mode 100644
index 3fc4d116..00000000
--- a/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/WeatherForecastResponse.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package weather.model;
-
-import java.util.List;
-
-public class WeatherForecastResponse {
- private String location;
- private String units;
- private List forecast;
-
- // Default Constructor
- public WeatherForecastResponse() {}
-
- // Getters and Setters
- public String getLocation() {
- return location;
- }
-
- public void setLocation(String location) {
- this.location = location;
- }
-
- public String getUnits() {
- return units;
- }
-
- public void setUnits(String units) {
- this.units = units;
- }
-
- public List getDailyForecast() {
- return forecast;
- }
-
- public void setDailyForecast(List forecast) {
- this.forecast = forecast;
- }
-}
diff --git a/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/WeatherRequest.java b/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/WeatherRequest.java
deleted file mode 100644
index 8b5e1340..00000000
--- a/demos/samples_java/weather_forcecast_service/src/main/java/weather/model/WeatherRequest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package weather.model;
-
-public class WeatherRequest {
- private String location;
- private int days = 7;
- private String units = "Farenheit";
-
- public WeatherRequest() {}
-
- // Getters and setters
- public String getLocation() {
- return location;
- }
- public void setLocation(String location) {
- this.location = location;
- }
- public int getDays() {
- return days;
- }
- public void setDays(int days) {
- this.days = days;
- }
- public String getUnits() {
- return units;
- }
- public void setUnits(String units) {
- this.units = units;
- }
-}
diff --git a/demos/samples_java/weather_forcecast_service/src/main/resources/application.properties b/demos/samples_java/weather_forcecast_service/src/main/resources/application.properties
deleted file mode 100644
index 4d360de1..00000000
--- a/demos/samples_java/weather_forcecast_service/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-server.port=8081
diff --git a/demos/samples_python/currency_exchange/docker-compose.yaml b/demos/samples_python/currency_exchange/docker-compose.yaml
deleted file mode 100644
index bde2b082..00000000
--- a/demos/samples_python/currency_exchange/docker-compose.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-services:
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environemtn as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- jaeger:
- build:
- context: ../../shared/jaeger
- ports:
- - "16686:16686"
- - "4317:4317"
- - "4318:4318"
diff --git a/demos/samples_python/multi_turn_rag_agent/docker-compose.yaml b/demos/samples_python/multi_turn_rag_agent/docker-compose.yaml
deleted file mode 100644
index 4232ff9e..00000000
--- a/demos/samples_python/multi_turn_rag_agent/docker-compose.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-services:
- rag_energy_source_agent:
- build:
- context: .
- dockerfile: Dockerfile
- ports:
- - "18083:80"
- healthcheck:
- test: ["CMD", "curl" ,"http://localhost:80/healthz"]
- interval: 5s
- retries: 20
-
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- dockerfile: Dockerfile
- ports:
- - "18080:8080"
- environment:
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
diff --git a/demos/samples_python/stock_quote/docker-compose.yaml b/demos/samples_python/stock_quote/docker-compose.yaml
deleted file mode 100644
index 6e02922d..00000000
--- a/demos/samples_python/stock_quote/docker-compose.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-services:
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environment as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- jaeger:
- build:
- context: ../../shared/jaeger
- ports:
- - "16686:16686"
- - "4317:4317"
- - "4318:4318"
diff --git a/demos/samples_python/weather_forecast/README.md b/demos/samples_python/weather_forecast/README.md
deleted file mode 100644
index 66109772..00000000
--- a/demos/samples_python/weather_forecast/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Function calling
-
-This demo shows how you can use Plano's core function calling capabilities.
-
-# Starting the demo
-
-1. Please make sure the [pre-requisites](https://github.com/katanemo/arch/?tab=readme-ov-file#prerequisites) are installed correctly
-2. Start Plano
-
-3. ```sh
- sh run_demo.sh
- ```
-4. Navigate to http://localhost:18080/
-5. You can type in queries like "how is the weather?"
-
-# Observability
-
-Plano gateway publishes stats endpoint at http://localhost:19901/stats. In this demo we are using prometheus to pull stats from Plano and we are using grafana to visalize the stats in dashboard. To see grafana dashboard follow instructions below,
-
-1. Start grafana and prometheus using following command
- ```yaml
- docker compose --profile monitoring up
- ```
-2. Navigate to http://localhost:3000/ to open grafana UI (use admin/grafana as credentials)
-3. From grafana left nav click on dashboards and select "Intelligent Gateway Overview" to view Plano gateway stats
-
-Here is a sample interaction,
-
-
-## Tracing
-
-To see a tracing dashboard follow instructions below,
-
-1. For Jaeger, you can either use the default run_demo.sh script or run the following command:
-
-```sh
-sh run_demo.sh jaeger
-```
-
-2. For Logfire, first make sure to add a LOGFIRE_API_KEY to the .env file. You can either use the default run_demo.sh script or run the following command:
-
-```sh
-sh run_demo.sh logfire
-```
-
-3. For Signoz, you can either use the default run_demo.sh script or run the following command:
-
-```sh
-sh run_demo.sh signoz
-```
-
-If using Jaeger, navigate to http://localhost:16686/ to open Jaeger UI
-
-If using Signoz, navigate to http://localhost:3301/ to open Signoz UI
-
-If using Logfire, navigate to your logfire dashboard that you got the write key from to view the dashboard
-
-### Stopping Demo
-
-1. To end the demo, run the following command:
- ```sh
- sh run_demo.sh down
- ```
diff --git a/demos/samples_python/weather_forecast/docker-compose-honeycomb.yaml b/demos/samples_python/weather_forecast/docker-compose-honeycomb.yaml
deleted file mode 100644
index 5d5e1786..00000000
--- a/demos/samples_python/weather_forecast/docker-compose-honeycomb.yaml
+++ /dev/null
@@ -1,46 +0,0 @@
-services:
- weather_forecast_service:
- build:
- context: ./
- environment:
- - OLTP_HOST=http://otel-collector:4317
- extra_hosts:
- - "host.docker.internal:host-gateway"
- ports:
- - "18083:80"
-
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environment as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- otel-collector:
- build:
- context: ../../shared/honeycomb/
- ports:
- - "4317:4317"
- - "4318:4318"
- volumes:
- - ../../shared/honeycomb/otel-collector-config.yaml:/etc/otel-collector-config.yaml
- env_file:
- - .env
- environment:
- - HONEYCOMB_API_KEY
-
- prometheus:
- build:
- context: ../../shared/prometheus
-
- grafana:
- build:
- context: ../../shared/grafana
- ports:
- - "3000:3000"
diff --git a/demos/samples_python/weather_forecast/docker-compose-jaeger.yaml b/demos/samples_python/weather_forecast/docker-compose-jaeger.yaml
deleted file mode 100644
index 1a64e8fa..00000000
--- a/demos/samples_python/weather_forecast/docker-compose-jaeger.yaml
+++ /dev/null
@@ -1,41 +0,0 @@
-services:
- weather_forecast_service:
- build:
- context: ./
- environment:
- - OLTP_HOST=http://jaeger:4317
- extra_hosts:
- - "host.docker.internal:host-gateway"
- ports:
- - "18083:80"
-
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environemtn as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- jaeger:
- build:
- context: ../../shared/jaeger
- ports:
- - "16686:16686"
- - "4317:4317"
- - "4318:4318"
-
- prometheus:
- build:
- context: ../../shared/prometheus
-
- grafana:
- build:
- context: ../../shared/grafana
- ports:
- - "3000:3000"
diff --git a/demos/samples_python/weather_forecast/docker-compose-logfire.yaml b/demos/samples_python/weather_forecast/docker-compose-logfire.yaml
deleted file mode 100644
index db3363f4..00000000
--- a/demos/samples_python/weather_forecast/docker-compose-logfire.yaml
+++ /dev/null
@@ -1,46 +0,0 @@
-services:
- weather_forecast_service:
- build:
- context: ./
- environment:
- - OLTP_HOST=http://otel-collector:4317
- extra_hosts:
- - "host.docker.internal:host-gateway"
- ports:
- - "18083:80"
-
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environment as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- otel-collector:
- build:
- context: ../../shared/logfire/
- ports:
- - "4317:4317"
- - "4318:4318"
- volumes:
- - ../../shared/logfire/otel-collector-config.yaml:/etc/otel-collector-config.yaml
- env_file:
- - .env
- environment:
- - LOGFIRE_API_KEY
-
- prometheus:
- build:
- context: ../../shared/prometheus
-
- grafana:
- build:
- context: ../../shared/grafana
- ports:
- - "3000:3000"
diff --git a/demos/samples_python/weather_forecast/docker-compose-signoz.yaml b/demos/samples_python/weather_forecast/docker-compose-signoz.yaml
deleted file mode 100644
index 4cfb56a9..00000000
--- a/demos/samples_python/weather_forecast/docker-compose-signoz.yaml
+++ /dev/null
@@ -1,36 +0,0 @@
-include:
- - ../../shared/signoz/docker-compose-minimal.yaml
-
-services:
- weather_forecast_service:
- build:
- context: .
- environment:
- - OLTP_HOST=http://otel-collector:4317
- extra_hosts:
- - "host.docker.internal:host-gateway"
- ports:
- - "18083:80"
-
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environemtn as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- prometheus:
- build:
- context: ../../shared/prometheus
-
- grafana:
- build:
- context: ../../shared/grafana
- ports:
- - "3000:3000"
diff --git a/demos/samples_python/weather_forecast/docker-compose.yaml b/demos/samples_python/weather_forecast/docker-compose.yaml
deleted file mode 100644
index 36c2e74a..00000000
--- a/demos/samples_python/weather_forecast/docker-compose.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-services:
- weather_forecast_service:
- build:
- context: ./
- environment:
- - OLTP_HOST=http://jaeger:4317
- extra_hosts:
- - "host.docker.internal:host-gateway"
- ports:
- - "18083:80"
-
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environemtn as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
diff --git a/demos/shared/chatbot_ui/.vscode/launch.json b/demos/shared/chatbot_ui/.vscode/launch.json
deleted file mode 100644
index 9586ef4c..00000000
--- a/demos/shared/chatbot_ui/.vscode/launch.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- // Use IntelliSense to learn about possible attributes.
- // Hover to view descriptions of existing attributes.
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
- "version": "0.2.0",
- "configurations": [
- {
- "python": "${workspaceFolder}/venv/bin/python",
- "name": "chatbot-ui",
- "type": "debugpy",
- "request": "launch",
- "program": "run_stream.py",
- "console": "integratedTerminal",
- "env": {
- "LLM": "1",
- "CHAT_COMPLETION_ENDPOINT": "http://localhost:10000/v1",
- "STREAMING": "True",
- "PLANO_CONFIG": "../../samples_python/weather_forecast/plano_config.yaml"
- }
- },
- {
- "python": "${workspaceFolder}/venv/bin/python",
- "name": "chatbot-ui llm",
- "type": "debugpy",
- "request": "launch",
- "program": "run_stream.py",
- "console": "integratedTerminal",
- "env": {
- "LLM": "1",
- "CHAT_COMPLETION_ENDPOINT": "http://localhost:12000/v1",
- "STREAMING": "True",
- "PLANO_CONFIG": "../../samples_python/weather_forecast/plano_config.yaml"
- }
- },
- ]
-}
diff --git a/demos/shared/chatbot_ui/Dockerfile b/demos/shared/chatbot_ui/Dockerfile
deleted file mode 100644
index cb8ddb8d..00000000
--- a/demos/shared/chatbot_ui/Dockerfile
+++ /dev/null
@@ -1,18 +0,0 @@
-FROM python:3.14 AS base
-
-FROM base AS builder
-
-WORKDIR /src
-
-COPY requirements.txt /src/
-
-RUN pip install --prefix=/runtime --force-reinstall -r requirements.txt
-
-FROM python:3.14-slim AS output
-
-COPY --from=builder /runtime /usr/local
-
-WORKDIR /app
-COPY *.py .
-
-CMD ["python", "run_stream.py"]
diff --git a/demos/shared/chatbot_ui/common.py b/demos/shared/chatbot_ui/common.py
deleted file mode 100644
index 278d86d1..00000000
--- a/demos/shared/chatbot_ui/common.py
+++ /dev/null
@@ -1,206 +0,0 @@
-from datetime import datetime
-import json
-import logging
-import os
-import yaml
-import gradio as gr
-from typing import List, Optional, Tuple
-from functools import partial
-
-logging.basicConfig(
- level=logging.INFO,
- format="%(asctime)s - %(levelname)s - %(message)s",
-)
-
-log = logging.getLogger(__name__)
-
-GRADIO_CSS_STYLE = """
-.json-container {
- height: 80vh !important;
- overflow-y: auto !important;
-}
-.chatbot {
- height: calc(80vh - 100px) !important;
- overflow-y: auto !important;
-}
-footer {visibility: hidden}
-"""
-
-
-def chat(
- query: Optional[str],
- conversation: Optional[List[Tuple[str, str]]],
- history: List[dict],
- client,
-):
- history.append({"role": "user", "content": query})
-
- try:
- response = client.chat.completions.create(
- # we select model from plano_config file
- model="None",
- messages=history,
- temperature=1.0,
- stream=True,
- )
- except Exception as e:
- # remove last user message in case of exception
- history.pop()
- log.info("Error calling gateway API: {}".format(e))
- raise gr.Error("Error calling gateway API: {}".format(e))
-
- conversation.append((query, ""))
-
- for chunk in response:
- tokens = process_stream_chunk(chunk, history)
- if tokens:
- conversation[-1] = (
- conversation[-1][0],
- conversation[-1][1] + tokens,
- )
-
- yield "", conversation, history
-
-
-def create_gradio_app(demo_description, client):
- with gr.Blocks(
- theme=gr.themes.Default(
- font_mono=[gr.themes.GoogleFont("IBM Plex Mono"), "Arial", "sans-serif"]
- ),
- fill_height=True,
- css=GRADIO_CSS_STYLE,
- ) as demo:
- with gr.Row(equal_height=True):
- history = gr.State([])
-
- with gr.Column(scale=1):
- gr.Markdown(demo_description),
- with gr.Accordion("Available Tools/APIs", open=True):
- with gr.Column(scale=1):
- gr.JSON(
- value=get_prompt_targets(),
- show_indices=False,
- elem_classes="json-container",
- min_height="80vh",
- )
-
- with gr.Column(scale=2):
- chatbot = gr.Chatbot(
- label="Plano Chatbot",
- elem_classes="chatbot",
- )
- textbox = gr.Textbox(
- show_label=False,
- placeholder="Enter text and press enter",
- autofocus=True,
- elem_classes="textbox",
- )
- chat_with_client = partial(chat, client=client)
-
- textbox.submit(
- chat_with_client,
- [textbox, chatbot, history],
- [textbox, chatbot, history],
- )
-
- return demo
-
-
-def process_stream_chunk(chunk, history):
- delta = chunk.choices[0].delta
- if delta.role and delta.role != history[-1]["role"]:
- # create new history item if role changes
- # this is likely due to Plano tool call and api response
- history.append({"role": delta.role})
-
- history[-1]["model"] = chunk.model
- # append tool calls to history if there are any in the chunk
- if delta.tool_calls:
- history[-1]["tool_calls"] = delta.tool_calls
-
- if delta.content:
- # append content to the last history item
- if history[-1]["model"] != "Arch-Function-Chat":
- history[-1]["content"] = history[-1].get("content", "") + delta.content
- # yield content if it is from assistant
- if history[-1]["model"] == "Arch-Function":
- return None
- if history[-1]["role"] == "assistant":
- return delta.content
-
- return None
-
-
-def convert_prompt_target_to_openai_format(target):
- tool = {
- "description": target["description"],
- "parameters": {"type": "object", "properties": {}, "required": []},
- }
-
- if "parameters" in target:
- for param_info in target["parameters"]:
- parameter = {
- "type": param_info["type"],
- "description": param_info["description"],
- }
-
- for key in ["default", "format", "enum", "items", "minimum", "maximum"]:
- if key in param_info:
- parameter[key] = param_info[key]
-
- tool["parameters"]["properties"][param_info["name"]] = parameter
-
- required = param_info.get("required", False)
- if required:
- tool["parameters"]["required"].append(param_info["name"])
-
- return {"name": target["name"], "info": tool}
-
-
-def get_prompt_targets():
- try:
- with open(os.getenv("PLANO_CONFIG", "config.yaml"), "r") as file:
- config = yaml.safe_load(file)
-
- available_tools = []
- if "prompt_targets" in config:
- for target in config["prompt_targets"]:
- if not target.get("default", False):
- available_tools.append(
- convert_prompt_target_to_openai_format(target)
- )
-
- return {tool["name"]: tool["info"] for tool in available_tools}
- elif "llm_providers" in config:
- return config["llm_providers"]
-
- except Exception as e:
- log.info(e)
- return None
-
-
-def get_llm_models():
- try:
- with open(os.getenv("PLANO_CONFIG", "config.yaml"), "r") as file:
- config = yaml.safe_load(file)
-
- available_models = [""]
- default_llm = None
- for llm_providers in config["llm_providers"]:
- if llm_providers.get("default", False):
- default_llm = llm_providers["name"]
- else:
- available_models.append(llm_providers["name"])
-
- # place default model at the beginning of the list
- if default_llm:
- available_models.insert(0, default_llm)
- return available_models
- except Exception as e:
- log.info(e)
- return []
-
-
-def format_log(message):
- time_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S,%f")[:-3]
- return f"{time_now} - {message}"
diff --git a/demos/shared/chatbot_ui/requirements.txt b/demos/shared/chatbot_ui/requirements.txt
deleted file mode 100644
index 7d94088a..00000000
--- a/demos/shared/chatbot_ui/requirements.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-gradio==5.3.0
-huggingface_hub<1.0.0
-async_timeout==4.0.3
-loguru==0.7.2
-asyncio==3.4.3
-httpx==0.27.0
-python-dotenv==1.0.1
-pydantic==2.8.2
-openai==1.54.0
diff --git a/demos/shared/chatbot_ui/run_stream.py b/demos/shared/chatbot_ui/run_stream.py
deleted file mode 100644
index 89448355..00000000
--- a/demos/shared/chatbot_ui/run_stream.py
+++ /dev/null
@@ -1,160 +0,0 @@
-import json
-import os
-import logging
-import yaml
-import gradio as gr
-
-from typing import List, Optional, Tuple
-from openai import OpenAI
-from dotenv import load_dotenv
-
-from common import format_log, get_llm_models, get_prompt_targets, process_stream_chunk
-
-load_dotenv()
-
-
-logging.basicConfig(
- level=logging.INFO,
- format="%(asctime)s - %(levelname)s - %(message)s",
-)
-
-log = logging.getLogger(__name__)
-
-CHAT_COMPLETION_ENDPOINT = os.getenv("CHAT_COMPLETION_ENDPOINT")
-log.info(f"CHAT_COMPLETION_ENDPOINT: {CHAT_COMPLETION_ENDPOINT}")
-
-
-CSS_STYLE = """
-.json-container {
- height: 95vh !important;
- overflow-y: auto !important;
-}
-.chatbot {
- height: calc(95vh - 100px) !important;
- overflow-y: auto !important;
-}
-footer {visibility: hidden}
-"""
-
-
-def chat(
- query: Optional[str],
- conversation: Optional[List[Tuple[str, str]]],
- history: List[dict],
- debug_output: str,
- model_selector: str,
-):
- history.append({"role": "user", "content": query})
-
- if debug_output is None:
- debug_output = ""
-
- try:
- headers = {}
- if model_selector and model_selector != "":
- headers["x-arch-llm-provider-hint"] = model_selector
- client = OpenAI(
- api_key="None",
- base_url=CHAT_COMPLETION_ENDPOINT,
- default_headers=headers,
- )
- response = client.chat.completions.create(
- # we select model from arch_config file
- model="None",
- messages=history,
- temperature=1.0,
- stream=True,
- )
- except Exception as e:
- # remove last user message in case of exception
- history.pop()
- log.info("Error calling gateway API: {}".format(e))
- raise gr.Error("Error calling gateway API: {}".format(e))
-
- conversation.append((query, ""))
-
- model_is_set = False
- for chunk in response:
- tokens = process_stream_chunk(chunk, history)
- if tokens and not model_is_set:
- model_is_set = True
- model = history[-1]["model"]
- debug_output = debug_output + "\n" + format_log(f"model: {model}")
- if tokens:
- conversation[-1] = (
- conversation[-1][0],
- conversation[-1][1] + tokens,
- )
-
- yield "", conversation, history, debug_output, model_selector
-
- # update assistant response to have correct format
- # arch-fc 1.1 expects following format:
- # {
- # "response": "",
- # }
- # and this entire block needs to be encoded in ```json\n{json_encoded_content}\n```
-
- if not history[-1]["model"].startswith("Arch"):
- assistant_response = {
- "response": history[-1]["content"],
- }
- history[-1]["content"] = "```json\n{}\n```".format(
- json.dumps(assistant_response)
- )
- log.info("history: {}".format(json.dumps(history)))
-
-
-def main():
- with gr.Blocks(
- theme=gr.themes.Default(
- font_mono=[gr.themes.GoogleFont("IBM Plex Mono"), "Arial", "sans-serif"]
- ),
- fill_height=True,
- css=CSS_STYLE,
- ) as demo:
- with gr.Row(equal_height=True):
- history = gr.State([])
-
- with gr.Column(scale=1):
- with gr.Accordion("See available tools", open=False):
- with gr.Column(scale=1):
- gr.JSON(
- value=get_prompt_targets(),
- show_indices=False,
- elem_classes="json-container",
- min_height="50vh",
- )
- model_selector_textbox = gr.Dropdown(
- get_llm_models(),
- label="override model",
- elem_classes="dropdown",
- )
- debug_output = gr.TextArea(
- label="debug output",
- elem_classes="debug_output",
- )
-
- with gr.Column(scale=2):
- chatbot = gr.Chatbot(
- label="Arch Chatbot",
- elem_classes="chatbot",
- )
- textbox = gr.Textbox(
- show_label=False,
- placeholder="Enter text and press enter",
- autofocus=True,
- elem_classes="textbox",
- )
-
- textbox.submit(
- chat,
- [textbox, chatbot, history, debug_output, model_selector_textbox],
- [textbox, chatbot, history, debug_output, model_selector_textbox],
- )
-
- demo.launch(server_name="0.0.0.0", server_port=8080, show_error=True, debug=True)
-
-
-if __name__ == "__main__":
- main()
diff --git a/demos/shared/grafana/Dockerfile b/demos/shared/grafana/Dockerfile
deleted file mode 100644
index 40ec1b54..00000000
--- a/demos/shared/grafana/Dockerfile
+++ /dev/null
@@ -1,15 +0,0 @@
-FROM grafana/grafana:latest
-
-FROM grafana/grafana:latest
-
-# Set environment variables
-ENV GF_SECURITY_ADMIN_USER=admin
-ENV GF_SECURITY_ADMIN_PASSWORD=grafana
-
-# Copy provisioning files
-COPY ./datasource.yaml /etc/grafana/provisioning/datasources/datasource.yaml
-COPY ./dashboard.yaml /etc/grafana/provisioning/dashboards/main.yaml
-COPY ./dashboards /var/lib/grafana/dashboards
-
-# Expose Grafana port
-EXPOSE 3000
diff --git a/demos/shared/grafana/dashboard.yaml b/demos/shared/grafana/dashboard.yaml
deleted file mode 100644
index fd66a479..00000000
--- a/demos/shared/grafana/dashboard.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-apiVersion: 1
-
-providers:
- - name: "Dashboard provider"
- orgId: 1
- type: file
- disableDeletion: false
- updateIntervalSeconds: 10
- allowUiUpdates: false
- options:
- path: /var/lib/grafana/dashboards
- foldersFromFilesStructure: true
diff --git a/demos/shared/grafana/dashboards/envoy_overview.json b/demos/shared/grafana/dashboards/envoy_overview.json
deleted file mode 100644
index e74e1fa1..00000000
--- a/demos/shared/grafana/dashboards/envoy_overview.json
+++ /dev/null
@@ -1,794 +0,0 @@
-{
- "annotations": {
- "list": [
- {
- "builtIn": 1,
- "datasource": {
- "type": "grafana",
- "uid": "-- Grafana --"
- },
- "enable": true,
- "hide": true,
- "iconColor": "rgba(0, 211, 255, 1)",
- "name": "Annotations & Alerts",
- "type": "dashboard"
- }
- ]
- },
- "editable": true,
- "fiscalYearStartMonth": 0,
- "graphTooltip": 1,
- "id": 1,
- "links": [],
- "panels": [
- {
- "datasource": {
- "default": true,
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "fieldConfig": {
- "defaults": {
- "color": {
- "mode": "thresholds"
- },
- "mappings": [],
- "thresholds": {
- "mode": "absolute",
- "steps": [
- {
- "color": "green",
- "value": null
- },
- {
- "color": "red",
- "value": 80
- }
- ]
- }
- },
- "overrides": []
- },
- "gridPos": {
- "h": 9,
- "w": 5,
- "x": 0,
- "y": 0
- },
- "id": 4,
- "options": {
- "colorMode": "value",
- "graphMode": "area",
- "justifyMode": "auto",
- "orientation": "auto",
- "percentChangeColorMode": "standard",
- "reduceOptions": {
- "calcs": ["lastNotNull"],
- "fields": "",
- "values": false
- },
- "showPercentChange": false,
- "textMode": "auto",
- "wideLayout": true
- },
- "pluginVersion": "11.3.0",
- "targets": [
- {
- "datasource": {
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "disableTextWrap": false,
- "editorMode": "builder",
- "exemplar": false,
- "expr": "envoy_cluster_upstream_rq_completed{envoy_cluster_name=~\"openai|api_server\"}",
- "fullMetaSearch": false,
- "includeNullMetadata": false,
- "instant": true,
- "legendFormat": "{{envoy_cluster_name}}",
- "range": false,
- "refId": "A",
- "useBackend": false
- }
- ],
- "title": "# of Completed Requests",
- "type": "stat"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "fieldConfig": {
- "defaults": {
- "color": {
- "mode": "palette-classic"
- },
- "custom": {
- "axisBorderShow": false,
- "axisCenteredZero": false,
- "axisColorMode": "text",
- "axisLabel": "",
- "axisPlacement": "auto",
- "barAlignment": 0,
- "barWidthFactor": 0.6,
- "drawStyle": "line",
- "fillOpacity": 0,
- "gradientMode": "none",
- "hideFrom": {
- "legend": false,
- "tooltip": false,
- "viz": false
- },
- "insertNulls": false,
- "lineInterpolation": "linear",
- "lineWidth": 1,
- "pointSize": 5,
- "scaleDistribution": {
- "type": "linear"
- },
- "showPoints": "auto",
- "spanNulls": false,
- "stacking": {
- "group": "A",
- "mode": "none"
- },
- "thresholdsStyle": {
- "mode": "off"
- }
- },
- "mappings": [],
- "thresholds": {
- "mode": "absolute",
- "steps": [
- {
- "color": "green",
- "value": null
- },
- {
- "color": "red",
- "value": 80
- }
- ]
- }
- },
- "overrides": [
- {
- "matcher": {
- "id": "byName",
- "options": "histogram_quantile(0.5, sum by(le) (rate(input_sequence_length_bucket[1h])))"
- },
- "properties": [
- {
- "id": "displayName",
- "value": "Input Sequence Length"
- }
- ]
- }
- ]
- },
- "gridPos": {
- "h": 9,
- "w": 9,
- "x": 5,
- "y": 0
- },
- "id": 7,
- "options": {
- "legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom",
- "showLegend": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "none"
- }
- },
- "pluginVersion": "11.3.0",
- "targets": [
- {
- "disableTextWrap": false,
- "editorMode": "code",
- "expr": "histogram_quantile(0.9, sum by(le) (rate(input_sequence_length_bucket[5m])))",
- "fullMetaSearch": false,
- "includeNullMetadata": false,
- "legendFormat": "__auto",
- "range": true,
- "refId": "A",
- "useBackend": false
- }
- ],
- "title": "input sequence length (p90)",
- "type": "timeseries"
- },
- {
- "datasource": {
- "default": true,
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "fieldConfig": {
- "defaults": {
- "color": {
- "mode": "palette-classic"
- },
- "custom": {
- "axisBorderShow": false,
- "axisCenteredZero": false,
- "axisColorMode": "text",
- "axisLabel": "",
- "axisPlacement": "auto",
- "barAlignment": 0,
- "barWidthFactor": 0.6,
- "drawStyle": "line",
- "fillOpacity": 0,
- "gradientMode": "none",
- "hideFrom": {
- "legend": false,
- "tooltip": false,
- "viz": false
- },
- "insertNulls": false,
- "lineInterpolation": "linear",
- "lineWidth": 1,
- "pointSize": 5,
- "scaleDistribution": {
- "type": "linear"
- },
- "showPoints": "auto",
- "spanNulls": false,
- "stacking": {
- "group": "A",
- "mode": "none"
- },
- "thresholdsStyle": {
- "mode": "off"
- }
- },
- "mappings": [],
- "thresholds": {
- "mode": "absolute",
- "steps": [
- {
- "color": "green",
- "value": null
- },
- {
- "color": "red",
- "value": 80
- }
- ]
- }
- },
- "overrides": [
- {
- "matcher": {
- "id": "byName",
- "options": "histogram_quantile(0.5, sum(rate(output_sequence_length_bucket[1h])) by(le))"
- },
- "properties": [
- {
- "id": "displayName",
- "value": "Output Sequence Length"
- }
- ]
- }
- ]
- },
- "gridPos": {
- "h": 9,
- "w": 10,
- "x": 14,
- "y": 0
- },
- "id": 3,
- "options": {
- "legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom",
- "showLegend": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "none"
- }
- },
- "pluginVersion": "11.3.0",
- "targets": [
- {
- "datasource": {
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "disableTextWrap": false,
- "editorMode": "code",
- "expr": "histogram_quantile(0.9, sum(rate(output_sequence_length_bucket[5m])) by(le))",
- "fullMetaSearch": false,
- "includeNullMetadata": false,
- "instant": false,
- "legendFormat": "__auto",
- "range": true,
- "refId": "A",
- "useBackend": false
- }
- ],
- "title": "output sequence length (p90)",
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "fieldConfig": {
- "defaults": {
- "color": {
- "mode": "palette-classic"
- },
- "custom": {
- "axisBorderShow": false,
- "axisCenteredZero": false,
- "axisColorMode": "text",
- "axisLabel": "",
- "axisPlacement": "auto",
- "barAlignment": 0,
- "barWidthFactor": 0.6,
- "drawStyle": "line",
- "fillOpacity": 0,
- "gradientMode": "none",
- "hideFrom": {
- "legend": false,
- "tooltip": false,
- "viz": false
- },
- "insertNulls": false,
- "lineInterpolation": "linear",
- "lineWidth": 1,
- "pointSize": 5,
- "scaleDistribution": {
- "type": "linear"
- },
- "showPoints": "auto",
- "spanNulls": false,
- "stacking": {
- "group": "A",
- "mode": "none"
- },
- "thresholdsStyle": {
- "mode": "off"
- }
- },
- "mappings": [],
- "thresholds": {
- "mode": "absolute",
- "steps": [
- {
- "color": "green",
- "value": null
- },
- {
- "color": "red",
- "value": 80
- }
- ]
- }
- },
- "overrides": [
- {
- "matcher": {
- "id": "byName",
- "options": "histogram_quantile(0.5, sum by(le) (rate(time_to_first_token_bucket[1h])))"
- },
- "properties": [
- {
- "id": "displayName",
- "value": "Time to First Token"
- }
- ]
- }
- ]
- },
- "gridPos": {
- "h": 14,
- "w": 11,
- "x": 0,
- "y": 9
- },
- "id": 8,
- "options": {
- "legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom",
- "showLegend": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "none"
- }
- },
- "pluginVersion": "11.3.0",
- "targets": [
- {
- "disableTextWrap": false,
- "editorMode": "code",
- "expr": "histogram_quantile(0.5, sum by(le) (rate(time_to_first_token_bucket[5m])))",
- "fullMetaSearch": false,
- "includeNullMetadata": false,
- "legendFormat": "__auto",
- "range": true,
- "refId": "A",
- "useBackend": false
- }
- ],
- "title": "time to first token (p90)",
- "type": "timeseries"
- },
- {
- "datasource": {
- "default": true,
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "fieldConfig": {
- "defaults": {
- "color": {
- "mode": "palette-classic"
- },
- "custom": {
- "axisBorderShow": false,
- "axisCenteredZero": false,
- "axisColorMode": "text",
- "axisLabel": "",
- "axisPlacement": "auto",
- "barAlignment": 0,
- "barWidthFactor": 0.6,
- "drawStyle": "line",
- "fillOpacity": 0,
- "gradientMode": "none",
- "hideFrom": {
- "legend": false,
- "tooltip": false,
- "viz": false
- },
- "insertNulls": false,
- "lineInterpolation": "linear",
- "lineWidth": 1,
- "pointSize": 5,
- "scaleDistribution": {
- "type": "linear"
- },
- "showPoints": "auto",
- "spanNulls": false,
- "stacking": {
- "group": "A",
- "mode": "none"
- },
- "thresholdsStyle": {
- "mode": "off"
- }
- },
- "mappings": [],
- "thresholds": {
- "mode": "absolute",
- "steps": [
- {
- "color": "green",
- "value": null
- },
- {
- "color": "red",
- "value": 80
- }
- ]
- }
- },
- "overrides": [
- {
- "matcher": {
- "id": "byName",
- "options": "histogram_quantile(0.5, sum by(le) (rate(request_latency_bucket[1h])))"
- },
- "properties": [
- {
- "id": "displayName",
- "value": "Request Latency"
- }
- ]
- },
- {
- "matcher": {
- "id": "byName",
- "options": "histogram_quantile(0.5, sum(rate(time_to_first_token_bucket[60m])) by (le))"
- },
- "properties": [
- {
- "id": "displayName",
- "value": "Time to First Token"
- }
- ]
- }
- ]
- },
- "gridPos": {
- "h": 14,
- "w": 13,
- "x": 11,
- "y": 9
- },
- "id": 1,
- "options": {
- "legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom",
- "showLegend": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "none"
- }
- },
- "pluginVersion": "11.3.0",
- "targets": [
- {
- "datasource": {
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "disableTextWrap": false,
- "editorMode": "builder",
- "expr": "histogram_quantile(0.5, sum by(le) (rate(request_latency_bucket[5m])))",
- "fullMetaSearch": false,
- "hide": false,
- "includeNullMetadata": false,
- "instant": false,
- "legendFormat": "__auto",
- "range": true,
- "refId": "A",
- "useBackend": false
- }
- ],
- "title": "request latency (p90)",
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "fieldConfig": {
- "defaults": {
- "color": {
- "mode": "palette-classic"
- },
- "custom": {
- "axisBorderShow": false,
- "axisCenteredZero": false,
- "axisColorMode": "text",
- "axisLabel": "",
- "axisPlacement": "auto",
- "barAlignment": 0,
- "barWidthFactor": 0.6,
- "drawStyle": "line",
- "fillOpacity": 0,
- "gradientMode": "none",
- "hideFrom": {
- "legend": false,
- "tooltip": false,
- "viz": false
- },
- "insertNulls": false,
- "lineInterpolation": "linear",
- "lineWidth": 1,
- "pointSize": 5,
- "scaleDistribution": {
- "type": "linear"
- },
- "showPoints": "auto",
- "spanNulls": false,
- "stacking": {
- "group": "A",
- "mode": "none"
- },
- "thresholdsStyle": {
- "mode": "off"
- }
- },
- "mappings": [],
- "thresholds": {
- "mode": "absolute",
- "steps": [
- {
- "color": "green",
- "value": null
- },
- {
- "color": "red",
- "value": 80
- }
- ]
- }
- },
- "overrides": [
- {
- "matcher": {
- "id": "byName",
- "options": "histogram_quantile(0.5, sum by(le) (rate(time_per_output_token_bucket[1h])))"
- },
- "properties": [
- {
- "id": "displayName",
- "value": "Time per Output Token"
- }
- ]
- }
- ]
- },
- "gridPos": {
- "h": 13,
- "w": 12,
- "x": 0,
- "y": 23
- },
- "id": 9,
- "options": {
- "legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom",
- "showLegend": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "none"
- }
- },
- "pluginVersion": "11.3.0",
- "targets": [
- {
- "disableTextWrap": false,
- "editorMode": "builder",
- "expr": "histogram_quantile(0.5, sum by(le) (rate(time_per_output_token_bucket[1h])))",
- "fullMetaSearch": false,
- "includeNullMetadata": false,
- "legendFormat": "__auto",
- "range": true,
- "refId": "A",
- "useBackend": false
- }
- ],
- "title": "Time per Output Token (50p)",
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "PBFA97CFB590B2093"
- },
- "fieldConfig": {
- "defaults": {
- "color": {
- "mode": "palette-classic"
- },
- "custom": {
- "axisBorderShow": false,
- "axisCenteredZero": false,
- "axisColorMode": "text",
- "axisLabel": "",
- "axisPlacement": "auto",
- "barAlignment": 0,
- "barWidthFactor": 0.6,
- "drawStyle": "line",
- "fillOpacity": 0,
- "gradientMode": "none",
- "hideFrom": {
- "legend": false,
- "tooltip": false,
- "viz": false
- },
- "insertNulls": false,
- "lineInterpolation": "linear",
- "lineWidth": 1,
- "pointSize": 5,
- "scaleDistribution": {
- "type": "linear"
- },
- "showPoints": "auto",
- "spanNulls": false,
- "stacking": {
- "group": "A",
- "mode": "none"
- },
- "thresholdsStyle": {
- "mode": "off"
- }
- },
- "mappings": [],
- "thresholds": {
- "mode": "absolute",
- "steps": [
- {
- "color": "green",
- "value": null
- },
- {
- "color": "red",
- "value": 80
- }
- ]
- }
- },
- "overrides": [
- {
- "matcher": {
- "id": "byName",
- "options": "histogram_quantile(0.5, sum by(le) (rate(tokens_per_second_bucket[1h])))"
- },
- "properties": [
- {
- "id": "displayName",
- "value": "Tokens per Second"
- }
- ]
- }
- ]
- },
- "gridPos": {
- "h": 13,
- "w": 12,
- "x": 12,
- "y": 23
- },
- "id": 10,
- "options": {
- "legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom",
- "showLegend": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "none"
- }
- },
- "pluginVersion": "11.3.0",
- "targets": [
- {
- "disableTextWrap": false,
- "editorMode": "builder",
- "expr": "histogram_quantile(0.5, sum by(le) (rate(tokens_per_second_bucket[1h])))",
- "fullMetaSearch": false,
- "includeNullMetadata": false,
- "legendFormat": "__auto",
- "range": true,
- "refId": "A",
- "useBackend": false
- }
- ],
- "title": "Tokens per Second(50p)",
- "type": "timeseries"
- }
- ],
- "preload": false,
- "refresh": "",
- "schemaVersion": 40,
- "tags": [],
- "templating": {
- "list": []
- },
- "time": {
- "from": "now-15m",
- "to": "now"
- },
- "timepicker": {},
- "timezone": "browser",
- "title": "Plano Gateway Dashboard",
- "uid": "adt6uhx5lk8aob",
- "version": 1,
- "weekStart": ""
-}
diff --git a/demos/shared/grafana/datasource.yaml b/demos/shared/grafana/datasource.yaml
deleted file mode 100644
index 44999d46..00000000
--- a/demos/shared/grafana/datasource.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-apiVersion: 1
-
-datasources:
- - name: Prometheus
- type: prometheus
- url: http://prometheus:9090
- isDefault: true
- access: proxy
- editable: true
diff --git a/demos/shared/honeycomb/Dockerfile b/demos/shared/honeycomb/Dockerfile
deleted file mode 100644
index eec82c08..00000000
--- a/demos/shared/honeycomb/Dockerfile
+++ /dev/null
@@ -1,5 +0,0 @@
-FROM otel/opentelemetry-collector:latest
-
-COPY otel-collector-config.yaml /etc/otel-collector-config.yaml
-
-ENTRYPOINT ["/otelcol", "--config=/etc/otel-collector-config.yaml"]
diff --git a/demos/shared/honeycomb/otel-collector-config.yaml b/demos/shared/honeycomb/otel-collector-config.yaml
deleted file mode 100644
index e261be84..00000000
--- a/demos/shared/honeycomb/otel-collector-config.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-receivers:
- otlp:
- protocols:
- grpc:
- endpoint: 0.0.0.0:4317
- http:
- endpoint: 0.0.0.0:4318
-
-exporters:
- otlp:
- endpoint: "api.honeycomb.io:443"
- headers:
- "x-honeycomb-team": "${HONEYCOMB_API_KEY}"
-
-processors:
- batch:
- timeout: 5s
-
-service:
- pipelines:
- traces:
- receivers: [otlp]
- processors: [batch]
- exporters: [otlp]
diff --git a/demos/shared/logfire/Dockerfile b/demos/shared/logfire/Dockerfile
deleted file mode 100644
index eec82c08..00000000
--- a/demos/shared/logfire/Dockerfile
+++ /dev/null
@@ -1,5 +0,0 @@
-FROM otel/opentelemetry-collector:latest
-
-COPY otel-collector-config.yaml /etc/otel-collector-config.yaml
-
-ENTRYPOINT ["/otelcol", "--config=/etc/otel-collector-config.yaml"]
diff --git a/demos/shared/logfire/otel-collector-config.yaml b/demos/shared/logfire/otel-collector-config.yaml
deleted file mode 100644
index d26939e4..00000000
--- a/demos/shared/logfire/otel-collector-config.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-receivers:
- otlp:
- protocols:
- grpc:
- endpoint: 0.0.0.0:4317
- http:
- endpoint: 0.0.0.0:4318
-
-exporters:
- otlphttp:
- endpoint: "https://logfire-api.pydantic.dev"
- headers:
- Authorization: "${LOGFIRE_API_KEY}"
-
-processors:
- batch:
- timeout: 5s
-
-service:
- pipelines:
- traces:
- receivers: [otlp]
- processors: [batch]
- exporters: [otlphttp]
diff --git a/demos/shared/prometheus/Dockerfile b/demos/shared/prometheus/Dockerfile
deleted file mode 100644
index 1c245059..00000000
--- a/demos/shared/prometheus/Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-
-FROM prom/prometheus:latest
-
-# Set the command to run Prometheus with the specified configuration file
-CMD ["--config.file=/etc/prometheus/prometheus.yaml"]
-
-# Copy the Prometheus configuration files
-COPY ./prometheus.yaml /etc/prometheus/prometheus.yaml
-
-# Expose Prometheus port
-EXPOSE 9090
diff --git a/demos/shared/prometheus/prometheus.yaml b/demos/shared/prometheus/prometheus.yaml
deleted file mode 100644
index b0e1a7bb..00000000
--- a/demos/shared/prometheus/prometheus.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-global:
- scrape_interval: 15s
- scrape_timeout: 10s
- evaluation_interval: 15s
-alerting:
- alertmanagers:
- - static_configs:
- - targets: []
- scheme: http
- timeout: 10s
- api_version: v2
-scrape_configs:
- - job_name: envoy
- honor_timestamps: true
- scrape_interval: 15s
- scrape_timeout: 10s
- metrics_path: /stats
- scheme: http
- static_configs:
- - targets:
- - host.docker.internal:19901
- params:
- format: ["prometheus"]
diff --git a/demos/shared/signoz/alertmanager.yml b/demos/shared/signoz/alertmanager.yml
deleted file mode 100644
index f59b6655..00000000
--- a/demos/shared/signoz/alertmanager.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-global:
- resolve_timeout: 1m
- slack_api_url: 'https://hooks.slack.com/services/xxx'
-
-route:
- receiver: 'slack-notifications'
-
-receivers:
-- name: 'slack-notifications'
- slack_configs:
- - channel: '#alerts'
- send_resolved: true
- icon_url: https://avatars3.githubusercontent.com/u/3380462
- title: |-
- [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }}
- {{- if gt (len .CommonLabels) (len .GroupLabels) -}}
- {{" "}}(
- {{- with .CommonLabels.Remove .GroupLabels.Names }}
- {{- range $index, $label := .SortedPairs -}}
- {{ if $index }}, {{ end }}
- {{- $label.Name }}="{{ $label.Value -}}"
- {{- end }}
- {{- end -}}
- )
- {{- end }}
- text: >-
- {{ range .Alerts -}}
- *Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}
-
- *Description:* {{ .Annotations.description }}
-
- *Details:*
- {{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
- {{ end }}
- {{ end }}
diff --git a/demos/shared/signoz/alerts.yml b/demos/shared/signoz/alerts.yml
deleted file mode 100644
index 810a2075..00000000
--- a/demos/shared/signoz/alerts.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-groups:
-- name: ExampleCPULoadGroup
- rules:
- - alert: HighCpuLoad
- expr: system_cpu_load_average_1m > 0.1
- for: 0m
- labels:
- severity: warning
- annotations:
- summary: High CPU load
- description: "CPU load is > 0.1\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
diff --git a/demos/shared/signoz/clickhouse-cluster.xml b/demos/shared/signoz/clickhouse-cluster.xml
deleted file mode 100644
index 8b475ffe..00000000
--- a/demos/shared/signoz/clickhouse-cluster.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
- zookeeper-1
- 2181
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- clickhouse
- 9000
-
-
-
-
-
-
-
-
diff --git a/demos/shared/signoz/clickhouse-config.xml b/demos/shared/signoz/clickhouse-config.xml
deleted file mode 100644
index 12086ec8..00000000
--- a/demos/shared/signoz/clickhouse-config.xml
+++ /dev/null
@@ -1,1143 +0,0 @@
-
-
-
-
-
- information
-
- json
-
- /var/log/clickhouse-server/clickhouse-server.log
- /var/log/clickhouse-server/clickhouse-server.err.log
-
- 1000M
- 10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 8123
-
-
- 9000
-
-
- 9004
-
-
- 9005
-
-
-
-
-
-
-
-
-
-
-
- 9009
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 4096
-
-
- 3
-
-
-
-
- false
-
-
- /path/to/ssl_cert_file
- /path/to/ssl_key_file
-
-
- false
-
-
- /path/to/ssl_ca_cert_file
-
-
- none
-
-
- 0
-
-
- -1
- -1
-
-
- false
-
-
-
-
-
-
-
-
-
-
- none
- true
- true
- sslv2,sslv3
- true
-
-
-
- true
- true
- sslv2,sslv3
- true
-
-
-
- RejectCertificateHandler
-
-
-
-
-
-
-
-
- 100
-
-
- 0
-
-
-
- 10000
-
-
-
-
-
- 0.9
-
-
- 4194304
-
-
- 0
-
-
-
-
-
- 8589934592
-
-
- 5368709120
-
-
-
- 1000
-
-
- 134217728
-
-
- 10000
-
-
- /var/lib/clickhouse/
-
-
- /var/lib/clickhouse/tmp/
-
-
-
- `
-
-
-
-
-
- /var/lib/clickhouse/user_files/
-
-
-
-
-
-
-
-
-
-
-
-
- users.xml
-
-
-
- /var/lib/clickhouse/access/
-
-
-
-
-
-
- default
-
-
-
-
-
-
-
-
-
-
-
- default
-
-
-
-
-
-
-
-
- true
-
-
- false
-
- ' | sed -e 's|.*>\(.*\)<.*|\1|')
- wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge_$PKG_VER-1_all.deb
- apt install --no-install-recommends -f ./clickhouse-jdbc-bridge_$PKG_VER-1_all.deb
- clickhouse-jdbc-bridge &
-
- * [CentOS/RHEL]
- export MVN_URL=https://repo1.maven.org/maven2/ru/yandex/clickhouse/clickhouse-jdbc-bridge
- export PKG_VER=$(curl -sL $MVN_URL/maven-metadata.xml | grep '' | sed -e 's|.*>\(.*\)<.*|\1|')
- wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpm
- yum localinstall -y clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpm
- clickhouse-jdbc-bridge &
-
- Please refer to https://github.com/ClickHouse/clickhouse-jdbc-bridge#usage for more information.
- ]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 01
- example01-01-1
-
-
-
-
-
- 3600
-
-
-
- 3600
-
-
- 60
-
-
-
-
-
-
-
-
-
-
-
-
- system
-
-
- toYYYYMM(event_date)
-
-
-
-
-
- 7500
-
-
-
-
- system
-
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
-
-
- system
-
- 7500
- 1000
-
-
-
-
- system
-
-
- 7000
-
-
-
-
-
-
- engine MergeTree
- partition by toYYYYMM(finish_date)
- order by (finish_date, finish_time_us, trace_id)
-
- system
-
- 7500
-
-
-
-
-
- system
-
-
-
- 1000
-
-
-
-
-
-
-
- system
-
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
-
-
-
-
-
- *_dictionary.xml
-
-
- *function.xml
- /var/lib/clickhouse/user_scripts/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- /clickhouse/task_queue/ddl
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- click_cost
- any
-
- 0
- 3600
-
-
- 86400
- 60
-
-
-
- max
-
- 0
- 60
-
-
- 3600
- 300
-
-
- 86400
- 3600
-
-
-
-
-
- /var/lib/clickhouse/format_schemas/
-
-
-
-
- hide encrypt/decrypt arguments
- ((?:aes_)?(?:encrypt|decrypt)(?:_mysql)?)\s*\(\s*(?:'(?:\\'|.)+'|.*?)\s*\)
-
- \1(???)
-
-
-
-
-
-
-
-
-
- false
-
- false
-
-
- https://6f33034cfe684dd7a3ab9875e57b1c8d@o388870.ingest.sentry.io/5226277
-
-
-
-
-
-
-
-
-
-
- 268435456
- true
-
-
diff --git a/demos/shared/signoz/clickhouse-storage.xml b/demos/shared/signoz/clickhouse-storage.xml
deleted file mode 100644
index 54ec4976..00000000
--- a/demos/shared/signoz/clickhouse-storage.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
- 10485760
-
-
- s3
-
- https://BUCKET-NAME.s3-REGION-NAME.amazonaws.com/data/
- ACCESS-KEY-ID
- SECRET-ACCESS-KEY
-
-
-
-
-
-
-
-
-
-
- default
-
-
- s3
- 0
-
-
-
-
-
-
diff --git a/demos/shared/signoz/clickhouse-users.xml b/demos/shared/signoz/clickhouse-users.xml
deleted file mode 100644
index f1856207..00000000
--- a/demos/shared/signoz/clickhouse-users.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-
-
-
-
-
-
-
-
-
- 10000000000
-
-
- random
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
- ::/0
-
-
-
- default
-
-
- default
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3600
-
-
- 0
- 0
- 0
- 0
- 0
-
-
-
-
diff --git a/demos/shared/signoz/custom-function.xml b/demos/shared/signoz/custom-function.xml
deleted file mode 100644
index b2b3f91a..00000000
--- a/demos/shared/signoz/custom-function.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
- executable
- histogramQuantile
- Float64
-
- Array(Float64)
- buckets
-
-
- Array(Float64)
- counts
-
-
- Float64
- quantile
-
- CSV
- ./histogramQuantile
-
-
diff --git a/demos/shared/signoz/docker-compose-core.yaml b/demos/shared/signoz/docker-compose-core.yaml
deleted file mode 100644
index ec9e0697..00000000
--- a/demos/shared/signoz/docker-compose-core.yaml
+++ /dev/null
@@ -1,133 +0,0 @@
-version: "2.4"
-
-include:
- - test-app-docker-compose.yaml
-
-services:
- zookeeper-1:
- image: bitnami/zookeeper:3.7.1
- container_name: signoz-zookeeper-1
- hostname: zookeeper-1
- user: root
- ports:
- - "2181:2181"
- - "2888:2888"
- - "3888:3888"
- volumes:
- - ./data/zookeeper-1:/bitnami/zookeeper
- environment:
- - ZOO_SERVER_ID=1
- # - ZOO_SERVERS=0.0.0.0:2888:3888,zookeeper-2:2888:3888,zookeeper-3:2888:3888
- - ALLOW_ANONYMOUS_LOGIN=yes
- - ZOO_AUTOPURGE_INTERVAL=1
-
- clickhouse:
- image: clickhouse/clickhouse-server:24.1.2-alpine
- container_name: signoz-clickhouse
- # ports:
- # - "9000:9000"
- # - "8123:8123"
- tty: true
- volumes:
- - ./clickhouse-config.xml:/etc/clickhouse-server/config.xml
- - ./clickhouse-users.xml:/etc/clickhouse-server/users.xml
- - ./custom-function.xml:/etc/clickhouse-server/custom-function.xml
- - ./clickhouse-cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
- # - ./clickhouse-storage.xml:/etc/clickhouse-server/config.d/storage.xml
- - ./data/clickhouse/:/var/lib/clickhouse/
- - ./user_scripts:/var/lib/clickhouse/user_scripts/
- restart: on-failure
- logging:
- options:
- max-size: 50m
- max-file: "3"
- healthcheck:
- # "clickhouse", "client", "-u ${CLICKHOUSE_USER}", "--password ${CLICKHOUSE_PASSWORD}", "-q 'SELECT 1'"
- test:
- [
- "CMD",
- "wget",
- "--spider",
- "-q",
- "0.0.0.0:8123/ping"
- ]
- interval: 30s
- timeout: 5s
- retries: 3
-
- alertmanager:
- container_name: signoz-alertmanager
- image: signoz/alertmanager:0.23.7
- volumes:
- - ./data/alertmanager:/data
- depends_on:
- query-service:
- condition: service_healthy
- restart: on-failure
- command:
- - --queryService.url=http://query-service:8085
- - --storage.path=/data
-
- otel-collector-migrator:
- image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.5}
- container_name: otel-migrator
- command:
- - "--dsn=tcp://clickhouse:9000"
- depends_on:
- clickhouse:
- condition: service_healthy
- # clickhouse-2:
- # condition: service_healthy
- # clickhouse-3:
- # condition: service_healthy
-
- # Notes for Maintainers/Contributors who will change Line Numbers of Frontend & Query-Section. Please Update Line Numbers in `./scripts/commentLinesForSetup.sh` & `./CONTRIBUTING.md`
- otel-collector:
- container_name: signoz-otel-collector
- image: signoz/signoz-otel-collector:0.111.5
- command:
- [
- "--config=/etc/otel-collector-config.yaml",
- "--manager-config=/etc/manager-config.yaml",
- "--copy-path=/var/tmp/collector-config.yaml",
- "--feature-gates=-pkg.translator.prometheus.NormalizeName"
- ]
- # user: root # required for reading docker container logs
- volumes:
- - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
- - ./otel-collector-opamp-config.yaml:/etc/manager-config.yaml
- - /var/lib/docker/containers:/var/lib/docker/containers:ro
- - /:/hostfs:ro
- environment:
- - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux
- ports:
- # - "1777:1777" # pprof extension
- - "4317:4317" # OTLP gRPC receiver
- - "4318:4318" # OTLP HTTP receiver
- # - "8888:8888" # OtelCollector internal metrics
- # - "8889:8889" # signoz spanmetrics exposed by the agent
- # - "9411:9411" # Zipkin port
- # - "13133:13133" # health check extension
- # - "14250:14250" # Jaeger gRPC
- # - "14268:14268" # Jaeger thrift HTTP
- # - "55678:55678" # OpenCensus receiver
- # - "55679:55679" # zPages extension
- restart: on-failure
- depends_on:
- clickhouse:
- condition: service_healthy
- otel-collector-migrator:
- condition: service_completed_successfully
- query-service:
- condition: service_healthy
-
- logspout:
- image: "gliderlabs/logspout:v3.2.14"
- container_name: signoz-logspout
- volumes:
- - /etc/hostname:/etc/host_hostname:ro
- - /var/run/docker.sock:/var/run/docker.sock
- command: syslog+tcp://otel-collector:2255
- depends_on:
- - otel-collector
- restart: on-failure
diff --git a/demos/shared/signoz/docker-compose-local.yaml b/demos/shared/signoz/docker-compose-local.yaml
deleted file mode 100644
index 7effc129..00000000
--- a/demos/shared/signoz/docker-compose-local.yaml
+++ /dev/null
@@ -1,67 +0,0 @@
-version: "2.4"
-
-services:
- query-service:
- hostname: query-service
- build:
- context: "../../../"
- dockerfile: "./pkg/query-service/Dockerfile"
- args:
- LDFLAGS: ""
- TARGETPLATFORM: "${GOOS}/${GOARCH}"
- container_name: signoz-query-service
- environment:
- - ClickHouseUrl=tcp://clickhouse:9000
- - ALERTMANAGER_API_PREFIX=http://alertmanager:9093/api/
- - SIGNOZ_LOCAL_DB_PATH=/var/lib/signoz/signoz.db
- - DASHBOARDS_PATH=/root/config/dashboards
- - STORAGE=clickhouse
- - GODEBUG=netdns=go
- - TELEMETRY_ENABLED=true
- volumes:
- - ./prometheus.yml:/root/config/prometheus.yml
- - ../dashboards:/root/config/dashboards
- - ./data/signoz/:/var/lib/signoz/
- command:
- [
- "-config=/root/config/prometheus.yml",
- "--use-logs-new-schema=true"
- ]
- ports:
- - "6060:6060"
- - "8080:8080"
- restart: on-failure
- healthcheck:
- test:
- [
- "CMD",
- "wget",
- "--spider",
- "-q",
- "localhost:8080/api/v1/health"
- ]
- interval: 30s
- timeout: 5s
- retries: 3
- depends_on:
- clickhouse:
- condition: service_healthy
-
- frontend:
- build:
- context: "../../../frontend"
- dockerfile: "./Dockerfile"
- args:
- TARGETOS: "${GOOS}"
- TARGETPLATFORM: "${GOARCH}"
- container_name: signoz-frontend
- environment:
- - FRONTEND_API_ENDPOINT=http://query-service:8080
- restart: on-failure
- depends_on:
- - alertmanager
- - query-service
- ports:
- - "3301:3301"
- volumes:
- - ../common/nginx-config.conf:/etc/nginx/conf.d/default.conf
diff --git a/demos/shared/signoz/docker-compose-minimal.yaml b/demos/shared/signoz/docker-compose-minimal.yaml
deleted file mode 100644
index d4861a41..00000000
--- a/demos/shared/signoz/docker-compose-minimal.yaml
+++ /dev/null
@@ -1,296 +0,0 @@
-x-clickhouse-defaults: &clickhouse-defaults
- restart: on-failure
- # addding non LTS version due to this fix https://github.com/ClickHouse/ClickHouse/commit/32caf8716352f45c1b617274c7508c86b7d1afab
- image: clickhouse/clickhouse-server:24.1.2-alpine
- tty: true
- depends_on:
- - zookeeper-1
- # - zookeeper-2
- # - zookeeper-3
- logging:
- options:
- max-size: 50m
- max-file: "3"
- healthcheck:
- # "clickhouse", "client", "-u ${CLICKHOUSE_USER}", "--password ${CLICKHOUSE_PASSWORD}", "-q 'SELECT 1'"
- test:
- [
- "CMD",
- "wget",
- "--spider",
- "-q",
- "0.0.0.0:8123/ping"
- ]
- interval: 30s
- timeout: 5s
- retries: 3
- ulimits:
- nproc: 65535
- nofile:
- soft: 262144
- hard: 262144
-
-x-db-depend: &db-depend
- depends_on:
- clickhouse:
- condition: service_healthy
- otel-collector-migrator-sync:
- condition: service_completed_successfully
- # clickhouse-2:
- # condition: service_healthy
- # clickhouse-3:
- # condition: service_healthy
-
-services:
-
- zookeeper-1:
- image: bitnami/zookeeper:3.7.1
- container_name: signoz-zookeeper-1
- hostname: zookeeper-1
- user: root
- ports:
- - "2181:2181"
- - "2888:2888"
- - "3888:3888"
- volumes:
- - ./data/zookeeper-1:/bitnami/zookeeper
- environment:
- - ZOO_SERVER_ID=1
- # - ZOO_SERVERS=0.0.0.0:2888:3888,zookeeper-2:2888:3888,zookeeper-3:2888:3888
- - ALLOW_ANONYMOUS_LOGIN=yes
- - ZOO_AUTOPURGE_INTERVAL=1
-
- # zookeeper-2:
- # image: bitnami/zookeeper:3.7.0
- # container_name: signoz-zookeeper-2
- # hostname: zookeeper-2
- # user: root
- # ports:
- # - "2182:2181"
- # - "2889:2888"
- # - "3889:3888"
- # volumes:
- # - ./data/zookeeper-2:/bitnami/zookeeper
- # environment:
- # - ZOO_SERVER_ID=2
- # - ZOO_SERVERS=zookeeper-1:2888:3888,0.0.0.0:2888:3888,zookeeper-3:2888:3888
- # - ALLOW_ANONYMOUS_LOGIN=yes
- # - ZOO_AUTOPURGE_INTERVAL=1
-
- # zookeeper-3:
- # image: bitnami/zookeeper:3.7.0
- # container_name: signoz-zookeeper-3
- # hostname: zookeeper-3
- # user: root
- # ports:
- # - "2183:2181"
- # - "2890:2888"
- # - "3890:3888"
- # volumes:
- # - ./data/zookeeper-3:/bitnami/zookeeper
- # environment:
- # - ZOO_SERVER_ID=3
- # - ZOO_SERVERS=zookeeper-1:2888:3888,zookeeper-2:2888:3888,0.0.0.0:2888:3888
- # - ALLOW_ANONYMOUS_LOGIN=yes
- # - ZOO_AUTOPURGE_INTERVAL=1
-
- clickhouse:
- <<: *clickhouse-defaults
- container_name: signoz-clickhouse
- hostname: clickhouse
- ports:
- - "9000:9000"
- - "8123:8123"
- - "9181:9181"
- volumes:
- - ./clickhouse-config.xml:/etc/clickhouse-server/config.xml
- - ./clickhouse-users.xml:/etc/clickhouse-server/users.xml
- - ./custom-function.xml:/etc/clickhouse-server/custom-function.xml
- - ./clickhouse-cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
- # - ./clickhouse-storage.xml:/etc/clickhouse-server/config.d/storage.xml
- - ./data/clickhouse/:/var/lib/clickhouse/
- - ./user_scripts:/var/lib/clickhouse/user_scripts/
-
- # clickhouse-2:
- # <<: *clickhouse-defaults
- # container_name: signoz-clickhouse-2
- # hostname: clickhouse-2
- # ports:
- # - "9001:9000"
- # - "8124:8123"
- # - "9182:9181"
- # volumes:
- # - ./clickhouse-config.xml:/etc/clickhouse-server/config.xml
- # - ./clickhouse-users.xml:/etc/clickhouse-server/users.xml
- # - ./custom-function.xml:/etc/clickhouse-server/custom-function.xml
- # - ./clickhouse-cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
- # # - ./clickhouse-storage.xml:/etc/clickhouse-server/config.d/storage.xml
- # - ./data/clickhouse-2/:/var/lib/clickhouse/
- # - ./user_scripts:/var/lib/clickhouse/user_scripts/
-
-
- # clickhouse-3:
- # <<: *clickhouse-defaults
- # container_name: signoz-clickhouse-3
- # hostname: clickhouse-3
- # ports:
- # - "9002:9000"
- # - "8125:8123"
- # - "9183:9181"
- # volumes:
- # - ./clickhouse-config.xml:/etc/clickhouse-server/config.xml
- # - ./clickhouse-users.xml:/etc/clickhouse-server/users.xml
- # - ./custom-function.xml:/etc/clickhouse-server/custom-function.xml
- # - ./clickhouse-cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
- # # - ./clickhouse-storage.xml:/etc/clickhouse-server/config.d/storage.xml
- # - ./data/clickhouse-3/:/var/lib/clickhouse/
- # - ./user_scripts:/var/lib/clickhouse/user_scripts/
-
- alertmanager:
- image: signoz/alertmanager:${ALERTMANAGER_TAG:-0.23.7}
- container_name: signoz-alertmanager
- volumes:
- - ./data/alertmanager:/data
- depends_on:
- query-service:
- condition: service_healthy
- restart: on-failure
- command:
- - --queryService.url=http://query-service:8085
- - --storage.path=/data
-
- # Notes for Maintainers/Contributors who will change Line Numbers of Frontend & Query-Section. Please Update Line Numbers in `./scripts/commentLinesForSetup.sh` & `./CONTRIBUTING.md`
-
- query-service:
- image: signoz/query-service:${DOCKER_TAG:-0.57.0}
- container_name: signoz-query-service
- command:
- [
- "-config=/root/config/prometheus.yml",
- "--use-logs-new-schema=true"
- ]
- # ports:
- # - "6060:6060" # pprof port
- # - "8080:8080" # query-service port
- volumes:
- - ./prometheus.yml:/root/config/prometheus.yml
- - ../dashboards:/root/config/dashboards
- - ./data/signoz/:/var/lib/signoz/
- environment:
- - ClickHouseUrl=tcp://clickhouse:9000
- - ALERTMANAGER_API_PREFIX=http://alertmanager:9093/api/
- - SIGNOZ_LOCAL_DB_PATH=/var/lib/signoz/signoz.db
- - DASHBOARDS_PATH=/root/config/dashboards
- - STORAGE=clickhouse
- - GODEBUG=netdns=go
- - TELEMETRY_ENABLED=true
- - DEPLOYMENT_TYPE=docker-standalone-amd
- restart: on-failure
- healthcheck:
- test:
- [
- "CMD",
- "wget",
- "--spider",
- "-q",
- "localhost:8080/api/v1/health"
- ]
- interval: 30s
- timeout: 5s
- retries: 3
- <<: *db-depend
-
- frontend:
- image: signoz/frontend:${DOCKER_TAG:-0.57.0}
- container_name: signoz-frontend
- restart: on-failure
- depends_on:
- - alertmanager
- - query-service
- ports:
- - "3301:3301"
- volumes:
- - ./nginx-config.conf:/etc/nginx/conf.d/default.conf
-
- otel-collector-migrator-sync:
- image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.5}
- container_name: otel-migrator-sync
- command:
- - "sync"
- - "--dsn=tcp://clickhouse:9000"
- - "--up="
- depends_on:
- clickhouse:
- condition: service_healthy
- # clickhouse-2:
- # condition: service_healthy
- # clickhouse-3:
- # condition: service_healthy
-
- otel-collector-migrator-async:
- image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.5}
- container_name: otel-migrator-async
- command:
- - "async"
- - "--dsn=tcp://clickhouse:9000"
- - "--up="
- depends_on:
- clickhouse:
- condition: service_healthy
- otel-collector-migrator-sync:
- condition: service_completed_successfully
- # clickhouse-2:
- # condition: service_healthy
- # clickhouse-3:
- # condition: service_healthy
-
- otel-collector:
- image: signoz/signoz-otel-collector:${OTELCOL_TAG:-0.111.5}
- container_name: signoz-otel-collector
- command:
- [
- "--config=/etc/otel-collector-config.yaml",
- "--manager-config=/etc/manager-config.yaml",
- "--copy-path=/var/tmp/collector-config.yaml",
- "--feature-gates=-pkg.translator.prometheus.NormalizeName"
- ]
- user: root # required for reading docker container logs
- volumes:
- - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
- - ./otel-collector-opamp-config.yaml:/etc/manager-config.yaml
- - /var/lib/docker/containers:/var/lib/docker/containers:ro
- - /:/hostfs:ro
- environment:
- - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux
- - LOW_CARDINAL_EXCEPTION_GROUPING=false
- ports:
- # - "1777:1777" # pprof extension
- - "4317:4317" # OTLP gRPC receiver
- - "4318:4318" # OTLP HTTP receiver
- # - "8888:8888" # OtelCollector internal metrics
- # - "8889:8889" # signoz spanmetrics exposed by the agent
- # - "9411:9411" # Zipkin port
- # - "13133:13133" # health check extension
- # - "14250:14250" # Jaeger gRPC
- # - "14268:14268" # Jaeger thrift HTTP
- # - "55678:55678" # OpenCensus receiver
- # - "55679:55679" # zPages extension
- restart: on-failure
- depends_on:
- clickhouse:
- condition: service_healthy
- otel-collector-migrator-sync:
- condition: service_completed_successfully
- query-service:
- condition: service_healthy
-
- logspout:
- image: "gliderlabs/logspout:v3.2.14"
- container_name: signoz-logspout
- volumes:
- - /etc/hostname:/etc/host_hostname:ro
- - /var/run/docker.sock:/var/run/docker.sock
- command: syslog+tcp://otel-collector:2255
- depends_on:
- - otel-collector
- restart: on-failure
diff --git a/demos/shared/signoz/docker-compose.testing.yaml b/demos/shared/signoz/docker-compose.testing.yaml
deleted file mode 100644
index d8c0db25..00000000
--- a/demos/shared/signoz/docker-compose.testing.yaml
+++ /dev/null
@@ -1,284 +0,0 @@
-version: "2.4"
-
-include:
- - test-app-docker-compose.yaml
-
-x-clickhouse-defaults: &clickhouse-defaults
- restart: on-failure
- # addding non LTS version due to this fix https://github.com/ClickHouse/ClickHouse/commit/32caf8716352f45c1b617274c7508c86b7d1afab
- image: clickhouse/clickhouse-server:24.1.2-alpine
- tty: true
- depends_on:
- - zookeeper-1
- # - zookeeper-2
- # - zookeeper-3
- logging:
- options:
- max-size: 50m
- max-file: "3"
- healthcheck:
- # "clickhouse", "client", "-u ${CLICKHOUSE_USER}", "--password ${CLICKHOUSE_PASSWORD}", "-q 'SELECT 1'"
- test:
- [
- "CMD",
- "wget",
- "--spider",
- "-q",
- "0.0.0.0:8123/ping"
- ]
- interval: 30s
- timeout: 5s
- retries: 3
- ulimits:
- nproc: 65535
- nofile:
- soft: 262144
- hard: 262144
-
-x-db-depend: &db-depend
- depends_on:
- clickhouse:
- condition: service_healthy
- otel-collector-migrator:
- condition: service_completed_successfully
- # clickhouse-2:
- # condition: service_healthy
- # clickhouse-3:
- # condition: service_healthy
-
-services:
-
- zookeeper-1:
- image: bitnami/zookeeper:3.7.1
- container_name: signoz-zookeeper-1
- hostname: zookeeper-1
- user: root
- ports:
- - "2181:2181"
- - "2888:2888"
- - "3888:3888"
- volumes:
- - ./data/zookeeper-1:/bitnami/zookeeper
- environment:
- - ZOO_SERVER_ID=1
- # - ZOO_SERVERS=0.0.0.0:2888:3888,zookeeper-2:2888:3888,zookeeper-3:2888:3888
- - ALLOW_ANONYMOUS_LOGIN=yes
- - ZOO_AUTOPURGE_INTERVAL=1
-
- # zookeeper-2:
- # image: bitnami/zookeeper:3.7.0
- # container_name: signoz-zookeeper-2
- # hostname: zookeeper-2
- # user: root
- # ports:
- # - "2182:2181"
- # - "2889:2888"
- # - "3889:3888"
- # volumes:
- # - ./data/zookeeper-2:/bitnami/zookeeper
- # environment:
- # - ZOO_SERVER_ID=2
- # - ZOO_SERVERS=zookeeper-1:2888:3888,0.0.0.0:2888:3888,zookeeper-3:2888:3888
- # - ALLOW_ANONYMOUS_LOGIN=yes
- # - ZOO_AUTOPURGE_INTERVAL=1
-
- # zookeeper-3:
- # image: bitnami/zookeeper:3.7.0
- # container_name: signoz-zookeeper-3
- # hostname: zookeeper-3
- # user: root
- # ports:
- # - "2183:2181"
- # - "2890:2888"
- # - "3890:3888"
- # volumes:
- # - ./data/zookeeper-3:/bitnami/zookeeper
- # environment:
- # - ZOO_SERVER_ID=3
- # - ZOO_SERVERS=zookeeper-1:2888:3888,zookeeper-2:2888:3888,0.0.0.0:2888:3888
- # - ALLOW_ANONYMOUS_LOGIN=yes
- # - ZOO_AUTOPURGE_INTERVAL=1
-
- clickhouse:
- <<: *clickhouse-defaults
- container_name: signoz-clickhouse
- hostname: clickhouse
- ports:
- - "9000:9000"
- - "8123:8123"
- - "9181:9181"
- volumes:
- - ./clickhouse-config.xml:/etc/clickhouse-server/config.xml
- - ./clickhouse-users.xml:/etc/clickhouse-server/users.xml
- - ./custom-function.xml:/etc/clickhouse-server/custom-function.xml
- - ./clickhouse-cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
- # - ./clickhouse-storage.xml:/etc/clickhouse-server/config.d/storage.xml
- - ./data/clickhouse/:/var/lib/clickhouse/
- - ./user_scripts:/var/lib/clickhouse/user_scripts/
-
- # clickhouse-2:
- # <<: *clickhouse-defaults
- # container_name: signoz-clickhouse-2
- # hostname: clickhouse-2
- # ports:
- # - "9001:9000"
- # - "8124:8123"
- # - "9182:9181"
- # volumes:
- # - ./clickhouse-config.xml:/etc/clickhouse-server/config.xml
- # - ./clickhouse-users.xml:/etc/clickhouse-server/users.xml
- # - ./custom-function.xml:/etc/clickhouse-server/custom-function.xml
- # - ./clickhouse-cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
- # # - ./clickhouse-storage.xml:/etc/clickhouse-server/config.d/storage.xml
- # - ./data/clickhouse-2/:/var/lib/clickhouse/
- # - ./user_scripts:/var/lib/clickhouse/user_scripts/
-
-
- # clickhouse-3:
- # <<: *clickhouse-defaults
- # container_name: signoz-clickhouse-3
- # hostname: clickhouse-3
- # ports:
- # - "9002:9000"
- # - "8125:8123"
- # - "9183:9181"
- # volumes:
- # - ./clickhouse-config.xml:/etc/clickhouse-server/config.xml
- # - ./clickhouse-users.xml:/etc/clickhouse-server/users.xml
- # - ./custom-function.xml:/etc/clickhouse-server/custom-function.xml
- # - ./clickhouse-cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
- # # - ./clickhouse-storage.xml:/etc/clickhouse-server/config.d/storage.xml
- # - ./data/clickhouse-3/:/var/lib/clickhouse/
- # - ./user_scripts:/var/lib/clickhouse/user_scripts/
-
- alertmanager:
- image: signoz/alertmanager:${ALERTMANAGER_TAG:-0.23.7}
- container_name: signoz-alertmanager
- volumes:
- - ./data/alertmanager:/data
- depends_on:
- query-service:
- condition: service_healthy
- restart: on-failure
- command:
- - --queryService.url=http://query-service:8085
- - --storage.path=/data
-
- # Notes for Maintainers/Contributors who will change Line Numbers of Frontend & Query-Section. Please Update Line Numbers in `./scripts/commentLinesForSetup.sh` & `./CONTRIBUTING.md`
-
- query-service:
- image: signoz/query-service:${DOCKER_TAG:-0.57.0}
- container_name: signoz-query-service
- command:
- [
- "-config=/root/config/prometheus.yml",
- "-gateway-url=https://api.staging.signoz.cloud",
- "--use-logs-new-schema=true"
- ]
- # ports:
- # - "6060:6060" # pprof port
- # - "8080:8080" # query-service port
- volumes:
- - ./prometheus.yml:/root/config/prometheus.yml
- - ../dashboards:/root/config/dashboards
- - ./data/signoz/:/var/lib/signoz/
- environment:
- - ClickHouseUrl=tcp://clickhouse:9000
- - ALERTMANAGER_API_PREFIX=http://alertmanager:9093/api/
- - SIGNOZ_LOCAL_DB_PATH=/var/lib/signoz/signoz.db
- - DASHBOARDS_PATH=/root/config/dashboards
- - STORAGE=clickhouse
- - GODEBUG=netdns=go
- - TELEMETRY_ENABLED=true
- - DEPLOYMENT_TYPE=docker-standalone-amd
- restart: on-failure
- healthcheck:
- test:
- [
- "CMD",
- "wget",
- "--spider",
- "-q",
- "localhost:8080/api/v1/health"
- ]
- interval: 30s
- timeout: 5s
- retries: 3
- <<: *db-depend
-
- frontend:
- image: signoz/frontend:${DOCKER_TAG:-0.57.0}
- container_name: signoz-frontend
- restart: on-failure
- depends_on:
- - alertmanager
- - query-service
- ports:
- - "3301:3301"
- volumes:
- - ../common/nginx-config.conf:/etc/nginx/conf.d/default.conf
-
- otel-collector-migrator:
- image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-0.111.5}
- container_name: otel-migrator
- command:
- - "--dsn=tcp://clickhouse:9000"
- depends_on:
- clickhouse:
- condition: service_healthy
- # clickhouse-2:
- # condition: service_healthy
- # clickhouse-3:
- # condition: service_healthy
-
-
- otel-collector:
- image: signoz/signoz-otel-collector:${OTELCOL_TAG:-0.111.5}
- container_name: signoz-otel-collector
- command:
- [
- "--config=/etc/otel-collector-config.yaml",
- "--manager-config=/etc/manager-config.yaml",
- "--copy-path=/var/tmp/collector-config.yaml",
- "--feature-gates=-pkg.translator.prometheus.NormalizeName"
- ]
- user: root # required for reading docker container logs
- volumes:
- - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
- - ./otel-collector-opamp-config.yaml:/etc/manager-config.yaml
- - /var/lib/docker/containers:/var/lib/docker/containers:ro
- - /:/hostfs:ro
- environment:
- - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux
- - LOW_CARDINAL_EXCEPTION_GROUPING=false
- ports:
- # - "1777:1777" # pprof extension
- - "4317:4317" # OTLP gRPC receiver
- - "4318:4318" # OTLP HTTP receiver
- # - "8888:8888" # OtelCollector internal metrics
- # - "8889:8889" # signoz spanmetrics exposed by the agent
- # - "9411:9411" # Zipkin port
- # - "13133:13133" # health check extension
- # - "14250:14250" # Jaeger gRPC
- # - "14268:14268" # Jaeger thrift HTTP
- # - "55678:55678" # OpenCensus receiver
- # - "55679:55679" # zPages extension
- restart: on-failure
- depends_on:
- clickhouse:
- condition: service_healthy
- otel-collector-migrator:
- condition: service_completed_successfully
- query-service:
- condition: service_healthy
-
- logspout:
- image: "gliderlabs/logspout:v3.2.14"
- container_name: signoz-logspout
- volumes:
- - /etc/hostname:/etc/host_hostname:ro
- - /var/run/docker.sock:/var/run/docker.sock
- command: syslog+tcp://otel-collector:2255
- depends_on:
- - otel-collector
- restart: on-failure
diff --git a/demos/shared/signoz/docker-compose.yaml b/demos/shared/signoz/docker-compose.yaml
deleted file mode 100644
index 251ca253..00000000
--- a/demos/shared/signoz/docker-compose.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-include:
- - test-app-docker-compose.yaml
- - docker-compose-minimal.yaml
diff --git a/demos/shared/signoz/keeper_config.xml b/demos/shared/signoz/keeper_config.xml
deleted file mode 100644
index f9a96dca..00000000
--- a/demos/shared/signoz/keeper_config.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
- information
- /var/log/clickhouse-keeper/clickhouse-keeper.log
- /var/log/clickhouse-keeper/clickhouse-keeper.err.log
-
- 1000M
- 10
-
-
-
- 0.0.0.0
- 4096
-
-
- 9181
-
-
- 1
-
- /var/lib/clickhouse/coordination/logs
- /var/lib/clickhouse/coordination/snapshots
-
-
- 10000
- 10000
- 100000
- information
- false
-
-
-
-
- true
-
-
- 1
-
-
- clickhouses-keeper-1
- 9234
-
-
-
-
-
-
-
diff --git a/demos/shared/signoz/nginx-config.conf b/demos/shared/signoz/nginx-config.conf
deleted file mode 100644
index 442a2899..00000000
--- a/demos/shared/signoz/nginx-config.conf
+++ /dev/null
@@ -1,64 +0,0 @@
-map $http_upgrade $connection_upgrade {
- default upgrade;
- '' close;
-}
-
-server {
- listen 3301;
- server_name _;
-
- gzip on;
- gzip_static on;
- gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
- gzip_proxied any;
- gzip_vary on;
- gzip_comp_level 6;
- gzip_buffers 16 8k;
- gzip_http_version 1.1;
-
- # to handle uri issue 414 from nginx
- client_max_body_size 24M;
- large_client_header_buffers 8 128k;
-
- location / {
- if ( $uri = '/index.html' ) {
- add_header Cache-Control no-store always;
- }
- root /usr/share/nginx/html;
- index index.html index.htm;
- try_files $uri $uri/ /index.html;
- }
-
- location ~ ^/api/(v1|v3)/logs/(tail|livetail){
- proxy_pass http://query-service:8080;
- proxy_http_version 1.1;
-
- # connection will be closed if no data is read for 600s between successive read operations
- proxy_read_timeout 600s;
-
- # dont buffer the data send it directly to client.
- proxy_buffering off;
- proxy_cache off;
- }
-
- location /api {
- proxy_pass http://query-service:8080/api;
- # connection will be closed if no data is read for 600s between successive read operations
- proxy_read_timeout 600s;
- }
-
- location /ws {
- proxy_pass http://query-service:8080/ws;
- proxy_http_version 1.1;
- proxy_set_header Upgrade "websocket";
- proxy_set_header Connection "upgrade";
- proxy_read_timeout 86400;
- }
-
- # redirect server error pages to the static page /50x.html
- #
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root /usr/share/nginx/html;
- }
-}
diff --git a/demos/shared/signoz/otel-collector-config.yaml b/demos/shared/signoz/otel-collector-config.yaml
deleted file mode 100644
index d7b491b7..00000000
--- a/demos/shared/signoz/otel-collector-config.yaml
+++ /dev/null
@@ -1,188 +0,0 @@
-receivers:
- tcplog/docker:
- listen_address: "0.0.0.0:2255"
- operators:
- - type: regex_parser
- regex: '^<([0-9]+)>[0-9]+ (?P[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?) (?P\S+) (?P\S+) [0-9]+ - -( (?P.*))?'
- timestamp:
- parse_from: attributes.timestamp
- layout: '%Y-%m-%dT%H:%M:%S.%LZ'
- - type: move
- from: attributes["body"]
- to: body
- - type: remove
- field: attributes.timestamp
- # please remove names from below if you want to collect logs from them
- - type: filter
- id: signoz_logs_filter
- expr: 'attributes.container_name matches "^signoz-(logspout|frontend|alertmanager|query-service|otel-collector|clickhouse|zookeeper)"'
- opencensus:
- endpoint: 0.0.0.0:55678
- otlp:
- protocols:
- grpc:
- endpoint: 0.0.0.0:4317
- http:
- endpoint: 0.0.0.0:4318
- jaeger:
- protocols:
- grpc:
- endpoint: 0.0.0.0:14250
- thrift_http:
- endpoint: 0.0.0.0:14268
- # thrift_compact:
- # endpoint: 0.0.0.0:6831
- # thrift_binary:
- # endpoint: 0.0.0.0:6832
- hostmetrics:
- collection_interval: 30s
- root_path: /hostfs
- scrapers:
- cpu: {}
- load: {}
- memory: {}
- disk: {}
- filesystem: {}
- network: {}
- prometheus:
- config:
- global:
- scrape_interval: 60s
- scrape_configs:
- # otel-collector internal metrics
- - job_name: otel-collector
- static_configs:
- - targets:
- - localhost:8888
- labels:
- job_name: otel-collector
-
-
-processors:
- batch:
- send_batch_size: 10000
- send_batch_max_size: 11000
- timeout: 10s
- signozspanmetrics/cumulative:
- metrics_exporter: clickhousemetricswrite
- metrics_flush_interval: 60s
- latency_histogram_buckets: [100us, 1ms, 2ms, 6ms, 10ms, 50ms, 100ms, 250ms, 500ms, 1000ms, 1400ms, 2000ms, 5s, 10s, 20s, 40s, 60s ]
- dimensions_cache_size: 100000
- dimensions:
- - name: service.namespace
- default: default
- - name: deployment.environment
- default: default
- # This is added to ensure the uniqueness of the timeseries
- # Otherwise, identical timeseries produced by multiple replicas of
- # collectors result in incorrect APM metrics
- - name: signoz.collector.id
- - name: service.version
- - name: browser.platform
- - name: browser.mobile
- - name: k8s.cluster.name
- - name: k8s.node.name
- - name: k8s.namespace.name
- - name: host.name
- - name: host.type
- - name: container.name
- # memory_limiter:
- # # 80% of maximum memory up to 2G
- # limit_mib: 1500
- # # 25% of limit up to 2G
- # spike_limit_mib: 512
- # check_interval: 5s
- #
- # # 50% of the maximum memory
- # limit_percentage: 50
- # # 20% of max memory usage spike expected
- # spike_limit_percentage: 20
- # queued_retry:
- # num_workers: 4
- # queue_size: 100
- # retry_on_failure: true
- resourcedetection:
- # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
- detectors: [env, system] # include ec2 for AWS, gcp for GCP and azure for Azure.
- timeout: 2s
- signozspanmetrics/delta:
- metrics_exporter: clickhousemetricswrite
- metrics_flush_interval: 60s
- latency_histogram_buckets: [100us, 1ms, 2ms, 6ms, 10ms, 50ms, 100ms, 250ms, 500ms, 1000ms, 1400ms, 2000ms, 5s, 10s, 20s, 40s, 60s ]
- dimensions_cache_size: 100000
- aggregation_temporality: AGGREGATION_TEMPORALITY_DELTA
- enable_exp_histogram: true
- dimensions:
- - name: service.namespace
- default: default
- - name: deployment.environment
- default: default
- # This is added to ensure the uniqueness of the timeseries
- # Otherwise, identical timeseries produced by multiple replicas of
- # collectors result in incorrect APM metrics
- - name: signoz.collector.id
- - name: service.version
- - name: browser.platform
- - name: browser.mobile
- - name: k8s.cluster.name
- - name: k8s.node.name
- - name: k8s.namespace.name
- - name: host.name
- - name: host.type
- - name: container.name
-
-extensions:
- health_check:
- endpoint: 0.0.0.0:13133
- zpages:
- endpoint: 0.0.0.0:55679
- pprof:
- endpoint: 0.0.0.0:1777
-
-exporters:
- clickhousetraces:
- datasource: tcp://clickhouse:9000/signoz_traces
- low_cardinal_exception_grouping: ${env:LOW_CARDINAL_EXCEPTION_GROUPING}
- clickhousemetricswrite:
- endpoint: tcp://clickhouse:9000/signoz_metrics
- resource_to_telemetry_conversion:
- enabled: true
- clickhousemetricswrite/prometheus:
- endpoint: tcp://clickhouse:9000/signoz_metrics
- clickhouselogsexporter:
- dsn: tcp://clickhouse:9000/signoz_logs
- timeout: 10s
- use_new_schema: true
- # logging: {}
-
-service:
- telemetry:
- logs:
- encoding: json
- metrics:
- address: 0.0.0.0:8888
- extensions:
- - health_check
- - zpages
- - pprof
- pipelines:
- traces:
- receivers: [jaeger, otlp]
- processors: [signozspanmetrics/cumulative, signozspanmetrics/delta, batch]
- exporters: [clickhousetraces]
- metrics:
- receivers: [otlp]
- processors: [batch]
- exporters: [clickhousemetricswrite]
- metrics/generic:
- receivers: [hostmetrics]
- processors: [resourcedetection, batch]
- exporters: [clickhousemetricswrite]
- metrics/prometheus:
- receivers: [prometheus]
- processors: [batch]
- exporters: [clickhousemetricswrite/prometheus]
- logs:
- receivers: [otlp, tcplog/docker]
- processors: [batch]
- exporters: [clickhouselogsexporter]
diff --git a/demos/shared/signoz/otel-collector-opamp-config.yaml b/demos/shared/signoz/otel-collector-opamp-config.yaml
deleted file mode 100644
index e408b55e..00000000
--- a/demos/shared/signoz/otel-collector-opamp-config.yaml
+++ /dev/null
@@ -1 +0,0 @@
-server_endpoint: ws://query-service:4320/v1/opamp
diff --git a/demos/shared/signoz/prometheus.yml b/demos/shared/signoz/prometheus.yml
deleted file mode 100644
index d7c52893..00000000
--- a/demos/shared/signoz/prometheus.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-# my global config
-global:
- scrape_interval: 5s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
- evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
- # scrape_timeout is set to the global default (10s).
-
-# Alertmanager configuration
-alerting:
- alertmanagers:
- - static_configs:
- - targets:
- - alertmanager:9093
-
-# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
-rule_files:
- # - "first_rules.yml"
- # - "second_rules.yml"
- - 'alerts.yml'
-
-# A scrape configuration containing exactly one endpoint to scrape:
-# Here it's Prometheus itself.
-scrape_configs: []
-
-remote_read:
- - url: tcp://clickhouse:9000/signoz_metrics
diff --git a/demos/shared/signoz/test-app-docker-compose.yaml b/demos/shared/signoz/test-app-docker-compose.yaml
deleted file mode 100644
index c043d75d..00000000
--- a/demos/shared/signoz/test-app-docker-compose.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-services:
- hotrod:
- image: jaegertracing/example-hotrod:1.30
- container_name: hotrod
- logging:
- options:
- max-size: 50m
- max-file: "3"
- command: [ "all" ]
- environment:
- - JAEGER_ENDPOINT=http://otel-collector:14268/api/traces
-
- load-hotrod:
- image: "signoz/locust:1.2.3"
- container_name: load-hotrod
- hostname: load-hotrod
- environment:
- ATTACKED_HOST: http://hotrod:8080
- LOCUST_MODE: standalone
- NO_PROXY: standalone
- TASK_DELAY_FROM: 5
- TASK_DELAY_TO: 30
- QUIET_MODE: "${QUIET_MODE:-false}"
- LOCUST_OPTS: "--headless -u 10 -r 1"
- volumes:
- - ../common/locust-scripts:/locust
diff --git a/demos/shared/signoz/user_scripts/histogramQuantile b/demos/shared/signoz/user_scripts/histogramQuantile
deleted file mode 100755
index 3b77a7b2..00000000
Binary files a/demos/shared/signoz/user_scripts/histogramQuantile and /dev/null differ
diff --git a/demos/shared/signoz/user_scripts/histogramQuantile.go b/demos/shared/signoz/user_scripts/histogramQuantile.go
deleted file mode 100644
index 9540a774..00000000
--- a/demos/shared/signoz/user_scripts/histogramQuantile.go
+++ /dev/null
@@ -1,237 +0,0 @@
-package main
-
-import (
- "bufio"
- "fmt"
- "math"
- "os"
- "sort"
- "strconv"
- "strings"
-)
-
-// NOTE: executable must be built with target OS and architecture set to linux/amd64
-// env GOOS=linux GOARCH=amd64 go build -o histogramQuantile histogramQuantile.go
-
-// The following code is adapted from the following source:
-// https://github.com/prometheus/prometheus/blob/main/promql/quantile.go
-
-type bucket struct {
- upperBound float64
- count float64
-}
-
-// buckets implements sort.Interface.
-type buckets []bucket
-
-func (b buckets) Len() int { return len(b) }
-func (b buckets) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
-func (b buckets) Less(i, j int) bool { return b[i].upperBound < b[j].upperBound }
-
-// bucketQuantile calculates the quantile 'q' based on the given buckets. The
-// buckets will be sorted by upperBound by this function (i.e. no sorting
-// needed before calling this function). The quantile value is interpolated
-// assuming a linear distribution within a bucket. However, if the quantile
-// falls into the highest bucket, the upper bound of the 2nd highest bucket is
-// returned. A natural lower bound of 0 is assumed if the upper bound of the
-// lowest bucket is greater 0. In that case, interpolation in the lowest bucket
-// happens linearly between 0 and the upper bound of the lowest bucket.
-// However, if the lowest bucket has an upper bound less or equal 0, this upper
-// bound is returned if the quantile falls into the lowest bucket.
-//
-// There are a number of special cases (once we have a way to report errors
-// happening during evaluations of AST functions, we should report those
-// explicitly):
-//
-// If 'buckets' has 0 observations, NaN is returned.
-//
-// If 'buckets' has fewer than 2 elements, NaN is returned.
-//
-// If the highest bucket is not +Inf, NaN is returned.
-//
-// If q==NaN, NaN is returned.
-//
-// If q<0, -Inf is returned.
-//
-// If q>1, +Inf is returned.
-func bucketQuantile(q float64, buckets buckets) float64 {
- if math.IsNaN(q) {
- return math.NaN()
- }
- if q < 0 {
- return math.Inf(-1)
- }
- if q > 1 {
- return math.Inf(+1)
- }
- sort.Sort(buckets)
- if !math.IsInf(buckets[len(buckets)-1].upperBound, +1) {
- return math.NaN()
- }
-
- buckets = coalesceBuckets(buckets)
- ensureMonotonic(buckets)
-
- if len(buckets) < 2 {
- return math.NaN()
- }
- observations := buckets[len(buckets)-1].count
- if observations == 0 {
- return math.NaN()
- }
- rank := q * observations
- b := sort.Search(len(buckets)-1, func(i int) bool { return buckets[i].count >= rank })
-
- if b == len(buckets)-1 {
- return buckets[len(buckets)-2].upperBound
- }
- if b == 0 && buckets[0].upperBound <= 0 {
- return buckets[0].upperBound
- }
- var (
- bucketStart float64
- bucketEnd = buckets[b].upperBound
- count = buckets[b].count
- )
- if b > 0 {
- bucketStart = buckets[b-1].upperBound
- count -= buckets[b-1].count
- rank -= buckets[b-1].count
- }
- return bucketStart + (bucketEnd-bucketStart)*(rank/count)
-}
-
-// coalesceBuckets merges buckets with the same upper bound.
-//
-// The input buckets must be sorted.
-func coalesceBuckets(buckets buckets) buckets {
- last := buckets[0]
- i := 0
- for _, b := range buckets[1:] {
- if b.upperBound == last.upperBound {
- last.count += b.count
- } else {
- buckets[i] = last
- last = b
- i++
- }
- }
- buckets[i] = last
- return buckets[:i+1]
-}
-
-// The assumption that bucket counts increase monotonically with increasing
-// upperBound may be violated during:
-//
-// * Recording rule evaluation of histogram_quantile, especially when rate()
-// has been applied to the underlying bucket timeseries.
-// * Evaluation of histogram_quantile computed over federated bucket
-// timeseries, especially when rate() has been applied.
-//
-// This is because scraped data is not made available to rule evaluation or
-// federation atomically, so some buckets are computed with data from the
-// most recent scrapes, but the other buckets are missing data from the most
-// recent scrape.
-//
-// Monotonicity is usually guaranteed because if a bucket with upper bound
-// u1 has count c1, then any bucket with a higher upper bound u > u1 must
-// have counted all c1 observations and perhaps more, so that c >= c1.
-//
-// Randomly interspersed partial sampling breaks that guarantee, and rate()
-// exacerbates it. Specifically, suppose bucket le=1000 has a count of 10 from
-// 4 samples but the bucket with le=2000 has a count of 7 from 3 samples. The
-// monotonicity is broken. It is exacerbated by rate() because under normal
-// operation, cumulative counting of buckets will cause the bucket counts to
-// diverge such that small differences from missing samples are not a problem.
-// rate() removes this divergence.)
-//
-// bucketQuantile depends on that monotonicity to do a binary search for the
-// bucket with the φ-quantile count, so breaking the monotonicity
-// guarantee causes bucketQuantile() to return undefined (nonsense) results.
-//
-// As a somewhat hacky solution until ingestion is atomic per scrape, we
-// calculate the "envelope" of the histogram buckets, essentially removing
-// any decreases in the count between successive buckets.
-
-func ensureMonotonic(buckets buckets) {
- max := buckets[0].count
- for i := 1; i < len(buckets); i++ {
- switch {
- case buckets[i].count > max:
- max = buckets[i].count
- case buckets[i].count < max:
- buckets[i].count = max
- }
- }
-}
-
-// End of copied code.
-
-func readLines() []string {
- r := bufio.NewReader(os.Stdin)
- bytes := []byte{}
- lines := []string{}
- for {
- line, isPrefix, err := r.ReadLine()
- if err != nil {
- break
- }
- bytes = append(bytes, line...)
- if !isPrefix {
- str := strings.TrimSpace(string(bytes))
- if len(str) > 0 {
- lines = append(lines, str)
- bytes = []byte{}
- }
- }
- }
- if len(bytes) > 0 {
- lines = append(lines, string(bytes))
- }
- return lines
-}
-
-func main() {
- lines := readLines()
- for _, text := range lines {
- // Example input
- // "[1, 2, 4, 8, 16]", "[1, 5, 8, 10, 14]", 0.9"
- // bounds - counts - quantile
- parts := strings.Split(text, "\",")
-
- var bucketNumbers []float64
- // Strip the ends with square brackets
- text = parts[0][2 : len(parts[0])-1]
- // Parse the bucket bounds
- for _, num := range strings.Split(text, ",") {
- num = strings.TrimSpace(num)
- number, err := strconv.ParseFloat(num, 64)
- if err == nil {
- bucketNumbers = append(bucketNumbers, number)
- }
- }
-
- var bucketCounts []float64
- // Strip the ends with square brackets
- text = parts[1][2 : len(parts[1])-1]
- // Parse the bucket counts
- for _, num := range strings.Split(text, ",") {
- num = strings.TrimSpace(num)
- number, err := strconv.ParseFloat(num, 64)
- if err == nil {
- bucketCounts = append(bucketCounts, number)
- }
- }
-
- // Parse the quantile
- q, err := strconv.ParseFloat(parts[2], 64)
- var b buckets
-
- if err == nil {
- for i := 0; i < len(bucketNumbers); i++ {
- b = append(b, bucket{upperBound: bucketNumbers[i], count: bucketCounts[i]})
- }
- }
- fmt.Println(bucketQuantile(q, b))
- }
-}
diff --git a/demos/shared/test_runner/run_demo_tests.sh b/demos/shared/test_runner/run_demo_tests.sh
index 3a035a47..7feeb9ac 100644
--- a/demos/shared/test_runner/run_demo_tests.sh
+++ b/demos/shared/test_runner/run_demo_tests.sh
@@ -23,8 +23,8 @@ do
echo "starting plano"
planoai up config.yaml
echo "starting docker containers"
- # only execute docker compose if demo is use_cases/preference_based_routing
- if [ "$demo" == "use_cases/preference_based_routing" ]; then
+ # only execute docker compose if demo is llm_routing/preference_based_routing
+ if [ "$demo" == "llm_routing/preference_based_routing" ]; then
echo "starting docker compose for $demo"
docker compose -f docker-compose.yaml up -d 2>&1 > /dev/null
else
diff --git a/demos/use_cases/ollama/docker-compose.yaml b/demos/use_cases/ollama/docker-compose.yaml
deleted file mode 100644
index 3f123d84..00000000
--- a/demos/use_cases/ollama/docker-compose.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-services:
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environemtn as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:12000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- jaeger:
- build:
- context: ../../shared/jaeger
- ports:
- - "16686:16686"
- - "4317:4317"
- - "4318:4318"
diff --git a/demos/use_cases/ollama/docker-compose_honeycomb.yaml b/demos/use_cases/ollama/docker-compose_honeycomb.yaml
deleted file mode 100644
index 9b44c0c2..00000000
--- a/demos/use_cases/ollama/docker-compose_honeycomb.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-services:
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environemtn as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- otel-collector:
- build:
- context: ../../shared/honeycomb/
- ports:
- - "4317:4317"
- - "4318:4318"
- volumes:
- - ../../shared/honeycomb/otel-collector-config.yaml:/etc/otel-collector-config.yaml
- env_file:
- - .env
- environment:
- - HONEYCOMB_API_KEY=${HONEYCOMB_API_KEY:?error}
diff --git a/demos/use_cases/spotify_bearer_auth/docker-compose.yaml b/demos/use_cases/spotify_bearer_auth/docker-compose.yaml
deleted file mode 100644
index bde2b082..00000000
--- a/demos/use_cases/spotify_bearer_auth/docker-compose.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-services:
- chatbot_ui:
- build:
- context: ../../shared/chatbot_ui
- ports:
- - "18080:8080"
- environment:
- # this is only because we are running the sample app in the same docker container environemtn as archgw
- - CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
- extra_hosts:
- - "host.docker.internal:host-gateway"
- volumes:
- - ./config.yaml:/app/plano_config.yaml
-
- jaeger:
- build:
- context: ../../shared/jaeger
- ports:
- - "16686:16686"
- - "4317:4317"
- - "4318:4318"
diff --git a/demos/use_cases/spotify_bearer_auth/run_demo.sh b/demos/use_cases/spotify_bearer_auth/run_demo.sh
deleted file mode 100644
index 6623dee5..00000000
--- a/demos/use_cases/spotify_bearer_auth/run_demo.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-set -e
-
-# Function to start the demo
-start_demo() {
- # Step 1: Check if .env file exists
- if [ -f ".env" ]; then
- echo ".env file already exists. Skipping creation."
- else
- # Step 2: Create `.env` file and set OpenAI key
- if [ -z "$OPENAI_API_KEY" ]; then
- echo "Error: OPENAI_API_KEY environment variable is not set for the demo."
- exit 1
- fi
-
- echo "Creating .env file..."
- echo "OPENAI_API_KEY=$OPENAI_API_KEY" > .env
- echo ".env file created with OPENAI_API_KEY."
- fi
-
- # Step 3: Start Plano
- echo "Starting Plano with config.yaml..."
- planoai up config.yaml
-
- # Step 4: Start developer services
- echo "Starting Network Agent using Docker Compose..."
- docker compose up -d # Run in detached mode
-}
-
-# Function to stop the demo
-stop_demo() {
- # Step 1: Stop Docker Compose services
- echo "Stopping Network Agent using Docker Compose..."
- docker compose down
-
- # Step 2: Stop Plano
- echo "Stopping Plano..."
- planoai down
-}
-
-# Main script logic
-if [ "$1" == "down" ]; then
- stop_demo
-else
- # Default action is to bring the demo up
- start_demo
-fi
diff --git a/docs/source/concepts/prompt_target.rst b/docs/source/concepts/prompt_target.rst
index 98eadee4..9514054a 100644
--- a/docs/source/concepts/prompt_target.rst
+++ b/docs/source/concepts/prompt_target.rst
@@ -172,7 +172,7 @@ Once the prompt targets are configured as above, handle parameters across multi-
Demo App
--------
-For your convenience, we've built a `demo app `_
+For your convenience, we've built a `demo app `_
that you can test and modify locally for multi-turn RAG scenarios.
.. figure:: ../build_with_plano/includes/multi_turn/mutli-turn-example.png
diff --git a/docs/source/guides/orchestration.rst b/docs/source/guides/orchestration.rst
index e8553b8b..3170b65f 100644
--- a/docs/source/guides/orchestration.rst
+++ b/docs/source/guides/orchestration.rst
@@ -342,7 +342,7 @@ Next Steps
* Explore :ref:`filter chains ` for adding guardrails and context enrichment
* See :ref:`observability ` for monitoring multi-agent workflows
* Review the :ref:`LLM Providers ` guide for model routing within agents
-* Check out the complete `Travel Booking demo `_ on GitHub
+* Check out the complete `Travel Booking demo `_ on GitHub
.. note::
To observe traffic to and from agents, please read more about :ref:`observability ` in Plano.
diff --git a/tests/e2e/docker-compose.yaml b/tests/e2e/docker-compose.yaml
index 79494d57..0f5ddffd 100644
--- a/tests/e2e/docker-compose.yaml
+++ b/tests/e2e/docker-compose.yaml
@@ -8,7 +8,7 @@ services:
- "12000:12000"
- "19901:9901"
volumes:
- - ../../demos/samples_python/weather_forecast/plano_config.yaml:/app/plano_config.yaml
+ - ../../demos/getting_started/weather_forecast/plano_config.yaml:/app/plano_config.yaml
- /etc/ssl/cert.pem:/etc/ssl/cert.pem
extra_hosts:
- "host.docker.internal:host-gateway"
diff --git a/tests/e2e/run_e2e_tests.sh b/tests/e2e/run_e2e_tests.sh
index 3de12590..80535368 100644
--- a/tests/e2e/run_e2e_tests.sh
+++ b/tests/e2e/run_e2e_tests.sh
@@ -23,7 +23,7 @@ log starting > ../build.log
log building and running function_calling demo
log ===========================================
-cd ../../demos/samples_python/weather_forecast/
+cd ../../demos/getting_started/weather_forecast/
docker compose up weather_forecast_service --build -d
cd -
@@ -46,7 +46,7 @@ uv sync
log startup plano gateway with function calling demo
cd ../../
planoai down
-planoai up demos/samples_python/weather_forecast/config.yaml
+planoai up demos/getting_started/weather_forecast/config.yaml
cd -
log running e2e tests for prompt gateway
@@ -59,7 +59,7 @@ planoai down
log startup plano gateway with model alias routing demo
cd ../../
-planoai up demos/use_cases/model_alias_routing/config_with_aliases.yaml
+planoai up demos/llm_routing/model_alias_routing/config_with_aliases.yaml
cd -
log running e2e tests for model alias routing
@@ -80,6 +80,6 @@ uv run pytest test_openai_responses_api_client_with_state.py
log shutting down the weather_forecast demo
log =======================================
-cd ../../demos/samples_python/weather_forecast
+cd ../../demos/getting_started/weather_forecast
docker compose down
cd -
diff --git a/tests/e2e/run_model_alias_tests.sh b/tests/e2e/run_model_alias_tests.sh
index c3b1031f..4c2aa7ee 100755
--- a/tests/e2e/run_model_alias_tests.sh
+++ b/tests/e2e/run_model_alias_tests.sh
@@ -37,7 +37,7 @@ uv sync
log "startup plano gateway with model alias routing demo"
cd ../../
planoai down || true
-planoai up demos/use_cases/model_alias_routing/config_with_aliases.yaml
+planoai up demos/llm_routing/model_alias_routing/config_with_aliases.yaml
cd -
# Run both test suites that share this config in a single pytest invocation
diff --git a/tests/e2e/run_prompt_gateway_tests.sh b/tests/e2e/run_prompt_gateway_tests.sh
index b719c0fb..bb9cdd43 100755
--- a/tests/e2e/run_prompt_gateway_tests.sh
+++ b/tests/e2e/run_prompt_gateway_tests.sh
@@ -34,7 +34,7 @@ uv sync
# Start weather_forecast service (needed for prompt_gateway tests)
log "building and running weather_forecast service"
-cd ../../demos/samples_python/weather_forecast/
+cd ../../demos/getting_started/weather_forecast/
docker compose up weather_forecast_service --build -d
cd -
@@ -42,7 +42,7 @@ cd -
log "startup plano gateway with function calling demo"
cd ../../
planoai down || true
-planoai up demos/samples_python/weather_forecast/config.yaml
+planoai up demos/getting_started/weather_forecast/config.yaml
cd -
# Run tests
@@ -52,6 +52,6 @@ uv run pytest test_prompt_gateway.py
# Cleanup
log "shutting down"
planoai down || true
-cd ../../demos/samples_python/weather_forecast
+cd ../../demos/getting_started/weather_forecast
docker compose down
cd -