cxas trace¶
cxas trace is the observability and debugging surface for past conversations. It composes the Conversational Agents API, Cloud Logging, GCS, and Gemini into a single, scriptable workflow so you can debug a flaky live conversation, audit an eval failure, replay a conversation against the current agent, or flag a platform bug — all from your terminal.
All cxas trace subcommands share a few flags:
| Flag | Required | Description |
|---|---|---|
--app-name | yes | Full CXAS App ID (projects/.../locations/.../apps/...). |
--app-dir | no | Path to the pulled app directory. Defaults to .. Used to read app.json (audio bucket, Cloud Logging enablement, model version) and environment.json. |
--env-file | no | Explicit path to an environment.json file (mirrors the existing cxas push --env-file flag). |
--environment | no | Named environment, resolved to <app-dir>/environment.<name>.json. |
--config | no | Path to a trace config YAML. Defaults to ./.cxas/trace.yaml, then ~/.cxas/trace.yaml, then built-in defaults. |
Subcommands¶
| Subcommand | Purpose |
|---|---|
cxas trace list | List conversations filtered by time / source / channel. |
cxas trace get <id> | Fetch a conversation and render a trace report (JSON / Markdown / text / HTML). |
cxas trace logs <id> | Fetch Cloud Logging entries correlated to a conversation. |
cxas trace audio download <id> | Download the GCS audio recording. |
cxas trace audio analyze <id> | Run configured Gemini audio metrics over the recording. |
cxas trace triage <id> | Run text-only Gemini triage prompts over the transcript. |
cxas trace replay <id> | Replay user inputs against the current agent and diff. |
cxas trace stats | Aggregate stats over recent conversations. |
cxas trace bundle <id> | Zip transcript + logs + audio + report into a single archive. |
cxas trace bug-report <id> | Flag a conversation as a platform bug; uploads bundle to a configured GCS bucket. |
cxas trace open <id> | Print (and on macOS, open) the CES Console deep link. |
Examples¶
List the 10 most recent audio conversations from the last day:
cxas trace list \
--app-name projects/p/locations/l/apps/a \
--time-filter 24h --channel AUDIO --limit 10
Build a Markdown trace report with merged Cloud Logs, downloaded audio, and Gemini audio + transcript analysis — written to a file:
cxas trace get conv-id-1 \
--app-name projects/p/locations/l/apps/a \
--format md --with-logs --with-audio --with-analysis --with-triage \
--out trace.md
Compare a deployed conversation against the current agent:
Generate a 7-day stats report grouped by source, written as Markdown:
cxas trace stats --time-filter 7d --source LIVE \
--app-name projects/p/locations/l/apps/a --out stats.md
Flag a conversation as a platform bug with reason and severity:
cxas trace bug-report conv-id-1 \
--app-name projects/p/locations/l/apps/a \
--reason "agent hallucinated the refund amount" --severity high
Configuration: ./.cxas/trace.yaml¶
cxas trace is fully configurable. Drop a trace.yaml next to your agent in ./.cxas/trace.yaml (or globally at ~/.cxas/trace.yaml) to override prompts, log filters, audio behavior, and the bug-report destination. Every field has a sensible default, so the file is optional.
audio:
bucket_override: null # leave null to use app.json's gcsBucket
uri_pattern: "{bucket}/{conversation_id}.wav"
download_dir: ./.cxas/audio
mime_type: audio/wav
cloud_logging:
default_level: WARNING
time_padding_seconds: 30
filter_template: |
severity >= "{level}"
AND timestamp >= "{start_time}" AND timestamp <= "{end_time}"
AND (jsonPayload.conversation_id="{conversation_id}"
OR labels.conversation_id="{conversation_id}")
gemini:
model: gemini-2.5-flash
# Audio analyses come from `cxas_scrapi.utils.audio_analysis.ANALYSIS_REGISTRY`
# (5 built-ins: agent_voice_consistency, no_long_pauses,
# agent_having_trouble, agent_looping, agent_cutoff). Each declares which
# files it needs (e.g. `agent-turn-*.wav` vs `full-session.wav`) and a
# default prompt. Override a prompt per-project by listing the metric here:
audio_metrics: {}
# Example override:
# agent_cutoff:
# prompt: "Custom cutoff prompt for our agent..."
triage_metrics:
hallucination: { prompt: "..." }
off_topic: { prompt: "..." }
failed_understanding: { prompt: "..." }
ui:
ces_console_base: https://ces.cloud.google.com
ccai_insights_base: https://ccai.cloud.google.com/insights
bug_report:
bucket: gs://cxas-platform-bugs
path_template: "{model_version}/{date}/{user}/{severity}/{conversation_id}/"
include: [transcript, logs, audio, gemini_analysis, environment]
App-side discovery¶
cxas trace reads the same app.json and environment.json files that cxas pull writes — no extra setup required. From app.loggingSettings:
audioRecordingConfig.gcsBucket→ audio download sourcecloudLoggingSettings.enableCloudLogging→ gates--with-logsbigqueryExportSettings→ surfaced in metadata (informational)
$env_var placeholders are resolved against the chosen environment.json — the same convention used by cxas push.