Skip to content

fix(provider): treat deepseek-flash as native multimodal - #4500

Merged
lidge-jun merged 5 commits into
devfrom
codex/260913-i3-carry-4467-deepseek-flash-vision
Sep 13, 2026
Merged

fix(provider): treat deepseek-flash as native multimodal#4500
lidge-jun merged 5 commits into
devfrom
codex/260913-i3-carry-4467-deepseek-flash-vision

Conversation

@lidge-jun

Copy link
Copy Markdown
Owner

Summary

Verification

  • bun test tests/providers/provider-registry-parity.test.ts tests/vision/vision-sidecar-e2e.test.ts � 67 pass, including native-image preservation on both openai-chat and openai-responses wires with sidecarHits=0, gateway aliases still sidecar-backed, and legacy saved noVisionModels still opting flash into the sidecar.
  • bun run typecheck, bun run structure:check, bun run privacy:scan � pass.
  • Local full suite not run. Hosted pull-request CI on this exact tip head is the suite proof.

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults.

lidge-jun and others added 4 commits September 13, 2026 19:06
Intersect explicit custom reasoning lists with pinned native metadata whenever
the model id itself is capability-backed, including YYLJ/gpt-6-astra. Desktop
validates the model id, so none/minimal must not remain on those catalog rows.

Full native identity still requires the canonical openai Codex-forward
destination. Stored configuration and request-time clamps are unchanged.

Refs #3775. Original report by @leonclab. #3804 already bounded the canonical
forward case; this is the remaining catalog projection.
Remove deepseek-flash from first-party DeepSeek noVisionModels and declare
native text and image input in modelInputModalities. Compatibility aliases
and Zen gateway routes stay on the sidecar path.

This uses the existing registry seed contract (modelInputModalities and
noVisionModels). Eligibility already consults user-config modelCapabilities
first; the registry does not seed that overlay.

Refs #4436.

Co-authored-by: jaychou0642-create <283093853+jaychou0642-create@users.noreply.github.com>
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 13, 2026 10:09
@coderabbitai

coderabbitai Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review (2)
  • ^dev$
  • ^preview$

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: b2b655a0-6b77-48a3-99c2-079a14ab99ee

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

Deterministic PR hygiene checks passed.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 13, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-13T10:12:43.619684Z b0080b7 PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions github-actions Bot added the bug Something isn't working label Sep 13, 2026
…try seeds

The #4467 carry dropped deepseek-flash from first-party noVisionModels. Update
the minimal persisted-config route assertion so it matches the new seed instead
of issue #88's text-only list.

Refs #4436.
@lidge-jun

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 54 / 80

이 PR은 이미 dev에 들어와 있습니다. 머지 커밋은 94063d079이고, 지금 checkout tip(df7dc1be5, 패키지 2.54.0) 히스토리에 포함되어 있습니다. 열린 이벤트만 늦게 도착한 상태라, 이 댓글은 사후 기록용입니다. 관련 이슈 #4436과 원본 포크 PR #4467, 그리고 같은 레인에 묶인 #3775도 모두 닫혀 있습니다.

문제의 핵심은 간단합니다. 1차 DeepSeek API의 deepseek-flash는 Chat Completions와 Responses 둘 다에서 이미지를 네이티브로 받습니다. 그런데 예전 src/providers/registry.ts 시드는 이 id를 noVisionModels에 넣어 두었습니다. 라우터 보강이 그 목록을 설정과 합집합으로 합치기 때문에, 사용자가 설정에서 빼도 시드가 다시 붙습니다. 그 결과 이미지가 오면 vision sidecar가 먼저 설명문을 만들고, 모델에는 원본 이미지가 아니라 글로 바뀐 내용이 갑니다. 느리고, 비용이 들고, 디테일도 깎입니다.

