Repository navigation
[Feature]: Pre-adapter request transform hook (custom handlers on OcxParsedRequest) #3459
Description
What are you trying to accomplish?
We are looking to run request-level optimizations such as pxpipe (converting large text blocks into images for vision-capable models to optimize token consumption) and headroom (context compression) in front of model routing.
Today, OpenCodeX acts as the universal routing layer to multiple providers (OpenAI, Anthropic, Google Antigravity, etc.). Having a way to plug in pre-adapter request transforms directly on the normalized request would allow these optimizations to work seamlessly across any provider.
What prevents this today?
Attempting to chain external proxy tools via baseUrl works for OpenAI-compatible wires, but completely breaks when routing to other providers—most notably Google / Gemini Antigravity (adapters/google.ts).
By the time an upstream HTTP request leaves OpenCodeX, adapter.buildRequest(parsed, ...) has already translated the request into that provider's proprietary wire format. An external proxy sitting on baseUrl would need to deconstruct, re-parse, and re-serialize Google's wire protocol, Anthropic's wire protocol, and Responses format separately.
In contrast, before buildRequest is invoked in server/responses/core.ts, OpenCodeX has already parsed the incoming turn into a single, provider-agnostic representation: OcxParsedRequest.
What should OpenCodex do?
Expose a clean pre-adapter request transform hook (or custom handler interface) that operates on OcxParsedRequest before adapter.buildRequest is called.
Key requirements:
- Single normalized format: Operates on
OcxParsedRequestso transforms don't need to know anything about vendor wire formats. - Applied once per turn: Executed once for the turn rather than re-running on every internal retry/continuation/replay in
server/responses/core.tsthat re-invokesbuildRequest. - Model & Provider Awareness: The transform receives context (
providerName,modelId,providerConfig). This allows tools likepxpipeto inspect whether the target model accepts image input (reusingmodelAcceptsImageInputfromvision/eligibility.ts).
Example usage or interface
A lightweight transform handler signature:
export type RequestTransform = (
parsed: OcxParsedRequest,
ctx: {
providerName: string;
modelId: string;
providerConfig: OcxProviderConfig;
}
) => OcxParsedRequest | Promise<OcxParsedRequest>;Configurable via ~/.opencodex/config.json by pointing to a custom TS/JS handler script (either globally or scoped per provider / model):
{
"requestTransforms": [
"./transforms/pxpipe-vision.ts"
],
"providers": {
"google-antigravity": {
"requestTransforms": ["./transforms/custom-handler.ts"]
}
}
}Alternatives or workarounds
- Chaining standalone proxies before/after ocx: Fails due to disparate downstream wire formats (e.g. Google's format).
- Private fork: Feasible but introduces ongoing merge maintenance for what could be a general-purpose extension point.
Additional context
This is functionally the inverse of OpenCodeX's existing vision/ sidecar (which converts images to text for non-vision models): here, text transforms into images for vision models or is compressed before routing.
Would you be open to a PR introducing this pre-adapter transform hook? If so, what architecture/interface would you prefer for registering custom handlers?
Activity
feat(server): add pre-adapter request transform hook (lidge-jun#3459)
drakonkat commentedon Sep 4, 2026
Implemented and opened PR #3463 targeting
devwith full test coverage and typecheck passing.lidge-jun commentedon Sep 4, 2026
리뷰 · 우선순위 52 / 80
이 이슈는 OpenCodeX가 이미 파싱해 둔
OcxParsedRequest위에서, 벤더 어댑터가 와이어를 만들기 전에 커스텀 변환(예: pxpipe 텍스트→이미지, headroom 압축)을 한 번 돌리고 싶다는 요청입니다. 지금dev(HEAD2421e44ce)에서는baseUrl에 외부 프록시를 물리는 방식으로는 OpenAI 호환 경로만 쉽고, Google Antigravity 등 프로프라이어터리 어댑터 경로에서는 이미 직렬화된 뒤에야 나가므로 전처리가 사실상 불가능합니다. 반대로src/server/responses/core.ts의 라우팅·정규화 직후·checkInputAdmission/buildRequest이전에는 프로바이더에 묶이지 않은 공통 요청이 있어, 그 지점에 훅을 두면 비전 여부(isVisionEligibleModel)와 프로바이더/모델 정보를 같이 넘기며 모든 어댑터에 자동으로 전파됩니다. 기존vision/사이드카가 이미지를 텍스트로 바꾸는 쪽이면, 이 이슈는 그 반대·보완 축입니다.구현 PR은 이미 #3463으로 열려 있습니다. 전역
requestTransforms+ 프로바이더 스코프, 한 턴 한 번(_requestTransformsApplied), 동적 모듈 로드, 단위 테스트까지 이슈에서 적은 최소 계약을 대부분 충족합니다. 다만 그 PR은intake: hygiene-blocked(empty_catch,unsponsored_surfaceonauth-cors.ts) 상태이고, 설정에서 임의 경로/패키지를import하는 확장점이라 메인테이너 보안 리뷰(maintainer-sponsored)가 필요합니다. 문서 체크와 실제 파일도 어긋나 있습니다. 이슈 본문의 “모델 스코프”는 PR에 없고modelId컨텍스트로 변환 함수 내부 분기에 맡긴 형태입니다.경로
server/responses/core.ts· pre-adapter - 이슈가 지목한 위치가 맞습니다. 어댑터 뒤baseUrl체이닝으로는 Google 등에서 복구할 수 없습니다.경로 이슈 예시 인터페이스 vs #3463 - 이슈 스케치에는
acceptsImageInput이 없었는데 PR이 비전 적격을 넣어 준 것은 좋습니다. 반대로 이슈에 있던 모델별 목록은 PR에 없습니다.경로 #3463 hygiene - 이슈 자체보다 구현 PR의 스폰서·빈 catch·문서가 머지 게이트입니다. 이슈만 열린 채 PR이 막히면 기여자 입장에서 “승인된 설계인지”가 애매해집니다.
메인테이너의 판단이 필요한 지점
maintainer-sponsored를 줄지, 관리 API/auth-cors변경을 뺀 축소판을 다시 받을지.너의 추천
설계 방향은 수용하고, 논의는 #3463 리뷰 스레드로 모으세요. 이슈는 PR이 hygiene·스폰서를 통과해 머지되면 closes로 닫으면 됩니다. 지금은 이슈만 따로 구현을 독려하기보다, #3463의 보안/위생 수정이 먼저입니다.
이 댓글은 grok-bot이 작성했습니다
fix: address review feedback on request transforms (lidge-jun#3459)
feat(server): add pre-adapter request transform hook (lidge-jun#3459)
fix: address review feedback on request transforms (lidge-jun#3459)
devin-ai-integration commentedon Sep 24, 2026
Triage:
priority: P3— pre-adapter request transform hook.Criteria (P3): Low: new provider/client integration, large or experimental feature (>2000 LOC or >50 files), RFC/roadmap, or long-stale branch.
Matched pull requests:
priority: P3]