feat(agents,backends,conversations,frontends,ui): progress thinking is told apart by its agent, raycast reasoning stays collapsed, read_conversation keeps progress
This commit is contained in:
1 parent
13873f857b
commit
120985deab
18 files changed
+374
-110
No files matched your search
@@ -10,7 +10,7 @@ import hashlib
|
||||
import uuid as _uuid
|
||||
from collections.abc import Mapping
|
||||
from datetime import UTC, datetime
|
||||
from typing import TYPE_CHECKING, Any
|
||||
from typing import TYPE_CHECKING, Any, cast
|
||||
|
||||
try:
|
||||
from claude_agent_sdk._cli_version import __cli_version__
|
||||
@@ -31,6 +31,8 @@ __all__ = [
|
||||
"open_tool_uses",
|
||||
"prompt_count",
|
||||
"render_messages",
|
||||
"reply_text",
|
||||
"spoken_text",
|
||||
"strip_tool_entries",
|
||||
"text_of",
|
||||
"window_entries",
|
||||
@@ -434,13 +436,45 @@ def prompt_count(entries: Iterable[Mapping[str, Any]]) -> int:
|
||||
return sum(1 for e in entries if _is_prompt_entry(e))
|
||||
|
||||
|
||||
def spoken_text(block: Any, *, thinking_is_progress: bool) -> str:
|
||||
"""What a content block (dict or model) says to the human.
|
||||
|
||||
Text always; thinking only when the agent's thinking is progress
|
||||
written for the human, never when it is reasoning.
|
||||
"""
|
||||
if isinstance(block, Mapping):
|
||||
fields = cast("Mapping[str, Any]", block)
|
||||
kind, text, thinking = (
|
||||
fields.get("type"),
|
||||
fields.get("text"),
|
||||
fields.get("thinking"),
|
||||
)
|
||||
else:
|
||||
kind = getattr(block, "type", None)
|
||||
text, thinking = getattr(block, "text", None), getattr(block, "thinking", None)
|
||||
if kind == "text":
|
||||
return str(text or "").strip()
|
||||
if kind == "thinking" and thinking_is_progress:
|
||||
return str(thinking or "").strip()
|
||||
return ""
|
||||
|
||||
|
||||
def reply_text(content: Iterable[Any], *, thinking_is_progress: bool) -> str:
|
||||
"""The reply as the human reads it: spoken blocks in order, a blank line apart."""
|
||||
parts = (spoken_text(b, thinking_is_progress=thinking_is_progress) for b in content)
|
||||
return "\n\n".join(p for p in parts if p)
|
||||
|
||||
|
||||
def render_messages(
|
||||
messages: Iterable[Mapping[str, Any]], *, window: int | None = None
|
||||
messages: Iterable[Mapping[str, Any]],
|
||||
*,
|
||||
thinking_is_progress: bool,
|
||||
window: int | None = None,
|
||||
) -> str:
|
||||
"""Plain-text projection for ``read_conversation``: ``user:``/``assistant:`` turns.
|
||||
|
||||
Tool calls collapse to a one-line summary per assistant turn; tool
|
||||
results and thinking are dropped.
|
||||
results and reasoning are dropped, progress thinking reads as text.
|
||||
"""
|
||||
turns: list[str] = []
|
||||
tools: list[str] = []
|
||||
@@ -466,8 +500,9 @@ def render_messages(
|
||||
turns.append("user:\n" + _text_of_content(content))
|
||||
continue
|
||||
for block in _assistant_blocks(content):
|
||||
if block.get("type") == "text" and block.get("text"):
|
||||
current.append(str(block["text"]))
|
||||
text = spoken_text(block, thinking_is_progress=thinking_is_progress)
|
||||
if text:
|
||||
current.append(text)
|
||||
elif block.get("type") == "tool_use":
|
||||
tools.append(str(block.get("name", "")))
|
||||
flush()
|
||||
|
||||
Reference in new issue
Block a user