# Milestone: Lemonade provider 서빙 경로 추가

## 위치

- Roadmap: `agent-roadmap/ROADMAP.md`
- Phase: `agent-roadmap/phase/inference-provider-extension/PHASE.md`

## 목표

Node provider 상태와 capacity queue 기반을 전제로 Lemonade provider를 Ollama 다음 우선 provider 후보로 검증한다.
Edge OpenAI-compatible 입력 표면에서 Lemonade target/model의 모델 조회, non-streaming/streaming chat, option/API passthrough, split-host smoke 기준을 검증한다.
현재 제품 정렬에서는 NomadCode workspace 실행 계약과 provider 상태/capacity queue 기반이 선행된 뒤 Lemonade를 provider 우선순위 2순위로 올린다.

## 상태

[완료]

## 승격 조건

- 없음

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음
- 해소된 결정:
  - [x] Lemonade provider를 독립 `lemonade` adapter로 둘지, OpenAI-compatible inference server 공통 adapter 계열로 둘지 결정한다.
  - [x] 실테스트에 사용할 Lemonade endpoint, served model name 또는 기준 model, 인증/헤더 필요 여부, streaming 지원 기대 동작을 확인한다.

## 범위

- Lemonade provider를 Ollama 이후의 우선 추론 서버 provider 후보로 둔다.
- Edge OpenAI-compatible API의 `/v1/models`, `/v1/chat/completions` non-streaming/streaming 요청이 Lemonade provider 경로로 수렴하는 기준을 정한다.
- Lemonade provider의 모델 조회, chat completion, streaming chunk, usage/finish reason, option/API passthrough 기대 동작을 실제 endpoint 기준으로 검증한다.
- Node provider 상태와 capacity queue snapshot에 Lemonade target/model이 같은 방식으로 노출되는지 검증한다.
- split-host field smoke 기준을 Lemonade provider에도 재사용한다.
- Ollama 경로에서 정리한 provider별 설정, target/model 매핑, adapter 책임 경계를 Lemonade에도 유지한다.

## 기능

### Epic: [lemonade-provider] Lemonade Provider Serving Path

- [x] [provider-boundary] Lemonade provider를 독립 adapter로 둘지 OpenAI-compatible inference server 공통 adapter로 둘지 결정 근거가 정리되어 있다.
- [x] [config-contract] Lemonade endpoint, served model name 또는 model, auth/header, timeout, option passthrough 설정 계약이 정리되어 있다.
- [x] [availability] Lemonade provider의 endpoint/model probe 결과가 Node 공통 상태 모델 `unknown`, `available`, `unavailable`로 노출되는 기준이 검증되어 있다.
- [x] [models-chat] Edge OpenAI-compatible `/v1/models`와 non-streaming `/v1/chat/completions`가 Lemonade provider로 수렴하는 기준이 검증되어 있다.
- [x] [streaming] streaming `/v1/chat/completions`에서 SSE chunk, finish reason, 종료 신호가 Lemonade provider 경로로 안정적으로 전달되는지 검증되어 있다.
- [x] [field-smoke] split-host field smoke에서 Lemonade target/model을 선택해 모델 조회와 chat 왕복이 검증되어 있다.
- [x] [follow-up-scope] 코드 수정이 필요한 항목은 이 Milestone의 추가 Task 또는 같은 Milestone task group의 후속 plan으로 정리되어 있다.

## 완료 리뷰

- 상태: 승인됨
- 요청일: 2026-06-15
- 완료 근거:
  - `01_config_contract`, `02+01_openai_compatible_adapter`, `03+02_field_smoke` 완료 로그의 `Roadmap Completion`이 모든 기능 Task id를 PASS로 보고했다.
  - Lemonade real smoke는 local LAN Lemonade server 일반 포트 `13305`와 `Gemma-4-26B-A4B-it-GGUF` 기준으로 PASS했다.
  - fake smoke, Makefile target, 관련 Go package tests, `git diff --check`가 PASS했다.
- 리뷰 필요:
  - [x] 사용자가 완료 결과를 확인했다
  - [x] archive 이동을 승인했다
- 리뷰 코멘트: 코드레벨 완료 검토에서 smoke assertion 보강만 직접 반영했고, 큰 후속 plan이 필요한 이슈는 발견되지 않았다. 모든 기능 Task가 충족되어 사용자 승인에 따라 완료 및 archive 처리한다.

## 범위 제외

- Lemonade 서버 배포/운영 자체의 제품화
- cloud fallback, 자동 부하 라우팅, 품질 평가 feedback의 본격 구현
- 후속 최적화 계층 구현
- Responses API 세부 호환 구현
- 진행중인 Ollama/vLLM/SGLang provider Milestone 범위 변경
- Ollama 경로 완료 기록 재작성

## 작업 컨텍스트

- 관련 경로: `apps/edge`, `apps/node`, `packages/go/config`, `proto/iop`, `configs`, `agent-test/local/edge-smoke.md`, `agent-test/local/node-smoke.md`, `agent-test/local/platform-common-smoke.md`
- 표준선(선택): 내부 실행 계약은 `adapter + target`을 유지하고, OpenAI-compatible API는 외부 호환 입력 표면으로 둔다.
- 표준선(선택): Node provider 상태와 capacity queue 기반을 Lemonade provider에도 동일하게 적용한다.
- 표준선(선택): 실제 provider가 보장하지 않는 확장 상태는 추가하지 않고, 초기 상태는 `unknown`, `available`, `unavailable`만 사용한다.
- 표준선(확정): Lemonade는 독립 `lemonade` adapter를 새로 만들기보다 OpenAI-compatible inference server 공통 adapter 계열로 둔다. 공식 Lemonade Server 문서가 `/v1/models`, `/v1/chat/completions`와 streaming SSE를 OpenAI-compatible 표면으로 제공하고, 현재 코드에도 `vllm` adapter가 같은 `/v1/models`/`/v1/chat/completions` 기준선을 이미 구현하고 있기 때문이다.
- 선행 작업: OpenAI Workspace Agent Execution Contract, Node provider 상태와 Capacity Queue 기반
- 후속 작업: Lemonade provider 실테스트에서 확인된 serving 경로 안정화 보완
- 확인 완료: 실테스트 기준은 현재 host에서 접근 가능한 local LAN Lemonade server의 일반 포트 `13305`, served model `Gemma-4-26B-A4B-it-GGUF`, 인증/헤더 없음, streaming SSE 종료 신호 `data: [DONE]` 지원 PASS로 정리한다. endpoint 원문은 tracked roadmap에 기록하지 않는다.
