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, +image + +## 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, -image - -## 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 - query_log
- - toYYYYMM(event_date) - - - - - - 7500 -
- - - - system - trace_log
- - toYYYYMM(event_date) - 7500 -
- - - - system - query_thread_log
- toYYYYMM(event_date) - 7500 -
- - - - system - query_views_log
- toYYYYMM(event_date) - 7500 -
- - - - system - part_log
- toYYYYMM(event_date) - 7500 -
- - - - - - system - metric_log
- 7500 - 1000 -
- - - - system - asynchronous_metric_log
- - 7000 -
- - - - - - engine MergeTree - partition by toYYYYMM(finish_date) - order by (finish_date, finish_time_us, trace_id) - - system - opentelemetry_span_log
- 7500 -
- - - - - system - crash_log
- - - 1000 -
- - - - - - - system - processors_profile_log
- - 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 -