# Prompt Resources And Context `pydantic-acp` supports ACP prompt content beyond plain text. That matters most in editor and coding-agent integrations where the client wants to attach: - selected file ranges - branch diffs - file references - directory references - image inputs - audio inputs - embedded text or binary resources The adapter treats these as prompt input, not as hidden tool calls. ## What The Adapter Supports `pydantic-acp` currently accepts these ACP prompt block families: - `TextContentBlock` - `ResourceContentBlock` - `EmbeddedResourceContentBlock` - `ImageContentBlock` - `AudioContentBlock` Execution behavior is intentionally simple: - plain text stays plain text - resource links stay references - embedded text resources become explicit context blocks - image and audio blocks become binary prompt parts - embedded binary resources become binary prompt parts The adapter does not turn an attached resource into an automatic tool invocation. If a client attaches a branch diff or a file selection, the model receives that diff or selection as context. The adapter does not run `git diff`, reopen the file, or fetch the resource again just because the prompt referenced it. ## Text Rules Are Just Text Prompts such as: ```text @rule write concise code ``` are treated as normal text content unless your own runtime adds additional meaning. `pydantic-acp` does not define a special ACP primitive for `@rule`. That is deliberate: - plain textual rules should survive as-is - the adapter should not invent custom runtime semantics the source agent does not actually expose ## Resource Links ACP resource links are the lightweight reference form. Typical examples: ```text [@acpkit](file:///workspace/acpkit) ``` ```text [@README.md](file:///workspace/acpkit/README.md) ``` In ACP terms this is a `ResourceContentBlock`. `pydantic-acp` behavior: - text-like links stay text links - image links become `ImageUrl` - audio links become `AudioUrl` - other typed links become `DocumentUrl` This means a client can attach a file or directory reference without embedding the whole payload. ## Embedded Text Context The higher-value path for editor integrations is embedded text context. That is how a client can attach a selected range, file snippet, or generated diff directly into the prompt so the agent does not need another round trip to inspect it. `pydantic-acp` renders embedded text resources in this form: ```text [@_hook_capability.py?symbol=wrap_run#L79:79](file:///workspace/acpkit/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/_hook_capability.py?symbol=wrap_run#L79:79) async def wrap_run( ``` This is the important contract: - the URI stays visible - the attached text stays visible - the model sees one explicit context block, not an opaque placeholder That makes selections, excerpts, and diffs reviewable and replayable. ## Zed Selections And Branch Diffs Zed-style attachments fit naturally into the embedded-text-resource path. Examples: ```text [@git-diff?base=main](zed:///agent/git-diff?base=main) diff --git a/app.py b/app.py @@ -1 +1 @@ -old +new ``` ```text [@thread_executor.py#L54:54](file:///workspace/acpkit/references/pydantic-ai-latest/pydantic_ai_slim/pydantic_ai/capabilities/thread_executor.py#L54:54) executor ``` This is useful in Zed because the editor can attach: - a branch diff - a symbol selection - a selected range - a file snippet without requiring the agent to reopen the same context through tools. The adapter preserves these as prompt context and advertises `embedded_context=True` in ACP prompt capabilities. ## Images, Audio, And Embedded Binary Resources `pydantic-acp` now also carries binary prompt input into `pydantic-ai` instead of flattening everything to placeholder text. Current behavior: - `ImageContentBlock` -> `BinaryContent` - `AudioContentBlock` -> `BinaryContent` - embedded blob resources -> `BinaryContent` That means the ACP boundary can now preserve real binary prompt input when the downstream model provider supports it. Important limit: - the adapter can carry the input faithfully - the provider still decides whether the selected model actually supports image, audio, or document-style inputs ## File And Directory References ACP does not need a separate "directory prompt primitive" for common editor workflows. A directory reference such as: ```text [@acpkit](file:///workspace/acpkit) ``` is just a resource link. Use a resource link when: - you want to point at a file or directory - you do not want to inline the full content Use an embedded text resource when: - you want the model to see exact attached text immediately - you want to include a selection, snippet, or generated diff ## What This Does Not Do This resource support is intentionally prompt-oriented. It does not: - automatically execute a command because a branch diff was attached - reopen a file because a file URI was present - infer tool calls from directory links - invent ACP semantics that do not exist in the source runtime If your agent should inspect the live workspace again, that still happens through normal tools or host-backed capabilities. Attached resources are just prompt context. ## Recommended Client Behavior For ACP clients and editor integrations: - send plain instructions as text blocks - send lightweight file or directory pointers as resource links - send selected ranges, branch diffs, or excerpts as embedded text resources - send image and audio input only when the target model path can make use of it For Zed-style integrations specifically: - use embedded text resources for branch diffs and selected ranges - keep the source URI intact - prefer attached context over forcing the model to rediscover the same content through tools ## Current Guarantees The adapter currently guarantees: - ACP prompt capabilities advertise `image`, `audio`, and `embedded_context` - text-only prompts still stay simple strings - mixed prompts become `pydantic-ai` user-content lists - embedded text context preserves the `context ref` wrapper - file and directory links survive as links - Zed branch diff and selection-style URIs are preserved That makes prompt attachments practical for editor clients without turning them into a parallel tool system.