Skip to content

feat: add image support#1737

Merged
mike-inkeep merged 16 commits intomainfrom
feat/image-support
Feb 14, 2026
Merged

feat: add image support#1737
mike-inkeep merged 16 commits intomainfrom
feat/image-support

Conversation

@mike-inkeep
Copy link
Contributor

  • Add image handling support (without persistence to conversation history)
  • Tweak image URL schema and tighten up tests

@vercel
Copy link

vercel bot commented Feb 5, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agents-api Ready Ready Preview, Comment Feb 14, 2026 2:43am
agents-manage-ui Ready Ready Preview, Comment Feb 14, 2026 2:43am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
agents-docs Skipped Skipped Feb 14, 2026 2:43am

Request Review

@changeset-bot
Copy link

changeset-bot bot commented Feb 5, 2026

⚠️ No Changeset found

Latest commit: 633f5c0

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Comment on lines 25 to 33
export const isImageContentItem = (
item: ContentItem
): item is { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } } => {
return (
item.type === 'image_url' &&
'image_url' in item &&
imageUrlSchema.safeParse(item.image_url?.url).success
);
};
Copy link
Contributor

Choose a reason for hiding this comment

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

MAJOR Type guard uses inline type instead of imported ImageContentItem

The type predicate re-declares the type inline instead of using the imported ImageContentItem type from ../types/chat. This creates maintenance risk if the type changes.

Suggested change
export const isImageContentItem = (
item: ContentItem
): item is { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } } => {
return (
item.type === 'image_url' &&
'image_url' in item &&
imageUrlSchema.safeParse(item.image_url?.url).success
);
};
export const isImageContentItem = (
item: ContentItem
): item is ImageContentItem => {
return (
item.type === 'image_url' &&
'image_url' in item &&
item.image_url != null &&
imageUrlSchema.safeParse(item.image_url.url).success
);
};

nick-inkeep added a commit that referenced this pull request Feb 6, 2026
Pattern extracted from PR #1737 human reviewer feedback (amikofalvy):
- Types should derive from Zod schemas using z.infer<typeof schema>
- Use Pick/Omit/Partial instead of manually redefining type subsets
- Extract shared enum/union schemas instead of inline string literals

Changes:
- pr-review-types.md: New anti-pattern + analysis step 6 with detection patterns
- pr-review-consistency.md: Extended "Reuse" section to cover types

This demonstrates the closed-pr-review-auto-improver output — these are
the exact changes the agent proposed when run against PR #1737.

Co-Authored-By: Claude <noreply@anthropic.com>
nick-inkeep added a commit that referenced this pull request Feb 6, 2026
Patterns extracted from human reviewer feedback:
- Type Definition Discipline: use z.infer<> instead of manual type definitions
- Type Composition Safety: discriminated unions for mutually exclusive states

Co-Authored-By: Claude <noreply@anthropic.com>
nick-inkeep added a commit that referenced this pull request Feb 6, 2026
- Add manual trigger with pr_number input
- Add Get PR Metadata step to fetch data via API (works for both triggers)
- Update all PR references to use the new metadata outputs
- Enables testing against historical PRs like #1737

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
nick-inkeep added a commit that referenced this pull request Feb 6, 2026
* feat: Add closed-pr-review-auto-improver agent

Automated system that analyzes human reviewer feedback after PRs are merged
to identify generalizable improvements for the pr-review-* subagent system.

- Workflow triggers on merged PRs, extracts human/bot comments
- Agent applies 4-criteria generalizability test
- Creates draft PRs with improvements to pr-review-*.md files

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add context-gathering phase for deeper comment analysis

- Include diffHunk in GraphQL query (shows code each comment is on)
- Add Phase 2 "Deep-Dive on Promising Comments" with explicit guidance:
  - Read the full file to understand broader context
  - Grep for schemas/types/patterns mentioned in comments
  - Understand the anti-pattern before judging generalizability
- Update Tool Policy to emphasize context gathering
- Renumber phases (now 6 phases total)

The agent now actively investigates each comment rather than
judging based on comment text alone.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: Apply write-agent best practices

Based on write-agent skill guidance:

1. Add near-miss example (questions/discussions ≠ reviewer feedback)
2. Strengthen Role & Mission - describe what "excellence looks like"
3. Failure modes now use contrastive examples (❌ vs ✅)
4. Phase 2 now checklist format with stop condition
5. Example shows completed checklist, not just steps

