Repository navigation
[Feature]: per-model capability declarations — text-only, context tier, and video processing mode #3377
Description
Activity
- addedenhancementNew feature or requestNew feature or requestproviderProvider adapters, OpenAI-compat presets, upstream API quirksProvider adapters, OpenAI-compat presets, upstream API quirks
on Sep 3, 2026 리뷰 · 우선순위 66 / 80
이 이슈는 모델마다 “이 모델이 실제로 할 수 있는 일”을 OpenCodex가 적어두자는 요청입니다. 지금
dev는 제공자/모델 행에 그 칸이 없어서, 업스트림과 다른 기본값을 조용히 씁니다. 본문이 묶은 세 축은 겉모습이 다릅니다. 텍스트만 받는 모델(#3268), 제미니 에이전틱 비디오(#3271), 깃허브 코파일럿 컨텍스트 티어(#3281). 막힌 층은 같습니다. 설정에 적을 곳이 없습니다.현재
dev경로도 본문과 맞습니다.src/cli/provider.ts의 add 사용법은--default-model까지이고--text-only가 없습니다.src/cli/provider-runtime.ts의 edit도 마찬가지입니다. 이미지를 받는 텍스트-only 모델은 로컬에서 거절되지 않고 업스트림에서 실패합니다. 비디오는src/chat/inbound.ts가 URL만 남기고,src/responses/schema.ts의input_video는video_url문자열만 있습니다.src/adapters/google.ts는 데이터 URL이 아니면[video: …]텍스트 마커로 바꿉니다.processing: "agentic"을 보낼 필드가 없습니다. 코파일럿은src/providers/github-copilot-transport.ts가 헤더와 베이스 URL만 보강하고, 컨텍스트 티어 옵션은 없습니다.흡수된 세 이슈는 닫혀 있습니다. 열린 PR #3282(
feat(provider): add GitHub Copilot context tier)는 이 이슈가 “항목 3만 다루며 대체되지 않는다”고 적었습니다. 그 PR이 티어만 넣고 공통 capability 블록 없이 설정 키를 하나 더 만들면, 나중에 텍스트-only·비디오와 키가 세 갈래가 됩니다. types.ts/config.ts 분할과도 맞닿습니다. 모델 capability 블록을src/types.ts/src/config.ts에 직접 넓히면 분할 캠페인에 치일 수 있으니, 공통 블록 설계를 먼저 정하고 #3282는 그 블록의 첫 필드로 맞추는 편이 낫습니다.세 축을 한 PR에 넣지 않는 것이 맞습니다. 텍스트-only는 CLI 플래그와 로컬 거절, 비디오는 스키마+구글 어댑터, 티어는 코파일럿 전송입니다. 공통점은 설정 모양뿐입니다.
providers.<name>.models.<id>아래에 capability 객체를 하나 두고, 각 PR이 필드 하나씩 채우게 하면 됩니다. 기본값은 오늘처럼 추론을 유지하고, 명시한 값만 업스트림 기본값을 덮어야 기존 제공자가 갑자기 거절되지 않습니다.src/cli/provider.ts/src/cli/provider-runtime.ts---text-only(또는 동등한 모델 플래그)가 없습니다.src/responses/schema.tsinput_video/src/adapters/google.ts비디오 분기 - URL만 남고processing이 없습니다. 비-데이터 URL은 텍스트 마커가 됩니다.src/providers/github-copilot-transport.ts- 컨텍스트 티어를 고를 설정이 없습니다.열린 PR #3282 - 티어만 다루며 이 이슈가 대체하지 않습니다. 공통 블록 없이 키를 하나 더 만들지 않게 맞출 필요가 있습니다.
메인테이너의 판단이 필요한 지점
- capability 블록의 위치(모델 행 vs 제공자 행)와 기본값(미지정 시 오늘 추론 유지).
- #3282를 그 블록의 첫 필드로 리베이스할지, 독립 키로 먼저 머지할지.
- 텍스트-only 거절을 로컬에서 할지, 업스트림 에러를 더 친절하게만 바꿀지.
너의 추천
이 이슈를 열어 두고 공통 모델 capability 모양만 먼저 정하세요. 그다음 텍스트-only, 비디오 processing, 코파일럿 티어를 필드 단위 PR로 나누세요. #3282는 그 블록을 쓰도록 맞추는 것을 권합니다. 흡수된 원본은 다시 열지 마세요.이 댓글은 grok-bot이 작성했습니다
- added 3 commits that reference this issue
on Sep 15, 2026 - added a commit that references this issue
on Sep 19, 2026 - addedpriority: P2Medium: provider/client-specific bug with a workaround, bounded enhancement tied to a tracked issue,Medium: provider/client-specific bug with a workaround, bounded enhancement tied to a tracked issue,
on Sep 24, 2026 devin-ai-integration commented
on Sep 24, 2026 ContributorMore actionsTriage:
priority: P2— per-model capability declarations (several PRs build on it).Criteria (P2): Medium: provider/client-specific bug with a workaround, bounded enhancement tied to a tracked issue, perf, or CI reliability.
Matched pull requests:
- feat(provider): add GitHub Copilot context tier #3282 (related / partial) — feat(provider): add GitHub Copilot context tier [
priority: P3] - feat(google): pass Gemini agentic video through instead of flattening it #4663 (related / partial) — feat(google): pass Gemini agentic video through instead of flattening it [
priority: P2] - feat(combos): enroll text-only members in vision sidecar from the UI #4932 (related / partial) — feat(combos): enroll text-only members in vision sidecar from the UI [
priority: P3]
- feat(provider): add GitHub Copilot context tier #3282 (related / partial) — feat(provider): add GitHub Copilot context tier [
Closing as implemented on
dev. Per-model capability declarations landed in fbb0410 and d5d03f8:ModelCapabilities(inputModalities,contextTier,video.processing) insrc/types/provider.ts, validation insrc/config/provider-validation.ts, and--model <id> --text-onlyonocx provider add/edit. Follow-ups that build on it (for example #4932) continue in their own PRs.
Area
Provider adapters
What are you trying to accomplish?
Declare, per model, what a provider can actually do — context tier, vision or text-only, video processing mode — instead of relying on OpenCodex's inferred defaults that silently mismatch the upstream.
This consolidates three requests that each name one missing capability axis. Each is closed individually and absorbed here:
ocx provider add#3268 (@turin-dev) — mark models as text-only fromocx provider addprocessing: "agentic")What prevents this today?
Each axis is missing at the same layer — the provider/model row has nowhere to say it.
Text-only is not expressible.
src/cli/provider.tsparses through--default-modelbut has no text-only flag, andsrc/cli/provider-runtime.tsoffers no equivalent on edit. A text-only model that receives an image fails at the upstream instead of being rejected or downgraded locally.Video processing mode is dropped.
src/chat/inbound.tspreserves only the video URL,src/responses/schema.tshas no processing field, andsrc/adapters/google.tsconverts non-data video URLs into text markers. Gemini's agentic video mode cannot be requested at all.Context tier is not selectable.
src/providers/github-copilot-transport.tsenriches headers and base URL only; there is no context-tier option on provider edit, so a Copilot model cannot be pinned to its long-context tier and OpenCodex cannot apply its own cap against that tier.What should OpenCodex do?
Give the provider/model configuration a capability block that these three cases populate, so adding a capability axis later does not require another bespoke flag:
provider addandprovider edit, and reject or explicitly downgrade image content for such models before dispatch rather than after.processing: "agentic"reaches the upstream unmodified.Example usage or interface
{ "providers": { "google": { "models": { "gemini-x": { "video": { "processing": "agentic" } } } } } }Alternatives or workarounds
Users currently avoid affected models, or accept upstream errors that surface as opaque proxy failures because OpenCodex had no way to know the model's real capability.
Additional context
Absorbs #3268, #3271, #3281. Credit for the original analysis belongs to @turin-dev, @GoldenLoaf24h, and @Simon-Opopeee.
PR #3282 by @Simon-Opopeee (GitHub Copilot context tier) is open and addresses item 3; it is not superseded by this issue.
Checks