a2ui-project / a2ui-project/a2ui

Unify System Instruction Generation for Text and Tool Output Modes

Open
#1,289 2 comments 0 reactions 0 assignees View on GitHub
component: agent_sdk P2 type: feature/enhancement
Dominant language
TypeScript
Stars
16.4k
Forks
1.3k
Avg merge
2d 13h
Merged PRs (30d)
134

Description

## Context

Currently, `a2ui.schema.manager.generate_system_prompt` and `send_a2ui_to_client_toolset` provide two separate paths for instructing the LLM on how to handle A2UI. This makes it difficult for developers to know exactly what is being sent in the final system instruction.

## Problem

- Developers need to set paremeters `include_schema` and `include_examples` to False to avoid conflicts with tool-based instructions, which creates ambiguity when a toolset is already providing that context.
- Appending multiple strings from different modules makes prompt tuning and debugging difficult.

## Proposed Sollution

Refactor the prompt generation logic into a unified "Skill" or configuration object.

- ~~Introduce an explicit `A2UIOutputMode` enum: TEXT (for direct schema injection) and TOOL (for tool-calling environments).~~
- ~~Simplify the API so that system instructions are generated based on the selected mode, preventing accidental double-injection of schemas or instructions.~~

After reviewing both https://github.com/google/A2UI/pull/1466 and https://github.com/google/A2UI/pull/1465 together, I want to propose a design refinement that addresses the parameter naming issue and consolidates both concerns cleanly.

- Repurpose `output_mode` enum for the output strictness level.
- Introduce a new `schema_injection_mode` enum for where and when the schema should be injected.

```python
class A2UISchemaInjectionMode(Enum):
"""Where/when the schema is injected."""
EMBEDDED = "embedded" # Schema in system prompt (upfront, one-time)
TOOL = "tool" # Schema injected per-request by toolset
NONE = "none" # No schema injection (default)

class A2UIOutputMode(Enum):
"""How the LLM should prioritize A2UI vs. text."""
A2UI_FIRST = "a2ui_first" # A2UI blocks first, minimal text after
TEXT_FIRST = "text_first" # Text and A2UI can be interleaved (default)
# Future: STRICT_A2UI, A2UI_ONLY for even stricter modes
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.