Skip to content

Commit 440132f

Browse files
committed
Add action field to session:message payload per API spec 5.1.1
1 parent 106f3ab commit 440132f

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

src/pine_ai/chat.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,26 +86,40 @@ def leave_session(self, session_id: str) -> None:
8686
"""Leave a session room."""
8787
self._sio.emit(C2SEvent.SESSION_LEAVE, None, session_id)
8888

89+
@staticmethod
90+
def _build_message_data(
91+
content: str,
92+
attachments: Optional[list[dict[str, Any]]] = None,
93+
referenced_sessions: Optional[list[dict[str, str]]] = None,
94+
action: Optional[dict[str, Any]] = None,
95+
) -> dict[str, Any]:
96+
"""Build the session:message payload per spec 5.1.1."""
97+
from datetime import datetime
98+
data: dict[str, Any] = {
99+
"content": content,
100+
"attachments": attachments or [],
101+
"referenced_sessions": referenced_sessions or [],
102+
"client_now_date": datetime.now().isoformat(),
103+
}
104+
if action is not None:
105+
data["action"] = action
106+
return data
107+
89108
async def chat(
90109
self,
91110
session_id: str,
92111
content: str,
93112
*,
94113
attachments: Optional[list[dict[str, Any]]] = None,
95114
referenced_sessions: Optional[list[dict[str, str]]] = None,
115+
action: Optional[dict[str, Any]] = None,
96116
) -> AsyncGenerator[ChatEvent, None]:
97117
"""Send a message and yield events with stream buffering.
98118
Production handler reads payload.data as {content, attachments, ...}.
99119
"""
100-
from datetime import datetime
101120
self._sio.emit(
102121
C2SEvent.SESSION_MESSAGE,
103-
{
104-
"content": content,
105-
"attachments": attachments or [],
106-
"referenced_sessions": referenced_sessions or [],
107-
"client_now_date": datetime.now().isoformat(),
108-
},
122+
self._build_message_data(content, attachments, referenced_sessions, action),
109123
session_id,
110124
)
111125
async for event in self._listen(session_id):
@@ -118,17 +132,12 @@ def send_message(
118132
*,
119133
attachments: Optional[list[dict[str, Any]]] = None,
120134
referenced_sessions: Optional[list[dict[str, str]]] = None,
135+
action: Optional[dict[str, Any]] = None,
121136
) -> None:
122137
"""Fire-and-forget message send (no event listening)."""
123-
from datetime import datetime
124138
self._sio.emit(
125139
C2SEvent.SESSION_MESSAGE,
126-
{
127-
"content": content,
128-
"attachments": attachments or [],
129-
"referenced_sessions": referenced_sessions or [],
130-
"client_now_date": datetime.now().isoformat(),
131-
},
140+
self._build_message_data(content, attachments, referenced_sessions, action),
132141
session_id,
133142
)
134143

src/pine_ai/client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,15 @@ async def chat(
122122
*,
123123
attachments: Optional[list[dict[str, Any]]] = None,
124124
referenced_sessions: Optional[list[dict[str, str]]] = None,
125+
action: Optional[dict[str, Any]] = None,
125126
) -> AsyncGenerator[ChatEvent, None]:
126127
"""Send a message and yield buffered events."""
127128
self._ensure_connected()
128129
async for event in self._chat.chat( # type: ignore[union-attr]
129130
session_id, content,
130131
attachments=attachments,
131132
referenced_sessions=referenced_sessions,
133+
action=action,
132134
):
133135
yield event
134136

@@ -139,13 +141,15 @@ def send_message(
139141
*,
140142
attachments: Optional[list[dict[str, Any]]] = None,
141143
referenced_sessions: Optional[list[dict[str, str]]] = None,
144+
action: Optional[dict[str, Any]] = None,
142145
) -> None:
143146
"""Send a message without waiting for events (fire-and-forget)."""
144147
self._ensure_connected()
145148
self._chat.send_message( # type: ignore[union-attr]
146149
session_id, content,
147150
attachments=attachments,
148151
referenced_sessions=referenced_sessions,
152+
action=action,
149153
)
150154

151155
async def listen(self, session_id: str) -> AsyncGenerator[ChatEvent, None]:
@@ -239,6 +243,7 @@ def chat_sync(
239243
*,
240244
attachments: Optional[list[dict[str, Any]]] = None,
241245
referenced_sessions: Optional[list[dict[str, str]]] = None,
246+
action: Optional[dict[str, Any]] = None,
242247
) -> list[ChatEvent]:
243248
"""Send a message and return all events as a list (blocking)."""
244249
async def _collect() -> list[ChatEvent]:
@@ -247,6 +252,7 @@ async def _collect() -> list[ChatEvent]:
247252
session_id, content,
248253
attachments=attachments,
249254
referenced_sessions=referenced_sessions,
255+
action=action,
250256
):
251257
events.append(event)
252258
return events
@@ -259,12 +265,14 @@ def send_message(
259265
*,
260266
attachments: Optional[list[dict[str, Any]]] = None,
261267
referenced_sessions: Optional[list[dict[str, str]]] = None,
268+
action: Optional[dict[str, Any]] = None,
262269
) -> None:
263270
"""Send a message without waiting for events (fire-and-forget)."""
264271
self._async.send_message(
265272
session_id, content,
266273
attachments=attachments,
267274
referenced_sessions=referenced_sessions,
275+
action=action,
268276
)
269277

270278
def send_form_response(self, session_id: str, message_id: str, form_data: dict[str, Any]) -> None:

0 commit comments

Comments
 (0)