Skip to content

Droid BYOK Responses finalizer crashes on sparse or invalid content blocks #1101

@SantaDiegoKairos

Description

@SantaDiegoKairos

Summary

Droid can crash while finalizing streamed BYOK OpenAI Responses turns when the response contains invalid or sparse tool/content block state.

Observed error:

TypeError: undefined is not an object (evaluating 'f.type')

The same failure class sometimes appears as E.type.

This correlates with Droid logging filtered invalid tool uses immediately before finalization:

[LLM] Filtered out invalid tool uses ... invalidTools=[{}, ...]

Environment

  • OS: Windows win32 10.0.26200
  • Droid version in logs: 0.121.0
  • BYOK: true
  • Endpoint shape: OpenAI-compatible /v1/responses
  • Affected surfaces observed locally:
    • Factory Desktop / daemon session
    • Droid CLI sessions
    • Zed Droid / ACP wrapper

Reproduction pattern

  1. Configure Droid with a BYOK OpenAI-compatible /v1/responses model.
  2. Run a tool-heavy agent task where the assistant may emit tool calls.
  3. The stream completes far enough for Droid to process tool-use state.
  4. Logs show invalid tool uses being filtered, often serialized as empty objects.
  5. Droid crashes in/around final content-block finalization with f.type / E.type instead of surfacing a typed assistant message or a recoverable model/tool error.

Structural evidence

Representative sanitized metadata from local logs:

errorMessage: undefined is not an object (evaluating 'f.type')
version: 0.121.0
platform: win32
isByok: true
outputFormat: stream-jsonrpc
preceding invalid tools: totalTools=4 validTools=1 invalidTools=[{},{},{}]

Other occurrences had larger invalid-tool counts such as totalTools=12 validTools=5 invalidTools=[{} x7] and totalTools=30 validTools=3 invalidTools=[{} x27].

No prompts, API keys, OAuth credentials, account identifiers, tool inputs, or full session JSONL payloads are included here.

Expected behavior

  • Droid should not crash with a raw .type TypeError when it sees invalid or sparse BYOK stream state.
  • Invalid model/tool/content blocks should be discarded, compacted, or converted into a typed recoverable error.
  • If the BYOK stream is rejected, the user should see a clear recoverable stream-shape error.
  • Logs should report the offending structural path without exposing prompt/tool content.

Server-side mitigations tried

On the BYOK gateway side, I tested/added mitigations for known stream-shape problems:

  • JSON-mode guard for default web_search;
  • Responses tool_choice compatibility;
  • top-level stream error envelopes;
  • malformed output-item guards;
  • function_call.call_id normalization;
  • canonical Responses stream mode with dense local output_index values.

Dense canonical indexes reduced/avoided one observed sparse-index crash path in fresh smoke testing, but Droid should still handle invalid BYOK stream shapes gracefully instead of throwing f.type / E.type.

Separate related symptom

A later image-generation attempt spun in a no-visible-output loop, but current evidence did not show a real image_generation_call invocation. I am treating that as a separate session-runner/no-visible-output issue unless it reproduces with a clear image-generation stream event.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions