The GitHub Actions job "Lint PR" on texera.git/feat/pulseflow-streaming-and-llm-operators has failed. Run started by GitHub user nathant27 (triggered by nathant27).
Head commit for run: ce644d71c15184136c2a4f83b62fbbced2ff65f0 / nctam2 <[email protected]> feat: add streaming HTTP/WebSocket sources and an LLM agent operator Adds four first-class Texera operators ("PulseFlow") for building live analytical workflows over real-time data feeds: 1. PollingHttpSource (source) - Polls an HTTP/REST endpoint at a fixed interval and emits each response as a tuple. - Configurable method (GET/POST/PUT/PATCH/DELETE), headers, request body, interval, and an optional maxIterations cap (0 = forever). - Output schema: response_body, status_code, polled_at. - Implemented via a forever-running Iterator that sleeps between polls; works around Texera's bounded-source model without engine changes. 2. WebSocketSource (source) - Connects to a ws:// or wss:// endpoint and emits each received frame as a tuple, forever. - Uses JDK 11+ java.net.http WebSocket; supports an initial subscribe message and arbitrary handshake headers. - Permissive URI handling: trims whitespace and percent-encodes the '@' character (common in Binance-style stream names) so users can paste provider URLs verbatim. - Requests Long.MaxValue messages up front to avoid per-frame back-pressure bookkeeping; reassembles partial text frames. - Output schema: message, received_at. 3. HttpRequest (transformer) - For each input tuple, performs a configurable HTTP call with ${fieldName} interpolation in URL and body templates. - Appends http_request_status, http_request_body, and http_request_error to the input schema (namespaced to avoid collisions with upstream columns like response_body). - failOnError toggle controls whether non-2xx responses crash the workflow or are surfaced inline. 4. LLMAgent (transformer) - Calls an Anthropic Messages or OpenAI Chat Completions endpoint per tuple with a templated system + user prompt. - Provider enum (LLMProvider: ANTHROPIC, OPENAI) switches request body shape and reply-text extraction path (content[0].text vs choices[0].message.content). - Request body built via Jackson ObjectNode so user-supplied prompt content is automatically JSON-escaped — no broken templates from embedded quotes or newlines. - API key sourced from the operator field, falling back to the ANTHROPIC_API_KEY / OPENAI_API_KEY environment variable. - Appends a configurable output column (default "llm_response") and "llm_error" to the input schema. Shared utilities (operator/http/util/): - HttpClientFactory: lazy singleton java.net.http.HttpClient reused by all operators. - HttpMethod: enum with @JsonValue so the UI renders a dropdown. - KeyValuePair: Jackson-friendly header entry class. - TemplateInterpolator: ${fieldName} substitution from a Tuple. Registration: each operator gets a single @JsonSubTypes entry in LogicalOp.scala; the metadata/palette refreshes automatically from that registry. Operator icons: 128x128 PNGs added under frontend assets — clock for PollingHttpSource, dashed stream for WebSocketSource, curly-brace API glyph for HttpRequest, and a stylized brain for LLMAgent. Frontend fix (result-panel cell click): - When clicking a cell in the result table, the modal now receives the table's row data as a fallback and displays it immediately, overwriting only if the paginated server lookup returns a non-empty tuple. Previously, clicking a cell when the paginated result service was not yet initialized produced a permanently blank modal because the request to fetch the full row never fired (?. short-circuit on undefined service). Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]> Report URL: https://github.com/apache/texera/actions/runs/25967998535 With regards, GitHub Actions via GitBox
