anthropics / anthropics/claude-agent-sdk-python

get_session_info() returns no AI-generated title for sessions created via the Python SDK

未關閉
#854 0 則留言 2 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
Python
星號
8.1k
分支
1.3k
平均合併
2 天 31 分鐘
30 天內合併 PR
1

描述

## Problem

Follow-up to #161, which was closed saying `get_session_info()` would return the AI-generated title via `SDKSessionInfo.summary` / `custom_title` (available since SDK `v0.1.50+`).

In practice it doesn't. For sessions driven by the Python SDK, `get_session_info()` never returns an AI-generated title — it falls back to the first prompt. The bundled CLI never writes the `{"type":"ai-title", ...}` line into the session JSONL during SDK-driven sessions, so there is nothing for `get_session_info()` to surface.

The read side (`_internal/sessions.py`) is fine — it does look for `aiTitle` and exposes it through `custom_title`. The bug is the write side: that line is never created.

## Reproduction

- SDK: `claude-agent-sdk` `0.1.60`
- Bundled CLI: `cli.js` `2.1.111`
- Python 3.11.13, Linux

```python
import asyncio
from pathlib import Path
from claude_agent_sdk import (
ClaudeAgentOptions,
ClaudeSDKClient,
ResultMessage,
get_session_info,
)

async def main():
cwd = Path.cwd()
async with ClaudeSDKClient(options=ClaudeAgentOptions(cwd=str(cwd))) as client:
await client.query("Tell me about Python and its history")
session_id = None
async for msg in client.receive_response():
if isinstance(msg, ResultMessage):
session_id = msg.session_id

info = get_session_info(session_id, directory=str(cwd))
print(repr(info.summary)) # -> "Tell me about Python and its history"
print(repr(info.custom_title)) # -> None

asyncio.run(main())
```

`grep ai-title .jsonl` returns nothing — even after long sessions, even after `await asyncio.sleep(100)` before exit.

## Workaround

The CLI does support an explicit control request that generates and persists the title. We can fire it right after `client.query()` so the title is fetched in parallel with the assistant response:

```python
async with ClaudeSDKClient(options=options) as client:
await client.query(prompt)

# Fire title generation now; runs concurrently with the assistant turn.
title_task = asyncio.create_task(
client._query._send_control_request(
{
"subtype": "generate_session_title",
"description": prompt,
"persist": True,
}
)
)

async for msg in client.receive_response():
if isinstance(msg, ResultMessage):
session_id = msg.session_id

result = await title_task
print(result["title"])

# Now get_session_info() returns the AI title:
info = get_session_info(session_id, directory=str(cwd))
assert info.custom_title == result["title"]
```

This works reliably and the `ai-title` line is on disk by the time the call returns. But `_query._send_control_request` is private and the `generate_session_title` subtype isn't in the `SDKControlRequest` union, so we'd rather not depend on it.

## What we'd like

1. Confirm whether there's a public API we missed for getting the AI-generated title from the SDK. We checked the public exports (`get_session_info`, `list_sessions`, `rename_session`, and the methods on `ClaudeSDKClient`) and didn't find one.

2. If not, please add a public `client.get_session_title()` method that generates the title in parallel with the assistant response — the way the CLI's interactive UI already does it (it just doesn't persist the result to the JSONL).

3. With that in place, please make `get_session_info()` actually return the AI title for SDK-driven sessions, so the resolution from #161 holds.

貢獻指南

這個儲存庫沒有索引到貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。