kaxil opened a new pull request, #74679:
URL: https://github.com/apache/airflow/pull/74679

   Common AI 1.0 turns the stability page into a promise. Today it lists 10 
stable features and 18 experimental ones, and several experimental rows give 
"new" or "options still settling" as the reason, which names no change anyone 
is planning. Released that way, most of what a user builds on would carry a 
"can change in a minor release" note.
   
   This moves the features whose behaviour has settled into the stable table, 
with a "what stays the same" entry for each, and drops their "Experimental" 
notes from the docs pages and docstrings:
   
   | Feature | What the stable entry promises |
   | -- | -- |
   | `@task.llm_sql` | Returns SQL without running it; with `validate_sql=True` 
the task fails unless the output is a single statement of an allowed type, with 
no write nested inside under the default types. A reviewer's edit is checked 
the same way. |
   | `@task.llm_file_analysis` | Reads the file or prefix read-only, samples 
tabular files to `sample_rows` and cuts text to `max_text_chars`; fails before 
the model call on input over the size limits, or on an image or PDF without 
`multi_modal=True`. |
   | `@task.llm_schema_compare` | Returns `SchemaCompareResult` as a dict: 
`compatible`, `summary`, and `mismatches` with a `critical`/`warning`/`info` 
severity. |
   | `@task.llm_batch` | Writes results as JSONL and returns the 
`schema_version: 1` manifest; a retry with the same `result_path` and unchanged 
inputs re-attaches to the submitted batch unless it was cancelled or failed. 
The `BatchAdapter` extension point stays experimental. |
   | `ObjectStorageToolset` | Three read-only tools, paths confined to the 
root, unreadable files reported to the model instead of failing the task. |
   | `pinned_arguments` on `HookToolset` | Pinned arguments are hidden from the 
model, passed to every allowed method, and a method that cannot take one is 
rejected when the toolset is created. |
   | The framework-neutral tool interface (`AirflowTool`, `ToolResult`, 
`ToolCallError`, `ToolProvider`, `collect_tools`, `airflow_tools()`) | The 
fields, the masking in `call()`, and the error semantics an adapter relies on. |
   
   Every row left in the experimental table now names an outside dependency 
before its own 1.0, a framework that changes often, or a specific change. Two 
of the old reasons were out of date: the amazon and google providers implement 
the managed-agent contract (`BedrockAgentCoreHook`, `AgentEngineHook`), and CI 
has run the Strands and ADK adapter tests since #73912.
   
   ## Design rationale
   
   **Why make the tool interface stable while two more adapters are in 
review?** #74026 (Claude Agent SDK) and #73962 (Anthropic tool runner) each add 
a new adapter module and change only one docstring line in `tools/__init__.py`, 
so two more frameworks fit the interface as it is. The Strands plugin and the 
ADK toolset built on it stay experimental, since they follow frameworks that 
change often.
   
   **Why not `durable=True` here?** Its stated reason is that a tool will be 
able to declare whether its result may be reused, and #74385 adds exactly that. 
It graduates in a follow-up stacked on this PR once #74385 merges, so the page 
never promises behaviour main does not have.
   
   **Why does per-tool approval stay experimental?** A task instance can pause 
for approval only once per Dag run, so an agent that needs a second approval 
later in the run fails with `ToolApprovalAlreadyRequestedError`. That is the 
normal shape of an agent loop, so it graduates together with the change that 
lifts the limit, stacked on this PR. From Airflow 3.4, core replaces a repeat 
request's details instead of keeping the first one's (#73235); 3.3 does not.
   
   **Why does `DecisionPolicy` stay experimental?** Whether the confidence gate 
keeps its shape or becomes part of a wider decision policy is still an open 
question, and graduating it now would turn either answer into a breaking change.
   
   **Why does the Agent Skills toolset stay experimental when 
`pydantic-ai-skills` is past 1.0?** Pydantic AI has since shipped on-demand 
loading of its own (pydantic/pydantic-ai#5230), and the toolset may move to it. 
That is the change its new reason names, and the skills page no longer calls 
#5230 "in flight".
   
   `LoggingToolset` keeps its experimental row. Making it private is a code 
change with its own trade-off (#74449 just exported it from 
`airflow.providers.common.ai.toolsets`), so it is not part of a docs PR.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to