Configuration¶
ConfPlanner is configured through src/main/resources/application.yml, Spring profiles, Maven
profiles, and .env. The per-run budget is set in code via ProcessOptions. To enable a provider
or tracing, see the how-to guides (real model,
mock mode, Zipkin tracing).
application.yml keys¶
| Key | Default | Description |
|---|---|---|
embabel.models.default-llm |
gpt-4.1-mini |
Model used by withDefaultLlm(). |
embabel.models.llms.cheapest |
gpt-4.1-nano |
Model for the cheapest role (withLlmByRole("cheapest")). |
embabel.models.llms.best |
gpt-4.1 |
Model for the best role (withLlmByRole("best")). |
embabel.agent.logging.personality |
default |
Logging personality. starwars is an alternative. |
spring.application.name |
confplanner |
Application name. |
spring.shell.interactive.enabled |
true |
Enables the interactive Embabel shell. |
spring.autoconfigure.exclude |
com.embabel.agent.autoconfigure.mcpserver.security.AgentMcpServerAutoConfiguration |
Excludes the MCP web-security auto-config so the shell boots without Spring MVC. |
Don't hard-code model names in Java; models change between Embabel releases. Route by role and edit the role→model mapping here.
Spring profiles¶
Activated with the SPRING_PROFILES_ACTIVE=<name> environment variable, e.g.
SPRING_PROFILES_ACTIVE=mock ./mvnw spring-boot:run. Do not use
-Dspring-boot.run.profiles=<name>: the Boot plugin forwards it as a program argument, which Spring
Shell tries to execute as a command and rejects with CommandNotFound.
| Profile | Sets | Effect |
|---|---|---|
mock |
Routes every LLM role to the in-JVM stub — embabel.models.default-llm: mock and llms.cheapest / llms.best: mock. (It also sets embabel.agent.platform.test.mock-mode: true, but that flag is inert at 0.5.0 — no runtime class reads it; the role overrides are the real seam.) |
Deterministic runs with no model calls and no keys. Invoke with plan, not x. |
observability |
embabel.agent.platform.observability.enabled: true, embabel.agent.platform.observability.service-name: confplanner, management.tracing.enabled: true, management.tracing.sampling.probability: 1.0, management.zipkin.tracing.endpoint: http://127.0.0.1:9411/api/v2/spans |
Exports traces to a local Zipkin collector. Pair with the observability Maven profile. |
No profile is active by default.
Providers on the classpath¶
Both provider starters (embabel-agent-starter-openai, embabel-agent-starter-anthropic) are
always on the classpath — plain pom.xml dependencies, not Maven-profile-gated. Which provider
actually resolves models is a runtime decision (the key you set), not a build-time one. So the app
boots the same way for every learner, keyed or not.
To keep the keyless build green, application.yml gives each provider's api-key a placeholder
fallback (${OPENAI_API_KEY:noop-…}); a real key from the environment or .env overrides it. A
placeholder never makes a live call succeed — for a no-key run use the mock profile.
Maven profiles¶
In pom.xml:
| Profile | Activation | Effect |
|---|---|---|
observability |
manual (-Pobservability) |
Adds embabel-agent-starter-observability + opentelemetry-exporter-zipkin. |
eval |
manual (-Peval) |
Flips Surefire to run only @Tag("eval") tests (the eval lane); the default build excludes that tag via <excludedGroups>eval</excludedGroups>. Needs a provider key or the cases self-skip. See Run the eval lane. |
Pinned versions: embabel-agent.version = 0.5.0, java.version = 21, Spring Boot parent =
3.5.13.
Environment variables (.env)¶
.env is git-ignored; copy .env.example to .env and set one provider key. .env is loaded into
the Spring Environment at startup by spring-dotenv, so a key placed there is picked up without
exporting it. Keys are only needed to run the agent against a real model — the build and tests are
green without any key.
| Variable | Description |
|---|---|
OPENAI_API_KEY |
OpenAI provider key (default provider). Read via ${OPENAI_API_KEY} in application.yml. |
ANTHROPIC_API_KEY |
Anthropic provider key. Read via ${ANTHROPIC_API_KEY} in application.yml. |
ProcessOptions budget¶
Set in ConfPlannerShell (and in the Lab 3 worksheet) on the AgentInvocation. The planner stops
early rather than exceeding the cap, and the stop is visible in the planning log
(MaxActionsEarlyTerminationPolicy).
var budget = new Budget(0.50, 20, 200_000);
var options = ProcessOptions.DEFAULT.withBudget(budget);
com.embabel.agent.core.Budget parameters, in declaration order:
| Parameter | Value | Unit | Meaning |
|---|---|---|---|
| cost | 0.50 |
USD | Maximum spend per run. |
| actions | 20 |
count | Maximum action executions per run. |
| tokens | 200_000 |
tokens | Maximum token budget per run. |