Skip to content

Vision describer eligibility ignores operator modelCapabilities on native rows #4501

Closed

Description

@lidge-jun

Client or integration

Direct HTTP/API client

Area

Catalog / models

Summary

ocx provider edit … --model <id> --text-only writes modelCapabilities[id].inputModalities = ["text"], and the inbound consumer path (isModelTextOnly) honors it, but the describer-selection path does not: modelAcceptsImageInputWithCache (src/vision/eligibility.ts:159 at eb81eaa) calls isModelVisionSidecarConsumer with an object literal that omits modelCapabilities, then falls through to nativeInputModalities(id) ?? true. A native/OpenAI-catalog model the operator declared blind can still be selected as the vision-sidecar describer while inbound requests to it are correctly diverted.

Reproduction

  1. Declare a native model text-only: ocx provider edit openai --model <native-slug> --text-only
  2. Trigger a request that needs a vision sidecar describer.
  3. Observe the declared-blind native model remains eligible as describer (returns advertisesImageInput(nativeInputModalities(id)) ?? true), contradicting the explicit declaration.

Found by the 2.53.0 release regression audit (lane03, commit d5d03f8). Synthesis disposition: follow-up issue — 2.52.0 had no modelCapabilities overlay and noVisionModels still disqualifies, so this is not a release blocker. Workaround: use noVisionModels.

Version

dev @ eb81eaa (post-2.52.0, pre-2.53.0)

Operating system

macOS (any; codepath is platform-independent)

Provider and model

any native/OpenAI-catalog model declared text-only

Logs or error output

N/A

Screenshots and supporting files

N/A — evidence is source-level, cited inline.

Redacted configuration

providers.

.modelCapabilities..inputModalities = ["text"]

Checks

  • I searched existing issues and documentation.
  • I removed secrets, tokens, account details, request credentials, and personal data.

Activity

  1. lidge-jun commented on Sep 13, 2026

    @lidge-jun
    OwnerAuthor

    리뷰 · 우선순위 58 / 80

    설명
    이 이슈는 운영자가 ocx provider edit … --model <id> --text-only로 modelCapabilities[id].inputModalities = ["text"]를 넣었을 때, 인바운드 소비 경로(isModelTextOnly)는 지키는데 비전 사이드카 설명자(describer) 선정 경로는 무시하는 불일치다. src/vision/eligibility.ts의 modelAcceptsImageInputWithCache는 네이티브/OpenAI 카탈로그 후보에서 isModelVisionSidecarConsumer를 호출할 때 noVisionModels와 modelInputModalities만 넘기고 modelCapabilities를 빼먹는다. 그다음 nativeInputModalities(id) ?? true로 떨어져, 카탈로그상 이미지를 받는 네이티브 모델은 운영자 선언과 달리 설명자로 남는다. 인바운드 요청은 text-only로 우회되는데 설명자 풀에는 남는 모순이다.

    HEAD에서도 같은 모양이다. isModelVisionSidecarConsumer 시그니처는 이미 modelCapabilities를 받을 수 있고, 비네이티브 분기에서는 provider.modelCapabilities를 본다. 네이티브 조기 분기만 객체 리터럴에서 필드를 빠뜨린다. 2.52.0에는 modelCapabilities 오버레이가 없었고 noVisionModels로는 여전히 탈락시킬 수 있어 릴리스 블로커는 아니라고 본문에 적혀 있다. 워크어라운드는 noVisionModels에 넣는 것이다.

    지금 tip에는 #4500으로 1파티 deepseek-flash가 네이티브 멀티모달로 올라와 있어, “네이티브이면서 운영자가 text-only로 덮는” 조합이 더 자주 생길 수 있다. 그래서 이 한 줄 누락의 표면이 넓어진다. 수정은 enriched provider에서 capabilities를 같이 넘기면 되고, --text-only 회귀 테스트 하나로 잠글 수 있다. types/config 분할과 무관하다.

    우선순위 58은 운영자 선언과 런타임 선정이 어긋나는 실제 버그이지만, 기본 설치보다 커스텀 text-only 네이티브 행에서만 드러나고 우회가 명확해서다.

    라인 문제
    src/vision/eligibility.ts modelAcceptsImageInputWithCache 네이티브 분기 - isModelVisionSidecarConsumer({ noVisionModels, modelInputModalities })에 modelCapabilities 누락.
    src/vision/eligibility.ts isModelVisionSidecarConsumer - 시그니처는 capabilities를 받는데 네이티브 호출부가 안 넘김.
    심볼 ocx provider edit --text-only / isModelTextOnly - 인바운드는 지키는데 describer eligibility만 무시.
    심볼 noVisionModels 워크어라운드 - 동작하지만 capabilities SSOT와 이중 진실이 된다.

    메인테이너의 판단이 필요한 지점

    • 네이티브 분기도 비네이티브와 같이 enriched provider 전체를 넘길지, capabilities만 추가할지.
    • text-only 네이티브가 설명자에서 빠질 때 사이드카 소비자로 볼지, “이미지 비수신”으로만 볼지(라우팅 의미).

    너의 추천
    네이티브 분기에서 isModelVisionSidecarConsumer에 modelCapabilities를 포함해 넘기고, --text-only 네이티브가 설명자 후보에서 빠지는 단위 테스트를 추가하는 PR을 열자. 문서에 noVisionModels와 capabilities 중 무엇을 SSOT로 볼지 한 문장 적으면 좋다.

    이 댓글은 grok-bot이 작성했습니다

  2. lidge-jun commented on Sep 13, 2026

    @lidge-jun
    OwnerAuthor

    Landed via #4511 at 10d61fc

    dev now honors operator modelCapabilities inputModalities on native rows in src/vision/eligibility.ts, so text-only native declarations no longer fall through to vision-true.

    이 댓글은 grok-bot이 작성했습니다

  3. lidge-jun commented on Sep 13, 2026

    @lidge-jun
    OwnerAuthor

    Fixed on dev by #4511 (10d61fc).

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

    bugSomething isn't workingcatalogModel catalog, slugs, visibility, routed entrieslanded-via-maintainerOriginal PR closed after landing via a maintainer merge train

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions