
Description
Safe resolution of ci-blob:// URIs — extract specific fields without dumping full payloads
SKILL.md
Blob Reading
ci-blob:// URIs appear in graph query results when a payload is too large to inline. This skill covers safe resolution patterns to extract only the data you need.
When to Use blob_read
Use blob_read only when you need a specific payload from a graph node. Most Cypher queries return structured metadata that is sufficient without resolving any blobs.
Do resolve a blob when:
- You need the full
inputoroutputof a specific tool call - You need the
contentof a specific assistant turn - You need a specific field that is stored as a blob URI
Do NOT resolve a blob when:
- You are counting events, listing sessions, or summarizing metadata
- The graph query already returned the structured fields you need
- You are doing broad exploration — scan metadata first, resolve only if required
Most queries don't need blobs. Always exhaust what the graph returns before resolving.
How to Resolve a Blob
Follow these four steps to safely resolve a ci-blob:// URI:
Step 1 — Identify the URI
Locate the ci-blob:// URI in the graph query result. It will appear as a string value in a node property.
Step 2 — Call blob_read
Pass the full URI to the blob_read tool:
blob_read(uri="ci-blob://session_id/key")
Step 3 — Get the file path backblob_read returns {"path": "...", "source": {"name", "url", "origin"}} on
success — a local file path where the blob content has been written, plus the
endpoint that answered (origin is source, destination, or env). The file
is temporary and exists only for this session. ALWAYS state which source a blob
was fetched from when reporting.
On failure, source is present only when an endpoint was actually chosen:
endpoint-level errors (connection_error, timeout, http_status,
decode_error, http_error, and input-validation errors like a missing/invalid
uri that occur after selection) carry error.source — cite it.
Selection/config errors before any endpoint is chosen
(ambiguous_source_selection, unknown_source, source_misconfigured,
configuration_error) have no source; report that selection failed rather
than inventing one. Call blob_read with list_sources: true to see the
connectable set before selecting one by name.
Step 4 — Read selectively
Use jq, head, or targeted shell commands to extract only the field(s) you need. Never read the full file into context.
Safe Extraction Patterns
Always check size before reading, then extract only the field you need. In the
examples below the path is the exact path string returned by blob_read
(real form: /tmp/ci-blobs/<session_id>/<key>.json) — use that returned value
verbatim; never hand-construct or guess a blob path.
Check size before reading:
ls -lh /tmp/ci-blobs/<session_id>/<key>.json
wc -c /tmp/ci-blobs/<session_id>/<key>.json
Extract a top-level field:
jq '.field_name' /tmp/ci-blobs/<session_id>/<key>.json
Check available keys (safe exploration):
jq 'keys' /tmp/ci-blobs/<session_id>/<key>.json
Extract a nested field:
jq '.response.content[0].text' /tmp/ci-blobs/<session_id>/<key>.json
Extract with a size guard (first 500 chars):
jq -r '.response.content[0].text' /tmp/ci-blobs/<session_id>/<key>.json | head -c 500
Critical Rules
- Never dump the full blob — do not
catorread_filethe entire blob path into context. A single blob can contain 100k+ tokens. - Always check the
ci-blob://prefix — only strings that start withci-blob://are blob URIs. Do not pass other strings toblob_read. - Prefer targeted extraction — use
jq '.specific_field'rather than reading the whole structure. - Always check size first — run
ls -lhorwc -con the file path before extracting content. If the file is very large, be even more selective. - File path is temporary — the path returned by
blob_readis a temporary file for this session only. Do not persist or reference it across sessions.
Blob Field Detection
Blob URIs appear as string values in graph node properties. They look like this in raw JSON:
{
"event_id": "evt_abc123",
"type": "tool_result",
"data": "ci-blob://session_abc/tool_result_payload_xyz"
}
To detect and resolve:
- Parse the node result as JSON first
- Check if the
datafield (or whichever field is relevant) starts withci-blob:// - Only then call
blob_readon that URI
Not every
datafield contains a blob. Small payloads are inlined as plain JSON — only large payloads are stored asci-blob://URIs. Always check the prefix before callingblob_read.
More skills from the amplifier-bundle-context-intelligence repository
View all 6 skillscontext-intelligence-evaluation-methodology
design evaluation metrics for tool signals
Jul 7Data AnalysisEvalsMicrosoftStatisticscontext-intelligence-graph-query
query context intelligence property graphs
Jul 7AgentsData AnalysisGraph AnalysisMicrosoftcontext-intelligence-session-navigation
navigate and extract session data
Jul 7AgentsData AnalysisMicrosoftcontext-intelligence-session-reconstruction
reconstruct local Amplifier session files
Jul 3AmplifierMetadataMicrosoftObservabilityworkflow-pattern-analysis
analyze workflow success and failure patterns
Jul 7Data AnalysisDebuggingMicrosoftWorkflow Automation
More from Microsoft
View publisherplaywright-trace
inspect Playwright trace files
playwright
Apr 6DebuggingPlaywrightTestingrushstack-best-practices
manage Rush monorepos with best practices
rushstack
Apr 6EngineeringLocal DevelopmentMicrosoftProject Management +1azure-ai-agents-persistent-dotnet
build AI agents with Azure .NET SDK
skills
Jul 3.NETAgentsAzureLLMazure-ai-anomalydetector-java
build anomaly detection applications with Java
skills
May 13AnalyticsAzureData AnalysisJava +2azure-ai-contentsafety-java
build content moderation applications with Azure AI
skills
Jul 7AI InfrastructureAzureJavaSecurityazure-ai-contentsafety-py
detect harmful content with Azure AI Content Safety
skills
Jul 18AzureComplianceLLMMicrosoft +2