Showing preview only (7,156K chars total). Download the full file or copy to clipboard to get everything.
Repository: run-llama/workflows-py
Branch: main
Commit: 7ff532530243
Files: 780
Total size: 6.7 MB
Directory structure:
gitextract_9disofz3/
├── .agents/
│ └── skills/
│ └── llamactl-qa/
│ └── SKILL.md
├── .changeset/
│ ├── README.md
│ └── config.json
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── actions/
│ │ ├── pr-fix-comment/
│ │ │ └── action.yml
│ │ └── setup-publish/
│ │ └── action.yml
│ └── workflows/
│ ├── bump_llama_index_core.yml
│ ├── chart-validate.yaml
│ ├── go-ci.yml
│ ├── lint.yml
│ ├── lockfile.yml
│ ├── publish_changesets.yml
│ ├── publish_openapi.yml
│ ├── sync-docs.yml
│ ├── test.yml
│ └── update_debugger_assets.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .prettierrc
├── .taplo.toml
├── AGENTS.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── architecture-docs/
│ ├── build-api.md
│ ├── control-loop.md
│ ├── core-overview.md
│ ├── overall-architecture.md
│ ├── quick-reference.md
│ └── server-architecture.md
├── charts/
│ ├── AGENTS.md
│ ├── llama-agents/
│ │ ├── .helmignore
│ │ ├── CHANGELOG.md
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── README.md.gotmpl
│ │ ├── crds/
│ │ │ ├── deploy.llamaindex.ai_llamadeployments.yaml
│ │ │ └── deploy.llamaindex.ai_llamadeploymenttemplates.yaml
│ │ ├── package.json
│ │ ├── templates/
│ │ │ ├── _helpers.tpl
│ │ │ ├── _s3proxy.tpl
│ │ │ ├── _secrets.tpl
│ │ │ ├── controlplane-hpa.yaml
│ │ │ ├── controlplane-s3-secret.yaml
│ │ │ ├── deployment.yaml
│ │ │ ├── networkpolicy.yaml
│ │ │ ├── operator-deployment-template.yaml
│ │ │ ├── operator-deployment.yaml
│ │ │ ├── operator-hpa.yaml
│ │ │ ├── rbac.yaml
│ │ │ ├── s3proxy-configmap.yaml
│ │ │ ├── s3proxy-secret.yaml
│ │ │ ├── service.yaml
│ │ │ ├── serviceaccount.yaml
│ │ │ └── servicemonitor.yaml
│ │ ├── tests/
│ │ │ ├── apps_namespace_test.yaml
│ │ │ ├── object_storage_test.yaml
│ │ │ ├── operator_image_tag_env_test.yaml
│ │ │ ├── s3proxy_test.yaml
│ │ │ └── servicemonitor_test.yaml
│ │ └── values.yaml
│ └── llama-agents-crds/
│ ├── .helmignore
│ ├── CHANGELOG.md
│ ├── Chart.yaml
│ ├── README.md
│ ├── files/
│ │ ├── deploy.llamaindex.ai_llamadeployments.yaml
│ │ └── deploy.llamaindex.ai_llamadeploymenttemplates.yaml
│ ├── package.json
│ ├── templates/
│ │ └── crds.yaml
│ └── values.yaml
├── docker/
│ ├── Dockerfile
│ ├── Dockerfile.mitm-test
│ ├── mitm-proxy-test/
│ │ └── entrypoint.sh
│ └── operator.Dockerfile
├── docs/
│ ├── api_docs/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── docs/
│ │ │ ├── api_reference/
│ │ │ │ ├── _static/
│ │ │ │ │ ├── css/
│ │ │ │ │ │ ├── algolia.css
│ │ │ │ │ │ └── custom.css
│ │ │ │ │ └── js/
│ │ │ │ │ ├── algolia.js
│ │ │ │ │ └── leadfeeder.js
│ │ │ │ ├── context.md
│ │ │ │ ├── decorators.md
│ │ │ │ ├── errors.md
│ │ │ │ ├── events.md
│ │ │ │ ├── handler.md
│ │ │ │ ├── index.md
│ │ │ │ ├── resource.md
│ │ │ │ ├── retry_policy.md
│ │ │ │ ├── workflow.md
│ │ │ │ └── workflow_server/
│ │ │ │ ├── client.md
│ │ │ │ ├── models.md
│ │ │ │ └── server.md
│ │ │ ├── css/
│ │ │ │ ├── algolia.css
│ │ │ │ ├── custom.css
│ │ │ │ └── style.css
│ │ │ └── javascript/
│ │ │ └── algolia.js
│ │ ├── mkdocs.yml
│ │ ├── overrides/
│ │ │ ├── main.html
│ │ │ └── partials/
│ │ │ ├── copyright.html
│ │ │ └── search.html
│ │ └── pyproject.toml
│ └── src/
│ ├── components/
│ │ ├── Header.astro
│ │ ├── HomepageFeatures/
│ │ │ ├── index.js
│ │ │ └── styles.module.css
│ │ ├── ProtectedContent.jsx
│ │ ├── ProtectedTabs.jsx
│ │ ├── SiteTitle.astro
│ │ ├── llamaExtract.js
│ │ ├── llamaParse.js
│ │ └── mdx_components.jsx
│ ├── content/
│ │ └── docs/
│ │ └── llamaagents/
│ │ ├── _meta.yml
│ │ ├── cloud/
│ │ │ ├── _meta.yml
│ │ │ ├── agent-data-overview.md
│ │ │ ├── builder.md
│ │ │ └── click-to-deploy.md
│ │ ├── llamactl/
│ │ │ ├── _meta.yml
│ │ │ ├── agent-templates.md
│ │ │ ├── cd-with-github-actions.md
│ │ │ ├── configuration-reference.md
│ │ │ ├── getting-started.md
│ │ │ ├── ui-build.md
│ │ │ ├── ui-hooks.md
│ │ │ └── workflow-api.md
│ │ ├── llamactl-reference/
│ │ │ ├── _meta.yml
│ │ │ ├── commands-auth.md
│ │ │ ├── commands-config.md
│ │ │ ├── commands-deployments.md
│ │ │ ├── commands-environments.md
│ │ │ ├── commands-init.md
│ │ │ ├── commands-organizations.md
│ │ │ ├── commands-pkg.md
│ │ │ ├── commands-projects.md
│ │ │ └── commands-serve.md
│ │ ├── overview.md
│ │ └── workflows/
│ │ ├── _meta.yml
│ │ ├── async_workflows.md
│ │ ├── branches_and_loops.md
│ │ ├── client.md
│ │ ├── concurrent_execution.md
│ │ ├── customizing_entry_exit_points.md
│ │ ├── dbos.md
│ │ ├── deployment.md
│ │ ├── drawing.md
│ │ ├── durable_workflows.md
│ │ ├── human_in_the_loop.md
│ │ ├── index.md
│ │ ├── managing_state.md
│ │ ├── observability.md
│ │ ├── resources.md
│ │ ├── retry_steps.md
│ │ ├── streaming.mdx
│ │ └── unbound_functions.md
│ ├── content.config.ts
│ └── pages/
│ └── index.astro
├── docs.config.mjs
├── examples/
│ ├── README.md
│ ├── agent.ipynb
│ ├── client/
│ │ ├── README.md
│ │ ├── base/
│ │ │ ├── workflow_client.py
│ │ │ └── workflow_server.py
│ │ └── human_in_the_loop/
│ │ ├── workflow_client_hitl.py
│ │ └── workflow_server_hitl.py
│ ├── dbos/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── _replica.py
│ │ ├── docker-compose.yml
│ │ ├── durable_workflow.py
│ │ ├── idle_release_demo.py
│ │ ├── server_quickstart.py
│ │ └── server_replicas.py
│ ├── docker/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── app.py
│ │ └── requirements.txt
│ ├── document_agents/
│ │ └── finance_triage_agent.ipynb
│ ├── document_processing.ipynb
│ ├── durable_workflows.ipynb
│ ├── eval_driven_prompt_refinement.ipynb
│ ├── feature_walkthrough.ipynb
│ ├── k8s-otel/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── Tiltfile
│ │ ├── app.py
│ │ ├── k8s/
│ │ │ ├── app.yaml
│ │ │ ├── jaeger.yaml
│ │ │ ├── kustomization.yaml
│ │ │ ├── namespace.yaml
│ │ │ ├── otel-collector.yaml
│ │ │ ├── phoenix.yaml
│ │ │ └── postgres.yaml
│ │ ├── kind-config.yaml
│ │ └── pyproject.toml
│ ├── observability/
│ │ ├── README.md
│ │ ├── workflow_context_logging.ipynb
│ │ ├── workflows_observability_pt1.ipynb
│ │ ├── workflows_observability_pt2.ipynb
│ │ ├── workflows_observablitiy_arize_phoenix.ipynb
│ │ └── workflows_observablitiy_langfuse.ipynb
│ ├── server/
│ │ ├── README.md
│ │ ├── fastapi_server_example.ipynb
│ │ ├── server.py
│ │ ├── server_example.ipynb
│ │ └── server_example.py
│ ├── state_management_with_vector_databases.ipynb
│ ├── streaming_internal_events.ipynb
│ └── visualization/
│ └── resource_nodes_example.py
├── operator/
│ ├── .gitignore
│ ├── .golangci.yml
│ ├── AGENTS.md
│ ├── CHANGELOG.md
│ ├── Makefile
│ ├── Tiltfile
│ ├── api/
│ │ └── v1/
│ │ ├── groupversion_info.go
│ │ ├── llamadeployment_types.go
│ │ ├── llamadeploymenttemplate_types.go
│ │ └── zz_generated.deepcopy.go
│ ├── cmd/
│ │ └── main.go
│ ├── config/
│ │ ├── crd/
│ │ │ ├── bases/
│ │ │ │ ├── deploy.llamaindex.ai_llamadeployments.yaml
│ │ │ │ └── deploy.llamaindex.ai_llamadeploymenttemplates.yaml
│ │ │ └── kustomizeconfig.yaml
│ │ └── rbac/
│ │ └── role.yaml
│ ├── dev.py
│ ├── go.mod
│ ├── go.sum
│ ├── internal/
│ │ └── controller/
│ │ ├── apps_namespace_test.go
│ │ ├── classify_pod_test.go
│ │ ├── image_tag_unit_test.go
│ │ ├── lifecycle.go
│ │ ├── lifecycle_test.go
│ │ ├── llamadeployment_controller_test.go
│ │ ├── mapping_unit_test.go
│ │ ├── metrics.go
│ │ ├── metrics_test.go
│ │ ├── reconcile.go
│ │ ├── reconcile_test.go
│ │ ├── resources.go
│ │ ├── resources_build_unit_test.go
│ │ ├── resources_security_test.go
│ │ ├── suite_test.go
│ │ └── test_utils_test.go
│ ├── package.json
│ └── tilt/
│ ├── .gitignore
│ ├── env-to-secret.py
│ ├── helm/
│ │ └── values-dev.yaml
│ ├── k8s-manifests/
│ │ ├── .gitkeep
│ │ ├── backup-encryption-secrets.yaml
│ │ ├── kind-gc-cronjob.yaml
│ │ ├── object-storage-secrets.yaml
│ │ ├── prometheus.yaml
│ │ └── seaweedfs.yaml
│ └── scripts/
│ └── install-prometheus.sh
├── package.json
├── packages/
│ ├── llama-agents-agentcore/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents/
│ │ │ └── agentcore/
│ │ │ ├── __init__.py
│ │ │ ├── _runtime_decorator.py
│ │ │ ├── _service.py
│ │ │ ├── deploy.py
│ │ │ ├── entrypoint.py
│ │ │ ├── export.py
│ │ │ └── main.py
│ │ └── tests/
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── test_entrypoint.py
│ │ ├── test_export.py
│ │ └── test_service.py
│ ├── llama-agents-appserver/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── pytest.ini
│ │ ├── src/
│ │ │ ├── llama_agents/
│ │ │ │ └── appserver/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── app.py
│ │ │ │ ├── bootstrap.py
│ │ │ │ ├── build.py
│ │ │ │ ├── configure_logging.py
│ │ │ │ ├── correlation_id.py
│ │ │ │ ├── deployment.py
│ │ │ │ ├── deployment_config_parser.py
│ │ │ │ ├── interrupts.py
│ │ │ │ ├── process_utils.py
│ │ │ │ ├── py.typed
│ │ │ │ ├── routers/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── deployments.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ └── ui_proxy.py
│ │ │ │ ├── settings.py
│ │ │ │ ├── stats.py
│ │ │ │ ├── types.py
│ │ │ │ └── workflow_loader.py
│ │ │ └── llama_deploy/
│ │ │ └── appserver/
│ │ │ └── __init__.py
│ │ └── tests/
│ │ ├── conftest.py
│ │ ├── routers/
│ │ │ ├── test_deployments.py
│ │ │ ├── test_ui_proxy.py
│ │ │ └── test_ui_proxy_ws.py
│ │ ├── test_app.py
│ │ ├── test_app_server_start.py
│ │ ├── test_bootstrap.py
│ │ ├── test_configure_logging.py
│ │ ├── test_deployment.py
│ │ ├── test_environment_loader.py
│ │ ├── test_preflight.py
│ │ ├── test_status.py
│ │ ├── test_workflow_loader.py
│ │ ├── test_workflow_loader_install.py
│ │ ├── test_workflow_loader_load_workflows.py
│ │ └── test_workflow_loader_streaming.py
│ ├── llama-agents-client/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents/
│ │ │ └── client/
│ │ │ ├── __init__.py
│ │ │ ├── client.py
│ │ │ └── protocol/
│ │ │ ├── __init__.py
│ │ │ └── serializable_events.py
│ │ └── tests/
│ │ ├── client/
│ │ │ ├── client_test_workflows.py
│ │ │ └── test_client.py
│ │ └── protocol/
│ │ ├── __init__.py
│ │ └── test_serializable_events.py
│ ├── llama-agents-control-plane/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ ├── llama_agents/
│ │ │ │ └── control_plane/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── backup/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── archive.py
│ │ │ │ │ ├── encryption.py
│ │ │ │ │ └── storage.py
│ │ │ │ ├── build_api/
│ │ │ │ │ ├── build_app.py
│ │ │ │ │ ├── build_auth.py
│ │ │ │ │ ├── build_gc.py
│ │ │ │ │ ├── build_service.py
│ │ │ │ │ └── build_storage.py
│ │ │ │ ├── code_repo/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── git_server.py
│ │ │ │ │ ├── service.py
│ │ │ │ │ └── storage.py
│ │ │ │ ├── git/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── _git_service.py
│ │ │ │ │ ├── _github_auth.py
│ │ │ │ │ ├── github_api_client.py
│ │ │ │ │ └── github_api_schema.py
│ │ │ │ ├── k8s_client.py
│ │ │ │ ├── lifecycle.py
│ │ │ │ ├── log_config.py
│ │ │ │ ├── main.py
│ │ │ │ ├── manage_api/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── backup_service.py
│ │ │ │ │ ├── backup_v1beta1.py
│ │ │ │ │ ├── deployments_service.py
│ │ │ │ │ ├── deployments_v1beta1.py
│ │ │ │ │ └── manage_app.py
│ │ │ │ ├── py.typed
│ │ │ │ ├── settings.py
│ │ │ │ └── storage.py
│ │ │ └── llama_deploy/
│ │ │ └── control_plane/
│ │ │ └── __init__.py
│ │ └── tests/
│ │ ├── backup/
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_archive.py
│ │ │ ├── test_backup_roundtrip.py
│ │ │ ├── test_backup_service.py
│ │ │ ├── test_encryption.py
│ │ │ ├── test_schema.py
│ │ │ └── test_storage.py
│ │ ├── code_repo/
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_git_server.py
│ │ │ └── test_storage.py
│ │ ├── deployments/
│ │ │ └── test_deployments_service.py
│ │ ├── test_build_app.py
│ │ ├── test_build_app_ssrf.py
│ │ ├── test_build_gc.py
│ │ ├── test_endpoints.py
│ │ ├── test_find_deployment_id.py
│ │ ├── test_git_service.py
│ │ ├── test_k8s_client.py
│ │ ├── test_storage.py
│ │ └── test_ui_build_path.py
│ ├── llama-agents-core/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ ├── llama_agents/
│ │ │ │ └── core/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _alias.py
│ │ │ │ ├── _compat.py
│ │ │ │ ├── client/
│ │ │ │ │ ├── manage_client.py
│ │ │ │ │ └── ssl_util.py
│ │ │ │ ├── config.py
│ │ │ │ ├── deployment_config.py
│ │ │ │ ├── git/
│ │ │ │ │ └── git_util.py
│ │ │ │ ├── iter_utils.py
│ │ │ │ ├── path_util.py
│ │ │ │ ├── py.typed
│ │ │ │ ├── schema/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── backups.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── deployments.py
│ │ │ │ │ ├── git_validation.py
│ │ │ │ │ ├── projects.py
│ │ │ │ │ └── public.py
│ │ │ │ ├── server/
│ │ │ │ │ └── manage_api/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── _abstract_deployments_service.py
│ │ │ │ │ ├── _create_deployments_router.py
│ │ │ │ │ └── _exceptions.py
│ │ │ │ └── ui_build.py
│ │ │ └── llama_deploy/
│ │ │ └── core/
│ │ │ └── __init__.py
│ │ └── tests/
│ │ ├── client/
│ │ │ └── test_manage_client.py
│ │ ├── test_deployment_config.py
│ │ ├── test_git_util.py
│ │ ├── test_iter_utils.py
│ │ ├── test_schema.py
│ │ └── test_ssl_util.py
│ ├── llama-agents-dbos/
│ │ ├── ARCHITECTURE.md
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── conftest.py
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents/
│ │ │ └── dbos/
│ │ │ ├── __init__.py
│ │ │ ├── _store/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── postgres/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── migrations/
│ │ │ │ │ ├── 0001_init.sql
│ │ │ │ │ └── __init__.py
│ │ │ │ └── sqlite/
│ │ │ │ ├── __init__.py
│ │ │ │ └── migrations/
│ │ │ │ ├── 0001_init.sql
│ │ │ │ └── __init__.py
│ │ │ ├── executor_lease.py
│ │ │ ├── idle_release.py
│ │ │ ├── journal/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── crud.py
│ │ │ │ ├── lifecycle.py
│ │ │ │ └── task_journal.py
│ │ │ └── runtime.py
│ │ └── tests/
│ │ ├── conftest.py
│ │ ├── fixtures/
│ │ │ ├── __init__.py
│ │ │ ├── replica_server.py
│ │ │ ├── runner.py
│ │ │ ├── runner_common.py
│ │ │ ├── sample_workflows/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── chained.py
│ │ │ │ ├── concurrent_workers.py
│ │ │ │ ├── counter.py
│ │ │ │ ├── hitl.py
│ │ │ │ ├── parallel.py
│ │ │ │ ├── sequential_hitl.py
│ │ │ │ ├── slow_fan_out_hitl.py
│ │ │ │ ├── streaming_interrupt.py
│ │ │ │ ├── streaming_stress.py
│ │ │ │ └── three_step_hitl.py
│ │ │ └── server_runner.py
│ │ ├── test_dbos_cross_process.py
│ │ ├── test_dbos_determinism_subprocess.py
│ │ ├── test_dbos_idle_release.py
│ │ ├── test_dbos_idle_release_e2e.py
│ │ ├── test_dbos_runtime.py
│ │ ├── test_dbos_server_postgres.py
│ │ ├── test_executor_lease.py
│ │ ├── test_journal_double_restart_hang.py
│ │ ├── test_journal_orphan_determinism.py
│ │ ├── test_lifecycle_lock.py
│ │ └── test_task_journal.py
│ ├── llama-agents-integration-tests/
│ │ ├── README.md
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents_integration_tests/
│ │ │ ├── __init__.py
│ │ │ ├── fake_agent_data.py
│ │ │ ├── helpers.py
│ │ │ ├── postgres.py
│ │ │ └── server_test_utils.py
│ │ └── tests/
│ │ ├── conftest.py
│ │ ├── test_agent_data_store.py
│ │ ├── test_context_store.py
│ │ ├── test_error_handling.py
│ │ ├── test_event_streaming.py
│ │ ├── test_human_in_the_loop.py
│ │ ├── test_runtime_matrix.py
│ │ ├── test_server_http_matrix.py
│ │ ├── test_server_store_matrix.py
│ │ └── test_state_store_matrix.py
│ ├── llama-agents-server/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents/
│ │ │ └── server/
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── _api.py
│ │ │ ├── _keyed_lock.py
│ │ │ ├── _lru_cache.py
│ │ │ ├── _pool.py
│ │ │ ├── _runtime/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── event_interceptor.py
│ │ │ │ ├── idle_release_runtime.py
│ │ │ │ ├── persistence_runtime.py
│ │ │ │ └── server_runtime.py
│ │ │ ├── _service.py
│ │ │ ├── _store/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── abstract_workflow_store.py
│ │ │ │ ├── agent_data_client.py
│ │ │ │ ├── agent_data_state_store.py
│ │ │ │ ├── agent_data_store.py
│ │ │ │ ├── memory_workflow_store.py
│ │ │ │ ├── migration_utils.py
│ │ │ │ ├── postgres/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── migrate.py
│ │ │ │ │ └── migrations/
│ │ │ │ │ ├── 0001_init.sql
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── postgres_state_store.py
│ │ │ │ ├── postgres_workflow_store.py
│ │ │ │ └── sqlite/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── migrate.py
│ │ │ │ ├── migrations/
│ │ │ │ │ ├── 0001_init.sql
│ │ │ │ │ ├── 0002_extend_handlers.sql
│ │ │ │ │ ├── 0003_add_idle_since.sql
│ │ │ │ │ ├── 0004_add_ticks.sql
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── sqlite_state_store.py
│ │ │ │ └── sqlite_workflow_store.py
│ │ │ ├── py.typed
│ │ │ ├── server.py
│ │ │ └── static/
│ │ │ └── index.html
│ │ └── tests/
│ │ └── server/
│ │ ├── conftest.py
│ │ ├── server_test_fixtures.py
│ │ ├── test_agent_data_store.py
│ │ ├── test_durable_runtime.py
│ │ ├── test_error_handling.py
│ │ ├── test_event_interceptor.py
│ │ ├── test_handler_serialization.py
│ │ ├── test_idle_release_live_http.py
│ │ ├── test_keyed_lock.py
│ │ ├── test_lru_cache.py
│ │ ├── test_main.py
│ │ ├── test_memory_workflow_store.py
│ │ ├── test_migrations.py
│ │ ├── test_openapi_schema.py
│ │ ├── test_persistent_handler_serialization.py
│ │ ├── test_pool.py
│ │ ├── test_postgres_migrations.py
│ │ ├── test_postgres_state_store.py
│ │ ├── test_postgres_workflow_store.py
│ │ ├── test_runtime_decorators.py
│ │ ├── test_server.py
│ │ ├── test_server_endpoints.py
│ │ ├── test_server_live_http.py
│ │ ├── test_server_runtime.py
│ │ ├── test_sqlite_state_store.py
│ │ ├── test_sqlite_workflow_store.py
│ │ ├── test_sse_heartbeat.py
│ │ ├── test_streaming_replay_memory.py
│ │ ├── test_workflow_service.py
│ │ └── test_workflow_store_events.py
│ ├── llama-index-utils-workflow/
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ └── tests/
│ │ ├── conftest.py
│ │ └── test_drawing.py
│ ├── llama-index-workflows/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ ├── llama_agents/
│ │ │ │ └── workflows/
│ │ │ │ └── __init__.py
│ │ │ └── workflows/
│ │ │ ├── __init__.py
│ │ │ ├── _event_summary.py
│ │ │ ├── client/
│ │ │ │ └── __init__.py
│ │ │ ├── context/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── context.py
│ │ │ │ ├── context_types.py
│ │ │ │ ├── external_context.py
│ │ │ │ ├── internal_context.py
│ │ │ │ ├── pre_context.py
│ │ │ │ ├── py.typed
│ │ │ │ ├── serializers.py
│ │ │ │ ├── state_store.py
│ │ │ │ └── utils.py
│ │ │ ├── decorators.py
│ │ │ ├── errors.py
│ │ │ ├── events.py
│ │ │ ├── handler.py
│ │ │ ├── plugins/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _context.py
│ │ │ │ └── basic.py
│ │ │ ├── protocol/
│ │ │ │ └── __init__.py
│ │ │ ├── py.typed
│ │ │ ├── representation/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── build.py
│ │ │ │ ├── types.py
│ │ │ │ └── validate.py
│ │ │ ├── resource.py
│ │ │ ├── retry_policy.py
│ │ │ ├── runtime/
│ │ │ │ ├── control_loop.py
│ │ │ │ ├── runtime_decorators.py
│ │ │ │ ├── types/
│ │ │ │ │ ├── commands.py
│ │ │ │ │ ├── internal_state.py
│ │ │ │ │ ├── named_task.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── results.py
│ │ │ │ │ ├── step_function.py
│ │ │ │ │ └── ticks.py
│ │ │ │ └── verbose.py
│ │ │ ├── server/
│ │ │ │ ├── __init__.py
│ │ │ │ └── sqlite/
│ │ │ │ └── __init__.py
│ │ │ ├── testing/
│ │ │ │ ├── __init__.py
│ │ │ │ └── runner.py
│ │ │ ├── types.py
│ │ │ ├── utils.py
│ │ │ └── workflow.py
│ │ └── tests/
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── context/
│ │ │ ├── __init__.py
│ │ │ ├── test_context.py
│ │ │ ├── test_context_preservation.py
│ │ │ ├── test_serializers.py
│ │ │ └── test_utils.py
│ │ ├── plugins/
│ │ │ └── __init__.py
│ │ ├── runtime/
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_control_loop.py
│ │ │ ├── test_control_loop_transformations.py
│ │ │ ├── test_named_task.py
│ │ │ ├── test_runtime_lifecycle.py
│ │ │ ├── test_state.py
│ │ │ ├── test_tick_serialization.py
│ │ │ └── test_workflow_set_and_tracking.py
│ │ ├── test_annotation_resolution.py
│ │ ├── test_catch_error.py
│ │ ├── test_child_state_inheritance.py
│ │ ├── test_decorator.py
│ │ ├── test_event.py
│ │ ├── test_event_summary.py
│ │ ├── test_graph_validation.py
│ │ ├── test_handler.py
│ │ ├── test_llama_agents_alias.py
│ │ ├── test_nanoid.py
│ │ ├── test_representation_utils.py
│ │ ├── test_resources.py
│ │ ├── test_retry_policy.py
│ │ ├── test_retry_tenacity_conformance.py
│ │ ├── test_runtime_integration.py
│ │ ├── test_spans.py
│ │ ├── test_state_manager.py
│ │ ├── test_streaming.py
│ │ ├── test_testing_utils.py
│ │ ├── test_utils.py
│ │ ├── test_verbose_decorator.py
│ │ ├── test_workflow.py
│ │ ├── test_workflow_internal_events.py
│ │ ├── test_workflow_naming.py
│ │ ├── test_workflow_postponed_annotations.py
│ │ └── test_workflow_typed_state.py
│ └── llamactl/
│ ├── AGENTS.md
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── package.json
│ ├── pyproject.toml
│ ├── src/
│ │ ├── llama_agents/
│ │ │ └── cli/
│ │ │ ├── __init__.py
│ │ │ ├── app.py
│ │ │ ├── apply_yaml.py
│ │ │ ├── auth/
│ │ │ │ └── client.py
│ │ │ ├── client.py
│ │ │ ├── commands/
│ │ │ │ ├── agentcore.py
│ │ │ │ ├── aliased_group.py
│ │ │ │ ├── auth.py
│ │ │ │ ├── completion.py
│ │ │ │ ├── config.py
│ │ │ │ ├── deployment.py
│ │ │ │ ├── dev.py
│ │ │ │ ├── environments.py
│ │ │ │ ├── init.py
│ │ │ │ ├── organizations.py
│ │ │ │ ├── pkg.py
│ │ │ │ ├── projects.py
│ │ │ │ └── serve.py
│ │ │ ├── config/
│ │ │ │ ├── _config.py
│ │ │ │ ├── _migrations.py
│ │ │ │ ├── auth_service.py
│ │ │ │ ├── env_service.py
│ │ │ │ ├── migrations/
│ │ │ │ │ ├── 0001_init.sql
│ │ │ │ │ ├── 0002_add_auth_fields.sql
│ │ │ │ │ └── __init__.py
│ │ │ │ └── schema.py
│ │ │ ├── debug.py
│ │ │ ├── display.py
│ │ │ ├── env.py
│ │ │ ├── env_settings.py
│ │ │ ├── interactive.py
│ │ │ ├── local_context.py
│ │ │ ├── log_format.py
│ │ │ ├── options.py
│ │ │ ├── output.py
│ │ │ ├── param_types.py
│ │ │ ├── paths.py
│ │ │ ├── pkg/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── defaults.py
│ │ │ │ ├── options.py
│ │ │ │ └── utils.py
│ │ │ ├── py.typed
│ │ │ ├── render.py
│ │ │ ├── scaffold/
│ │ │ │ ├── .codex/
│ │ │ │ │ └── config.toml
│ │ │ │ ├── .cursor/
│ │ │ │ │ └── mcp.json
│ │ │ │ ├── .mcp.json
│ │ │ │ └── AGENTS.md
│ │ │ ├── styles.py
│ │ │ ├── templates/
│ │ │ │ └── agentcore_entrypoint.py.template
│ │ │ ├── templates.py
│ │ │ ├── utils/
│ │ │ │ ├── capabilities.py
│ │ │ │ ├── env_inject.py
│ │ │ │ ├── git_push.py
│ │ │ │ ├── redact.py
│ │ │ │ ├── retry.py
│ │ │ │ └── version.py
│ │ │ └── yaml_template.py
│ │ └── llama_deploy/
│ │ └── cli/
│ │ └── __init__.py
│ └── tests/
│ ├── conftest.py
│ ├── test_apply_yaml.py
│ ├── test_auth_cli.py
│ ├── test_auth_inject.py
│ ├── test_auth_login.py
│ ├── test_auth_validate.py
│ ├── test_cli_imports.py
│ ├── test_cli_options.py
│ ├── test_client_ssl_integration.py
│ ├── test_commands_core.py
│ ├── test_completion_commands.py
│ ├── test_config.py
│ ├── test_config_cli.py
│ ├── test_config_extras.py
│ ├── test_deployment_update_refs.py
│ ├── test_deployments_apply_cmd.py
│ ├── test_deployments_editor_cmd.py
│ ├── test_deployments_get_output.py
│ ├── test_deployments_logs.py
│ ├── test_deployments_template_cmd.py
│ ├── test_deployments_update.py
│ ├── test_dev_commands.py
│ ├── test_display.py
│ ├── test_env_and_auth_services.py
│ ├── test_env_settings.py
│ ├── test_environments_cli.py
│ ├── test_git_push.py
│ ├── test_init_command.py
│ ├── test_interactive.py
│ ├── test_local_context.py
│ ├── test_log_format.py
│ ├── test_migrations_concurrency.py
│ ├── test_organizations_cli.py
│ ├── test_param_types.py
│ ├── test_pkg.py
│ ├── test_projects_cli.py
│ ├── test_redact.py
│ ├── test_render.py
│ ├── test_retry.py
│ ├── test_serve_llama_cloud.py
│ ├── test_serve_summary.py
│ ├── test_serve_without_git.py
│ ├── test_session_utils.py
│ └── test_yaml_template.py
├── pnpm-workspace.yaml
├── pyproject.toml
├── scripts/
│ ├── process_manifests.py
│ └── sync-docs-to-developer-hub.sh
├── src/
│ └── dev_cli/
│ ├── __init__.py
│ ├── changesets.py
│ ├── cli.py
│ ├── commands/
│ │ ├── __init__.py
│ │ ├── changesets_cmd.py
│ │ ├── publish_cmd.py
│ │ ├── pytest_cmd.py
│ │ └── skills_cmd.py
│ ├── gha.py
│ ├── git_utils.py
│ ├── index_html.py
│ └── versioning.py
└── tests/
└── dev_cli/
├── conftest.py
├── test_changesets.py
├── test_cli_misc.py
└── test_pytest_cmd.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .agents/skills/llamactl-qa/SKILL.md
================================================
---
name: llamactl-qa
description: Plan and run a design-QA / "taste test" of llamactl changes against a real backend. Cooperatively builds a small matrix of cases worth eyeballing, runs them against a chosen backend (test environment by default, local kind+tilt for new API contract changes), and writes a design-review report to `thoughts/shared/qa/`. Use this for changes to `llamactl` commands, output formats, auth, or control-plane API contracts. For UI/template smoke tests, use `llamactl_browser_test` instead.
---
# llamactl CLI QA
A design QA, not an integration test. The goal is to put the actual rendered output in front of a human reviewer so they can judge whether the design is right — alignment, naming, key ordering, error wording, what's noisy, what's missing. The LLM's job is to set up well-chosen cases and call out what looks off; the human's job is to read the outputs and decide.
Two halves. First, a planning pass that turns "I changed X" into a small, sign-off-able matrix of cases worth running. Second, an execution pass that runs them and writes a report whose body is mostly verbatim output plus design-review notes.
Every row in the matrix is there because we agreed it covers a real risk or design question in the diff.
## Mode flags
Parse these from the user's invocation before doing anything else:
- `--auto`, `auto`, `fully auto`, `non-chatty`, or `-f` means run autonomously. Pick the backend, draft the matrix internally, execute it, write the report, and return only the report pointer plus any blocking issue. Do not ask for backend selection or matrix confirmation.
- In auto mode, prefer the least risky backend that still exercises the changed surface. Use offline rows for parse/render/local-file behavior, local kind+tilt for new control-plane contracts, and a test environment for read-only checks or safe writes. **Never use production for mutating QA.** Switch to a test environment first.
- Auto mode does not relax mutation rules. When creating deployments for QA (e.g., to test edit or delete flows), always create your own throwaway deployments rather than editing existing ones that might be important. Clean them up at the end of the run.
### What this is NOT
- **Not an automated integration test.** No `jq has(...)` shape assertions, no `python -c "assert ..."`. If a row reads as "the command works", drop it; if it reads as "let's see the output and judge it", keep it. Real integration tests are a separate task (authoring real pytest cases against the API), not this one.
- **Not exhaustive coverage.** 4–8 well-chosen rows. The point is taste, not a regression matrix.
- **Not pass/fail.** The report's job is "here's what the surface actually looks like", not "all green".
llamactl is churning right now (multi-slice rework: output modes, apply/delete, template/apply-loop). Treat this skill as a living reference. When a run teaches you something about llamactl that isn't in here, edit the skill before closing the task. See "Self-update" at the bottom.
## When to use
- Changes to `llamactl` commands (new flags, new output modes, command splits, behavior changes).
- Changes to control-plane API contracts that llamactl consumes.
- Changes to auth / profile / project resolution.
Skip when the change is fully covered by pytest, or when the failure mode is in the UI (use `llamactl_browser_test`).
## Pick a backend
1. **Test environment / test project.** Default for QA that creates or mutates deployments. Use a non-production environment or a dedicated test project so throwaway deployments don't pollute real workspaces. **Never run mutating QA commands against production.** When creating test deployments (to later edit/delete them as part of the QA), create them yourself rather than editing existing deployments that may be important. Pin every command with `--project <test-project-id>` so an active-profile slip can't write into the wrong project.
2. **Local kind + tilt.** When the change is a new API contract (new endpoint, new field, new behavior on the control plane) and you need to exercise it against a control plane that actually has the change. `uv run operator/dev.py up`. See `AGENTS.md` and `operator/AGENTS.md` for setup. Local mode runs with no auth: the `http://localhost:8011` env is preconfigured; switch to it with `llamactl environments use http://localhost:8011` (arg is the API URL, not a name) and a `default` profile is created automatically. No tokens, no `auth login`. Before drafting the matrix, list existing deployments with `kubectl get llamadeployments -A` — there's often something already in the cluster from prior work that you can target with `--project <id>`, saving the cost of a fresh `deployments create`.
3. **Offline only.** For changes that only affect local rendering (template output, help text, error formatting), no backend is needed at all. Run commands that don't hit the API (e.g., `deployments template`, `--help`, non-interactive error paths).
Ask the user which backend before drafting the matrix. The answer changes which rows are realistic. Skip this in auto mode and choose from the rules above.
## Test project scaffolds
Some QA needs a real on-disk project (anything that reads `cwd` — e.g., `deployments template`, `serve`, `apply -f` once it lands, anything that consults `pyproject.toml`'s `[tool.llamadeploy]` block, the `.env`, or git state). Use `llamactl init` into a temp dir rather than hand-rolling files or reusing your dev tree.
```bash
WORK=$(mktemp -d -t llamactl-qa.XXXXXX)
uv run llamactl init --no-interactive --template basic --dir "$WORK/app"
```
What you get:
- A scaffolded project with `pyproject.toml` ([tool.llamadeploy] block), `.env.template`, `src/`, `tests/`.
- An initial git commit (`init` runs `git init` + commit). `is_git_repo` is true; `git_ref` is `main`; no remote.
- No `.env` (only `.env.template`). Copy/edit if a row needs `available_secrets` populated: `cp "$WORK/app/.env.template" "$WORK/app/.env"` then append e.g. `OPENAI_API_KEY=test`.
- Available templates: `basic-ui`, `showcase`, `document-qa`, `extraction-review`, `classify-extract-sec`, `extract-reconcile-invoice`, `basic`, `document_parsing`, `human_in_the_loop`, `invoice_extraction`, `rag`, `web_scraping`. `basic` is fastest and has no required secrets — use it unless the row needs a template that lists required secrets.
For rows that need a non-git directory: `mktemp -d` and don't init. For rows that need a remote: `git -C "$WORK/app" remote add origin https://github.com/<you>/qa.git`. Don't push.
Run commands from inside the project: `(cd "$WORK/app" && llamactl deployments template)`. Don't `cd` in the parent shell — keeps rows independent. Capture full paths in the report so the reader can recreate.
Cleanup is `rm -rf "$WORK"` at the end of the run. Mention it in the report's footer.
If a row needs to **commit** changes (e.g., to test git-state-dependent behavior), do it inside the temp tree with a fresh `user.email` / `user.name` so the host's git config doesn't bleed in:
```bash
git -C "$WORK/app" -c user.email=qa@example.com -c user.name=qa commit -am "<msg>"
```
Don't try to make this temp project deployable to a real backend in the same run as offline QA. If a row needs a server-side deployment to edit or inspect, create a throwaway deployment yourself (e.g., `create -f` with a minimal YAML + `--no-push`) rather than editing an existing deployment that might be important. Clean it up with `deployments delete` at the end of the run.
## llamactl mental model
The bits that matter when designing a matrix.
**Scoping hierarchy**: environments → profiles → organizations → projects → deployments. An environment is a control-plane URL (e.g., `http://localhost:8011` for local). Each environment can have one or more profiles (authenticated identities). Each profile has an active organization, and each organization contains projects. Deployments live inside projects. `llamactl environments get` shows environments. `llamactl auth get` shows profiles in the active environment. `llamactl environments use <url>` changes environment. `llamactl projects use [id]` changes the active project within the current profile.
A profile is `(env, oauth tokens, active org, active project)`. `--project <id>` overrides the profile's active project for one call. Before running any QA, check `llamactl environments get` and `llamactl auth get` to confirm you're in the right environment and project — don't assume from a previous session. There are multiple environments with deployments available for testing; use a non-production one for mutating operations.
Read commands accept `-o text|json|yaml`. Text is human-facing; json/yaml are assertable. Prefer json for QA — exact-match assertions catch field-rename regressions text formatting hides.
Read commands (`deployments get/list/history/logs`, `auth get`, `environments get`) do not need `--no-interactive` when their argument is supplied. The flag is a no-op there post-Slice-A.5 and slated to be removed in the parent plan's Phase 3. Don't pad commands with it. Write/select commands (`deployments delete`, `deployments edit`, `deployments rollback` without `--git-sha`) still branch on the interactive flag — pass `--no-interactive` for those if you don't want a prompt, or supply every required arg.
The command surface is moving. Run `--help` on any command you're testing before assuming flag names; don't go from memory.
## Cooperative planning
Don't run anything until the user has signed off on the matrix. Skip confirmation in auto mode.
1. Read the diff. `git diff <base>...HEAD --stat` and targeted reads on the command files. Identify the behavior surface: which subcommands, flags, output formats, endpoints changed.
2. List design questions, not features. One line each. The right question reads as "would the user be happy seeing this output?", not "does the command run". Examples: "Does the `spec:` / `status:` split actually feel right when you eyeball `get -o yaml`?" "Does the plain-table list output stay readable for a deployment whose repo URL is 80 chars?" "Does the no-secrets case render as cleanly as the with-secrets case?"
3. Map questions to a small matrix. One row per case. 4–8 rows is usually right; 12 means you're testing features.
4. Present the matrix inline. Wait for the user to keep, cut, or add rows. In auto mode, keep this matrix internal and run it.
Matrix row format. Note "Look for" replaces a pass-fail "Expect" — the reviewer is meant to read the output and judge against these prompts, not check a list of facts.
| # | Command | Backend | Look for | Covers |
|---|---|---|---|---|
| 1 | `deployments get my-app -o yaml --project <test>` | test-env | spec/status split reads cleanly; field ordering; null vs omitted; PAT presentation | new display model shape |
| 2 | `deployments get --project <test>` | test-env | column choices, alignment, behavior with long repo URLs | plain-table list mode |
| 3 | `deployments get my-app --project <other-test>` vs default | test-env | does the override actually retarget the project | `--project` override |
If a row's "Look for" reads as "the command works", drop it. If it reads as "I'd want to eyeball this", keep it.
## Execution
Run rows top to bottom. For each, the goal is to capture the actual output the human reviewer will judge.
Capture:
- The exact command (including inline env vars).
- Exit code and elapsed time (latency is part of UX).
- **Verbatim stdout and stderr.** Don't trim, don't summarize, don't paraphrase. The report's body is the output, not your verdict on it. Truncation only when output is genuinely huge (200+ line log dumps); keep head, tail, and a `... <N> lines elided ...` marker.
- Your design-review observations as one-line "Notes" — what a thoughtful reviewer would point at. "REPO column is 67 chars wide on a 100-char terminal — leaves no room for two repos to align." "`status.warning: null` reads cleanly; the omitted vs explicit-null asymmetry is visible." "Why are both `display_name` and `name` here when they're equal?"
What NOT to do:
- **No `jq has(...)` / `python -c "assert ..."` style assertions.** The report is for human judgment, not pass/fail. If you find yourself asserting a key exists, you're in the wrong skill — that's pytest territory.
- **Don't pre-judge.** Notes flag things to look at; the reader judges. "Suspicious: `personal_access_token` shown as `********` even when the underlying secret name is also `GITHUB_PAT`" is fine. "Wrong: PAT should be unmasked" is not — that's the reader's call.
- **Don't paper over surprises.** If a row produces a stack trace or an unexpected shape, capture it verbatim and call it out in Highlights. Re-running with different flags to make the symptom go away is forbidden; that's the QA finding.
For comparison rows (`--project` override, `list` vs `get`, text vs json, with-data vs empty), capture both calls in the same row, side by side. The reader should be able to eyeball the difference without scrolling.
Long-running commands (`serve`, `logs --follow`) go in the background with `run_in_background: true`. Stop them before moving on.
### Storing raw transcripts
Don't dump `.log` / `.out` / `.err` files into `thoughts/shared/qa/`. The report is the artifact. Embed verbatim outputs in the report with fenced blocks.
If a single output is genuinely too large to embed (200+ lines of logs, many-deployment dumps), put it in `thoughts/shared/qa/raw/<date>-<scope>/<row-id>.txt` and link it from the report row. Default to embedding; the subdir is the exception, not the rule.
## Report
The report is a design and interaction review surface, not a test result. The reader scrolls through it and forms their own opinion: are columns aligned, is naming consistent, does this command feel right, is the error message clear. Your job is to put the evidence in front of them and flag the design questions worth their attention.
Write to `thoughts/shared/qa/<date>-llamactl-<scope>.md`. Post a one-or-two-sentence pointer inline plus the file link. The user reads the file, not your inline summary.
Template:
````
# llamactl QA: <one-line scope>
Backend: <test environment | local kind | offline | other>
Profile: <name> (<env URL>)
Project: <test project id/name>
Branch: <branch> Commit: <short sha>
## Design questions for the reviewer
<3–6 bullets. These are the things you want the reader's eyes on. Not "all rows passed". Examples:
- "Is `spec:` + `status:` the right split, or is the extra indent annoying?"
- "REPO column gets pushed off-screen when the URL isn't a github short. Do we want a `--wide` mode or terminal-aware wrapping?"
- "`auth get` text mode shows ACTIVE as yes/no — is that legible enough?"
- "When secrets are unset, the JSON spec block is just `{display_name, repo_url, deployment_file_path, suspended: false}`. Is `suspended: false` worth showing on a fresh deploy or is it noise?"
Lean open-ended. If a question has an obvious answer, it doesn't belong here.>
## Rows
### 1. <one-line description, e.g. "deployments get my-app -o yaml">
Command:
```
$ <exact command>
```
Output (exit=<n>, <elapsed>):
```
<verbatim stdout>
```
<if stderr non-empty:>
Stderr:
```
<verbatim stderr>
```
Notes:
- <one-line observation a thoughtful reviewer would make>
- <another, if there's something else worth flagging>
### 2. <comparison row>
Command A:
```
$ <command 1>
```
Output A (exit=<n>):
```
<output>
```
Command B:
```
$ <command 2>
```
Output B (exit=<n>):
```
<output>
```
Notes:
- <what the side-by-side reveals>
... same shape for remaining rows ...
## Followups
- <design questions that need a human answer>
- <regressions or design choices that should turn into issues / changes>
- <items the matrix didn't cover but the reader should know about>
````
Rules:
- **Show, don't tell.** "Output shows a spec block with editable fields" → no. Paste the YAML. The reader can see the shape.
- **Keep verbatim formatting.** Tables in fenced blocks preserve column rendering. Don't reformat or "clean up" output.
- **Comparison rows live in one section.** Two adjacent fenced blocks labeled clearly beat two separate rows.
- **Notes are observations, not verdicts.** Point at what's interesting; let the reader judge.
- **No celebration.** If everything looks reasonable, the report just looks reasonable. Don't add "all green" framing.
The inline chat reply is one or two sentences pointing at the file. Don't restate the report.
## Common gotchas
- Stale profile. `llamactl auth get` first, every session. A profile pointing at last week's env produces 401s that look like a code bug.
- Active project drift. A test that "works on my machine" can fail elsewhere because the active project differs. Pin every row with `--project`.
- Non-test project mutation. If you mutate without `--project`, the active profile decides where it lands. Always pin write commands.
- Wrong environment for mutations. `llamactl environments get` shows which environment is active. Never run create/edit/delete against production — switch to a test environment first. The active environment persists across sessions, so always verify before running mutating commands.
- Editing existing deployments. Don't edit deployments you didn't create — they may be someone's real work. Create throwaway deployments for QA and delete them when done.
- TUI/prompt risk on write commands. `deployments delete/edit/rollback` and `create` will prompt when interactive. For QA, supply every required arg or pass `--no-interactive`. Read commands (`get`, `logs`, `history`, `auth get`, `environments get`) don't need the flag.
- `tee` ate a row of a multi-line table once during a run. Use shell `>` redirect for QA captures, not `tee`, when you need every line preserved.
- `serve` vs tilt. `llamactl serve` runs the appserver locally with no kubernetes. Tilt runs the full cloud stack in kind. Different scopes; pick one.
- Don't leak IDs. Deployment and org IDs are fine in your terminal and in `thoughts/`, not fine in a public PR description. Strip or alias them in anything that might leave the repo.
- Worktree venv mismatch. When QAing a worktree branch, the parent shell's `VIRTUAL_ENV` often points at the main repo's `.venv` (the worktree-specific one shadows it). `uv run` then warns and ignores the worktree env, silently using a stale binary. Either `unset VIRTUAL_ENV` once at the top of your session, or invoke the worktree's binary directly (`.venv/bin/llamactl`) for QA captures. The worktree binary is the one with the diff under test.
## Self-update
llamactl's command surface is moving. When a run teaches you a fact this skill doesn't have, edit it.
Triggers for an edit:
- A flag name, command path, or output shape was different from what the skill implied.
- A failure mode showed up that isn't in "Common gotchas".
- A backend setup step (especially local tilt) needed something the skill didn't say.
What to add:
- New gotchas go to "Common gotchas" as one-line entries.
- New mental-model facts go to "llamactl mental model".
- Tilt or backend changes go to "Pick a backend".
Edit the file at `.agents/skills/llamactl-qa/SKILL.md` (the `.claude/skills/` entry is a symlink into here, maintained by `uv run dev sync-skills`). Keep the voice terse; don't pad. If you're unsure whether the fact is durable or just incidental to one run, leave it out. False additions are worse than missing ones.
================================================
FILE: .changeset/README.md
================================================
# Changesets
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
================================================
FILE: .changeset/config.json
================================================
{
"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [],
"access": "restricted",
"baseBranch": "main",
"updateInternalDependencies": "patch"
}
================================================
FILE: .dockerignore
================================================
.git
.venv
__pycache__
node_modules
.mypy_cache
.pytest_cache
.ruff_cache
*.egg-info
docs
.claude
.worktree
thoughts
architecture-docs
examples/dbos
examples/observability
lib
openapi.json
*.ipynb
**/.mypy_cache
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/actions/pr-fix-comment/action.yml
================================================
# SPDX-License-Identifier: MIT
name: "Auto-Fix PR Manager"
description: "Creates fix PRs and manages PR comments for auto-fix workflows"
inputs:
app-id:
description: "GitHub App ID for authentication"
required: false
default: ""
private-key:
description: "GitHub App private key for authentication"
required: false
default: ""
add-paths:
description: "Paths to add to the fix PR (newline-separated)"
required: true
check-name:
description: "Human-readable name for the check (e.g., 'Frontend Lint', 'Backend Lint', 'Frontend SDK')"
required: true
fix-command:
description: "Command to run to fix issues (shown in comment, e.g., 'pnpm lint:fix')"
required: true
fix-branch-name:
description: "Branch name for the fix PR. Defaults to 'chore/fix-{check-name-slug}-{pr-number}'"
required: false
commit-message:
description: "Commit message for the fix PR. Defaults to 'chore: auto-fix {check-name} issues'"
required: false
pr-title:
description: "Title for the fix PR. Defaults to 'chore: fix {check-name} for #{pr-number}'"
required: false
pr-body:
description: "Body for the fix PR (markdown). Auto-generated if not provided."
required: false
comment-marker:
description: "Unique marker ID to identify comments. Defaults to slugified check-name."
required: false
warning-title:
description: "Title for the warning comment. Defaults to '{check-name} Fix Required'"
required: false
warning-body:
description: "Body text for the warning comment. Auto-generated if not provided."
required: false
success-title:
description: "Title for the success comment. Defaults to '{check-name} Check Passed'"
required: false
success-body:
description: "Body text for the success comment. Auto-generated if not provided."
required: false
outputs:
fix-pr-number:
description: "PR number of the fix PR (if created)"
value: ${{ steps.create-pr.outputs.pull-request-number }}
fix-pr-url:
description: "URL of the fix PR (if created)"
value: ${{ steps.create-pr.outputs.pull-request-url }}
comment-id:
description: "ID of the comment that was created or updated"
value: ${{ steps.find-comment.outputs.comment_id }}
action-taken:
description: "What action was taken: 'created', 'updated-warning', 'updated-success', or 'none'"
value: ${{ steps.manage-comment.outputs.action_taken }}
runs:
using: "composite"
steps:
- name: Check if PR context
id: context
shell: bash
run: |
if [ -n "${{ github.event.pull_request.number }}" ]; then
echo "is_pr=true" >> $GITHUB_OUTPUT
else
echo "is_pr=false" >> $GITHUB_OUTPUT
echo "Not a PR context - skipping fix PR creation"
fi
- name: Check authentication inputs
id: auth-check
if: steps.context.outputs.is_pr == 'true'
shell: bash
env:
APP_ID: ${{ inputs.app-id }}
PRIVATE_KEY: ${{ inputs.private-key }}
run: |
if [ -n "$APP_ID" ] && [ -n "$PRIVATE_KEY" ]; then
echo "has_auth=true" >> $GITHUB_OUTPUT
else
echo "has_auth=false" >> $GITHUB_OUTPUT
echo "Skipping auto-fix: authentication inputs not provided (likely a fork PR)"
fi
- name: Generate GitHub App token
id: app-token
if: steps.context.outputs.is_pr == 'true' && steps.auth-check.outputs.has_auth == 'true'
uses: actions/create-github-app-token@v1
with:
app-id: ${{ inputs.app-id }}
private-key: ${{ inputs.private-key }}
owner: ${{ github.repository_owner }}
- name: Compute defaults
id: defaults
if: steps.context.outputs.is_pr == 'true' && steps.auth-check.outputs.has_auth == 'true'
shell: bash
env:
CHECK_NAME: ${{ inputs.check-name }}
FIX_COMMAND: ${{ inputs.fix-command }}
PR_NUMBER: ${{ github.event.pull_request.number }}
ADD_PATHS: ${{ inputs.add-paths }}
INPUT_FIX_BRANCH: ${{ inputs.fix-branch-name }}
INPUT_COMMIT_MSG: ${{ inputs.commit-message }}
INPUT_PR_TITLE: ${{ inputs.pr-title }}
INPUT_PR_BODY: ${{ inputs.pr-body }}
INPUT_COMMENT_MARKER: ${{ inputs.comment-marker }}
INPUT_WARNING_TITLE: ${{ inputs.warning-title }}
INPUT_WARNING_BODY: ${{ inputs.warning-body }}
INPUT_SUCCESS_TITLE: ${{ inputs.success-title }}
INPUT_SUCCESS_BODY: ${{ inputs.success-body }}
run: |
# Create a slug from the check name (e.g., "Frontend Lint" -> "frontend-lint")
CHECK_SLUG=$(echo "$CHECK_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//' | sed 's/-$//')
# Set defaults
FIX_BRANCH="${INPUT_FIX_BRANCH:-chore/fix-${CHECK_SLUG}-${PR_NUMBER}}"
COMMIT_MSG="${INPUT_COMMIT_MSG:-chore: auto-fix ${CHECK_NAME} issues}"
PR_TITLE="${INPUT_PR_TITLE:-chore: fix ${CHECK_NAME} for #${PR_NUMBER}}"
COMMENT_MARKER="${INPUT_COMMENT_MARKER:-${CHECK_SLUG}}"
WARNING_TITLE="${INPUT_WARNING_TITLE:-${CHECK_NAME} Fix Required}"
SUCCESS_TITLE="${INPUT_SUCCESS_TITLE:-${CHECK_NAME} Check Passed}"
SUCCESS_BODY="${INPUT_SUCCESS_BODY:-All ${CHECK_NAME} checks passed.}"
WARNING_BODY="${INPUT_WARNING_BODY:-Issues were detected that can be auto-fixed.
**To fix locally:** Run \`${FIX_COMMAND}\` before committing.}"
# Generate PR body if not provided
if [ -z "$INPUT_PR_BODY" ]; then
PR_BODY="## Summary
Auto-fix ${CHECK_NAME} issues.
This PR was automatically created because issues were detected that can be auto-fixed.
## Changed files
- \`${ADD_PATHS}\`
## How to avoid this
Run \`${FIX_COMMAND}\` before committing.
---
*Auto-generated for #${PR_NUMBER}*"
else
PR_BODY="$INPUT_PR_BODY"
fi
# Write outputs using heredocs for multiline content
{
echo "fix-branch=${FIX_BRANCH}"
echo "commit-message=${COMMIT_MSG}"
echo "pr-title=${PR_TITLE}"
echo "comment-marker=${COMMENT_MARKER}"
echo "warning-title=${WARNING_TITLE}"
echo "success-title=${SUCCESS_TITLE}"
} >> $GITHUB_OUTPUT
# Use heredocs for multiline outputs
{
echo "pr-body<<EOFPRBODY"
echo "$PR_BODY"
echo "EOFPRBODY"
} >> $GITHUB_OUTPUT
{
echo "warning-body<<EOFWARN"
echo "$WARNING_BODY"
echo "EOFWARN"
} >> $GITHUB_OUTPUT
{
echo "success-body<<EOFSUCCESS"
echo "$SUCCESS_BODY"
echo "EOFSUCCESS"
} >> $GITHUB_OUTPUT
- name: Create PR with changes
id: create-pr
if: steps.context.outputs.is_pr == 'true' && steps.auth-check.outputs.has_auth == 'true'
uses: peter-evans/create-pull-request@v6
with:
token: ${{ steps.app-token.outputs.token }}
commit-message: ${{ steps.defaults.outputs.commit-message }}
title: ${{ steps.defaults.outputs.pr-title }}
body: ${{ steps.defaults.outputs.pr-body }}
branch: ${{ steps.defaults.outputs.fix-branch }}
base: ${{ github.head_ref }}
add-paths: ${{ inputs.add-paths }}
labels: |
chore
automated pr
delete-branch: true
- name: Find existing bot comment
id: find-comment
if: steps.context.outputs.is_pr == 'true' && steps.auth-check.outputs.has_auth == 'true'
shell: bash
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
COMMENT_MARKER: ${{ steps.defaults.outputs.comment-marker }}
run: |
# Use a unique HTML comment marker to identify our comments
# This is much more reliable than searching for text content
MARKER="<!-- pr-fix-comment:${COMMENT_MARKER} -->"
# Find existing comment by searching for the exact marker
COMMENT_ID=$(gh api "repos/${{ github.repository }}/issues/${PR_NUMBER}/comments" \
--jq ".[] | select(.body | startswith(\"${MARKER}\")) | .id" | head -1)
echo "comment_id=$COMMENT_ID" >> $GITHUB_OUTPUT
echo "marker=$MARKER" >> $GITHUB_OUTPUT
- name: Close fix PR if no longer needed
if: steps.context.outputs.is_pr == 'true' && steps.auth-check.outputs.has_auth == 'true' && !steps.create-pr.outputs.pull-request-number
shell: bash
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
FIX_PR_BRANCH: ${{ steps.defaults.outputs.fix-branch }}
run: |
FIX_PR=$(gh pr list --head "${FIX_PR_BRANCH}" --json number --jq '.[0].number')
if [ -n "$FIX_PR" ]; then
echo "Closing fix PR #$FIX_PR as changes are no longer needed"
gh pr close "$FIX_PR" --delete-branch --comment "Closing this PR as the issue is now resolved in the original PR."
fi
- name: Manage PR comment
id: manage-comment
if: steps.context.outputs.is_pr == 'true' && steps.auth-check.outputs.has_auth == 'true'
shell: bash
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
EXISTING_COMMENT_ID: ${{ steps.find-comment.outputs.comment_id }}
COMMENT_MARKER: ${{ steps.find-comment.outputs.marker }}
FIX_PR_CREATED: ${{ steps.create-pr.outputs.pull-request-number != '' }}
FIX_PR_URL: ${{ steps.create-pr.outputs.pull-request-url }}
WARNING_TITLE: ${{ steps.defaults.outputs.warning-title }}
WARNING_BODY: ${{ steps.defaults.outputs.warning-body }}
SUCCESS_TITLE: ${{ steps.defaults.outputs.success-title }}
SUCCESS_BODY: ${{ steps.defaults.outputs.success-body }}
run: |
if [ "$FIX_PR_CREATED" = "true" ]; then
# Fix PR was created - post or update warning comment
COMMENT_BODY="${COMMENT_MARKER}
⚠️ **${WARNING_TITLE}**
${WARNING_BODY}
**Action needed:** Merge this PR into your branch: ${FIX_PR_URL}"
if [ -n "$EXISTING_COMMENT_ID" ]; then
echo "Updating existing comment $EXISTING_COMMENT_ID with warning"
gh api "repos/${{ github.repository }}/issues/comments/${EXISTING_COMMENT_ID}" \
-X PATCH -f body="$COMMENT_BODY"
echo "action_taken=updated-warning" >> $GITHUB_OUTPUT
else
echo "Creating new warning comment"
gh pr comment "$PR_NUMBER" --body "$COMMENT_BODY"
echo "action_taken=created" >> $GITHUB_OUTPUT
fi
else
# No fix PR needed - update existing comment to success (if exists)
if [ -n "$EXISTING_COMMENT_ID" ]; then
echo "Updating comment to indicate issue is resolved"
COMMENT_BODY="${COMMENT_MARKER}
✅ **${SUCCESS_TITLE}**
${SUCCESS_BODY}"
gh api "repos/${{ github.repository }}/issues/comments/${EXISTING_COMMENT_ID}" \
-X PATCH -f body="$COMMENT_BODY"
echo "action_taken=updated-success" >> $GITHUB_OUTPUT
else
echo "No action needed - no existing comment and check passed"
echo "action_taken=none" >> $GITHUB_OUTPUT
fi
fi
- name: Fail if changes were needed
if: steps.context.outputs.is_pr == 'true' && steps.auth-check.outputs.has_auth == 'true' && steps.create-pr.outputs.pull-request-number
shell: bash
env:
FIX_PR_URL: ${{ steps.create-pr.outputs.pull-request-url }}
WARNING_TITLE: ${{ steps.defaults.outputs.warning-title }}
run: |
echo "::error::${WARNING_TITLE}. Please merge the auto-generated PR: ${FIX_PR_URL}"
exit 1
================================================
FILE: .github/actions/setup-publish/action.yml
================================================
name: Setup publish job
description: Install Python + uv and download the publish plan artifact. Assumes the repo is already checked out.
runs:
using: composite
steps:
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: "3.11"
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: publish-plan
================================================
FILE: .github/workflows/bump_llama_index_core.yml
================================================
name: Bump llama-index-core
on:
repository_dispatch:
types: [llama-index-core-release]
workflow_dispatch:
jobs:
bump-dependency:
if: github.repository == 'run-llama/llama-agents'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v6
- run: uv lock --upgrade-package llama-index-core
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.CI_BOT_APP_ID }}
private-key: ${{ secrets.CI_BOT_PRIVATE_KEY }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
with:
token: ${{ steps.app-token.outputs.token }}
commit-message: "chore: bump llama-index-core"
branch: bump-llama-index-core
delete-branch: true
title: "chore: bump llama-index-core"
labels: |
dependencies
automated
================================================
FILE: .github/workflows/chart-validate.yaml
================================================
name: chart-validate
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
paths:
- "charts/llama-agents/**"
- ".github/workflows/chart-validate.yaml"
workflow_dispatch: {}
jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Helm
uses: azure/setup-helm@v4
- name: Install helm-unittest plugin
run: make -C operator helm-unittest-install
- name: Create kind cluster
uses: helm/kind-action@v1
- name: Install Prometheus Operator CRDs (for ServiceMonitor validation)
run: make -C operator helm-crds-prom-operator
- name: Install helm-docs
run: |
make -C operator helm-docs-install
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"
- name: Verify README is up to date
run: make -C operator helm-docs-check
- name: Helm lint (default values)
run: make -C operator helm-lint
- name: Helm lint (dev values)
run: make -C operator helm-lint-dev
- name: Server-side dry-run apply (default values)
run: make -C operator helm-dry-run
- name: Server-side dry-run apply (dev values)
run: make -C operator helm-dry-run-dev
- name: Helm unit tests (if present)
run: |
if [ -d charts/llama-agents/tests ]; then
make -C operator helm-unittest
else
echo "No helm-unittest tests found; skipping."
fi
================================================
FILE: .github/workflows/go-ci.yml
================================================
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
paths:
- "operator/**"
- "docker/operator.Dockerfile"
- "scripts/process_manifests.py"
jobs:
operator-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.24"
cache-dependency-path: ./operator/go.sum
- name: golangci-lint
uses: golangci/golangci-lint-action@v8
with:
version: v2.1
working-directory: ./operator
- name: Install uv
uses: astral-sh/setup-uv@v6
- name: Verify generated manifests are up to date
run: make -C operator operator-manifests-check
- name: Clean controller-gen cache
run: rm -rf ./operator/bin/controller-gen
- name: Run Go tests
run: make -C operator operator-test
env:
GOOS: linux
GOARCH: amd64
operator-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build operator image (no push)
uses: docker/build-push-action@v5
with:
context: .
file: docker/operator.Dockerfile
platforms: linux/amd64
push: false
tags: llamaindex/llama-agents-operator:dev
cache-from: type=gha,scope=operator-amd64
cache-to: type=gha,mode=min,scope=operator-amd64
================================================
FILE: .github/workflows/lint.yml
================================================
name: Linting
on:
push:
branches:
- main
pull_request:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v6
- name: Install dev dependencies
run: uv sync --all-extras --all-packages
- name: Run pre-commit
id: pre-commit
continue-on-error: true
run: uv run pre-commit run -a
- name: Auto-fix PR if needed
uses: ./.github/actions/pr-fix-comment
with:
app-id: ${{ secrets.CI_BOT_APP_ID }}
private-key: ${{ secrets.CI_BOT_PRIVATE_KEY }}
add-paths: "."
check-name: "Lint"
fix-command: "uv run pre-commit run -a"
- name: Fail if pre-commit failed
if: steps.pre-commit.outcome == 'failure'
run: exit 1
================================================
FILE: .github/workflows/lockfile.yml
================================================
name: Lockfile
on:
push:
branches:
- main
paths:
- "**/package.json"
- "pnpm-lock.yaml"
pull_request:
paths:
- "**/package.json"
- "pnpm-lock.yaml"
jobs:
check:
name: Validate lockfile
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "22"
- name: Check lockfile is up to date
run: pnpm install --frozen-lockfile
================================================
FILE: .github/workflows/publish_changesets.yml
================================================
name: Version Bump and Release
on:
push:
branches:
- main
- dev
concurrency: ${{ github.workflow }}-${{ github.ref }}
permissions:
contents: write
id-token: write
packages: write
jobs:
# ---------------------------------------------------------------------------
# Release PR management + publish planning.
#
# 1. Runs changesets/action to open/update the "version packages" release PR
# when there are pending changesets. When that PR merges into main/dev,
# the changesets folder is empty on the next push and this step is a
# no-op — then we proceed to plan & publish.
# 2. Runs `dev changeset-plan` unconditionally. The plan is a reconcile
# loop: it diffs current workspace versions against what's already on
# PyPI / Docker Hub / the Helm registry and emits actions for the gaps.
# An empty plan is normal and results in all downstream jobs no-opping.
# ---------------------------------------------------------------------------
plan:
name: Plan release
runs-on: ubuntu-latest
environment: release
if: github.repository == 'run-llama/llama-agents' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev')
outputs:
has_work: ${{ steps.plan.outputs.has_work }}
pypi: ${{ steps.plan.outputs.pypi }}
docker_builds: ${{ steps.plan.outputs.docker_builds }}
docker_manifests: ${{ steps.plan.outputs.docker_manifests }}
helm: ${{ steps.plan.outputs.helm }}
steps:
- name: Checkout Repo
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: "22"
cache: "pnpm"
- name: Setup Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: "3.11"
- name: Install uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- name: Install dependencies
run: pnpm install
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
with:
app-id: ${{ secrets.CI_BOT_APP_ID }}
private-key: ${{ secrets.CI_BOT_PRIVATE_KEY }}
- name: Install helm-docs
run: |
make -C operator helm-docs-install
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"
- name: Create / update Release Pull Request
id: changesets
uses: changesets/action@6a0a831ff30acef54f2c6aa1cbbc1096b066edaf # v1
with:
commit: "chore: version packages"
title: "chore: version packages"
# Only manage the release PR here. Actual publishing is done by
# the fan-out jobs below so docker builds run in parallel on
# native amd64 / arm64 runners.
version: pnpm -w run version
setupGitUser: false
commitMode: github-api
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
GH_TOKEN: ${{ steps.app-token.outputs.token }}
# When there are pending changesets, the step above runs ``pnpm -w
# run version`` to build the release PR. With ``commitMode:
# github-api`` those edits are committed through the API and left
# uncommitted in the local working tree. If we don't reset, the
# plan step below scans the mutated tree, emits actions for the
# *next* versions, and the downstream publish jobs (which do a
# fresh checkout of the branch) then build artifacts for the
# previous versions and fail to match the plan. Reset so the plan
# reflects what is actually committed on the branch.
- name: Reset working tree after changesets action
run: git reset --hard HEAD
- name: Compute publish plan
id: plan
run: uv run dev changeset-plan --output publish-plan.json
- name: Upload publish plan
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: publish-plan
path: publish-plan.json
retention-days: 14
# ---------------------------------------------------------------------------
# PyPI: one job per package so the Actions UI shows a checkmark per release.
# ---------------------------------------------------------------------------
pypi:
name: "pypi: ${{ matrix.item.package }}"
needs: plan
if: needs.plan.outputs.pypi != '[]'
runs-on: ubuntu-latest
environment: release
strategy:
fail-fast: false
matrix:
item: ${{ fromJSON(needs.plan.outputs.pypi) }}
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- uses: ./.github/actions/setup-publish
- run: uv run dev publish-action --plan publish-plan.json --id '${{ matrix.item.id }}'
# ---------------------------------------------------------------------------
# Docker builds: one job per (image, platform) so amd64 / arm64 build on
# native runners in parallel — no QEMU emulation. The manifest job below
# stitches the per-arch tags into the final multi-arch tags.
# ---------------------------------------------------------------------------
docker-build:
name: "docker: ${{ matrix.item.package }} (${{ matrix.item.platform }})"
needs: plan
if: needs.plan.outputs.docker_builds != '[]'
runs-on: ${{ matrix.item.platform == 'linux/arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }}
environment: release
strategy:
fail-fast: false
matrix:
item: ${{ fromJSON(needs.plan.outputs.docker_builds) }}
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- uses: ./.github/actions/setup-publish
- uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
# Expose ACTIONS_RUNTIME_TOKEN / ACTIONS_CACHE_URL for buildx type=gha cache.
- uses: crazy-max/ghaction-github-runtime@3cb05d89e1f492524af3d41a1c98c83bc3025124 # v3
- uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: docker.io
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- run: uv run dev publish-action --plan publish-plan.json --id '${{ matrix.item.id }}'
docker-manifest:
name: "docker-manifest: ${{ matrix.item.package }}"
needs: [plan, docker-build]
if: needs.plan.outputs.docker_manifests != '[]'
runs-on: ubuntu-latest
environment: release
strategy:
fail-fast: false
matrix:
item: ${{ fromJSON(needs.plan.outputs.docker_manifests) }}
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- uses: ./.github/actions/setup-publish
- uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: docker.io
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- run: uv run dev publish-action --plan publish-plan.json --id '${{ matrix.item.id }}'
# ---------------------------------------------------------------------------
# Helm: one job per chart. Depends on the manifest job because charts
# reference the final image tags and must not be published before them.
# ---------------------------------------------------------------------------
helm:
name: "helm: ${{ matrix.item.package }}"
needs: [plan, docker-manifest]
if: |
always() &&
needs.plan.result == 'success' &&
(needs.docker-manifest.result == 'success' || needs.docker-manifest.result == 'skipped') &&
needs.plan.outputs.helm != '[]'
runs-on: ubuntu-latest
environment: release
strategy:
fail-fast: false
matrix:
item: ${{ fromJSON(needs.plan.outputs.helm) }}
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- uses: ./.github/actions/setup-publish
- uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4
with:
version: '3.18.1'
- uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: docker.io
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- run: uv run dev publish-action --plan publish-plan.json --id '${{ matrix.item.id }}'
# ---------------------------------------------------------------------------
# Finalize: create git tags for everything we just published and fire
# downstream repository dispatches. Runs only if all publish jobs
# succeeded (or were legitimately skipped because there was no work).
# ---------------------------------------------------------------------------
finalize:
name: Finalize release
needs: [plan, pypi, docker-build, docker-manifest, helm]
if: |
always() &&
needs.plan.result == 'success' &&
needs.plan.outputs.has_work == 'true' &&
!contains(needs.*.result, 'failure') &&
!contains(needs.*.result, 'cancelled')
runs-on: ubuntu-latest
environment: release
steps:
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
with:
app-id: ${{ secrets.CI_BOT_APP_ID }}
private-key: ${{ secrets.CI_BOT_PRIVATE_KEY }}
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
fetch-depth: 0
token: ${{ steps.app-token.outputs.token }}
- uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: "22"
cache: "pnpm"
# Install the workspace so ``pnpm exec changeset tag`` uses the
# @changesets/cli version pinned by pnpm-lock.yaml, with every
# transitive dep locked — ``npx``/``pnpm dlx`` would ignore the
# lockfile and resolve fresh, which we don't want in the release
# path.
- run: pnpm install --frozen-lockfile
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: publish-plan
# Use changesets/action in publish mode to (1) tag each package
# at its current version, (2) push the tags, and (3) create a
# GitHub Release per tag with the CHANGELOG entry as the body.
# The ``publish`` script is a no-op beyond ``changeset tag`` —
# the fan-out jobs above handle the actual PyPI / Docker / Helm
# publishing. The action only parses ``New tag: ...`` lines from
# the publish script output to decide which packages to release.
- name: Create tags and GitHub releases
uses: changesets/action@6a0a831ff30acef54f2c6aa1cbbc1096b066edaf # v1
with:
publish: pnpm exec changeset tag
setupGitUser: false
commitMode: github-api
createGithubReleases: true
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
GH_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Extract published llama-agents-server version
if: github.ref == 'refs/heads/main'
id: server-version
run: |
VERSION=$(jq -r '.pypi[] | select(.package == "llama-agents-server") | .version' publish-plan.json)
if [ -n "$VERSION" ] && [ "$VERSION" != "null" ]; then
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=llama-agents-server@v${VERSION}" >> "$GITHUB_OUTPUT"
echo "Found llama-agents-server version: $VERSION"
else
echo "llama-agents-server was not published in this release"
fi
- name: Trigger OpenAPI publish for llama-agents-server
if: github.ref == 'refs/heads/main' && steps.server-version.outputs.version != ''
uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3
with:
token: ${{ steps.app-token.outputs.token }}
event-type: publish-openapi
client-payload: '{"tag": "${{ steps.server-version.outputs.tag }}"}'
# The default app-token above is scoped to this repo only, so it
# can't dispatch to the downstream repo. Mint a second token
# scoped to DOWNSTREAM_DISPATCH_REPO for the dispatch call.
- name: Parse downstream dispatch repo
id: dispatch-repo
if: github.ref == 'refs/heads/main' && vars.DOWNSTREAM_DISPATCH_REPO != ''
env:
DISPATCH_REPO: ${{ vars.DOWNSTREAM_DISPATCH_REPO }}
run: |
echo "owner=${DISPATCH_REPO%%/*}" >> "$GITHUB_OUTPUT"
echo "repo=${DISPATCH_REPO##*/}" >> "$GITHUB_OUTPUT"
- name: Generate downstream dispatch token
id: dispatch-token
if: github.ref == 'refs/heads/main' && vars.DOWNSTREAM_DISPATCH_REPO != ''
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1
with:
app-id: ${{ secrets.CI_BOT_APP_ID }}
private-key: ${{ secrets.CI_BOT_PRIVATE_KEY }}
owner: ${{ steps.dispatch-repo.outputs.owner }}
repositories: ${{ steps.dispatch-repo.outputs.repo }}
- name: Trigger downstream version bump
if: github.ref == 'refs/heads/main' && vars.DOWNSTREAM_DISPATCH_REPO != ''
env:
GH_TOKEN: ${{ steps.dispatch-token.outputs.token }}
DISPATCH_REPO: ${{ vars.DOWNSTREAM_DISPATCH_REPO }}
run: |
PACKAGES=$(jq -c '[.pypi[] | {name: .package, version: .version}] + [.docker_manifests[] | {name: .image, version: .version}] + [.helm[] | {name: .package, version: .version}]' publish-plan.json)
gh api "repos/$DISPATCH_REPO/dispatches" \
--input - <<< "{\"event_type\":\"bump-cloud-llama-deploy\",\"client_payload\":{\"packages\":$PACKAGES}}"
================================================
FILE: .github/workflows/publish_openapi.yml
================================================
name: Publish OpenAPI specification
on:
workflow_dispatch:
inputs:
tag:
description: "Release tag to update (e.g. llama-agents-server@v0.1.1)"
required: true
type: string
repository_dispatch:
types: [publish-openapi]
jobs:
publish-openapi:
if: github.repository == 'run-llama/llama-agents'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install uv
uses: astral-sh/setup-uv@v6
- name: Resolve target tag
id: target
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
TAG="${{ github.event.inputs.tag }}"
else
TAG="${{ github.event.client_payload.tag }}"
fi
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
echo "TARGET_TAG=${TAG}" >> "$GITHUB_ENV"
- name: Compute release metadata
id: metadata
run: >
uv run dev compute-tag-metadata
--tag "${{ env.TARGET_TAG }}"
--output "$GITHUB_OUTPUT"
- name: Sync dependencies and build OpenAPI spec
working-directory: packages/llama-agents-server
run: |
uv sync
uv run hatch run openapi
- name: Upload OpenAPI to release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.TARGET_TAG }}
files: packages/llama-agents-server/openapi.json
fail_on_unmatched_files: true
append_body: false
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.CI_BOT_APP_ID }}
private-key: ${{ secrets.CI_BOT_PRIVATE_KEY }}
owner: run-llama
- name: Trigger SDK update
if: >
steps.metadata.outputs.change_type != '' &&
steps.metadata.outputs.change_type != 'none'
uses: peter-evans/repository-dispatch@v3
with:
token: ${{ steps.app-token.outputs.token }}
repository: run-llama/llama-ui
event-type: workflows-sdk-update
client-payload: >-
{"version": "${{ steps.metadata.outputs.semver }}",
"openapi_url": "https://github.com/run-llama/llama-agents/releases/download/${{ env.TARGET_TAG }}/openapi.json",
"change_type": "${{ steps.metadata.outputs.change_type }}",
"change_description": "${{ steps.metadata.outputs.change_description }}"}
================================================
FILE: .github/workflows/sync-docs.yml
================================================
name: Sync Docs to Developer Hub
on:
push:
branches: [main]
paths:
- "docs/**"
workflow_dispatch:
jobs:
sync-docs:
if: github.repository == 'run-llama/llama-agents'
runs-on: ubuntu-latest
steps:
- name: Checkout source repo
uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
- name: Checkout docs repo
uses: actions/checkout@v4
with:
repository: run-llama/developers
token: ${{ secrets.DEVELOPER_HUB_TOKEN }}
path: developer-hub
- name: Sync docs
run: ./scripts/sync-docs-to-developer-hub.sh developer-hub
- name: Commit and push
working-directory: developer-hub
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add src/content/docs/python/llamaagents/ api-reference/python/workflows/
if git diff --staged --quiet; then
echo "No docs changes to sync."
exit 0
fi
SOURCE_SHA="${GITHUB_SHA::8}"
git commit -m "sync: llama-agents docs from run-llama/llama-agents@${SOURCE_SHA}"
git push
================================================
FILE: .github/workflows/test.yml
================================================
name: Unit Testing
on:
pull_request:
push:
branches:
- main
env:
# Which Python from the matrix will be used to run the coverage check
COV_PYTHON_VERSION: 3.14
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
package:
[
llama-index-workflows,
llama-index-utils-workflow,
llama-agents-integration-tests,
llama-agents-dev,
llama-agents-client,
llama-agents-server,
llama-agents-dbos,
llama-agents-core,
llama-agents-agentcore,
llama-agents-appserver,
llama-agents-control-plane,
llamactl,
]
exclude:
# Dev CLI only needs to run on 3.14
- package: llama-agents-dev
python-version: "3.10"
- package: llama-agents-dev
python-version: "3.11"
- package: llama-agents-dev
python-version: "3.12"
- package: llama-agents-dev
python-version: "3.13"
include:
- package: llama-index-workflows
package_dir: packages/llama-index-workflows
- package: llama-index-utils-workflow
package_dir: packages/llama-index-utils-workflow
- package: llama-agents-integration-tests
package_dir: packages/llama-agents-integration-tests
- package: llama-agents-dev
package_dir: .
- package: llama-agents-client
package_dir: packages/llama-agents-client
- package: llama-agents-server
package_dir: packages/llama-agents-server
- package: llama-agents-dbos
package_dir: packages/llama-agents-dbos
- package: llama-agents-core
package_dir: packages/llama-agents-core
- package: llama-agents-agentcore
package_dir: packages/llama-agents-agentcore
- package: llama-agents-appserver
package_dir: packages/llama-agents-appserver
- package: llama-agents-control-plane
package_dir: packages/llama-agents-control-plane
- package: llamactl
package_dir: packages/llamactl
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install uv and set the python version
uses: astral-sh/setup-uv@v6
with:
python-version: ${{ matrix.python-version }}
enable-cache: true
- name: Run tests
if: matrix.python-version != env.COV_PYTHON_VERSION
run: |
uv sync --python ${{ matrix.python-version }} --all-extras --directory ${{ matrix.package_dir }}
uv run --python ${{ matrix.python-version }} --all-extras --directory ${{ matrix.package_dir }} -- pytest
- name: Run tests with coverage
if: matrix.python-version == env.COV_PYTHON_VERSION
run: uv run --all-extras --directory ${{ matrix.package_dir }} -- pytest --cov=src --cov-report=xml
- name: Report Coveralls
if: matrix.python-version == env.COV_PYTHON_VERSION
continue-on-error: true
uses: coverallsapp/github-action@v2
with:
file: ${{ matrix.package_dir }}/coverage.xml
flag-name: ${{ matrix.package }}
parallel: true
env:
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
test-docker:
name: "test docker (3.14 - all packages)"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install uv and set the python version
uses: astral-sh/setup-uv@v6
with:
python-version: "3.14"
enable-cache: true
- name: Run Docker tests with coverage (append)
# Use longer timeout for Docker tests since container startup can take 30-60s in CI
run: uv run --all-extras --all-packages dev --timeout=120 -m docker --cov --cov-append --cov-report=xml
- name: Report Coveralls
continue-on-error: true
uses: coverallsapp/github-action@v2
with:
file: packages/llama-agents-integration-tests/coverage.xml
flag-name: llama-agents-integration-tests
parallel: true
env:
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
coveralls-finish:
needs: [test, test-docker]
runs-on: ubuntu-latest
if: github.repository == 'run-llama/llama-agents'
steps:
- name: Finalize Coveralls parallel jobs
continue-on-error: true
uses: coverallsapp/github-action@v2
with:
parallel-finished: true
env:
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
================================================
FILE: .github/workflows/update_debugger_assets.yml
================================================
name: Update Debugger Assets
on:
repository_dispatch:
types: [debugger-assets-update]
workflow_dispatch:
inputs:
js_url:
description: "JavaScript URL"
required: true
css_url:
description: "CSS URL"
required: true
jobs:
update-assets:
if: github.repository == 'run-llama/llama-agents'
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Install uv
uses: astral-sh/setup-uv@v6
- name: Extract payload data
id: payload
run: |
# Handle both repository_dispatch and workflow_dispatch
if [ -n "${{ github.event.inputs.js_url }}" ]; then
echo "js_url=${{ github.event.inputs.js_url }}" >> $GITHUB_OUTPUT
echo "css_url=${{ github.event.inputs.css_url }}" >> $GITHUB_OUTPUT
else
echo "js_url=${{ github.event.client_payload.js_url }}" >> $GITHUB_OUTPUT
echo "css_url=${{ github.event.client_payload.css_url }}" >> $GITHUB_OUTPUT
fi
- name: Update index.html
run: >
uv run dev update-index-html
--js-url "${{ steps.payload.outputs.js_url }}"
--css-url "${{ steps.payload.outputs.css_url }}"
- name: Create changeset for patch version
run: |
# Use a deterministic filename so multiple updates accumulate into one changelog entry
CHANGESET_FILE=".changeset/update-debugger-assets.md"
cat > "$CHANGESET_FILE" << 'EOF'
---
"llama-agents-server": patch
---
Update debugger assets
- JavaScript: ${{ steps.payload.outputs.js_url }}
- CSS: ${{ steps.payload.outputs.css_url }}
EOF
echo "Created changeset: $CHANGESET_FILE"
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.CI_BOT_APP_ID }}
private-key: ${{ secrets.CI_BOT_PRIVATE_KEY }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
with:
token: ${{ steps.app-token.outputs.token }}
commit-message: "chore: update debugger assets"
branch: update-debugger-assets
delete-branch: true
title: "Update debugger assets"
body: |
## Update Debugger Assets
This PR updates the workflow debugger assets and creates a changeset for a patch version bump.
### Changes
- Updated `packages/llama-agents-server/src/llama_agents/server/static/index.html`
- JavaScript: ${{ steps.payload.outputs.js_url }}
- CSS: ${{ steps.payload.outputs.css_url }}
---
*This PR was automatically created by the [update-debugger-assets workflow](https://github.com/${{ github.repository }}/actions/workflows/update_debugger_assets.yml)*
labels: |
dependencies
automated
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
.python-version
*.sqlite
*.sqlite3
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# Ruff stuff:
.ruff_cache/
# PyPI configuration file
.pypirc
# IDEs
.idea/
.vscode/
.zed/
.claude/
.cursorignore
.cursorindexingignore
# Generated files
openapi.json
workflow_all_flows.mermaid
node_modules/
.cecli*
# Cloned reference repositories
llama_index/
# Docs preview
.docs-preview/
# Operator / k8s dev
operator/bin/
bin/
tilt/k8s-manifests/secrets.yaml
================================================
FILE: .pre-commit-config.yaml
================================================
---
default_language_version:
python: python3
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: check-byte-order-marker
- id: check-merge-conflict
- id: check-toml
- id: check-yaml
args: [--allow-multiple-documents]
exclude: "(^charts|^operator)"
- id: detect-private-key
- id: end-of-file-fixer
- id: mixed-line-ending
- id: trailing-whitespace
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.14.5
hooks:
- id: ruff-format
- id: ruff-check
args: [--fix, --exit-non-zero-on-fix]
- repo: local
hooks:
- id: ty
name: ty
language: system
entry: uv run ty check packages/
pass_filenames: false
- repo: https://github.com/DetachHead/basedpyright-pre-commit-mirror
rev: 1.31.1
hooks:
- id: basedpyright
exclude: "scripts/"
- repo: https://github.com/codespell-project/codespell
rev: v2.3.0
hooks:
- id: codespell
additional_dependencies: [tomli]
exclude: ^examples/|^docs/|pnpm-lock.yaml
- repo: https://github.com/pappasam/toml-sort
rev: v0.23.1
hooks:
- id: toml-sort-fix
exclude: ^uv\.lock$
================================================
FILE: .prettierrc
================================================
{
"overrides": [
{
"files": ["*.yaml", "*.yml"],
"options": {
"bracketSpacing": false
}
}
]
}
================================================
FILE: .taplo.toml
================================================
[formatting]
align_comments = false
reorder_keys = false
# Following are to be consistent with toml-sort
indent_string = " "
array_trailing_comma = false
compact_arrays = true
compact_inline_tables = true
================================================
FILE: AGENTS.md
================================================
# LlamaIndex Workflows - Claude Development Guide
## Project Overview
This is the LlamaIndex Workflows library - an event-driven, async-first framework for orchestrating complex AI applications and multi-step processes.
## Key Technologies
- Python 3.9+
- AsyncIO (async/await)
- Pydantic for data models
- Starlette for web server
- Uvicorn for ASGI serving
## Setup
- Install uv: `curl -LsSf https://astral.sh/uv/install.sh | sh`
- Install deps (dev): `uv sync --all-packages --all-extras`
## Development Commands
### Testing
Use the `dev` CLI to run tests:
```bash
# Run all package tests
uv run dev
# Filter by substring match
uv run dev -p workflows
uv run dev -p server -p client
# Pass pytest args after --
uv run dev -- -k test_name
```
For more advanced scenarios, you can always `cd packages/some-package` and use pytest directly. The dev tool just provides additional package level test parallelism, and more curated cross package test output to avoid context bloat.
Several packages have Docker integration tests (requires Docker running) marked with `@pytest.mark.docker`. Run them with:
```bash
cd packages/<package> && uv run pytest -m docker -s -n0
```
### Linting & Formatting
```bash
uv run pre-commit run -a
```
If type checkers (ty, basedpyright) fail with unresolved imports, you likely need all packages installed: `uv sync --all-packages --all-extras`
## Project Structure
- `packages/llama-index-workflows/src/workflows/` - Main library code
- `packages/llama-index-workflows/src/workflows/server/` - Web server implementation
- `packages/llama-index-workflows/tests/` - Test suite
- `packages/llama-agents-core/` - Shared schemas and utilities for cloud components
- `packages/llama-agents-control-plane/` - Control plane service (K8s management, deployment API)
- `packages/llama-agents-appserver/` - Application server (runs workflows in pods)
- `packages/llamactl/` - CLI tool for interacting with deployments
- `packages/llama-agents-agentcore/` - Agent runtime and deployment logic
- `operator/` - Go-based Kubernetes operator (see `operator/AGENTS.md`)
- `charts/` - Helm charts (see `charts/AGENTS.md`)
- `docker/` - Dockerfiles for container images
- `operator/tilt/` - Tilt dev environment support files
- `examples/` - Usage examples
## Architecture
See `architecture-docs/` for high-level architectural overviews:
- [`core-overview.md`](architecture-docs/core-overview.md) — Workflow, Context, Runtime, and event flow
- [`control-loop.md`](architecture-docs/control-loop.md) — The reducer-based execution engine
- [`server-architecture.md`](architecture-docs/server-architecture.md) — HTTP server, persistence, and runtime decorators
- [`overall-architecture.md`](architecture-docs/overall-architecture.md) — Cloud platform architecture (operator, control plane, appserver)
- [`build-api.md`](architecture-docs/build-api.md) — Build API for deployment creation
- [`quick-reference.md`](architecture-docs/quick-reference.md) — Code navigation guide and key constants
The DBOS package has its own architecture doc explaining the distributed model (process boundaries, adapter rules, idle release):
- [`packages/llama-agents-dbos/ARCHITECTURE.md`](packages/llama-agents-dbos/ARCHITECTURE.md)
## Key Components
- **Workflow** - Main orchestration class
- **Context** - State management across workflow steps
- **Events** - Event-driven communication between steps
- **WorkflowServer** - HTTP server for serving workflows as web services
## Versioning with Changesets
```bash
npx changeset # Add a changeset
npx changeset status # Check pending changes
```
Changeset descriptions should be a single line in plain English. Keep it short and simple. Do not use conventional-commit prefixes (no `fix(scope):`, `feat(scope):`, etc.).
## Development Environment
```bash
uv run operator/dev.py up # Set up kind cluster and start development
uv run operator/dev.py down # Clean up deployed resources
uv run operator/dev.py down --delete # Delete the kind cluster
uv run operator/dev.py status # Show cluster status
```
## Other Components
For Operator/Helm details, see `operator/AGENTS.md` and `charts/AGENTS.md`.
## Notes for Claude
- Always run tests after making changes: `uv run dev`
- Never use classes for tests, only use pytest functions
- Always annotate with types function arguments and return values
- The project uses async/await extensively
- Context serialization requires specific JSON format for globals
## Autonomous Operation
The following rules apply if you are running in an isolated sandbox environment and have tools to commit and push changes to git
Make sure to install uv as the package manager. Development commands rely on it.
```bash
curl -fsSL https://astral.sh/uv/install.sh | sh
```
Always run tests and pre-commit before committing:
```bash
uv run dev
uv run pre-commit run -a
```
## Testing Patterns
We use **pytest** with idiomatic pytest patterns. Follow these guidelines:
- **No Test Classes**: Do not use test classes to organize tests. Write tests as standalone functions. Achieve organization through descriptive function names (e.g., `test_create_job_with_invalid_input_raises_error`) or by splitting into separate test files.
- **Pytest Fixtures**: Use fixtures for setup/teardown and shared test dependencies. Prefer fixtures over manual setup code repeated across tests.
- **Prefer Real Objects Over Mocks**: Use simple dataclasses and real objects directly when available rather than mocking them. Only mock external dependencies or things that are truly difficult to instantiate.
- **DRY Test Setup**: Do not repeat patches or setup code. Create reusable abstractions—fixtures, helper functions, or module-level constants—that can be shared across tests. Tests can easily be overwhelmed with setup; start from a rich suite of testing utilities to enable many small, expressive tests.
- **Simple Testing Utilities**: Testing utilities should be basic—just functions, fixtures, and global variables. Avoid over-engineering test infrastructure.
## Coding Style
- Always use `from __future__ import annotations` at the top of each test file. Never use string annotations.
- Include the standard SPDX license header at the top of each file:
```python
# SPDX-License-Identifier: MIT
# Copyright (c) 2026 LlamaIndex Inc.
```
- Comments are useful, but avoid fluff.
- Import etiquette
- **Do not use inline imports.** This is the default rule. Do not move imports into functions just to make an edit work quickly, avoid a top-level import conflict, or silence a linter/type checker.
- Inline imports are allowed only for two accepted conditions: circular import chokepoints and known startup-time deferrals.
- Circular import deferrals must have a well-defined chokepoint that owns the inline import burden. Prefer the high-level orchestration module that closes the loop, such as `workflow.py`; keep low-level leaf modules on normal top-level imports.
- Startup-time deferrals are only acceptable for known, measured import costs on latency-sensitive surfaces, such as fast CLI startup. Do not invent new startup deferrals casually.
- If a change appears to need a new inline import, first look for a normal top-level import, a better module boundary, or an existing chokepoint. Treat adding an inline import as a design exception, not a convenience.
- When an inline import is truly warranted, it must carry a short comment explaining the deferral reason: which cycle it breaks, or what startup cost it avoids. No naked inline imports.
- Put inline imports at the very beginning of the function that uses them, before other executable logic.
- `if TYPE_CHECKING` imports may only be used alongside one of the accepted inline-import patterns above, so the runtime import stays deferred while annotations remain typed.
- Do not wrap deferred-only types in string annotations. Use `from __future__ import annotations` instead.
- Only add `__init__.py` `__all__` exports when a file is legitimately needed for public library consumption. Module level imports should not be used internally. For the most part you should never do this unless explicitly requested to do so
================================================
FILE: CLAUDE.md
================================================
@AGENTS.md
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
## Ideas for Contributing
Contributions are welcome! We do our best to keep an eye on the issues and PRs and keeping them moving. Never hesitate to open a PR or an issue!
Generally, we're looking for:
- **New workflow features**: Improvements to the core workflow engine, step decorators, event handling, or context management
- **Better error handling and validation**: Enhanced error messages, better validation of workflow configurations, improved debugging capabilities, and better retry mechanisms
- **Performance optimizations**: Improvements to workflow execution speed, memory usage, or concurrent processing
- **Documentation improvements**: Better examples, tutorials, API documentation, or architectural explanations
- **Testing enhancements**: More comprehensive test coverage, performance tests, or integration tests
- **Checkpointing and persistence**: Improvements to workflow state management and resumption capabilities
- **Resource management**: Better handling of external resources and dependencies
- **Bug fixes**: Any issues you've encountered while using the library
Ideas beyond the above are welcome! This list is not exhaustive.
## Setup
This section assumes you have `uv` installed.
When developing locally, development works best with a virtual environment. You can create one with:
```bash
uv venv
# On MacOS/Linux
source .venv/bin/activate
# On Windows
.venv\Scripts\activate
```
The project is a monorepo with multiple closely related packages. You can install all dependencies with:
```bash
uv sync --all-extras --all-packages
```
The `pyproject.toml` files contain the dependencies for each project along with other details like the package name, version, etc. Generally you won't have to edit this file.
Linting is done automatically with `pre-commit`. Initialize it with:
```bash
uv run pre-commit install
```
## Run tests
Use the `dev` CLI to run tests across packages:
```bash
# Run all package tests
uv run dev
# Filter by substring match
uv run dev -p workflows
uv run dev -p server -p client
# Pass pytest args after --
uv run dev -- -k test_name
```
Generally, all features should be covered by robust tests. If you are adding a new feature or fixing a bug, please add tests for it.
### Manually running linting
We use `pre-commit` to run linting and formatting on the codebase. You can run it manually with:
```bash
uv run pre-commit run -a
```
The `pre-commit` config is located in the `.pre-commit-config.yaml` file.
## Changesets and Releases
Despite being a Python project, we use [Changesets](https://github.com/changesets/changesets) for version management because it provides an excellent workflow for managing releases in a monorepo. Changesets makes it easy to track which packages need version bumps and helps generate changelogs automatically.
### Adding a Changeset
When you make a change that should be included in the next release, you need to add a changeset by running the following command (requires Node.js):
```bash
npx @changesets/cli
```
This will prompt you to:
1. Select which packages are affected by your changes
2. Choose the version bump type (major, minor, or patch)
3. Write a summary of your changes
### How It Works
When a PR with changesets is merged, the changeset bot will:
1. Sync versions from `package.json` to `pyproject.toml` files
2. Update package versions according to the changesets
3. Generate/update CHANGELOG files
4. Create a "Version Packages" PR that can be merged to trigger the release
================================================
FILE: LICENSE
================================================
The MIT License
Copyright (c) 2026 LlamaIndex Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: README.md
================================================
# LlamaAgents
[](https://github.com/run-llama/workflows/actions/workflows/test.yml)
[](https://coveralls.io/github/run-llama/workflows?branch=main)
[](https://github.com/run-llama/llama-index-workflows/graphs/contributors)
[](https://pypi.org/project/llama-index-workflows/)
[](https://discord.gg/dGcwcsnxhU)
[](https://x.com/llama_index)
[](https://www.reddit.com/r/LlamaIndex/)
An open-source framework for building and shipping document-centric agents in Python.
Document workflows are messy. You're stitching together OCR, LLMs, structured extraction, classification, custom validation, and human review into pipelines that have to run reliably in production. The steps are slow and the payloads are heavy. A lot of the work is in-process Python: embedding models, image analysis, vision calls, custom heuristics that don't want to be a microservice. Standing up durable orchestration for that kind of workload is a project on its own, so most teams end up shoving the pipeline into a side process nobody else wants to integrate with.
LlamaAgents is built on [**Agent Workflows**](https://developers.llamaindex.ai/python/llamaagents/workflows/), an event-driven orchestration library where steps are async Python functions that emit and consume events. Branch, loop, parallelize, persist state, recover from failures, all in plain Python with no DSL.
## Grows with you
Document workloads have a wide range of shapes. Sometimes you're parsing five contracts in a notebook to prove a point. Others you're running a million invoices a month behind a customer's firewall, or you're iterating on extraction quality and shipping a new version every day. Agent Workflows is built to follow you across all of that without a rewrite.
Start as a function you call from a script. Wrap it in a server when you need an API. Connect a coordination backend when you need durability. Turn on replication when you need to scale.
And because it's a library at its core, the same workflow code drops into wherever the work has to actually run: a notebook for prototyping, a FastAPI app for your product, or a customer's locked-down environment when their documents can't leave it.
For more ideas of what it can do, take a look at [the examples](https://github.com/run-llama/llama-agents/tree/main/examples).
## Use it as a library
The simplest path. `pip install llama-index-workflows`, define your workflow, and `await workflow.run(...)`. It has minimal dependencies and embeds anywhere: scripts, notebooks, servers. Durability is pluggable too: save and resume runs from a file, or connect to a database.
```python
from workflows import Workflow, step
from workflows.events import StartEvent, StopEvent
class HelloWorkflow(Workflow):
@step
async def greet(self, ev: StartEvent) -> StopEvent:
return StopEvent(result=f"Hello, {ev.name}")
```
See the [`llama-index-workflows` package](https://github.com/run-llama/llama-agents/tree/main/packages/llama-index-workflows) for more details.
## Mount it inside an app you already have
[`llama-agents-server`](https://developers.llamaindex.ai/python/llamaagents/workflows/deployment/) wraps any workflow as a REST API with streaming, persistence, and human-in-the-loop support. Drop it into an existing Starlette/FastAPI app, or run it standalone. [`llama-agents-client`](https://developers.llamaindex.ai/python/llamaagents/workflows/client/) is the matching async client for calling workflows from other services.
```python
from llama_agents.server import WorkflowServer
server = WorkflowServer()
server.add_workflow("greet", HelloWorkflow())
```
See the [`llama-agents-server` package](https://github.com/run-llama/llama-agents/tree/main/packages/llama-agents-server) and the [`llama-agents-client` package](https://github.com/run-llama/llama-agents/tree/main/packages/llama-agents-client) for more details.
## Or ship it as a deployable agent
[`llamactl`](https://developers.llamaindex.ai/python/llamaagents/llamactl/getting-started/) is the CLI for building and deploying agent apps end-to-end. Init from a starter, develop locally with hot reload, then deploy to LlamaParse, AWS Bedrock AgentCore, or your own infra. Agents can be headless workflow services, MCP servers, or full-stack apps with a UI.
```bash
uv tool install llamactl
llamactl init
llamactl serve
llamactl deployments create
```
See the [`llamactl` package](https://github.com/run-llama/llama-agents/tree/main/packages/llamactl) for more details.
## Works with [LlamaParse](https://developers.llamaindex.ai/python/cloud/)
The heavy document primitives (OCR, structured extraction, classification, splitting) are what LlamaParse is for. Plug them into your workflow as steps, let LlamaParse handle the document understanding, and keep your agent code focused on orchestration, business logic, and review.
Check out our [prebuilt templates with llamactl](https://developers.llamaindex.ai/python/llamaagents/llamactl/agent-templates/) to get started.
================================================
FILE: architecture-docs/build-api.md
================================================
# Build API
The Build API is a secure proxy service that enables deployment pods to access external resources without exposing credentials directly. It runs on port 8001 alongside the management API.
## Purpose
Deployment pods need access to private repositories and build artifacts, but can't safely store credentials. The Build API solves this by:
1. Authenticating pods using deployment-specific tokens
2. Proxying requests with appropriate credentials
3. Enforcing network isolation between pods and sensitive services
## Authentication
- Each deployment gets a unique token generated by the operator
- Pods authenticate to the build API using `Authorization: Bearer <token>` or HTTP Basic Auth
- Basic Auth supports using either username or password as the token (for Git compatibility)
- The build API validates tokens against Kubernetes CRDs
- Network policies restrict pods to only access the build API port
## Current Capabilities
### Git Repository Proxying
The Build API provides Git HTTP protocol support for secure repository access:
- **Protocol Support**: Handles all Git HTTP operations (GET/POST)
- directly forwards all requests to '/deployments/{deployment_id}' to the deployment's git repository
- Uses basic auth with the deployment token, and re-authenticates with the proxy git repo
## Future Capabilities
- **S3 Repositories**: Access private S3-based git repositories without complex pod permissions
- **Build Artifacts**: Push/pull container images and build artifacts
- **Multi-Provider Git**: GitLab, Bitbucket, and other git providers
- **Credential Rotation**: Automatic token refresh
## Security Benefits
- Pods don't need direct cloud credentials or git tokens
- Network policies isolate pods from management APIs
- Centralized credential management and audit logging
- Fine-grained access control per deployment
================================================
FILE: architecture-docs/control-loop.md
================================================
# Control Loop Architecture
The control loop is the core execution engine for workflows. It follows a **reducer pattern** — pure state transitions with side effects expressed as commands:
```
State + Tick --> (NewState, Commands)
```
[`control_loop.py`](../packages/llama-index-workflows/src/workflows/runtime/control_loop.py)
## Main Loop
```mermaid
flowchart TD
A[Initialize: queue StartEvent, schedule timeout] --> B[Drain tick buffer]
B --> C{Buffer empty?}
C -- No --> D[Reduce tick --> state + commands]
D --> E[Execute commands]
E --> B
C -- Yes --> F[Wait for next completion]
F --> G{What completed?}
G -- Timeout --> H[Pop due scheduled ticks into buffer]
G -- External tick --> I[Add to buffer]
G -- Worker result --> J[Add TickStepResult to buffer]
H --> B
I --> B
J --> B
```
1. **Initialize** — Queue `StartEvent`, schedule workflow timeout, rewind any in-progress work from a prior run.
2. **Drain tick buffer** — Process all queued ticks synchronously. Each tick runs through the reducer and its commands execute before the next tick.
3. **Wait for next completion** — Build a task set (worker tasks + one pull task), then wait for the first to complete. Workers have priority over pull tasks.
4. **Process completed task** — Route the result back into the tick buffer and loop.
## Ticks and Commands
**Ticks** are inputs to the reducer. They represent things that happen: events arriving, steps completing, cancellation requests, timeouts, and publish requests from steps. Each tick type dispatches to a dedicated reducer function.
[`types/ticks.py`](../packages/llama-index-workflows/src/workflows/runtime/types/ticks.py) — all tick types
**Commands** are outputs from the reducer — the side effects the loop executes. They represent actions to take: spawning step workers, queuing events (with optional delays), completing or failing the run, and publishing events to the external stream.
[`types/commands.py`](../packages/llama-index-workflows/src/workflows/runtime/types/commands.py) — all command types
## Runtime Integration
The control loop is runtime-agnostic. It talks to the outside world exclusively through `InternalRunAdapter` (see [core-overview.md — Runtime and Adapters](./core-overview.md#runtime-and-adapters)). This is the extension point — runtime decorators wrap the adapter to add behavior like tick persistence, idle detection, or event recording.
```mermaid
sequenceDiagram
participant CL as Control Loop
participant A as InternalRunAdapter
participant Ext as External (handler/client)
Note over CL: Main loop iteration
CL->>A: wait_receive() [pull task]
Ext-->>A: send_event() delivers tick
A-->>CL: WaitResultTick
CL->>CL: reduce tick --> (state, commands)
CL->>A: on_tick(tick) [journaling hook]
Note over CL: Execute commands
CL->>A: write_to_event_stream(event)
CL->>CL: spawn worker task
CL->>A: wait_for_next_task(task_set, timeout)
A-->>CL: completed task (worker or pull)
```
[`plugin.py`](../packages/llama-index-workflows/src/workflows/runtime/types/plugin.py) — full adapter interface
## Key Design Decisions
- **Deterministic replay** — The reducer is pure. Adapters can record ticks and replay them to reconstruct state, and override time functions for deterministic timestamps.
- **Priority ordering** — Worker tasks complete before pull tasks, ensuring in-flight work finishes before accepting new external events.
- **Optimistic execution with retry** — Workers receive a snapshot of collected events. If new events arrive during execution, the worker re-runs with the updated snapshot.
- **State rehydration** — On resume, in-progress events move back to the queue and worker IDs reset, allowing clean restart from stored ticks.
- **Idle detection** — When all steps are waiting on external input, the loop publishes `WorkflowIdleEvent`. Runtime decorators can use this signal to release idle workflows from memory.
- **Retry-exhaustion hook** — The `StepWorkerFailed` branch of `_process_step_result_tick` routes a `StepFailedEvent` to a registered `@catch_error` handler. Handlers can be scoped (`@catch_error(for_steps=[...])`) or wildcard, with a per-handler `max_recoveries` budget tracked per event lineage in `recovery_counts: dict[str, int]` on `EventAttempt` / `TickAddEvent` / `CommandQueueEvent`. Routing consults `BrokerConfig.handler_for_step` and `BrokerConfig.catch_error_handlers`; when the count exceeds `max_recoveries` or no handler owns the step, the loop publishes a `WorkflowFailedEvent` carrying the live exception and fails the run. The live `Exception` rides on `EventAttempt` / `TickAddEvent` / `CommandQueueEvent` between retries — annotated with `SerializableException` where it crosses a pydantic serialization boundary — and is exposed to step bodies via `Context.retry_info()`.
================================================
FILE: architecture-docs/core-overview.md
================================================
# Core Architecture: Workflow, Context, and Runtime
## Overview
```mermaid
graph LR
subgraph Client ["Client (public API)"]
WR["Workflow.run()"]
WH[WorkflowHandler]
EC["Context\n(ExternalContext)"]
end
subgraph Runtime
EA[ExternalRunAdapter]
CL[Control Loop]
IA[InternalRunAdapter]
end
subgraph Worker ["Worker (per step)"]
IC["Context\n(InternalContext)"]
Steps[Step Functions]
end
WR -->|launches| CL
WH --- EA
EC --- EA
EA --- CL
CL --- IA
IA --- IC
IA --- Steps
```
The system has three zones. **Client** code calls `Workflow.run()` and interacts through `WorkflowHandler` and `Context`. The **Runtime** sits in the middle — the control loop drives execution, with `ExternalRunAdapter` and `InternalRunAdapter` as its boundaries. **Workers** are step functions that see `Context` with a different face (InternalContext).
The adapters are the key abstraction boundary. Everything on the client side goes through `ExternalRunAdapter`; everything on the worker side goes through `InternalRunAdapter`. The runtime is swappable by replacing or decorating these adapters.
## Workflow
Container for step definitions. `run()` selects a runtime, validates steps, and delegates to the runtime for execution.
[`workflow.py`](../packages/llama-index-workflows/src/workflows/workflow.py)
## Context Faces
Context presents different interfaces depending on execution phase. Internally it holds a `_face` field that transitions through three types:
```mermaid
graph LR
Pre[PreContext] -->|"_workflow_run()"| External[ExternalContext]
External -.->|"per step worker"| Internal[InternalContext]
```
| Face | When | Used By |
|------|------|---------|
| PreContext | Before `run()` | Setup code — configuration, serialization, state store init |
| ExternalContext | After `run()` | Handler / caller — sending events, streaming |
| InternalContext | During step execution | Step functions — collecting events, publishing to stream |
Each face wraps an adapter from the runtime. Public methods on Context check the current face and raise `ContextStateError` if called in the wrong phase.
[`context/`](../packages/llama-index-workflows/src/workflows/context/) — Context implementation and all face types
## Runtime and Adapters
The `Runtime` ABC uses a dual-adapter pattern. Each workflow run produces two adapters sharing a `run_id`:
```mermaid
graph TB
Runtime -->|"run_workflow()"| ExternalRunAdapter
Runtime -->|"get_internal_adapter()"| InternalRunAdapter
ExternalRunAdapter --- run_id
InternalRunAdapter --- run_id
```
The **InternalRunAdapter** is used by the control loop — it handles receiving ticks, publishing events, timing, and task coordination. The **ExternalRunAdapter** is used by the WorkflowHandler — it handles sending events in, streaming published events out, getting results, and cancellation.
Multiple base runtimes exist. `BasicRuntime` is the default in-memory asyncio runtime in the core package. `DBOSRuntime` provides durable distributed execution backed by a database. More runtimes can be added by implementing the `Runtime` ABC. Runtimes are also composable via decorators — see [server-architecture.md](./server-architecture.md#runtime-decorator-chain) for that pattern.
[`plugin.py`](../packages/llama-index-workflows/src/workflows/runtime/types/plugin.py) — Runtime ABC, InternalRunAdapter, ExternalRunAdapter
## Control Loop
The control loop is the core execution engine. It follows a reducer pattern where pure state transitions produce side effects as commands. The control loop is runtime-agnostic — it interacts with the outside world exclusively through `InternalRunAdapter`.
See [control-loop.md](./control-loop.md) for the full architecture.
## Event Flow
```mermaid
graph LR
subgraph "Events In (external to internal)"
H[WorkflowHandler] -->|send_event| EA[ExternalRunAdapter]
EA -->|receive queue| IA[InternalRunAdapter]
IA -->|tick| CL[Control Loop]
end
```
```mermaid
graph LR
subgraph "Events Out (internal to external)"
CL2[Control Loop] -->|command| IA2[InternalRunAdapter]
IA2 -->|publish queue| EA2[ExternalRunAdapter]
EA2 -->|stream_published_events| H2[WorkflowHandler]
end
```
## WorkflowHandler
Returned by `Workflow.run()`. The user-facing handle for a running workflow.
- `await handler` — blocks until StopEvent, returns the result
- `handler.stream_events()` — async iterator of published events (single consumption)
- `handler.send_event()` — send events into the running workflow
- `handler.cancel_run()` — graceful cancellation
[`handler.py`](../packages/llama-index-workflows/src/workflows/handler.py)
================================================
FILE: architecture-docs/overall-architecture.md
================================================
# Cloud Llama Deploy - Overall Architecture
This document outlines the architecture of the Cloud Llama Deploy system, which enables deployment and management of LlamaIndex workflows on Kubernetes.
## High-Level System Overview
The system consists of several interconnected components that work together to provide a complete deployment platform:
```mermaid
graph TD
CLI["CLI (llamactl)"] --> CP["Control Plane (FastAPI backend)"]
CP --> K8S["Kubernetes"]
K8S --> OP["Operator (Go)"]
OP --> POD["App Server (Python Pod)"]
OP -.-> CRD["LlamaDeployment CRDs"]
POD --> WF["User Workflows"]
```
## Component Details
### 1. Core Package (`llama-deploy-core`)
**Purpose**: Shared data models and schemas used across all components.
**Role**: Ensures consistent data structures across the entire system.
### 2. Control Plane (`llama-deploy-control-plane`)
**Purpose**: Main orchestration layer that manages deployments via Kubernetes.
**Components**:
- **K8s Client** (`k8s_client.py`): Interfaces with Kubernetes API to create/manage LlamaDeployment CRDs
- **Git Integration**: Clones repositories, validates Git refs, handles GitHub authentication
- **API Endpoints**: REST API for deployment and project management
**Flow**:
```mermaid
graph LR
UR["User Request"] --> CP["Control Plane API"]
CP --> KC["K8s Client"]
KC --> CRD["LlamaDeployment CRD"]
CRD --> K8S["Kubernetes"]
```
### 3. Kubernetes Operator (`operator/`)
**Purpose**: Kubernetes controller that reconciles LlamaDeployment custom resources.
**Key Components**:
- **CRD Definition**: `LlamaDeployment` custom resource with spec (repo URL, deployment file, git ref)
- **Controller**: Watches for LlamaDeployment changes and creates/updates Kubernetes resources
- **Reconciliation Loop**: Creates deployments, services, secrets, and ingresses
**Managed Resources**:
```mermaid
graph TD
CRD["LlamaDeployment CRD"] --> DEP["Deployment<br/>(API Server pod)"]
CRD --> SVC["Service<br/>(Load balancer)"]
CRD --> SEC["Secret<br/>(PAT tokens, env vars)"]
CRD --> SA["ServiceAccount"]
CRD --> ING["Ingress<br/>(optional)"]
```
**Phases**: `Syncing` → `Pending` → `Running` / `Failed` / `RollingOut`
### 4. App Server (`appserver`)
**Purpose**: Runtime environment that executes user workflows and provides APIs.
**Key Components**:
- **Deployment Manager**: Loads and manages workflow deployments from config
- **Workflow Execution**: Runs LlamaIndex workflows with session management
- **Source Managers**: Handle Git, local, and Docker sources for workflow code
- **API Endpoints**: REST and WebSocket APIs for interacting with workflows
**Configuration**:
- **Primary**: Embedded in `pyproject.toml` under `[tool.llamadeploy]`
- **Alternative**: `llama_deploy.toml` or `llama_deploy.yaml` with the same schema
Example (TOML in `pyproject.toml`):
```toml
[tool.llamadeploy]
name = "my-deployment"
app = "path.to.module:app"
[tool.llamadeploy.ui]
directory = "./ui"
```
### 5. CLI Tool (`llamactl`)
**Purpose**: Command-line interface for users to interact with the control plane.
```bash
llamactl environments use https://api.cloud.llamaindex.ai
llamactl auth login
llamactl auth token --project <PROJECT_ID>
llamactl auth logout
llamactl deployments template > deployment.yaml
llamactl deployments apply -f deployment.yaml
llamactl deployments create
llamactl deployments get
llamactl deployments get NAME
llamactl deployments edit NAME
llamactl deployments update NAME
llamactl deployments logs NAME --follow
```
## Component Interaction Flow
### Deployment Creation Flow
```mermaid
sequenceDiagram
participant User
participant CP as Control Plane
participant K8s as Kubernetes
participant Op as Operator
participant Pod as API Server Pod
User->>CP: Create deployment request
CP->>CP: Validate Git repository
CP->>K8s: Create LlamaDeployment CRD
K8s->>Op: CRD change detected
Op->>K8s: Create Deployment/Service/Secret
K8s->>Pod: Start API Server pod
Pod->>Pod: Clone workflow code
Pod->>Pod: Load workflow and expose APIs
Pod->>K8s: Update status
K8s->>CP: Status propagation
CP->>User: Deployment ready
```
### Data Flow
**Configuration**: Git Repo → Control Plane → LlamaDeployment CRD → Operator → API Server Pod
**Runtime**: User Request → API Server → Workflow Engine → Response
**Monitoring**: API Server → Prometheus Metrics | Operator → K8s Events → Status Updates
## Networking & Communication
- **External Access**: Ingress → Service → API Server Pod
- **Internal K8s**: Operator talks to K8s API server
- **Control Plane**: Communicates with K8s via client libraries
- **CLI**: HTTP calls to Control Plane API
- **Workflow APIs**: Direct HTTP/WebSocket to API Server pods
## Namespace Layout
Set `apps.namespace` to run the control plane + operator in the release
namespace and put `LlamaDeployment` CRs and their child resources (Deployments,
Pods, Services, Secrets, ServiceAccounts, ConfigMaps, Ingresses, NetworkPolicies,
build Jobs) in a separate namespace. Unset = everything in the release namespace.
CRs stay co-located with their children (cross-namespace owner references are
not allowed). Only `WATCH_NAMESPACE` (operator) and `KUBERNETES_NAMESPACE`
(control plane) point at the apps namespace; reconciler code is unchanged.
RBAC in split mode: apps-namespace Role with every rule except
`coordination.k8s.io/leases`, release-namespace Role with just that rule for
leader election. Unset collapses to one Role.
`imagePullSecrets` are not mirrored — provision them in the apps namespace, or
use node-level pull credentials.
================================================
FILE: architecture-docs/quick-reference.md
================================================
## Code Navigation Guide
### Entry Points & Main Classes
**Control Plane** (`packages/llama-deploy-control-plane/`)
- Entry: `src/llama_deploy/control_plane/main.py` - FastAPI app
- K8s management: `src/llama_deploy/control_plane/k8s_client.py` - `K8sClient` class
- API endpoints: `src/llama_deploy/control_plane/endpoints/deployments.py`, `projects.py`
**Operator** (`operator/`)
- Entry: `cmd/main.go` - `func main()`
- Controller: `internal/controller/llamadeployment_controller.go` - `LlamaDeploymentReconciler`
- CRD types: `api/v1/llamadeployment_types.go` - `LlamaDeploymentSpec`, `LlamaDeploymentStatus`
**API Server** (`packages/llama-deploy-appserver/`)
- Entry: `src/llama_deploy/appserver/__main__.py` or `main.py`
- Manager: `src/llama_deploy/appserver/deployment.py` - `Manager` class (orchestrates deployments)
- Deployment: `src/llama_deploy/appserver/deployment.py` - `Deployment` class (runs workflows)
- Config parser: `src/llama_deploy/appserver/deployment_config_parser.py` - `DeploymentConfig.from_yaml()`
- Routers: `src/llama_deploy/appserver/routers/deployments.py`, `status.py`
**CLI** (`packages/llamactl/`)
- Entry: `src/llama_deploy/cli/__init__.py` - `main()` function
- Client: `src/llama_deploy/cli/client.py` - control plane/project client helpers
- Commands: `src/llama_deploy/cli/commands/*` - Click command definitions
- Config: `src/llama_deploy/cli/config/_config.py` - `ConfigManager`, with env support
**Core Schemas** (`packages/llama-deploy-core/`)
- Base: `src/llama_deploy/core/schema/base.py` - `Base` model class
- Deployments: `src/llama_deploy/core/schema/deployments.py` - `DeploymentResponse`, `LlamaDeploymentSpec`
- Projects: `src/llama_deploy/core/schema/projects.py` - `ProjectSummary`
### Key Configuration Files
**Deployment Configuration (preferred)**: Embedded in `pyproject.toml` under `[tool.llamadeploy]`.
```toml
[tool.llamadeploy]
name = "my-deployment"
app = "path.to.module:app" # or use `workflows = { my_workflow = "path.to.module:workflow" }`
[tool.llamadeploy.ui]
directory = "./ui"
# Optional overrides:
# build_output_dir = "dist"
# package_manager = "pnpm"
# build_command = "build"
# serve_command = "dev"
# proxy_port = 4502
```
**Alternative**: `llama_deploy.toml` or `llama_deploy.yaml` with the same schema as `[tool.llamadeploy]`.
**Helm Chart**: `charts/llama-agents/values.yaml`
**Kubernetes CRD**: `operator/config/crd/bases/deploy.llamaindex.ai_llamadeployments.yaml`
**RBAC**: `operator/config/rbac/role.yaml`
### Key API Endpoints
**Control Plane** (port 8000):
- `POST /{project_id}/deployments` - Create deployment
- `GET /{project_id}/deployments` - List deployments
- `GET /{project_id}/deployments/{id}` - Get deployment details
- `POST /{project_id}/deployments/validate-repository` - Validate Git repo
**Build API** (port 8001, token auth required):
- `GET /health` - Health check
**API Server** (port 8080 in pod):
- `POST /deployments/{name}/tasks/run` - Execute workflow
- `GET /deployments/{name}/tasks/{task_id}/results` - Get task results
- `POST /deployments/{name}/sessions/create` - Create session
- `GET /health` - Health check
### CLI Commands Reference
```bash
llamactl environments get # List environments
llamactl environments use <URL> # Switch current environment
llamactl auth token --project <PROJECT_ID> # Create/select profile via API key
llamactl auth get # List profiles
llamactl auth use <NAME> # Switch profile
llamactl projects get # List projects
llamactl projects use <PROJECT_ID> # Switch active project
llamactl deployments template > deployment.yaml # Generate apply YAML
llamactl deployments apply -f deployment.yaml # Create or update from YAML
llamactl deployments create # Create new deployment in $EDITOR
llamactl deployments get # List deployments
llamactl deployments get NAME # Get deployment details
llamactl deployments edit NAME # Edit deployment in $EDITOR
llamactl deployments update NAME # Re-resolve current git ref and release it
llamactl deployments logs NAME --follow # Stream deployment logs
llamactl deployments delete NAME # Delete deployment
```
### Commands Reference
**Development Setup:**
```bash
uv sync --all-packages --all-extras # Install all dependencies including dev
uv run pre-commit run -a # Lint & format
uv run dev # Run all package tests
```
**Development Environment:**
```bash
uv run operator/dev.py up # Set up kind cluster and start development
uv run operator/dev.py down # Clean up deployed resources
uv run operator/dev.py down --delete # Delete the kind cluster
uv run operator/dev.py status # Show cluster status
```
**Operator Development (Makefile in `operator/`):**
```bash
make -C operator operator-build # Build operator binary
make -C operator operator-test # Run operator tests
make -C operator operator-manifests # Generate CRDs and RBAC
make -C operator operator-generate # Generate DeepCopy methods
```
### Key Constants & Defaults
- Default discovery order: `llama_deploy.toml` → `pyproject.toml` → `llama_deploy.yaml`
- API Server port: `8080`
- Control Plane port: `8000`
- Build API port: `8001`
- Kubernetes namespace: `llama-agents` (default)
- CRD group: `deploy.llamaindex.ai`
- Container image: `llamaindex/llama-deploy:main-autodeploy`
================================================
FILE: architecture-docs/server-architecture.md
================================================
# Server Architecture
## Overview
The server wraps the core workflow engine (see [core-overview.md](./core-overview.md)) with HTTP access, persistence, and durability. Components are layered with clear boundaries:
```mermaid
graph TD
Client -->|HTTP| API["_WorkflowAPI"]
API --> Service["_WorkflowService"]
Service --> Runtime["Runtime decorator chain"]
Runtime --> ControlLoop["Control Loop"]
Runtime -.->|reads/writes| Store["WorkflowStore"]
Service -.->|queries| Store
API -.->|subscribes events| Store
```
The **store** is the shared persistence layer — the runtime writes to it, the service queries it, and the API streams from it.
## Components
**`WorkflowServer`** — Entry point. Assembles the runtime chain, service, and API into a Starlette app. Registers workflows.
[`server.py`](../packages/llama-agents-server/src/llama_agents/server/server.py)
**`_WorkflowAPI`** — Starlette routes. Translates HTTP requests into service calls and streams events from the store to clients via SSE.
[`_api.py`](../packages/llama-agents-server/src/llama_agents/server/_api.py)
**`_WorkflowService`** — Application logic. Starts workflows, manages handler lifecycle, coordinates event sending and cancellation. Bridges the API to the runtime.
[`_service.py`](../packages/llama-agents-server/src/llama_agents/server/_service.py)
**Runtime decorators** — A chain of decorators that add server concerns (event recording, tick persistence, idle release, etc.) on top of a base runtime. See the section below.
[`_runtime/`](../packages/llama-agents-server/src/llama_agents/server/_runtime/) — standard server decorators
**`AbstractWorkflowStore`** — Persistence contract shared by all layers above.
[`abstract_workflow_store.py`](../packages/llama-agents-server/src/llama_agents/server/_store/abstract_workflow_store.py)
## Runtime Decorator Chain
Runtimes compose via decoration. Each decorator wraps a `Runtime` and its adapters (see [core-overview.md — Runtime and Adapters](./core-overview.md#runtime-and-adapters)), overriding only the methods it needs to add a specific concern — event recording to a store, tick persistence for replay, idle detection and memory release, etc.
```mermaid
graph LR
Outer["Server decorators\n(one per concern)"] -->|wraps| Inner["Base Runtime\n(BasicRuntime, DBOSRuntime, etc.)"]
```
`WorkflowServer` assembles a default decorator chain on top of whatever base runtime is provided. The base runtime is swappable — pass `runtime=` to `WorkflowServer` to use a different one (BasicRuntime, DBOSRuntime, or a custom implementation). See `server.py` for how the default chain is assembled.
**Writing a decorator:** Extend `BaseRuntimeDecorator` and optionally `BaseInternalRunAdapterDecorator` / `BaseExternalRunAdapterDecorator`. These forward all methods to the inner runtime/adapter — override only what you need.
[`runtime_decorators.py`](../packages/llama-agents-server/src/llama_agents/server/_runtime/runtime_decorators.py)
## Persistence (WorkflowStore)
The store is the system's source of truth for anything that survives a restart or an idle-release cycle. All layers depend on it:
| What's stored | Purpose |
|---|---|
| Handler records | Lifecycle tracking (status, timestamps, result) |
| Event log | Resumable event streaming to clients |
| Ticks | Rebuild workflow state after idle release or restart |
| State stores | Persistent key-value state per run |
Two implementations:
- **`MemoryWorkflowStore`** — In-process dicts. No persistence across restarts.
[`memory_workflow_store.py`](../packages/llama-agents-server/src/llama_agents/server/_store/memory_workflow_store.py)
- **`SqliteWorkflowStore`** — SQLite-backed. Survives restarts.
[`sqlite_workflow_store.py`](../packages/llama-agents-server/src/llama_agents/server/_store/sqlite/sqlite_workflow_store.py)
## Resumable Event Streams
Events flow from step functions to clients through the store, which acts as both a write-ahead log and a subscription source:
```mermaid
graph LR
Step["Step function"] -->|"ctx.write_event_to_stream()"| IA["InternalRunAdapter"]
IA -->|decorator intercepts| Store["WorkflowStore"]
Store -->|"subscribe_events(cursor)"| API["_WorkflowAPI"]
API -->|SSE| Client
```
The store assigns each event a monotonic **sequence number**. Clients track their position via this cursor:
1. Client connects, receives events as SSE with `id: {sequence}`
2. Client disconnects (network drop, restart, etc.)
3. Client reconnects with `Last-Event-ID: {last_seen_sequence}`
4. Store replays all events after that sequence, then continues live
This means the API layer never needs to hold event history in memory — it just opens a `subscribe_events(after_sequence=cursor)` iterator from the store each time a client connects.
A special `"now"` cursor skips all historical events and streams only new ones.
## Server Lifecycle
**Start:** `WorkflowServer.start()` queries the store for handlers with `status=running` that aren't idle, and resumes each by rebuilding context from stored ticks.
**Stop:** `WorkflowServer.stop()` aborts all active control loops. Handler records remain in the store — they'll resume on next start.
**Idle release:** When the [control loop detects](./control-loop.md#key-design-decisions) all steps are waiting on external input, it publishes `WorkflowIdleEvent`. Runtime decorators can use this signal to release the workflow from memory. When a new event arrives for that workflow, it reloads from ticks transparently.
================================================
FILE: charts/AGENTS.md
================================================
## Helm Chart
Makefile lives in `operator/`. Run targets with `make -C operator <target>` from repo root, or `make <target>` from within `operator/`.
Setup:
- Ensure kind context: `make -C operator kube-ensure-kind-context`
- Install helm-unittest: `make -C operator helm-unittest-install`
- Install Prometheus Operator CRDs: `make -C operator helm-crds-prom-operator`
Checks:
- Lint (default values): `make -C operator helm-lint`
- Lint (dev values): `make -C operator helm-lint-dev`
- Template (default/dev): `make -C operator helm-template` / `make -C operator helm-template-dev`
- Server-side dry-run (default/dev): `make -C operator helm-dry-run` / `make -C operator helm-dry-run-dev`
- Run Helm unit tests: `make -C operator helm-unittest`
================================================
FILE: charts/llama-agents/.helmignore
================================================
# Patterns to ignore when building packages.
.DS_Store
*.swp
*.bak
*.tmp
*~
.git
.gitignore
# Node modules symlink pulls in operator binaries which exceed Helm's 5MB file limit
node_modules
================================================
FILE: charts/llama-agents/CHANGELOG.md
================================================
# llama-agents
## 0.12.3
### Patch Changes
- Updated dependencies [c3fac21]
- llama-agents-control-plane@0.12.2
- llama-agents-appserver@0.11.4
## 0.12.2
### Patch Changes
- Updated dependencies [463c79d]
- llama-agents-control-plane@0.12.1
- llama-agents-appserver@0.11.3
## 0.12.1
### Patch Changes
- Updated dependencies [2280e04]
- llama-agents-control-plane@0.12.0
- llama-agents-appserver@0.11.2
## 0.12.0
### Minor Changes
- 3ced443: Optional s3proxy sidecar for non-AWS object storage, plus inline-or-BYO creds on both the sidecar and control plane S3.
### Patch Changes
- 9eda189: Document the compatible `llama-agents-crds` chart version via a new `crds.version` values field, auto-synced at release time and surfaced in the README.
## 0.11.1
### Patch Changes
- Updated dependencies [916b157]
- llama-agents-appserver@0.11.1
## 0.11.0
### Minor Changes
- de5bedc: Add `apps.namespace` to run `LlamaDeployment` CRs and their child resources in a separate namespace from the operator + control plane. Unset = everything in the release namespace.
### Patch Changes
- facbac4: New network policy values: `extraEgressRules`, configurable DNS selectors, and `blockPrivateRanges` toggle for reaching in-cluster services without disabling the policy.
- Updated dependencies [facbac4]
- Updated dependencies [64579a9]
- llama-agents-appserver@0.11.0
- llama-agents-control-plane@0.11.1
## 0.10.12
### Patch Changes
- Updated dependencies [fdc1c48]
- llama-agents-operator@0.11.1
## 0.10.11
### Patch Changes
- Updated dependencies [e8b8f47]
- llama-agents-control-plane@0.11.0
- llama-agents-appserver@0.10.5
## 0.10.10
### Patch Changes
- Updated dependencies [7ad3049]
- llama-agents-control-plane@0.10.5
- llama-agents-appserver@0.10.4
## 0.10.9
### Patch Changes
- Updated dependencies [286c91a]
- llama-agents-appserver@0.10.3
## 0.10.8
### Patch Changes
- Updated dependencies [740ee9e]
- llama-agents-control-plane@0.10.4
## 0.10.7
### Patch Changes
- llama-agents-appserver@0.10.2
- llama-agents-control-plane@0.10.3
## 0.10.6
### Patch Changes
- Updated dependencies [3f12660]
- llama-agents-control-plane@0.10.2
- llama-agents-appserver@0.10.1
## 0.10.5
### Patch Changes
- Updated dependencies [3e2e7b8]
- llama-agents-appserver@0.10.0
- llama-agents-operator@0.11.0
## 0.10.4
### Patch Changes
- Updated dependencies [46f2675]
- llama-agents-control-plane@0.10.1
- llama-agents-appserver@0.9.1
## 0.10.3
### Patch Changes
- Updated dependencies [782939b]
- llama-agents-operator@0.10.2
## 0.10.2
### Patch Changes
- Updated dependencies [de92a8b]
- llama-agents-operator@0.10.1
## 0.10.1
### Patch Changes
- Updated dependencies [58e7942]
- Updated dependencies [ea577a1]
- llama-agents-control-plane@0.10.0
- llama-agents-appserver@0.9.0
- llama-agents-operator@0.10.0
## 0.10.0
### Minor Changes
- 7025b30: Rename Helm chart from cloud-llama-deploy-chart to llama-agents-chart with standardized resource naming
================================================
FILE: charts/llama-agents/Chart.yaml
================================================
apiVersion: v2
name: llama-agents
description: A Helm chart for deploying Llama Agents (control plane + operator)
type: application
version: "0.12.3"
================================================
FILE: charts/llama-agents/README.md
================================================
# llama-agents
A Helm chart for deploying Llama Agents (control plane + operator)
## Architecture
This chart deploys two components:
- **Control plane** — API server for managing deployments, builds, and backups
- **Operator** — Kubernetes controller that reconciles `LlamaDeployment` custom resources into running pods
CRDs (`LlamaDeployment`, `LlamaDeploymentTemplate`) are included in the chart's `crds/` directory and installed automatically on first `helm install`. They are **not** modified on upgrade or removed on uninstall (standard Helm CRD behavior).
For managed CRD upgrades, use the companion [`llama-agents-crds`](../llama-agents-crds/) chart. Each release of `llama-agents` pins the compatible CRD chart version in `crds.version` (see the values table below) — use that version when installing or upgrading the CRD chart.
## Prerequisites
- Kubernetes 1.26+
- Helm 3.x
- S3-compatible object storage (for build artifacts and backups)
## Installation
### Fresh install
```bash
helm install llama-agents oci://docker.io/llamaindex/llama-agents \
--set controlPlane.objectStorage.s3.bucket=my-bucket \
--set controlPlane.objectStorage.s3.region=us-east-1
```
CRDs are installed automatically from the `crds/` directory.
### With separate CRD management
If you prefer explicit CRD lifecycle management (recommended for production):
```bash
# Install CRD chart first — pin to the compatible version from `crds.version` below
helm install llama-agents-crds oci://docker.io/llamaindex/llama-agents-crds --version <crds.version>
# Install main chart, skipping bundled CRDs
helm install llama-agents oci://docker.io/llamaindex/llama-agents --skip-crds \
--set controlPlane.objectStorage.s3.bucket=my-bucket
```
## Upgrading
```bash
# If CRD schema has changed, upgrade CRDs first — pin to `crds.version` from the values table
helm upgrade --install llama-agents-crds oci://docker.io/llamaindex/llama-agents-crds --version <crds.version>
# Then upgrade the main chart
helm upgrade llama-agents oci://docker.io/llamaindex/llama-agents
```
## Apps namespace
Set `apps.namespace` to isolate `LlamaDeployment` CRs and their child resources
in a separate namespace. The operator + control plane stay in the release
namespace and target the apps namespace for all app resources.
```bash
kubectl create namespace llama-agents-apps
helm install llama-agents oci://docker.io/llamaindex/llama-agents \
--namespace llama-agents \
--set apps.namespace=llama-agents-apps \
--set controlPlane.objectStorage.s3.bucket=my-bucket
```
`imagePullSecrets` are not mirrored — provision them in the apps namespace
yourself, or use node-level pull credentials. Switching modes on an existing
install requires draining and recreating `LlamaDeployment` CRs.
## Non-S3 object storage
Set `s3proxy.enabled=true` to run an
[s3proxy](https://github.com/gaul/s3proxy) sidecar alongside the control
plane. When enabled, `S3_ENDPOINT_URL` points at the sidecar on localhost and
`S3_UNSIGNED` defaults to `true`; explicit overrides still win.
Credentials take one of two forms:
```yaml
# Inline — chart renders llama-agents-s3proxy Secret
s3proxy:
enabled: true
config:
JCLOUDS_PROVIDER: <provider>
JCLOUDS_IDENTITY: <id>
JCLOUDS_CREDENTIAL: <secret>
# ...any other JCLOUDS_* vars the backend needs
```
```yaml
# BYO — point at an existing Secret whose keys are the sidecar env vars
s3proxy:
enabled: true
secret: my-existing-s3proxy-secret
```
Pick `JCLOUDS_*` vars from the
[s3proxy storage-backend examples](https://github.com/gaul/s3proxy/wiki/Storage-backend-examples).
If both `config` and `secret` are set, `secret` wins.
## Control plane S3 credentials
Three mutually-exclusive forms, listed in precedence order:
```yaml
# BYO — envFroms an existing Secret (keys: S3_ACCESS_KEY, S3_SECRET_KEY)
controlPlane:
objectStorage:
s3:
bucket: my-bucket
secret: my-s3-creds
```
```yaml
# Inline — chart renders llama-agents-controlplane-s3 Secret
controlPlane:
objectStorage:
s3:
bucket: my-bucket
accessKey: AKIA...
secretKey: ...
```
```yaml
# Neither — control plane relies on IRSA / workload identity
controlPlane:
objectStorage:
s3:
bucket: my-bucket
```
Partial inline (one of `accessKey`/`secretKey` set) is a template error.
## Values
### Metrics
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| metrics.enabled | bool | `false` | Enable Prometheus ServiceMonitors |
| metrics.scrapeInterval | string | `"30s"` | Scrape interval for ServiceMonitors |
| metrics.scrapeTimeout | string | `"10s"` | Scrape timeout for ServiceMonitors |
| metrics.additionalMonitorLabels | object | `{}` | Extra labels added to ServiceMonitors for Prometheus discovery (e.g., `release: prometheus`) |
### Images
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| images.controlPlane.repository | string | `"llamaindex/llama-agents-control-plane"` | Control plane image repository |
| images.controlPlane.tag | string | `"0.12.2"` | Control plane image tag |
| images.controlPlane.pullPolicy | string | `"IfNotPresent"` | Control plane image pull policy |
| images.operator.repository | string | `"llamaindex/llama-agents-operator"` | Operator image repository |
| images.operator.tag | string | `"0.11.1"` | Operator image tag |
| images.operator.pullPolicy | string | `"IfNotPresent"` | Operator image pull policy |
| images.appserver.repository | string | `"llamaindex/llama-agents-appserver"` | Appserver image repository (used by operator for managed pods) |
| images.appserver.tag | string | `"0.11.4"` | Appserver image tag |
| images.appserver.pullPolicy | string | `"IfNotPresent"` | Appserver image pull policy |
| images.nginx.repository | string | `"nginxinc/nginx-unprivileged"` | Nginx sidecar image repository |
| images.nginx.tag | string | `"1.27-alpine"` | Nginx sidecar image tag |
| images.nginx.pullPolicy | string | `"IfNotPresent"` | Nginx sidecar image pull policy |
### Control Plane
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| controlPlane.replicas | int | `1` | Number of control plane replicas |
| controlPlane.container.port | int | `8000` | Control plane API port |
| controlPlane.container.env | list | `[]` | Extra environment variables for the control plane container |
| controlPlane.container.envFrom | list | `[]` | Extra envFrom sources (secretRef, configMapRef) for the control plane container |
| controlPlane.container.resources | object | `{requests: {cpu: 100m, memory: 256Mi, ephemeral-storage: 500Mi}}` | Resource requests/limits for the control plane container |
| controlPlane.container.startupProbe | object | `{}` | Startup probe configuration |
| controlPlane.container.livenessProbe | object | `{}` | Liveness probe configuration |
| controlPlane.deployment.annotations | object | `{}` | Annotations for the control plane Deployment |
| controlPlane.deployment.podAnnotations | object | `{}` | Annotations for the control plane pod template |
| controlPlane.service.type | string | `"ClusterIP"` | Control plane Service type |
| controlPlane.service.port | int | `80` | Control plane Service port |
| controlPlane.service.annotations | object | `{}` | Annotations for the control plane Service |
| controlPlane.service.metricsPath | string | `"/metrics"` | Metrics path for the control plane Service |
| controlPlane.buildApi.port | int | `8001` | Build API port (git proxy and token validation) |
| controlPlane.buildApi.metricsPath | string | `"/metrics"` | Metrics path for the build API |
| controlPlane.hpa.enabled | bool | `false` | Enable HPA for the control plane |
| controlPlane.hpa.minReplicas | int | `1` | Minimum replicas |
| controlPlane.hpa.maxReplicas | int | `3` | Maximum replicas |
| controlPlane.hpa.targetCPUUtilizationPercentage | int | `80` | Target average CPU utilization percentage |
### Object Storage
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| controlPlane.objectStorage.s3.endpointUrl | string | `""` | S3 endpoint URL (leave empty for AWS) |
| controlPlane.objectStorage.s3.bucket | string | `""` | S3 bucket name (**required**) |
| controlPlane.objectStorage.s3.region | string | `""` | S3 region |
| controlPlane.objectStorage.s3.unsigned | string | `nil` | Send S3 requests unsigned (no Authorization header). Leave unset/`false` for any auth-requiring S3-compatible backend. For non-S3 object/blob storage, see `s3proxy.enabled` below — when that's on, this defaults to `true` unless you override it here. |
| controlPlane.objectStorage.s3.accessKey | string | `""` | Inline S3 access key. When set alongside `secretKey`, the chart renders a Secret and wires it into the control plane. Mutually exclusive with `s3.secret` (which wins silently). |
| controlPlane.objectStorage.s3.secretKey | string | `""` | Inline S3 secret key. Must be set together with `accessKey`; partial setting is an error. |
| controlPlane.objectStorage.s3.secret | string | `""` | Name of an existing K8s Secret supplying `S3_ACCESS_KEY` and `S3_SECRET_KEY`. Takes precedence over `accessKey`/`secretKey`. |
| controlPlane.objectStorage.buildKeyPrefix | string | `"builds"` | Key prefix for build artifacts in the bucket |
| controlPlane.objectStorage.backupKeyPrefix | string | `"backups"` | Key prefix for backup archives in the bucket |
| controlPlane.objectStorage.codeRepoKeyPrefix | string | `"git"` | Key prefix for code repositories in the bucket |
| controlPlane.objectStorage.backupEncryptionSecretRef | string | `""` | K8s Secret name containing `BACKUP_ENCRYPTION_PASSWORD` |
### Apps
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| apps.namespace | string | `""` | Namespace where LlamaDeployment CRs and all operator-managed child resources live. Empty = release namespace. When set, the operator + control plane stay in the release namespace and target this namespace for all app resources. |
### CRDs
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| crds.version | string | `"0.7.2"` | Compatible `llama-agents-crds` chart version for this release. Documentation only; not read by templates. Auto-synced at release time. |
### Operator
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| operator.enabled | bool | `true` | Deploy the operator |
| operator.replicas | int | `1` | Number of operator replicas |
| operator.annotations | object | `{}` | Annotations for the operator Deployment |
| operator.podAnnotations | object | `{}` | Annotations for the operator pod template |
| operator.defaultAppRequests.cpu | string | `"750m"` | Default CPU request for managed app containers |
| operator.defaultAppRequests.memory | string | `"2Gi"` | Default memory request for managed app containers |
| operator.defaultAppLimits.cpu | string | `""` | Default CPU limit for managed app containers (empty = no limit) |
| operator.defaultAppLimits.memory | string | `"4096Mi"` | Default memory limit for managed app containers |
| operator.resources | object | `{limits: {cpu: 500m, memory: 128Mi}, requests: {cpu: 10m, memory: 64Mi}}` | Resource requests/limits for the operator container |
| operator.maxConcurrentRollouts | int | `10` | Max simultaneous LlamaDeployment rollouts (0 = unlimited) |
| operator.maxDeployments | int | `0` | Max active LlamaDeployments per namespace (0 = unlimited) |
| operator.env | list | `[]` | Extra environment variables for the operator container |
| operator.rolloutTimeoutSeconds | int | `1800` | Rollout timeout in seconds for managed deployments |
| operator.llamaDeploymentTemplate.enabled | bool | `false` | Create a default LlamaDeploymentTemplate in the namespace |
| operator.llamaDeploymentTemplate.name | string | `"default"` | Template resource name |
| operator.llamaDeploymentTemplate.metadata | object | `{}` | Metadata for the template (labels, annotations) |
| operator.llamaDeploymentTemplate.spec | object | `{"podSpec":{}}` | Template spec (podSpec with nodeSelector, tolerations, affinity, container overrides) |
| operator.hpa.enabled | bool | `false` | Enable HPA for the operator |
| operator.hpa.minReplicas | int | `1` | Minimum replicas |
| operator.hpa.maxReplicas | int | `3` | Maximum replicas |
| operator.hpa.targetCPUUtilizationPercentage | int | `80` | Target average CPU utilization percentage |
### Local Development
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| localDev.enabled | bool | `false` | Enable local dev ingress for deployed apps |
| localDev.ingressDomain | string | `"127.0.0.1.nip.io"` | Ingress domain for local dev |
### RBAC
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| rbac.create | bool | `true` | Create Role and RoleBinding |
| rbac.roleAnnotations | object | `{}` | Annotations for the Role |
| rbac.roleBindingAnnotations | object | `{}` | Annotations for the RoleBinding |
### Service Account
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| serviceAccount.create | bool | `true` | Create a ServiceAccount |
| serviceAccount.name | string | `"llama-agents"` | ServiceAccount name |
| serviceAccount.annotations | object | `{}` | Annotations for the ServiceAccount |
### s3proxy
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| s3proxy.enabled | bool | `false` | Run an [s3proxy](https://github.com/gaul/s3proxy) sidecar alongside the control plane to translate S3 API calls to non-AWS backends (Azure Blob, GCS, etc.). When enabled, `S3_ENDPOINT_URL` and `S3_UNSIGNED` default to localhost and `true` unless explicitly overridden. Fill in `s3proxy.config` with the JCLOUDS_* environment variables for your cloud. |
| s3proxy.image | string | `"docker.io/andrewgaul/s3proxy:3.1.0"` | s3proxy container image |
| s3proxy.imagePullPolicy | string | `"IfNotPresent"` | s3proxy image pull policy |
| s3proxy.containerPort | int | `8080` | Port s3proxy listens on inside the pod (control plane reaches it over localhost) |
| s3proxy.logLevel | string | `"info"` | s3proxy log level (passed as LOG_LEVEL and S3PROXY_LOG_LEVEL) |
| s3proxy.securityContext | object | `{}` | securityContext for the s3proxy container |
| s3proxy.resources | object | `{requests: {cpu: 50m, memory: 256Mi}, limits: {cpu: 500m, memory: 512Mi}}` | Resource requests/limits for the s3proxy sidecar |
| s3proxy.config | object | `{}` | Raw passthrough to the s3proxy Secret. Keys become environment variables on the sidecar. Typically `JCLOUDS_PROVIDER`, `JCLOUDS_IDENTITY`, `JCLOUDS_CREDENTIAL`, `JCLOUDS_ENDPOINT`, `JCLOUDS_REGION`. See https://github.com/gaul/s3proxy/wiki/Storage-backend-examples. |
| s3proxy.secret | string | `""` | Name of an existing K8s Secret supplying the sidecar's env vars. Takes precedence over `config` (which is skipped if this is set). |
### Network Policy
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| networkPolicy.enabled | bool | `true` | Enable egress NetworkPolicy for operator-managed pods |
| networkPolicy.extraMatchExpressions | list | `[]` | Additional pod selector matchExpressions |
| networkPolicy.extraEgressRules | list | `[]` | Extra egress rules appended to the NetworkPolicy |
| networkPolicy.blockPrivateRanges | bool | `true` | Block private IP ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) in internet egress rule |
| networkPolicy.dns.namespaceSelector | object | `{"kubernetes.io/metadata.name":"kube-system"}` | Namespace selector for DNS pods. Defaults to kube-system |
| networkPolicy.dns.podSelector | object | `{"k8s-app":"kube-dns"}` | Pod selector for DNS pods. Defaults to kube-dns |
## Uninstalling
```bash
helm uninstall llama-agents
```
CRDs are **not** removed on uninstall. To remove them (this deletes all LlamaDeployment resources):
```bash
kubectl delete crd llamadeployments.deploy.llamaindex.ai llamadeploymenttemplates.deploy.llamaindex.ai
```
================================================
FILE: charts/llama-agents/README.md.gotmpl
================================================
{{ template "chart.header" . }}
{{ template "chart.description" . }}
## Architecture
This chart deploys two components:
- **Control plane** — API server for managing deployments, builds, and backups
- **Operator** — Kubernetes controller that reconciles `LlamaDeployment` custom resources into running pods
CRDs (`LlamaDeployment`, `LlamaDeploymentTemplate`) are included in the chart's `crds/` directory and installed automatically on first `helm install`. They are **not** modified on upgrade or removed on uninstall (standard Helm CRD behavior).
For managed CRD upgrades, use the companion [`llama-agents-crds`](../llama-agents-crds/) chart. Each release of `llama-agents` pins the compatible CRD chart version in `crds.version` (see the values table below) — use that version when installing or upgrading the CRD chart.
## Prerequisites
- Kubernetes 1.26+
- Helm 3.x
- S3-compatible object storage (for build artifacts and backups)
## Installation
### Fresh install
```bash
helm install llama-agents oci://docker.io/llamaindex/llama-agents \
--set controlPlane.objectStorage.s3.bucket=my-bucket \
--set controlPlane.objectStorage.s3.region=us-east-1
```
CRDs are installed automatically from the `crds/` directory.
### With separate CRD management
If you prefer explicit CRD lifecycle management (recommended for production):
```bash
# Install CRD chart first — pin to the compatible version from `crds.version` below
helm install llama-agents-crds oci://docker.io/llamaindex/llama-agents-crds --version <crds.version>
# Install main chart, skipping bundled CRDs
helm install llama-agents oci://docker.io/llamaindex/llama-agents --skip-crds \
--set controlPlane.objectStorage.s3.bucket=my-bucket
```
## Upgrading
```bash
# If CRD schema has changed, upgrade CRDs first — pin to `crds.version` from the values table
helm upgrade --install llama-agents-crds oci://docker.io/llamaindex/llama-agents-crds --version <crds.version>
# Then upgrade the main chart
helm upgrade llama-agents oci://docker.io/llamaindex/llama-agents
```
## Apps namespace
Set `apps.namespace` to isolate `LlamaDeployment` CRs and their child resources
in a separate namespace. The operator + control plane stay in the release
namespace and target the apps namespace for all app resources.
```bash
kubectl create namespace llama-agents-apps
helm install llama-agents oci://docker.io/llamaindex/llama-agents \
--namespace llama-agents \
--set apps.namespace=llama-agents-apps \
--set controlPlane.objectStorage.s3.bucket=my-bucket
```
`imagePullSecrets` are not mirrored — provision them in the apps namespace
yourself, or use node-level pull credentials. Switching modes on an existing
install requires draining and recreating `LlamaDeployment` CRs.
## Non-S3 object storage
Set `s3proxy.enabled=true` to run an
[s3proxy](https://github.com/gaul/s3proxy) sidecar alongside the control
plane. When enabled, `S3_ENDPOINT_URL` points at the sidecar on localhost and
`S3_UNSIGNED` defaults to `true`; explicit overrides still win.
Credentials take one of two forms:
```yaml
# Inline — chart renders llama-agents-s3proxy Secret
s3proxy:
enabled: true
config:
JCLOUDS_PROVIDER: <provider>
JCLOUDS_IDENTITY: <id>
JCLOUDS_CREDENTIAL: <secret>
# ...any other JCLOUDS_* vars the backend needs
```
```yaml
# BYO — point at an existing Secret whose keys are the sidecar env vars
s3proxy:
enabled: true
secret: my-existing-s3proxy-secret
```
Pick `JCLOUDS_*` vars from the
[s3proxy storage-backend examples](https://github.com/gaul/s3proxy/wiki/Storage-backend-examples).
If both `config` and `secret` are set, `secret` wins.
## Control plane S3 credentials
Three mutually-exclusive forms, listed in precedence order:
```yaml
# BYO — envFroms an existing Secret (keys: S3_ACCESS_KEY, S3_SECRET_KEY)
controlPlane:
objectStorage:
s3:
bucket: my-bucket
secret: my-s3-creds
```
```yaml
# Inline — chart renders llama-agents-controlplane-s3 Secret
controlPlane:
objectStorage:
s3:
bucket: my-bucket
accessKey: AKIA...
secretKey: ...
```
```yaml
# Neither — control plane relies on IRSA / workload identity
controlPlane:
objectStorage:
s3:
bucket: my-bucket
```
Partial inline (one of `accessKey`/`secretKey` set) is a template error.
{{ template "chart.valuesSection" . }}
## Uninstalling
```bash
helm uninstall llama-agents
```
CRDs are **not** removed on uninstall. To remove them (this deletes all LlamaDeployment resources):
```bash
kubectl delete crd llamadeployments.deploy.llamaindex.ai llamadeploymenttemplates.deploy.llamaindex.ai
```
================================================
FILE: charts/llama-agents/crds/deploy.llamaindex.ai_llamadeployments.yaml
================================================
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.18.0
name: llamadeployments.deploy.llamaindex.ai
spec:
group: deploy.llamaindex.ai
names:
kind: LlamaDeployment
listKind: LlamaDeploymentList
plural: llamadeployments
singular: llamadeployment
scope: Namespaced
versions:
- additionalPrinterColumns:
- jsonPath: .spec.projectId
name: Project ID
type: string
- jsonPath: .spec.displayName
name: Name
type: string
- jsonPath: .spec.repoUrl
name: Repo
type: string
- jsonPath: .status.phase
name: Phase
type: string
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
name: v1
schema:
openAPIV3Schema:
description: LlamaDeployment is the Schema for the llamadeployments API.
properties:
apiVersion:
description: |-
APIVersion defines the versioned schema of this representation of an object.
Servers should convert recognized schemas to the latest internal value, and
may reject unrecognized values.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
type: string
kind:
description: |-
Kind is a string value representing the REST resource this object represents.
Servers may infer this from the endpoint the client submits requests to.
Cannot be updated.
In CamelCase.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
type: string
metadata:
type: object
spec:
description: LlamaDeploymentSpec defines the desired state of LlamaDeployment.
properties:
buildGeneration:
description: |-
BuildGeneration is a monotonically increasing counter that forces a new
build when incremented, even if all other inputs (gitSha, imageTag, etc.)
are unchanged. This allows retrying a failed build caused by transient
errors (e.g. network failures) without requiring a new git commit.
format: int64
type: integer
deploymentFilePath:
default: llama_deployment.yml
description: DeploymentFilePath is the path to the deployment file
within the repository
type: string
displayName:
description: DisplayName is the user-facing deployment label
type: string
gitRef:
description: GitRef is the git reference (commit SHA, branch, or tag)
to deploy
type: string
gitSha:
description: A resolved git sha for the git ref
type: string
image:
description: |-
Image is the container image registry and name (e.g., "llamaindex/llama-agents-appserver")
If not specified, defaults to environment variable or "llamaindex/llama-agents-appserver"
type: string
imageTag:
description: |-
ImageTag is the container image tag
If not specified, defaults to environment variable or "latest"
type: string
name:
description: 'Name is the deployment name (DEPRECATED: use DisplayName)'
type: string
projectId:
description: ProjectId is the project ID
type: string
repoUrl:
description: RepoUrl is the URL of the repository to deploy
type: string
secretName:
description: SecretName is the name of the Kubernetes Secret containing
PAT and deployment secrets
type: string
staticAssetsPath:
description: |-
StaticAssetsPath is an optional path (relative to /opt/app) containing
prebuilt UI assets to be served under /deployments/<deployment-id>/ui
type: string
suspended:
description: |-
Suspended scales the underlying Deployment to 0 replicas when true.
Setting suspended to false (or removing the field) restores replicas to 1.
type: boolean
templateName:
description: |-
TemplateName optionally specifies a LlamaDeploymentTemplate to apply.
When empty, the operator will look up a template named "default".
type: string
required:
- projectId
- repoUrl
type: object
status:
description: LlamaDeploymentStatus defines the observed state of LlamaDeployment.
properties:
authToken:
description: AuthToken is a cryptographically secure token for this
deployment
type: string
buildId:
description: BuildId is the content-addressed identifier for the current
build artifact
type: string
buildStatus:
description: BuildStatus tracks the state of the current build job
enum:
- Pending
- Running
- Succeeded
- Failed
type: string
failedRolloutGeneration:
description: |-
FailedRolloutGeneration records the LlamaDeployment generation whose rollout
timed out. This prevents the operator from re-attempting the same failing rollout.
format: int64
type: integer
lastBuiltGeneration:
description: |-
LastBuiltGeneration is the spec.buildGeneration value that was last
successfully built. When spec.buildGeneration differs from this value,
a new build is triggered even if the deployment is suspended.
format: int64
type: integer
lastReconciledGeneration:
description: LastReconciledGeneration tracks the generation that was
last successfully reconciled
format: int64
type: integer
lastUpdated:
description: LastUpdated is the timestamp of the last status update
format: date-time
type: string
message:
description: Message is a human-readable message indicating details
about the current status
type: string
phase:
description: Phase represents the current phase of the deployment
enum:
- Pending
- Running
- Failed
- RollingOut
- RolloutFailed
- Suspended
- Building
- BuildFailed
- AwaitingCode
type: string
releaseHistory:
description: ReleaseHistory keeps the last 20 released git shas with
timestamps
items:
description: ReleaseHistoryEntry represents a single released version
entry
properties:
gitSha:
description: GitSha is the released git commit SHA
type: string
imageTag:
description: ImageTag is the appserver image tag used for this
release
type: string
releasedAt:
description: ReleasedAt is the timestamp when this version was
released
format: date-time
type: string
required:
- gitSha
- releasedAt
type: object
type: array
rolloutStartedAt:
description: |-
RolloutStartedAt is the timestamp when the current rollout began.
Set when the phase transitions to Pending or RollingOut, cleared on Running or failure.
format: date-time
type: string
schemaVersion:
description: SchemaVersion is the version of the CRD schema used when
this resource was last reconciled
type: string
secretCheckRetries:
description: |-
SecretCheckRetries tracks how many times we've retried finding the Secret.
This handles informer cache lag when the Secret is created just before the CR.
format: int32
type: integer
type: object
type: object
served: true
storage: true
subresources:
status: {}
================================================
FILE: charts/llama-agents/crds/deploy.llamaindex.ai_llamadeploymenttemplates.yaml
================================================
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.18.0
name: llamadeploymenttemplates.deploy.llamaindex.ai
spec:
group: deploy.llamaindex.ai
names:
kind: LlamaDeploymentTemplate
listKind: LlamaDeploymentTemplateList
plural: llamadeploymenttemplates
singular: llamadeploymenttemplate
scope: Namespaced
versions:
- additionalPrinterColumns:
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
name: v1
schema:
openAPIV3Schema:
description: |-
LlamaDeploymentTemplate configures default Pod template fields for LlamaDeployments.
The resource name is referenced by LlamaDeployment.spec.templateName. A special name
"default" is used as a fallback when no templateName is provided.
properties:
apiVersion:
description: |-
APIVersion defines the versioned schema of this representation of an object.
Servers should convert recognized schemas to the latest internal value, and
may reject unrecognized values.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
type: string
kind:
description: |-
Kind is a string value representing the REST resource this object represents.
Servers may infer this from the endpoint the client submits requests to.
Cannot be updated.
In CamelCase.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
type: string
metadata:
type: object
spec:
description: |-
LlamaDeploymentTemplateSpec defines the desired overlay for a LlamaDeployment's PodTemplate.
This is intended to carry scheduling-related fields like node selectors, tolerations, and
affinity, but supports any partial PodTemplateSpec. Fields set here will take precedence
over the operator-computed defaults when merged.
properties:
podSpec:
description: PodSpec holds a partial PodTemplateSpec to be merged
into the generated PodTemplate.
x-kubernetes-preserve-unknown-fields: true
type: object
status:
type: string
type: object
served: true
storage: true
subresources:
status: {}
================================================
FILE: charts/llama-agents/package.json
================================================
{
"name": "llama-agents",
"version": "0.12.3",
"dependencies": {
"llama-agents-appserver": "workspace:*",
"llama-agents-control-plane": "workspace:*",
"llama-agents-operator": "workspace:*"
},
"helm": {
"registry": "oci://docker.io/llamaindex"
},
"syncValues": {
"values.yaml": {
"images.controlPlane.tag": "{llama-agents-control-plane:dockerTag}",
"images.operator.tag": "{llama-agents-operator:dockerTag}",
"images.appserver.tag": "{llama-agents-appserver:dockerTag}",
"crds.version": "{llama-agents-crds:version}"
}
},
"postVersion": [
"helm-docs --chart-search-root . --sort-values-order file"
]
}
================================================
FILE: charts/llama-agents/templates/_helpers.tpl
================================================
{{/*
Common name helpers for the llama-agents chart.
All resource names derive from these so a single rename propagates everywhere.
*/}}
{{/* Chart name */}}
{{- define "llama-agents.name" -}}
llama-agents
{{- end -}}
{{/* Control plane deployment and related resources */}}
{{- define "llama-agents.controlplane.name" -}}
llama-agents-control-plane
{{- end -}}
{{/* Operator deployment and related resources */}}
{{- define "llama-agents.operator.name" -}}
llama-agents-operator
{{- end -}}
{{/* Main API service */}}
{{- define "llama-agents.service.name" -}}
llama-agents-service
{{- end -}}
{{/* Build API service */}}
{{- define "llama-agents.build.name" -}}
llama-agents-build
{{- end -}}
{{/* s3proxy ConfigMap/Secret name (shared by both resources) */}}
{{- define "llama-agents.s3proxy.name" -}}
llama-agents-s3proxy
{{- end -}}
{{/* Chart-rendered Secret holding inline control plane S3 creds */}}
{{- define "llama-agents.controlplane.s3secret.name" -}}
llama-agents-controlplane-s3
{{- end -}}
{{/* Service account name — use value from values.yaml if set, otherwise chart name */}}
{{- define "llama-agents.serviceAccountName" -}}
{{- if .Values.serviceAccount.name -}}
{{ .Values.serviceAccount.name }}
{{- else -}}
{{ include "llama-agents.name" . }}
{{- end -}}
{{- end -}}
{{/* Namespace for LlamaDeployment CRs and child resources. Defaults to release namespace. */}}
{{- define "llama-agents.apps.namespace" -}}
{{- if and .Values.apps .Values.apps.namespace -}}
{{ .Values.apps.namespace }}
{{- else -}}
{{ .Release.Namespace }}
{{- end -}}
{{- end -}}
{{/* True when apps namespace differs from release namespace. */}}
{{- define "llama-agents.apps.splitNamespace" -}}
{{- if ne (include "llama-agents.apps.namespace" .) .Release.Namespace -}}
true
{{- end -}}
{{- end -}}
================================================
FILE: charts/llama-agents/templates/_s3proxy.tpl
================================================
{{/*
s3proxy sidecar container definition.
Rendered into the control plane pod when `.Values.s3proxy.enabled` is true.
*/}}
{{- define "llama-agents.s3proxy.container" -}}
- name: s3proxy
image: {{ .Values.s3proxy.image | quote }}
imagePullPolicy: {{ .Values.s3proxy.imagePullPolicy | default "IfNotPresent" }}
{{- with .Values.s3proxy.securityContext }}
securityContext:
{{- toYaml . | nindent 4 }}
{{- end }}
ports:
- name: s3proxy
containerPort: {{ int .Values.s3proxy.containerPort }}
protocol: TCP
env:
- name: LOG_LEVEL
value: {{ .Values.s3proxy.logLevel | default "info" | quote }}
- name: S3PROXY_LOG_LEVEL
value: {{ .Values.s3proxy.logLevel | default "info" | quote }}
envFrom:
- configMapRef:
name: {{ include "llama-agents.s3proxy.name" . }}
{{- include "llama-agents.secrets.s3proxy" . | nindent 2 }}
{{- with .Values.s3proxy.resources }}
resources:
{{- toYaml . | nindent 4 }}
{{- end }}
volumeMounts:
- name: s3proxy-tmp
mountPath: /tmp
subPath: tmp-dir
{{- end -}}
{{/*
s3proxy ConfigMap data (non-secret config).
*/}}
{{- define "llama-agents.s3proxy.configMapData" -}}
S3PROXY_AUTHORIZATION: "none"
S3PROXY_CORS_ALLOW_ORIGINS: "*"
S3PROXY_ENDPOINT: {{ printf "http://0.0.0.0:%d" (int .Values.s3proxy.containerPort) | quote }}
S3PROXY_IGNORE_UNKNOWN_HEADERS: "true"
{{- end -}}
{{/*
s3proxy Secret data (passthrough of .Values.s3proxy.config, b64-encoded).
*/}}
{{- define "llama-agents.s3proxy.secretData" -}}
{{- range $key, $value := .Values.s3proxy.config }}
{{ $key }}: {{ $value | toString | b64enc | quote }}
{{- end }}
{{- end -}}
{{/*
Endpoint URL the control plane should use to reach the sidecar on localhost.
*/}}
{{- define "llama-agents.s3proxy.localEndpoint" -}}
{{- printf "http://localhost:%d" (int .Values.s3proxy.containerPort) -}}
{{- end -}}
================================================
FILE: charts/llama-agents/templates/_secrets.tpl
================================================
{{/*
envFrom helpers. Each emits zero-or-one `- secretRef:` entries with silent
BYO-over-inline precedence. Model: llamacloud's `_secrets.tpl`.
*/}}
{{/*
s3proxy sidecar: user-supplied `.secret` wins over chart-rendered Secret.
Emits nothing when neither is set (sidecar boots without creds).
*/}}
{{- define "llama-agents.secrets.s3proxy" -}}
{{- if .Values.s3proxy.secret }}
- secretRef:
name: {{ .Values.s3proxy.secret }}
{{- else if .Values.s3proxy.config }}
- secretRef:
name: {{ include "llama-agents.s3proxy.name" . }}
{{- end }}
{{- end -}}
{{/*
Control plane S3 creds. Precedence: s3.secret > outer secretRef (legacy alias)
> chart-rendered-from-inline. Emits nothing when all three are unset.
*/}}
{{- define "llama-agents.secrets.controlplaneS3" -}}
{{- $os := .Values.controlPlane.objectStorage }}
{{- if $os.s3.secret }}
- secretRef:
name: {{ $os.s3.secret }}
{{- else if $os.secretRef }}
- secretRef:
name: {{ $os.secretRef }}
{{- else if and $os.s3.accessKey $os.s3.secretKey }}
- secretRef:
name: {{ include "llama-agents.controlplane.s3secret.name" . }}
{{- end }}
{{- end -}}
================================================
FILE: charts/llama-agents/templates/controlplane-hpa.yaml
================================================
{{- if .Values.controlPlane.hpa.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "llama-agents.controlplane.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "llama-agents.controlplane.name" . }}
minReplicas: {{ .Values.controlPlane.hpa.minReplicas }}
maxReplicas: {{ .Values.controlPlane.hpa.maxReplicas }}
metrics:
{{- $hasMetric := false }}
{{- if .Values.controlPlane.hpa.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.controlPlane.hpa.targetCPUUtilizationPercentage }}
{{- $hasMetric = true }}
{{- end }}
{{- if .Values.controlPlane.hpa.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ .Values.controlPlane.hpa.targetMemoryUtilizationPercentage }}
{{- $hasMetric = true }}
{{- end }}
{{- if not $hasMetric }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
{{- end }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/controlplane-s3-secret.yaml
================================================
{{- $os := .Values.controlPlane.objectStorage }}
{{- $s3 := $os.s3 }}
{{- if or $s3.accessKey $s3.secretKey }}
{{- if not (and $s3.accessKey $s3.secretKey) }}
{{- fail "controlPlane.objectStorage.s3.accessKey and controlPlane.objectStorage.s3.secretKey must both be set" }}
{{- end }}
{{- if or $s3.secret $os.secretRef }}
{{- /* BYO wins silently: skip chart Secret. */ -}}
{{- else }}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "llama-agents.controlplane.s3secret.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
type: Opaque
data:
S3_ACCESS_KEY: {{ $s3.accessKey | b64enc | quote }}
S3_SECRET_KEY: {{ $s3.secretKey | b64enc | quote }}
{{- end }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/deployment.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "llama-agents.controlplane.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
{{- with .Values.controlPlane.deployment.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
replicas: {{ .Values.controlPlane.replicas }}
strategy:
type: Recreate
selector:
matchLabels:
app: {{ include "llama-agents.controlplane.name" . }}
template:
metadata:
labels:
app: {{ include "llama-agents.controlplane.name" . }}
{{- with .Values.controlPlane.deployment.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
{{- if .Values.serviceAccount.create }}
serviceAccountName: {{ include "llama-agents.serviceAccountName" . }}
{{- end }}
securityContext:
runAsNonRoot: true
runAsUser: 1001
runAsGroup: 1001
fsGroup: 1001
containers:
- name: app
image: {{ .Values.images.controlPlane.repository }}:{{ .Values.images.controlPlane.tag }}
imagePullPolicy: {{ .Values.images.controlPlane.pullPolicy }}
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- "ALL"
ports:
- containerPort: {{ .Values.controlPlane.container.port }}
name: http
- containerPort: {{ .Values.controlPlane.buildApi.port }}
name: build-api
env:
- name: KUBERNETES_NAMESPACE
value: {{ include "llama-agents.apps.namespace" . | quote }}
- name: DEFAULT_APPSERVER_IMAGE_TAG
value: {{ .Values.controlPlane.defaultAppserverImageTag | default .Values.images.appserver.tag | quote }}
- name: S3_ENDPOINT_URL
{{- if .Values.controlPlane.objectStorage.s3.endpointUrl }}
value: {{ .Values.controlPlane.objectStorage.s3.endpointUrl | quote }}
{{- else if .Values.s3proxy.enabled }}
value: {{ include "llama-agents.s3proxy.localEndpoint" . | quote }}
{{- else }}
value: ""
{{- end }}
- name: S3_BUCKET
value: {{ required "controlPlane.objectStorage.s3.bucket is required" .Values.controlPlane.objectStorage.s3.bucket | quote }}
- name: S3_REGION
value: {{ .Values.controlPlane.objectStorage.s3.region | quote }}
- name: S3_UNSIGNED
{{- if kindIs "bool" .Values.controlPlane.objectStorage.s3.unsigned }}
value: {{ .Values.controlPlane.objectStorage.s3.unsigned | quote }}
{{- else if .Values.s3proxy.enabled }}
value: "true"
{{- else }}
value: "false"
{{- end }}
- name: BUILD_S3_KEY_PREFIX
value: {{ .Values.controlPlane.objectStorage.buildKeyPrefix | quote }}
- name: BACKUP_S3_KEY_PREFIX
value: {{ .Values.controlPlane.objectStorage.backupKeyPrefix | quote }}
- name: CODE_REPO_S3_KEY_PREFIX
value: {{ .Values.controlPlane.objectStorage.codeRepoKeyPrefix | quote }}
{{- if .Values.controlPlane.container.env }}
{{- toYaml .Values.controlPlane.container.env | nindent 8 }}
{{- end }}
{{- $os := .Values.controlPlane.objectStorage }}
{{- $s3Secret := include "llama-agents.secrets.controlplaneS3" . | trim }}
{{- if or .Values.controlPlane.container.envFrom $s3Secret $os.backupEncryptionSecretRef }}
envFrom:
{{- if .Values.controlPlane.container.envFrom }}
{{- toYaml .Values.controlPlane.container.envFrom | nindent 8 }}
{{- end }}
{{- if $s3Secret }}
{{- include "llama-agents.secrets.controlplaneS3" . | nindent 8 }}
{{- end }}
{{- if $os.backupEncryptionSecretRef }}
- secretRef:
name: {{ $os.backupEncryptionSecretRef }}
{{- end }}
{{- end }}
{{- if .Values.controlPlane.container.startupProbe }}
startupProbe:
{{- toYaml .Values.controlPlane.container.startupProbe | nindent 10 }}
{{- end }}
{{- if .Values.controlPlane.container.livenessProbe }}
livenessProbe:
{{- toYaml .Values.controlPlane.container.livenessProbe | nindent 10 }}
{{- end }}
{{- if .Values.controlPlane.container.resources }}
resources:
{{- toYaml .Values.controlPlane.container.resources | nindent 10 }}
{{- end }}
{{- if .Values.s3proxy.enabled }}
{{- include "llama-agents.s3proxy.container" . | nindent 6 }}
volumes:
- name: s3proxy-tmp
emptyDir: {}
{{- end }}
================================================
FILE: charts/llama-agents/templates/networkpolicy.yaml
================================================
{{- if .Values.networkPolicy.enabled }}
# Egress restrictions for app pods. Lives in the apps namespace (NetworkPolicy
# can only select pods in its own namespace).
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: llama-deployment-pods
namespace: {{ include "llama-agents.apps.namespace" . }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
component: deployment-pods
spec:
podSelector:
matchLabels:
app.kubernetes.io/managed-by: llama-deploy-operator
{{- with .Values.networkPolicy.extraMatchExpressions }}
matchExpressions:
{{- toYaml . | nindent 4 }}
{{- end }}
policyTypes:
- Egress
egress:
# Control plane build API (in the release namespace).
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: {{ .Release.Namespace }}
podSelector:
matchLabels:
app: {{ include "llama-agents.controlplane.name" . }}
ports:
- protocol: TCP
port: {{ .Values.controlPlane.buildApi.port }}
# Allow DNS resolution
- to:
- namespaceSelector:
matchLabels:
{{- toYaml .Values.networkPolicy.dns.namespaceSelector | nindent 10 }}
podSelector:
matchLabels:
{{- toYaml .Values.networkPolicy.dns.podSelector | nindent 10 }}
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
# Allow Internet access
- to:
- ipBlock:
cidr: 0.0.0.0/0
{{- if .Values.networkPolicy.blockPrivateRanges }}
except:
- 169.254.169.254/32 # AWS IMDS
- 10.0.0.0/8 # Private ranges
- 172.16.0.0/12
- 192.168.0.0/16
- 100.64.0.0/10 # Carrier-grade NAT
{{- end }}
{{- with .Values.networkPolicy.extraEgressRules }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/operator-deployment-template.yaml
================================================
{{- if and .Values.operator.enabled .Values.operator.llamaDeploymentTemplate.enabled }}
apiVersion: deploy.llamaindex.ai/v1
kind: LlamaDeploymentTemplate
metadata:
{{- with .Values.operator.llamaDeploymentTemplate.metadata }}
{{- toYaml . | nindent 2 }}
{{- end }}
name: {{ .Values.operator.llamaDeploymentTemplate.name | default "default" }}
namespace: {{ include "llama-agents.apps.namespace" . }}
spec:
{{- with .Values.operator.llamaDeploymentTemplate.spec }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/operator-deployment.yaml
================================================
{{- if .Values.operator.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "llama-agents.operator.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.operator.name" . }}
component: operator
{{- with .Values.operator.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
replicas: {{ .Values.operator.replicas }}
selector:
matchLabels:
app: {{ include "llama-agents.operator.name" . }}
template:
metadata:
labels:
app: {{ include "llama-agents.operator.name" . }}
component: operator
{{- with .Values.operator.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
{{- if .Values.serviceAccount.create }}
serviceAccountName: {{ include "llama-agents.serviceAccountName" . }}
{{- end }}
securityContext:
runAsNonRoot: true
runAsUser: 65532
runAsGroup: 65532
fsGroup: 65532
containers:
- name: manager
image: {{ .Values.images.operator.repository }}:{{ .Values.images.operator.tag }}
imagePullPolicy: {{ .Values.images.operator.pullPolicy }}
command:
- /manager
args:
- --leader-elect
{{- if .Values.metrics.enabled }}
- --metrics-bind-address=:8080
- --metrics-secure=false
{{- else }}
- --metrics-bind-address=0
{{- end }}
env:
- name: WATCH_NAMESPACE
value: {{ include "llama-agents.apps.namespace" . | quote }}
- name: LLAMA_DEPLOY_SYSTEM_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
# Configure the default appserver image that operator will use for LlamaDeployments
- name: LLAMA_DEPLOY_IMAGE
value: {{ .Values.images.appserver.repository }}
- name: LLAMA_DEPLOY_IMAGE_TAG
value: {{ .Values.images.appserver.tag | quote }}
- name: LLAMA_DEPLOY_IMAGE_PULL_POLICY
value: {{ .Values.images.appserver.pullPolicy }}
# Configure nginx sidecar image used in per-deployment pods
- name: LLAMA_DEPLOY_NGINX_IMAGE
value: {{ .Values.images.nginx.repository }}
- name: LLAMA_DEPLOY_NGINX_IMAGE_TAG
value: {{ .Values.images.nginx.tag }}
- name: LLAMA_DEPLOY_NGINX_IMAGE_PULL_POLICY
value: {{ .Values.images.nginx.pullPolicy }}
# Default resource request overrides for app containers managed by operator
- name: LLAMA_DEPLOY_DEFAULT_CPU_REQUEST
value: {{ .Values.operator.defaultAppRequests.cpu | default "750m" | quote }}
- name: LLAMA_DEPLOY_DEFAULT_MEMORY_REQUEST
value: {{ .Values.operator.defaultAppRequests.memory | default "2Gi" | quote }}
# Default resource limit overrides for app containers managed by operator
- name: LLAMA_DEPLOY_DEFAULT_CPU_LIMIT
value: {{ .Values.operator.defaultAppLimits.cpu | default "" | quote }}
- name: LLAMA_DEPLOY_DEFAULT_MEMORY_LIMIT
value: {{ .Values.operator.defaultAppLimits.memory | default "4096Mi" | quote }}
# Rollout timeout for managed deployments
- name: LLAMA_DEPLOY_ROLLOUT_TIMEOUT_SECONDS
value: {{ .Values.operator.rolloutTimeoutSeconds | default "1800" | quote }}
# Max concurrent rollouts (0 = unlimited, default: 10)
- name: LLAMA_DEPLOY_MAX_CONCURRENT_ROLLOUTS
value: {{ .Values.operator.maxConcurrentRollouts | default "10" | quote }}
# Max total active deployments per namespace (0 = unlimited)
- name: LLAMA_DEPLOY_MAX_DEPLOYMENTS
value: {{ .Values.operator.maxDeployments | default "0" | quote }}
# Build API service address for git proxy
- name: LLAMA_DEPLOY_BUILD_API_HOST
value: "{{ include "llama-agents.build.name" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.controlPlane.buildApi.port | default 8001 }}"
{{- if .Values.operator.env }}
# Additional custom environment variables
{{- toYaml .Values.operator.env | nindent 8 }}
{{- end }}
livenessProbe:
httpGet:
path: /healthz
port: 8081
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /readyz
port: 8081
initialDelaySeconds: 5
periodSeconds: 10
ports:
- name: metrics
containerPort: 8080
protocol: TCP
resources:
{{- toYaml .Values.operator.resources | nindent 10 }}
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- "ALL"
{{- end }}
================================================
FILE: charts/llama-agents/templates/operator-hpa.yaml
================================================
{{- if and .Values.operator.enabled .Values.operator.hpa.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "llama-agents.operator.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.operator.name" . }}
component: operator
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "llama-agents.operator.name" . }}
minReplicas: {{ .Values.operator.hpa.minReplicas }}
maxReplicas: {{ .Values.operator.hpa.maxReplicas }}
metrics:
{{- $hasMetric := false }}
{{- if .Values.operator.hpa.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.operator.hpa.targetCPUUtilizationPercentage }}
{{- $hasMetric = true }}
{{- end }}
{{- if .Values.operator.hpa.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ .Values.operator.hpa.targetMemoryUtilizationPercentage }}
{{- $hasMetric = true }}
{{- end }}
{{- if not $hasMetric }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
{{- end }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/rbac.yaml
================================================
{{- if .Values.rbac.create }}
{{- $appsNs := include "llama-agents.apps.namespace" . -}}
{{- $releaseNs := .Release.Namespace -}}
{{- $split := include "llama-agents.apps.splitNamespace" . -}}
{{- $saName := include "llama-agents.serviceAccountName" . -}}
{{- /*
Split mode (apps != release): apps-ns Role with everything except leases,
release-ns Role with only leases (leader-election Lease lives in the
operator pod's namespace). Single-namespace mode: one combined Role.
*/ -}}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ $saName }}
namespace: {{ $appsNs }}
{{- with .Values.rbac.roleAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
rules:
- apiGroups: ['']
resources: ['configmaps', 'secrets', 'serviceaccounts', 'services']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
- apiGroups: ['']
resources: ['events']
verbs: ['create', 'get', 'list', 'patch', 'watch']
- apiGroups: ['']
resources: ['pods']
verbs: ['get', 'list', 'watch']
- apiGroups: ['']
resources: ['pods/log']
verbs: ['get']
- apiGroups: ['apps']
resources: ['deployments']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
- apiGroups: ['apps']
resources: ['replicasets']
verbs: ['get', 'list', 'patch', 'update', 'watch']
- apiGroups: ['batch']
resources: ['jobs']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
{{- if not $split }}
- apiGroups: ['coordination.k8s.io']
resources: ['leases']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
{{- end }}
- apiGroups: ['deploy.llamaindex.ai']
resources: ['llamadeployments']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
- apiGroups: ['deploy.llamaindex.ai']
resources: ['llamadeployments/finalizers']
verbs: ['update']
- apiGroups: ['deploy.llamaindex.ai']
resources: ['llamadeployments/status']
verbs: ['get', 'patch', 'update']
- apiGroups: ['deploy.llamaindex.ai']
resources: ['llamadeploymenttemplates']
verbs: ['get', 'list', 'watch']
- apiGroups: ['networking.k8s.io']
resources: ['ingresses', 'networkpolicies']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ $saName }}
namespace: {{ $appsNs }}
{{- with .Values.rbac.roleBindingAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ $saName }}
subjects:
- kind: ServiceAccount
name: {{ $saName }}
namespace: {{ $releaseNs }}
{{- if $split }}
---
# Leader-election Lease lives in the operator pod's namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ $saName }}-leader-election
namespace: {{ $releaseNs }}
{{- with .Values.rbac.roleAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
rules:
- apiGroups: ['coordination.k8s.io']
resources: ['leases']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ $saName }}-leader-election
namespace: {{ $releaseNs }}
{{- with .Values.rbac.roleBindingAnnotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ $saName }}-leader-election
subjects:
- kind: ServiceAccount
name: {{ $saName }}
namespace: {{ $releaseNs }}
{{- end }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/s3proxy-configmap.yaml
================================================
{{- if .Values.s3proxy.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "llama-agents.s3proxy.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
data:
{{- include "llama-agents.s3proxy.configMapData" . | nindent 2 }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/s3proxy-secret.yaml
================================================
{{- if and .Values.s3proxy.enabled (not .Values.s3proxy.secret) .Values.s3proxy.config }}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "llama-agents.s3proxy.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
type: Opaque
data:
{{- include "llama-agents.s3proxy.secretData" . | nindent 2 }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
name: {{ include "llama-agents.service.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
{{- with .Values.controlPlane.service.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
type: {{ .Values.controlPlane.service.type }}
ports:
- port: {{ .Values.controlPlane.service.port }}
targetPort: {{ .Values.controlPlane.container.port }}
protocol: TCP
name: http
selector:
app: {{ include "llama-agents.controlplane.name" . }}
---
# Build API service for git proxy - accessible only within cluster
apiVersion: v1
kind: Service
metadata:
name: {{ include "llama-agents.build.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
component: build-api
spec:
type: ClusterIP
ports:
- port: {{ .Values.controlPlane.buildApi.port | default 8001 }}
targetPort: {{ .Values.controlPlane.buildApi.port | default 8001 }}
protocol: TCP
name: build-api
selector:
app: {{ include "llama-agents.controlplane.name" . }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ include "llama-agents.operator.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.operator.name" . }}
component: operator
spec:
type: ClusterIP
selector:
app: {{ include "llama-agents.operator.name" . }}
ports:
- name: metrics
port: 8080
targetPort: 8080
protocol: TCP
================================================
FILE: charts/llama-agents/templates/serviceaccount.yaml
================================================
{{- if .Values.serviceAccount.create }}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "llama-agents.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
================================================
FILE: charts/llama-agents/templates/servicemonitor.yaml
================================================
{{- if .Values.metrics.enabled }}
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: {{ include "llama-agents.controlplane.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
{{- with .Values.metrics.additionalMonitorLabels }}
{{ toYaml . | indent 4 }}
{{- end }}
spec:
selector:
matchLabels:
app: {{ include "llama-agents.controlplane.name" . }}
endpoints:
- port: http
path: /metrics
interval: {{ .Values.metrics.scrapeInterval | default "30s" }}
scrapeTimeout: {{ .Values.metrics.scrapeTimeout | default "10s" }}
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: {{ include "llama-agents.build.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.controlplane.name" . }}
component: build-api
{{- with .Values.metrics.additionalMonitorLabels }}
{{ toYaml . | indent 4 }}
{{- end }}
spec:
selector:
matchLabels:
app: {{ include "llama-agents.controlplane.name" . }}
component: build-api
endpoints:
- port: build-api
path: /metrics
interval: {{ .Values.metrics.scrapeInterval | default "30s" }}
scrapeTimeout: {{ .Values.metrics.scrapeTimeout | default "10s" }}
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: llama-deploy-appservers
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/part-of: {{ include "llama-agents.name" . }}
{{- with .Values.metrics.additionalMonitorLabels }}
{{ toYaml . | indent 4 }}
{{- end }}
spec:
namespaceSelector:
any: true
selector:
matchLabels:
app.kubernetes.io/managed-by: llama-deploy-operator
component: appserver
endpoints:
- port: http
path: /metrics
interval: {{ .Values.metrics.scrapeInterval | default "30s" }}
scrapeTimeout: {{ .Values.metrics.scrapeTimeout | default "10s" }}
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: {{ include "llama-agents.operator.name" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ include "llama-agents.operator.name" . }}
component: operator
{{- with .Values.metrics.additionalMonitorLabels }}
{{ toYaml . | indent 4 }}
{{- end }}
spec:
selector:
matchLabels:
app: {{ include "llama-agents.operator.name" . }}
endpoints:
- port: metrics
interval: {{ .Values.metrics.scrapeInterval | default "30s" }}
scrapeTimeout: {{ .Values.metrics.scrapeTimeout | default "10s" }}
{{- end }}
================================================
FILE: charts/llama-agents/tests/apps_namespace_test.yaml
================================================
suite: apps.namespace — single- and split-namespace modes
templates:
- templates/operator-deployment.yaml
- templates/deployment.yaml
- templates/rbac.yaml
- templates/networkpolicy.yaml
- templates/operator-deployment-template.yaml
set:
controlPlane:
objectStorage:
s3:
bucket: "test-bucket"
tests:
# ---------- Unset apps.namespace — single-namespace mode ----------
- it: WATCH_NAMESPACE defaults to release namespace
release:
namespace: llama-agents
template: templates/operator-deployment.yaml
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: WATCH_NAMESPACE
value: "llama-agents"
- contains:
path: spec.template.spec.containers[0].env
content:
name: LLAMA_DEPLOY_SYSTEM_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- it: control plane KUBERNETES_NAMESPACE defaults to release namespace
release:
namespace: llama-agents
template: templates/deployment.yaml
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: KUBERNETES_NAMESPACE
value: "llama-agents"
- it: single combined Role in release namespace
release:
namespace: llama-agents
template: templates/rbac.yaml
asserts:
- hasDocuments:
count: 2 # Role + RoleBinding only
- documentIndex: 0
equal:
path: kind
value: Role
- documentIndex: 0
equal:
path: metadata.namespace
value: llama-agents
- documentIndex: 0
contains:
path: rules
content:
apiGroups: ['coordination.k8s.io']
resources: ['leases']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
- it: NetworkPolicy lives in release namespace
release:
namespace: llama-agents
template: templates/networkpolicy.yaml
asserts:
- equal:
path: metadata.namespace
value: llama-agents
# ---------- apps.namespace set — split mode ----------
- it: split WATCH_NAMESPACE points at apps namespace
release:
namespace: llama-agents
set:
apps:
namespace: llama-agents-apps
template: templates/operator-deployment.yaml
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: WATCH_NAMESPACE
value: "llama-agents-apps"
- it: split control plane KUBERNETES_NAMESPACE points at apps namespace
release:
namespace: llama-agents
set:
apps:
namespace: llama-agents-apps
template: templates/deployment.yaml
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: KUBERNETES_NAMESPACE
value: "llama-agents-apps"
- it: split renders two Roles — apps Role sans leases, release Role with only leases
release:
namespace: llama-agents
set:
apps:
namespace: llama-agents-apps
template: templates/rbac.yaml
asserts:
- hasDocuments:
count: 4 # apps Role + RB, leader-election Role + RB
- documentIndex: 0
equal:
path: kind
value: Role
- documentIndex: 0
equal:
path: metadata.namespace
value: llama-agents-apps
- documentIndex: 0
notContains:
path: rules
content:
apiGroups: ['coordination.k8s.io']
resources: ['leases']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
- documentIndex: 1
equal:
path: kind
value: RoleBinding
- documentIndex: 1
equal:
path: metadata.namespace
value: llama-agents-apps
- documentIndex: 1
equal:
path: subjects[0].namespace
value: llama-agents
- documentIndex: 2
equal:
path: kind
value: Role
- documentIndex: 2
equal:
path: metadata.namespace
value: llama-agents
- documentIndex: 2
contains:
path: rules
content:
apiGroups: ['coordination.k8s.io']
resources: ['leases']
verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
- documentIndex: 3
equal:
path: kind
value: RoleBinding
- documentIndex: 3
equal:
path: metadata.namespace
value: llama-agents
- it: split NetworkPolicy lives in apps namespace with namespaceSelector to release ns
release:
namespace: llama-agents
set:
apps:
namespace: llama-agents-apps
template: templates/networkpolicy.yaml
asserts:
- equal:
path: metadata.namespace
value: llama-agents-apps
- equal:
path: spec.egress[0].to[0].namespaceSelector.matchLabels["kubernetes.io/metadata.name"]
value: llama-agents
- it: split LlamaDeploymentTemplate lands in apps namespace
release:
namespace: llama-agents
set:
apps:
namespace: llama-agents-apps
operator:
llamaDeploymentTemplate:
enabled: true
template: templates/operator-deployment-template.yaml
asserts:
- equal:
path: metadata.namespace
value: llama-agents-apps
# ---------- apps.namespace equal to release namespace — single-ns output ----------
- it: apps.namespace equal to release namespace collapses to single Role
release:
namespace: llama-agents
set:
apps:
namespace: llama-agents
template: templates/rbac.yaml
asserts:
- hasDocuments:
count: 2
================================================
FILE: charts/llama-agents/tests/object_storage_test.yaml
================================================
suite: Control plane object storage configuration
templates:
- templates/deployment.yaml
- templates/controlplane-s3-secret.yaml
tests:
- it: fails when objectStorage bucket is not set (default)
template: templates/deployment.yaml
asserts:
- failedTemplate:
errorMessage: "controlPlane.objectStorage.s3.bucket is required"
- it: sets S3 env vars when objectStorage bucket is configured
template: templates/deployment.yaml
set:
controlPlane:
objectStorage:
s3:
endpointUrl: "https://s3.example.com"
bucket: "my-bucket"
region: "us-west-2"
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: S3_ENDPOINT_URL
value: "https://s3.example.com"
- contains:
path: spec.template.spec.containers[0].env
content:
name: S3_BUCKET
value: "my-bucket"
- contains:
path: spec.template.spec.containers[0].env
content:
name: S3_REGION
value: "us-west-2"
- contains:
path: spec.template.spec.containers[0].env
content:
name: S3_UNSIGNED
value: "false"
- contains:
path: spec.template.spec.containers[0].env
content:
name: BACKUP_S3_KEY_PREFIX
value: "backups"
- contains:
path: spec.template.spec.containers[0].env
content:
name: CODE_REPO_S3_KEY_PREFIX
value: "git"
- it: sets S3_UNSIGNED to true when unsigned is enabled
template: templates/deployment.yaml
set:
controlPlane:
objectStorage:
s3:
bucket: "my-bucket"
unsigned: true
asserts:
- contains:
path: spec.template.spec.containers[0].env
content:
name: S3_UNSIGNED
value: "true"
- it: sets envFrom with objectStorage secretRef
template: templates/deployment.yaml
set:
controlPlane:
objectStorage:
s3:
endpointUrl: "https://s3.example.com"
bucket: "my-bucket"
region: "us-west-2"
secretRef: "s3-credentials"
asserts:
- contains:
path: spec.template.spec.containers[0].envFrom
content:
secretRef:
name: "s3-credentials"
- it: sets envFrom with backup encryptionSecretRef
template: templates/deployment.yaml
set:
controlPlane:
objectStorage:
s3:
bucket: "my-bucket"
backupEncryptionSecretRef: "backup-encryption"
asserts:
- contains:
path: spec.template.spec.containers[0].envFrom
content:
secretRef:
name: "backup-encryption"
- it: does not set envFrom when no secretRefs configured
template: templates/deployment.yaml
set:
controlPlane:
objectStorage:
s3:
endpointUrl: "https://s3.example.com"
bucket: "my-bucket"
region: "us-west-2"
asserts:
- notExists:
path: spec.template.spec.containers[0].envFrom
- it: merges all envFrom sources
template: templates/deployment.yaml
set:
controlPlane:
objectStorage:
s3:
endpointUrl: "https://s3.example.com"
bucket: "my-bucket"
region: "us-west-2"
secretRef: "s3-credentials"
backupEncryptionSecretRef: "backup-encryption"
container:
envFrom:
- configMapRef:
name: "my-config"
asserts:
- contains:
path: spec.template.spec.containers[0].envFrom
content:
configMapRef:
name: "my-config"
- contains:
path: spec.template.spec.containers[0].envFrom
content:
secretRef:
name: "s3-credentials"
- contains:
path: spec.template.spec.containers[0].envFrom
content:
secretRef:
name: "backup-encryption"
# --- inline S3 creds ---
- it: renders a chart Secret with inline accessKey and secretKey
set:
controlPlane:
objectStorage:
s3:
bucket: "my-bucket"
accessKey: "AKIAEXAMPLE"
secretKey: "SECRETEXAMPLE"
template: templates/controlplane-s3-secret.yaml
asserts:
- isKind:
of: Secret
- equal:
path: metadata.name
value: llama-agents-controlplane-s3
gitextract_9disofz3/
├── .agents/
│ └── skills/
│ └── llamactl-qa/
│ └── SKILL.md
├── .changeset/
│ ├── README.md
│ └── config.json
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── actions/
│ │ ├── pr-fix-comment/
│ │ │ └── action.yml
│ │ └── setup-publish/
│ │ └── action.yml
│ └── workflows/
│ ├── bump_llama_index_core.yml
│ ├── chart-validate.yaml
│ ├── go-ci.yml
│ ├── lint.yml
│ ├── lockfile.yml
│ ├── publish_changesets.yml
│ ├── publish_openapi.yml
│ ├── sync-docs.yml
│ ├── test.yml
│ └── update_debugger_assets.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .prettierrc
├── .taplo.toml
├── AGENTS.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── architecture-docs/
│ ├── build-api.md
│ ├── control-loop.md
│ ├── core-overview.md
│ ├── overall-architecture.md
│ ├── quick-reference.md
│ └── server-architecture.md
├── charts/
│ ├── AGENTS.md
│ ├── llama-agents/
│ │ ├── .helmignore
│ │ ├── CHANGELOG.md
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── README.md.gotmpl
│ │ ├── crds/
│ │ │ ├── deploy.llamaindex.ai_llamadeployments.yaml
│ │ │ └── deploy.llamaindex.ai_llamadeploymenttemplates.yaml
│ │ ├── package.json
│ │ ├── templates/
│ │ │ ├── _helpers.tpl
│ │ │ ├── _s3proxy.tpl
│ │ │ ├── _secrets.tpl
│ │ │ ├── controlplane-hpa.yaml
│ │ │ ├── controlplane-s3-secret.yaml
│ │ │ ├── deployment.yaml
│ │ │ ├── networkpolicy.yaml
│ │ │ ├── operator-deployment-template.yaml
│ │ │ ├── operator-deployment.yaml
│ │ │ ├── operator-hpa.yaml
│ │ │ ├── rbac.yaml
│ │ │ ├── s3proxy-configmap.yaml
│ │ │ ├── s3proxy-secret.yaml
│ │ │ ├── service.yaml
│ │ │ ├── serviceaccount.yaml
│ │ │ └── servicemonitor.yaml
│ │ ├── tests/
│ │ │ ├── apps_namespace_test.yaml
│ │ │ ├── object_storage_test.yaml
│ │ │ ├── operator_image_tag_env_test.yaml
│ │ │ ├── s3proxy_test.yaml
│ │ │ └── servicemonitor_test.yaml
│ │ └── values.yaml
│ └── llama-agents-crds/
│ ├── .helmignore
│ ├── CHANGELOG.md
│ ├── Chart.yaml
│ ├── README.md
│ ├── files/
│ │ ├── deploy.llamaindex.ai_llamadeployments.yaml
│ │ └── deploy.llamaindex.ai_llamadeploymenttemplates.yaml
│ ├── package.json
│ ├── templates/
│ │ └── crds.yaml
│ └── values.yaml
├── docker/
│ ├── Dockerfile
│ ├── Dockerfile.mitm-test
│ ├── mitm-proxy-test/
│ │ └── entrypoint.sh
│ └── operator.Dockerfile
├── docs/
│ ├── api_docs/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── docs/
│ │ │ ├── api_reference/
│ │ │ │ ├── _static/
│ │ │ │ │ ├── css/
│ │ │ │ │ │ ├── algolia.css
│ │ │ │ │ │ └── custom.css
│ │ │ │ │ └── js/
│ │ │ │ │ ├── algolia.js
│ │ │ │ │ └── leadfeeder.js
│ │ │ │ ├── context.md
│ │ │ │ ├── decorators.md
│ │ │ │ ├── errors.md
│ │ │ │ ├── events.md
│ │ │ │ ├── handler.md
│ │ │ │ ├── index.md
│ │ │ │ ├── resource.md
│ │ │ │ ├── retry_policy.md
│ │ │ │ ├── workflow.md
│ │ │ │ └── workflow_server/
│ │ │ │ ├── client.md
│ │ │ │ ├── models.md
│ │ │ │ └── server.md
│ │ │ ├── css/
│ │ │ │ ├── algolia.css
│ │ │ │ ├── custom.css
│ │ │ │ └── style.css
│ │ │ └── javascript/
│ │ │ └── algolia.js
│ │ ├── mkdocs.yml
│ │ ├── overrides/
│ │ │ ├── main.html
│ │ │ └── partials/
│ │ │ ├── copyright.html
│ │ │ └── search.html
│ │ └── pyproject.toml
│ └── src/
│ ├── components/
│ │ ├── Header.astro
│ │ ├── HomepageFeatures/
│ │ │ ├── index.js
│ │ │ └── styles.module.css
│ │ ├── ProtectedContent.jsx
│ │ ├── ProtectedTabs.jsx
│ │ ├── SiteTitle.astro
│ │ ├── llamaExtract.js
│ │ ├── llamaParse.js
│ │ └── mdx_components.jsx
│ ├── content/
│ │ └── docs/
│ │ └── llamaagents/
│ │ ├── _meta.yml
│ │ ├── cloud/
│ │ │ ├── _meta.yml
│ │ │ ├── agent-data-overview.md
│ │ │ ├── builder.md
│ │ │ └── click-to-deploy.md
│ │ ├── llamactl/
│ │ │ ├── _meta.yml
│ │ │ ├── agent-templates.md
│ │ │ ├── cd-with-github-actions.md
│ │ │ ├── configuration-reference.md
│ │ │ ├── getting-started.md
│ │ │ ├── ui-build.md
│ │ │ ├── ui-hooks.md
│ │ │ └── workflow-api.md
│ │ ├── llamactl-reference/
│ │ │ ├── _meta.yml
│ │ │ ├── commands-auth.md
│ │ │ ├── commands-config.md
│ │ │ ├── commands-deployments.md
│ │ │ ├── commands-environments.md
│ │ │ ├── commands-init.md
│ │ │ ├── commands-organizations.md
│ │ │ ├── commands-pkg.md
│ │ │ ├── commands-projects.md
│ │ │ └── commands-serve.md
│ │ ├── overview.md
│ │ └── workflows/
│ │ ├── _meta.yml
│ │ ├── async_workflows.md
│ │ ├── branches_and_loops.md
│ │ ├── client.md
│ │ ├── concurrent_execution.md
│ │ ├── customizing_entry_exit_points.md
│ │ ├── dbos.md
│ │ ├── deployment.md
│ │ ├── drawing.md
│ │ ├── durable_workflows.md
│ │ ├── human_in_the_loop.md
│ │ ├── index.md
│ │ ├── managing_state.md
│ │ ├── observability.md
│ │ ├── resources.md
│ │ ├── retry_steps.md
│ │ ├── streaming.mdx
│ │ └── unbound_functions.md
│ ├── content.config.ts
│ └── pages/
│ └── index.astro
├── docs.config.mjs
├── examples/
│ ├── README.md
│ ├── agent.ipynb
│ ├── client/
│ │ ├── README.md
│ │ ├── base/
│ │ │ ├── workflow_client.py
│ │ │ └── workflow_server.py
│ │ └── human_in_the_loop/
│ │ ├── workflow_client_hitl.py
│ │ └── workflow_server_hitl.py
│ ├── dbos/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── _replica.py
│ │ ├── docker-compose.yml
│ │ ├── durable_workflow.py
│ │ ├── idle_release_demo.py
│ │ ├── server_quickstart.py
│ │ └── server_replicas.py
│ ├── docker/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── app.py
│ │ └── requirements.txt
│ ├── document_agents/
│ │ └── finance_triage_agent.ipynb
│ ├── document_processing.ipynb
│ ├── durable_workflows.ipynb
│ ├── eval_driven_prompt_refinement.ipynb
│ ├── feature_walkthrough.ipynb
│ ├── k8s-otel/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── Tiltfile
│ │ ├── app.py
│ │ ├── k8s/
│ │ │ ├── app.yaml
│ │ │ ├── jaeger.yaml
│ │ │ ├── kustomization.yaml
│ │ │ ├── namespace.yaml
│ │ │ ├── otel-collector.yaml
│ │ │ ├── phoenix.yaml
│ │ │ └── postgres.yaml
│ │ ├── kind-config.yaml
│ │ └── pyproject.toml
│ ├── observability/
│ │ ├── README.md
│ │ ├── workflow_context_logging.ipynb
│ │ ├── workflows_observability_pt1.ipynb
│ │ ├── workflows_observability_pt2.ipynb
│ │ ├── workflows_observablitiy_arize_phoenix.ipynb
│ │ └── workflows_observablitiy_langfuse.ipynb
│ ├── server/
│ │ ├── README.md
│ │ ├── fastapi_server_example.ipynb
│ │ ├── server.py
│ │ ├── server_example.ipynb
│ │ └── server_example.py
│ ├── state_management_with_vector_databases.ipynb
│ ├── streaming_internal_events.ipynb
│ └── visualization/
│ └── resource_nodes_example.py
├── operator/
│ ├── .gitignore
│ ├── .golangci.yml
│ ├── AGENTS.md
│ ├── CHANGELOG.md
│ ├── Makefile
│ ├── Tiltfile
│ ├── api/
│ │ └── v1/
│ │ ├── groupversion_info.go
│ │ ├── llamadeployment_types.go
│ │ ├── llamadeploymenttemplate_types.go
│ │ └── zz_generated.deepcopy.go
│ ├── cmd/
│ │ └── main.go
│ ├── config/
│ │ ├── crd/
│ │ │ ├── bases/
│ │ │ │ ├── deploy.llamaindex.ai_llamadeployments.yaml
│ │ │ │ └── deploy.llamaindex.ai_llamadeploymenttemplates.yaml
│ │ │ └── kustomizeconfig.yaml
│ │ └── rbac/
│ │ └── role.yaml
│ ├── dev.py
│ ├── go.mod
│ ├── go.sum
│ ├── internal/
│ │ └── controller/
│ │ ├── apps_namespace_test.go
│ │ ├── classify_pod_test.go
│ │ ├── image_tag_unit_test.go
│ │ ├── lifecycle.go
│ │ ├── lifecycle_test.go
│ │ ├── llamadeployment_controller_test.go
│ │ ├── mapping_unit_test.go
│ │ ├── metrics.go
│ │ ├── metrics_test.go
│ │ ├── reconcile.go
│ │ ├── reconcile_test.go
│ │ ├── resources.go
│ │ ├── resources_build_unit_test.go
│ │ ├── resources_security_test.go
│ │ ├── suite_test.go
│ │ └── test_utils_test.go
│ ├── package.json
│ └── tilt/
│ ├── .gitignore
│ ├── env-to-secret.py
│ ├── helm/
│ │ └── values-dev.yaml
│ ├── k8s-manifests/
│ │ ├── .gitkeep
│ │ ├── backup-encryption-secrets.yaml
│ │ ├── kind-gc-cronjob.yaml
│ │ ├── object-storage-secrets.yaml
│ │ ├── prometheus.yaml
│ │ └── seaweedfs.yaml
│ └── scripts/
│ └── install-prometheus.sh
├── package.json
├── packages/
│ ├── llama-agents-agentcore/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents/
│ │ │ └── agentcore/
│ │ │ ├── __init__.py
│ │ │ ├── _runtime_decorator.py
│ │ │ ├── _service.py
│ │ │ ├── deploy.py
│ │ │ ├── entrypoint.py
│ │ │ ├── export.py
│ │ │ └── main.py
│ │ └── tests/
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── test_entrypoint.py
│ │ ├── test_export.py
│ │ └── test_service.py
│ ├── llama-agents-appserver/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── pytest.ini
│ │ ├── src/
│ │ │ ├── llama_agents/
│ │ │ │ └── appserver/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── app.py
│ │ │ │ ├── bootstrap.py
│ │ │ │ ├── build.py
│ │ │ │ ├── configure_logging.py
│ │ │ │ ├── correlation_id.py
│ │ │ │ ├── deployment.py
│ │ │ │ ├── deployment_config_parser.py
│ │ │ │ ├── interrupts.py
│ │ │ │ ├── process_utils.py
│ │ │ │ ├── py.typed
│ │ │ │ ├── routers/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── deployments.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ └── ui_proxy.py
│ │ │ │ ├── settings.py
│ │ │ │ ├── stats.py
│ │ │ │ ├── types.py
│ │ │ │ └── workflow_loader.py
│ │ │ └── llama_deploy/
│ │ │ └── appserver/
│ │ │ └── __init__.py
│ │ └── tests/
│ │ ├── conftest.py
│ │ ├── routers/
│ │ │ ├── test_deployments.py
│ │ │ ├── test_ui_proxy.py
│ │ │ └── test_ui_proxy_ws.py
│ │ ├── test_app.py
│ │ ├── test_app_server_start.py
│ │ ├── test_bootstrap.py
│ │ ├── test_configure_logging.py
│ │ ├── test_deployment.py
│ │ ├── test_environment_loader.py
│ │ ├── test_preflight.py
│ │ ├── test_status.py
│ │ ├── test_workflow_loader.py
│ │ ├── test_workflow_loader_install.py
│ │ ├── test_workflow_loader_load_workflows.py
│ │ └── test_workflow_loader_streaming.py
│ ├── llama-agents-client/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents/
│ │ │ └── client/
│ │ │ ├── __init__.py
│ │ │ ├── client.py
│ │ │ └── protocol/
│ │ │ ├── __init__.py
│ │ │ └── serializable_events.py
│ │ └── tests/
│ │ ├── client/
│ │ │ ├── client_test_workflows.py
│ │ │ └── test_client.py
│ │ └── protocol/
│ │ ├── __init__.py
│ │ └── test_serializable_events.py
│ ├── llama-agents-control-plane/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ ├── llama_agents/
│ │ │ │ └── control_plane/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── backup/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── archive.py
│ │ │ │ │ ├── encryption.py
│ │ │ │ │ └── storage.py
│ │ │ │ ├── build_api/
│ │ │ │ │ ├── build_app.py
│ │ │ │ │ ├── build_auth.py
│ │ │ │ │ ├── build_gc.py
│ │ │ │ │ ├── build_service.py
│ │ │ │ │ └── build_storage.py
│ │ │ │ ├── code_repo/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── git_server.py
│ │ │ │ │ ├── service.py
│ │ │ │ │ └── storage.py
│ │ │ │ ├── git/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── _git_service.py
│ │ │ │ │ ├── _github_auth.py
│ │ │ │ │ ├── github_api_client.py
│ │ │ │ │ └── github_api_schema.py
│ │ │ │ ├── k8s_client.py
│ │ │ │ ├── lifecycle.py
│ │ │ │ ├── log_config.py
│ │ │ │ ├── main.py
│ │ │ │ ├── manage_api/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── backup_service.py
│ │ │ │ │ ├── backup_v1beta1.py
│ │ │ │ │ ├── deployments_service.py
│ │ │ │ │ ├── deployments_v1beta1.py
│ │ │ │ │ └── manage_app.py
│ │ │ │ ├── py.typed
│ │ │ │ ├── settings.py
│ │ │ │ └── storage.py
│ │ │ └── llama_deploy/
│ │ │ └── control_plane/
│ │ │ └── __init__.py
│ │ └── tests/
│ │ ├── backup/
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_archive.py
│ │ │ ├── test_backup_roundtrip.py
│ │ │ ├── test_backup_service.py
│ │ │ ├── test_encryption.py
│ │ │ ├── test_schema.py
│ │ │ └── test_storage.py
│ │ ├── code_repo/
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_git_server.py
│ │ │ └── test_storage.py
│ │ ├── deployments/
│ │ │ └── test_deployments_service.py
│ │ ├── test_build_app.py
│ │ ├── test_build_app_ssrf.py
│ │ ├── test_build_gc.py
│ │ ├── test_endpoints.py
│ │ ├── test_find_deployment_id.py
│ │ ├── test_git_service.py
│ │ ├── test_k8s_client.py
│ │ ├── test_storage.py
│ │ └── test_ui_build_path.py
│ ├── llama-agents-core/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ ├── llama_agents/
│ │ │ │ └── core/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _alias.py
│ │ │ │ ├── _compat.py
│ │ │ │ ├── client/
│ │ │ │ │ ├── manage_client.py
│ │ │ │ │ └── ssl_util.py
│ │ │ │ ├── config.py
│ │ │ │ ├── deployment_config.py
│ │ │ │ ├── git/
│ │ │ │ │ └── git_util.py
│ │ │ │ ├── iter_utils.py
│ │ │ │ ├── path_util.py
│ │ │ │ ├── py.typed
│ │ │ │ ├── schema/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── backups.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── deployments.py
│ │ │ │ │ ├── git_validation.py
│ │ │ │ │ ├── projects.py
│ │ │ │ │ └── public.py
│ │ │ │ ├── server/
│ │ │ │ │ └── manage_api/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── _abstract_deployments_service.py
│ │ │ │ │ ├── _create_deployments_router.py
│ │ │ │ │ └── _exceptions.py
│ │ │ │ └── ui_build.py
│ │ │ └── llama_deploy/
│ │ │ └── core/
│ │ │ └── __init__.py
│ │ └── tests/
│ │ ├── client/
│ │ │ └── test_manage_client.py
│ │ ├── test_deployment_config.py
│ │ ├── test_git_util.py
│ │ ├── test_iter_utils.py
│ │ ├── test_schema.py
│ │ └── test_ssl_util.py
│ ├── llama-agents-dbos/
│ │ ├── ARCHITECTURE.md
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── conftest.py
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents/
│ │ │ └── dbos/
│ │ │ ├── __init__.py
│ │ │ ├── _store/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── postgres/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── migrations/
│ │ │ │ │ ├── 0001_init.sql
│ │ │ │ │ └── __init__.py
│ │ │ │ └── sqlite/
│ │ │ │ ├── __init__.py
│ │ │ │ └── migrations/
│ │ │ │ ├── 0001_init.sql
│ │ │ │ └── __init__.py
│ │ │ ├── executor_lease.py
│ │ │ ├── idle_release.py
│ │ │ ├── journal/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── crud.py
│ │ │ │ ├── lifecycle.py
│ │ │ │ └── task_journal.py
│ │ │ └── runtime.py
│ │ └── tests/
│ │ ├── conftest.py
│ │ ├── fixtures/
│ │ │ ├── __init__.py
│ │ │ ├── replica_server.py
│ │ │ ├── runner.py
│ │ │ ├── runner_common.py
│ │ │ ├── sample_workflows/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── chained.py
│ │ │ │ ├── concurrent_workers.py
│ │ │ │ ├── counter.py
│ │ │ │ ├── hitl.py
│ │ │ │ ├── parallel.py
│ │ │ │ ├── sequential_hitl.py
│ │ │ │ ├── slow_fan_out_hitl.py
│ │ │ │ ├── streaming_interrupt.py
│ │ │ │ ├── streaming_stress.py
│ │ │ │ └── three_step_hitl.py
│ │ │ └── server_runner.py
│ │ ├── test_dbos_cross_process.py
│ │ ├── test_dbos_determinism_subprocess.py
│ │ ├── test_dbos_idle_release.py
│ │ ├── test_dbos_idle_release_e2e.py
│ │ ├── test_dbos_runtime.py
│ │ ├── test_dbos_server_postgres.py
│ │ ├── test_executor_lease.py
│ │ ├── test_journal_double_restart_hang.py
│ │ ├── test_journal_orphan_determinism.py
│ │ ├── test_lifecycle_lock.py
│ │ └── test_task_journal.py
│ ├── llama-agents-integration-tests/
│ │ ├── README.md
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents_integration_tests/
│ │ │ ├── __init__.py
│ │ │ ├── fake_agent_data.py
│ │ │ ├── helpers.py
│ │ │ ├── postgres.py
│ │ │ └── server_test_utils.py
│ │ └── tests/
│ │ ├── conftest.py
│ │ ├── test_agent_data_store.py
│ │ ├── test_context_store.py
│ │ ├── test_error_handling.py
│ │ ├── test_event_streaming.py
│ │ ├── test_human_in_the_loop.py
│ │ ├── test_runtime_matrix.py
│ │ ├── test_server_http_matrix.py
│ │ ├── test_server_store_matrix.py
│ │ └── test_state_store_matrix.py
│ ├── llama-agents-server/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ └── llama_agents/
│ │ │ └── server/
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── _api.py
│ │ │ ├── _keyed_lock.py
│ │ │ ├── _lru_cache.py
│ │ │ ├── _pool.py
│ │ │ ├── _runtime/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── event_interceptor.py
│ │ │ │ ├── idle_release_runtime.py
│ │ │ │ ├── persistence_runtime.py
│ │ │ │ └── server_runtime.py
│ │ │ ├── _service.py
│ │ │ ├── _store/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── abstract_workflow_store.py
│ │ │ │ ├── agent_data_client.py
│ │ │ │ ├── agent_data_state_store.py
│ │ │ │ ├── agent_data_store.py
│ │ │ │ ├── memory_workflow_store.py
│ │ │ │ ├── migration_utils.py
│ │ │ │ ├── postgres/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── migrate.py
│ │ │ │ │ └── migrations/
│ │ │ │ │ ├── 0001_init.sql
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── postgres_state_store.py
│ │ │ │ ├── postgres_workflow_store.py
│ │ │ │ └── sqlite/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── migrate.py
│ │ │ │ ├── migrations/
│ │ │ │ │ ├── 0001_init.sql
│ │ │ │ │ ├── 0002_extend_handlers.sql
│ │ │ │ │ ├── 0003_add_idle_since.sql
│ │ │ │ │ ├── 0004_add_ticks.sql
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── sqlite_state_store.py
│ │ │ │ └── sqlite_workflow_store.py
│ │ │ ├── py.typed
│ │ │ ├── server.py
│ │ │ └── static/
│ │ │ └── index.html
│ │ └── tests/
│ │ └── server/
│ │ ├── conftest.py
│ │ ├── server_test_fixtures.py
│ │ ├── test_agent_data_store.py
│ │ ├── test_durable_runtime.py
│ │ ├── test_error_handling.py
│ │ ├── test_event_interceptor.py
│ │ ├── test_handler_serialization.py
│ │ ├── test_idle_release_live_http.py
│ │ ├── test_keyed_lock.py
│ │ ├── test_lru_cache.py
│ │ ├── test_main.py
│ │ ├── test_memory_workflow_store.py
│ │ ├── test_migrations.py
│ │ ├── test_openapi_schema.py
│ │ ├── test_persistent_handler_serialization.py
│ │ ├── test_pool.py
│ │ ├── test_postgres_migrations.py
│ │ ├── test_postgres_state_store.py
│ │ ├── test_postgres_workflow_store.py
│ │ ├── test_runtime_decorators.py
│ │ ├── test_server.py
│ │ ├── test_server_endpoints.py
│ │ ├── test_server_live_http.py
│ │ ├── test_server_runtime.py
│ │ ├── test_sqlite_state_store.py
│ │ ├── test_sqlite_workflow_store.py
│ │ ├── test_sse_heartbeat.py
│ │ ├── test_streaming_replay_memory.py
│ │ ├── test_workflow_service.py
│ │ └── test_workflow_store_events.py
│ ├── llama-index-utils-workflow/
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ └── tests/
│ │ ├── conftest.py
│ │ └── test_drawing.py
│ ├── llama-index-workflows/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── pyproject.toml
│ │ ├── src/
│ │ │ ├── llama_agents/
│ │ │ │ └── workflows/
│ │ │ │ └── __init__.py
│ │ │ └── workflows/
│ │ │ ├── __init__.py
│ │ │ ├── _event_summary.py
│ │ │ ├── client/
│ │ │ │ └── __init__.py
│ │ │ ├── context/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── context.py
│ │ │ │ ├── context_types.py
│ │ │ │ ├── external_context.py
│ │ │ │ ├── internal_context.py
│ │ │ │ ├── pre_context.py
│ │ │ │ ├── py.typed
│ │ │ │ ├── serializers.py
│ │ │ │ ├── state_store.py
│ │ │ │ └── utils.py
│ │ │ ├── decorators.py
│ │ │ ├── errors.py
│ │ │ ├── events.py
│ │ │ ├── handler.py
│ │ │ ├── plugins/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _context.py
│ │ │ │ └── basic.py
│ │ │ ├── protocol/
│ │ │ │ └── __init__.py
│ │ │ ├── py.typed
│ │ │ ├── representation/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── build.py
│ │ │ │ ├── types.py
│ │ │ │ └── validate.py
│ │ │ ├── resource.py
│ │ │ ├── retry_policy.py
│ │ │ ├── runtime/
│ │ │ │ ├── control_loop.py
│ │ │ │ ├── runtime_decorators.py
│ │ │ │ ├── types/
│ │ │ │ │ ├── commands.py
│ │ │ │ │ ├── internal_state.py
│ │ │ │ │ ├── named_task.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── results.py
│ │ │ │ │ ├── step_function.py
│ │ │ │ │ └── ticks.py
│ │ │ │ └── verbose.py
│ │ │ ├── server/
│ │ │ │ ├── __init__.py
│ │ │ │ └── sqlite/
│ │ │ │ └── __init__.py
│ │ │ ├── testing/
│ │ │ │ ├── __init__.py
│ │ │ │ └── runner.py
│ │ │ ├── types.py
│ │ │ ├── utils.py
│ │ │ └── workflow.py
│ │ └── tests/
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── context/
│ │ │ ├── __init__.py
│ │ │ ├── test_context.py
│ │ │ ├── test_context_preservation.py
│ │ │ ├── test_serializers.py
│ │ │ └── test_utils.py
│ │ ├── plugins/
│ │ │ └── __init__.py
│ │ ├── runtime/
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_control_loop.py
│ │ │ ├── test_control_loop_transformations.py
│ │ │ ├── test_named_task.py
│ │ │ ├── test_runtime_lifecycle.py
│ │ │ ├── test_state.py
│ │ │ ├── test_tick_serialization.py
│ │ │ └── test_workflow_set_and_tracking.py
│ │ ├── test_annotation_resolution.py
│ │ ├── test_catch_error.py
│ │ ├── test_child_state_inheritance.py
│ │ ├── test_decorator.py
│ │ ├── test_event.py
│ │ ├── test_event_summary.py
│ │ ├── test_graph_validation.py
│ │ ├── test_handler.py
│ │ ├── test_llama_agents_alias.py
│ │ ├── test_nanoid.py
│ │ ├── test_representation_utils.py
│ │ ├── test_resources.py
│ │ ├── test_retry_policy.py
│ │ ├── test_retry_tenacity_conformance.py
│ │ ├── test_runtime_integration.py
│ │ ├── test_spans.py
│ │ ├── test_state_manager.py
│ │ ├── test_streaming.py
│ │ ├── test_testing_utils.py
│ │ ├── test_utils.py
│ │ ├── test_verbose_decorator.py
│ │ ├── test_workflow.py
│ │ ├── test_workflow_internal_events.py
│ │ ├── test_workflow_naming.py
│ │ ├── test_workflow_postponed_annotations.py
│ │ └── test_workflow_typed_state.py
│ └── llamactl/
│ ├── AGENTS.md
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── package.json
│ ├── pyproject.toml
│ ├── src/
│ │ ├── llama_agents/
│ │ │ └── cli/
│ │ │ ├── __init__.py
│ │ │ ├── app.py
│ │ │ ├── apply_yaml.py
│ │ │ ├── auth/
│ │ │ │ └── client.py
│ │ │ ├── client.py
│ │ │ ├── commands/
│ │ │ │ ├── agentcore.py
│ │ │ │ ├── aliased_group.py
│ │ │ │ ├── auth.py
│ │ │ │ ├── completion.py
│ │ │ │ ├── config.py
│ │ │ │ ├── deployment.py
│ │ │ │ ├── dev.py
│ │ │ │ ├── environments.py
│ │ │ │ ├── init.py
│ │ │ │ ├── organizations.py
│ │ │ │ ├── pkg.py
│ │ │ │ ├── projects.py
│ │ │ │ └── serve.py
│ │ │ ├── config/
│ │ │ │ ├── _config.py
│ │ │ │ ├── _migrations.py
│ │ │ │ ├── auth_service.py
│ │ │ │ ├── env_service.py
│ │ │ │ ├── migrations/
│ │ │ │ │ ├── 0001_init.sql
│ │ │ │ │ ├── 0002_add_auth_fields.sql
│ │ │ │ │ └── __init__.py
│ │ │ │ └── schema.py
│ │ │ ├── debug.py
│ │ │ ├── display.py
│ │ │ ├── env.py
│ │ │ ├── env_settings.py
│ │ │ ├── interactive.py
│ │ │ ├── local_context.py
│ │ │ ├── log_format.py
│ │ │ ├── options.py
│ │ │ ├── output.py
│ │ │ ├── param_types.py
│ │ │ ├── paths.py
│ │ │ ├── pkg/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── defaults.py
│ │ │ │ ├── options.py
│ │ │ │ └── utils.py
│ │ │ ├── py.typed
│ │ │ ├── render.py
│ │ │ ├── scaffold/
│ │ │ │ ├── .codex/
│ │ │ │ │ └── config.toml
│ │ │ │ ├── .cursor/
│ │ │ │ │ └── mcp.json
│ │ │ │ ├── .mcp.json
│ │ │ │ └── AGENTS.md
│ │ │ ├── styles.py
│ │ │ ├── templates/
│ │ │ │ └── agentcore_entrypoint.py.template
│ │ │ ├── templates.py
│ │ │ ├── utils/
│ │ │ │ ├── capabilities.py
│ │ │ │ ├── env_inject.py
│ │ │ │ ├── git_push.py
│ │ │ │ ├── redact.py
│ │ │ │ ├── retry.py
│ │ │ │ └── version.py
│ │ │ └── yaml_template.py
│ │ └── llama_deploy/
│ │ └── cli/
│ │ └── __init__.py
│ └── tests/
│ ├── conftest.py
│ ├── test_apply_yaml.py
│ ├── test_auth_cli.py
│ ├── test_auth_inject.py
│ ├── test_auth_login.py
│ ├── test_auth_validate.py
│ ├── test_cli_imports.py
│ ├── test_cli_options.py
│ ├── test_client_ssl_integration.py
│ ├── test_commands_core.py
│ ├── test_completion_commands.py
│ ├── test_config.py
│ ├── test_config_cli.py
│ ├── test_config_extras.py
│ ├── test_deployment_update_refs.py
│ ├── test_deployments_apply_cmd.py
│ ├── test_deployments_editor_cmd.py
│ ├── test_deployments_get_output.py
│ ├── test_deployments_logs.py
│ ├── test_deployments_template_cmd.py
│ ├── test_deployments_update.py
│ ├── test_dev_commands.py
│ ├── test_display.py
│ ├── test_env_and_auth_services.py
│ ├── test_env_settings.py
│ ├── test_environments_cli.py
│ ├── test_git_push.py
│ ├── test_init_command.py
│ ├── test_interactive.py
│ ├── test_local_context.py
│ ├── test_log_format.py
│ ├── test_migrations_concurrency.py
│ ├── test_organizations_cli.py
│ ├── test_param_types.py
│ ├── test_pkg.py
│ ├── test_projects_cli.py
│ ├── test_redact.py
│ ├── test_render.py
│ ├── test_retry.py
│ ├── test_serve_llama_cloud.py
│ ├── test_serve_summary.py
│ ├── test_serve_without_git.py
│ ├── test_session_utils.py
│ └── test_yaml_template.py
├── pnpm-workspace.yaml
├── pyproject.toml
├── scripts/
│ ├── process_manifests.py
│ └── sync-docs-to-developer-hub.sh
├── src/
│ └── dev_cli/
│ ├── __init__.py
│ ├── changesets.py
│ ├── cli.py
│ ├── commands/
│ │ ├── __init__.py
│ │ ├── changesets_cmd.py
│ │ ├── publish_cmd.py
│ │ ├── pytest_cmd.py
│ │ └── skills_cmd.py
│ ├── gha.py
│ ├── git_utils.py
│ ├── index_html.py
│ └── versioning.py
└── tests/
└── dev_cli/
├── conftest.py
├── test_changesets.py
├── test_cli_misc.py
└── test_pytest_cmd.py
Showing preview only (658K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6613 symbols across 438 files)
FILE: docs/api_docs/docs/api_reference/_static/js/algolia.js
function e (line 16) | function e(e, t) {
function t (line 28) | function t(t) {
function n (line 43) | function n(e) {
function r (line 61) | function r(e, t, n) {
function o (line 74) | function o() {
function i (line 89) | function i(e, t) {
function c (line 112) | function c(e, t) {
function a (line 155) | function a(e) {
function u (line 175) | function u(e, t) {
function l (line 190) | function l(e, t) {
function _ (line 203) | function _(e, t) {
function b (line 207) | function b(e) {
function g (line 211) | function g(e, t, n) {
function S (line 228) | function S(e, t, n, r, o) {
function O (line 246) | function O(e) {
function w (line 249) | function w(e, t) {
function E (line 252) | function E(e, t) {
function j (line 258) | function j(e) {
function P (line 269) | function P(e) {
function I (line 274) | function I() {
function D (line 302) | function D(e, t, n, r, o, i, c, a, u, l) {
function k (line 366) | function k(e, t, n) {
function C (line 377) | function C(e, t) {
function A (line 390) | function A(e, t, n, r, o, i) {
function x (line 402) | function x(e, t, n) {
function N (line 408) | function N(e, t, n, r, o) {
function T (line 444) | function T(e) {
function R (line 447) | function R(e) {
function q (line 450) | function q(e, t, n, r, o, i, c, a, u) {
function L (line 558) | function L(e, t) {
function M (line 572) | function M(e, t, n, r, o, i, c, a) {
function H (line 659) | function H(e, t, n) {
function U (line 666) | function U(e, t, n) {
function F (line 686) | function F(e, t, n) {
function B (line 689) | function B(e, t, n) {
function V (line 713) | function V(e, t) {
function K (line 716) | function K(e, t, n) {
function te (line 782) | function te(e, t) {
function ne (line 787) | function ne(e) {
function re (line 790) | function re(e, t, n) {
function oe (line 806) | function oe(e, t) {
function ie (line 810) | function ie(e, t) {
function ce (line 814) | function ce(e, t) {
function ae (line 818) | function ae() {
function le (line 885) | function le(e) {
function se (line 889) | function se(e) {
function fe (line 893) | function fe(e, t) {
function pe (line 902) | function pe(e, t) {
function me (line 905) | function me(e, t) {
function de (line 909) | function de(e, t) {
function ve (line 914) | function ve(e) {
function Se (line 948) | function Se() {
function Oe (line 951) | function Oe(e) {
function we (line 955) | function we() {
function je (line 1054) | function je(e) {
function Pe (line 1062) | function Pe(e) {
function Ie (line 1090) | function Ie(e, t) {
function Ae (line 1135) | function Ae(e, t, n) {
function Ne (line 1164) | function Ne() {}
function Te (line 1165) | function Te() {
function Re (line 1168) | function Re() {
function Fe (line 1251) | function Fe(e) {
function n (line 1356) | function n(e) {
function r (line 1364) | function r(t) {
function t (line 1375) | function t(t, r) {
function o (line 1403) | function o(o) {
function Ke (line 1425) | function Ke(e, t) {
function We (line 1437) | function We(e) {
function ze (line 1452) | function ze(e, t, n) {
function Je (line 1465) | function Je() {
function $e (line 1480) | function $e(e, t) {
function Ze (line 1503) | function Ze(e, t) {
function Qe (line 1547) | function Qe(e, t) {
function Ye (line 1562) | function Ye(e, t) {
function Ge (line 1567) | function Ge() {
function Xe (line 1580) | function Xe() {
function nt (line 1658) | function nt(e) {
function rt (line 1696) | function rt(e, t) {
function ot (line 1707) | function ot(e) {
function ct (line 1713) | function ct(e) {
function at (line 1720) | function at(e) {
function ut (line 1723) | function ut(e, t) {
function ft (line 1737) | function ft(e) {
function pt (line 1753) | function pt(e, t) {
function vt (line 1760) | function vt(e) {
function ht (line 1778) | function ht(e) {
function yt (line 1812) | function yt(e, t) {
function _t (line 1817) | function _t(e, t) {
function bt (line 1840) | function bt(e, t) {
function gt (line 1852) | function gt(e) {
function St (line 1867) | function St(e, t, n) {
function Ot (line 1892) | function Ot(e) {
function wt (line 1904) | function wt(e) {
function Et (line 1922) | function Et(e) {
function jt (line 2088) | function jt(e) {
function Pt (line 2102) | function Pt(e) {
function It (line 2105) | function It(e) {
function Dt (line 2123) | function Dt(e) {
function kt (line 2157) | function kt(e, t) {
function Ct (line 2162) | function Ct(e, t) {
function At (line 2174) | function At(e) {
function xt (line 2189) | function xt(e, t, n) {
function Rt (line 2231) | function Rt(e) {
function qt (line 2402) | function qt(e, t) {
function Lt (line 2442) | function Lt(e) {
function Mt (line 2445) | function Mt(e, t, n) {
function Ht (line 2452) | function Ht(e, t, n, r) {
function Ut (line 2458) | function Ut(e, t) {
function Ft (line 2470) | function Ft(e) {
function Bt (line 2485) | function Bt(e, t, n) {
function Vt (line 2510) | function Vt(e) {
function Kt (line 2528) | function Kt(e) {
function zt (line 2571) | function zt(e) {
function Jt (line 2589) | function Jt(e, t) {
function $t (line 2601) | function $t(e, t, n) {
function Zt (line 2626) | function Zt(e) {
function Qt (line 2644) | function Qt(e, t) {
function Yt (line 2656) | function Yt(e) {
function Gt (line 2671) | function Gt(e, t, n) {
function Xt (line 2696) | function Xt(e) {
function en (line 2714) | function en(e, t) {
function tn (line 2719) | function tn(e, t) {
function nn (line 2731) | function nn(e) {
function rn (line 2746) | function rn(e, t, n) {
function on (line 2771) | function on(e, t) {
function cn (line 2994) | function cn(e) {
function an (line 3012) | function an(e, t) {
function un (line 3024) | function un(e) {
function ln (line 3039) | function ln(e, t, n) {
function sn (line 3064) | function sn(e) {
function fn (line 3082) | function fn(e, t) {
function pn (line 3094) | function pn(e) {
function mn (line 3109) | function mn(e, t, n) {
function dn (line 3134) | function dn(e) {
function vn (line 3168) | function vn(e, t) {
function hn (line 3173) | function hn(e) {
function yn (line 3176) | function yn(e) {
function _n (line 3213) | function _n(e) {
function gn (line 3232) | function gn(e, t) {
function Sn (line 3244) | function Sn(e) {
function On (line 3259) | function On(e, t, n) {
function Dn (line 3298) | function Dn(e) {
function kn (line 3559) | function kn(e) {
function An (line 3578) | function An(e, t) {
function xn (line 3590) | function xn(e) {
function Nn (line 3605) | function Nn(e, t, n) {
function Tn (line 3630) | function Tn(e) {
function Bn (line 3655) | function Bn(e, t) {
function Vn (line 3667) | function Vn(e) {
function Kn (line 3682) | function Kn(e, t, n) {
function Wn (line 3707) | function Wn(e, t) {
function zn (line 3730) | function zn(e) {
function Jn (line 4214) | function Jn(e) {
function $n (line 4232) | function $n(e, t) {
function Zn (line 4244) | function Zn(e) {
function Qn (line 4259) | function Qn(e, t, n) {
function Yn (line 4284) | function Yn(e) {
function Gn (line 4324) | function Gn(e) {
function Xn (line 4332) | function Xn(e) {
function er (line 4350) | function er(e, t) {
function tr (line 4362) | function tr(e) {
function nr (line 4377) | function nr(e, t, n) {
function or (line 4503) | function or(e) {
function ir (line 4521) | function ir(e, t) {
function cr (line 4533) | function cr(e) {
function ar (line 4548) | function ar(e, t, n) {
function ur (line 4573) | function ur(e) {
function lr (line 4753) | function lr(e) {
function sr (line 4832) | function sr(e) {
function fr (line 4849) | function fr(e) {
function pr (line 4937) | function pr(e) {
function mr (line 4942) | function mr() {
function dr (line 4974) | function dr() {
function vr (line 4996) | function vr() {
function hr (line 5010) | function hr() {
function _r (line 5046) | function _r(e) {
function br (line 5056) | function br() {
function gr (line 5070) | function gr() {
function Sr (line 5083) | function Sr() {
function Or (line 5096) | function Or() {
function wr (line 5114) | function wr() {
function Er (line 5132) | function Er(e) {
function Pr (line 5152) | function Pr(e) {
function Dr (line 5255) | function Dr(e, t) {
function kr (line 5260) | function kr(e) {
function Cr (line 5277) | function Cr(e) {
function Ar (line 5303) | function Ar(e) {
function xr (line 5416) | function xr(e, t, n) {
function Nr (line 5426) | function Nr(e) {
function Tr (line 5429) | function Tr(e) {
function Rr (line 5432) | function Rr() {}
function Mr (line 5435) | function Mr(e) {
function Hr (line 5459) | function Hr(e) {
function Fr (line 5526) | function Fr(e) {
function Wr (line 5695) | function Wr(e) {
function Jr (line 5789) | function Jr(e) {
function $r (line 5845) | function $r(e) {
function Zr (line 5930) | function Zr(e) {
function Qr (line 5993) | function Qr() {
function Yr (line 6040) | function Yr(e) {
function Gr (line 6048) | function Gr(e, t) {
function Xr (line 6056) | function Xr(e) {
function no (line 6070) | function no(e, t) {
function oo (line 6094) | function oo(e) {
function io (line 6098) | function io(e) {
function uo (line 6109) | function uo(e, n, r, o) {
function lo (line 6262) | function lo(e) {
function so (line 6277) | function so(e, t, n) {
function fo (line 6285) | function fo(e) {
function po (line 6301) | function po(e) {
function mo (line 6306) | function mo(e) {
function Oo (line 6409) | function Oo(e, n, r) {
function Eo (line 6648) | function Eo(e) {
function jo (line 7108) | function jo(e) {
FILE: docs/api_docs/docs/api_reference/_static/js/leadfeeder.js
function ce (line 9) | function ce(src) {
FILE: docs/api_docs/docs/javascript/algolia.js
function e (line 16) | function e(e, t) {
function t (line 28) | function t(t) {
function n (line 43) | function n(e) {
function r (line 61) | function r(e, t, n) {
function o (line 74) | function o() {
function i (line 89) | function i(e, t) {
function c (line 112) | function c(e, t) {
function a (line 155) | function a(e) {
function u (line 175) | function u(e, t) {
function l (line 190) | function l(e, t) {
function _ (line 203) | function _(e, t) {
function b (line 207) | function b(e) {
function g (line 211) | function g(e, t, n) {
function S (line 228) | function S(e, t, n, r, o) {
function O (line 246) | function O(e) {
function w (line 249) | function w(e, t) {
function E (line 252) | function E(e, t) {
function j (line 258) | function j(e) {
function P (line 269) | function P(e) {
function I (line 274) | function I() {
function D (line 302) | function D(e, t, n, r, o, i, c, a, u, l) {
function k (line 366) | function k(e, t, n) {
function C (line 377) | function C(e, t) {
function A (line 390) | function A(e, t, n, r, o, i) {
function x (line 402) | function x(e, t, n) {
function N (line 408) | function N(e, t, n, r, o) {
function T (line 444) | function T(e) {
function R (line 447) | function R(e) {
function q (line 450) | function q(e, t, n, r, o, i, c, a, u) {
function L (line 558) | function L(e, t) {
function M (line 572) | function M(e, t, n, r, o, i, c, a) {
function H (line 659) | function H(e, t, n) {
function U (line 666) | function U(e, t, n) {
function F (line 686) | function F(e, t, n) {
function B (line 689) | function B(e, t, n) {
function V (line 713) | function V(e, t) {
function K (line 716) | function K(e, t, n) {
function te (line 782) | function te(e, t) {
function ne (line 787) | function ne(e) {
function re (line 790) | function re(e, t, n) {
function oe (line 806) | function oe(e, t) {
function ie (line 810) | function ie(e, t) {
function ce (line 814) | function ce(e, t) {
function ae (line 818) | function ae() {
function le (line 885) | function le(e) {
function se (line 889) | function se(e) {
function fe (line 893) | function fe(e, t) {
function pe (line 902) | function pe(e, t) {
function me (line 905) | function me(e, t) {
function de (line 909) | function de(e, t) {
function ve (line 914) | function ve(e) {
function Se (line 948) | function Se() {
function Oe (line 951) | function Oe(e) {
function we (line 955) | function we() {
function je (line 1054) | function je(e) {
function Pe (line 1062) | function Pe(e) {
function Ie (line 1090) | function Ie(e, t) {
function Ae (line 1135) | function Ae(e, t, n) {
function Ne (line 1164) | function Ne() {}
function Te (line 1165) | function Te() {
function Re (line 1168) | function Re() {
function Fe (line 1251) | function Fe(e) {
function n (line 1356) | function n(e) {
function r (line 1364) | function r(t) {
function t (line 1375) | function t(t, r) {
function o (line 1403) | function o(o) {
function Ke (line 1425) | function Ke(e, t) {
function We (line 1437) | function We(e) {
function ze (line 1452) | function ze(e, t, n) {
function Je (line 1465) | function Je() {
function $e (line 1480) | function $e(e, t) {
function Ze (line 1503) | function Ze(e, t) {
function Qe (line 1547) | function Qe(e, t) {
function Ye (line 1562) | function Ye(e, t) {
function Ge (line 1567) | function Ge() {
function Xe (line 1580) | function Xe() {
function nt (line 1658) | function nt(e) {
function rt (line 1696) | function rt(e, t) {
function ot (line 1707) | function ot(e) {
function ct (line 1713) | function ct(e) {
function at (line 1720) | function at(e) {
function ut (line 1723) | function ut(e, t) {
function ft (line 1737) | function ft(e) {
function pt (line 1753) | function pt(e, t) {
function vt (line 1760) | function vt(e) {
function ht (line 1778) | function ht(e) {
function yt (line 1812) | function yt(e, t) {
function _t (line 1817) | function _t(e, t) {
function bt (line 1840) | function bt(e, t) {
function gt (line 1852) | function gt(e) {
function St (line 1867) | function St(e, t, n) {
function Ot (line 1892) | function Ot(e) {
function wt (line 1904) | function wt(e) {
function Et (line 1922) | function Et(e) {
function jt (line 2088) | function jt(e) {
function Pt (line 2102) | function Pt(e) {
function It (line 2105) | function It(e) {
function Dt (line 2123) | function Dt(e) {
function kt (line 2157) | function kt(e, t) {
function Ct (line 2162) | function Ct(e, t) {
function At (line 2174) | function At(e) {
function xt (line 2189) | function xt(e, t, n) {
function Rt (line 2231) | function Rt(e) {
function qt (line 2402) | function qt(e, t) {
function Lt (line 2442) | function Lt(e) {
function Mt (line 2445) | function Mt(e, t, n) {
function Ht (line 2452) | function Ht(e, t, n, r) {
function Ut (line 2458) | function Ut(e, t) {
function Ft (line 2470) | function Ft(e) {
function Bt (line 2485) | function Bt(e, t, n) {
function Vt (line 2510) | function Vt(e) {
function Kt (line 2528) | function Kt(e) {
function zt (line 2571) | function zt(e) {
function Jt (line 2589) | function Jt(e, t) {
function $t (line 2601) | function $t(e, t, n) {
function Zt (line 2626) | function Zt(e) {
function Qt (line 2644) | function Qt(e, t) {
function Yt (line 2656) | function Yt(e) {
function Gt (line 2671) | function Gt(e, t, n) {
function Xt (line 2696) | function Xt(e) {
function en (line 2714) | function en(e, t) {
function tn (line 2719) | function tn(e, t) {
function nn (line 2731) | function nn(e) {
function rn (line 2746) | function rn(e, t, n) {
function on (line 2771) | function on(e, t) {
function cn (line 2994) | function cn(e) {
function an (line 3012) | function an(e, t) {
function un (line 3024) | function un(e) {
function ln (line 3039) | function ln(e, t, n) {
function sn (line 3064) | function sn(e) {
function fn (line 3082) | function fn(e, t) {
function pn (line 3094) | function pn(e) {
function mn (line 3109) | function mn(e, t, n) {
function dn (line 3134) | function dn(e) {
function vn (line 3168) | function vn(e, t) {
function hn (line 3173) | function hn(e) {
function yn (line 3176) | function yn(e) {
function _n (line 3213) | function _n(e) {
function gn (line 3232) | function gn(e, t) {
function Sn (line 3244) | function Sn(e) {
function On (line 3259) | function On(e, t, n) {
function Dn (line 3298) | function Dn(e) {
function kn (line 3559) | function kn(e) {
function An (line 3578) | function An(e, t) {
function xn (line 3590) | function xn(e) {
function Nn (line 3605) | function Nn(e, t, n) {
function Tn (line 3630) | function Tn(e) {
function Bn (line 3655) | function Bn(e, t) {
function Vn (line 3667) | function Vn(e) {
function Kn (line 3682) | function Kn(e, t, n) {
function Wn (line 3707) | function Wn(e, t) {
function zn (line 3730) | function zn(e) {
function Jn (line 4214) | function Jn(e) {
function $n (line 4232) | function $n(e, t) {
function Zn (line 4244) | function Zn(e) {
function Qn (line 4259) | function Qn(e, t, n) {
function Yn (line 4284) | function Yn(e) {
function Gn (line 4324) | function Gn(e) {
function Xn (line 4332) | function Xn(e) {
function er (line 4350) | function er(e, t) {
function tr (line 4362) | function tr(e) {
function nr (line 4377) | function nr(e, t, n) {
function or (line 4503) | function or(e) {
function ir (line 4521) | function ir(e, t) {
function cr (line 4533) | function cr(e) {
function ar (line 4548) | function ar(e, t, n) {
function ur (line 4573) | function ur(e) {
function lr (line 4753) | function lr(e) {
function sr (line 4832) | function sr(e) {
function fr (line 4849) | function fr(e) {
function pr (line 4937) | function pr(e) {
function mr (line 4942) | function mr() {
function dr (line 4974) | function dr() {
function vr (line 4996) | function vr() {
function hr (line 5010) | function hr() {
function _r (line 5046) | function _r(e) {
function br (line 5056) | function br() {
function gr (line 5070) | function gr() {
function Sr (line 5083) | function Sr() {
function Or (line 5096) | function Or() {
function wr (line 5114) | function wr() {
function Er (line 5132) | function Er(e) {
function Pr (line 5152) | function Pr(e) {
function Dr (line 5255) | function Dr(e, t) {
function kr (line 5260) | function kr(e) {
function Cr (line 5277) | function Cr(e) {
function Ar (line 5303) | function Ar(e) {
function xr (line 5416) | function xr(e, t, n) {
function Nr (line 5426) | function Nr(e) {
function Tr (line 5429) | function Tr(e) {
function Rr (line 5432) | function Rr() {}
function Mr (line 5435) | function Mr(e) {
function Hr (line 5459) | function Hr(e) {
function Fr (line 5526) | function Fr(e) {
function Wr (line 5695) | function Wr(e) {
function Jr (line 5789) | function Jr(e) {
function $r (line 5845) | function $r(e) {
function Zr (line 5930) | function Zr(e) {
function Qr (line 5993) | function Qr() {
function Yr (line 6040) | function Yr(e) {
function Gr (line 6048) | function Gr(e, t) {
function Xr (line 6056) | function Xr(e) {
function no (line 6070) | function no(e, t) {
function oo (line 6094) | function oo(e) {
function io (line 6098) | function io(e) {
function uo (line 6109) | function uo(e, n, r, o) {
function lo (line 6262) | function lo(e) {
function so (line 6277) | function so(e, t, n) {
function fo (line 6285) | function fo(e) {
function po (line 6301) | function po(e) {
function mo (line 6306) | function mo(e) {
function Oo (line 6409) | function Oo(e, n, r) {
function Eo (line 6648) | function Eo(e) {
function jo (line 7108) | function jo(e) {
FILE: docs/src/components/HomepageFeatures/index.js
function Feature (line 38) | function Feature({Svg, title, description}) {
function HomepageFeatures (line 52) | function HomepageFeatures() {
FILE: docs/src/components/ProtectedContent.jsx
constant SELF_HOSTING_PASSWORD (line 3) | const SELF_HOSTING_PASSWORD = 'llamacloud-self-host-2025';
constant STORAGE_KEY (line 4) | const STORAGE_KEY = 'llamacloud-self-hosting-auth';
function ProtectedContent (line 6) | function ProtectedContent({ children }) {
FILE: examples/client/base/workflow_client.py
class InputNumbers (line 9) | class InputNumbers(StartEvent):
function main (line 15) | async def main() -> None:
FILE: examples/client/base/workflow_server.py
class InputNumbers (line 9) | class InputNumbers(StartEvent):
class CalculationEvent (line 15) | class CalculationEvent(Event):
class OutputEvent (line 19) | class OutputEvent(StopEvent):
class AddOrSubtractWorkflow (line 23) | class AddOrSubtractWorkflow(Workflow):
method first_step (line 25) | async def first_step(self, ev: InputNumbers, ctx: Context) -> OutputEv...
function main (line 34) | async def main() -> None:
FILE: examples/client/human_in_the_loop/workflow_client_hitl.py
class ResponseEvent (line 10) | class ResponseEvent(HumanResponseEvent):
class OutEvent (line 14) | class OutEvent(StopEvent):
function main (line 18) | async def main() -> None:
FILE: examples/client/human_in_the_loop/workflow_server_hitl.py
class RequestEvent (line 12) | class RequestEvent(InputRequiredEvent):
class ResponseEvent (line 16) | class ResponseEvent(HumanResponseEvent):
class OutEvent (line 20) | class OutEvent(StopEvent):
class HumanInTheLoopWorkflow (line 24) | class HumanInTheLoopWorkflow(Workflow):
method prompt_human (line 26) | async def prompt_human(self, ev: StartEvent, ctx: Context) -> RequestE...
method greet_human (line 30) | async def greet_human(self, ev: ResponseEvent) -> OutEvent:
function main (line 34) | async def main() -> None:
FILE: examples/dbos/_replica.py
class Tick (line 26) | class Tick(Event):
class WaitDone (line 30) | class WaitDone(Event):
class CounterResult (line 34) | class CounterResult(StopEvent):
class CounterWorkflow (line 38) | class CounterWorkflow(Workflow):
method start (line 47) | async def start(self, ctx: Context, ev: StartEvent) -> WaitDone:
method tick (line 52) | async def tick(self, ctx: Context, ev: WaitDone) -> Tick | CounterResult:
method wait (line 63) | async def wait(self, ctx: Context, ev: Tick) -> WaitDone:
function main (line 68) | async def main() -> None:
FILE: examples/dbos/durable_workflow.py
class Tick (line 34) | class Tick(Event):
class CounterResult (line 38) | class CounterResult(StopEvent):
class CounterWorkflow (line 42) | class CounterWorkflow(Workflow):
method start (line 46) | async def start(self, ctx: Context, ev: StartEvent) -> Tick:
method increment (line 52) | async def increment(self, ctx: Context, ev: Tick) -> Tick | CounterRes...
function run (line 64) | def run(run_id: str, resume: bool = False) -> None:
function main (line 95) | def main() -> None:
FILE: examples/dbos/idle_release_demo.py
class AskName (line 39) | class AskName(InputRequiredEvent):
class UserInput (line 43) | class UserInput(HumanResponseEvent):
class GreeterWorkflow (line 47) | class GreeterWorkflow(Workflow):
method ask (line 49) | async def ask(self, ctx: Context, ev: StartEvent) -> AskName:
method greet (line 53) | async def greet(self, ctx: Context, ev: UserInput) -> StopEvent:
function drive_workflow (line 57) | async def drive_workflow(port: int) -> None:
function main (line 85) | async def main() -> None:
FILE: examples/dbos/server_quickstart.py
class Tick (line 50) | class Tick(Event):
class CounterResult (line 54) | class CounterResult(StopEvent):
class CounterWorkflow (line 58) | class CounterWorkflow(Workflow):
method start (line 62) | async def start(self, ctx: Context, ev: StartEvent) -> Tick:
method tick (line 66) | async def tick(self, ctx: Context, ev: Tick) -> Tick | CounterResult:
function main (line 79) | async def main() -> None:
FILE: examples/dbos/server_replicas.py
function ts (line 51) | def ts() -> str:
function log (line 55) | def log(msg: str, color: str = DIM) -> None:
function run_cmd (line 62) | def run_cmd(*args: str, **kwargs: Any) -> subprocess.CompletedProcess[str]:
function start_postgres (line 78) | def start_postgres() -> None:
function start_replica (line 102) | def start_replica(port: int) -> subprocess.Popen[str]:
function wait_for_server (line 112) | def wait_for_server(port: int, timeout: float = 30.0) -> None:
function start_workflow (line 128) | async def start_workflow(client: WorkflowClient) -> str:
function stream_events (line 133) | async def stream_events(
function async_main (line 157) | async def async_main() -> None:
function main (line 249) | def main() -> None:
FILE: examples/docker/app.py
class StreamEvent (line 9) | class StreamEvent(Event):
class GreetingWorkflow (line 13) | class GreetingWorkflow(Workflow):
method greet (line 15) | async def greet(self, ctx: Context, ev: StartEvent) -> StopEvent:
FILE: examples/k8s-otel/app.py
function _merge_instrument_tags (line 68) | def _merge_instrument_tags(
function _drop_uvicorn_color_message (line 80) | def _drop_uvicorn_color_message(
function setup_logging (line 89) | def setup_logging() -> None:
class Tick (line 172) | class Tick(Event):
class WaitDone (line 176) | class WaitDone(Event):
class CounterResult (line 180) | class CounterResult(StopEvent):
class CounterWorkflow (line 184) | class CounterWorkflow(Workflow):
method start (line 188) | async def start(self, ctx: Context, ev: StartEvent) -> WaitDone:
method tick (line 193) | async def tick(self, ctx: Context, ev: WaitDone) -> Tick | CounterResult:
method wait (line 203) | async def wait(self, ctx: Context, ev: Tick) -> WaitDone:
class AskName (line 213) | class AskName(InputRequiredEvent):
class UserInput (line 217) | class UserInput(HumanResponseEvent):
class GreeterWorkflow (line 221) | class GreeterWorkflow(Workflow):
method ask (line 225) | async def ask(self, ctx: Context, ev: StartEvent) -> AskName:
method greet (line 230) | async def greet(self, ctx: Context, ev: UserInput) -> StopEvent:
function _flush_and_shutdown (line 258) | def _flush_and_shutdown() -> None:
function lifespan (line 264) | async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
class AccessLogMiddleware (line 280) | class AccessLogMiddleware:
method __init__ (line 283) | def __init__(self, app: ASGIApp) -> None:
method __call__ (line 286) | async def __call__(self, scope: Scope, receive: Receive, send: Send) -...
function index (line 330) | async def index() -> RedirectResponse:
function health (line 335) | async def health() -> dict[str, str]:
function main (line 344) | async def main() -> None:
FILE: examples/server/server.py
class UserModel (line 9) | class UserModel(BaseModel):
function root (line 20) | async def root() -> dict:
function get_user (line 25) | async def get_user(user_id: int) -> dict:
function create_user (line 34) | async def create_user(user: UserModel) -> dict:
class UserProcessingWorkflow (line 39) | class UserProcessingWorkflow(Workflow):
method process_user (line 41) | async def process_user(self, ev: StartEvent) -> StopEvent:
class NotificationWorkflow (line 56) | class NotificationWorkflow(Workflow):
method send_notification (line 58) | async def send_notification(self, ev: StartEvent) -> StopEvent:
function main (line 74) | def main() -> None:
FILE: examples/server/server_example.py
class StreamEvent (line 15) | class StreamEvent(Event):
class GreetingInput (line 19) | class GreetingInput(StartEvent):
class GreetingOutput (line 26) | class GreetingOutput(StopEvent):
class GreetingWorkflow (line 33) | class GreetingWorkflow(Workflow):
method greet (line 35) | async def greet(self, ctx: Context, ev: GreetingInput) -> GreetingOutput:
class ProgressEvent (line 54) | class ProgressEvent(Event):
class MathWorkflow (line 60) | class MathWorkflow(Workflow):
method calculate (line 62) | async def calculate(self, ev: StartEvent) -> StopEvent:
class ProcessingWorkflow (line 83) | class ProcessingWorkflow(Workflow):
method process (line 87) | async def process(self, ctx: Context, ev: StartEvent) -> StopEvent:
class ComplicatedInput (line 126) | class ComplicatedInput(StartEvent):
class ChildTerrestrialEvent (line 133) | class ChildTerrestrialEvent(Event):
class AdultTerrestrialEvent (line 137) | class AdultTerrestrialEvent(Event):
class ExtraTerrestrialEvent (line 141) | class ExtraTerrestrialEvent(Event):
class ComplicatedWorkflow (line 146) | class ComplicatedWorkflow(Workflow):
method first_step (line 148) | async def first_step(
method terrestrial_child_step (line 200) | async def terrestrial_child_step(self, ev: ChildTerrestrialEvent) -> S...
method terrestrial_adult_step (line 205) | async def terrestrial_adult_step(self, ev: AdultTerrestrialEvent) -> S...
method extraterrestrial_step (line 210) | async def extraterrestrial_step(self, ev: ExtraTerrestrialEvent) -> St...
class RequestEvent (line 220) | class RequestEvent(InputRequiredEvent):
class ResponseEvent (line 224) | class ResponseEvent(HumanResponseEvent):
class RunEvent (line 228) | class RunEvent(StartEvent):
class HumanInTheLoopWorkflow (line 232) | class HumanInTheLoopWorkflow(Workflow):
method prompt_human (line 234) | async def prompt_human(self, ev: RunEvent) -> RequestEvent:
method greet_human (line 241) | async def greet_human(self, ctx: Context, ev: ResponseEvent) -> StopEv...
function main (line 246) | async def main() -> None:
FILE: examples/visualization/resource_nodes_example.py
class DatabaseClient (line 30) | class DatabaseClient:
method __init__ (line 33) | def __init__(self, connection_string: str = "postgres://localhost/db"):
method query (line 36) | def query(self, sql: str) -> list:
class CacheClient (line 41) | class CacheClient:
method __init__ (line 44) | def __init__(self, host: str = "localhost", port: int = 6379):
method get (line 48) | def get(self, key: str) -> str | None:
method set (line 52) | def set(self, key: str, value: str) -> None:
class LLMClient (line 57) | class LLMClient:
method __init__ (line 60) | def __init__(self, api_key: str = "sk-..."):
method complete (line 63) | async def complete(self, prompt: str) -> str:
function get_database_client (line 71) | def get_database_client() -> DatabaseClient:
function get_cache_client (line 80) | def get_cache_client() -> CacheClient:
function get_llm_client (line 88) | def get_llm_client() -> LLMClient:
class QueryProcessedEvent (line 99) | class QueryProcessedEvent(Event):
class ContextRetrievedEvent (line 106) | class ContextRetrievedEvent(Event):
class ResponseGeneratedEvent (line 112) | class ResponseGeneratedEvent(Event):
class RAGWorkflow (line 121) | class RAGWorkflow(Workflow):
method process_query (line 129) | async def process_query(
method retrieve_context (line 145) | async def retrieve_context(
method generate_response (line 167) | async def generate_response(
method finalize_response (line 178) | async def finalize_response(
function main (line 189) | def main() -> None:
FILE: operator/api/v1/llamadeployment_types.go
type LlamaDeploymentSpec (line 11) | type LlamaDeploymentSpec struct
type LlamaDeploymentStatus (line 65) | type LlamaDeploymentStatus struct
type ReleaseHistoryEntry (line 114) | type ReleaseHistoryEntry struct
type LlamaDeployment (line 132) | type LlamaDeployment struct
type LlamaDeploymentList (line 143) | type LlamaDeploymentList struct
function init (line 149) | func init() {
FILE: operator/api/v1/llamadeploymenttemplate_types.go
type LlamaDeploymentTemplateSpec (line 12) | type LlamaDeploymentTemplateSpec struct
type LlamaDeploymentTemplate (line 27) | type LlamaDeploymentTemplate struct
type LlamaDeploymentTemplateList (line 38) | type LlamaDeploymentTemplateList struct
function init (line 44) | func init() {
FILE: operator/api/v1/zz_generated.deepcopy.go
method DeepCopyInto (line 12) | func (in *LlamaDeployment) DeepCopyInto(out *LlamaDeployment) {
method DeepCopy (line 21) | func (in *LlamaDeployment) DeepCopy() *LlamaDeployment {
method DeepCopyObject (line 31) | func (in *LlamaDeployment) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 39) | func (in *LlamaDeploymentList) DeepCopyInto(out *LlamaDeploymentList) {
method DeepCopy (line 53) | func (in *LlamaDeploymentList) DeepCopy() *LlamaDeploymentList {
method DeepCopyObject (line 63) | func (in *LlamaDeploymentList) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 71) | func (in *LlamaDeploymentSpec) DeepCopyInto(out *LlamaDeploymentSpec) {
method DeepCopy (line 76) | func (in *LlamaDeploymentSpec) DeepCopy() *LlamaDeploymentSpec {
method DeepCopyInto (line 86) | func (in *LlamaDeploymentStatus) DeepCopyInto(out *LlamaDeploymentStatus) {
method DeepCopy (line 106) | func (in *LlamaDeploymentStatus) DeepCopy() *LlamaDeploymentStatus {
method DeepCopyInto (line 116) | func (in *LlamaDeploymentTemplate) DeepCopyInto(out *LlamaDeploymentTemp...
method DeepCopy (line 124) | func (in *LlamaDeploymentTemplate) DeepCopy() *LlamaDeploymentTemplate {
method DeepCopyObject (line 134) | func (in *LlamaDeploymentTemplate) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 142) | func (in *LlamaDeploymentTemplateList) DeepCopyInto(out *LlamaDeployment...
method DeepCopy (line 156) | func (in *LlamaDeploymentTemplateList) DeepCopy() *LlamaDeploymentTempla...
method DeepCopyObject (line 166) | func (in *LlamaDeploymentTemplateList) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 174) | func (in *LlamaDeploymentTemplateSpec) DeepCopyInto(out *LlamaDeployment...
method DeepCopy (line 180) | func (in *LlamaDeploymentTemplateSpec) DeepCopy() *LlamaDeploymentTempla...
method DeepCopyInto (line 190) | func (in *ReleaseHistoryEntry) DeepCopyInto(out *ReleaseHistoryEntry) {
method DeepCopy (line 196) | func (in *ReleaseHistoryEntry) DeepCopy() *ReleaseHistoryEntry {
FILE: operator/cmd/main.go
type Config (line 40) | type Config struct
function init (line 58) | func init() {
function main (line 66) | func main() {
FILE: operator/dev.py
function run (line 36) | def run(
function kind_cluster_exists (line 54) | def kind_cluster_exists() -> bool:
function ensure_kind_cluster (line 59) | def ensure_kind_cluster() -> None:
function ensure_docker_desktop_cluster (line 122) | def ensure_docker_desktop_cluster() -> None:
function install_ingress_controller (line 152) | def install_ingress_controller(target: str) -> None:
function resolve_target (line 220) | def resolve_target(ctx: click.Context, target: str | None) -> str:
function resolve_apps_namespace (line 224) | def resolve_apps_namespace(
function cli (line 234) | def cli(ctx: click.Context, target: str | None, apps_namespace: str | No...
function up (line 245) | def up(ctx: click.Context, target: str | None, apps_namespace: str | Non...
function down (line 305) | def down(
function status (line 340) | def status(ctx: click.Context, target: str | None, apps_namespace: str |...
FILE: operator/internal/controller/classify_pod_test.go
function TestClassifyPod (line 9) | func TestClassifyPod(t *testing.T) {
FILE: operator/internal/controller/image_tag_unit_test.go
function TestGetContainerImageTag_Precedence_SpecOverridesEnv (line 14) | func TestGetContainerImageTag_Precedence_SpecOverridesEnv(t *testing.T) {
FILE: operator/internal/controller/lifecycle.go
function isFailedPhase (line 22) | func isFailedPhase(phase string) bool {
function isAwaitingCodePush (line 28) | func isAwaitingCodePush(ld *llamadeployv1.LlamaDeployment) bool {
function isRollingPhase (line 33) | func isRollingPhase(phase string) bool {
method checkRolloutCapacity (line 39) | func (r *LlamaDeploymentReconciler) checkRolloutCapacity(ctx context.Con...
method checkDeploymentCapacity (line 83) | func (r *LlamaDeploymentReconciler) checkDeploymentCapacity(ctx context....
method checkCapacityGates (line 121) | func (r *LlamaDeploymentReconciler) checkCapacityGates(ctx context.Conte...
method checkSecretGate (line 140) | func (r *LlamaDeploymentReconciler) checkSecretGate(ctx context.Context,...
method checkSecretExists (line 153) | func (r *LlamaDeploymentReconciler) checkSecretExists(ctx context.Contex...
method assessDeploymentHealth (line 201) | func (r *LlamaDeploymentReconciler) assessDeploymentHealth(ctx context.C...
method determineDeploymentPhase (line 237) | func (r *LlamaDeploymentReconciler) determineDeploymentPhase(ctx context...
type rolloutTimeoutResult (line 311) | type rolloutTimeoutResult struct
method checkRolloutTimeout (line 320) | func (r *LlamaDeploymentReconciler) checkRolloutTimeout(ctx context.Cont...
method remediateFailedRollout (line 356) | func (r *LlamaDeploymentReconciler) remediateFailedRollout(ctx context.C...
type failureType (line 400) | type failureType
method String (line 408) | func (f failureType) String() string {
constant failureUnknown (line 403) | failureUnknown failureType = iota
constant failureApp (line 404) | failureApp
constant failureInfra (line 405) | failureInfra
method classifyPodFailures (line 423) | func (r *LlamaDeploymentReconciler) classifyPodFailures(ctx context.Cont...
function classifyPod (line 458) | func classifyPod(pod *corev1.Pod) failureType {
method scaleDownFailingReplicaSet (line 494) | func (r *LlamaDeploymentReconciler) scaleDownFailingReplicaSet(ctx conte...
method finalizePhase (line 620) | func (r *LlamaDeploymentReconciler) finalizePhase(ctx context.Context, l...
FILE: operator/internal/controller/lifecycle_test.go
function testSchemeWithApps (line 21) | func testSchemeWithApps() *runtime.Scheme {
function TestAssessDeploymentHealth_RolloutTimeout (line 31) | func TestAssessDeploymentHealth_RolloutTimeout(t *testing.T) {
function TestAssessDeploymentHealth_RolloutTimeout_WithAvailableReplicas (line 74) | func TestAssessDeploymentHealth_RolloutTimeout_WithAvailableReplicas(t *...
function TestAssessDeploymentHealth_PhaseRunning (line 117) | func TestAssessDeploymentHealth_PhaseRunning(t *testing.T) {
function TestAssessDeploymentHealth_PhasePending_NoDeployment (line 161) | func TestAssessDeploymentHealth_PhasePending_NoDeployment(t *testing.T) {
function TestAssessDeploymentHealth_ClearsRolloutStartedAt_OnRunning (line 198) | func TestAssessDeploymentHealth_ClearsRolloutStartedAt_OnRunning(t *test...
function TestAssessDeploymentHealth_PhaseSuspended (line 250) | func TestAssessDeploymentHealth_PhaseSuspended(t *testing.T) {
function TestAssessDeploymentHealth_PhaseFailed_ProgressFalse_NoAvailable (line 280) | func TestAssessDeploymentHealth_PhaseFailed_ProgressFalse_NoAvailable(t ...
function TestCheckCapacityGates_SkipsWhenNotNeedsFullReconcile (line 324) | func TestCheckCapacityGates_SkipsWhenNotNeedsFullReconcile(t *testing.T) {
function TestCheckCapacityGates_SkipsWhenSuspended (line 353) | func TestCheckCapacityGates_SkipsWhenSuspended(t *testing.T) {
function TestCheckCapacityGates_SkipsWhenAwaitingCodePhase (line 382) | func TestCheckCapacityGates_SkipsWhenAwaitingCodePhase(t *testing.T) {
function TestCheckCapacityGates_RequeuesWhenMaxDeploymentsExceeded (line 426) | func TestCheckCapacityGates_RequeuesWhenMaxDeploymentsExceeded(t *testin...
function TestCheckSecretGate_NilWhenSecretNameEmpty (line 473) | func TestCheckSecretGate_NilWhenSecretNameEmpty(t *testing.T) {
function TestFinalizePhase_NoWriteWhenUnchangedAndNotDirty (line 502) | func TestFinalizePhase_NoWriteWhenUnchangedAndNotDirty(t *testing.T) {
function TestFinalizePhase_WritesOnPhaseChange (line 538) | func TestFinalizePhase_WritesOnPhaseChange(t *testing.T) {
function TestFinalizePhase_WritesWhenStatusDirty (line 571) | func TestFinalizePhase_WritesWhenStatusDirty(t *testing.T) {
function TestIsFailedPhase (line 606) | func TestIsFailedPhase(t *testing.T) {
function TestCheckRolloutTimeout_NilRolloutStartedAt (line 634) | func TestCheckRolloutTimeout_NilRolloutStartedAt(t *testing.T) {
function TestCheckRolloutTimeout_RecentStart_RequeuesWithRemaining (line 655) | func TestCheckRolloutTimeout_RecentStart_RequeuesWithRemaining(t *testin...
function TestCheckRolloutCapacity_UnlimitedWhenZero (line 681) | func TestCheckRolloutCapacity_UnlimitedWhenZero(t *testing.T) {
function TestCheckRolloutCapacity_RequeuesAtLimit (line 699) | func TestCheckRolloutCapacity_RequeuesAtLimit(t *testing.T) {
function TestCheckRolloutCapacity_IgnoresSuspendedDeployments (line 729) | func TestCheckRolloutCapacity_IgnoresSuspendedDeployments(t *testing.T) {
function TestCheckRolloutCapacity_IgnoresAwaitingCodeDeployments (line 757) | func TestCheckRolloutCapacity_IgnoresAwaitingCodeDeployments(t *testing....
function TestCheckDeploymentCapacity_UnlimitedWhenZero (line 789) | func TestCheckDeploymentCapacity_UnlimitedWhenZero(t *testing.T) {
function TestCheckDeploymentCapacity_RequeuesAtLimit (line 807) | func TestCheckDeploymentCapacity_RequeuesAtLimit(t *testing.T) {
function TestCheckDeploymentCapacity_IgnoresAwaitingCodeDeployments (line 836) | func TestCheckDeploymentCapacity_IgnoresAwaitingCodeDeployments(t *testi...
function TestFailureTypeString (line 868) | func TestFailureTypeString(t *testing.T) {
FILE: operator/internal/controller/llamadeployment_controller_test.go
constant LLAMA_DEPLOY_REPO_URL (line 29) | LLAMA_DEPLOY_REPO_URL = "LLAMA_DEPLOY_REPO_URL"
constant APP (line 30) | APP = "app"
FILE: operator/internal/controller/mapping_unit_test.go
constant containerNameApp (line 17) | containerNameApp = "app"
constant containerNameFileServer (line 18) | containerNameFileServer = "file-server"
function TestGenerateNginxConfig_StaticAndProxy (line 22) | func TestGenerateNginxConfig_StaticAndProxy(t *testing.T) {
function TestCreateDeploymentForLlama_ShapesPodSpec (line 43) | func TestCreateDeploymentForLlama_ShapesPodSpec(t *testing.T) {
function TestGetRolloutTimeout_Default (line 75) | func TestGetRolloutTimeout_Default(t *testing.T) {
function TestGetRolloutTimeout_Custom (line 84) | func TestGetRolloutTimeout_Custom(t *testing.T) {
function TestGetRolloutTimeoutSeconds_Default (line 92) | func TestGetRolloutTimeoutSeconds_Default(t *testing.T) {
function TestGetRolloutTimeoutSeconds_Custom (line 100) | func TestGetRolloutTimeoutSeconds_Custom(t *testing.T) {
function TestCreateDeploymentForLlama_ProgressDeadlineSeconds_Default (line 108) | func TestCreateDeploymentForLlama_ProgressDeadlineSeconds_Default(t *tes...
function TestCreateDeploymentForLlama_ProgressDeadlineSeconds_Custom (line 124) | func TestCreateDeploymentForLlama_ProgressDeadlineSeconds_Custom(t *test...
function TestCreateDeploymentForLlama_BuildIdEnvVar (line 142) | func TestCreateDeploymentForLlama_BuildIdEnvVar(t *testing.T) {
function TestCreateDeploymentForLlama_NoBuildIdEnvVar (line 182) | func TestCreateDeploymentForLlama_NoBuildIdEnvVar(t *testing.T) {
function TestCreateDeploymentForLlama_ReplicasZeroForFailedPhase (line 211) | func TestCreateDeploymentForLlama_ReplicasZeroForFailedPhase(t *testing....
function TestCreateDeploymentForLlama_ReplicasZeroForSuspended (line 229) | func TestCreateDeploymentForLlama_ReplicasZeroForSuspended(t *testing.T) {
function TestLooksLikeFilePath (line 247) | func TestLooksLikeFilePath(t *testing.T) {
function TestGetContainerImage (line 275) | func TestGetContainerImage(t *testing.T) {
function TestGetContainerImageTag (line 310) | func TestGetContainerImageTag(t *testing.T) {
function TestShouldForceOwnership (line 345) | func TestShouldForceOwnership(t *testing.T) {
function TestGetContainerImagePullPolicy (line 422) | func TestGetContainerImagePullPolicy(t *testing.T) {
function TestGetDefaultImage (line 448) | func TestGetDefaultImage(t *testing.T) {
function TestGetDefaultImageTag (line 463) | func TestGetDefaultImageTag(t *testing.T) {
function TestGetNginxImage (line 482) | func TestGetNginxImage(t *testing.T) {
function TestGetNginxImageTag (line 497) | func TestGetNginxImageTag(t *testing.T) {
function TestCreateDeploymentForLlama_WorkingDir (line 516) | func TestCreateDeploymentForLlama_WorkingDir(t *testing.T) {
function TestCommonEnvVars_AppserverVersion (line 559) | func TestCommonEnvVars_AppserverVersion(t *testing.T) {
function TestCommonEnvFrom (line 621) | func TestCommonEnvFrom(t *testing.T) {
function TestIsValidDNS1035Label (line 649) | func TestIsValidDNS1035Label(t *testing.T) {
FILE: operator/internal/controller/metrics.go
type PhaseCollector (line 20) | type PhaseCollector struct
method Describe (line 30) | func (c *PhaseCollector) Describe(ch chan<- *prometheus.Desc) {
method Collect (line 34) | func (c *PhaseCollector) Collect(ch chan<- prometheus.Metric) {
function NewPhaseCollector (line 26) | func NewPhaseCollector(reader client.Reader) *PhaseCollector {
type CapacityCollector (line 68) | type CapacityCollector struct
method Describe (line 79) | func (c *CapacityCollector) Describe(ch chan<- *prometheus.Desc) {
method Collect (line 84) | func (c *CapacityCollector) Collect(ch chan<- prometheus.Metric) {
function NewCapacityCollector (line 75) | func NewCapacityCollector(reader client.Reader, maxDeployments int) *Cap...
FILE: operator/internal/controller/reconcile.go
constant llamaDeploymentFinalizer (line 29) | llamaDeploymentFinalizer = "deploy.llamaindex.ai/finalizer"
constant PhasePending (line 32) | PhasePending = "Pending"
constant PhaseRunning (line 33) | PhaseRunning = "Running"
constant PhaseFailed (line 34) | PhaseFailed = "Failed"
constant PhaseRollingOut (line 35) | PhaseRollingOut = "RollingOut"
constant PhaseRolloutFailed (line 36) | PhaseRolloutFailed = "RolloutFailed"
constant PhaseSuspended (line 37) | PhaseSuspended = "Suspended"
constant PhaseBuilding (line 38) | PhaseBuilding = "Building"
constant PhaseBuildFailed (line 39) | PhaseBuildFailed = "BuildFailed"
constant PhaseAwaitingCode (line 40) | PhaseAwaitingCode = "AwaitingCode"
constant BuildStatusPending (line 43) | BuildStatusPending = "Pending"
constant BuildStatusRunning (line 44) | BuildStatusRunning = "Running"
constant BuildStatusSucceeded (line 45) | BuildStatusSucceeded = "Succeeded"
constant BuildStatusFailed (line 46) | BuildStatusFailed = "Failed"
constant CurrentSchemaVersion (line 51) | CurrentSchemaVersion = "7"
constant EnvMaxConcurrentRollouts (line 54) | EnvMaxConcurrentRollouts = "LLAMA_DEPLOY_MAX_CONCURRENT_ROLLOUTS"
constant EnvMaxDeployments (line 55) | EnvMaxDeployments = "LLAMA_DEPLOY_MAX_DEPLOYMENTS"
function ptr (line 59) | func ptr[T any](v T) *T { return &v }
function generateAuthToken (line 62) | func generateAuthToken() (string, error) {
function isTerminalFailure (line 104) | func isTerminalFailure(phase string) bool {
function isActivePhase (line 110) | func isActivePhase(phase string) bool {
type LlamaDeploymentReconciler (line 115) | type LlamaDeploymentReconciler struct
method needsFullReconciliation (line 83) | func (r *LlamaDeploymentReconciler) needsFullReconciliation(llamaDeplo...
method directClient (line 132) | func (r *LlamaDeploymentReconciler) directClient() client.Client {
method fetchDeployment (line 138) | func (r *LlamaDeploymentReconciler) fetchDeployment(ctx context.Contex...
method migrateDisplayName (line 154) | func (r *LlamaDeploymentReconciler) migrateDisplayName(ctx context.Con...
method ensureFinalizer (line 190) | func (r *LlamaDeploymentReconciler) ensureFinalizer(ctx context.Contex...
method handleAlreadyFailed (line 208) | func (r *LlamaDeploymentReconciler) handleAlreadyFailed(ctx context.Co...
method Reconcile (line 244) | func (r *LlamaDeploymentReconciler) Reconcile(ctx context.Context, req...
method initializeStatus (line 359) | func (r *LlamaDeploymentReconciler) initializeStatus(ctx context.Conte...
method handleReconcileFailure (line 429) | func (r *LlamaDeploymentReconciler) handleReconcileFailure(ctx context...
method handleInvalidDNSName (line 455) | func (r *LlamaDeploymentReconciler) handleInvalidDNSName(ctx context.C...
method deleteOwnedResources (line 490) | func (r *LlamaDeploymentReconciler) deleteOwnedResources(ctx context.C...
method updateVersionTracking (line 537) | func (r *LlamaDeploymentReconciler) updateVersionTracking(ctx context....
method handleDeletion (line 591) | func (r *LlamaDeploymentReconciler) handleDeletion(ctx context.Context...
method deleteSecret (line 615) | func (r *LlamaDeploymentReconciler) deleteSecret(ctx context.Context, ...
method SetupWithManager (line 629) | func (r *LlamaDeploymentReconciler) SetupWithManager(mgr ctrl.Manager)...
FILE: operator/internal/controller/reconcile_test.go
function TestNeedsFullReconciliation (line 20) | func TestNeedsFullReconciliation(t *testing.T) {
function TestIsTerminalFailure (line 87) | func TestIsTerminalFailure(t *testing.T) {
function TestIsActivePhase (line 115) | func TestIsActivePhase(t *testing.T) {
function TestHandleAlreadyFailed_SkipsWhenNoFullReconcile (line 144) | func TestHandleAlreadyFailed_SkipsWhenNoFullReconcile(t *testing.T) {
function TestHandleReconcileFailure_UpdatesStatusToFailed (line 175) | func TestHandleReconcileFailure_UpdatesStatusToFailed(t *testing.T) {
function TestHandleReconcileFailure_DoesNotOverwriteAlreadyFailed (line 206) | func TestHandleReconcileFailure_DoesNotOverwriteAlreadyFailed(t *testing...
FILE: operator/internal/controller/resources.go
constant DefaultImage (line 32) | DefaultImage = "llamaindex/llama-agents-appserver"
constant DefaultImageTag (line 33) | DefaultImageTag = "latest"
constant EnvImageName (line 36) | EnvImageName = "LLAMA_DEPLOY_IMAGE"
constant EnvImageTag (line 37) | EnvImageTag = "LLAMA_DEPLOY_IMAGE_TAG"
constant EnvImagePullPolicy (line 38) | EnvImagePullPolicy = "LLAMA_DEPLOY_IMAGE_PULL_POLICY"
constant DefaultNginxImage (line 41) | DefaultNginxImage = "nginxinc/nginx-unprivileged"
constant DefaultNginxImageTag (line 42) | DefaultNginxImageTag = "1.27-alpine"
constant EnvNginxImageName (line 43) | EnvNginxImageName = "LLAMA_DEPLOY_NGINX_IMAGE"
constant EnvNginxImageTag (line 44) | EnvNginxImageTag = "LLAMA_DEPLOY_NGINX_IMAGE_TAG"
constant EnvNginxImagePullPolicy (line 45) | EnvNginxImagePullPolicy = "LLAMA_DEPLOY_NGINX_IMAGE_PULL_POLICY"
constant EnvDefaultCPURequest (line 48) | EnvDefaultCPURequest = "LLAMA_DEPLOY_DEFAULT_CPU_REQUEST"
constant EnvDefaultMemoryRequest (line 49) | EnvDefaultMemoryRequest = "LLAMA_DEPLOY_DEFAULT_MEMORY_REQUEST"
constant EnvDefaultCPULimit (line 53) | EnvDefaultCPULimit = "LLAMA_DEPLOY_DEFAULT_CPU_LIMIT"
constant EnvDefaultMemoryLimit (line 54) | EnvDefaultMemoryLimit = "LLAMA_DEPLOY_DEFAULT_MEMORY_LIMIT"
constant ContainerNameApp (line 57) | ContainerNameApp = "app"
constant ContainerNameBuild (line 58) | ContainerNameBuild = "build"
constant AppServerUID (line 61) | AppServerUID int64 = 1001
constant AppServerGID (line 62) | AppServerGID int64 = 1001
constant NginxUID (line 63) | NginxUID int64 = 101
constant NginxGID (line 64) | NginxGID int64 = 101
constant DefaultImagePullPolicy (line 67) | DefaultImagePullPolicy = "IfNotPresent"
constant DefaultRolloutTimeoutSeconds (line 70) | DefaultRolloutTimeoutSeconds int32 = 1800
constant DeploymentRevisionHistoryLimit (line 74) | DeploymentRevisionHistoryLimit int32 = 10
constant EnvRolloutTimeoutSeconds (line 77) | EnvRolloutTimeoutSeconds = "LLAMA_DEPLOY_ROLLOUT_TIMEOUT_SECONDS"
constant appserverTagPrefix (line 81) | appserverTagPrefix = "appserver-"
function buildJobName (line 86) | func buildJobName(deploymentName, buildId string) string {
function looksLikeFilePath (line 97) | func looksLikeFilePath(p string) bool {
function getDefaultImage (line 112) | func getDefaultImage() string {
function getDefaultImageTag (line 123) | func getDefaultImageTag() string {
function getContainerImage (line 134) | func getContainerImage(llamaDeploy *llamadeployv1.LlamaDeployment) string {
function getContainerImageTag (line 148) | func getContainerImageTag(llamaDeploy *llamadeployv1.LlamaDeployment) st...
function getContainerImagePullPolicy (line 163) | func getContainerImagePullPolicy() corev1.PullPolicy {
function getPullPolicyFromEnv (line 181) | func getPullPolicyFromEnv(envVarName string) corev1.PullPolicy {
function getNginxImage (line 198) | func getNginxImage() string {
function getNginxImageTag (line 206) | func getNginxImageTag() string {
function getNginxImagePullPolicy (line 214) | func getNginxImagePullPolicy() corev1.PullPolicy {
function parseOptionalQuantityFromEnv (line 222) | func parseOptionalQuantityFromEnv(envVarName string) (*resource.Quantity...
function getDefaultResourceRequests (line 243) | func getDefaultResourceRequests() corev1.ResourceList {
function getDefaultResourceLimits (line 264) | func getDefaultResourceLimits() corev1.ResourceList {
function defaultPodSecurityContext (line 282) | func defaultPodSecurityContext() *corev1.PodSecurityContext {
function defaultContainerSecurityContext (line 290) | func defaultContainerSecurityContext() *corev1.SecurityContext {
function hardenedSecurityContext (line 303) | func hardenedSecurityContext() *corev1.SecurityContext {
function getRolloutTimeout (line 312) | func getRolloutTimeout() time.Duration {
function getRolloutTimeoutSeconds (line 317) | func getRolloutTimeoutSeconds() *int32 {
function getRolloutTimeoutSecondsValue (line 323) | func getRolloutTimeoutSecondsValue() int32 {
function isValidDNS1035Label (line 335) | func isValidDNS1035Label(name string) bool {
function computeBuildId (line 365) | func computeBuildId(llamaDeploy *llamadeployv1.LlamaDeployment) string {
method supersedeStaleBuildJob (line 379) | func (r *LlamaDeploymentReconciler) supersedeStaleBuildJob(
method reconcileBuild (line 427) | func (r *LlamaDeploymentReconciler) reconcileBuild(ctx context.Context, ...
method createBuildJob (line 592) | func (r *LlamaDeploymentReconciler) createBuildJob(llamaDeploy *llamadep...
method applyBuildJobTemplateOverlay (line 661) | func (r *LlamaDeploymentReconciler) applyBuildJobTemplateOverlay(ctx con...
function findContainerSecurityContext (line 751) | func findContainerSecurityContext(containers []corev1.Container, name st...
function findContainerResources (line 765) | func findContainerResources(containers []corev1.Container, name string) ...
function mergeResourceRequirements (line 779) | func mergeResourceRequirements(overlay, defaults *corev1.ResourceRequire...
method reconcileResources (line 802) | func (r *LlamaDeploymentReconciler) reconcileResources(ctx context.Conte...
method verifySecret (line 847) | func (r *LlamaDeploymentReconciler) verifySecret(ctx context.Context, ll...
method reconcileDeployment (line 858) | func (r *LlamaDeploymentReconciler) reconcileDeployment(ctx context.Cont...
method reconcileNginxConfigMap (line 914) | func (r *LlamaDeploymentReconciler) reconcileNginxConfigMap(ctx context....
method reconcileService (line 931) | func (r *LlamaDeploymentReconciler) reconcileService(ctx context.Context...
method commonEnvVars (line 967) | func (r *LlamaDeploymentReconciler) commonEnvVars(llamaDeploy *llamadepl...
method commonEnvFrom (line 1024) | func (r *LlamaDeploymentReconciler) commonEnvFrom(llamaDeploy *llamadepl...
method createDeploymentForLlama (line 1041) | func (r *LlamaDeploymentReconciler) createDeploymentForLlama(llamaDeploy...
method generateNginxConfig (line 1198) | func (r *LlamaDeploymentReconciler) generateNginxConfig(llamaDeploy *lla...
method shouldForceOwnership (line 1240) | func (r *LlamaDeploymentReconciler) shouldForceOwnership(ld *llamadeploy...
method applyTemplateOverlay (line 1278) | func (r *LlamaDeploymentReconciler) applyTemplateOverlay(ctx context.Con...
FILE: operator/internal/controller/resources_build_unit_test.go
function TestCreateBuildJob_HasDefaultResources (line 24) | func TestCreateBuildJob_HasDefaultResources(t *testing.T) {
function TestApplyBuildJobTemplateOverlay_MergesAppResources (line 61) | func TestApplyBuildJobTemplateOverlay_MergesAppResources(t *testing.T) {
function TestApplyBuildJobTemplateOverlay_TemplateOverridesDefaults (line 139) | func TestApplyBuildJobTemplateOverlay_TemplateOverridesDefaults(t *testi...
function newTestScheme (line 207) | func newTestScheme() *runtime.Scheme {
type buildSupersedeFixture (line 218) | type buildSupersedeFixture struct
function newBuildSupersedeFixture (line 228) | func newBuildSupersedeFixture(
function TestComputeBuildId_Deterministic (line 282) | func TestComputeBuildId_Deterministic(t *testing.T) {
function TestComputeBuildId_DifferentInputs (line 297) | func TestComputeBuildId_DifferentInputs(t *testing.T) {
function TestComputeBuildId_IncludesBuildGeneration (line 311) | func TestComputeBuildId_IncludesBuildGeneration(t *testing.T) {
function TestComputeBuildId_DoesNotIncludeImageTag (line 327) | func TestComputeBuildId_DoesNotIncludeImageTag(t *testing.T) {
function TestCreateBuildJob_JobNameTruncation (line 345) | func TestCreateBuildJob_JobNameTruncation(t *testing.T) {
function TestCreateBuildJob_Labels (line 358) | func TestCreateBuildJob_Labels(t *testing.T) {
constant envBuildID (line 374) | envBuildID = "LLAMA_DEPLOY_BUILD_ID"
function TestCreateBuildJob_HasBuildIdEnvVar (line 376) | func TestCreateBuildJob_HasBuildIdEnvVar(t *testing.T) {
function TestFindContainerResources (line 402) | func TestFindContainerResources(t *testing.T) {
function TestMergeResourceRequirements (line 439) | func TestMergeResourceRequirements(t *testing.T) {
function TestReconcileBuild_StaleJobDeletion_OnGenerationAdvance (line 479) | func TestReconcileBuild_StaleJobDeletion_OnGenerationAdvance(t *testing....
function TestReconcileBuild_NoJobDeletion_OnSameGeneration (line 557) | func TestReconcileBuild_NoJobDeletion_OnSameGeneration(t *testing.T) {
function TestInitializeStatus_PreservesPhaseBuilding (line 630) | func TestInitializeStatus_PreservesPhaseBuilding(t *testing.T) {
function TestIsRollingPhase (line 675) | func TestIsRollingPhase(t *testing.T) {
function TestReconcileBuild_SkipsSuspendedDeployment (line 726) | func TestReconcileBuild_SkipsSuspendedDeployment(t *testing.T) {
function TestReconcileBuild_CacheHitSucceeded (line 764) | func TestReconcileBuild_CacheHitSucceeded(t *testing.T) {
function TestReconcileBuild_JobRunning (line 803) | func TestReconcileBuild_JobRunning(t *testing.T) {
function TestInitializeStatus_ResetsPendingPhase (line 857) | func TestInitializeStatus_ResetsPendingPhase(t *testing.T) {
function TestReconcileBuild_SkipsWhenRepoUrlEmpty (line 901) | func TestReconcileBuild_SkipsWhenRepoUrlEmpty(t *testing.T) {
function TestReconcileBuild_SupersedesInFlightJob_OnBuildIdChange (line 941) | func TestReconcileBuild_SupersedesInFlightJob_OnBuildIdChange(t *testing...
function TestReconcileBuild_DoesNotDeleteSucceededSupersededJob (line 979) | func TestReconcileBuild_DoesNotDeleteSucceededSupersededJob(t *testing.T) {
function TestReconcileBuild_SupersedesJob_WhenStaleJobAlreadyGone (line 1003) | func TestReconcileBuild_SupersedesJob_WhenStaleJobAlreadyGone(t *testing...
function TestReconcileBuild_ProceedsWhenRepoUrlSetButGitShaEmpty (line 1027) | func TestReconcileBuild_ProceedsWhenRepoUrlSetButGitShaEmpty(t *testing....
FILE: operator/internal/controller/resources_security_test.go
function TestFindContainerSecurityContext (line 21) | func TestFindContainerSecurityContext(t *testing.T) {
function TestCreateBuildJob_SecurityContext (line 60) | func TestCreateBuildJob_SecurityContext(t *testing.T) {
function TestCreateDeployment_SecurityContexts (line 88) | func TestCreateDeployment_SecurityContexts(t *testing.T) {
function TestCreateBuildJob_HasGitSafeDirectoryEnvVars (line 153) | func TestCreateBuildJob_HasGitSafeDirectoryEnvVars(t *testing.T) {
function TestApplyBuildJobTemplateOverlay_PropagatesSecurityContext (line 175) | func TestApplyBuildJobTemplateOverlay_PropagatesSecurityContext(t *testi...
function TestGenerateNginxConfig_NonRootDirectives (line 288) | func TestGenerateNginxConfig_NonRootDirectives(t *testing.T) {
function assertFullSecurityContext (line 320) | func assertFullSecurityContext(t *testing.T, sc *corev1.SecurityContext,...
function assertEnvVar (line 342) | func assertEnvVar(t *testing.T, envs []corev1.EnvVar, name, value string) {
function findContainer (line 355) | func findContainer(containers []corev1.Container, name string) *corev1.C...
FILE: operator/internal/controller/suite_test.go
function TestControllers (line 34) | func TestControllers(t *testing.T) {
function getFirstFoundEnvTestBinaryDir (line 90) | func getFirstFoundEnvTestBinaryDir() string {
FILE: operator/internal/controller/test_utils_test.go
function GetDeploymentEventually (line 22) | func GetDeploymentEventually(ctx context.Context, name, ns string) *apps...
function GetConfigMapEventually (line 31) | func GetConfigMapEventually(ctx context.Context, name, ns string) *corev...
function FindContainer (line 40) | func FindContainer(podSpec corev1.PodSpec, name string) (corev1.Containe...
function FindInitContainer (line 50) | func FindInitContainer(podSpec corev1.PodSpec, name string) (corev1.Cont...
function EnvMap (line 60) | func EnvMap(c corev1.Container) map[string]string {
function ExpectEnv (line 71) | func ExpectEnv(c corev1.Container, key, value string) {
function ExpectEnvMatches (line 77) | func ExpectEnvMatches(c corev1.Container, key, pattern string) {
function ExpectServicePort (line 83) | func ExpectServicePort(ctx context.Context, name, ns string, port int32,...
function CleanupLlama (line 94) | func CleanupLlama(ctx context.Context, name, ns string) {
type LlamaSpecOption (line 118) | type LlamaSpecOption
function WithImage (line 120) | func WithImage(image string) LlamaSpecOption {
function WithImageTag (line 123) | func WithImageTag(tag string) LlamaSpecOption {
function WithSecret (line 126) | func WithSecret(name string) LlamaSpecOption {
function WithDeploymentFilePath (line 129) | func WithDeploymentFilePath(path string) LlamaSpecOption {
function WithGitRef (line 132) | func WithGitRef(ref string) LlamaSpecOption {
function WithGitSha (line 135) | func WithGitSha(sha string) LlamaSpecOption {
function WithRepoUrl (line 138) | func WithRepoUrl(url string) LlamaSpecOption {
function WithAssetsPath (line 141) | func WithAssetsPath(path string) LlamaSpecOption {
function WithBuildGeneration (line 144) | func WithBuildGeneration(gen int64) LlamaSpecOption {
function NewLlama (line 149) | func NewLlama(name, ns, projectId, repoURL string, opts ...LlamaSpecOpti...
function SetDeploymentAvailableReplicas (line 166) | func SetDeploymentAvailableReplicas(ctx context.Context, name, ns string...
type ReconcilerOption (line 178) | type ReconcilerOption
function WithMaxConcurrentRollouts (line 180) | func WithMaxConcurrentRollouts(n int) ReconcilerOption {
function WithMaxDeployments (line 184) | func WithMaxDeployments(n int) ReconcilerOption {
function NewTestReconciler (line 189) | func NewTestReconciler(opts ...ReconcilerOption) *LlamaDeploymentReconci...
function CreateAndReconcile (line 203) | func CreateAndReconcile(ctx context.Context, r *LlamaDeploymentReconcile...
function CompleteBuild (line 212) | func CompleteBuild(ctx context.Context, r *LlamaDeploymentReconciler, ll...
FILE: packages/llama-agents-agentcore/src/llama_agents/agentcore/_runtime_decorator.py
function as_agentcore_async_task (line 26) | def as_agentcore_async_task(
function as_agentcore_workflow_run (line 43) | def as_agentcore_workflow_run(
class AgentCoreRuntimeDecorator (line 66) | class AgentCoreRuntimeDecorator(ServerRuntimeDecorator):
method __init__ (line 67) | def __init__(
method register (line 80) | def register(self, workflow: Workflow) -> RegisteredWorkflow:
method track_workflow (line 98) | def track_workflow(self, workflow: Workflow) -> None:
method untrack_workflow (line 102) | def untrack_workflow(self, workflow: Workflow) -> None:
method get_registered (line 106) | def get_registered(self, workflow: Workflow) -> RegisteredWorkflow | N...
method get_workflow (line 109) | def get_workflow(self, name: str) -> Workflow | None:
method get_workflow_names (line 112) | def get_workflow_names(self) -> list[str]:
FILE: packages/llama-agents-agentcore/src/llama_agents/agentcore/_service.py
class WorkflowNotFoundError (line 24) | class WorkflowNotFoundError(Exception):
method __init__ (line 29) | def __init__(self, workflow_name: str) -> None:
method __repr__ (line 32) | def __repr__(self) -> str:
method __str__ (line 35) | def __str__(self) -> str:
class AgentCoreService (line 39) | class AgentCoreService:
method __init__ (line 40) | def __init__(
method add_workflow (line 63) | def add_workflow(self, workflow_name: str, workflow: Workflow) -> None:
method get_workflow (line 67) | def get_workflow(self, workflow_name: str) -> Workflow | None:
method get_workflow_names (line 71) | def get_workflow_names(self) -> list[str]:
method run_workflow (line 75) | async def run_workflow(
method run_workflow_with_session (line 87) | async def run_workflow_with_session(
method get_handler (line 127) | async def get_handler(self, handler_id: str) -> HandlerData | None:
method query_handlers (line 131) | async def query_handlers(self, query: HandlerQuery) -> list:
method get_events (line 135) | async def get_events(
method send_event (line 152) | async def send_event(
method cancel_handler (line 158) | async def cancel_handler(self, handler_id: str, purge: bool = False) -...
FILE: packages/llama-agents-agentcore/src/llama_agents/agentcore/deploy.py
class DeployedRuntime (line 60) | class DeployedRuntime:
method to_dict (line 71) | def to_dict(self) -> dict[str, str]:
method from_dict (line 84) | def from_dict(cls, data: dict[str, str]) -> DeployedRuntime:
class DeployConfig (line 90) | class DeployConfig:
class AgentCoreDeployer (line 103) | class AgentCoreDeployer:
method __init__ (line 115) | def __init__(
method account_id (line 128) | def account_id(self) -> str:
method deploy (line 138) | def deploy(
method invoke (line 209) | def invoke(
method destroy (line 245) | def destroy(
method destroy_from_metadata (line 275) | def destroy_from_metadata(self, runtime: DeployedRuntime) -> None:
method _build_and_push (line 281) | def _build_and_push(
method _create_source_zip (line 354) | def _create_source_zip(
method _wait_for_build (line 408) | def _wait_for_build(self, build_id: str, poll_interval: int = 10) -> str:
method _deploy_runtime (line 447) | def _deploy_runtime(
method _find_runtime (line 493) | def _find_runtime(client: Any, runtime_name: str) -> dict[str, Any] | ...
method _wait_for_ready (line 504) | def _wait_for_ready(client: Any, runtime_id: str) -> None:
method _wait_for_deletion (line 519) | def _wait_for_deletion(client: Any, runtime_id: str) -> None:
method _ensure_s3_bucket (line 536) | def _ensure_s3_bucket(self, bucket_name: str) -> None:
function _sanitize_name (line 554) | def _sanitize_name(name: str) -> str:
function _project_name_from_pyproject (line 559) | def _project_name_from_pyproject(project_dir: Path) -> str:
function _generate_dockerfile (line 578) | def _generate_dockerfile() -> str:
function _generate_requirements (line 598) | def _generate_requirements(project_dir: Path) -> str:
function _parse_deployment_env_vars (line 617) | def _parse_deployment_env_vars(project_dir: Path) -> dict[str, str]:
function _generate_buildspec (line 631) | def _generate_buildspec(
FILE: packages/llama-agents-agentcore/src/llama_agents/agentcore/entrypoint.py
class WorkflowResult (line 72) | class WorkflowResult(BaseModel):
class HandlerResult (line 82) | class HandlerResult(BaseModel):
function _load_workflows (line 103) | def _load_workflows() -> tuple[dict[str, Workflow], str, str | None]:
function _get_sqlite_db_path (line 135) | def _get_sqlite_db_path() -> str:
function get_agentcore_service (line 144) | def get_agentcore_service() -> AgentCoreService:
function _dt_str (line 162) | def _dt_str(dt: Any) -> str | None:
function _handler_to_result (line 170) | def _handler_to_result(
function _serialize_event (line 192) | def _serialize_event(stored_event: Any) -> dict[str, Any]:
function _resolve_handler_id (line 209) | def _resolve_handler_id(payload: dict[str, Any], session_id: str) -> str:
function _parse_and_validate_payload (line 224) | def _parse_and_validate_payload(
function _action_run (line 262) | async def _action_run(
function _action_get_result (line 305) | async def _action_get_result(
function _action_get_events (line 319) | async def _action_get_events(
function _action_send_event (line 338) | async def _action_send_event(
function _action_cancel (line 356) | async def _action_cancel(payload: dict[str, Any], session_id: str) -> di...
function _action_list_workflows (line 370) | async def _action_list_workflows(
function _action_list_handlers (line 378) | async def _action_list_handlers(
function invoke (line 415) | async def invoke(payload: dict, context: Any) -> dict[str, Any]:
FILE: packages/llama-agents-agentcore/src/llama_agents/agentcore/export.py
function export_generated_entrypoint_code (line 6) | def export_generated_entrypoint_code() -> None:
FILE: packages/llama-agents-agentcore/tests/conftest.py
class FileEvent (line 9) | class FileEvent(StartEvent):
class Metadata (line 13) | class Metadata(BaseModel):
class DummyWorkflow (line 17) | class DummyWorkflow(Workflow):
method take_step (line 19) | async def take_step(self, ev: StartEvent) -> StopEvent:
class DummyFileWorkflow (line 23) | class DummyFileWorkflow(Workflow):
method take_step (line 25) | async def take_step(self, ev: FileEvent) -> StopEvent:
class DummyMetadataWorkflow (line 29) | class DummyMetadataWorkflow(Workflow):
method take_step (line 31) | async def take_step(self, ev: StartEvent) -> StopEvent:
class DummyWorkflowWithError (line 35) | class DummyWorkflowWithError(Workflow):
method take_step (line 37) | async def take_step(self, ev: StartEvent) -> StopEvent:
class MockContext (line 42) | class MockContext:
class MockHandlerData (line 47) | class MockHandlerData:
class MockAgentCoreService (line 59) | class MockAgentCoreService:
method __init__ (line 60) | def __init__(self, with_error: bool = False) -> None:
method run_workflow (line 65) | async def run_workflow(
method run_workflow_with_session (line 80) | async def run_workflow_with_session(
method get_workflow_names (line 112) | def get_workflow_names(self) -> list[str]:
method get_handler (line 115) | async def get_handler(self, handler_id: str) -> MockHandlerData | None:
method query_handlers (line 118) | async def query_handlers(self, query: Any) -> list:
method get_events (line 121) | async def get_events(
method send_event (line 129) | async def send_event(
method cancel_handler (line 134) | async def cancel_handler(self, handler_id: str, purge: bool = False) -...
class MockBedrockApp (line 138) | class MockBedrockApp:
method __init__ (line 139) | def __init__(self) -> None:
method add_async_task (line 144) | def add_async_task(self, name: str, metadata: dict[str, Any] | None = ...
method complete_async_task (line 149) | def complete_async_task(self, task_id: int) -> bool:
FILE: packages/llama-agents-agentcore/tests/test_entrypoint.py
function loaded_workflows (line 26) | def loaded_workflows() -> dict[str, Workflow]:
function test_load_workflows_with_meta (line 34) | def test_load_workflows_with_meta(
function test_load_workflows_without_meta (line 68) | def test_load_workflows_without_meta(
function test_load_workflows_without_file (line 106) | def test_load_workflows_without_file(
function test_parse_and_validate_payload_success (line 144) | def test_parse_and_validate_payload_success(
function test_parse_and_validate_payload_file_id (line 160) | def test_parse_and_validate_payload_file_id(
function test_parse_and_validate_payload_defaults (line 176) | def test_parse_and_validate_payload_defaults(
function test_parse_and_validate_payload_workflow_not_found (line 192) | def test_parse_and_validate_payload_workflow_not_found(
function test_parse_and_validate_payload_invalid_event (line 208) | def test_parse_and_validate_payload_invalid_event(
function test_invoke_success_default_action (line 225) | async def test_invoke_success_default_action(
function test_invoke_with_explicit_handler_id (line 258) | async def test_invoke_with_explicit_handler_id(
function test_invoke_error (line 289) | async def test_invoke_error(loaded_workflows: dict[str, Workflow]) -> None:
function test_invoke_handler_with_error (line 322) | async def test_invoke_handler_with_error(loaded_workflows: dict[str, Wor...
function test_invoke_validation_error (line 346) | async def test_invoke_validation_error(loaded_workflows: dict[str, Workf...
function test_invoke_run_nowait (line 372) | async def test_invoke_run_nowait(loaded_workflows: dict[str, Workflow]) ...
function test_invoke_list_workflows (line 396) | async def test_invoke_list_workflows(loaded_workflows: dict[str, Workflo...
function test_invoke_unknown_action (line 420) | async def test_invoke_unknown_action(loaded_workflows: dict[str, Workflo...
FILE: packages/llama-agents-agentcore/tests/test_export.py
function test_export (line 10) | def test_export(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
FILE: packages/llama-agents-agentcore/tests/test_service.py
function workflows (line 22) | def workflows() -> dict[str, Workflow]:
function store (line 31) | def store() -> MemoryWorkflowStore:
function test_init (line 35) | def test_init(store: MemoryWorkflowStore) -> None:
function test_add_workflows (line 43) | def test_add_workflows(
function test_run_workflow_simple_success (line 60) | async def test_run_workflow_simple_success(
function test_run_workflow_file_success (line 79) | async def test_run_workflow_file_success(
function test_run_workflow_retains_error (line 98) | async def test_run_workflow_retains_error(
function test_run_workflow_not_found_error (line 119) | async def test_run_workflow_not_found_error(
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/app.py
function lifespan (line 61) | async def lifespan(app: FastAPI) -> AsyncGenerator[None, Any]:
function _setup_openapi (line 105) | def _setup_openapi(name: str, app: FastAPI, server: WorkflowServer) -> N...
function _configure_cors (line 157) | def _configure_cors(app: FastAPI) -> None:
function open_browser_async (line 177) | def open_browser_async(host: str, port: int) -> None:
function prepare_server (line 185) | def prepare_server(
function start_server (line 207) | def start_server(
function start_server_in_target_venv (line 255) | def start_server_in_target_venv(
function start_preflight_in_target_venv (line 313) | def start_preflight_in_target_venv(
function start_export_json_graph_in_target_venv (line 356) | def start_export_json_graph_in_target_venv(
class PreflightValidationError (line 394) | class PreflightValidationError(Exception):
method __init__ (line 401) | def __init__(self, errors: list[tuple[str, str]]):
function preflight_validate (line 408) | def preflight_validate(
function export_json_graph (line 450) | def export_json_graph(
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/bootstrap.py
function _extract_filter (line 40) | def _extract_filter(member: tarfile.TarInfo, dest_path: str) -> tarfile....
function _download_and_extract_artifact (line 77) | def _download_and_extract_artifact(
function _create_tarball (line 121) | def _create_tarball(source_dir: str, output_path: str) -> None:
function _artifact_exists (line 138) | def _artifact_exists(
function _upload_artifact (line 170) | def _upload_artifact(
function bootstrap_app_from_repo (line 205) | def bootstrap_app_from_repo(
function run_build (line 300) | def run_build(target_dir: str = "/opt/app") -> None:
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/configure_logging.py
function _get_or_create_correlation_id (line 22) | def _get_or_create_correlation_id(request: Request) -> str:
function add_log_middleware (line 26) | def add_log_middleware(app: FastAPI) -> None:
function _add_request_id (line 56) | def _add_request_id(_: Any, __: str, event_dict: dict[str, Any]) -> dict...
function _drop_uvicorn_color_message (line 63) | def _drop_uvicorn_color_message(
function setup_logging (line 71) | def setup_logging(level: str = "INFO") -> None:
function _is_proxy_request (line 171) | def _is_proxy_request(request: Request) -> bool:
function _is_health_request (line 179) | def _is_health_request(request: Request) -> bool:
class _HttpxProxyNoiseFilter (line 188) | class _HttpxProxyNoiseFilter(logging.Filter):
method filter (line 189) | def filter(self, record: logging.LogRecord) -> bool:
function suppress_httpx_logs (line 200) | async def suppress_httpx_logs() -> AsyncGenerator[None, None]:
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/correlation_id.py
function get_correlation_id (line 8) | def get_correlation_id() -> str:
function set_correlation_id (line 12) | def set_correlation_id(correlation_id: str) -> None:
function create_correlation_id (line 16) | def create_correlation_id() -> str:
function random_alphanumeric_string (line 23) | def random_alphanumeric_string(length: int) -> str:
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/deployment.py
class DeploymentError (line 31) | class DeploymentError(Exception): ...
class Deployment (line 34) | class Deployment:
method __init__ (line 35) | def __init__(
method default_service (line 56) | def default_service(self) -> Workflow | None:
method service_names (line 61) | def service_names(self) -> list[str]:
method run_workflow (line 65) | async def run_workflow(
method run_workflow_no_wait (line 78) | def run_workflow_no_wait(
method create_workflow_server (line 96) | def create_workflow_server(
method mount_workflow_server (line 136) | def mount_workflow_server(self, app: FastAPI) -> WorkflowServer:
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/deployment_config_parser.py
function get_deployment_config (line 8) | def get_deployment_config() -> DeploymentConfig:
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/interrupts.py
function setup_interrupts (line 10) | def setup_interrupts() -> None:
class OperationAborted (line 16) | class OperationAborted(Exception):
function wait_or_abort (line 23) | async def wait_or_abort(
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/process_utils.py
function run_process (line 12) | def run_process(
function spawn_process (line 44) | def spawn_process(
function _use_color (line 69) | def _use_color() -> bool:
function _colored_prefix (line 79) | def _colored_prefix(prefix: str, color_code: str) -> str:
function _make_prefixer (line 83) | def _make_prefixer(
function _should_use_pty (line 102) | def _should_use_pty(use_tty: bool | None) -> bool:
function should_use_color (line 110) | def should_use_color() -> bool:
class SpawnProcessResult (line 115) | class SpawnProcessResult:
function _spawn_process (line 121) | def _spawn_process(
function _stream_source (line 180) | def _stream_source(
function _log_command (line 214) | def _log_command(cmd: list[str], transform: Callable[[str], str | None] ...
function _start_stream_threads (line 223) | def _start_stream_threads(
class BootstrapHandler (line 237) | class BootstrapHandler(logging.Handler):
method __init__ (line 246) | def __init__(
method emit (line 255) | def emit(self, record: logging.LogRecord) -> None:
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/routers/deployments.py
function create_base_router (line 24) | def create_base_router(name: str) -> APIRouter:
function create_deployments_router (line 36) | def create_deployments_router(name: str, deployment: Deployment) -> APIR...
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/routers/status.py
function health (line 8) | async def health() -> Status:
function healthz (line 15) | async def healthz() -> Status:
function livez (line 20) | async def livez() -> Status:
function readyz (line 25) | async def readyz() -> Status:
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/routers/ui_proxy.py
function _ws_proxy (line 31) | async def _ws_proxy(ws: WebSocket, upstream_url: str) -> None:
function create_ui_proxy_router (line 134) | def create_ui_proxy_router(name: str, port: int) -> APIRouter:
function mount_static_files (line 242) | def mount_static_files(
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/settings.py
class BootstrapSettings (line 11) | class BootstrapSettings(BaseSettings):
class ApiserverSettings (line 47) | class ApiserverSettings(BaseSettings):
method resolved_config_parent (line 97) | def resolved_config_parent(self) -> Path:
function configure_settings (line 104) | def configure_settings(
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/types.py
function generate_id (line 7) | def generate_id() -> str:
class TaskDefinition (line 11) | class TaskDefinition(BaseModel):
class SessionDefinition (line 33) | class SessionDefinition(BaseModel):
class EventDefinition (line 51) | class EventDefinition(BaseModel):
class TaskResult (line 65) | class TaskResult(BaseModel):
class StatusEnum (line 86) | class StatusEnum(Enum):
class Status (line 92) | class Status(BaseModel):
class DeploymentDefinition (line 96) | class DeploymentDefinition(BaseModel):
FILE: packages/llama-agents-appserver/src/llama_agents/appserver/workflow_loader.py
function _dist_name_for_version (line 43) | def _dist_name_for_version(version: Version) -> str:
function load_workflows (line 50) | def load_workflows(config: DeploymentConfig) -> dict[str, Workflow]:
function load_environment_variables (line 88) | def load_environment_variables(config: DeploymentConfig, source_root: Pa...
function validate_required_env_vars (line 97) | def validate_required_env_vars(
function parse_environment_variables (line 130) | def parse_environment_variables(
function are_we_editable_mode (line 146) | def are_we_editable_mode() -> bool:
function inject_appserver_into_target (line 163) | def inject_appserver_into_target(
function _uv_run_python (line 196) | def _uv_run_python(cwd: Path, snippet: str, *, stderr: int | None = None...
function _get_installed_version_within_target (line 211) | def _get_installed_version_within_target(
function _get_current_version (line 237) | def _get_current_version() -> Version:
function _is_missing_or_outdated (line 241) | def _is_missing_or_outdated(path: Path) -> Version | None:
function _get_appserver_workflows_requirement (line 253) | def _get_appserver_workflows_requirement() -> SpecifierSet | None:
function _ensure_compatible_workflows (line 263) | def _ensure_compatible_workflows(
function run_uv (line 310) | def run_uv(
function _resolve_project_venv (line 331) | def _resolve_project_venv(source_root: Path, path: Path) -> Path:
function _install_and_add_appserver_if_missing (line 342) | def _install_and_add_appserver_if_missing(
function _find_development_pyproject (line 448) | def _find_development_pyproject() -> Path | None:
function _exclude_venv_warning (line 457) | def _exclude_venv_warning(line: str) -> str | None:
function _ensure_uv_available (line 463) | def _ensure_uv_available() -> None:
class SamePythonVersionResult (line 495) | class SamePythonVersionResult:
function _same_python_version (line 501) | def _same_python_version(venv_path: Path) -> SamePythonVersionResult:
function install_ui (line 522) | def install_ui(config: DeploymentConfig, config_parent: Path) -> None:
function _ui_env (line 543) | def _ui_env(config: DeploymentConfig, settings: ApiserverSettings) -> di...
function build_ui (line 563) | def build_ui(
function start_dev_ui_process (line 588) | def start_dev_ui_process(
FILE: packages/llama-agents-appserver/tests/conftest.py
function reset_config_cache (line 17) | def reset_config_cache(
function http_client (line 30) | def http_client() -> TestClient:
function write_yaml (line 35) | def write_yaml(tmp_path: Path) -> Iterator[Callable[[str, str], Path]]:
function no_browser (line 45) | def no_browser(monkeypatch: pytest.MonkeyPatch) -> None:
function make_deployment_file (line 53) | def make_deployment_file(tmp_path: Path) -> Callable[[str, bool], Path]:
function process_stub (line 74) | def process_stub() -> object:
function proc_with_poll_wait (line 86) | def proc_with_poll_wait() -> object:
FILE: packages/llama-agents-appserver/tests/routers/test_deployments.py
function build_app (line 14) | def build_app(name: str, deployment: Deployment) -> TestClient:
function test_create_and_run_task_basic (line 21) | def test_create_and_run_task_basic() -> None:
function test_create_task_nowait_and_list (line 38) | def test_create_task_nowait_and_list() -> None:
function test_get_event_stream (line 58) | def test_get_event_stream() -> None:
function test_sessions_crud (line 88) | def test_sessions_crud() -> None:
FILE: packages/llama-agents-appserver/tests/routers/test_ui_proxy.py
function build_client (line 10) | def build_client() -> TestClient:
function test_proxy_success (line 17) | def test_proxy_success() -> None:
function test_proxy_timeout (line 28) | def test_proxy_timeout() -> None:
function test_proxy_connect_error_results_in_502 (line 38) | def test_proxy_connect_error_results_in_502() -> None:
function test_header_filtering_and_methods_with_body_and_headers (line 48) | def test_header_filtering_and_methods_with_body_and_headers() -> None:
FILE: packages/llama-agents-appserver/tests/routers/test_ui_proxy_ws.py
class FakeUpstreamWebSocket (line 12) | class FakeUpstreamWebSocket:
method __init__ (line 13) | def __init__(self) -> None:
method __aiter__ (line 19) | def __aiter__(self) -> Any:
method send (line 22) | async def send(self, data: Any) -> None:
method recv (line 26) | async def recv(self) -> Any:
method push_from_server (line 33) | async def push_from_server(self, data: Any) -> None:
method close (line 36) | async def close(self) -> None:
function test_websocket_text_and_binary_and_subprotocol (line 41) | async def test_websocket_text_and_binary_and_subprotocol(
function test_websocket_upstream_raises_is_handled (line 108) | async def test_websocket_upstream_raises_is_handled(
FILE: packages/llama-agents-appserver/tests/test_app.py
function _reset_deployment_config (line 14) | def _reset_deployment_config() -> None:
function _write_deployment (line 18) | def _write_deployment(
function test_root_redirect_and_metrics (line 33) | def test_root_redirect_and_metrics(tmp_path: Path) -> None:
function test_static_ui_mount_serves_dist (line 54) | def test_static_ui_mount_serves_dist(tmp_path: Path) -> None:
function test_workflowserver_endpoint_available (line 71) | def test_workflowserver_endpoint_available(tmp_path: Path) -> None:
FILE: packages/llama-agents-appserver/tests/test_app_server_start.py
function test_start_server_sets_env_and_runs_server (line 12) | def test_start_server_sets_env_and_runs_server(
function test_start_server_proxies_ui_and_terminates (line 61) | def test_start_server_proxies_ui_and_terminates(
function test_prepare_server_calls_install_and_build_when_flags_set (line 101) | def test_prepare_server_calls_install_and_build_when_flags_set(
function test_prepare_server_install_only_invokes_inject_and_install (line 136) | def test_prepare_server_install_only_invokes_inject_and_install(
function test_start_server_open_browser_triggers (line 157) | def test_start_server_open_browser_triggers(
function test_start_server_in_target_venv_invocation (line 188) | def test_start_server_in_target_venv_invocation(
FILE: packages/llama-agents-appserver/tests/test_bootstrap.py
function _set_bootstrap_env (line 13) | def _set_bootstrap_env(
function _stub_bootstrap_pipeline (line 36) | def _stub_bootstrap_pipeline(monkeypatch: pytest.MonkeyPatch) -> dict[st...
function test_bootstrap_minimal_happy_path (line 55) | def test_bootstrap_minimal_happy_path(
function test_bootstrap_invokes_clone_repo_with_explicit_git_sha_and_git_ref (line 97) | def test_bootstrap_invokes_clone_repo_with_explicit_git_sha_and_git_ref(
function test_bootstrap_invokes_clone_repo_with_git_ref_only (line 126) | def test_bootstrap_invokes_clone_repo_with_git_ref_only(
function test_bootstrap_raises_when_repo_url_missing (line 151) | def test_bootstrap_raises_when_repo_url_missing(
function test_bootstrap_invokes_clone_repo_with_auth_token (line 161) | def test_bootstrap_invokes_clone_repo_with_auth_token(
function test_bootstrap_configure_settings_called_with_app_root_and_deployment_file (line 179) | def test_bootstrap_configure_settings_called_with_app_root_and_deploymen...
function test_bootstrap_sdists_passed_when_tarballs_present (line 204) | def test_bootstrap_sdists_passed_when_tarballs_present(
function test_bootstrap_sdists_none_when_empty_or_no_tarballs (line 240) | def test_bootstrap_sdists_none_when_empty_or_no_tarballs(
function test_bootstrap_propagates_errors_from_clone (line 263) | def test_bootstrap_propagates_errors_from_clone(
function _write_minimal_deployment_config (line 281) | def _write_minimal_deployment_config(tmp_path: Path) -> None:
function test_artifact_exists_raises_on_503 (line 290) | def test_artifact_exists_raises_on_503() -> None:
function test_artifact_exists_returns_false_on_404 (line 297) | def test_artifact_exists_returns_false_on_404() -> None:
function test_artifact_exists_returns_true_on_200 (line 303) | def test_artifact_exists_returns_true_on_200() -> None:
function test_upload_artifact_raises_on_503 (line 309) | def test_upload_artifact_raises_on_503(tmp_path: Path) -> None:
function test_bootstrap_discards_sdists_when_version_mismatch (line 318) | def test_bootstrap_discards_sdists_when_version_mismatch(
function test_bootstrap_keeps_sdists_when_version_matches (line 350) | def test_bootstrap_keeps_sdists_when_version_matches(
function test_bootstrap_no_appserver_version_env_uses_sdists (line 382) | def test_bootstrap_no_appserver_version_env_uses_sdists(
function test_bootstrap_passes_auto_upgrade_false (line 409) | def test_bootstrap_passes_auto_upgrade_false(
function test_download_artifact_raises_on_503 (line 431) | def test_download_artifact_raises_on_503() -> None:
FILE: packages/llama-agents-appserver/tests/test_configure_logging.py
function isolated_logging (line 19) | def isolated_logging() -> Generator[None, None, None]:
function test_setup_logging_json_filters_by_level_and_renders_json (line 47) | def test_setup_logging_json_filters_by_level_and_renders_json(
function test_setup_logging_console_renders_human_readable (line 77) | def test_setup_logging_console_renders_human_readable(
function _fake_request (line 100) | def _fake_request(path: str) -> MagicMock:
function test_is_health_request_matches (line 110) | def test_is_health_request_matches(path: str) -> None:
function test_is_health_request_rejects (line 118) | def test_is_health_request_rejects(path: str) -> None:
function log_app (line 128) | def log_app() -> FastAPI:
function test_access_log_suppressed_for_health (line 144) | def test_access_log_suppressed_for_health(
function test_access_log_emitted_for_normal_routes (line 163) | def test_access_log_emitted_for_normal_routes(
FILE: packages/llama-agents-appserver/tests/test_deployment.py
function deployment (line 12) | def deployment(tmp_path: Path) -> Deployment:
function test_run_workflow_without_session_without_kwargs (line 18) | async def test_run_workflow_without_session_without_kwargs(tmp_path: Pat...
function test_run_workflow_with_session (line 30) | async def test_run_workflow_with_session(tmp_path: Path) -> None:
function test_run_workflow_no_wait_creates_session (line 43) | def test_run_workflow_no_wait_creates_session(tmp_path: Path) -> None:
function test_run_workflow_no_wait_with_session (line 62) | def test_run_workflow_no_wait_with_session(tmp_path: Path) -> None:
FILE: packages/llama-agents-appserver/tests/test_environment_loader.py
function _cleanup_env (line 16) | def _cleanup_env() -> Iterator[None]:
function test_env_loader_sets_from_env_dict_only (line 25) | def test_env_loader_sets_from_env_dict_only(tmp_path: Path) -> None:
function test_env_loader_env_files_override_env (line 36) | def test_env_loader_env_files_override_env(tmp_path: Path) -> None:
function test_env_loader_multiple_env_files_last_wins (line 54) | def test_env_loader_multiple_env_files_last_wins(tmp_path: Path) -> None:
function test_env_loader_missing_env_file_is_ignored (line 72) | def test_env_loader_missing_env_file_is_ignored(tmp_path: Path) -> None:
function test_env_loader_skips_empty_values (line 84) | def test_env_loader_skips_empty_values(tmp_path: Path) -> None:
function test_validate_required_env_vars_raises_for_missing (line 100) | def test_validate_required_env_vars_raises_for_missing(
function test_validate_required_env_vars_passes_when_set (line 118) | def test_validate_required_env_vars_passes_when_set(
function test_validate_required_env_vars_fill_missing (line 133) | def test_validate_required_env_vars_fill_missing(
function test_validate_required_env_vars_fill_missing_only_fills_unset (line 154) | def test_validate_required_env_vars_fill_missing_only_fills_unset(
FILE: packages/llama-agents-appserver/tests/test_preflight.py
function test_preflight_validate_success (line 16) | def test_preflight_validate_success(
function test_preflight_validate_collects_errors (line 35) | def test_preflight_validate_collects_errors(
function test_start_preflight_in_target_venv_invokes_uv (line 60) | def test_start_preflight_in_target_venv_invokes_uv(
function test_start_preflight_in_target_venv_skip_env_validation (line 107) | def test_start_preflight_in_target_venv_skip_env_validation(
function test_export_json_graph_strips_event_type_and_writes_file (line 141) | def test_export_json_graph_strips_event_type_and_writes_file(
function test_start_export_json_graph_in_target_venv_invokes_uv (line 176) | def test_start_export_json_graph_in_target_venv_invokes_uv(
FILE: packages/llama-agents-appserver/tests/test_status.py
function client (line 8) | def client() -> TestClient:
function test_health_endpoints (line 15) | def test_health_endpoints(client: TestClient, path: str) -> None:
FILE: packages/llama-agents-appserver/tests/test_workflow_loader.py
function test_load_workflows_imports (line 18) | def test_load_workflows_imports(tmp_path: Path) -> None:
function test_load_environment_variables_merges_env_and_files (line 31) | def test_load_environment_variables_merges_env_and_files(
function test_build_ui_sets_env_and_calls_pnpm (line 47) | def test_build_ui_sets_env_and_calls_pnpm(
function test_ui_env_public_overrides_base (line 80) | def test_ui_env_public_overrides_base(monkeypatch: pytest.MonkeyPatch) -...
function test_ui_env_public_without_base_creates_it (line 90) | def test_ui_env_public_without_base_creates_it(monkeypatch: pytest.Monke...
function test_ui_env_no_public_leaves_base_alone (line 100) | def test_ui_env_no_public_leaves_base_alone(monkeypatch: pytest.MonkeyPa...
FILE: packages/llama-agents-appserver/tests/test_workflow_loader_install.py
function resolve_venv_to_pkg (line 26) | def resolve_venv_to_pkg(monkeypatch: pytest.MonkeyPatch) -> None:
function test_ensure_uv_available_success_and_bootstrap (line 38) | def test_ensure_uv_available_success_and_bootstrap(
function test_add_appserver_pypi_install_calls_uv_with_prefix (line 83) | def test_add_appserver_pypi_install_calls_uv_with_prefix(
function test_add_appserver_install_targets_resolved_venv_when_outside_pkg (line 122) | def test_add_appserver_install_targets_resolved_venv_when_outside_pkg(
function test_add_appserver_sdists_install (line 173) | def test_add_appserver_sdists_install(
function test_add_appserver_editable_install (line 210) | def test_add_appserver_editable_install(
function test_install_ui_runs_pnpm_and_validates (line 263) | def test_install_ui_runs_pnpm_and_validates(
function test_start_dev_ui_process_port_open_and_spawn (line 287) | def test_start_dev_ui_process_port_open_and_spawn(
function test_validate_path_is_safe_rejects_escape (line 332) | def test_validate_path_is_safe_rejects_escape(tmp_path: Path) -> None:
function test_get_installed_version_within_target_cases (line 337) | def test_get_installed_version_within_target_cases(
function test_current_and_outdated_logic (line 363) | def test_current_and_outdated_logic(
function test_add_appserver_target_version_installs_from_pypi (line 389) | def test_add_appserver_target_version_installs_from_pypi(
function test_add_appserver_target_version_ignored_in_editable_mode (line 426) | def test_add_appserver_target_version_ignored_in_editable_mode(
function test_add_appserver_target_version_ignored_when_sdists_provided (line 479) | def test_add_appserver_target_version_ignored_when_sdists_provided(
function test_get_workflows_version_in_target_success (line 519) | def test_get_workflows_version_in_target_success(
function test_get_workflows_version_in_target_missing (line 530) | def test_get_workflows_version_in_target_missing(
function test_get_workflows_version_in_target_error (line 543) | def test_get_workflows_version_in_target_error(
function test_get_appserver_workflows_requirement (line 556) | def test_get_appserver_workflows_requirement() -> None:
function test_get_appserver_workflows_requirement_missing (line 565) | def test_get_appserver_workflows_requirement_missing(
function test_ensure_compatible_workflows_compatible_noop (line 576) | def test_ensure_compatible_workflows_compatible_noop(
function test_ensure_compatible_workflows_incompatible_auto_updates (line 604) | def test_ensure_compatible_workflows_incompatible_auto_updates(
function test_ensure_compatible_workflows_not_installed_noop (line 639) | def test_ensure_compatible_workflows_not_installed_noop(
function test_ensure_compatible_workflows_update_fails_raises (line 664) | def test_ensure_compatible_workflows_update_fails_raises(
function test_install_calls_ensure_compatible_workflows (line 688) | def test_install_calls_ensure_compatible_workflows(
FILE: packages/llama-agents-appserver/tests/test_workflow_loader_load_workflows.py
function test_load_workflows_module_path (line 12) | def test_load_workflows_module_path(
function test_load_workflows_from_workflow_server_app (line 33) | def test_load_workflows_from_workflow_server_app() -> None:
FILE: packages/llama-agents-appserver/tests/test_workflow_loader_streaming.py
function _no_color (line 21) | def _no_color(monkeypatch: pytest.MonkeyPatch) -> None:
class _FakePopen (line 26) | class _FakePopen:
method __init__ (line 27) | def __init__(self, text: str, ret: int = 0) -> None:
method wait (line 32) | def wait(self) -> int:
function test_run_process_success_and_failure (line 36) | def test_run_process_success_and_failure(
function test_spawn_process_streams_in_background (line 57) | def test_spawn_process_streams_in_background(
function test_install_python_dependencies_calls_when_target_found (line 72) | def test_install_python_dependencies_calls_when_target_found(
FILE: packages/llama-agents-client/src/llama_agents/client/client.py
function _raise_for_status_with_body (line 36) | def _raise_for_status_with_body(response: httpx.Response) -> None:
class _QueuedEvent (line 58) | class _QueuedEvent:
class _QueuedError (line 64) | class _QueuedError:
class _QueuedDone (line 69) | class _QueuedDone:
class EventStream (line 76) | class EventStream:
method __init__ (line 92) | def __init__(
method last_sequence (line 104) | def last_sequence(self) -> int | Literal["now"]:
method __aiter__ (line 109) | def __aiter__(self) -> AsyncIterator[EventEnvelopeWithMetadata]:
method _iterate (line 115) | async def _iterate(self) -> AsyncGenerator[EventEnvelopeWithMetadata, ...
method aclose (line 128) | async def aclose(self) -> None:
class WorkflowClient (line 140) | class WorkflowClient:
method __init__ (line 173) | def __init__(self, *, httpx_client: httpx.AsyncClient): ...
method __init__ (line 175) | def __init__(
method __init__ (line 181) | def __init__(
method _get_client (line 195) | async def _get_client(self) -> AsyncIterator[httpx.AsyncClient]:
method is_healthy (line 202) | async def is_healthy(self) -> HealthResponse:
method list_workflows (line 213) | async def list_workflows(self) -> WorkflowsListResponse:
method run_workflow (line 222) | async def run_workflow(
method run_workflow_nowait (line 271) | async def run_workflow_nowait(
method get_workflow_events (line 323) | def get_workflow_events(
method send_event (line 438) | async def send_event(
method get_result (line 467) | async def get_result(self, handler_id: str) -> HandlerData:
method get_handlers (line 473) | async def get_handlers(
method get_handler (line 497) | async def get_handler(self, handler_id: str) -> HandlerData:
method cancel_handler (line 512) | async def cancel_handler(
function _serialize_event (line 532) | def _serialize_event(
FILE: packages/llama-agents-client/src/llama_agents/client/protocol/__init__.py
function is_status_completed (line 16) | def is_status_completed(status: Status) -> bool:
class HandlerData (line 20) | class HandlerData(BaseModel):
class HandlersListResponse (line 32) | class HandlersListResponse(BaseModel):
class HealthResponse (line 36) | class HealthResponse(BaseModel):
class WorkflowsListResponse (line 40) | class WorkflowsListResponse(BaseModel):
class SendEventResponse (line 44) | class SendEventResponse(BaseModel):
class CancelHandlerResponse (line 48) | class CancelHandlerResponse(BaseModel):
class WorkflowSchemaResponse (line 52) | class WorkflowSchemaResponse(BaseModel):
class WorkflowEventsListResponse (line 57) | class WorkflowEventsListResponse(BaseModel):
class WorkflowGraphResponse (line 61) | class WorkflowGraphResponse(BaseModel):
FILE: packages/llama-agents-client/src/llama_agents/client/protocol/serializable_events.py
class EventEnvelopeWithMetadata (line 15) | class EventEnvelopeWithMetadata(BaseModel):
method load_event (line 30) | def load_event(self, registry: list[type[Event]] = []) -> Event:
method from_event (line 44) | def from_event(
class EventEnvelope (line 67) | class EventEnvelope(BaseModel):
method _format_compatibility (line 78) | def _format_compatibility(cls, data: Any) -> Any:
method from_event (line 91) | def from_event(cls, event: Event) -> EventEnvelope:
method parse (line 98) | def parse(
function _get_event_subtypes (line 167) | def _get_event_subtypes(cls: type[Event]) -> list[str] | None:
function _get_qualified_name (line 183) | def _get_qualified_name(event: type[Event]) -> str:
class EventValidationError (line 187) | class EventValidationError(Exception):
FILE: packages/llama-agents-client/tests/client/client_test_workflows.py
class InputEvent (line 10) | class InputEvent(StartEvent):
class GreetEvent (line 15) | class GreetEvent(Event):
class OutputEvent (line 20) | class OutputEvent(StopEvent):
class GreetingWorkflow (line 24) | class GreetingWorkflow(Workflow):
method first_step (line 26) | async def first_step(self, ev: InputEvent, ctx: Context) -> GreetEvent:
method second_step (line 33) | async def second_step(self, ev: GreetEvent, ctx: Context) -> OutputEvent:
class CrashingWorkflow (line 38) | class CrashingWorkflow(Workflow):
method crashing_step (line 40) | async def crashing_step(self, ev: StartEvent) -> StopEvent:
FILE: packages/llama-agents-client/tests/client/test_client.py
function server (line 27) | def server() -> WorkflowServer:
function client (line 36) | def client(server: WorkflowServer) -> WorkflowClient:
function test_is_healthy (line 43) | async def test_is_healthy(client: WorkflowClient) -> None:
function test_list_workflows (line 49) | async def test_list_workflows(client: WorkflowClient) -> None:
function test_run_nowait_and_stream_events (line 57) | async def test_run_nowait_and_stream_events(client: WorkflowClient) -> N...
function test_get_result_for_handler (line 73) | async def test_get_result_for_handler(client: WorkflowClient) -> None:
function test_get_handler (line 93) | async def test_get_handler(client: WorkflowClient) -> None:
function test_get_handlers (line 111) | async def test_get_handlers(client: WorkflowClient) -> None:
function test_get_handlers_filter_by_workflow_name (line 123) | async def test_get_handlers_filter_by_workflow_name(client: WorkflowClie...
function test_get_handlers_filter_by_status (line 135) | async def test_get_handlers_filter_by_status(client: WorkflowClient) -> ...
function test_get_handlers_for_complex_workflows (line 160) | async def test_get_handlers_for_complex_workflows(
function test_run_workflow_sync_result (line 188) | async def test_run_workflow_sync_result(client: WorkflowClient) -> None:
function test_stream_events_including_internal (line 198) | async def test_stream_events_including_internal(client: WorkflowClient) ...
function test_cancel_handler (line 214) | async def test_cancel_handler(client: WorkflowClient) -> None:
function test_send_event (line 232) | async def test_send_event(client: WorkflowClient) -> None:
function test_error_message_format (line 255) | async def test_error_message_format(client: WorkflowClient) -> None:
function _envelope (line 272) | def _envelope(msg: str) -> EventEnvelopeWithMetadata:
class FakeStreamClient (line 284) | class FakeStreamClient:
method __init__ (line 287) | def __init__(self, script: list[ConnectionScript]) -> None:
method stream (line 293) | async def stream(
function _collect (line 330) | async def _collect(
function test_reconnect_resumes_from_last_sequence (line 343) | async def test_reconnect_resumes_from_last_sequence() -> None:
function test_reconnect_exceeds_max_attempts_raises (line 360) | async def test_reconnect_exceeds_max_attempts_raises() -> None:
function test_reconnect_resets_attempts_on_success (line 369) | async def test_reconnect_resets_attempts_on_success() -> None:
function test_timeout_exception_not_retried (line 383) | async def test_timeout_exception_not_retried() -> None:
function test_get_workflow_events_tracks_last_sequence (line 389) | async def test_get_workflow_events_tracks_last_sequence() -> None:
function test_get_workflow_events_with_now (line 406) | async def test_get_workflow_events_with_now() -> None:
FILE: packages/llama-agents-client/tests/protocol/test_serializable_events.py
function test_envelope_user_defined_event (line 22) | def test_envelope_user_defined_event() -> None:
function test_envelope_builtin_stop_event (line 36) | def test_envelope_builtin_stop_event() -> None:
function test_envelope_stop_event_subclass (line 46) | def test_envelope_stop_event_subclass() -> None:
function test_envelope_internal_event (line 62) | def test_envelope_internal_event() -> None:
class ModuleScopeEvent (line 80) | class ModuleScopeEvent(Event):
class ModuleScopeOtherEvent (line 84) | class ModuleScopeOtherEvent(Event):
function test_parse_with_registry_type_success (line 88) | def test_parse_with_registry_type_success() -> None:
function test_parse_with_qualified_name_fallback_success (line 98) | def test_parse_with_qualified_name_fallback_success() -> None:
function test_parse_with_type_unknown_but_qualified_name_valid (line 106) | def test_parse_with_type_unknown_but_qualified_name_valid() -> None:
function test_parse_alias_data_to_value (line 114) | def test_parse_alias_data_to_value() -> None:
function test_parse_from_json_string (line 124) | def test_parse_from_json_string() -> None:
function test_parse_value_only_with_explicit_event (line 134) | def test_parse_value_only_with_explicit_event() -> None:
function test_parse_invalid_inputs_raise (line 144) | def test_parse_invalid_inputs_raise() -> None:
function test_from_event_roundtrip_with_registry (line 150) | def test_from_event_roundtrip_with_registry() -> None:
function test_metadata_envelope_load_event_with_registry (line 161) | def test_metadata_envelope_load_event_with_registry() -> None:
function test_metadata_envelope_qualified_name_toggle (line 172) | def test_metadata_envelope_qualified_name_toggle() -> None:
function test_json_serializer_back_compat_with_pydantic_flag (line 184) | def test_json_serializer_back_compat_with_pydantic_flag() -> None:
function test_missing_type_and_qualified_name_raises (line 196) | def test_missing_type_and_qualified_name_raises() -> None:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/backup/archive.py
class BackupManifest (line 30) | class BackupManifest:
class BackupEntry (line 39) | class BackupEntry:
class BackupContents (line 47) | class BackupContents:
function clean_crd_metadata (line 52) | def clean_crd_metadata(doc: dict[str, Any]) -> dict[str, Any]:
function clean_secret_metadata (line 61) | def clean_secret_metadata(doc: dict[str, Any]) -> dict[str, Any]:
function _clean_metadata (line 66) | def _clean_metadata(
function create_backup_archive (line 95) | def create_backup_archive(
function read_backup_archive (line 153) | def read_backup_archive(
function _add_bytes_to_tar (line 236) | def _add_bytes_to_tar(tar: tarfile.TarFile, name: str, data: bytes) -> N...
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/backup/encryption.py
function _derive_key (line 18) | def _derive_key(password: str, salt: bytes) -> bytes:
function encrypt (line 29) | def encrypt(plaintext: bytes, password: str) -> bytes:
function decrypt (line 42) | def decrypt(data: bytes, password: str) -> bytes:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/backup/storage.py
class BackupInfo (line 16) | class BackupInfo:
class S3BackupStorage (line 24) | class S3BackupStorage(S3ObjectStorage):
method __init__ (line 27) | def __init__(
method _key (line 47) | def _key(self, backup_id: str) -> str:
method upload (line 50) | async def upload(self, backup_id: str, data: bytes) -> None:
method download (line 59) | async def download(self, backup_id: str) -> bytes:
method list_backups (line 68) | async def list_backups(self) -> list[BackupInfo]:
method delete (line 97) | async def delete(self, backup_id: str) -> None:
method get_info (line 105) | async def get_info(self, backup_id: str) -> BackupInfo | None:
function generate_backup_id (line 124) | def generate_backup_id() -> str:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/build_api/build_app.py
function _lifespan (line 41) | async def _lifespan(app: FastAPI) -> AsyncIterator[None]:
class HelloResponse (line 56) | class HelloResponse(BaseModel):
function hello (line 64) | async def hello(
function health (line 76) | async def health() -> Response:
function artifact_exists (line 96) | async def artifact_exists(
function download_artifact (line 114) | async def download_artifact(
function upload_artifact (line 143) | async def upload_artifact(
function git_proxy_get (line 190) | async def git_proxy_get(
function git_proxy_post (line 208) | async def git_proxy_post(
function _validate_git_path (line 235) | def _validate_git_path(git_path: str) -> None:
function _validate_url_not_private (line 245) | def _validate_url_not_private(url: str) -> None:
function proxy_git_request (line 262) | async def proxy_git_request(
function _describe_access (line 383) | def _describe_access(
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/build_api/build_auth.py
function _validate_token_raw (line 22) | async def _validate_token_raw(deployment_id: str, token: str) -> str:
function validate_token (line 37) | async def validate_token(deployment_id: str, token: str) -> LlamaDeploym...
function authenticate_deployment (line 45) | async def authenticate_deployment(
function authenticate_deployment_basic (line 59) | async def authenticate_deployment_basic(
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/build_api/build_gc.py
function _get_referenced_build_ids_from_replicasets (line 26) | async def _get_referenced_build_ids_from_replicasets(
function gc_build_artifacts (line 53) | async def gc_build_artifacts(
function gc_all_build_artifacts (line 135) | async def gc_all_build_artifacts() -> int:
function delete_all_artifacts_for_deployment (line 155) | async def delete_all_artifacts_for_deployment(deployment_id: str) -> int:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/build_api/build_service.py
function create_build_artifact_storage (line 9) | def create_build_artifact_storage() -> BuildArtifactStorage | None:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/build_api/build_storage.py
class ArtifactInfo (line 18) | class ArtifactInfo:
class BuildArtifactStorage (line 27) | class BuildArtifactStorage(S3ObjectStorage):
class NotFoundError (line 30) | class NotFoundError(Exception):
method __init__ (line 33) | def __init__(
method _key (line 53) | def _key(self, deployment_name: str, build_id: str) -> str:
method upload_artifact (line 56) | async def upload_artifact(
method upload_artifact_fileobj (line 67) | async def upload_artifact_fileobj(
method download_artifact_streaming (line 78) | async def download_artifact_streaming(
method artifact_exists (line 116) | async def artifact_exists(self, deployment_name: str, build_id: str) -...
method delete_artifact (line 130) | async def delete_artifact(self, deployment_name: str, build_id: str) -...
method list_artifacts (line 138) | async def list_artifacts(self, deployment_name: str) -> list[ArtifactI...
method delete_all_artifacts (line 165) | async def delete_all_artifacts(self, deployment_name: str) -> int:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/code_repo/git_server.py
function _create_wsgi_app (line 43) | def _create_wsgi_app(
function _call_wsgi (line 51) | def _call_wsgi(
function _git_scope (line 82) | def _git_scope(request: Request, git_path: str) -> HTTPScope:
function _serve_wsgi_git (line 93) | async def _serve_wsgi_git(
function _get_resolved_refs (line 138) | def _get_resolved_refs(repo: Repo) -> dict[Ref, bytes]:
function handle_git_request (line 154) | async def handle_git_request(
class _StreamingWSGIResponse (line 225) | class _StreamingWSGIResponse(Response):
method __init__ (line 238) | def __init__(
method __call__ (line 251) | async def __call__(self, scope: Any, receive: Any, send: Any) -> None:
function handle_git_request_readonly (line 259) | async def handle_git_request_readonly(
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/code_repo/service.py
function create_code_repo_storage (line 9) | def create_code_repo_storage() -> CodeRepoStorage | None:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/code_repo/storage.py
class CodeRepoStorage (line 24) | class CodeRepoStorage(S3ObjectStorage):
method _s3_key (line 31) | def _s3_key(self, deployment_id: str) -> str:
method download_repo (line 36) | async def download_repo(self, deployment_id: str) -> Path | None:
method upload_repo (line 77) | async def upload_repo(self, deployment_id: str, repo_path: Path) -> None:
method delete_repo (line 97) | async def delete_repo(self, deployment_id: str) -> None:
method repo_exists (line 104) | async def repo_exists(self, deployment_id: str) -> bool:
method _create_tarball (line 117) | def _create_tarball(repo_path: Path, tar_path: Path) -> None:
method resolve_ref (line 122) | async def resolve_ref(self, deployment_id: str, git_ref: str) -> str |...
method init_bare_repo (line 151) | def init_bare_repo(deployment_id: str) -> Path:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/git/_git_service.py
function _looks_like_config_file (line 52) | def _looks_like_config_file(path: str) -> bool:
function _normalize_repo_relative_path (line 57) | def _normalize_repo_relative_path(repo_path: str) -> Path:
function _repo_target_path (line 69) | def _repo_target_path(repo_root: Path, repo_path: str) -> Path:
function _deployment_base_dir (line 74) | def _deployment_base_dir(deployment_rel_path: str) -> Path:
class GitHubAppAccess (line 85) | class GitHubAppAccess:
class GitRepository (line 92) | class GitRepository:
class InaccessibleRepository (line 99) | class InaccessibleRepository:
class RepositoryExistenceResult (line 111) | class RepositoryExistenceResult:
class GitService (line 117) | class GitService:
method get_access (line 119) | async def get_access(
method validate_repository (line 135) | async def validate_repository(
method _is_github_repository (line 238) | def _is_github_repository(self, repository_url: str) -> bool:
method _check_github_access_type (line 251) | async def _check_github_access_type(
method _check_github_repository_exists (line 430) | async def _check_github_repository_exists(
method _check_generic_access_type (line 484) | async def _check_generic_access_type(
method _validate_pat_access (line 524) | async def _validate_pat_access(self, owner: str, repo: str, pat: str) ...
method _check_pat_obsolete (line 528) | async def _check_pat_obsolete(self, deployment_id: str) -> bool:
method _check_has_existing_pat (line 539) | async def _check_has_existing_pat(self, deployment_id: str) -> bool:
method _construct_install_url (line 547) | async def _construct_install_url(self, app: GitHubAppAuth, owner: str)...
method _construct_settings_url (line 565) | async def _construct_settings_url(
method obtain_basic_auth_token (line 580) | async def obtain_basic_auth_token(
method validate_git_application (line 606) | async def validate_git_application(
method _validate_via_clone (line 647) | async def _validate_via_clone(
method _validate_github_application (line 697) | async def _validate_github_application(
method _github_client_for_access (line 840) | async def _github_client_for_access(self, access: GitAccessType) -> Gi...
method _fetch_config_files (line 854) | async def _fetch_config_files(
method _fetch_ui_package_json (line 901) | async def _fetch_ui_package_json(
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/git/_github_auth.py
class GitHubAppAuth (line 9) | class GitHubAppAuth:
method __init__ (line 17) | def __init__(self, client_id: str, private_key: str | Path, app_name: ...
method _load_private_key (line 29) | def _load_private_key(self, private_key: str | Path) -> str:
method get_jwt (line 43) | def get_jwt(self) -> str:
method _generate_jwt (line 60) | def _generate_jwt(self) -> tuple[datetime.datetime, str]:
function get_github_app_auth (line 90) | def get_github_app_auth() -> GitHubAppAuth | None:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/git/github_api_client.py
class GitHubApiClient (line 16) | class GitHubApiClient:
method __init__ (line 17) | def __init__(
method get_owner_info (line 25) | async def get_owner_info(self, owner: str) -> GitHubOwnerInfo | None:
method get_repository_info (line 39) | async def get_repository_info(
method get_commit_sha (line 50) | async def get_commit_sha(self, owner: str, repo: str, ref: str) -> str...
method get_default_branch (line 67) | async def get_default_branch(self, owner: str, repo: str) -> str | None:
method get_file_contents (line 74) | async def get_file_contents(
function get_app_jwt_client (line 99) | def get_app_jwt_client() -> httpx.AsyncClient:
class GitHubAppApiClient (line 110) | class GitHubAppApiClient(GitHubApiClient):
method __init__ (line 111) | def __init__(self) -> None:
method _auth_middleware (line 114) | def _auth_middleware(self, request: httpx.Request) -> httpx.Request:
method get_repository_installation (line 122) | async def get_repository_installation(
method get_org_installation (line 132) | async def get_org_installation(self, org: str) -> GithubAppInstallatio...
method list_installations (line 140) | async def list_installations(self) -> list[GithubAppInstallation]:
method get_installation_access_token (line 146) | async def get_installation_access_token(self, installation_id: int) ->...
function pat_api_client (line 154) | def pat_api_client(pat: str) -> GitHubApiClient:
function installation_api_client (line 162) | def installation_api_client(access_token: str) -> GitHubApiClient:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/git/github_api_schema.py
class GitHubOwnerInfo (line 7) | class GitHubOwnerInfo(pydantic.BaseModel):
class GitHubRepository (line 13) | class GitHubRepository(pydantic.BaseModel):
class GithubAppInstallation (line 40) | class GithubAppInstallation(pydantic.BaseModel):
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/k8s_client.py
function to_async (line 67) | def to_async(func: Callable[P, R]) -> Callable[P, Coroutine[Any, Any, R]]:
class K8sClient (line 81) | class K8sClient:
method __init__ (line 82) | def __init__(self) -> None:
method _get_namespace (line 97) | def _get_namespace(self) -> str:
method _ensure_k8s_client (line 114) | def _ensure_k8s_client(self) -> None:
method k8s_core_v1 (line 133) | def k8s_core_v1(self) -> CoreV1Api:
method k8s_custom_objects (line 140) | def k8s_custom_objects(self) -> CustomObjectsApi:
method k8s_networking_v1 (line 147) | def k8s_networking_v1(self) -> NetworkingV1Api:
method k8s_apps_v1 (line 154) | def k8s_apps_v1(self) -> AppsV1Api:
function validate_deployment_id (line 165) | async def validate_deployment_id(deployment_id: str) -> bool:
function validate_deployment_token (line 181) | async def validate_deployment_token(
function _append_random_suffix (line 201) | def _append_random_suffix(deployment_id: str, max_length: int) -> str:
function _compute_secret_hash (line 214) | def _compute_secret_hash(secrets: dict[str, str]) -> str:
function find_deployment_id (line 222) | async def find_deployment_id(name: str, force_suffix: bool = False) -> str:
function create_deployment (line 256) | async def create_deployment(
function _create_k8s_secret (line 354) | async def _create_k8s_secret(secret_name: str, secrets: dict[str, str]) ...
function _create_ingress (line 416) | async def _create_ingress(service_name: str) -> None:
function delete_deployment (line 500) | async def delete_deployment(deployment_id: str) -> None:
function update_deployment (line 537) | async def update_deployment(
function get_deployment_crd (line 641) | def get_deployment_crd(
function get_deployment_events (line 655) | async def get_deployment_events(deployment_id: str) -> list[DeploymentEv...
function _event_to_deployment_event (line 667) | def _event_to_deployment_event(event: CoreV1Event) -> DeploymentEvent:
function get_deployment (line 678) | async def get_deployment(deployment_id: str) -> DeploymentResponse | None:
function get_deployment_history (line 698) | async def get_deployment_history(
function get_deployments (line 725) | async def get_deployments(project_id: str) -> List[DeploymentResponse]:
function get_projects_with_deployment_count (line 763) | async def get_projects_with_deployment_count() -> List[ProjectSummary]:
function get_secret_names (line 801) | def get_secret_names(secret_name: str) -> list[str]:
function get_secret_names_batch (line 814) | async def get_secret_names_batch(
function _llamadeployment_to_response (line 829) | def _llamadeployment_to_response(
function has_deployment_pat (line 897) | async def has_deployment_pat(deployment_id: str) -> bool:
function get_deployment_pat (line 902) | async def get_deployment_pat(deployment_id: str) -> str | None:
function _list_replicasets_for_deployment_sync (line 932) | def _list_replicasets_for_deployment_sync(deployment_id: str) -> list[Any]:
function get_latest_replicaset_for_deployment (line 969) | def get_latest_replicaset_for_deployment(
function list_replicasets_for_deployment (line 1003) | def list_replicasets_for_deployment(deployment_id: str) -> list[Any]:
function list_all_deployments (line 1009) | def list_all_deployments() -> list[Any]:
class LogLine (line 1019) | class LogLine:
function get_replicaset_pods_for_deployment (line 1027) | async def get_replicaset_pods_for_deployment(deployment_id: str) -> list...
function stream_container_logs (line 1055) | async def stream_container_logs(
function _to_generator (line 1138) | def _to_generator(resp: str | HTTPResponse) -> AsyncGenerator[str, None]:
function _parse_raw_log_lines (line 1224) | async def _parse_raw_log_lines(
function _stream_pod_container_logs (line 1247) | async def _stream_pod_container_logs(
function stream_replicaset_logs (line 1292) | async def stream_replicaset_logs(
function _list_pods_by_label (line 1332) | def _list_pods_by_label(label_selector: str) -> list[Any]:
function stream_build_job_logs (line 1341) | async def stream_build_job_logs(
function get_secret_data (line 1384) | def get_secret_data(secret_name: str) -> dict[str, str] | None:
function get_all_deployment_crds (line 1400) | def get_all_deployment_crds() -> list[dict[str, Any]]:
function apply_deployment_crd (line 1411) | async def apply_deployment_crd(crd: dict[str, Any]) -> None:
function apply_secret (line 1450) | async def apply_secret(name: str, data: dict[str, str]) -> None:
function get_namespace (line 1455) | def get_namespace() -> str:
function get_deployment_crd_raw (line 1461) | def get_deployment_crd_raw(name: str) -> dict[str, Any] | None:
function delete_deployment_crd (line 1478) | def delete_deployment_crd(name: str) -> None:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/log_config.py
class UvicornStyleFormatter (line 9) | class UvicornStyleFormatter(logging.Formatter):
method format (line 23) | def format(self, record: logging.LogRecord) -> str:
class CleanJsonFormatter (line 35) | class CleanJsonFormatter(JsonFormatter):
method add_fields (line 38) | def add_fields(
function setup_logging (line 49) | def setup_logging(
function get_uvicorn_log_config (line 71) | def get_uvicorn_log_config(log_level: str = "info") -> dict:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/main.py
function run_server_subprocess (line 16) | def run_server_subprocess(
function run_server_async (line 46) | async def run_server_async(
function run_servers (line 71) | async def run_servers(
function main (line 133) | def main() -> None:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/manage_api/backup_service.py
function _paired_secret_name (line 24) | def _paired_secret_name(deployment_name: str) -> str:
class BackupService (line 28) | class BackupService:
method __init__ (line 29) | def __init__(self, storage: S3BackupStorage) -> None:
method create_backup (line 32) | async def create_backup(self) -> schema.BackupResponse:
method _perform_backup (line 36) | async def _perform_backup(self, backup_id: str) -> schema.BackupResponse:
method list_backups (line 96) | async def list_backups(self) -> schema.BackupListResponse:
method get_backup (line 102) | async def get_backup(self, backup_id: str) -> schema.BackupResponse:
method delete_backup (line 112) | async def delete_backup(self, backup_id: str) -> schema.BackupResponse:
method restore_backup (line 125) | async def restore_backup(
method _perform_restore (line 130) | async def _perform_restore(
method _restore_entries (line 168) | async def _restore_entries(
method _handle_deletions (line 243) | async def _handle_deletions(
method _info_to_response (line 270) | def _info_to_response(info: BackupInfo) -> schema.BackupResponse:
function create_backup_service (line 279) | def create_backup_service() -> BackupService | None:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/manage_api/backup_v1beta1.py
function _require_service (line 12) | def _require_service() -> BackupService:
function create_backup (line 22) | async def create_backup(
function list_backups (line 29) | async def list_backups(
function get_backup (line 36) | async def get_backup(
function delete_backup (line 44) | async def delete_backup(
function restore_backup (line 52) | async def restore_backup(
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/manage_api/deployments_service.py
function _on_push_complete (line 48) | async def _on_push_complete(
class PublicDeploymentService (line 99) | class PublicDeploymentService(AbstractPublicDeploymentsService):
method get_version (line 101) | async def get_version(self) -> schema.VersionResponse:
class DeploymentService (line 113) | class DeploymentService(AbstractDeploymentsService):
method _get_deployment_or_raise (line 114) | async def _get_deployment_or_raise(
method get_organizations (line 127) | async def get_organizations(self) -> schema.OrganizationsListResponse:
method get_projects (line 131) | async def get_projects(
method validate_repository (line 139) | async def validate_repository(
method create_deployment (line 153) | async def create_deployment(
method get_deployments (line 214) | async def get_deployments(
method get_deployment (line 222) | async def get_deployment(
method delete_deployment (line 233) | async def delete_deployment(
method get_deployment_history (line 244) | async def get_deployment_history(
method rollback_deployment (line 255) | async def rollback_deployment(
method update_deployment (line 290) | async def update_deployment(
method handle_git_request (line 402) | async def handle_git_request(
method _when_replicaset_changes (line 436) | async def _when_replicaset_changes(
method _current_rs_uid (line 449) | async def _current_rs_uid(
method _build_log_events (line 456) | async def _build_log_events(
method stream_deployment_logs (line 480) | async def stream_deployment_logs(
function _empty_log_gen (line 592) | async def _empty_log_gen() -> AsyncGenerator[LogEvent, None]:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/manage_api/manage_app.py
function _handle_shutdown_signal (line 25) | def _handle_shutdown_signal(signum: int, frame: FrameType | None = None)...
function lifespan (line 47) | async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
function unhandled_exception_handler (line 67) | async def unhandled_exception_handler(request: Request, exc: Exception) ...
function health (line 91) | async def health() -> dict[str, str]:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/settings.py
class ControlPlaneSettings (line 11) | class ControlPlaneSettings(BaseSettings):
method should_stamp_image_tag (line 34) | def should_stamp_image_tag(self) -> bool:
FILE: packages/llama-agents-control-plane/src/llama_agents/control_plane/storage.py
class _S3ClientKwargs (line 19) | class _S3ClientKwargs(TypedDict, total=False):
class S3ObjectStorage (line 27) | class S3ObjectStorage:
method __init__ (line 34) | def __init__(
method _client (line 62) | async def _client(self) -> AsyncIterator[S3Client]:
FILE: packages/llama-agents-control-plane/tests/backup/conftest.py
function make_deployment (line 16) | def make_deployment(name: str, project_id: str = "proj-1") -> dict[str, ...
function make_raw_crd (line 26) | def make_raw_crd(
function mock_storage (line 49) | def mock_storage() -> AsyncMock:
function backup_service (line 57) | def backup_service(mock_storage: AsyncMock) -> BackupService:
function make_client (line 62) | def make_client(app: FastAPI) -> ControlPlaneClient:
function _clear_aws_env (line 76) | def _clear_aws_env(monkeypatch: pytest.MonkeyPatch) -> None:
FILE: packages/llama-agents-control-plane/tests/backup/test_archive.py
function test_round_trip (line 24) | def test_round_trip() -> None:
function test_encrypted_archive_round_trip (line 46) | def test_encrypted_archive_round_trip() -> None:
function test_unencrypted_archive_round_trip (line 61) | def test_unencrypted_archive_round_trip() -> None:
function test_empty_deployments (line 76) | def test_empty_deployments() -> None:
function test_archive_extractable_with_tarfile (line 88) | def test_archive_extractable_with_tarfile() -> None:
function test_encrypted_archive_has_enc_file (line 104) | def test_encrypted_archive_has_enc_file() -> None:
function test_missing_manifest_raises (line 120) | def test_missing_manifest_raises() -> None:
function test_encrypted_archive_without_password_raises (line 131) | def test_encrypted_archive_without_password_raises() -> None:
function test_generation_stored_in_archive (line 145) | def test_generation_stored_in_archive() -> None:
function test_generation_none_when_not_provided (line 160) | def test_generation_none_when_not_provided() -> None:
function test_clean_crd_metadata_strips_cluster_fields (line 177) | def test_clean_crd_metadata_strips_cluster_fields() -> None:
function test_clean_crd_removes_empty_annotations (line 220) | def test_clean_crd_removes_empty_annotations() -> None:
function test_clean_secret_metadata_strips_owner_references (line 233) | def test_clean_secret_metadata_strips_owner_references() -> None:
function test_clean_secret_does_not_strip_finalizers (line 260) | def test_clean_secret_does_not_strip_finalizers() -> None:
function test_clean_secret_strips_system_annotations (line 271) | def test_clean_secret_strips_system_annotations() -> None:
FILE: packages/llama-agents-control-plane/tests/backup/test_backup_roundtrip.py
function _make_storage (line 34) | def _make_storage() -> S3BackupStorage:
function _create_bucket (line 43) | def _create_bucket() -> None:
function _make_mock_k8s (line 53) | def _make_mock_k8s(crds: list[dict[str, Any]] | None = None) -> MagicMock:
function _make_mock_settings (line 65) | def _make_mock_settings() -> MagicMock:
function _make_deployment (line 72) | def _make_deployment(name: str, project_id: str = "proj-1") -> dict[str,...
function test_create_and_get_backup (line 88) | async def test_create_and_get_backup() -> None:
function test_create_and_list_backups (line 117) | async def test_create_and_list_backups() -> None:
function test_create_and_delete_backup (line 152) | async def test_create_and_delete_backup() -> None:
function test_create_and_restore_backup (line 179) | async def test_create_and_restore_backup() -> None:
function test_restore_overwrite_always (line 210) | async def test_restore_overwrite_always() -> None:
function test_restore_with_deletions (line 245) | async def test_restore_with_deletions() -> None:
function test_backup_not_configured_returns_503 (line 287) | async def test_backup_not_configured_returns_503() -> None:
FILE: packages/llama-agents-control-plane/tests/backup/test_backup_service.py
function mock_k8s (line 21) | def mock_k8s() -> MagicMock:
function mock_settings (line 35) | def mock_settings() -> MagicMock:
function test_create_backup_success (line 47) | async def test_create_backup_success(
function test_create_backup_with_secrets (line 66) | async def test_create_backup_with_secrets(
function test_create_backup_failure (line 83) | async def test_create_backup_failure(
function test_list_backups (line 104) | async def test_list_backups(
function test_get_backup_exists (line 121) | async def test_get_backup_exists(
function test_get_backup_not_found (line 136) | async def test_get_backup_not_found(
function test_delete_backup_exists (line 152) | async def test_delete_backup_exists(
function test_delete_backup_not_found (line 167) | async def test_delete_backup_not_found(
function _make_archive_bytes (line 183) | def _make_archive_bytes(
function test_restore_skip_existing (line 199) | async def test_restore_skip_existing(
function test_restore_overwrite_always (line 220) | async def test_restore_overwrite_always(
function test_restore_overwrite_if_newer_skips_when_cluster_newer (line 241) | async def test_restore_overwrite_if_newer_skips_when_cluster_newer(
function test_restore_overwrite_if_newer_overwrites_when_backup_newer (line 267) | async def test_restore_overwrite_if_newer_overwrites_when_backup_newer(
function test_restore_project_mismatch (line 293) | async def test_restore_project_mismatch(
function test_restore_create_new (line 316) | async def test_restore_create_new(
function test_restore_with_secrets (line 337) | async def test_restore_with_secrets(
function test_restore_with_deletions (line 359) | async def test_restore_with_deletions(
function test_restore_empty_backup_with_deletions_refused (line 385) | async def test_restore_empty_backup_with_deletions_refused(
FILE: packages/llama-agents-control-plane/tests/backup/test_encryption.py
function test_round_trip (line 15) | def test_round_trip() -> None:
function test_tampered_ciphertext_raises_invalid_tag (line 22) | def test_tampered_ciphertext_raises_invalid_tag() -> None:
function test_wrong_password_raises_invalid_tag (line 30) | def test_wrong_password_raises_invalid_tag() -> None:
function test_empty_plaintext_round_trip (line 36) | def test_empty_plaintext_round_trip() -> None:
function test_short_data_raises_value_error (line 41) | def test_short_data_raises_value_error() -> None:
FILE: packages/llama-agents-control-plane/tests/backup/test_schema.py
function test_backup_response (line 16) | def test_backup_response() -> None:
function test_backup_response_defaults (line 29) | def test_backup_response_defaults() -> None:
function test_backup_list_response (line 37) | def test_backup_list_response() -> None:
function test_restore_request_defaults (line 47) | def test_restore_request_defaults() -> None:
function test_restore_request_custom (line 53) | def test_restore_request_custom() -> None:
function test_restore_deployment_result (line 63) | def test_restore_deployment_result() -> None:
function test_restore_response (line 68) | def test_restore_response() -> None:
FILE: packages/llama-agents-control-plane/tests/backup/test_storage.py
function _make_storage (line 14) | def _make_storage() -> S3BackupStorage:
function _create_bucket (line 23) | def _create_bucket() -> None:
function test_upload_download_round_trip (line 34) | async def test_upload_download_round_trip() -> None:
function test_list_returns_sorted_backups (line 45) | async def test_list_returns_sorted_backups() -> None:
function test_delete_removes_backup (line 66) | async def test_delete_removes_backup() -> None:
function test_get_info_returns_none_for_missing (line 78) | async def test_get_info_returns_none_for_missing() -> None:
function test_generate_backup_id_format (line 85) | def test_generate_backup_id_format() -> None:
FILE: packages/llama-agents-control-plane/tests/code_repo/conftest.py
function make_storage (line 19) | def make_storage() -> CodeRepoStorage:
function create_bucket (line 28) | def create_bucket() -> None:
function create_test_repo (line 38) | def create_test_repo(path: Path) -> Repo:
FILE: packages/llama-agents-control-plane/tests/code_repo/test_git_server.py
function _add_commit_to_repo (line 34) | def _add_commit_to_repo(repo: Repo, filename: bytes, content: bytes) -> ...
function _sha_file_to_unpacked (line 61) | def _sha_file_to_unpacked(obj: ShaFile) -> UnpackedObject:
function _collect_repo_objects (line 72) | def _collect_repo_objects(repo: Repo) -> list[ShaFile]:
function _build_receive_pack_body (line 95) | def _build_receive_pack_body(
function _make_test_app (line 128) | def _make_test_app(
function test_info_refs_receive_pack_empty_repo (line 163) | async def test_info_refs_receive_pack_empty_repo() -> None:
function test_info_refs_upload_pack_existing_repo (line 184) | async def test_info_refs_upload_pack_existing_repo(tmp_path: Path) -> None:
function test_push_to_empty_repo_triggers_callback_and_uploads (line 214) | async def test_push_to_empty_repo_triggers_callback_and_uploads(
function test_push_with_chunked_transfer_encoding (line 265) | async def test_push_with_chunked_transfer_encoding(tmp_path: Path) -> None:
function test_push_updates_existing_repo (line 308) | async def test_push_updates_existing_repo(tmp_path: Path) -> None:
function test_readonly_rejects_receive_pack (line 374) | async def test_readonly_rejects_receive_pack(tmp_path: Path) -> None:
function test_readonly_returns_404_for_missing_repo (line 412) | async def test_readonly_returns_404_for_missing_repo() -> None:
function test_readonly_serves_upload_pack (line 432) | async def test_readonly_serves_upload_pack(tmp_path: Path) -> None:
function test_handle_git_request_closes_repo_handles (line 459) | async def test_handle_git_request_closes_repo_handles(
function test_handle_git_request_readonly_closes_repo_after_response (line 497) | async def test_handle_git_request_readonly_closes_repo_after_response(
FILE: packages/llama-agents-control-plane/tests/code_repo/test_storage.py
function test_round_trip_bare_repo (line 19) | async def test_round_trip_bare_repo(tmp_path: Path) -> None:
function test_download_returns_none_when_no_repo (line 40) | async def test_download_returns_none_when_no_repo() -> None:
function test_repo_exists (line 50) | async def test_repo_exists(tmp_path: Path) -> None:
function test_init_bare_repo (line 68) | async def test_init_bare_repo() -> None:
function test_delete_repo (line 79) | async def test_delete_repo(tmp_path: Path) -> None:
function test_resolve_ref_supports_commit_sha_and_tags (line 97) | async def test_resolve_ref_supports_commit_sha_and_tags(tmp_path: Path) ...
function test_resolve_ref_rejects_missing_or_non_commit_sha (line 116) | async def test_resolve_ref_rejects_missing_or_non_commit_sha(tmp_path: P...
FILE: packages/llama-agents-control-plane/tests/deployments/test_deployments_service.py
function _make_deployment (line 21) | def _make_deployment(
function _rs (line 38) | def _rs(uid: str) -> types.SimpleNamespace:
function _line (line 44) | def _line(pod: str, container: str, text: str) -> types.SimpleNamespace:
function test_stream_logs_missing_deployment (line 59) | async def test_stream_logs_missing_deployment(mock_get_deployment: Async...
function test_stream_logs_project_mismatch (line 75) | async def test_stream_logs_project_mismatch(mock_get_deployment: AsyncMo...
function test_stream_logs_no_replicaset (line 98) | async def test_stream_logs_no_replicaset(
function test_stream_logs_happy_path (line 136) | async def test_stream_logs_happy_path(
function test_stream_logs_follow_false_threads_through_and_terminates (line 192) | async def test_stream_logs_follow_false_threads_through_and_terminates(
function test_stream_logs_restarts_on_rs_change (line 254) | async def test_stream_logs_restarts_on_rs_change(
function test_get_deployment_project_mismatch (line 315) | async def test_get_deployment_project_mismatch(mock_get_deployment: Asyn...
function test_get_deployment_missing (line 328) | async def test_get_deployment_missing(mock_get_deployment: AsyncMock) ->...
function test_delete_deployment_project_mismatch (line 341) | async def test_delete_deployment_project_mismatch(
function test_delete_deployment_missing (line 356) | async def test_delete_deployment_missing(mock_get_deployment: AsyncMock)...
function test_delete_deployment_success_no_code_repo (line 381) | async def test_delete_deployment_success_no_code_repo(
function test_delete_deployment_cleans_up_code_repo (line 411) | async def test_delete_deployment_cleans_up_code_repo(
function test_delete_deployment_k8s_error_propagates (line 437) | async def test_delete_deployment_k8s_error_propagates(
function test_get_deployment_history_project_mismatch (line 459) | async def test_get_deployment_history_project_mismatch(
function test_get_deployment_history_missing (line 474) | async def test_get_deployment_history_missing(
function test_rollback_deployment_project_mismatch (line 489) | async def test_rollback_deployment_project_mismatch(
function test_rollback_deployment_missing (line 506) | async def test_rollback_deployment_missing(mock_get_deployment: AsyncMoc...
function test_update_deployment_project_mismatch (line 521) | async def test_update_deployment_project_mismatch(
function test_update_deployment_missing (line 538) | async def test_update_deployment_missing(mock_get_deployment: AsyncMock)...
function test_update_deployment_unresolvable_ref_returns_400 (line 556) | async def test_update_deployment_unresolvable_ref_returns_400(
function test_update_deployment_internal_ref_requires_storage (line 585) | async def test_update_deployment_internal_ref_requires_storage(
function test_update_deployment_internal_path_change_skips_storage_resolution (line 617) | async def test_update_deployment_internal_path_change_skips_storage_reso...
function test_create_deployment_empty_repo_requires_internal_storage (line 652) | async def test_create_deployment_empty_repo_requires_internal_storage(
function test_handle_git_request_rejects_external_repo_deployments (line 680) | async def test_handle_git_request_rejects_external_repo_deployments(
function test_handle_git_request_allows_push_mode_deployments (line 713) | async def test_handle_git_request_allows_push_mode_deployments(
FILE: packages/llama-agents-control-plane/tests/test_build_app.py
function test_health_returns_503_when_s3_not_configured (line 9) | async def test_health_returns_503_when_s3_not_configured() -> None:
function test_health_returns_200_when_s3_configured (line 25) | async def test_health_returns_200_when_s3_configured() -> None:
FILE: packages/llama-agents-control-plane/tests/test_build_app_ssrf.py
function test_validate_git_path_allows_valid_paths (line 24) | def test_validate_git_path_allows_valid_paths(path: str) -> None:
function test_validate_git_path_rejects_invalid_paths (line 35) | def test_validate_git_path_rejects_invalid_paths(path: str) -> None:
function test_validate_url_blocks_private_ips (line 63) | def test_validate_url_blocks_private_ips(
function test_validate_url_allows_public_ip (line 75) | def test_validate_url_allows_public_ip() -> None:
function test_validate_url_blocks_dns_failure (line 83) | def test_validate_url_blocks_dns_failure() -> None:
function test_validate_url_blocks_no_hostname (line 92) | def test_validate_url_blocks_no_hostname() -> None:
FILE: packages/llama-agents-control-plane/tests/test_build_gc.py
class FakeStorage (line 27) | class FakeStorage:
method list_artifacts (line 36) | async def list_artifacts(self, deployment_name: str) -> list[ArtifactI...
method delete_artifact (line 39) | async def delete_artifact(self, deployment_name: str, build_id: str) -...
method delete_all_artifacts (line 47) | async def delete_all_artifacts(self, deployment_name: str) -> int:
function _artifact (line 57) | def _artifact(
function _replicaset_with_build_id (line 68) | def _replicaset_with_build_id(build_id: str) -> V1ReplicaSet:
function now (line 91) | def now() -> datetime:
function fake_storage (line 96) | def fake_storage() -> FakeStorage:
function patched_gc (line 101) | def patched_gc(fake_storage: FakeStorage):
function test_retains_two_recent_artifacts_for_same_deployment (line 115) | async def test_retains_two_recent_artifacts_for_same_deployment(
function test_retains_artifact_within_grace_window (line 134) | async def test_retains_artifact_within_grace_window(
function test_deletes_unreferenced_artifact_past_grace_window (line 153) | async def test_deletes_unreferenced_artifact_past_grace_window(
function test_retains_referenced_artifact_regardless_of_age (line 170) | async def test_retains_referenced_artifact_regardless_of_age(
function test_keep_build_ids_forces_retention (line 190) | async def test_keep_build_ids_forces_retention(
function test_mixed_cohort_only_aged_out_deleted (line 209) | async def test_mixed_cohort_only_aged_out_deleted(
function test_handles_naive_datetime_from_storage (line 232) | async def test_handles_naive_datetime_from_storage(
function test_returns_zero_when_storage_disabled (line 256) | async def test_returns_zero_when_storage_disabled(now: datetime) -> None:
function test_delete_all_artifacts_for_deployment (line 263) | async def test_delete_all_artifacts_for_deployment(
function test_partial_delete_failure_does_not_abort_remaining (line 281) | async def test_partial_delete_failure_does_not_abort_remaining(now: date...
FILE: packages/llama-agents-control-plane/tests/test_endpoints.py
function test_public_version_endpoint_returns_extended_fields (line 30) | def test_public_version_endpoint_returns_extended_fields() -> None:
function mock_existing_deployment (line 43) | def mock_existing_deployment() -> Generator[MagicMock, None, None]:
function default_mock_git_ref (line 65) | def default_mock_git_ref() -> Generator[MagicMock, None, None]:
function mock_git_ref (line 78) | def mock_git_ref(
function test_list_deployments (line 90) | def test_list_deployments(mock_get_deployments: MagicMock) -> None:
function test_get_deployment_success (line 119) | def test_get_deployment_success(mock_get_deployment: MagicMock) -> None:
function test_get_deployment_with_events (line 146) | def test_get_deployment_with_events(
function test_get_deployment_not_found (line 187) | def test_get_deployment_not_found(mock_get_deployment: MagicMock) -> None:
function test_create_deployment_success (line 198) | def test_create_deployment_success(mock_create_deployment: MagicMock) ->...
function test_create_deployment_empty_repo_without_storage_fails_fast (line 258) | def test_create_deployment_empty_repo_without_storage_fails_fast(
function test_create_deployment_with_git_ref (line 278) | def test_create_deployment_with_git_ref(mock_create_deployment: MagicMoc...
function test_create_deployment_git_ref_validation_error (line 333) | def test_create_deployment_git_ref_validation_error(
function test_update_deployment_success (line 401) | def test_update_deployment_success(
function test_update_deployment_suspend_skips_git_validation (line 465) | def test_update_deployment_suspend_skips_git_validation(
function test_update_deployment_internal_repo_skips_git_validation (line 513) | def test_update_deployment_internal_repo_skips_git_validation(
function test_update_deployment_empty_repo_url_preserves_internal (line 562) | def test_update_deployment_empty_repo_url_preserves_internal(
function test_update_deployment_partial (line 609) | def test_update_deployment_partial(
function test_update_deployment_secrets_only (line 653) | def test_update_deployment_secrets_only(
function test_list_projects (line 698) | def test_list_projects(mock_get_projects: MagicMock) -> None:
function test_create_deployment_validation_error (line 714) | def test_create_deployment_validation_error() -> None:
function test_create_deployment_rejects_invalid_appserver_version (line 727) | def test_create_deployment_rejects_invalid_appserver_version() -> None:
function test_stream_deployment_logs_success (line 747) | def test_stream_deployment_logs_success(mock_stream: MagicMock) -> None:
function test_stream_deployment_logs_follow_false_threads_through (line 793) | def test_stream_deployment_logs_follow_false_threads_through(
function test_stream_deployment_logs_unexpected_error (line 824) | def test_stream_deployment_logs_unexpected_error(mock_stream: MagicMock)...
function test_stream_deployment_logs_not_found (line 840) | def test_stream_deployment_logs_not_found(mock_stream: MagicMock) -> None:
function test_stream_deployment_logs_no_replicaset (line 854) | def test_stream_deployment_logs_no_replicaset(mock_stream: MagicMock) ->...
function test_git_endpoint_rejects_external_repo_deployments (line 866) | def test_git_endpoint_rejects_external_repo_deployments(
function test_get_deployment_history (line 895) | def test_get_deployment_history(
function test_rollback (line 927) | def test_rollback(
function test_create_deployment_operator_default_ignores_client_version (line 994) | def test_create_deployment_operator_default_ignores_client_version(
function test_update_deployment_operator_default_ignores_client_version (line 1029) | def test_update_deployment_operator_default_ignores_client_version(
function test_rollback_operator_default_ignores_history_tag (line 1065) | def test_rollback_operator_default_ignores_history_tag(
FILE: packages/llama-agents-control-plane/tests/test_find_deployment_id.py
function test_find_deployment_id_no_suffix_when_available (line 11) | async def test_find_deployment_id_no_suffix_when_available() -> None:
function test_find_deployment_id_suffix_when_base_taken (line 27) | async def test_find_deployment_id_suffix_when_base_taken() -> None:
function test_find_deployment_id_short_name_gets_suffix (line 50) | async def test_find_deployment_id_short_name_gets_suffix() -> None:
function test_find_deployment_id_three_char_name_no_suffix (line 65) | async def test_find_deployment_id_three_char_name_no_suffix() -> None:
function test_find_deployment_id_name_cleaning (line 80) | async def test_find_deployment_id_name_cleaning() -> None:
function test_find_deployment_id_real_validation (line 95) | async def test_find_deployment_id_real_validation() -> None:
function test_create_deployment_id_behavior (line 120) | async def test_create_deployment_id_behavior() -> None:
function test_create_deployment_with_collision (line 163) | async def test_create_deployment_with_collision() -> None:
function test_find_deployment_id_numeric_name_gets_prefix (line 205) | async def test_find_deployment_id_numeric_name_gets_prefix() -> None:
function test_find_deployment_id_digit_start_gets_prefix (line 219) | async def test_find_deployment_id_digit_start_gets_prefix() -> None:
function test_find_deployment_id_alpha_start_no_prefix (line 233) | async def test_find_deployment_id_alpha_start_no_prefix() -> None:
function test_find_deployment_id_empty_name_suffix_starts_with_letter (line 247) | async def test_find_deployment_id_empty_name_suffix_starts_with_letter()...
function test_find_deployment_id_max_length_63 (line 263) | async def test_find_deployment_id_max_length_63() -> None:
function test_find_deployment_id_exhaustion (line 277) | async def test_find_deployment_id_exhaustion() -> None:
FILE: packages/llama-agents-control-plane/tests/test_git_service.py
function mock_github_api (line 22) | def mock_github_api() -> Generator[respx.Router, None, None]:
function default_public_probe_false (line 30) | def default_public_probe_false() -> Generator[None, None, None]:
function service (line 37) | def service() -> GitService:
function project_id (line 42) | def project_id() -> str:
function github_app_auth (line 47) | def github_app_auth() -> Generator[GitHubAppAuth, None, None]:
function no_github_app_auth (line 98) | def no_github_app_auth() -> Generator[GitHubAppAuth | None, None, None]:
function mock_github_repo_and_owner (line 109) | def mock_github_repo_and_owner(
function mock_pat_access (line 189) | def mock_pat_access(
function mock_api_throttled_public_repo (line 203) | def mock_api_throttled_public_repo(
function test_public_github_repo (line 215) | async def test_public_github_repo(
function test_public_github_repo_uses_git_probe_instead_of_anonymous_api (line 244) | async def test_public_github_repo_uses_git_probe_instead_of_anonymous_api(
function test_private_github_repo_with_app_access (line 266) | async def test_private_github_repo_with_app_access(
function test_private_github_repo_with_valid_pat (line 300) | async def test_private_github_repo_with_valid_pat(
function test_private_github_repo_with_invalid_pat (line 331) | async def test_private_github_repo_with_invalid_pat(
function test_inaccessible_github_repo (line 360) | async def test_inaccessible_github_repo(
function test_public_generic_repo (line 398) | async def test_public_generic_repo(
function test_private_generic_repo_with_valid_pat (line 413) | async def test_private_generic_repo_with_valid_pat(
function test_private_generic_repo_with_invalid_pat (line 433) | async def test_private_generic_repo_with_invalid_pat(
function test_inaccessible_generic_repo (line 453) | async def test_inaccessible_generic_repo(
function test_github_detection (line 467) | async def test_github_detection(
function test_non_github_detection (line 477) | async def test_non_github_detection(
function test_is_github_repository_rejects_spoofed_urls (line 487) | async def test_is_github_repository_rejects_spoofed_urls(
function test_existing_deployment_with_pat (line 499) | async def test_existing_deployment_with_pat(
function test_pat_obsolete_detection (line 536) | async def test_pat_obsolete_detection(
function test_invalid_github_repository_url_single_segment (line 570) | async def test_invalid_github_repository_url_single_segment(
function test_github_owner_missing (line 584) | async def test_github_owner_missing(
function test_github_org_installation_all_repos_accessible (line 606) | async def test_github_org_installation_all_repos_accessible(
function test_github_org_installation_repo_missing (line 644) | async def test_github_org_installation_repo_missing(
function test_github_org_installation_selected_repos_without_access (line 674) | async def test_github_org_installation_selected_repos_without_access(
function test_validate_github_application_uses_contents_api_not_clone (line 706) | async def test_validate_github_application_uses_contents_api_not_clone(
function test_validate_github_application_missing_config (line 780) | async def test_validate_github_application_missing_config(
function test_validate_github_application_encodes_slash_ref (line 824) | async def test_validate_github_application_encodes_slash_ref(
function test_validate_github_repository_ssh_url_handles_public_probe_error (line 887) | async def test_validate_github_repository_ssh_url_handles_public_probe_e...
function test_validate_github_application_rejects_traversal_path (line 916) | async def test_validate_github_application_rejects_traversal_path(
function test_fetch_ui_package_json_rejects_path_traversal (line 952) | async def test_fetch_ui_package_json_rejects_path_traversal() -> None:
FILE: packages/llama-agents-control-plane/tests/test_k8s_client.py
function mock_k8s (line 40) | def mock_k8s() -> Generator[MagicMock, None, None]:
function mock_validate (line 46) | def mock_validate() -> Generator[MagicMock, None, None]:
class DeploymentMockParams (line 53) | class DeploymentMockParams(TypedDict, total=False):
function create_deployment_mock (line 66) | def create_deployment_mock(
function create_deployment_mock_crd (line 92) | def create_deployment_mock_crd(
function test_append_random_suffix (line 98) | def test_append_random_suffix() -> None:
function test_validate_deployment_id_available (line 118) | async def test_validate_deployment_id_available(mock_k8s: MagicMock) -> ...
function test_validate_deployment_id_taken (line 129) | async def test_validate_deployment_id_taken(mock_k8s: MagicMock) -> None:
function test_find_deployment_id_first_try (line 143) | async def test_find_deployment_id_first_try(mock_validate: MagicMock) ->...
function test_find_deployment_id_with_collision (line 153) | async def test_find_deployment_id_with_collision(mock_validate: MagicMoc...
function test_validate_deployment_token_success (line 166) | async def test_validate_deployment_token_success(mock_k8s: MagicMock) ->...
function test_validate_deployment_token_wrong_token (line 185) | async def test_validate_deployment_token_wrong_token(mock_k8s: MagicMock...
function test_validate_deployment_token_no_token (line 202) | async def test_validate_deployment_token_no_token(mock_k8s: MagicMock) -...
function test_validate_deployment_token_deployment_not_found (line 217) | async def test_validate_deployment_token_deployment_not_found(
function test_get_secret_names_success (line 234) | async def test_get_secret_names_success(mock_k8s: MagicMock) -> None:
function test_get_secret_names_not_found (line 249) | async def test_get_secret_names_not_found(mock_k8s: MagicMock) -> None:
function test_get_secret_names_empty_secret (line 258) | async def test_get_secret_names_empty_secret(mock_k8s: MagicMock) -> None:
function test_get_secret_names_batch (line 270) | async def test_get_secret_names_batch(mock_get_secret_names: MagicMock) ...
function test_llamadeployment_crd_missing_status (line 289) | def test_llamadeployment_crd_missing_status(mock_k8s: MagicMock) -> None:
function test_llamadeployment_to_response_basic (line 303) | def test_llamadeployment_to_response_basic(mock_k8s: MagicMock) -> None:
function test_llamadeployment_to_response_with_secrets (line 329) | def test_llamadeployment_to_response_with_secrets(mock_k8s: MagicMock) -...
function test_llamadeployment_to_response_only_github_pat (line 354) | def test_llamadeployment_to_response_only_github_pat(mock_k8s: MagicMock...
function test_llamadeployment_to_response_with_ingress (line 376) | def test_llamadeployment_to_response_with_ingress(mock_k8s: MagicMock) -...
function test_llamadeployment_to_response_building_mapped_to_pending (line 392) | def test_llamadeployment_to_response_building_mapped_to_pending(
function test_llamadeployment_to_response_buildfailed_mapped_to_failed (line 410) | def test_llamadeployment_to_response_buildfailed_mapped_to_failed(
function test_llamadeployment_to_response_running_not_mapped (line 428) | def test_llamadeployment_to_response_running_not_mapped(
function test_llamadeployment_to_response_awaitingcode_mapped_to_pending (line 445) | def test_llamadeployment_to_response_awaitingcode_mapped_to_pending(
function test_update_deployment_basic_fields (line 466) | async def test_update_deployment_basic_fields(
function test_update_deployment_with_secrets (line 545) | async def test_update_deployment_with_secrets(
function test_update_deployment_not_found (line 620) | async def test_update_deployment_not_found(mock_k8s: MagicMock) -> None:
function test_update_deployment_secret_required_but_missing (line 637) | async def test_update_deployment_secret_required_but_missing(
function test_update_deployment_secret_not_found (line 700) | async def test_update_deployment_secret_not_found(
function test_update_deployment_api_error (line 756) | async def test_update_deployment_api_error(mock_k8s: MagicMock) -> None:
function test_create_deployment_with_git_ref (line 771) | async def test_create_deployment_with_git_ref(
function test_create_deployment_with_git_ref_and_pat (line 800) | async def test_create_deployment_with_git_ref_and_pat(
function test_update_deployment_git_ref_validation_error (line 828) | async def test_update_deployment_git_ref_validation_error(mock_k8s: Magi...
function test_update_deployment_with_git_ref_success (line 859) | async def test_update_deployment_with_git_ref_success(
function test_get_latest_replicaset_for_deployment_not_found (line 899) | async def test_get_latest_replicaset_for_deployment_not_found(
function test_get_latest_replicaset_for_deployment_picks_highest_revision (line 910) | async def test_get_latest_replicaset_for_deployment_picks_highest_revision(
function test_stream_replicaset_logs_follow (line 953) | async def test_stream_replicaset_logs_follow(mock_k8s: MagicMock) -> None:
function test_stream_replicaset_logs_non_follow_completes_with_stop_event (line 996) | async def test_stream_replicaset_logs_non_follow_completes_with_stop_event(
function test_get_replicaset_pods_for_deployment_filters_by_owner (line 1039) | async def test_get_replicaset_pods_for_deployment_filters_by_owner(
function test_stream_container_logs_single_pod_multi_lines (line 1075) | async def test_stream_container_logs_single_pod_multi_lines(
FILE: packages/llama-agents-control-plane/tests/test_storage.py
function _make_async_cm (line 15) | def _make_async_cm() -> AsyncMock:
function test_client_uses_unsigned_config_when_unsigned_is_true (line 23) | async def test_client_uses_unsigned_config_when_unsigned_is_true() -> None:
function test_client_omits_config_and_passes_creds_when_unsigned_is_false (line 47) | async def test_client_omits_config_and_passes_creds_when_unsigned_is_fal...
FILE: packages/llama-agents-control-plane/tests/test_ui_build_path.py
function test_validate_git_application_ui_path_for_pyproject_at_examples_basic_ui (line 12) | async def test_validate_git_application_ui_path_for_pyproject_at_example...
FILE: packages/llama-agents-core/src/llama_agents/core/_alias.py
class _AliasLoader (line 22) | class _AliasLoader(Loader):
method __init__ (line 25) | def __init__(self, real_name: str) -> None:
method create_module (line 28) | def create_module(self, spec: ModuleSpec) -> ModuleType | None:
method exec_module (line 31) | def exec_module(self, module: ModuleType) -> None:
method get_code (line 35) | def get_code(self, fullname: str) -> CodeType | None:
class _AliasFinder (line 48) | class _AliasFinder(MetaPathFinder):
method find_spec (line 51) | def find_spec(
function install_alias_finder (line 75) | def install_alias_finder() -> None:
FILE: packages/llama-agents-core/src/llama_agents/core/_compat.py
function get_logging_level_mapping (line 16) | def get_logging_level_mapping() -> Mapping[str, int]:
function load_toml_file (line 29) | def load_toml_file(file_obj: BinaryIO) -> dict[str, Any]:
FILE: packages/llama-agents-core/src/llama_agents/core/client/manage_client.py
class BaseClient (line 37) | class BaseClient:
method __init__ (line 38) | def __init__(
method aclose (line 59) | async def aclose(self) -> None:
class ControlPlaneClient (line 64) | class ControlPlaneClient(BaseClient):
method ctx (line 69) | async def ctx(
method __init__ (line 81) | def __init__(
method server_version (line 86) | async def server_version(self) -> VersionResponse:
method create_backup (line 91) | async def create_backup(self) -> BackupResponse:
method list_backups (line 96) | async def list_backups(self) -> BackupListResponse:
method get_backup (line 101) | async def get_backup(self, backup_id: str) -> BackupResponse:
method delete_backup (line 106) | async def delete_backup(self, backup_id: str) -> BackupResponse:
method restore_backup (line 111) | async def restore_backup(
method list_organizations (line 123) | async def list_organizations(self) -> List[OrgSummary]:
method list_projects (line 129) | async def list_projects(self, org_id: str | None = None) -> List[Proje...
function _raise_for_status (line 141) | def _raise_for_status(response: httpx.Response) -> None:
function _response_body_snippet (line 162) | def _response_body_snippet(response: httpx.Response, limit: int = 500) -...
class ProjectClient (line 181) | class ProjectClient(BaseClient):
method ctx (line 186) | async def ctx(
method __init__ (line 202) | def __init__(
method list_deployments (line 212) | async def list_deployments(self) -> List[DeploymentResponse]:
method get_deployment (line 221) | async def get_deployment(
method create_deployment (line 231) | async def create_deployment(
method delete_deployment (line 242) | async def delete_deployment(self, deployment_id: str) -> None:
method update_deployment (line 249) | async def update_deployment(
method get_deployment_history (line 262) | async def get_deployment_history(
method rollback_deployment (line 272) | async def rollback_deployment(
method validate_repository (line 283) | async def validate_repository(
method stream_deployment_logs (line 301) | async def stream_deployment_logs(
FILE: packages/llama-agents-core/src/llama_agents/core/client/ssl_util.py
function get_ssl_context (line 12) | def get_ssl_context() -> ssl.SSLContext | bool:
function get_httpx_verify_param (line 26) | def get_httpx_verify_param() -> Any:
FILE: packages/llama-agents-core/src/llama_agents/core/deployment_config.py
function read_deployment_config_from_git_root_or_cwd (line 16) | def read_deployment_config_from_git_root_or_cwd(
function read_deployment_config (line 29) | def read_deployment_config(source_root: Path, config_path: Path) -> "Dep...
function resolve_config_parent (line 174) | def resolve_config_parent(root: Path, deployment_path: Path) -> Path:
class DeploymentConfig (line 188) | class DeploymentConfig(BaseModel):
method merge_config (line 225) | def merge_config(self, config: "DeploymentConfig") -> "DeploymentConfig":
method has_no_workflows (line 246) | def has_no_workflows(self) -> bool:
method has_both_app_and_workflows (line 250) | def has_both_app_and_workflows(self) -> bool:
method is_valid (line 254) | def is_valid(self) -> bool:
method validate_config (line 262) | def validate_config(self) -> None:
method build_output_path (line 269) | def build_output_path(self) -> Path | None:
function _pick_non_default (line 283) | def _pick_non_default(a: T, b: T, default: T) -> T:
class UIConfig (line 289) | class UIConfig(BaseModel):
method merge_config (line 315) | def merge_config(self, config: "UIConfig") -> "UIConfig":
class ServiceSourceV0 (line 336) | class ServiceSourceV0(BaseModel):
method validate_fields (line 343) | def validate_fields(cls, data: Any) -> Any:
class DerecatedService (line 350) | class DerecatedService(BaseModel):
method validate_fields (line 361) | def validate_fields(cls, data: Any) -> Any:
method module_location (line 373) | def module_location(self) -> tuple[str, str]:
class DeprecatedDeploymentConfig (line 385) | class DeprecatedDeploymentConfig(BaseModel):
method validate_fields (line 397) | def validate_fields(cls, data: Any) -> Any:
method from_yaml (line 406) | def from_yaml(
method to_deployment_config (line 417) | def to_deployment_config(self) -> DeploymentConfig:
FILE: packages/llama-agents-core/src/llama_agents/core/git/git_util.py
function _discover_repo (line 39) | def _discover_repo() -> Iterator[Repo]:
function parse_github_repo_url (line 51) | def parse_github_repo_url(repo_url: str) -> tuple[str, str]:
class GitAccessError (line 80) | class GitAccessError(Exception):
method __init__ (line 83) | def __init__(self, message: str):
function validate_git_url (line 94) | def validate_git_url(url: str) -> None:
function validate_git_url_no_ssrf (line 121) | def validate_git_url_no_ssrf(url: str) -> None:
function _check_hostname_not_private (line 136) | def _check_hostname_not_private(hostname: str) -> None:
class GitCloneResult (line 152) | class GitCloneResult:
function _split_basic_auth (line 157) | def _split_basic_auth(basic_auth: str | None) -> tuple[str | None, str |...
function _resolved_git_ref_for_head (line 168) | def _resolved_git_ref_for_head(repo: Repo) -> str | None:
function resolve_ref_in_repo (line 194) | def resolve_ref_in_repo(repo: Repo, git_ref: str) -> bytes | None:
function _checkout_ref (line 239) | def _checkout_ref(repo: Repo, git_ref: str) -> None:
function clone_repo_sync (line 263) | def clone_repo_sync(
function clone_repo (line 380) | async def clone_repo(
function validate_deployment_file (line 400) | def validate_deployment_file(repo_dir: Path, deployment_file_path: str) ...
function _probe_remote (line 432) | def _probe_remote(
function validate_git_public_access_sync (line 452) | def validate_git_public_access_sync(repository_url: str) -> bool:
function validate_git_public_access (line 458) | async def validate_git_public_access(repository_url: str) -> bool:
function validate_git_credential_access_sync (line 463) | def validate_git_credential_access_sync(repository_url: str, basic_auth:...
function validate_git_credential_access (line 470) | async def validate_git_credential_access(repository_url: str, basic_auth...
function is_git_repo (line 477) | def is_git_repo() -> bool:
function list_remotes (line 485) | def list_remotes() -> list[str]:
function get_current_branch (line 499) | def get_current_branch() -> str | None:
function get_commit_sha_for_ref (line 512) | def get_commit_sha_for_ref(ref: str) -> str | None:
function get_git_root (line 535) | def get_git_root() -> Path:
function working_tree_has_changes (line 540) | def working_tree_has_changes() -> bool:
function get_unpushed_commits_count (line 554) | def get_unpushed_commits_count() -> int | None:
FILE: packages/llama-agents-core/src/llama_agents/core/iter_utils.py
function debounced_sorted_prefix (line 14) | async def debounced_sorted_prefix(
function merge_generators (line 56) | async def merge_generators(
class Debouncer (line 155) | class Debouncer:
method __init__ (line 161) | def __init__(
method _loop (line 176) | async def _loop(self) -> None:
method is_complete (line 186) | def is_complete(self) -> bool:
method extend_window (line 189) | def extend_window(self) -> None:
method wait (line 194) | async def wait(self) -> None:
method aiter (line 198) | async def aiter(self) -> AsyncGenerator[COMPLETE, None]:
FILE: packages/llama-agents-core/src/llama_agents/core/path_util.py
function validate_path_traversal (line 4) | def validate_path_traversal(
FILE: packages/llama-agents-core/src/llama_agents/core/schema/backups.py
class BackupResponse (line 9) | class BackupResponse(Base):
class BackupListResponse (line 18) | class BackupListResponse(Base):
class RestoreRequest (line 22) | class RestoreRequest(Base):
class RestoreDeploymentResult (line 28) | class RestoreDeploymentResult(Base):
class RestoreResponse (line 34) | class RestoreResponse(Base):
FILE: packages/llama-agents-core/src/llama_agents/core/schema/base.py
class Base (line 19) | class Base(BaseModel):
FILE: packages/llama-agents-core/src/llama_agents/core/schema/deployments.py
function validate_dns_1035_label (line 18) | def validate_dns_1035_label(value: str) -> str:
function validate_appserver_version (line 35) | def validate_appserver_version(value: str) -> str:
function _validate_optional_appserver_version (line 54) | def _validate_optional_appserver_version(value: str | None) -> str | None:
function version_to_image_tag (line 70) | def version_to_image_tag(version: str) -> str:
function image_tag_to_version (line 75) | def image_tag_to_version(tag: str) -> str | None:
class DeploymentEvent (line 102) | class DeploymentEvent(Base):
class DeploymentResponse (line 121) | class DeploymentResponse(Base):
method name (line 166) | def name(self) -> str:
method llama_deploy_version (line 171) | def llama_deploy_version(self) -> str | None:
method _compat_aliases (line 176) | def _compat_aliases(cls, data: dict) -> dict: # type: ignore[type-arg]
class DeploymentsListResponse (line 186) | class DeploymentsListResponse(Base):
class DeploymentCreate (line 192) | class DeploymentCreate(Base):
method _compat_aliases (line 223) | def _compat_aliases(cls, data: dict) -> dict: # type: ignore[type-arg]
method name (line 234) | def name(self) -> str:
method llama_deploy_version (line 239) | def llama_deploy_version(self) -> str | None:
method _require_id_format (line 243) | def _require_id_format(self) -> "DeploymentCreate":
class LlamaDeploymentMetadata (line 249) | class LlamaDeploymentMetadata(Base):
class LlamaDeploymentSpec (line 259) | class LlamaDeploymentSpec(Base):
method _migrate_name (line 284) | def _migrate_name(cls, data: dict) -> dict: # type: ignore[type-arg]
method get_display_name (line 291) | def get_display_name(self) -> str:
class LlamaDeploymentStatus (line 296) | class LlamaDeploymentStatus(Base):
class LlamaDeploymentCRD (line 311) | class LlamaDeploymentCRD(Base):
class DeploymentUpdate (line 317) | class DeploymentUpdate(Base):
method name (line 373) | def name(self) -> str | None:
method llama_deploy_version (line 378) | def llama_deploy_version(self) -> str | None:
method _compat_aliases (line 383) | def _compat_aliases(cls, data: dict) -> dict: # type: ignore[type-arg]
method has_git_fields (line 392) | def has_git_fields(self) -> bool:
method _has_substantive_fields (line 403) | def _has_substantive_fields(self) -> bool:
class DeploymentUpdateResult (line 419) | class DeploymentUpdateResult(Base):
function apply_deployment_update (line 431) | def apply_deployment_update(
class LogEvent (line 525) | class LogEvent(Base):
class ReleaseHistoryEntry (line 535) | class ReleaseHistoryEntry(Base):
class ReleaseHistoryItem (line 545) | class ReleaseHistoryItem(Base):
class DeploymentHistoryResponse (line 557) | class DeploymentHistoryResponse(Base):
class RollbackRequest (line 564) | class RollbackRequest(Base):
FILE: packages/llama-agents-core/src/llama_agents/core/schema/git_validation.py
class RepositoryValidationResponse (line 6) | class RepositoryValidationResponse(BaseModel):
class RepositoryValidationRequest (line 39) | class RepositoryValidationRequest(BaseModel):
class GitApplicationValidationResponse (line 45) | class GitApplicationValidationResponse(BaseModel):
FILE: packages/llama-agents-core/src/llama_agents/core/schema/projects.py
class OrgSummary (line 8) | class OrgSummary(Base):
class OrganizationsListResponse (line 16) | class OrganizationsListResponse(Base):
class ProjectSummary (line 22) | class ProjectSummary(Base):
method set_default_project_name (line 32) | def set_default_project_name(cls, data: Any) -> Any:
class ProjectsListResponse (line 40) | class ProjectsListResponse(Base):
FILE: packages/llama-agents-core/src/llama_agents/core/schema/public.py
class Capabilities (line 8) | class Capabilities:
class VersionResponse (line 15) | class VersionResponse(Base):
FILE: packages/llama-agents-core/src/llama_agents/core/server/manage_api/_abstract_deployments_service.py
class AbstractPublicDeploymentsService (line 14) | class AbstractPublicDeploymentsService(ABC):
method get_version (line 16) | async def get_version(self) -> schema.VersionResponse:
class AbstractDeploymentsService (line 23) | class AbstractDeploymentsService(ABC):
method get_organizations (line 25) | async def get_organizations(self) -> schema.OrganizationsListResponse:
method get_projects (line 32) | async def get_projects(
method validate_repository (line 41) | async def validate_repository(
method create_deployment (line 52) | async def create_deployment(
method get_deployments (line 72) | async def get_deployments(
method get_deployment (line 88) | async def get_deployment(
method delete_deployment (line 110) | async def delete_deployment(
method update_deployment (line 130) | async def update_deployment(
method get_deployment_history (line 152) | async def get_deployment_history(
method rollback_deployment (line 161) | async def rollback_deployment(
method stream_deployment_logs (line 170) | async def stream_deployment_logs(
method handle_git_request (line 207) | async def handle_git_request(
FILE: packages/llama-agents-core/src/llama_agents/core/server/manage_api/_create_deployments_router.py
function get_project_id (line 20) | async def get_project_id(
function create_v1beta1_deployments_router (line 33) | def create_v1beta1_deployments_router(
FILE: packages/llama-agents-core/src/llama_agents/core/server/manage_api/_exceptions.py
class DeploymentNotFoundError (line 1) | class DeploymentNotFoundError(Exception):
class ReplicaSetNotFoundError (line 9) | class ReplicaSetNotFoundError(Exception):
FILE: packages/llama-agents-core/src/llama_agents/core/ui_build.py
function resolve_ui_root (line 9) | def resolve_ui_root(config_parent: Path, config: DeploymentConfig) -> Pa...
function ui_build_output_path (line 16) | def ui_build_output_path(config_parent: Path, config: DeploymentConfig) ...
FILE: packages/llama-agents-core/tests/client/test_manage_client.py
function client (line 22) | async def client() -> AsyncIterator[LlamaDeployClient]:
function test_client_initialization (line 32) | async def test_client_initialization() -> None:
function test_server_version_includes_new_fields (line 44) | async def test_server_version_includes_new_fields() -> None:
function test_server_version_defaults_when_min_missing (line 65) | async def test_server_version_defaults_when_min_missing() -> None:
function test_successful_request (line 85) | async def test_successful_request(client: LlamaDeployClient) -> None:
function test_request_with_json_data (line 99) | async def test_request_with_json_data(client: LlamaDeployClient) -> None:
function test_get_deployments (line 114) | async def test_get_deployments(client: LlamaDeployClient) -> None:
function test_get_deployment (line 150) | async def test_get_deployment(client: LlamaDeployClient) -> None:
function test_create_deployment_basic (line 182) | async def test_create_deployment_basic(client: LlamaDeployClient) -> None:
function test_create_deployment_with_git_ref (line 230) | async def test_create_deployment_with_git_ref(client: LlamaDeployClient)...
function test_create_deployment_with_all_params (line 278) | async def test_create_deployment_with_all_params(client: LlamaDeployClie...
function test_delete_deployment (line 332) | async def test_delete_deployment(client: LlamaDeployClient) -> None:
function _sse_bytes (line 344) | def _sse_bytes(*events: tuple[str, str]) -> bytes:
function test_stream_deployment_logs_parses_log_events (line 356) | async def test_stream_deployment_logs_parses_log_events(
function test_stream_deployment_logs_passes_optional_params (line 405) | async def test_stream_deployment_logs_passes_optional_params(
function test_stream_deployment_logs_ignores_non_log_events (line 442) | async def test_stream_deployment_logs_ignores_non_log_events(
FILE: packages/llama-agents-core/tests/test_deployment_config.py
function write_file (line 8) | def write_file(path: Path, content: str) -> None:
function test_pyproject_tool_llamadeploy_name_fallback (line 13) | def test_pyproject_tool_llamadeploy_name_fallback(tmp_path: Path) -> None:
function test_relative_ui_directory_within_root_is_ok (line 33) | def test_relative_ui_directory_within_root_is_ok(tmp_path: Path) -> None:
function test_pyproject_when_config_path_points_to_file (line 54) | def test_pyproject_when_config_path_points_to_file(tmp_path: Path) -> None:
function test_nonexistent_config_dir_returns_defaults (line 76) | def test_nonexistent_config_dir_returns_defaults(tmp_path: Path) -> None:
function test_llamadeploy_toml_parses_minimal_and_sets_ui (line 85) | def test_llamadeploy_toml_parses_minimal_and_sets_ui(tmp_path: Path) -> ...
function test_legacy_yaml_only_merging_into_new_config (line 113) | def test_legacy_yaml_only_merging_into_new_config(tmp_path: Path) -> None:
function test_yaml_and_pyproject_merge_precedence (line 140) | def test_yaml_and_pyproject_merge_precedence(tmp_path: Path) -> None:
function test_package_json_overrides_ui_fields (line 175) | def test_package_json_overrides_ui_fields(tmp_path: Path) -> None:
function test_package_json_package_manager_fallback_with_llamadeploy (line 219) | def test_package_json_package_manager_fallback_with_llamadeploy(tmp_path...
function test_package_json_package_manager_fallback_without_llamadeploy (line 250) | def test_package_json_package_manager_fallback_without_llamadeploy(
function test_ui_directory_can_be_above_pyproject_dir_but_within_source_root (line 282) | def test_ui_directory_can_be_above_pyproject_dir_but_within_source_root(
function test_ui_directory_cannot_escape_source_root (line 312) | def test_ui_directory_cannot_escape_source_root(tmp_path: Path) -> None:
function test_llama_agents_toml_is_preferred_over_llama_deploy_toml (line 329) | def test_llama_agents_toml_is_preferred_over_llama_deploy_toml(
function test_llama_agents_toml_works_alone (line 347) | def test_llama_agents_toml_works_alone(tmp_path: Path) -> None:
function test_pyproject_tool_llamaagents_is_preferred_over_llamadeploy (line 359) | def test_pyproject_tool_llamaagents_is_preferred_over_llamadeploy(
function test_pyproject_tool_llamaagents_works_alone (line 381) | def test_pyproject_tool_llamaagents_works_alone(tmp_path: Path) -> None:
function test_llama_agents_yaml_is_preferred_over_llama_deploy_yaml (line 402) | def test_llama_agents_yaml_is_preferred_over_llama_deploy_yaml(
function test_llama_agents_yaml_works_alone (line 420) | def test_llama_agents_yaml_works_alone(tmp_path: Path) -> None:
function test_package_json_llamaagents_key_is_preferred_over_llamadeploy (line 432) | def test_package_json_llamaagents_key_is_preferred_over_llamadeploy(
function test_package_json_llamaagents_key_works_alone (line 462) | def test_package_json_llamaagents_key_works_alone(tmp_path: Path) -> None:
function test_absolute_ui_directory_outside_source_root_is_rejected (line 492) | def test_absolute_ui_directory_outside_source_root_is_rejected(tmp_path:...
FILE: packages/llama-agents-core/tests/test_git_util.py
function _make_fake_repo (line 35) | def _make_fake_repo(head_sha: str = "abc123def456" * 3 + "0000") -> Magi...
function _make_clone_source (line 44) | def _make_clone_source(path: Path) -> tuple[str, str, str]:
function test_parse_github_repo_url (line 76) | def test_parse_github_repo_url() -> None:
function test_clone_repo_branch_success (line 115) | def test_clone_repo_branch_success(tmp_path: Path) -> None:
function test_clone_repo_no_ref (line 126) | def test_clone_repo_no_ref(tmp_path: Path) -> None:
function test_clone_repo_no_ref_detached_resolves_tag (line 139) | async def test_clone_repo_no_ref_detached_resolves_tag(mock_clone: Magic...
function test_clone_repo_full_sha (line 158) | def test_clone_repo_full_sha(tmp_path: Path) -> None:
function test_clone_repo_explicit_git_sha_preserves_ref_metadata (line 170) | def test_clone_repo_explicit_git_sha_preserves_ref_metadata(tmp_path: Pa...
function test_clone_repo_explicit_git_sha_does_not_require_initial_head (line 189) | async def test_clone_repo_explicit_git_sha_does_not_require_initial_head(
function test_clone_repo_short_sha_like_ref (line 220) | def test_clone_repo_short_sha_like_ref(tmp_path: Path) -> None:
function test_clone_repo_network_error (line 237) | async def test_clone_repo_network_error(mock_clone: MagicMock) -> None:
function test_clone_repo_with_basic_auth (line 250) | async def test_clone_repo_with_basic_auth(mock_clone: MagicMock) -> None:
function test_clone_repo_passes_depth (line 269) | async def test_clone_repo_passes_depth(mock_clone: MagicMock) -> None:
function test_clone_repo_sha_overrides_depth (line 286) | async def test_clone_repo_sha_overrides_depth(mock_clone: MagicMock) -> ...
function _make_real_repo_with_commit (line 309) | def _make_real_repo_with_commit(tmp_path: Path) -> tuple[Repo, str]:
function test_checkout_ref_resolves_short_sha_prefix (line 322) | def test_checkout_ref_resolves_short_sha_prefix(tmp_path: Path) -> None:
function test_checkout_ref_rejects_ambiguous_short_sha_prefix (line 332) | def test_checkout_ref_rejects_ambiguous_short_sha_prefix(tmp_path: Path)...
function test_checkout_ref_rejects_missing_short_sha_prefix (line 347) | def test_checkout_ref_rejects_missing_short_sha_prefix(tmp_path: Path) -...
function test_clone_repo_rejects_dangerous_url (line 358) | async def test_clone_repo_rejects_dangerous_url() -> None:
function test_working_tree_has_changes_true (line 366) | def test_working_tree_has_changes_true(tmp_path: Path) -> None:
function test_working_tree_has_changes_false (line 383) | def test_working_tree_has_changes_false(tmp_path: Path) -> None:
function test_working_tree_has_changes_exception (line 399) | def test_working_tree_has_changes_exception(_: MagicMock) -> None:
function test_get_unpushed_commits_count_no_upstream (line 403) | def test_get_unpushed_commits_count_no_upstream(tmp_path: Path) -> None:
function test_get_unpushed_commits_count_ahead (line 420) | def test_get_unpushed_commits_count_ahead(tmp_path: Path) -> None:
function test_get_unpushed_commits_count_no_repo (line 469) | def test_get_unpushed_commits_count_no_repo(tmp_path: Path) -> None:
function test_validate_git_public_access_true (line 480) | async def test_validate_git_public_access_true(mock_probe: MagicMock) ->...
function test_validate_git_public_access_false (line 492) | async def test_validate_git_public_access_false(mock_probe: MagicMock) -...
function test_get_commit_sha_for_ref (line 501) | def test_get_commit_sha_for_ref(tmp_path: Path) -> None:
function test_is_git_repo_returns_false_when_not_a_repo (line 517) | def test_is_git_repo_returns_false_when_not_a_repo(tmp_path: Path) -> None:
function test_is_git_repo_returns_true_in_real_repo (line 523) | def test_is_git_repo_returns_true_in_real_repo(tmp_path: Path) -> None:
function test_validate_git_url_allows_valid_schemes (line 539) | def test_validate_git_url_allows_valid_schemes(url: str) -> None:
function test_validate_git_url_rejects_dangerous_urls (line 553) | def test_validate_git_url_rejects_dangerous_urls(url: str) -> None:
function test_validate_git_url_no_ssrf_rejects_private_ips (line 577) | def test_validate_git_url_no_ssrf_rejects_private_ips(
function test_validate_git_url_no_ssrf_allows_public_ip (line 588) | def test_validate_git_url_no_ssrf_allows_public_ip() -> None:
function test_validate_git_url_no_ssrf_rejects_dns_failure (line 596) | def test_validate_git_url_no_ssrf_rejects_dns_failure() -> None:
FILE: packages/llama-agents-core/tests/test_iter_utils.py
function _gen_with_delays (line 16) | async def _gen_with_delays(
function _gen_with_gates (line 25) | async def _gen_with_gates(
function _gen_raises (line 33) | async def _gen_raises(after_items: int = 0) -> AsyncGenerator[str, None]:
function _gen_with_close_flag (line 42) | async def _gen_with_close_flag(
function _wait_for_count (line 52) | async def _wait_for_count(values: Collection[object], expected_count: in...
function test_merge_generators_interleaves_in_arrival_order (line 61) | async def test_merge_generators_interleaves_in_arrival_order() -> None:
function test_merge_generators_propagates_exception_immediately (line 89) | async def test_merge_generators_propagates_exception_immediately() -> None:
function test_merge_generators_stop_on_first_completion_cancels_others (line 104) | async def test_merge_generators_stop_on_first_completion_cancels_others(...
function test_debounced_sorted_prefix_sorts_then_passthrough (line 131) | async def test_debounced_sorted_prefix_sorts_then_passthrough() -> None:
FILE: packages/llama-agents-core/tests/test_schema.py
function test_deployment_create_valid (line 25) | def test_deployment_create_valid() -> None:
function test_deployment_create_accepts_deprecated_name (line 42) | def test_deployment_create_accepts_deprecated_name() -> None:
function test_deployment_create_serializes_name_for_old_servers (line 48) | def test_deployment_create_serializes_name_for_old_servers() -> None:
function test_deployment_update_accepts_deprecated_name (line 56) | def test_deployment_update_accepts_deprecated_name() -> None:
function test_deployment_update_serializes_name_for_old_servers (line 62) | def test_deployment_update_serializes_name_for_old_servers() -> None:
function test_deployment_update_name_is_none_when_display_name_unset (line 70) | def test_deployment_update_name_is_none_when_display_name_unset() -> None:
function test_deployment_response_deserializes_old_server_name (line 78) | def test_deployment_response_deserializes_old_server_name() -> None:
function test_deployment_create_accepts_deprecated_llama_deploy_version (line 98) | def test_deployment_create_accepts_deprecated_llama_deploy_version() -> ...
function test_deployment_create_canonical_wins_on_conflict (line 108) | def test_deployment_create_canonical_wins_on_conflict() -> None:
function test_deployment_create_neither_version_field_set (line 121) | def test_deployment_create_neither_version_field_set() -> None:
function test_deployment_create_accepts_public_pep440_appserver_version (line 137) | def test_deployment_create_accepts_public_pep440_appserver_version(
function test_deployment_create_rejects_non_public_pep440_appserver_version (line 158) | def test_deployment_create_rejects_non_public_pep440_appserver_version(
function test_deployment_create_serializes_llama_deploy_version_for_old_servers (line 169) | def test_deployment_create_serializes_llama_deploy_version_for_old_serve...
function test_deployment_update_accepts_deprecated_llama_deploy_version (line 181) | def test_deployment_update_accepts_deprecated_llama_deploy_version() -> ...
function test_deployment_update_canonical_wins_on_conflict (line 187) | def test_deployment_update_canonical_wins_on_conflict() -> None:
function test_deployment_update_rejects_non_public_pep440_appserver_version (line 195) | def test_deployment_update_rejects_non_public_pep440_appserver_version()...
function test_deployment_update_allows_internal_image_tag_escape_hatch (line 200) | def test_deployment_update_allows_internal_image_tag_escape_hatch() -> N...
function test_deployment_update_serializes_llama_deploy_version_for_old_servers (line 205) | def test_deployment_update_serializes_llama_deploy_version_for_old_serve...
function test_deployment_update_llama_deploy_version_none_when_unset (line 213) | def test_deployment_update_llama_deploy_version_none_when_unset() -> None:
function test_deployment_response_accepts_old_server_llama_deploy_version (line 221) | def test_deployment_response_accepts_old_server_llama_deploy_version() -...
function test_deployment_response_serializes_both_version_fields (line 239) | def test_deployment_response_serializes_both_version_fields() -> None:
function test_deployment_create_optional_fields (line 256) | def test_deployment_create_optional_fields() -> None:
function test_deployment_response (line 270) | def test_deployment_response() -> None:
function test_apply_deployment_update_basic_fields (line 288) | def test_apply_deployment_update_basic_fields() -> None:
function test_apply_deployment_update_personal_access_token (line 320) | def test_apply_deployment_update_personal_access_token() -> None:
function test_apply_deployment_update_secrets (line 343) | def test_apply_deployment_update_secrets() -> None:
function test_apply_deployment_update_combined (line 368) | def test_apply_deployment_update_combined() -> None:
function test_apply_deployment_update_no_changes (line 400) | def test_apply_deployment_update_no_changes() -> None:
function test_apply_deployment_update_none_fields (line 421) | def test_apply_deployment_update_none_fields() -> None:
function test_project_summary (line 452) | def test_project_summary() -> None:
function test_deployments_list_response (line 461) | def test_deployments_list_response() -> None:
function test_apply_deployment_update_git_ref (line 492) | def test_apply_deployment_update_git_ref() -> None:
function test_release_history_models_roundtrip (line 519) | def test_release_history_models_roundtrip() -> None:
function test_deployment_create_with_git_ref (line 531) | def test_deployment_create_with_git_ref() -> None:
function test_projects_list_response (line 546) | def test_projects_list_response() -> None:
function test_deployment_phases_all_valid (line 563) | def test_deployment_phases_all_valid() -> None:
function test_unknown_phase_value_accepted (line 588) | def test_unknown_phase_value_accepted() -> None:
function test_rollingout_phase_response (line 604) | def test_rollingout_phase_response() -> None:
function test_rolloutfailed_phase_response (line 620) | def test_rolloutfailed_phase_response() -> None:
function test_deployment_phases_in_list_response (line 636) | def test_deployment_phases_in_list_response() -> None:
function test_version_to_image_tag (line 681) | def test_version_to_image_tag() -> None:
function test_image_tag_to_version_plain (line 687) | def test_image_tag_to_version_plain() -> None:
function test_image_tag_to_version_legacy_prefix (line 693) | def test_image_tag_to_version_legacy_prefix() -> None:
function test_image_tag_to_version_non_conforming (line 699) | def test_image_tag_to_version_non_conforming() -> None:
function test_appserver_tag_prefix_constant (line 706) | def test_appserver_tag_prefix_constant() -> None:
function test_apply_deployment_update_image_tag_precedence (line 710) | def test_apply_deployment_update_image_tag_precedence() -> None:
function test_apply_deployment_update_image_tag_only (line 727) | def test_apply_deployment_update_image_tag_only() -> None:
function test_apply_deployment_update_suspended (line 740) | def test_apply_deployment_update_suspended() -> None:
function test_apply_deployment_update_auto_resume_git_re
Condensed preview — 780 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,345K chars).
[
{
"path": ".agents/skills/llamactl-qa/SKILL.md",
"chars": 19505,
"preview": "---\nname: llamactl-qa\ndescription: Plan and run a design-QA / \"taste test\" of llamactl changes against a real backend. C"
},
{
"path": ".changeset/README.md",
"chars": 510,
"preview": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that wo"
},
{
"path": ".changeset/config.json",
"chars": 259,
"preview": "{\n \"$schema\": \"https://unpkg.com/@changesets/config@3.1.1/schema.json\",\n \"changelog\": \"@changesets/cli/changelog\",\n \""
},
{
"path": ".dockerignore",
"chars": 212,
"preview": ".git\n.venv\n__pycache__\nnode_modules\n.mypy_cache\n.pytest_cache\n.ruff_cache\n*.egg-info\ndocs\n.claude\n.worktree\nthoughts\narc"
},
{
"path": ".gitattributes",
"chars": 19,
"preview": "* text=auto eol=lf\n"
},
{
"path": ".github/actions/pr-fix-comment/action.yml",
"chars": 11882,
"preview": "# SPDX-License-Identifier: MIT\n\nname: \"Auto-Fix PR Manager\"\ndescription: \"Creates fix PRs and manages PR comments for au"
},
{
"path": ".github/actions/setup-publish/action.yml",
"chars": 494,
"preview": "name: Setup publish job\ndescription: Install Python + uv and download the publish plan artifact. Assumes the repo is alr"
},
{
"path": ".github/workflows/bump_llama_index_core.yml",
"chars": 986,
"preview": "name: Bump llama-index-core\n\non:\n repository_dispatch:\n types: [llama-index-core-release]\n workflow_dispatch:\n\njobs"
},
{
"path": ".github/workflows/chart-validate.yaml",
"chars": 1544,
"preview": "name: chart-validate\n\non:\n push:\n branches: [main, develop]\n pull_request:\n branches: [main, develop]\n paths:"
},
{
"path": ".github/workflows/go-ci.yml",
"chars": 1564,
"preview": "name: CI\n\non:\n push:\n branches: [main, develop]\n pull_request:\n branches: [main, develop]\n paths:\n - \"op"
},
{
"path": ".github/workflows/lint.yml",
"chars": 848,
"preview": "name: Linting\n\non:\n push:\n branches:\n - main\n pull_request:\n\njobs:\n lint:\n runs-on: ubuntu-latest\n step"
},
{
"path": ".github/workflows/lockfile.yml",
"chars": 543,
"preview": "name: Lockfile\n\non:\n push:\n branches:\n - main\n paths:\n - \"**/package.json\"\n - \"pnpm-lock.yaml\"\n p"
},
{
"path": ".github/workflows/publish_changesets.yml",
"chars": 14315,
"preview": "name: Version Bump and Release\n\non:\n push:\n branches:\n - main\n - dev\n\nconcurrency: ${{ github.workflow }}-"
},
{
"path": ".github/workflows/publish_openapi.yml",
"chars": 2565,
"preview": "name: Publish OpenAPI specification\n\non:\n workflow_dispatch:\n inputs:\n tag:\n description: \"Release tag t"
},
{
"path": ".github/workflows/sync-docs.yml",
"chars": 1240,
"preview": "name: Sync Docs to Developer Hub\n\non:\n push:\n branches: [main]\n paths:\n - \"docs/**\"\n workflow_dispatch:\n\njo"
},
{
"path": ".github/workflows/test.yml",
"chars": 4838,
"preview": "name: Unit Testing\n\non:\n pull_request:\n push:\n branches:\n - main\n\nenv:\n # Which Python from the matrix will b"
},
{
"path": ".github/workflows/update_debugger_assets.yml",
"chars": 3176,
"preview": "name: Update Debugger Assets\n\non:\n repository_dispatch:\n types: [debugger-assets-update]\n workflow_dispatch:\n in"
},
{
"path": ".gitignore",
"chars": 2051,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
},
{
"path": ".pre-commit-config.yaml",
"chars": 1277,
"preview": "---\ndefault_language_version:\n python: python3\n\nrepos:\n - repo: https://github.com/pre-commit/pre-commit-hooks\n rev"
},
{
"path": ".prettierrc",
"chars": 132,
"preview": "{\n \"overrides\": [\n {\n \"files\": [\"*.yaml\", \"*.yml\"],\n \"options\": {\n \"bracketSpacing\": false\n }\n"
},
{
"path": ".taplo.toml",
"chars": 206,
"preview": "[formatting]\nalign_comments = false\nreorder_keys = false\n# Following are to be consistent with toml-sort\nindent_string ="
},
{
"path": "AGENTS.md",
"chars": 8245,
"preview": "# LlamaIndex Workflows - Claude Development Guide\n\n## Project Overview\nThis is the LlamaIndex Workflows library - an eve"
},
{
"path": "CLAUDE.md",
"chars": 11,
"preview": "@AGENTS.md\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 3526,
"preview": "# Contributing\n\n## Ideas for Contributing\n\nContributions are welcome! We do our best to keep an eye on the issues and PR"
},
{
"path": "LICENSE",
"chars": 1076,
"preview": "The MIT License\n\nCopyright (c) 2026 LlamaIndex Inc.\n\nPermission is hereby granted, free of charge, to any person obtaini"
},
{
"path": "README.md",
"chars": 5599,
"preview": "# LlamaAgents\n\n[](https://gi"
},
{
"path": "architecture-docs/build-api.md",
"chars": 1862,
"preview": "# Build API\n\nThe Build API is a secure proxy service that enables deployment pods to access external resources without e"
},
{
"path": "architecture-docs/control-loop.md",
"chars": 4897,
"preview": "# Control Loop Architecture\n\nThe control loop is the core execution engine for workflows. It follows a **reducer pattern"
},
{
"path": "architecture-docs/core-overview.md",
"chars": 4785,
"preview": "# Core Architecture: Workflow, Context, and Runtime\n\n## Overview\n\n```mermaid\ngraph LR\n subgraph Client [\"Client (publ"
},
{
"path": "architecture-docs/overall-architecture.md",
"chars": 5654,
"preview": "# Cloud Llama Deploy - Overall Architecture\n\nThis document outlines the architecture of the Cloud Llama Deploy system, w"
},
{
"path": "architecture-docs/quick-reference.md",
"chars": 5436,
"preview": "## Code Navigation Guide\n\n### Entry Points & Main Classes\n\n**Control Plane** (`packages/llama-deploy-control-plane/`)\n- "
},
{
"path": "architecture-docs/server-architecture.md",
"chars": 5534,
"preview": "# Server Architecture\n\n## Overview\n\nThe server wraps the core workflow engine (see [core-overview.md](./core-overview.md"
},
{
"path": "charts/AGENTS.md",
"chars": 749,
"preview": "## Helm Chart\n\nMakefile lives in `operator/`. Run targets with `make -C operator <target>` from repo root, or `make <tar"
},
{
"path": "charts/llama-agents/.helmignore",
"chars": 191,
"preview": "# Patterns to ignore when building packages.\n.DS_Store\n*.swp\n*.bak\n*.tmp\n*~\n.git\n.gitignore\n\n# Node modules symlink pull"
},
{
"path": "charts/llama-agents/CHANGELOG.md",
"chars": 3042,
"preview": "# llama-agents\n\n## 0.12.3\n\n### Patch Changes\n\n- Updated dependencies [c3fac21]\n - llama-agents-control-plane@0.12.2\n -"
},
{
"path": "charts/llama-agents/Chart.yaml",
"chars": 150,
"preview": "apiVersion: v2\nname: llama-agents\ndescription: A Helm chart for deploying Llama Agents (control plane + operator)\ntype: "
},
{
"path": "charts/llama-agents/README.md",
"chars": 16062,
"preview": "# llama-agents\n\nA Helm chart for deploying Llama Agents (control plane + operator)\n\n## Architecture\n\nThis chart deploys "
},
{
"path": "charts/llama-agents/README.md.gotmpl",
"chars": 4631,
"preview": "{{ template \"chart.header\" . }}\n\n{{ template \"chart.description\" . }}\n\n## Architecture\n\nThis chart deploys two component"
},
{
"path": "charts/llama-agents/crds/deploy.llamaindex.ai_llamadeployments.yaml",
"chars": 9436,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n controller-gen.kubeb"
},
{
"path": "charts/llama-agents/crds/deploy.llamaindex.ai_llamadeploymenttemplates.yaml",
"chars": 2608,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n controller-gen.kubeb"
},
{
"path": "charts/llama-agents/package.json",
"chars": 674,
"preview": "{\n \"name\": \"llama-agents\",\n \"version\": \"0.12.3\",\n \"dependencies\": {\n \"llama-agents-appserver\": \"workspace:*\",\n "
},
{
"path": "charts/llama-agents/templates/_helpers.tpl",
"chars": 1804,
"preview": "{{/*\nCommon name helpers for the llama-agents chart.\nAll resource names derive from these so a single rename propagates "
},
{
"path": "charts/llama-agents/templates/_s3proxy.tpl",
"chars": 1856,
"preview": "{{/*\ns3proxy sidecar container definition.\nRendered into the control plane pod when `.Values.s3proxy.enabled` is true.\n*"
},
{
"path": "charts/llama-agents/templates/_secrets.tpl",
"chars": 1116,
"preview": "{{/*\nenvFrom helpers. Each emits zero-or-one `- secretRef:` entries with silent\nBYO-over-inline precedence. Model: llama"
},
{
"path": "charts/llama-agents/templates/controlplane-hpa.yaml",
"chars": 1311,
"preview": "{{- if .Values.controlPlane.hpa.enabled }}\napiVersion: autoscaling/v2\nkind: HorizontalPodAutoscaler\nmetadata:\n name: {{"
},
{
"path": "charts/llama-agents/templates/controlplane-s3-secret.yaml",
"chars": 746,
"preview": "{{- $os := .Values.controlPlane.objectStorage }}\n{{- $s3 := $os.s3 }}\n{{- if or $s3.accessKey $s3.secretKey }}\n{{- if no"
},
{
"path": "charts/llama-agents/templates/deployment.yaml",
"chars": 4711,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: {{ include \"llama-agents.controlplane.name\" . }}\n namespace: {{ "
},
{
"path": "charts/llama-agents/templates/networkpolicy.yaml",
"chars": 1856,
"preview": "{{- if .Values.networkPolicy.enabled }}\n# Egress restrictions for app pods. Lives in the apps namespace (NetworkPolicy\n#"
},
{
"path": "charts/llama-agents/templates/operator-deployment-template.yaml",
"chars": 530,
"preview": "{{- if and .Values.operator.enabled .Values.operator.llamaDeploymentTemplate.enabled }}\napiVersion: deploy.llamaindex.ai"
},
{
"path": "charts/llama-agents/templates/operator-deployment.yaml",
"chars": 4823,
"preview": "{{- if .Values.operator.enabled }}\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: {{ include \"llama-agents.opera"
},
{
"path": "charts/llama-agents/templates/operator-hpa.yaml",
"chars": 1324,
"preview": "{{- if and .Values.operator.enabled .Values.operator.hpa.enabled }}\napiVersion: autoscaling/v2\nkind: HorizontalPodAutosc"
},
{
"path": "charts/llama-agents/templates/rbac.yaml",
"chars": 3554,
"preview": "{{- if .Values.rbac.create }}\n{{- $appsNs := include \"llama-agents.apps.namespace\" . -}}\n{{- $releaseNs := .Release.Name"
},
{
"path": "charts/llama-agents/templates/s3proxy-configmap.yaml",
"chars": 318,
"preview": "{{- if .Values.s3proxy.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: {{ include \"llama-agents.s3proxy.name"
},
{
"path": "charts/llama-agents/templates/s3proxy-secret.yaml",
"chars": 381,
"preview": "{{- if and .Values.s3proxy.enabled (not .Values.s3proxy.secret) .Values.s3proxy.config }}\napiVersion: v1\nkind: Secret\nme"
},
{
"path": "charts/llama-agents/templates/service.yaml",
"chars": 1549,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: {{ include \"llama-agents.service.name\" . }}\n namespace: {{ .Release.Name"
},
{
"path": "charts/llama-agents/templates/serviceaccount.yaml",
"chars": 302,
"preview": "{{- if .Values.serviceAccount.create }}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: {{ include \"llama-agents.s"
},
{
"path": "charts/llama-agents/templates/servicemonitor.yaml",
"chars": 2577,
"preview": "{{- if .Values.metrics.enabled }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: {{ include"
},
{
"path": "charts/llama-agents/tests/apps_namespace_test.yaml",
"chars": 5913,
"preview": "suite: apps.namespace — single- and split-namespace modes\ntemplates:\n - templates/operator-deployment.yaml\n - template"
},
{
"path": "charts/llama-agents/tests/object_storage_test.yaml",
"chars": 8917,
"preview": "suite: Control plane object storage configuration\ntemplates:\n - templates/deployment.yaml\n - templates/controlplane-s3"
},
{
"path": "charts/llama-agents/tests/operator_image_tag_env_test.yaml",
"chars": 630,
"preview": "suite: Operator env - LLAMA_DEPLOY_IMAGE_TAG\ntemplates:\n - templates/operator-deployment.yaml\ntests:\n - it: defaults L"
},
{
"path": "charts/llama-agents/tests/s3proxy_test.yaml",
"chars": 9819,
"preview": "suite: s3proxy sidecar configuration\ntemplates:\n - templates/deployment.yaml\n - templates/s3proxy-configmap.yaml\n - t"
},
{
"path": "charts/llama-agents/tests/servicemonitor_test.yaml",
"chars": 730,
"preview": "suite: ServiceMonitor metadata labels\ntemplates:\n - templates/servicemonitor.yaml\ntests:\n - it: puts additionalMonitor"
},
{
"path": "charts/llama-agents/values.yaml",
"chars": 11935,
"preview": "metrics:\n # -- Enable Prometheus ServiceMonitors\n # @section -- Metrics\n enabled: false\n # -- Scrape interval for Se"
},
{
"path": "charts/llama-agents-crds/.helmignore",
"chars": 191,
"preview": "# Patterns to ignore when building packages.\n.DS_Store\n*.swp\n*.bak\n*.tmp\n*~\n.git\n.gitignore\n\n# Node modules symlink pull"
},
{
"path": "charts/llama-agents-crds/CHANGELOG.md",
"chars": 149,
"preview": "# llama-agents-crds\n\n## 0.7.2\n\n### Patch Changes\n\n- Updated dependencies [58e7942]\n- Updated dependencies [ea577a1]\n - "
},
{
"path": "charts/llama-agents-crds/Chart.yaml",
"chars": 172,
"preview": "apiVersion: v2\nname: llama-agents-crds\ndescription: CRDs for llama-agents (LlamaDeployment, LlamaDeploymentTemplate)\ntyp"
},
{
"path": "charts/llama-agents-crds/README.md",
"chars": 1186,
"preview": "# llama-agents-crds\n\nHelm chart that manages the CRD lifecycle for llama-agents (`LlamaDeployment`, `LlamaDeploymentTemp"
},
{
"path": "charts/llama-agents-crds/files/deploy.llamaindex.ai_llamadeployments.yaml",
"chars": 9436,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n controller-gen.kubeb"
},
{
"path": "charts/llama-agents-crds/files/deploy.llamaindex.ai_llamadeploymenttemplates.yaml",
"chars": 2608,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n controller-gen.kubeb"
},
{
"path": "charts/llama-agents-crds/package.json",
"chars": 140,
"preview": "{\n \"name\": \"llama-agents-crds\",\n \"version\": \"0.7.2\",\n \"dependencies\": {},\n \"helm\": {\n \"registry\": \"oci://docker.i"
},
{
"path": "charts/llama-agents-crds/templates/crds.yaml",
"chars": 350,
"preview": "{{- range $path, $_ := .Files.Glob \"files/*.yaml\" }}\n{{- $crd := $.Files.Get $path | fromYaml }}\n{{- if $.Values.keep }}"
},
{
"path": "charts/llama-agents-crds/values.yaml",
"chars": 154,
"preview": "# When true, adds helm.sh/resource-policy: keep annotation to CRDs\n# so that helm uninstall does not delete them (and ca"
},
{
"path": "docker/Dockerfile",
"chars": 4330,
"preview": "# Base stage with common dependencies\nFROM python:3.12-slim AS base\n\nCOPY --from=ghcr.io/astral-sh/uv:0.7.20 /uv /uvx /b"
},
{
"path": "docker/Dockerfile.mitm-test",
"chars": 1246,
"preview": "# Container to recreate corporate MITM proxy scenario for testing native TLS mode\n# Simulates an environment where:\n# - "
},
{
"path": "docker/mitm-proxy-test/entrypoint.sh",
"chars": 1277,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\n# Generate a local CA if not present and install it into the OS trust store\n# mit"
},
{
"path": "docker/operator.Dockerfile",
"chars": 623,
"preview": "# Build the operator binary\nFROM golang:1.24 AS builder\nARG TARGETOS\nARG TARGETARCH\n\nWORKDIR /workspace\n\n# Copy the Go M"
},
{
"path": "docs/api_docs/.gitignore",
"chars": 6,
"preview": "/site\n"
},
{
"path": "docs/api_docs/README.md",
"chars": 1031,
"preview": "# LlamaDeploy Documentation\n\nThis repository contains the documentation for LlamaIndex Workflows, built using MkDocs wit"
},
{
"path": "docs/api_docs/docs/api_reference/_static/css/algolia.css",
"chars": 16447,
"preview": "/**\n * Skipped minification because the original files appears to be already minified.\n * Original file: /npm/@docsearch"
},
{
"path": "docs/api_docs/docs/api_reference/_static/css/custom.css",
"chars": 187,
"preview": "#my-component-root *,\n#headlessui-portal-root * {\n z-index: 1000000000000;\n font-size: 100%;\n}\n\ntextarea {\n border: 0"
},
{
"path": "docs/api_docs/docs/api_reference/_static/js/algolia.js",
"chars": 219842,
"preview": "/**\n * Skipped minification because the original files appears to be already minified.\n * Original file: /npm/@docsearch"
},
{
"path": "docs/api_docs/docs/api_reference/_static/js/leadfeeder.js",
"chars": 526,
"preview": "(function (ss, ex) {\n window.ldfdr =\n window.ldfdr ||\n function () {\n (ldfdr._q = ldfdr._q || []).push([].sl"
},
{
"path": "docs/api_docs/docs/api_reference/context.md",
"chars": 594,
"preview": "::: workflows.context.Context\n options:\n show_root_heading: true\n show_root_full_path: false\n members:"
},
{
"path": "docs/api_docs/docs/api_reference/decorators.md",
"chars": 90,
"preview": "::: workflows.decorators\n options:\n members:\n - step\n - catch_error\n"
},
{
"path": "docs/api_docs/docs/api_reference/errors.md",
"chars": 21,
"preview": "::: workflows.errors\n"
},
{
"path": "docs/api_docs/docs/api_reference/events.md",
"chars": 285,
"preview": "::: workflows.events\n options:\n members:\n - Event\n - InputRequiredEvent\n - HumanResponseEve"
},
{
"path": "docs/api_docs/docs/api_reference/handler.md",
"chars": 22,
"preview": "::: workflows.handler\n"
},
{
"path": "docs/api_docs/docs/api_reference/index.md",
"chars": 1496,
"preview": "# Workflows API reference\n\n\nFor conceptual guides, patterns, and end-to-end examples, see the main [Agent Workflows docu"
},
{
"path": "docs/api_docs/docs/api_reference/resource.md",
"chars": 70,
"preview": "::: workflows.resource.Resource\n::: workflows.resource.ResourceConfig\n"
},
{
"path": "docs/api_docs/docs/api_reference/retry_policy.md",
"chars": 3069,
"preview": "# Retry Policy\n\nThe retry API is built from three families of callables modeled after\n[tenacity](https://tenacity.readth"
},
{
"path": "docs/api_docs/docs/api_reference/workflow.md",
"chars": 107,
"preview": "::: workflows.workflow\n options:\n members:\n - Workflow\n filters: [\"!^_\", \"^__init__$\"]\n"
},
{
"path": "docs/api_docs/docs/api_reference/workflow_server/client.md",
"chars": 331,
"preview": "::: llama_agents.client.WorkflowClient\n options:\n show_root_heading: true\n show_root_full_path: false\n "
},
{
"path": "docs/api_docs/docs/api_reference/workflow_server/models.md",
"chars": 778,
"preview": "::: llama_agents.client.EventEnvelopeWithMetadata\n options:\n show_root_heading: true\n show_root_full_path: "
},
{
"path": "docs/api_docs/docs/api_reference/workflow_server/server.md",
"chars": 149,
"preview": "::: llama_agents.server.WorkflowServer\n options:\n show_root_heading: true\n show_root_full_path: false\n "
},
{
"path": "docs/api_docs/docs/css/algolia.css",
"chars": 16661,
"preview": "/**\n * Skipped minification because the original files appears to be already minified.\n * Original file: /npm/@docsearch"
},
{
"path": "docs/api_docs/docs/css/custom.css",
"chars": 187,
"preview": "#my-component-root *,\n#headlessui-portal-root * {\n z-index: 1000000000000;\n font-size: 100%;\n}\n\ntextarea {\n border: 0"
},
{
"path": "docs/api_docs/docs/css/style.css",
"chars": 1060,
"preview": ".md-container .jp-Cell-outputWrapper .jp-OutputPrompt.jp-OutputArea-prompt,\n.md-container .jp-Cell-inputWrapper .jp-Inpu"
},
{
"path": "docs/api_docs/docs/javascript/algolia.js",
"chars": 219785,
"preview": "/**\n * Skipped minification because the original files appears to be already minified.\n * Original file: /npm/@docsearch"
},
{
"path": "docs/api_docs/mkdocs.yml",
"chars": 2311,
"preview": "docs_dir: docs/api_reference\nsite_url: https://developers.llamaindex.ai/python/workflows-api-reference/\nextra:\n homepag"
},
{
"path": "docs/api_docs/overrides/main.html",
"chars": 74,
"preview": "{% extends \"base.html\" %} {% block header %} {{ super() }} {% endblock %}\n"
},
{
"path": "docs/api_docs/overrides/partials/copyright.html",
"chars": 65,
"preview": "<readthedocs-flyout position=\"bottom-left\"></readthedocs-flyout>\n"
},
{
"path": "docs/api_docs/overrides/partials/search.html",
"chars": 113,
"preview": "{% import \"partials/language.html\" as lang with context %}\n\n<!-- Search interface -->\n<div id=\"docsearch\"></div>\n"
},
{
"path": "docs/api_docs/pyproject.toml",
"chars": 779,
"preview": "[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[project]\nname = \"docs\"\nversion = \"0.1.0\"\ndes"
},
{
"path": "docs/src/components/Header.astro",
"chars": 2788,
"preview": "---\nimport config from 'virtual:starlight/user-config';\n\nimport LanguageSelect from 'virtual:starlight/components/Langua"
},
{
"path": "docs/src/components/HomepageFeatures/index.js",
"chars": 1721,
"preview": "import clsx from 'clsx';\nimport Heading from '@theme/Heading';\nimport styles from './styles.module.css';\n\nconst FeatureL"
},
{
"path": "docs/src/components/HomepageFeatures/styles.module.css",
"chars": 138,
"preview": ".features {\n display: flex;\n align-items: center;\n padding: 2rem 0;\n width: 100%;\n}\n\n.featureSvg {\n height: 200px;\n"
},
{
"path": "docs/src/components/ProtectedContent.jsx",
"chars": 3808,
"preview": "import React, { useState, useEffect } from 'react';\n\nconst SELF_HOSTING_PASSWORD = 'llamacloud-self-host-2025';\nconst ST"
},
{
"path": "docs/src/components/ProtectedTabs.jsx",
"chars": 2787,
"preview": "const ProtectedTabs = ({ children }) => {\n return (\n <div className=\"tabs-container\">\n <style jsx>{`\n .t"
},
{
"path": "docs/src/components/SiteTitle.astro",
"chars": 1373,
"preview": "---\nimport { logos } from 'virtual:starlight/user-images';\nimport config from 'virtual:starlight/user-config';\nconst { s"
},
{
"path": "docs/src/components/llamaExtract.js",
"chars": 1251,
"preview": "import React from 'react';\n\nexport const LEPython = ({children}) => (\n <>\n <span><small>In Python:</small></span>\n "
},
{
"path": "docs/src/components/llamaParse.js",
"chars": 1862,
"preview": "import React from 'react';\n\nexport const LPPython = ({children}) => (\n <>\n <span><small>In Python:</small></span>\n "
},
{
"path": "docs/src/components/mdx_components.jsx",
"chars": 946,
"preview": "import Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport { Children, cloneElement } from 'react';\n\n\n"
},
{
"path": "docs/src/content/docs/llamaagents/_meta.yml",
"chars": 55,
"preview": "label: Agents\ncollapsed: true\nhidden: false\norder: 5.5\n"
},
{
"path": "docs/src/content/docs/llamaagents/cloud/_meta.yml",
"chars": 52,
"preview": "label: Cloud\ncollapsed: true\nhidden: false\norder: 2\n"
},
{
"path": "docs/src/content/docs/llamaagents/cloud/agent-data-overview.md",
"chars": 5428,
"preview": "---\ntitle: Agent Data\nsidebar:\n order: 30\n---\n\n:::caution\nCloud deployments of LlamaAgents are now in beta preview and "
},
{
"path": "docs/src/content/docs/llamaagents/cloud/builder.md",
"chars": 6574,
"preview": "---\ntitle: Agent Builder\nsidebar:\n order: 10\n---\n\nAgent Builder is a natural language interface for creating document w"
},
{
"path": "docs/src/content/docs/llamaagents/cloud/click-to-deploy.md",
"chars": 4584,
"preview": "---\ntitle: Click-to-Deploy from LlamaCloud\nsidebar:\n order: 20\n---\n\n:::caution\nCloud deployments of LlamaAgents are now"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl/_meta.yml",
"chars": 55,
"preview": "label: llamactl\ncollapsed: true\nhidden: false\norder: 3\n"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl/agent-templates.md",
"chars": 4008,
"preview": "---\ntitle: Agent Templates\nsidebar:\n order: 2\n---\n\nWe provide a set of document agent templates, both as full-stack app"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl/cd-with-github-actions.md",
"chars": 2600,
"preview": "---\ntitle: Continuous Deployment with GitHub Actions\nsidebar:\n order: 19\n---\n:::caution\nCloud deployments of LlamaAgent"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl/configuration-reference.md",
"chars": 4717,
"preview": "---\ntitle: Deployment Config Reference\nsidebar:\n order: 18\n---\n:::caution\nCloud deployments of LlamaAgents are now in b"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl/getting-started.md",
"chars": 6965,
"preview": "---\ntitle: Getting Started\nsidebar:\n order: 1\n---\n:::caution\nCloud deployments of LlamaAgents are now in beta preview a"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl/ui-build.md",
"chars": 7095,
"preview": "---\ntitle: Configuring a UI\nsidebar:\n order: 10\n---\n:::caution\nCloud deployments of LlamaAgents are now in beta preview"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl/ui-hooks.md",
"chars": 5463,
"preview": "---\ntitle: Workflow React Hooks\nsidebar:\n order: 15\n---\n\n:::caution\nCloud deployments of LlamaAgents are now in beta pr"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl/workflow-api.md",
"chars": 3353,
"preview": "---\ntitle: Serving your Workflows\nsidebar:\n order: 5\n---\n:::caution\nCloud deployments of LlamaAgents are now in beta pr"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/_meta.yml",
"chars": 55,
"preview": "label: 'llamactl Reference'\norder: 100\ncollapsed: true\n"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-auth.md",
"chars": 3998,
"preview": "---\ntitle: auth\nsidebar:\n order: 104\n---\nAuthenticate and manage profiles for the current environment. Profiles store y"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-config.md",
"chars": 277,
"preview": "---\ntitle: config\nsidebar:\n order: 108\n---\nShow local `llamactl` configuration.\n\n## Usage\n\n```bash\nllamactl config [-o "
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-deployments.md",
"chars": 10041,
"preview": "---\ntitle: deployments\nsidebar:\n order: 103\n---\nDeploy your app to LlamaCloud and manage existing deployments.\n\nDeploym"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-environments.md",
"chars": 1896,
"preview": "---\ntitle: environments\nsidebar:\n order: 105\n---\nManage environments (distinct control plane API URLs). Environments de"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-init.md",
"chars": 1675,
"preview": "---\ntitle: init\nsidebar:\n order: 101\n---\nCreate a new app from a starter template, or update an existing app to the lat"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-organizations.md",
"chars": 349,
"preview": "---\ntitle: organizations\nsidebar:\n order: 107\n---\nList organizations available to the current profile.\n\n## Usage\n\n```ba"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-pkg.md",
"chars": 2412,
"preview": "---\ntitle: pkg\nsidebar:\n order: 106\n---\n\n:::caution\nThis command is currently limited to python **agent workflows**.\nFr"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-projects.md",
"chars": 437,
"preview": "---\ntitle: projects\nsidebar:\n order: 106\n---\nList and select projects for the current profile.\n\n## Usage\n\n```bash\nllama"
},
{
"path": "docs/src/content/docs/llamaagents/llamactl-reference/commands-serve.md",
"chars": 2383,
"preview": "---\ntitle: serve\nsidebar:\n order: 102\n---\nServe your app locally for development and testing. Reads configuration from "
},
{
"path": "docs/src/content/docs/llamaagents/overview.md",
"chars": 4215,
"preview": "---\ntitle: Overview\nsidebar:\n order: 1\n---\n\n## LlamaAgents at a Glance\n\nLlamaAgents is the most advanced way to build *"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/_meta.yml",
"chars": 62,
"preview": "label: Agent Workflows\ncollapsed: true\nhidden: false\norder: 1\n"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/async_workflows.md",
"chars": 6641,
"preview": "---\nsidebar:\n order: 15\ntitle: Writing async workflows\n---\n\nWorkflows run on Python's `asyncio` event loop. The runtime"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/branches_and_loops.md",
"chars": 3252,
"preview": "---\nsidebar:\n order: 2\ntitle: Branches and loops\n---\n\nA key feature of Workflows is their enablement of branching and l"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/client.md",
"chars": 5808,
"preview": "---\nsidebar:\n order: 13\ntitle: Python Client\n---\n\nThe `WorkflowClient` class provides a Python interface for interactin"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/concurrent_execution.md",
"chars": 6008,
"preview": "---\nsidebar:\n order: 5\ntitle: Concurrent execution of workflows\n---\n\nIn addition to looping, branching, and streaming, "
},
{
"path": "docs/src/content/docs/llamaagents/workflows/customizing_entry_exit_points.md",
"chars": 4426,
"preview": "---\nsidebar:\n order: 7\ntitle: Customizing entry and exit points\n---\n\nMost of the times, relying on the default entry an"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/dbos.md",
"chars": 10689,
"preview": "---\nsidebar:\n order: 14\ntitle: DBOS Durable Execution\n---\n\nThe [durable workflows](/python/llamaagents/workflows/durabl"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/deployment.md",
"chars": 13210,
"preview": "---\nsidebar:\n order: 12\ntitle: Run Your Workflow as a Server\n---\n\nThe `workflows` library includes a `WorkflowServer` c"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/drawing.md",
"chars": 1572,
"preview": "---\nsidebar:\n order: 8\ntitle: Drawing a Workflow\n---\n\nWorkflows can be visualized, using the power of type annotations "
},
{
"path": "docs/src/content/docs/llamaagents/workflows/durable_workflows.md",
"chars": 5124,
"preview": "---\nsidebar:\n order: 13\ntitle: Writing durable workflows\n---\n\nWorkflows are ephemeral by default, meaning that once the"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/human_in_the_loop.md",
"chars": 3380,
"preview": "---\nsidebar:\n order: 6\ntitle: Human in the Loop\n---\n\nSince workflows are so flexible, there are many possible ways to i"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/index.md",
"chars": 10701,
"preview": "---\nsidebar:\n order: 1\ntitle: Introduction\n---\n\n## What is a workflow?\n\nA workflow is an event-driven, step-based way t"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/managing_state.md",
"chars": 3260,
"preview": "---\nsidebar:\n order: 3\ntitle: Managing State\n---\n\nBy default, workflows automatically initialize and untyped state stor"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/observability.md",
"chars": 3556,
"preview": "---\nsidebar:\n order: 15\ntitle: Observability\n---\n\nObservability is key for debugging workflows. Beyond just adding `pri"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/resources.md",
"chars": 5870,
"preview": "---\nsidebar:\n order: 9\ntitle: Resource Objects\n---\n\nResources are external dependencies you can inject into the steps o"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/retry_steps.md",
"chars": 9792,
"preview": "---\nsidebar:\n order: 10\ntitle: Error handling\n---\n\nA step that fails its execution might result in the failure of the e"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/streaming.mdx",
"chars": 4516,
"preview": "---\nsidebar:\n order: 4\ntitle: Streaming events\n---\n\nWorkflows can be complex -- they are designed to handle complex, br"
},
{
"path": "docs/src/content/docs/llamaagents/workflows/unbound_functions.md",
"chars": 1290,
"preview": "---\nsidebar:\n order: 11\ntitle: Workflows from unbound functions\n---\n\nThroughout these docs, we have been showing workfl"
},
{
"path": "docs/src/content.config.ts",
"chars": 501,
"preview": "import { defineCollection } from 'astro:content';\nimport { docsLoader } from '@astrojs/starlight/loaders';\nimport { docs"
},
{
"path": "docs/src/pages/index.astro",
"chars": 64,
"preview": "---\nreturn Astro.redirect('/python/llamaagents/overview/');\n---\n"
},
{
"path": "docs.config.mjs",
"chars": 513,
"preview": "export default {\n section: \"llama-index-workflows\",\n label: \"LlamaAgents\",\n content: [\n { src: \"./docs/src/content"
},
{
"path": "examples/README.md",
"chars": 2483,
"preview": "# LlamaAgents Examples\n\nA collection of runnable examples showing how to build, serve, and deploy agent workflows with `"
},
{
"path": "examples/agent.ipynb",
"chars": 16770,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Workflow for a Function Calling A"
},
{
"path": "examples/client/README.md",
"chars": 766,
"preview": "# Client Examples\n\nCall a running `WorkflowServer` from Python with `llama_agents.client.WorkflowClient`. Each subfolder"
},
{
"path": "examples/client/base/workflow_client.py",
"chars": 1245,
"preview": "import asyncio\nfrom typing import Literal\n\nfrom llama_agents.client import WorkflowClient\nfrom pydantic import Field\nfro"
},
{
"path": "examples/client/base/workflow_server.py",
"chars": 1289,
"preview": "from typing import Literal\n\nfrom llama_agents.server import WorkflowServer\nfrom pydantic import Field\nfrom workflows imp"
},
{
"path": "examples/client/human_in_the_loop/workflow_client_hitl.py",
"chars": 1289,
"preview": "import asyncio\n\nfrom llama_agents.client import WorkflowClient\nfrom workflows.events import (\n HumanResponseEvent,\n "
},
{
"path": "examples/client/human_in_the_loop/workflow_server_hitl.py",
"chars": 1099,
"preview": "from llama_agents.server import WorkflowServer\nfrom workflows import Workflow, step\nfrom workflows.context import Contex"
},
{
"path": "examples/dbos/.gitignore",
"chars": 30,
"preview": ".last_handler_id\n.last_run_id\n"
},
{
"path": "examples/dbos/README.md",
"chars": 1536,
"preview": "# DBOS Durability Examples\n\nExamples of running durable workflows backed by [DBOS](https://github.com/dbos-inc/dbos-tran"
},
{
"path": "examples/dbos/_replica.py",
"chars": 2679,
"preview": "#!/usr/bin/env python3\n\"\"\"\nMulti-Replica Server\n\nSingle replica server that can be run standalone.\n\nUsage:\n python ex"
},
{
"path": "examples/dbos/docker-compose.yml",
"chars": 188,
"preview": "services:\n postgres:\n image: postgres:16\n environment:\n POSTGRES_DB: workflows\n POSTGRES_USER: workflow"
},
{
"path": "examples/dbos/durable_workflow.py",
"chars": 3480,
"preview": "#!/usr/bin/env python3\n\"\"\"\nDBOS Counter Example\n\nSimple looping workflow that increments a counter until it reaches 20.\n"
},
{
"path": "examples/dbos/idle_release_demo.py",
"chars": 3118,
"preview": "\"\"\"\nIdle release demo — confirms INFO logging when a workflow idles and resumes.\n\nStarts a server with a short idle_time"
},
{
"path": "examples/dbos/server_quickstart.py",
"chars": 3199,
"preview": "\"\"\"\nQuick-start: durable workflow server with DBOS.\n\nRun with:\n uv run examples/dbos/server_quickstart.py\n\nBy default"
},
{
"path": "examples/dbos/server_replicas.py",
"chars": 7957,
"preview": "#!/usr/bin/env python3\n\"\"\"\nMulti-Replica Demo\n==================\n\nDemonstrates durable workflow execution across multipl"
},
{
"path": "examples/docker/Dockerfile",
"chars": 335,
"preview": "FROM python:3.13-alpine3.22\n\nCOPY . /opt/app\nWORKDIR /opt/app\n\n# Install system deps\nRUN apk add --no-cache git\n\n# Insta"
},
{
"path": "examples/docker/README.md",
"chars": 650,
"preview": "# Docker Example\n\nA minimal container image that serves a workflow with `WorkflowServer`.\n\n## Files\n\n| File | Purpose |\n"
},
{
"path": "examples/docker/app.py",
"chars": 875,
"preview": "import asyncio\n\nfrom llama_agents.server import WorkflowServer\nfrom workflows import Workflow, step\nfrom workflows.conte"
},
{
"path": "examples/docker/requirements.txt",
"chars": 30,
"preview": "llama-index-workflows[server]\n"
},
{
"path": "examples/document_agents/finance_triage_agent.ipynb",
"chars": 12308,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"c9bd2f93\"\n },\n \"source\": [\n \"# Finance "
},
{
"path": "examples/document_processing.ipynb",
"chars": 41381,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Iterative Extraction with Workflo"
},
{
"path": "examples/durable_workflows.ipynb",
"chars": 7226,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"7bHdUvTD1MGa\"\n },\n \"source\": [\n \"Workfl"
},
{
"path": "examples/eval_driven_prompt_refinement.ipynb",
"chars": 25377,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Eval-Driven Promp"
},
{
"path": "examples/feature_walkthrough.ipynb",
"chars": 269587,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Workflows Feature Walkthrough\\n\","
},
{
"path": "examples/k8s-otel/Dockerfile",
"chars": 1380,
"preview": "# syntax=docker/dockerfile:1\nFROM python:3.13-slim\n\nCOPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv\n\nWORKD"
},
{
"path": "examples/k8s-otel/README.md",
"chars": 3854,
"preview": "# K8s + OpenTelemetry Example\n\nA self-contained example deploying LlamaIndex Workflows on Kubernetes with distributed tr"
},
{
"path": "examples/k8s-otel/Tiltfile",
"chars": 1003,
"preview": "allow_k8s_contexts('kind-llama-k8s-otel')\n\nk8s_yaml(kustomize('./k8s'))\n\ndocker_build(\n 'k8s-otel-app',\n context='"
},
{
"path": "examples/k8s-otel/app.py",
"chars": 11323,
"preview": "\"\"\"\nK8s OTEL Example — Counter + Greeter workflows with DBOS, OpenTelemetry, and structlog.\n\nServes via FastAPI with the"
},
{
"path": "examples/k8s-otel/k8s/app.yaml",
"chars": 1748,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: app\n namespace: llama-k8s-otel\nspec:\n selector:\n app: workflow-app\n "
},
{
"path": "examples/k8s-otel/k8s/jaeger.yaml",
"chars": 733,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: jaeger\n namespace: llama-k8s-otel\nspec:\n selector:\n app: jaeger\n po"
},
{
"path": "examples/k8s-otel/k8s/kustomization.yaml",
"chars": 182,
"preview": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n - namespace.yaml\n - postgres.yaml\n - app."
},
{
"path": "examples/k8s-otel/k8s/namespace.yaml",
"chars": 64,
"preview": "apiVersion: v1\nkind: Namespace\nmetadata:\n name: llama-k8s-otel\n"
},
{
"path": "examples/k8s-otel/k8s/otel-collector.yaml",
"chars": 1387,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: otel-collector-config\n namespace: llama-k8s-otel\ndata:\n config.yaml: "
},
{
"path": "examples/k8s-otel/k8s/phoenix.yaml",
"chars": 849,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: phoenix\n namespace: llama-k8s-otel\nspec:\n selector:\n app: phoenix\n "
},
{
"path": "examples/k8s-otel/k8s/postgres.yaml",
"chars": 1499,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: postgres-init\n namespace: llama-k8s-otel\ndata:\n create-phoenix-db.sql"
},
{
"path": "examples/k8s-otel/kind-config.yaml",
"chars": 70,
"preview": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nname: llama-k8s-otel\n"
},
{
"path": "examples/k8s-otel/pyproject.toml",
"chars": 340,
"preview": "[project]\nname = \"k8s-otel-example\"\nversion = \"0.0.0\"\nrequires-python = \">=3.10\"\ndependencies = [\n \"llama-agents-dbos\","
},
{
"path": "examples/observability/README.md",
"chars": 986,
"preview": "# Observability Examples\n\nTrace and inspect workflow runs using the built-in context logger and third-party observabilit"
},
{
"path": "examples/observability/workflow_context_logging.ipynb",
"chars": 8782,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"29188397\",\n \"metadata\": {},\n \"source\": [\n \"Llama Index Di"
},
{
"path": "examples/observability/workflows_observability_pt1.ipynb",
"chars": 41310,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"sunqHvPG4el9\"\n },\n \"source\": [\n \"# Work"
},
{
"path": "examples/observability/workflows_observability_pt2.ipynb",
"chars": 572867,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"Vx09YKJjycji\"\n },\n \"source\": [\n \"# Work"
},
{
"path": "examples/observability/workflows_observablitiy_arize_phoenix.ipynb",
"chars": 429683,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Tracing Workflows with Arize Phoe"
},
{
"path": "examples/observability/workflows_observablitiy_langfuse.ipynb",
"chars": 362932,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Tracing Workflows with Langfuse\\n"
}
]
// ... and 580 more files (download for full content)
About this extraction
This page contains the full source code of the run-llama/workflows-py GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 780 files (6.7 MB), approximately 1.8M tokens, and a symbol index with 6613 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.