Skip to content

Capture descriptions: support any OpenAI-compatible vision endpoint #4846

Open

Description

@FenjuFu

Problem

hyperframes capture describes downloaded images only through OpenRouter, Vertex or the Gemini API (captionImagesWithGemini in packages/cli/src/capture/contentExtractor.ts). None of them is reliably reachable from mainland China, and none can point at a self-hosted vision model. Users in that position get the catalog-fallback asset-descriptions.md on every capture, even when they already pay for an OpenAI-compatible vision endpoint or run one locally.

Proposed solution

Bring back the three variables from #1809 on current main: HYPERFRAMES_VISION_BASE_URL, HYPERFRAMES_VISION_API_KEY and HYPERFRAMES_VISION_MODEL.

  • All three set: caption through <base>/chat/completions with the OpenAI-style request the OpenRouter branch already sends, ahead of OpenRouter, Vertex and Gemini.
  • Some but not all set: warn naming the missing variables (never echoing values), skip captioning, and report the phase as degraded. Never fall back to another provider.
  • OpenRouter shares the same request helper and keeps its URL, auth header and error text unchanged.
  • postExtractionPhase counts a complete custom endpoint as vision credentials, and the no-credentials hint mentions it.

I have this ready and will open a PR that links here.

Alternatives considered

A named preset per regional provider. Every one of them speaks the same chat-completions wire format, so a single base-URL setting covers them all and also covers local Ollama and vLLM.

Additional context

The #1809 review called the base-URL approach "the right shape" and asked for one fix: setting only some of the variables fell through silently and could caption through Gemini, the provider the user is trying to avoid. That PR was closed for merge conflicts and inactivity, before Vertex support (#3561) landed in the same function.

To check that the request shape works outside OpenRouter, I sent exactly what the OpenRouter branch builds today (one image_url data URI, the storyboard prompt, max_tokens: 500) to iFlytek Astron's Token Plan, an OpenAI-compatible endpoint (https://maas-token-api.cn-huabei-1.xf-yun.com/v2). The image was docs/images/image-thumbnail-evidence/after.png.

Model HTTP finish Caption
xopkimik26 (Kimi-K2.6) 200 stop A dark gray webpage displays white text reading "Timeline JPEG thumbnail resource check" with a horizontal strip of rainbow-colored vertical bars beneath it.
xopqwen35397b (Qwen3.5-397B) 200 stop A dark background displays a horizontal strip of repeating colorful vertical bars labeled "Synthetic JPEG chart" …
xopqwen36v35b (Qwen3.6-35B) 200 stop A dark-background interface displays a narrow, horizontally stretched bar of repeating rainbow-colored vertical stripes …
spark-x2.5 (text-only) 400 invalid request

None of the vision models spent the 500-token budget on reasoning. The text-only row is why the docs should say to choose a model that accepts image input.

Activity

  1. added
    enhancementNew feature or request
    triage/needs-designEvidence is adequate; desired behavior or scope needs a maintainer decision.
    on Oct 10, 2026
  2. miguel-heygen commented on Oct 24, 2026

    @miguel-heygen
    Collaborator

    Thanks for picking this back up and for testing the request shape against a real endpoint. Confirmed on current main: image captioning in capture only reaches OpenRouter, Vertex or the Gemini API, with no way to point it at another OpenAI-compatible endpoint. Your PR #4849 is the place for this. It's waiting on a review from us, and we'll follow up there.

  3. PowerTokens commented on Oct 28, 2026

    @PowerTokens

    Thanks for confirming capture still only reaches OpenRouter / Vertex / Gemini on main, and for pointing at #4849.

    Happy to smoke-test an OpenAI-compatible vision Base URL + key + model id against hyperframes capture once that PR is ready for testers — same Chat Completions shape the OpenRouter branch already uses.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesttriage/needs-designEvidence is adequate; desired behavior or scope needs a maintainer decision.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions