v2.9.5 (#676)
Co-authored-by: Clément Drouin <clement.drouin@mistral.ai> Co-authored-by: Kim-Adeline Miguel <51720070+kimadeline@users.noreply.github.com> Co-authored-by: Mathias Gesbert <mathias.gesbert@mistral.ai> Co-authored-by: allansimon-mistral <allan.simon@ext.mistral.ai> Co-authored-by: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
parent
4972dd5694
commit
b23f49e5f4
74 changed files with 2342 additions and 240 deletions
|
|
@ -101,6 +101,11 @@ def _build_env(vibe_home_dir: Path, *, include_api_key: bool) -> dict[str, str]:
|
|||
env["PYTHONUNBUFFERED"] = "1"
|
||||
env["VIBE_HOME"] = str(vibe_home_dir)
|
||||
|
||||
vibe_home_dir.mkdir(parents=True, exist_ok=True)
|
||||
config_file = vibe_home_dir / "config.toml"
|
||||
if not config_file.exists():
|
||||
config_file.write_text("enable_telemetry = false\n")
|
||||
|
||||
if include_api_key:
|
||||
env["MISTRAL_API_KEY"] = "mock"
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ from vibe.acp.acp_agent_loop import VibeAcpAgentLoop
|
|||
class TestCloseSession:
|
||||
@pytest.mark.asyncio
|
||||
async def test_close_session_removes_session_and_closes_resources(
|
||||
self, acp_agent_loop: VibeAcpAgentLoop
|
||||
self, acp_agent_loop: VibeAcpAgentLoop, telemetry_events: list[dict[str, Any]]
|
||||
) -> None:
|
||||
session_response = await acp_agent_loop.new_session(cwd=".", mcp_servers=[])
|
||||
session = acp_agent_loop.sessions[session_response.session_id]
|
||||
|
|
@ -30,6 +30,17 @@ class TestCloseSession:
|
|||
assert session_response.session_id not in acp_agent_loop.sessions
|
||||
backend_close.assert_awaited_once()
|
||||
telemetry_close.assert_awaited_once()
|
||||
session_closed_events = [
|
||||
event
|
||||
for event in telemetry_events
|
||||
if event["event_name"] == "vibe.session_closed"
|
||||
]
|
||||
assert len(session_closed_events) == 1
|
||||
assert (
|
||||
session_closed_events[0]["properties"]["session_id"]
|
||||
== session_response.session_id
|
||||
)
|
||||
assert session_closed_events[0]["properties"]["agent_entrypoint"] == "acp"
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_close_session_cancels_active_prompt(
|
||||
|
|
@ -69,6 +80,23 @@ class TestCloseSession:
|
|||
|
||||
assert bg_task.cancelled()
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_emit_session_closed_for_active_sessions(
|
||||
self, acp_agent_loop: VibeAcpAgentLoop, telemetry_events: list[dict[str, Any]]
|
||||
) -> None:
|
||||
session1 = await acp_agent_loop.new_session(cwd=".", mcp_servers=[])
|
||||
session2 = await acp_agent_loop.new_session(cwd=".", mcp_servers=[])
|
||||
|
||||
await acp_agent_loop.emit_session_closed_for_active_sessions()
|
||||
|
||||
session_closed_events = [
|
||||
e for e in telemetry_events if e["event_name"] == "vibe.session_closed"
|
||||
]
|
||||
emitted_ids = {e["properties"]["session_id"] for e in session_closed_events}
|
||||
assert len(session_closed_events) == 2
|
||||
assert session1.session_id in emitted_ids
|
||||
assert session2.session_id in emitted_ids
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_close_session_rejects_new_background_tasks(
|
||||
self, acp_agent_loop: VibeAcpAgentLoop
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ from tests.stubs.fake_backend import FakeBackend
|
|||
from tests.stubs.fake_client import FakeClient
|
||||
from vibe.acp.acp_agent_loop import VibeAcpAgentLoop
|
||||
from vibe.core.agent_loop import AgentLoop
|
||||
from vibe.core.session.session_id import shorten_session_id
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
|
@ -79,3 +80,10 @@ class TestCompactEventHandling:
|
|||
assert compact_end.status == "completed"
|
||||
|
||||
assert compact_start.tool_call_id == compact_end.tool_call_id
|
||||
assert compact_end.content is not None
|
||||
compact_end_text = compact_end.content[0].content
|
||||
assert isinstance(compact_end_text, TextContentBlock)
|
||||
assert shorten_session_id(session_response.session_id) in compact_end_text.text
|
||||
assert (
|
||||
shorten_session_id(session.agent_loop.session_id) in compact_end_text.text
|
||||
)
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ class TestACPInitialize:
|
|||
),
|
||||
)
|
||||
assert response.agent_info == Implementation(
|
||||
name="@mistralai/mistral-vibe", title="Mistral Vibe", version="2.9.4"
|
||||
name="@mistralai/mistral-vibe", title="Mistral Vibe", version="2.9.5"
|
||||
)
|
||||
|
||||
assert response.auth_methods == []
|
||||
|
|
@ -62,7 +62,7 @@ class TestACPInitialize:
|
|||
),
|
||||
)
|
||||
assert response.agent_info == Implementation(
|
||||
name="@mistralai/mistral-vibe", title="Mistral Vibe", version="2.9.4"
|
||||
name="@mistralai/mistral-vibe", title="Mistral Vibe", version="2.9.5"
|
||||
)
|
||||
|
||||
assert response.auth_methods is not None
|
||||
|
|
|
|||
|
|
@ -92,20 +92,26 @@ class TestMultiSessionCore:
|
|||
)
|
||||
assert user_message1 is not None
|
||||
assert user_message1.content == "Prompt for session 1"
|
||||
assistant_message1 = next(
|
||||
(msg for msg in session1.agent_loop.messages if msg.role == Role.assistant),
|
||||
None,
|
||||
)
|
||||
assert assistant_message1 is not None
|
||||
assert assistant_message1.content == "Response 1"
|
||||
user_message2 = next(
|
||||
(msg for msg in session2.agent_loop.messages if msg.role == Role.user), None
|
||||
)
|
||||
assert user_message2 is not None
|
||||
assert user_message2.content == "Prompt for session 2"
|
||||
|
||||
# Backend stream order is non-deterministic under asyncio.gather, so
|
||||
# assert that both sessions received distinct responses from the
|
||||
# expected set rather than pinning a specific assignment.
|
||||
assistant_message1 = next(
|
||||
(msg for msg in session1.agent_loop.messages if msg.role == Role.assistant),
|
||||
None,
|
||||
)
|
||||
assistant_message2 = next(
|
||||
(msg for msg in session2.agent_loop.messages if msg.role == Role.assistant),
|
||||
None,
|
||||
)
|
||||
assert assistant_message1 is not None
|
||||
assert assistant_message2 is not None
|
||||
assert assistant_message2.content == "Response 2"
|
||||
assert {assistant_message1.content, assistant_message2.content} == {
|
||||
"Response 1",
|
||||
"Response 2",
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue