Skip to content

experimental/1.1.6#13

Merged
jolovicdev merged 4 commits intomasterfrom
experimental/1.1.6
Feb 13, 2026
Merged

experimental/1.1.6#13
jolovicdev merged 4 commits intomasterfrom
experimental/1.1.6

Conversation

@jolovicdev
Copy link
Copy Markdown
Owner

@jolovicdev jolovicdev commented Feb 13, 2026

Summary

This PR ships experimental/1.1.6 and includes the earlier multimodality foundation commit:

  • 4d26a1daed951927f3d875f796d9f1bf427475aa (feat: add multimodal support and image generation tools)

On top of that base, this PR hardens streaming/tool parsing and multimodal/image payload behavior,
and bumps package metadata to 1.1.6.

What changed

  • Enabled/kept tool-turn streaming support and hardened streamed tool-call assembly.
  • Fixed streamed tool-call parsing edge cases:
  • Prevented position-key collisions across parallel streamed tool calls.
  • Restored message.tool_calls fallback when delta.tool_calls is empty.
  • Fixed mixed delta+message argument duplication (no more concatenated JSON like }{ / duplicate
    object append).
  • Added fallback to non-stream completion when adapter/provider does not support stream=True for
    tool-enabled turns.
  • Kept structured schema path strict by default; preview streaming remains opt-in via
    structured_stream_mode="preview".
  • Fixed multimodal input detection so generic typed dict lists (e.g. {"type":"event"}) are JSON-
    serialized instead of misclassified as multimodal blocks.
  • Fixed image tool content safety:
  • Redacts data:image/... URLs in ToolResult.content.
  • Redacts b64_json in ToolResult.content.
  • Preserves full payload in ToolResult.data.
  • Updated docs (configuration, desk, worker, events, core-types) for multimodal + tool
    streaming + structured preview behavior.
  • Version bump + lock refresh:
  • pyproject.toml: 1.1.6
  • uv.lock updated via uv sync

Compatibility

This is intended as a non-breaking hardening/QoL release from 1.1.5:

  • No mandatory new params.
  • Existing defaults preserved.
  • Changes mainly correct previously buggy edge behavior (stream parsing, multimodal
    misclassification, oversized image tool content).

Verification

  • Local checks: ruff, mypy, pytest coverage added for each regression path.
  • Full suite reported green (177 passed).
  • Live model probes executed against:
  • deepseek/deepseek-chat
  • openrouter/z-ai/glm-5
  • openrouter/minimax/minimax-m2.5
  • Live image roundtrip probe executed with:
  • generation: openrouter/google/gemini-3-pro-image-preview
  • understanding: openrouter/google/gemini-3-flash-preview

@jolovicdev jolovicdev self-assigned this Feb 13, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 53e4472948

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +64 to +66
content = _value(message, "content")
if "url" not in result and isinstance(content, str) and content.startswith("data:image/"):
result["url"] = content
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Parse image URLs from list-based chat content

_extract_chat_image_response only extracts image data from message.images or a string message.content, so the chat-completion fallback returns {} when providers send images in OpenAI-style content blocks (for example, message.content as a list containing an image_url block). In that case generate_image/agenerate_image can report a successful tool call with an empty payload even though the model returned an image, which breaks image generation on compatible providers that use block-based content.

Useful? React with 👍 / 👎.

Comment thread src/blackgeorge/worker_context.py Outdated
Comment on lines +84 to +85
if isinstance(part, dict) and part.get("type") == "text"
]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include input_text blocks when building context summaries

message_summary_text only keeps block text when part.get("type") == "text", but this commit also accepts multimodal input_text blocks in render_input; when context-window summarization runs, those messages are reduced to [multimodal message] and lose the user’s actual text instructions. That can materially degrade retry behavior after context-limit errors because summaries omit key prompt content.

Useful? React with 👍 / 👎.

@jolovicdev jolovicdev merged commit b817e45 into master Feb 13, 2026
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.

1 participant