[agents] Fork completed agent session scrobbles on follow-up
All checks were successful
ci / test (push) Successful in 2m15s
ci / build-and-deploy (push) Has been skipped

This commit is contained in:
2026-08-24 16:56:01 -04:00
parent 631b68ef55
commit 8f63fb27ba
7 changed files with 135 additions and 10 deletions

View File

@ -1105,8 +1105,8 @@ def test_agent_session_detail_view(mock_delay, client, user):
@patch("scrobbles.tasks.scrobble_agent_session_prompt.delay")
def test_manual_scrobble_agent_follow_up_appends_turn(mock_delay, user):
scrobble = _mk_scrobble(
def test_manual_scrobble_agent_follow_up_forks_completed_session(mock_delay, user):
original = _mk_scrobble(
user,
in_progress=False,
turns=[
@ -1118,6 +1118,42 @@ def test_manual_scrobble_agent_follow_up_appends_turn(mock_delay, user):
],
)
result = manual_scrobble_agent_follow_up("tell me more", original.id, user.id)
assert result.id != original.id
assert result.agent_session_id == original.agent_session_id
assert result.in_progress is True
assert result.log["title"] == original.log["title"]
assert result.log["forked_from_id"] == original.id
original.refresh_from_db()
assert len(original.log["turns"]) == 1
assert original.in_progress is False
turns = result.log["turns"]
assert len(turns) == 2
assert turns[0] == original.log["turns"][0]
assert turns[1]["prompt"] == "tell me more"
assert turns[1]["response"] is None
mock_delay.assert_called_once_with(result.id, turns[1]["prompt_id"])
@patch("scrobbles.tasks.scrobble_agent_session_prompt.delay")
def test_manual_scrobble_agent_follow_up_appends_turn_when_in_progress(
mock_delay, user
):
scrobble = _mk_scrobble(
user,
in_progress=True,
turns=[
{
"prompt_id": "abc-123",
"prompt": "hello",
"response": "hi back",
}
],
)
result = manual_scrobble_agent_follow_up("tell me more", scrobble.id, user.id)
assert result.id == scrobble.id
@ -1127,6 +1163,7 @@ def test_manual_scrobble_agent_follow_up_appends_turn(mock_delay, user):
assert turns[1]["prompt"] == "tell me more"
assert turns[1]["response"] is None
assert scrobble.in_progress is True
assert "forked_from_id" not in scrobble.log
mock_delay.assert_called_once_with(scrobble.id, turns[1]["prompt_id"])
@ -1137,8 +1174,8 @@ def test_manual_scrobble_agent_follow_up_unknown_scrobble(mock_delay, user):
@patch("scrobbles.tasks.scrobble_agent_session_prompt.delay")
def test_agent_session_followup_post_appends_turn(mock_delay, client, user):
scrobble = _mk_scrobble(
def test_agent_session_followup_post_forks_completed_session(mock_delay, client, user):
original = _mk_scrobble(
user,
in_progress=False,
turns=[
@ -1150,12 +1187,48 @@ def test_agent_session_followup_post_appends_turn(mock_delay, client, user):
],
)
client.force_login(user)
response = client.post(
reverse("scrobbles:agent-session-followup", args=[original.id]),
{"prompt": "tell me more"},
)
assert response.status_code == 200
assert response["HX-Redirect"] == reverse(
"scrobbles:detail", args=[response.context["object"].id]
)
forked = response.context["object"]
assert forked.id != original.id
assert b"tell me more" in response.content
assert b"Thinking" in response.content
assert b"every 5s" in response.content
original.refresh_from_db()
assert len(original.log["turns"]) == 1
assert original.in_progress is False
@patch("scrobbles.tasks.scrobble_agent_session_prompt.delay")
def test_agent_session_followup_post_appends_turn_when_in_progress(
mock_delay, client, user
):
scrobble = _mk_scrobble(
user,
in_progress=True,
turns=[
{
"prompt_id": "abc-123",
"prompt": "hello",
"response": "hi back",
}
],
)
client.force_login(user)
response = client.post(
reverse("scrobbles:agent-session-followup", args=[scrobble.id]),
{"prompt": "tell me more"},
)
assert response.status_code == 200
assert "HX-Redirect" not in response
assert b"tell me more" in response.content
assert b"Thinking" in response.content
assert b"every 5s" in response.content