이번 수정은 저장소가 이미 쓰는 레지스트리 시드 계약을 그대로 따릅니다. #4374 / #4376의 사용자 modelCapabilities 오버레이를 레지스트리에 새로 심지 않았습니다. ProviderRegistryEntry에도 그런 필드가 없고, derive도 복사하지 않습니다. 다른 네이티브 비전 시드와 같이 modelInputModalities["deepseek-flash"] = ["text", "image"]를 넣고, noVisionModels에서는 deepseek-flash만 뺍니다. 조사하지 않은 호환 별칭(deepseek-chat, deepseek-reasoner, deepseek-v4-flash)과 Zen/OpenCode Go 게이트웨이 경로는 sidecar에 남깁니다. 예전에 저장해 둔 설정이 아직 noVisionModels에 flash를 적어 두면 sidecar를 유지하는 것도 테스트로 잠가 두었습니다.

같은 레인 I3 바닥 링크로 #3775 카탈로그 수정도 같이 실려 있습니다. 커스텀 행의 model id가 네이티브 능력 메타데이터를 갖고 있으면(예: 게이트웨이 YYLJ/gpt-6-astra), 카탈로그에 보이는 reasoning 목록만 pinned 네이티브 사다리와 교집합합니다. Desktop이 model id를 검증하므로 none/minimal이 그 행에 남아서는 안 됩니다. 다만 Responses Lite·멀티에이전트 같은 완전한 네이티브 정체성은 여전히 정식 openai Codex-forward 목적지에만 줍니다. src/codex/catalog/provider-fetch.tsnativeEffortSourcesrc/codex/catalog/sync.tspreservePinnedNativeCustomReasoning이 그 경계입니다. 저장 설정과 요청 시점 클램프는 그대로입니다.

문서·structure 여러 파일이 같은 DeepSeek flash 문장을 반복하는 것은 이 저장소의 structure:check owner 매핑 규칙과 맞습니다. tests/providers/provider-registry-parity.test.tstests/vision/vision-sidecar-e2e.test.ts가 chat/responses 와이어에서 sidecarHits=0, 게이트웨이 별칭은 sidecar 유지, 레거시 설정 opt-in을 직접 잠급니다. 작성자가 밝힌 대로 로컬 전체 스위트는 안 돌렸고, 당시 PR tip의 hosted CI가 레인 증명이었습니다. squash 메시지에 Co-authored-by: jaychou0642-create 트레일러를 남기라는 요청도 맞습니다.

라인 2177 - src/providers/registry.ts modelInputModalities["deepseek-flash"] - ["text","image"]로 심었습니다. 네이티브 멀티모달 선언의 맞는 신호입니다.
라인 2252 - 같은 파일 noVisionModels - flash를 빼고 chat/reasoner/v4-flash만 sidecar에 남깁니다. 라우터 합집합 때문에 시드에서만 고칠 수 있다는 PR 설명과 일치합니다.
라인 2685-2692 - src/codex/catalog/provider-fetch.ts nativeEffortSource - model id에 pinned 메타가 있으면 게이트웨이여도 effort 목록을 자릅니다. 완전한 네이티브 정체성과 분리된 좁은 경계입니다.
라인 319-322 - src/codex/catalog/sync.ts preservePinnedNativeCustomReasoning - 커스텀 카탈로그 행이 이미 잘린 effort를 다시 넓히지 않게 보존합니다.
경로/심볼 - 레인에 #3775#4436이 한 tip - 범위는 넓지만 I3 carry로 의도된 묶음입니다. 이미 머지되어 되돌릴 이유는 없습니다.
경로/심볼 - Zen/별칭 미조사 - 의도적 보수입니다. 게이트웨이까지 네이티브로 넓히려면 별도 probe 이슈가 맞습니다.

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

  • (이미 머지됨) squash/머지 커밋에 co-author 트레일러가 실제로 남았는지 히스토리만 한 번 확인
  • Zen·deepseek-v4-flash 별칭을 나중에 네이티브로 올릴지, 당분간 sidecar로 둘지
  • #4519 endpoint destination-policy 같은 인접 web-search 갭과 이번 vision 시드 수정은 별개로 둘지

너의 추천
추가 작업 없습니다. 이미 dev에 반영되었고 #4436/#4467/#3775도 닫혀 있습니다. 후속으로 Zen/별칭 probe를 할 계획만 있으면 새 이슈로 열면 됩니다. 이 PR을 다시 열거나 되돌릴 필요는 없습니다.

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

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

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants