Compare commits

...
Author SHA1 Message Date
MervinPraison f1f953be76 Release v0.3.131 2026-07-13 10:08:48 +00:00
praisonai-triage-agent[bot] ee994b586d Merge pull request #193 from MervinPraison/claude/issue-192-20260713-120000
fix: isolate OPENAI_API_KEY in realtime lifecycle test
2026-07-13 10:04:40 +00:00
MervinPraisonandClaude 1748d6d023 fix: isolate OPENAI_API_KEY in realtime session lifecycle test (fixes #192)
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2026-07-13 08:21:25 +00:00
MervinPraison a45c3af006 Release v0.3.130 2026-07-10 10:49:34 +00:00
praisonai-triage-agent[bot] b54d94dd56 Merge pull request #190 from MervinPraison/claude/issue-189-20260710-0829
feat: restore Channels dashboard Add/Delete/Test CRUD UI
2026-07-10 10:46:59 +00:00
5 changed files with 34 additions and 5 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "aiui"
version = "0.3.129"
version = "0.3.131"
description = "YAML-driven website generator - CLI and compiler"
readme = "README.md"
license = {text = "MIT"}
+1 -1
View File
@@ -1,3 +1,3 @@
"""Version information."""
__version__ = "0.3.129"
__version__ = "0.3.131"
+8 -1
View File
@@ -116,7 +116,14 @@ class OpenAIRealtimeManager(RealtimeProtocol):
logger.debug(f"Audio chunk for session {session_id}: {len(audio_data)} bytes")
async def receive_audio(self, session_id: str) -> AsyncIterator[Dict[str, Any]]:
"""Receive events from OpenAI realtime session."""
"""Receive events from OpenAI realtime session.
First-event contract:
- Unknown session -> ``error`` (Session not found)
- ``OPENAI_API_KEY`` set -> ``session.ready`` (WebRTC handshake)
- Integrated mode, no key -> ``error`` (status=degraded)
- Standalone, no key -> ``conversation.item.created`` (mock)
"""
# In WebRTC mode, events come via WebRTC connection
# This method would handle transcript/tool call events
session = self._sessions.get(session_id)
+23 -1
View File
@@ -90,9 +90,10 @@ class TestSessionLifecycle:
assert "openai package not installed" in session_info["error"]
@pytest.mark.asyncio
async def test_session_lifecycle_with_mocked_openai(self):
async def test_session_lifecycle_with_mocked_openai(self, monkeypatch):
"""Test full session lifecycle with mocked OpenAI."""
import sys
monkeypatch.delenv("OPENAI_API_KEY", raising=False)
manager = OpenAIRealtimeManager()
# Mock OpenAI client and response
@@ -140,6 +141,27 @@ class TestSessionLifecycle:
# Verify session is removed from internal tracking
assert session_id not in manager._sessions
@pytest.mark.asyncio
async def test_receive_audio_yields_session_ready_with_api_key(self, monkeypatch):
"""With OPENAI_API_KEY set, receive_audio yields session.ready first."""
monkeypatch.setenv("OPENAI_API_KEY", "sk-test")
manager = OpenAIRealtimeManager()
session_id = "session_ready_test"
manager._sessions[session_id] = {
"status": "created",
"client_secret": "secret_abc",
}
events = []
async for event in manager.receive_audio(session_id):
events.append(event)
break
assert len(events) == 1
assert events[0]["type"] == "session.ready"
assert events[0]["provider"] == "openai"
assert events[0]["client_secret"] == "secret_abc"
@pytest.mark.asyncio
async def test_receive_audio_invalid_session(self):
"""Test receive_audio with invalid session ID."""
Generated
+1 -1
View File
@@ -207,7 +207,7 @@ wheels = [
[[package]]
name = "aiui"
version = "0.3.129"
version = "0.3.131"
source = { editable = "." }
dependencies = [
{ name = "pydantic" },