emecii opened a new pull request, #1107:
URL: https://github.com/apache/flink-agents/pull/1107

   Linked issue: #936
   
   ### Purpose of change
   
   Anthropic responses that stop at the configured output-token limit now reach 
the shared chat action
   as `extra_args["finish_reason"] == "length"`. The action already rejects 
that canonical value before
   it dispatches incomplete content, so callers receive its clear truncation 
error instead of parsing
   or consuming a partial response.
   
   Both Anthropic connections read the SDK response stop reason after 
converting the content. They map
   Anthropic's `max_tokens` value to the existing cross-provider `length` value 
and retain every other
   reported value unchanged.
   
   ### Behavioral Semantics
   
   #### Key decisions
   
   Only `max_tokens` is normalized because it is Anthropic's name for the 
shared action's established
   token-limit condition. Other reasons remain provider values so that an 
unknown future reason is
   observable without changing control flow.
   
   #### Interaction decisions
   
   | Anthropic stop reason | Stored `finish_reason` | Shared action behavior |
   | --- | --- | --- |
   | absent | absent | Existing behavior |
   | `max_tokens` | `length` | Rejects incomplete response before dispatch |
   | any other supplied value | same value | Existing accepted-reason behavior |
   
   #### Behavioral contracts
   
   - A Java or Python Anthropic response stopped by `max_tokens` exposes the 
canonical `length`
     metadata that the shared action recognizes.
   - A supplied non-token-limit stop reason remains available without being 
reclassified.
   - A response without a stop reason gains no metadata entry.
   
   #### Failure behavior
   
   This converter change does not catch, retry, or transform provider failures. 
When the model returns
   `max_tokens`, the existing shared action raises its established truncation 
error; direct connection
   callers can inspect the response metadata before invoking that action.
   
   ### Tests
   
   | Contract | Tests |
   | --- | --- |
   | `max_tokens` becomes `length`; ordinary reasons remain observable | Java 
`AnthropicChatModelConnectionTest` (94 passed); Python 
`test_anthropic_response_parsing.py` |
   | Shared action rejects `length` before dispatch | Java 
`ChatModelActionTest` and `ChatModelActionRetryTest` (36 passed); Python 
`test_chat_model_action.py` |
   
   Focused Python run: 107 passed across the Anthropic response parser and 
shared-action tests.
   Spotless, Ruff format/check, and Apache RAT license checks pass.
   
   Not verified: live Anthropic API calls. Tests use SDK response objects and 
local action fixtures, so
   they require no credentials or network access.
   
   <details>
   <summary>Implementation evidence</summary>
   
   The Python converter stores the key independently of token-usage metrics. 
The Java converter reads
   the optional SDK stop reason after constructing the response and does the 
same. This keeps the
   mapping available for responses with or without recorded usage and for both 
plain-text and tool-call
   conversion paths.
   </details>
   
   ### API
   
   No public API signature changes. Existing consumers of `extra_args` gain 
`finish_reason` on
   Anthropic responses; the shared action now classifies Anthropic token-limit 
responses consistently
   with OpenAI-family responses.
   
   ### Documentation
   
   - [ ] `doc-needed`
   - [x] `doc-not-needed`
   - [ ] `doc-included`
   
   ### Was this patch authored or co-authored using generative AI tooling?
   
   - [x] Yes
   - [ ] No
   
   Generated-by: Codex CLI 0.153.4 (GPT-6)
   


-- 
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