Key insight: "Stop here if you can't articulate a clear principle"
prevents vague improvements from polluting reviewers.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add git time-travel for progressive context gathering

- Phase 2 now uses git rev-list + git show to see code at comment time
- Progressive gathering: diffHunk → full file → PR diff → other files
- GraphQL query now includes createdAt for all comment types
- Added git rev-list and git show to allowedTools

This ensures the agent sees what the human reviewer saw, not the
final merged state which may have fixes applied.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: Add explicit stop conditions for context gathering

Two exit paths at each level:
- EXIT A: Not generalizable (repo-specific, one-off bug, style preference)
- EXIT B: Pattern found (can articulate anti-pattern + universal principle)

Includes decision flow diagram and two contrasting examples showing
early exit (repo-specific DateUtils) vs pattern discovery (type/schema DRY).

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: Strengthen agent per write-agent best practices

- Role & Mission: Add "what the best human analyst would do" section
- Failure modes: Add "Asserting when uncertain" with contrastive example
- Generalizability: Add confidence calibration guidance
- Add explicit conservative default: "when torn, choose lower confidence"

Per write-agent skill review: personality should describe best human
behavior, failure modes should include asserting when uncertain
(relevant for classification tasks).

Co-Authored-By: Claude <noreply@anthropic.com>

* pr-review: Add Schema-Type Derivation Discipline learnings

Pattern extracted from PR #1737 human reviewer feedback (amikofalvy):
- Types should derive from Zod schemas using z.infer<typeof schema>
- Use Pick/Omit/Partial instead of manually redefining type subsets
- Extract shared enum/union schemas instead of inline string literals

Changes:
- pr-review-types.md: New anti-pattern + analysis step 6 with detection patterns
- pr-review-consistency.md: Extended "Reuse" section to cover types

This demonstrates the closed-pr-review-auto-improver output — these are
the exact changes the agent proposed when run against PR #1737.

Co-Authored-By: Claude <noreply@anthropic.com>

* pr-review: Expand type derivation sources

