mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-12 09:12:40 +02:00
Add SSE envelope helpers under app.services.streaming.
This commit is contained in:
parent
a421e7d792
commit
a9bf7ab7d2
3 changed files with 73 additions and 0 deletions
|
|
@ -0,0 +1,23 @@
|
||||||
|
"""Wire framing layer."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from .identifiers import (
|
||||||
|
generate_message_id,
|
||||||
|
generate_reasoning_id,
|
||||||
|
generate_subagent_run_id,
|
||||||
|
generate_text_id,
|
||||||
|
generate_tool_call_id,
|
||||||
|
)
|
||||||
|
from .sse import format_done, format_sse, get_response_headers
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"format_done",
|
||||||
|
"format_sse",
|
||||||
|
"generate_message_id",
|
||||||
|
"generate_reasoning_id",
|
||||||
|
"generate_subagent_run_id",
|
||||||
|
"generate_text_id",
|
||||||
|
"generate_tool_call_id",
|
||||||
|
"get_response_headers",
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
"""Prefixed UUID generators for stream parts."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
def generate_message_id() -> str:
|
||||||
|
return f"msg_{uuid.uuid4().hex}"
|
||||||
|
|
||||||
|
|
||||||
|
def generate_text_id() -> str:
|
||||||
|
return f"text_{uuid.uuid4().hex}"
|
||||||
|
|
||||||
|
|
||||||
|
def generate_reasoning_id() -> str:
|
||||||
|
return f"reasoning_{uuid.uuid4().hex}"
|
||||||
|
|
||||||
|
|
||||||
|
def generate_tool_call_id() -> str:
|
||||||
|
return f"call_{uuid.uuid4().hex}"
|
||||||
|
|
||||||
|
|
||||||
|
def generate_subagent_run_id() -> str:
|
||||||
|
return f"subagent_{uuid.uuid4().hex}"
|
||||||
25
surfsense_backend/app/services/streaming/envelope/sse.py
Normal file
25
surfsense_backend/app/services/streaming/envelope/sse.py
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
"""Server-Sent-Events wire framing."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def format_sse(data: Any) -> str:
|
||||||
|
if isinstance(data, str):
|
||||||
|
return f"data: {data}\n\n"
|
||||||
|
return f"data: {json.dumps(data)}\n\n"
|
||||||
|
|
||||||
|
|
||||||
|
def format_done() -> str:
|
||||||
|
return "data: [DONE]\n\n"
|
||||||
|
|
||||||
|
|
||||||
|
def get_response_headers() -> dict[str, str]:
|
||||||
|
return {
|
||||||
|
"Content-Type": "text/event-stream",
|
||||||
|
"Cache-Control": "no-cache",
|
||||||
|
"Connection": "keep-alive",
|
||||||
|
"x-vercel-ai-ui-message-stream": "v1",
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue