Skip to content

PR-1.2: SSE Parser (~100 LOC + 100 tests) - #228

Open
xiaoqi-7 wants to merge 2 commits into
kaito-project:mainfrom
xiaoqi-7:feat/guardrail-phase1-pr-1-2-sse-parser
Open

xiaoqi-7 wants to merge 2 commits into
kaito-project:mainfrom
xiaoqi-7:feat/guardrail-phase1-pr-1-2-sse-parser

Conversation

@xiaoqi-7

@xiaoqi-7 xiaoqi-7 commented Oct 2, 2026

Copy link
Copy Markdown

Phase 1.2: Core SSE parsing for OpenAI-compatible LLM streaming.

streaming/sse_parser.py:

  • split_sse_events(buf: bytes) → (events, remaining)
    Splits raw bytes on \n\n delimiter, returns complete events + remainder
  • parse_sse_event(event: bytes) → Optional[dict]
    Parses "data: {...}" JSON, extracts delta.content from OpenAI format
  • is_done_event(event: bytes) → bool
    Detects [DONE] marker for stream termination

Handles:

  • Complete events split cleanly on delimiters
  • Incomplete events held for next buffer chunk
  • Malformed JSON (logs warning, returns None)
  • OpenAI delta format with finish_reason, etc.
  • Empty/missing content fields
  • Non-data lines (comments, etc.)

Tests (16 tests, 100% pass):

  • TestSplitSSEEvents: single, multiple, incomplete, empty
  • TestParseSSEEvent: delta content, finish_reason, [DONE], edge cases
  • TestIsDoneEvent: detection with/without prefix, malformed
  • TestIntegration: realistic streaming sequence (chunks end mid-event)

Depends on: PR-1.1 (#227)
Blocks: PR-1.3 (Logical Stream + Holdback)

Phase 1.1 foundation: Minimal gRPC ext_proc server stub.

- ext_proc/ module with __init__ and server.py
- ExternalProcessorServicer placeholder (Process() raises NotImplementedError)
- requirements.txt with core dependencies (grpcio, protobuf, pydantic, pyyaml, tiktoken)
- Dockerfile for containerization (python:3.11-slim)
- setup.py for package management
- pytest.ini and test structure
- .gitignore for Python/IDE artifacts

Tests:
- test_version: confirms version is 0.1.0
- test_imports: verifies core dependencies importable
- test_servicer_placeholder: confirms ExternalProcessorServicer exists

All tests pass. Ready for Phase 1.2 (SSE Parser) to start.

Depends on: none
Blocks: PR-1.2 (SSE Parser), PR-1.4 (Scanner Interface)
Phase 1.2: Core SSE parsing for OpenAI-compatible LLM streaming.

streaming/sse_parser.py:
- split_sse_events(buf: bytes) → (events, remaining)
  Splits raw bytes on \n\n delimiter
- parse_sse_event(event: bytes) → Optional[dict]
  Parses "data: {...}" JSON, extracts delta.content
- is_done_event(event: bytes) → bool
  Detects [DONE] marker

Handles: incomplete events, malformed JSON, OpenAI format, edge cases

Tests (16 tests, 100% pass):
- TestSplitSSEEvents: single, multiple, incomplete, empty
- TestParseSSEEvent: delta content, finish_reason, [DONE], edge cases
- TestIsDoneEvent: detection with/without prefix
- TestIntegration: realistic streaming sequence

Depends on: PR-1.1
Blocks: PR-1.3 (Logical Stream + Holdback)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants