aws / aws/bedrock-agentcore-sdk-python

bug: incorrect pagination in Memory Session Manager `list_messages`

オープン
#346 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
bug
主要言語
Python
スター
761
フォーク
147
平均マージ
1日 23時間
マージ済み PR(30日)
7

説明

## Problem

### Before PR #244

State events and conversational events were naturally separated by actorId:

```python
# create_session used a prefixed actorId
create_event(actorId="session_my-session-id", payload=[{"blob": ...}])

# create_agent used a prefixed actorId
create_event(actorId="agent_my-agent-id", payload=[{"blob": ...}])

# create_message used the regular actorId
create_event(actorId="my-actor-id", payload=[{"conversational": ...}])
```

So when list_messages called list_events with actorId="my-actor-id", it only got conversational events back. State events lived under different actorIds and were invisible to this query. max_results counted only
what mattered.

### After PR #244

Everything now uses the same actorId, with metadata distinguishing state events:

```python
# create_session — same actorId, metadata marks it as state
create_event(
actorId="my-actor-id", # ← same as messages now
metadata={"stateType": {"stringValue": "SESSION"}},
payload=[{"blob": ...}],
)

# create_agent — same actorId, metadata marks it as state
create_event(
actorId="my-actor-id", # ← same as messages now
metadata={"stateType": {"stringValue": "AGENT"}, "agentId": {"stringValue": "..."}},
payload=[{"blob": ...}],
)

# create_message — same actorId, no metadata
create_event(actorId="my-actor-id", payload=[{"conversational": ...}])
```

### Potential Issues

`list_messages` in `session_manager.py` fetches events without any metadata filter:

```python
events = self.memory_client.list_events(
memory_id=self.config.memory_id,
actor_id=self.config.actor_id,
session_id=session_id,
max_results=max_results, # ← this now includes state events in the count
)
```

Since all events share the same actorId now, this query returns both conversational AND state events. The API returned `max_results` events total, some of which were state events. Those get discarded by the converter, so the final list is shorter than what the caller asked for.

### Concrete example

A session with 1 session state event, 2 agent state events, and 20 conversational messages. Customer calls list_messages(limit=10):

1. `max_results` = limit + offset = 10
2. `list_events` returns 10 events: 3 state + 7 conversational
3. `events_to_messages` discards the 3 state events → 7 messages
4. Customer gets 7 messages, expected 10

Customer does not get a pagination token, so they assume 7 is all that exists, and doesn't know there are more.

### Acceptance Criteria
- [ ] customer should be given nextToken, or should always get maxResults exactly if more results exist.
- [ ] unit tests and/or integration verifying fix of the bug.

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

session_manager.py の list_messages から始め、memory_client.list_events が max_results をどのように適用し、events_to_messages が state events をどのように破棄するかを調べます。shared actor IDs と session または agent の state events を使うケースを再現し、その後 unit または integration のカバレッジを追加します。完了条件は、ページネーションによって要求されたメッセージが返されるか、さらにメッセージが存在する場合に nextToken が公開されることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
api, backend
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
58/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。