<!-- task=m-vllm-provider-serving-validation/03+02_openai_vllm_smoke plan=1 tag=VLLM_SMOKE -->
# Plan: Edge OpenAI vLLM models/chat/streaming smoke

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

이 plan은 `models-chat`와 `streaming` Task를 구현/검증하기 위한 실행 계약이다. 선행 작업 `02+01_config_contract`의 PASS evidence 또는 동등한 config contract 반영을 확인한 뒤 진행한다. 구현 에이전트는 실제 변경과 검증 출력으로 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 반드시 채운다.

사용자 전용 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 충돌 없이는 안전하게 진행할 수 없는 경우 직접 질문하지 말고 review stub의 `사용자 리뷰 요청` 섹션에 기록한 뒤 중단한다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active `CODE_REVIEW-*-G??.md`의 `사용자 리뷰 요청` 섹션에만 기록한다. 구현 에이전트는 chat에서 사용자에게 선택지를 제시하거나 `request_user_input`을 호출하지 않는다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/inference-provider-extension/milestones/vllm-provider-serving-validation.md`
- Task: `models-chat`
- Task: `streaming`

## Spec Targets

- SDD: `agent-roadmap/sdd/inference-provider-extension/vllm-provider-serving-validation/SDD.md`
- Scenario: `S03`
- Scenario: `S04`

## 분석 결과

### 읽은 파일

- `scripts/e2e-openai-lemonade.sh`
- `apps/edge/internal/openai/chat_handler.go`
- `apps/edge/internal/openai/routes.go`
- `apps/edge/internal/openai/server_test.go`
- `apps/node/internal/adapters/openai_compat/openai_compat.go`
- `apps/node/internal/adapters/openai_compat/openai_compat_test.go`
- `agent-test/local/edge-smoke.md`
- `agent-test/local/node-smoke.md`

### 테스트 환경 규칙

- smoke는 local fake provider로 재현 가능해야 한다.
- real provider mode는 field endpoint를 env로 주입해야 하며 private endpoint/token을 tracked 파일에 기록하지 않는다.
- streaming 검증은 SSE chunk, `finish_reason`, 종료 신호를 모두 확인한다.

### 테스트 커버리지 공백

- Lemonade용 e2e script는 있으나 vLLM provider alias/model 기준의 smoke script가 없다.
- Edge `/v1/models`, non-streaming chat, streaming chat을 같은 vLLM route config로 검증하는 user-facing smoke가 부족하다.

### 심볼 참조

- `scripts/e2e-openai-lemonade.sh`
- `openai.Handler.handleChatCompletions`
- `openai.Handler.handleModels`
- `openai_compat.Adapter.Execute`

### 분할 판단

- 이 plan은 smoke script와 fake-mode/route 검증을 담당한다.
- 실제 DGX Spark split-host run은 `04+03_field_smoke`에서 같은 script의 real mode로 수행한다.

### 범위 결정 근거

- 포함: `scripts/e2e-openai-vllm.sh` 신설, fake provider 응답, Edge config temp file, `/v1/models`, non-streaming, streaming assertions.
- 제외: DGX Spark container launch, field host health provisioning, roadmap task 완료 체크.

### 빌드 등급

- `cloud-G07`: script orchestration과 Edge/Node smoke가 포함되며 real-mode는 외부 provider endpoint를 소비한다.

## 구현 체크리스트

- [ ] `scripts/e2e-openai-vllm.sh`를 추가해 fake mode 기본 실행과 real mode env 실행을 모두 지원한다.
- [ ] script가 vLLM route alias `qwen3.6:35b`, served model `nvidia/Qwen3.6-35B-A3B-NVFP4`, `openai_compat_instances` provider `vllm`을 사용하도록 temp config를 구성한다.
- [ ] fake mode에서 `/v1/models`, non-streaming `/v1/chat/completions`, streaming `/v1/chat/completions` SSE chunk, `finish_reason`, `data: [DONE]`를 검증한다.
- [ ] 필요한 Go unit/integration test를 추가하거나 기존 coverage가 충분한 이유를 review stub에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 구현 항목

- [VLLM_SMOKE-1] vLLM e2e smoke script 추가
- [VLLM_SMOKE-2] fake-mode `/v1/models`와 non-streaming chat 검증
- [VLLM_SMOKE-3] fake-mode streaming SSE 검증

## 수정 파일 요약

- 예상 변경: `scripts/e2e-openai-vllm.sh`
- 예상 변경 가능: `apps/edge/internal/openai/*_test.go`, `apps/node/internal/adapters/openai_compat/*_test.go`

## 최종 검증

```bash
bash ./scripts/e2e-openai-vllm.sh
go test ./apps/edge/internal/openai ./apps/edge/internal/service ./apps/node/internal/adapters/openai_compat
git diff --check
```

예상 결과: fake-mode smoke가 route alias 모델 조회, non-streaming chat, streaming SSE 종료 신호를 검증하고 Go test 및 diff check가 통과한다.

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