Skip to content

feat: carry reasoning across turns with per-backend replay policy#1374

Merged
AngeloDanducci merged 4 commits into
generative-computing:mainfrom
AngeloDanducci:ad-1201
Jul 17, 2026
Merged

feat: carry reasoning across turns with per-backend replay policy#1374
AngeloDanducci merged 4 commits into
generative-computing:mainfrom
AngeloDanducci:ad-1201

Conversation

@AngeloDanducci

@AngeloDanducci AngeloDanducci commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Pull Request

Issue

Fixes #1201

Description

Carry reasoning across turns with per-backend replay policy for better thinking handling.

The policy is currently provider-agnostic (provider is unused, documented as a reserved hook). The divergent contracts from #1201 table — DeepSeek hard-400 without tools, Anthropic signed blocks — are not implemented here.

Testing

  • Tests added to the respective file if code was changed
  • New code has 100% coverage if code was added
  • Ensure existing tests and github automation passes (a maintainer will kick off the github automation when the rest of the PR is populated)

Attribution

  • AI coding assistants used

Adding a new component, requirement, sampling strategy, or tool?

If your PR adds or modifies one of the types below, check the matching box. A checklist of type-specific review items will be posted as a comment.

  • Component
  • Requirement
  • Sampling Strategy
  • Tool

NOTE: Please ensure you have an issue that has been acknowledged by a core contributor and routed you to open a pull request against this repository. Otherwise, please open an issue before continuing with this pull request.

@github-actions github-actions Bot added the enhancement New feature or request label Jul 9, 2026
@AngeloDanducci
AngeloDanducci marked this pull request as ready for review July 13, 2026 07:14
@AngeloDanducci
AngeloDanducci requested a review from a team as a code owner July 13, 2026 07:14
@AngeloDanducci
AngeloDanducci requested a review from ajbozarth July 13, 2026 07:14

@ajbozarth ajbozarth left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the full diff and traced the capture → _parse → policy → serialize path. Solid, conservative change — no correctness blockers. All 72 new/changed tests pass locally. Action items below.

Before merge

  • Complete the live-model verification. The e2e test (test_reasoning_replay_e2e.py) is env-gated and CI-skipped, so nothing in CI exercises reasoning_content/thinking against a real endpoint. The PR body's own "still needs verification" note stands — this is the one thing that would catch a provider rejecting the injected wire key.
  • Tighten the PR body to say this lands the consensus rule only. The title says "per-backend replay policy" and provider is a parameter, but the policy is currently provider-agnostic (provider is unused, documented as a reserved hook). The divergent contracts from #1201's table — DeepSeek hard-400 without tools, Anthropic signed blocks — are not implemented here. State that explicitly so reviewers/users don't assume DeepSeek/Anthropic are covered.

Non-blocking

  • HF chat path is silently uncovered (see inline comment). Functionally fine given HF's capture gap, but a one-liner would prevent a future reader assuming coverage.

Verified separately

  • should_replay_reasoning returns exactly len(messages) flags, so the zip in each backend never truncates.
  • The adjacency check correctly maps to "this turn issued a tool call" — _acall_tools appends ToolMessage(role="tool") right after the tool-issuing turn.
  • Default replay_reasoning=False preserves historical behavior.
  • Real OpenAI Chat Completions never populates thinking, so the non-standard key is never sent there.

Comment thread mellea/backends/huggingface.py
@AngeloDanducci

Copy link
Copy Markdown
Contributor Author

Complete the live-model verification. - Live model verification was completed, just forgot to remove the line from the PR description when converting from draft.

@AngeloDanducci
AngeloDanducci requested a review from ajbozarth July 13, 2026 18:19
@ajbozarth

Copy link
Copy Markdown
Contributor

This LGTM as far as Claude reviews go , but I'd prefer to defer final approval to @jakelorocco after he returns since this is a decently sized change

@jakelorocco jakelorocco left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the should_replay_reasoning function is a good addition and makes sense. However, I worry that the re-serialization will continue to be problematic.

I keep pushing for this solution (and I understand that there are continuing complexities), but I feel that we should just resend the received message in cases like this. It will cause problems with streaming and for cross backend/model requests, but I think those are worth fixing to get that solution shape.

Comment on lines +215 to +218
# The prior turn "had a tool call" iff the next message is a tool result.
prior_turn_had_tool_call = (
i + 1 < len(messages) and messages[i + 1].role == "tool"
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if the assistant requests a tool call but we don't call the tool (leading to no message with role == tool)?

@AngeloDanducci
AngeloDanducci added this pull request to the merge queue Jul 16, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Jul 16, 2026
Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>
Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>
Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>
Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>
@AngeloDanducci

Copy link
Copy Markdown
Contributor Author

Rebased to fix conflicts.

@AngeloDanducci
AngeloDanducci added this pull request to the merge queue Jul 17, 2026
Merged via the queue into generative-computing:main with commit 87167d6 Jul 17, 2026
9 checks passed
@AngeloDanducci
AngeloDanducci deleted the ad-1201 branch July 17, 2026 17:48
psschwei pushed a commit to psschwei/mellea that referenced this pull request Jul 17, 2026
…nerative-computing#1374)

* feat: carry reasoning across turns with per-backend replay policy

Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>

* add note about hf reasoning

Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>

* handle tool request instead of direct usage

Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>

* update reasoning replay tests

Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>

---------

Signed-off-by: AngeloDanducci <angelo.danducci.ii@ibm.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Better handling of reasoning output from thinking models

3 participants