A framework for building, orchestrating and deploying AI agents and multi-agent workflows with support for Python and .NET.
docker pull quay.io/keycloak/keycloak:latest
docker run -d --name agent-framework -p 5002:5002 --restart always quay.io/keycloak/keycloak:latest
podman run -d --name agent-framework -p 5002:5002 --restart always quay.io/keycloak/keycloak:latest
skopeo inspect docker://quay.io/keycloak/keycloak:latest
oras pull quay.io/keycloak/keycloak:latest
docker compose up -d
services:
keycloak:
image: quay.io/keycloak/keycloak:latest
container_name: auth-keycloak
environment:
- KC_BOOTSTRAP_ADMIN_USERNAME=admin
- KC_BOOTSTRAP_ADMIN_PASSWORD=admin
- KC_HOSTNAME_STRICT=false
- KC_PROXY_HEADERS=xforwarded
volumes:
- ./keycloak/dev-realm.json:/opt/keycloak/data/import/dev-realm.json
command: ["start-dev", "--import-realm"]
ports:
- "5002:8080"
healthcheck:
test: ["CMD-SHELL", "exec 3<>/dev/tcp/localhost/8080 && echo -e 'GET /realms/master HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && cat <&3 | grep -q '200'"]
interval: 10s
timeout: 5s
retries: 30
start_period: 30s
# One-shot init container that registers the Codespaces redirect URI
# with Keycloak after it becomes healthy. Auto-detects Codespaces via
# CODESPACE_NAME and GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN env vars.
keycloak-init:
image: curlimages/curl:latest
container_name: auth-keycloak-init
environment:
- KEYCLOAK_URL=http://keycloak:8080
- CODESPACE_NAME=${CODESPACE_NAME:-}
- GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN=${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN:-}
volumes:
- ./keycloak/setup-redirect-uris.sh:/setup-redirect-uris.sh:ro
entrypoint: ["sh", "/setup-redirect-uris.sh"]
depends_on:
keycloak:
condition: service_healthy
agent-service:
build:
context: ../../..
dockerfile: samples/05-end-to-end/AspNetAgentAuthorization/Service/Dockerfile
container_name: auth-agent-service
environment:
- ASPNETCORE_ENVIRONMENT=Development
- Auth__Authority=http://keycloak:8080/realms/dev
- Auth__Audience=agent-service
- OPENAI_API_KEY=${OPENAI_API_KEY}
- OPENAI_MODEL=${OPENAI_MODEL:-gpt-4.1-mini}
ports:
- "5001:5001"
depends_on:
keycloak:
condition: service_healthy
web-client:
build:
context: ../../..
dockerfile: samples/05-end-to-end/AspNetAgentAuthorization/RazorWebClient/Dockerfile
container_name: auth-web-client
environment:
- ASPNETCORE_ENVIRONMENT=Development
- Auth__Authority=http://keycloak:8080/realms/dev
- Auth__PublicKeycloakUrl=http://localhost:5002
- Auth__ClientId=web-client
- AgentService__BaseUrl=http://agent-service:5001
- CODESPACE_NAME=${CODESPACE_NAME:-}
- GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN=${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN:-}
ports:
- "8080:8080"
volumes:
- web-client-keys:/app/keys
depends_on:
keycloak:
condition: service_healthy
agent-service:
condition: service_started
volumes:
web-client-keys: