sessions
A session groups the traces of one multi-turn conversation.
$ npx -y skills add arize-ai/phoenix --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
A session groups the traces of one multi-turn conversation.
Agent definition
sessions.mdProjectSession
A session groups the traces of one multi-turn conversation.
Reaching a session
- `Project.sessions(timeRange, first, after, sort, sessionFilterCondition)` → connection of `ProjectSession`. `sessionFilterCondition` is a session filter expression; discover its bindable names via `Project.sessionFilterVocabulary` and check one with `Project.validateSessionFilterCondition`.
- `getProjectSessionById(sessionId: String!)` → `ProjectSession` — `sessionId` is the raw session string, not a global id.
Fields
- `sessionId`, `startTime`, `endTime`, `project`
- `numTraces`, `numTracesWithError`
- `firstInput { value }`, `lastOutput { value }`
- `tokenUsage { prompt completion total }` — each is a `Float`
- `costSummary { total { cost tokens } prompt { cost tokens } completion { cost tokens } }`, `costDetailSummaryEntries`
- `traceLatencyMsQuantile(probability: Float!)` — the percentile field (not `latency`)
- `traces(first, after)` — forward-only; `first` is effectively required. Summarize each turn via the trace's `rootSpan { name input { truncatedValue } output { truncatedValue } }`.
- `sessionAnnotations { name label score }`, `sessionAnnotationSummaries(filter)`
Example
One round trip: session rollups plus a per-turn summary read from each trace's root span.
query SessionDetail($id: ID!) {
node(id: $id) {
... on ProjectSession {
sessionId
numTraces
numTracesWithError
tokenUsage { total }
costSummary { total { cost tokens } }
p50: traceLatencyMsQuantile(probability: 0.5)
traces(first: 20) {
edges {
node {
traceId
latencyMs
numSpans
rootSpan {
spanId
name
statusCode
input { truncatedValue }
output { truncatedValue }
}
}
}
pageInfo { hasNextPage endCursor }
}
}
}
}Read more
ProjectSession
A session groups the traces of one multi-turn conversation.
Reaching a session
- `Project.sessions(timeRange, first, after, sort, sessionFilterCondition)` → connection of `ProjectSession`. `sessionFilterCondition` is a session filter expression; discover its bindable names via `Project.sessionFilterVocabulary` and check one with `Project.validateSessionFilterCondition`.
- `getProjectSessionById(sessionId: String!)` → `ProjectSession` — `sessionId` is the raw session string, not a global id.
Fields
- `sessionId`, `startTime`, `endTime`, `project`
- `numTraces`, `numTracesWithError`
- `firstInput { value }`, `lastOutput { value }`
- `tokenUsage { prompt completion total }` — each is a `Float`
- `costSummary { total { cost tokens } prompt { cost tokens } completion { cost tokens } }`, `costDetailSummaryEntries`
- `traceLatencyMsQuantile(probability: Float!)` — the percentile field (not `latency`)
- `traces(first, after)` — forward-only; `first` is effectively required. Summarize each turn via the trace's `rootSpan { name input { truncatedValue } output { truncatedValue } }`.
- `sessionAnnotations { name label score }`, `sessionAnnotationSummaries(filter)`
Example
One round trip: session rollups plus a per-turn summary read from each trace's root span.
query SessionDetail($id: ID!) {
node(id: $id) {
... on ProjectSession {
sessionId
numTraces
numTracesWithError
tokenUsage { total }
costSummary { total { cost tokens } }
p50: traceLatencyMsQuantile(probability: 0.5)
traces(first: 20) {
edges {
node {
traceId
latencyMs
numSpans
rootSpan {
spanId
name
statusCode
input { truncatedValue }
output { truncatedValue }
}
}
}
pageInfo { hasNextPage endCursor }
}
}
}
}Repo: arize-ai/phoenix
Other agents on phoenix.
- VENDOR
- Upstream: https://github.com/DougTrajano/pydantic-ai-skills - Original version: 0.10.1 (SHA `d1a19c8e6dbbee5e6726c8de70aadca2966fb190`) - Vendored: 2026-05-19 - License: MIT — preserved verbatim in [LICENSE](./LICENSE)
Open agent - annotations
Annotations are named labels/scores attached to spans, traces, or experiment runs by humans, code, or LLM judges.
Open agent - datasets
There is **no `getDatasetByName`** — fetch via `node(id:) { ... on Dataset { ... } }` or the `datasets(filter: DatasetFilter, sort)` connection.
Open agent - experiments
An experiment is one run of a prompt or pipeline over every example in a dataset.
Open agent - project-spans-traces
- `Project.spans(timeRange, first, after, sort: SpanSort, rootSpansOnly: Boolean, filterCondition: String)` → connection of `Span`. There is **no `traces` connection on `Project`** — use `spans(rootSpansOnly: true)` for root spans, which is usually one per trace though nothing
Open agent - prompts
There is **no `getPromptByName`** — fetch via `node(id:)` or the `prompts(filter: PromptFilter, labelIds)` connection.
Open agent

