<!-- task=m-agent-readable-repository-refactor/05_http_provider_adapters plan=0 tag=REFACTOR_ADAPTER_HTTP -->

# OpenAI-compatible와 vLLM adapter 책임 분해 계획

## 이 파일을 읽는 구현 에이전트에게

검증 후 review stub의 구현 소유 섹션을 채우고 active 파일을 유지한다. Milestone 결정 차단만 `사용자 리뷰 요청`에 기록하며 직접 질문, `request_user_input`, archive/complete 작업은 하지 않는다.

## 배경

`openai_compat.go` 1,125줄과 `vllm.go` 818줄은 config/capabilities, request mapping, SSE decoding, provider tunnel, probing을 각각 한 파일에 둔다. 둘은 같은 HTTP OpenAI-compatible provider 실행 계약을 가지므로 한 subtask에서 같은 책임 기준을 적용한다.

## 분석 결과

- 대상: `apps/node/internal/adapters/openai_compat`, `apps/node/internal/adapters/vllm`.
- 테스트 환경: local node/testing profiles; 두 package 기준선 tests 통과.
- SDD: 불필요. runtime.Adapter/ProviderTunneler 계약 보존형 same-package 분리.
- 분할 판단: CLI는 subprocess/session lifecycle이 달라 `06_cli_adapter`로 분리했다. 이 plan은 HTTP provider adapter 두 package만 다룬다.
- 제외: request JSON, auth/header precedence, SSE event mapping, URL/timeout semantics, 새 공용 package.
- 빌드 등급: `local-G07`.

## 구현 체크리스트

- [x] OpenAI-compatible adapter를 config/request/stream/tunnel/probe 책임 파일로 분리한다.
- [x] vLLM adapter를 config/request/stream/tunnel/probe 책임 파일로 분리한다.
- [x] `Execute`와 `TunnelProvider`의 단계 함수를 명명하고 event/HTTP 계약을 보존한다.
- [x] package·Node adapter 회귀와 readability ratchet을 통과시킨다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REFACTOR_ADAPTER_HTTP-1] OpenAI-compatible 분리

문제: `openai_compat.go`가 1,000줄을 넘고 `Execute` 205줄, request builder 125줄이다.

해결 방법: `adapter.go`, `request.go`, `stream.go`, `provider_tunnel.go`, `provider.go`로 이동하고 Execute는 build/send/consume/finalize 단계로 축소한다.

- [x] endpoint/header/context override와 thinking/tool mapping을 보존한다.
- 테스트 작성: 기존 request, thinking, tool, tunnel/cancel tests를 유지하고 terminal/error table 공백이 있으면 보강한다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/openai_compat` → PASS

### [REFACTOR_ADAPTER_HTTP-2] vLLM 분리

문제: `vllm.go`가 request mapping, SSE, tunnel/probe를 결합하고 `Execute`가 161줄이다.

해결 방법: OpenAI-compatible와 같은 책임 이름을 쓰되 구현 공유를 위한 새 package는 만들지 않는다.

- [x] vLLM 고유 endpoint, usage, reasoning/tool delta와 cancel을 보존한다.
- 테스트 작성: 기존 `vllm_test.go` 시나리오를 책임별 test 파일로 이동할 수 있으나 assertion은 줄이지 않는다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/vllm` → PASS

### [REFACTOR_ADAPTER_HTTP-3] adapter 소비자 회귀

문제: registry/factory가 concrete adapter 생성과 optional interface를 소비한다.

해결 방법: Node adapters 전체와 Node runtime tests, audit를 실행한다.

- [x] stale symbol과 package 외 visibility 변경이 없는지 확인한다.
- 테스트 작성: skip. 소비자 회귀 항목이다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/... ./apps/node/internal/node` → PASS

## 최종 검증

```bash
gofmt -d apps/node/internal/adapters/openai_compat/*.go apps/node/internal/adapters/vllm/*.go
GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/openai_compat ./apps/node/internal/adapters/vllm
GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/... ./apps/node/internal/node
make readability-audit
git diff --check
```

모두 종료 코드 0, 새/증가 위반 없음이어야 한다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
