Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,15 @@ async def _generate_with_retry(
raise ProviderError("anthropic", str(exc), status_code=exc.status_code) from exc

cached = getattr(response.usage, "cache_read_input_tokens", 0) or 0

text_content = ""
for block in response.content:
if hasattr(block, "text"):
text_content = block.text
break

result = GeneratedResponse(
content=response.content[0].text,
content=text_content,
input_tokens=response.usage.input_tokens,
output_tokens=response.usage.output_tokens,
cached_tokens=cached,
Expand Down
25 changes: 25 additions & 0 deletions tests/unit/test_providers/test_anthropic_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

pytest.importorskip("anthropic", reason="anthropic SDK not installed")

from anthropic.types import TextBlock, ThinkingBlock

from repowise.core.providers.llm.anthropic import AnthropicProvider
from repowise.core.providers.llm.base import GeneratedResponse, ProviderError, RateLimitError

Expand Down Expand Up @@ -158,6 +160,29 @@ async def fake_create(**kwargs):
assert kw["messages"] == [{"role": "user", "content": "user msg"}]


async def test_generate_skips_thinking_block_before_text():
provider = AnthropicProvider(api_key="sk-ant-test")
mock_response = _make_mock_response()
mock_response.content = [
ThinkingBlock(
type="thinking",
thinking="Internal reasoning",
signature="test-signature",
),
TextBlock(
type="text",
text="Hello after thinking",
),
]

with patch("anthropic.AsyncAnthropic") as mock_client:
mock_client.return_value.messages.create = AsyncMock(return_value=mock_response)
provider._client = mock_client.return_value
result = await provider.generate("sys", "user")

assert result.content == "Hello after thinking"


# ---------------------------------------------------------------------------
# Error mapping
# ---------------------------------------------------------------------------
Expand Down