Extended "Schema-Type Derivation Discipline" to cover full spectrum:
- Zod/validation schemas (z.infer)
- Database schemas (Prisma, Drizzle generated types)
- Internal packages (@inkeep/*, shared types)
- External packages/SDKs (OpenAI, Vercel AI SDK)
- Function signatures (Parameters<>, ReturnType<>)
- Existing domain types (Pick, Omit, Partial)

Added table format for clarity and comprehensive detection patterns.

Co-Authored-By: Claude <noreply@anthropic.com>

* pr-review: Add advanced type derivation patterns from codebase research

Expanded type derivation guidance based on actual patterns found in agents repo:
- Awaited<ReturnType<>> for async function returns
- keyof typeof for constants-derived types
- interface extends and intersection (&) for composition
- Discriminated unions with type guards
- satisfies operator for type-safe constants
- Re-exports for API surface boundaries
- Type duplication detection signals

Patterns sourced from agents-api codebase analysis including:
- env.ts, middleware/*, types/app.ts, domains/run/*

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* pr-review: Add Zod schema composition patterns

Added guidance for Zod schema extension/derivation patterns based on
codebase research (packages/agents-core/src/validation/schemas.ts):

- .extend() for adding/overriding fields
- .pick()/.omit() for field subsetting
- .partial() for Insert → Update schema derivation
- .extend().refine() for cross-field validation
- Anti-patterns: parallel schemas, duplicated fields

Examples from codebase:
- SubAgentInsertSchema.extend({ id: ResourceIdSchema })
- SubAgentUpdateSchema = SubAgentInsertSchema.partial()
- StopWhenSchema.pick({ transferCountIs: true })

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* pr-review: Rationalize scope between types and consistency agents

Clear separation of concerns:
- pr-review-types: Illegal states, invariants, unsafe narrowing
- pr-review-consistency: DRY, schema reuse, convention conformance

Moved to consistency:
- Zod schema composition patterns (.extend, .pick, .partial)
- Type derivation detection signals
- satisfies operator, re-exports conventions

Kept in types (type safety focus):
- Discriminated unions vs optional fields (prevents illegal states)
- Type guards vs unsafe `as` assertions
- Detection of union types without discriminants

Added cross-reference note in types agent pointing to consistency
for derivation/DRY concerns.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* closed-pr-review-auto-improver: Add exit states, skills integration, and Phase 5.5

- Add skills: pr-review-subagents-available, pr-review-subagents-guidelines, find-similar-patterns
- Add proper exit states at Phase 1, 2, and 4 (embedded in workflow, not separate section)
- Add Phase 5 step 2: "Find examples of the pattern" with judgment guidance
- Add Phase 5.5: Full file review & integration planning (scope fit, duplication check)
- Update output contract with detailed JSON structure and exit examples
- Add reviewer tagging to close the feedback loop

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* closed-pr-review-auto-improver: Add "keep agents standalone" guidance

Agents should be self-contained without cross-references to other agents.
This prevents coupling and ensures agents work correctly when read in isolation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Recover lost skills: find-similar-patterns, pr-review-subagents-*

These skills were created in the previous session but never committed.
Recovered from conversation history.

- find-similar-patterns: Methodology for finding similar code patterns
- pr-review-subagents-available: Catalog of pr-review-* agents with scope boundaries
- pr-review-subagents-guidelines: Best practices for writing/improving reviewers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Remove pr-review-* changes (moved to separate PR #1759)

The pr-review-consistency.md and pr-review-types.md improvements belong
in PR #1759, not this auto-improver feature branch.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: Move auto-improver to private plugin repo

Move agent and skills to inkeep/internal-cc-plugins for CI/CD-only loading:
- Removed: .claude/agents/closed-pr-review-auto-improver.md
- Removed: .agents/skills/{find-similar-patterns,pr-review-subagents-available,pr-review-subagents-guidelines}/

Updated workflow:
- Added step to clone inkeep/internal-cc-plugins
- Added --plugin-dir flag to load agent from plugin

Prerequisites before merging:
1. Create private repo: inkeep/internal-cc-plugins
2. Push plugin content to new repo
3. Add GH_PAT_PLUGINS secret to inkeep/agents

Co-Authored-By: Claude <noreply@anthropic.com>

* Switch from PAT to GitHub App for cross-repo auth

GitHub Apps provide better security and maintainability:
- 8-hour token lifetime (vs days/infinite for PATs)
- No user account dependency (survives personnel changes)
- Zero manual rotation (tokens generated fresh each run)
- Scales to N plugins without additional credentials

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add workflow_dispatch trigger for testing historical PRs

- Add manual trigger with pr_number input
- Add Get PR Metadata step to fetch data via API (works for both triggers)
- Update all PR references to use the new metadata outputs
- Enables testing against historical PRs like #1737

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Address PR review feedback: robustness improvements

Fixes from Claude Code review:

1. Add merge validation for workflow_dispatch (Major)
   - Prevents analyzing unmerged PRs via manual trigger
   - Validates PR is merged before proceeding

2. Use unique HEREDOC delimiters (Major)
   - Prevents collision if PR body/comments contain "EOF"
   - Uses unique suffixes like __BODY_DELIM_7f3a9b2c__

3. Pin claude-code-action to SHA (Major)
   - Aligns with claude-code-review.yml for consistency
   - Tracks issue #892 for AJV validation bug

4. Add concurrency control (Minor)
   - Prevents race conditions on concurrent runs
   - Groups by PR number, doesn't cancel in-progress

5. Add shell error handling (Minor)
   - set -eo pipefail in all shell blocks
   - Fail fast on command errors

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add debug artifact upload for troubleshooting

Uploads execution logs when workflow fails, matching pattern
from claude-code-review.yml. 7-day retention.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
nick-inkeep added a commit that referenced this pull request Feb 6, 2026
* pr-review: Add type derivation and composition patterns from PR #1737

Patterns extracted from human reviewer feedback:
- Type Definition Discipline: use z.infer<> instead of manual type definitions
- Type Composition Safety: discriminated unions for mutually exclusive states

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: Remove cross-agent references to keep agents standalone

Agents should be self-contained without referencing what other agents do.
- pr-review-consistency: Remove "→ see pr-review-types" reference
- pr-review-types: Change "reviewed by pr-review-consistency" to "out of scope"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
@miles-kt-inkeep
Copy link
Contributor

@inkeep docs updates?

inkeep bot added a commit that referenced this pull request Feb 6, 2026
Document file parts format for the A2A protocol, including:
- Text parts format
- File parts with URL reference
- File parts with base64-encoded data
- Supported image formats (PNG, JPEG, WebP)

Related to PR #1737 which adds image handling support.
Copy link
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

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

PR Review Summary

3 Key Findings | Risk: Medium

🟠⚠️ Major (3) 🟠⚠️

🟠 1) message-parts.ts Missing dedicated unit tests for new utility module

files: agents-api/src/domains/run/utils/message-parts.ts

Issue: The new message-parts.ts utility module (149 lines) exports 3 critical functions (extractTextFromParts, getMessagePartsFromOpenAIContent, getMessagePartsFromVercelContent) with zero dedicated unit tests. These functions handle content format conversion between OpenAI/Vercel formats and the internal A2A Part[] format, including URL validation, data URI parsing, and error logging for dropped parts.

Why: This has been flagged in multiple prior reviews but remains unaddressed. Without direct unit tests, several failure modes could go undetected: malformed base64 data passing validation, invalid URIs not being rejected, and valid content being silently dropped. Per AGENTS.md, all new features require comprehensive unit tests. The codebase has a consistent pattern of utility tests (see model-resolver.test.ts, stream-helpers.test.ts).

Fix: Create agents-api/src/__tests__/run/utils/message-parts.test.ts with test suites for:

  • extractTextFromParts: empty arrays, single text part, multiple text parts joined with space, mixed part types
  • getMessagePartsFromOpenAIContent: string input, array input, mixed valid/invalid content logged and dropped
  • getMessagePartsFromVercelContent: backwards-compat string content, parts array, invalid parts logged and dropped
  • buildFilePart (internal but critical): HTTP URLs, data URIs, invalid URIs throw

Refs:


🟠 2) chatDataStream.ts:56 Schema uses z.any() for content field

files: agents-api/src/domains/run/routes/chatDataStream.ts:56

Issue: The message schema uses content: z.any() which allows arbitrary data to pass validation, bypassing type safety. While parts is validated separately, the content field accepts any value, allowing illegal states like { content: 123, parts: [...] } to reach the handler.

Why: Any value can be passed as content and will pass Zod validation. While the code handles typeof content === 'string' as a backwards-compatibility path, other invalid content types could cause runtime errors. This was also noted by @amikofalvy referencing PR #1789 for schema reuse.

Fix: Replace z.any() with a proper union that captures the valid states:

content: z.union([z.string(), z.undefined()]).optional(),

The actual content extraction happens from parts, and content is only used for backwards-compatibility string mode.

Refs:


🟠 3) scope: documentation Missing documentation for image support feature

scope: Documentation Site, API Reference

Issue: This PR adds image support to both chat API endpoints but no customer-facing documentation was updated. The OpenAPI schema now includes image_url content types (for OpenAI-compatible endpoint) and image parts (for Vercel data stream endpoint), but the existing Chat API guide at agents-docs/content/talk-to-your-agents/chat-api.mdx only documents text-only message content.

Why: Developers integrating with the chat APIs will not know they can send images. The current Request Body Schema example shows only {"content": "Hello!"}. Users wanting to build vision/multimodal features will miss this capability or send incorrectly formatted requests. The @miles-kt-inkeep comment asking about docs updates remains unaddressed.

Fix: Update agents-docs/content/talk-to-your-agents/chat-api.mdx to document:

  1. Supported formats: PNG, JPEG, WebP (NOT GIF per team decision)
  2. Examples for both endpoint formats (OpenAI image_url vs Vercel image)
  3. detail parameter: Only affects OpenAI-compatible providers
  4. Limitations: Images are not persisted to conversation history

Refs:

🟡 Minor (1) 🟡

  • 🟡 Minor: message-parts.ts:14-18 Type guard uses inline type instead of imported TextContentItem

💭 Consider (1) 💭

  • 💭 Consider: message-parts.ts:29-37 Use z.discriminatedUnion() for better error messages

🕐 Pending Recommendations (1)


💡 APPROVE WITH SUGGESTIONS

Summary: This PR introduces well-architected image support with proper URL validation, format transformation between OpenAI/Vercel/A2A protocols, and solid AI SDK integration. The previous review feedback regarding type guards, null checks, and URL validation has been addressed in the latest commits. The core implementation is sound and follows existing patterns.

The remaining gaps are: (1) missing unit tests for the new message-parts.ts utility module (repeatedly flagged), (2) the permissive z.any() schema for content, and (3) missing documentation for customers. Recommend addressing these before or shortly after merge to maintain the codebase's testing standards and ensure customers can discover and correctly use this new capability.


Discarded (8)
Location Issue Reason Discarded
Agent.ts:93-104 Local AI SDK types duplicate Vercel SDK types Low confidence; may be intentional to avoid coupling to experimental SDK APIs
chatDataStream.ts:65-66 text field for image URL unconventional naming Intentional — matches Vercel AI SDK v5 conventions
chat.ts:329-340 Images not persisted to conversation history Intentional per PR description — working as designed
chat.ts:8-20 GIF rejection inconsistent between URL and data URI Design decision deferred pending frontend capability exposure
message-parts.ts:105-110 Dropped content warning not actionable Low priority nitpick; current logging is functional
Agent.test.ts:12 Test helper naming Positive feedback — follows requested convention
Agent.test.ts:1831 Missing tests for all detail values Low confidence; existing tests cover the mechanism
message-parts.ts:79-84 Function naming inconsistency (extract vs get) Developer preference; both patterns exist in codebase
Reviewers (6)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
pr-review-standards 0 0 0 0 0 0 0
pr-review-consistency 6 0 1 0 1 0 4
pr-review-types 4 1 0 0 0 0 3
pr-review-tests 3 1 0 0 0 0 2
pr-review-product 5 0 0 0 0 1 4
pr-review-docs 1 1 0 0 0 0 0
Total 19 3 1 0 2 1 13

Comment on lines +14 to +18
const isTextContentItem = (
item: ContentItem
): item is { type: 'text'; text: string } & ContentItem => {
return item.type === 'text' && 'text' in item && typeof item.text === 'string';
};
Copy link
Contributor

Choose a reason for hiding this comment

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

🟡 MINOR: Type guard uses inline type instead of imported TextContentItem

Issue: The type predicate uses an inline intersection type { type: 'text'; text: string } & ContentItem instead of the exported TextContentItem type from ../types/chat.

Why: This creates inconsistency with isImageContentItem (lines 20-27) which correctly uses the imported ImageContentItem type. If TextContentItem changes, this guard won't be updated, creating maintenance risk.

Fix: (1-click apply)

Suggested change
const isTextContentItem = (
item: ContentItem
): item is { type: 'text'; text: string } & ContentItem => {
return item.type === 'text' && 'text' in item && typeof item.text === 'string';
};
const isTextContentItem = (item: ContentItem): item is TextContentItem => {
return item.type === 'text' && 'text' in item && typeof item.text === 'string';
};

Refs:

Comment on lines +29 to +37
const textContentPartSchema = z.object({
type: z.literal('text'),
text: z.string(),
});
const imageContentPartSchema = z.object({
type: z.literal('image'),
text: ImageUrlSchema,
});
const vercelMessageContentPartSchema = z.union([textContentPartSchema, imageContentPartSchema]);
Copy link
Contributor

Choose a reason for hiding this comment

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

💭 Consider: Use z.discriminatedUnion() for better error messages

Issue: The vercelMessageContentPartSchema uses z.union() instead of z.discriminatedUnion() on the type field.

Why: With z.union(), when validation fails, Zod attempts both branches and reports combined errors, which can be confusing. With discriminatedUnion, Zod immediately knows which branch to validate based on the type field, producing clearer error messages.

Fix:

const vercelMessageContentPartSchema = z.discriminatedUnion('type', [
  textContentPartSchema,
  imageContentPartSchema,
]);

Refs:

@github-actions github-actions bot deleted a comment from claude bot Feb 10, 2026
Copy link
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

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

PR Review Summary

0 New Findings | Risk: Medium (unchanged from prior review)

Delta Analysis

This re-review was triggered by commit 1da57327 — a merge from main into the feature branch. The merge brought in unrelated changes (primarily SchemaProcessor for JSON schema normalization from PR #1915).

The image support code is unchanged since the previous review. All 9 PR files have no diff in the delta:

  • message-parts.ts — unchanged
  • chat.ts, chatDataStream.ts — unchanged
  • types/chat.ts — unchanged
  • Agent.ts — only change is an unrelated SchemaProcessor import
  • Test files — unchanged

🕐 Pending Recommendations (3)

The following issues from the prior review remain unaddressed:

Additionally, there are active inline suggestions that could be applied:


💡 APPROVE WITH SUGGESTIONS

Summary: The image support implementation is solid and well-architected. The core functionality is working correctly with proper URL validation, format transformation between OpenAI/Vercel/A2A protocols, and AI SDK integration. However, the three major items from the prior review (unit tests, schema safety, documentation) remain unaddressed. These are important for maintainability and discoverability of this new capability. Recommend addressing before or shortly after merge.


Discarded (0)

No new findings to discard — delta contained no substantive changes to review.

Reviewers (0)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
Total 0 0 0 0 0 3 0

Note: No reviewers dispatched — delta analysis determined the image support code is unchanged since the prior review. This re-review surfaces pending recommendations only.

Copy link
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

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

PR Review Summary

0 New Findings | Risk: Medium (unchanged from prior review)

Delta Analysis

This re-review was triggered by commit 5b5789f6 — a merge from main into the feature branch. The delta contains:

File Change Relevance
.changeset/fix-monaco-layout-flickering.md New changeset ❌ Unrelated
agents-manage-ui/src/components/editors/monaco-editor.tsx automaticLayout: false ❌ Unrelated

The image support code is unchanged since the previous review. All 9 PR files (message-parts.ts, chat.ts, chatDataStream.ts, types/chat.ts, Agent.ts, generateTaskHandler.ts, test files) have no modifications in the delta.

🕐 Pending Recommendations (5)

The following issues from prior reviews remain unaddressed:

From Previous Review Summary:

  • 🟠 message-parts.ts — Missing dedicated unit tests for new utility module (149 lines, 3 exported functions). Per AGENTS.md: "ALL new work MUST include comprehensive unit tests."
  • 🟠 chatDataStream.ts:56 — Schema uses z.any() for content field, bypassing type safety
  • 🟠 scope: documentation — Missing documentation for image support feature (also flagged by @miles-kt-inkeep)

Active Inline Suggestions:

From Human Reviewers:


💡 APPROVE WITH SUGGESTIONS

Summary: The image support implementation is solid and well-architected. The core functionality provides proper URL validation, format transformation between OpenAI/Vercel/A2A protocols, and clean AI SDK integration. The delta since the last review contains only unrelated Monaco editor changes — the image support code is unchanged.

However, the three major items flagged in prior reviews remain unaddressed:

  1. Unit testsmessage-parts.ts (149 lines, 3 exported functions) has no dedicated test file
  2. Schema safetyz.any() on line 56 of chatDataStream.ts bypasses type validation
  3. Documentation — Customers have no guidance on how to use this new image capability

Recommend addressing these before or shortly after merge to maintain codebase standards and ensure customers can discover and correctly use this feature. 🎉


Discarded (0)

No new findings to discard — delta contained no substantive changes to review.

Reviewers (7)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
pr-review-standards 0 0 0 0 0 0 0
pr-review-consistency 0 0 0 0 0 0 0
pr-review-tests 0 0 0 0 0 1 0
pr-review-types 0 0 0 0 0 2 0
pr-review-docs 1 0 0 0 0 1 0
pr-review-product 0 0 0 0 0 0 0
pr-review-llm 0 0 0 0 0 0 0
Total 1 0 0 0 0 5 0

Note: All reviewers correctly identified that the delta contains no image support code changes. Pending recommendations reference prior review findings.

@github-actions github-actions bot deleted a comment from claude bot Feb 11, 2026
Copy link
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

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

PR Review Summary

0 New Findings | Risk: Low (unchanged from prior review, human-approved)

Delta Analysis

This re-review was triggered by commit 99b224e3 — a merge from main into the feature branch. The delta (58 commits, 458 files) brings in unrelated features from main:

Feature Files Changed Relevance to Image Support
Skills integration Agent.ts, PromptConfig.ts ❌ Unrelated
Error unwrapping Agent.ts ❌ Unrelated
Telemetry flush chat.ts, chatDataStream.ts ❌ Unrelated
Slack Work App Multiple packages ❌ Unrelated
Scheduled triggers New routes/services ❌ Unrelated

The image support code is unchanged since the previous review:

  • message-parts.ts — unchanged
  • types/chat.ts — unchanged
  • Image handling in Agent.ts — unchanged
  • Test coverage — unchanged

🕐 Pending Recommendations (3)

The following items from prior reviews remain unaddressed. These are noted for visibility but do not block merge given the human approval:

Severity Location Issue Prior Reference
🟠 Major message-parts.ts Missing dedicated unit tests for new utility module (149 lines, 3 exported functions) Prior review
🟠 Major chatDataStream.ts:57 Schema uses z.any() for content field — bypasses type safety Prior review
🟠 Major scope: documentation Missing documentation for image support feature @miles-kt-inkeep comment

Active Inline Suggestions (2)

These suggestions from prior reviews can still be applied:


✅ APPROVE

Summary: The image support implementation is solid and well-architected — it provides proper URL validation, format transformation between OpenAI/Vercel/A2A protocols, and clean AI SDK integration. The delta since the last review contains only unrelated merges from main (Skills, Slack Work App, telemetry, etc.) with no changes to the image support code.

Aligning with @amikofalvy's approval. The pending recommendations (unit tests, schema safety, documentation) are noted for potential follow-up but do not block this feature from shipping. 🎉


Discarded (0)

No new findings to discard — delta contained no substantive changes to the image support implementation.

Reviewers (0)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
Total 0 0 0 0 0 3 0

Note: No reviewers dispatched — delta analysis determined the image support code is unchanged since the prior review. This re-review surfaces pending recommendations only.

@github-actions github-actions bot deleted a comment from claude bot Feb 13, 2026
@vercel vercel bot temporarily deployed to Preview – agents-docs February 14, 2026 02:40 Inactive
Copy link
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

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

PR Review Summary

(0) New Issues | Risk: Low (unchanged from prior review, human-approved)

Delta Analysis

This re-review was triggered by commit 633f5c07 — a cleanup commit for generateTaskHandler.ts. The delta contains:

File Change Assessment
generateTaskHandler.ts Removed duplicate data part extraction logic (now handled by Agent.generate()); improved error message ✅ Good cleanup
generateTaskHandler.test.ts Updated expected error message assertion ✅ Test updated correctly

Changes in this delta:

  1. Removed DataPart import — No longer needed since data extraction moved to Agent.ts
  2. Simplified validation logic — Error condition now checks !textParts.trim() && !hasImages && !hasData which is cleaner and more accurate
  3. Improved error message — Changed from "No text content found in task input" to "No content found in task input" (reflects that images and data are now valid input types)
  4. Reused computed variables — Uses hasData and hasImages in logging instead of recalculating

This is a well-scoped cleanup that removes code duplication introduced when data part handling was consolidated into Agent.generate().

🕐 Pending Recommendations (3)

The following items from prior reviews remain unaddressed. These are noted for visibility but do not block merge given the human approval:

Severity Location Issue Prior Reference
🟠 Major message-parts.ts Missing dedicated unit tests for new utility module (149 lines, 3 exported functions) Prior review
🟠 Major chatDataStream.ts:57 Schema uses z.any() for content field — bypasses type safety Prior review
🟠 Major scope: documentation Missing documentation for image support feature @miles-kt-inkeep comment

Active Inline Suggestions (2)

These suggestions from prior reviews can still be applied:


✅ APPROVE

Summary: The delta is a clean refactor that removes duplicate data part extraction logic from generateTaskHandler.ts — this code was already consolidated into Agent.generate() in earlier commits. The improved error message ("No content found" instead of "No text content found") correctly reflects that images and data parts are now valid input types. Aligning with @amikofalvy's approval. 🎉

The pending recommendations (unit tests for message-parts.ts, schema safety, documentation) are noted for potential follow-up but do not block this feature from shipping.


Discarded (0)

No new findings to discard — delta is a straightforward cleanup.

Reviewers (0)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
Total 0 0 0 0 0 3 0

Note: No reviewers dispatched — delta analysis determined this is a trivial cleanup commit with no new logic to review. This re-review surfaces pending recommendations only.

@github-actions github-actions bot deleted a comment from claude bot Feb 14, 2026
@mike-inkeep mike-inkeep merged commit 7f6366d into main Feb 14, 2026
10 of 11 checks passed
@mike-inkeep mike-inkeep deleted the feat/image-support branch February 14, 2026 03:03
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.

4 participants