@@ -23,13 +23,14 @@ import com.google.adk.kt.serialization.adkJson
2323import com.google.adk.kt.sessions.SessionService
2424import com.google.adk.kt.telemetry.TelemetryConfig
2525import com.google.adk.kt.webserver.AdkWebServer.StatusAwareLogger
26+ import com.google.adk.kt.webserver.dev.routes.debugRoutes
27+ import com.google.adk.kt.webserver.dev.routes.evalRoutes
28+ import com.google.adk.kt.webserver.dev.routes.graphRoutes
2629import com.google.adk.kt.webserver.loaders.AgentLoader
2730import com.google.adk.kt.webserver.models.VersionInfo
2831import com.google.adk.kt.webserver.routes.appRoutes
2932import com.google.adk.kt.webserver.routes.artifactRoutes
30- import com.google.adk.kt.webserver.routes.debugRoutes
31- import com.google.adk.kt.webserver.routes.evalRoutes
32- import com.google.adk.kt.webserver.routes.graphRoutes
33+ import com.google.adk.kt.webserver.routes.isWebUiEnabled
3334import com.google.adk.kt.webserver.routes.runRoutes
3435import com.google.adk.kt.webserver.routes.sessionRoutes
3536import com.google.adk.kt.webserver.routes.staticRoutes
@@ -57,9 +58,12 @@ import org.slf4j.event.Level
5758 * Embedded Ktor server exposing the ADK dev/web API.
5859 *
5960 * [start] and [stop] are safe to call from different threads; a [stop] arriving while [start] is
60- * still binding aborts it. A failed [start] leaves the engine recorded, so call [stop] before
61+ * still binding aborts it, and a failed [start] leaves the engine recorded, so call [stop] before
6162 * retrying.
6263 *
64+ * Set `adk.web.ui.enabled` to false, as a system property or in the application config, to leave
65+ * the Development UI unmounted.
66+ *
6367 * @property captureMessageContent When true, the server records prompt/response content into
6468 * telemetry spans so the Dev UI trace view can display it. This may capture PII and increase span
6569 * size, so it defaults to false; enable it only for local development.
@@ -165,6 +169,9 @@ fun Application.adkModule(
165169 )
166170 }
167171
172+ // Hoisted because the Application receiver is not implicitly available inside `routing`.
173+ val webUiEnabled = isWebUiEnabled(default = true )
174+
168175 routing {
169176 get(" /health" ) { call.respond(mapOf (" status" to " ok" )) }
170177 get(" /version" ) {
@@ -183,6 +190,8 @@ fun Application.adkModule(
183190 graphRoutes(agentLoader, sessionService)
184191 runRoutes(agentLoader, sessionService, artifactService, plugins)
185192 sessionRoutes(sessionService)
186- staticRoutes(this @adkModule)
193+ if (webUiEnabled) {
194+ staticRoutes(this @adkModule)
195+ }
187196 }
188197}
0 commit comments