149 lines
9 KiB
Markdown
149 lines
9 KiB
Markdown
---
|
|
test_env: dev
|
|
test_profile: node-smoke
|
|
domain: node
|
|
verification_type: smoke
|
|
last_rule_updated_at: 2026-07-04
|
|
---
|
|
|
|
# node-smoke dev 테스트
|
|
|
|
## 읽기 조건
|
|
|
|
- `apps/node/**` 변경 또는 node 실행, adapter, transport, router, store dev 검증 판단이 필요한 경우
|
|
|
|
## 적용 범위
|
|
|
|
- `apps/node/cmd/node/**`
|
|
- `apps/node/internal/bootstrap/**`
|
|
- `apps/node/internal/node/**`
|
|
- `apps/node/internal/runtime/**`
|
|
- `apps/node/internal/router/**`
|
|
- `apps/node/internal/transport/**`
|
|
- `apps/node/internal/adapters/**`
|
|
- `apps/node/internal/store/**`
|
|
|
|
## 분류
|
|
|
|
- domain: node
|
|
- verification_type: smoke
|
|
- scope: node 실행 파이프라인과 edge 연결 baseline
|
|
|
|
## 환경
|
|
|
|
- host: local checkout. dev host, external CLI profile, shared Edge runtime evidence가 필요하면 원격 runner를 사용한다.
|
|
- port: dev Edge-Node TCP transport `19003`
|
|
- runtime: Go `1.24`
|
|
- package manager: Go modules / Makefile
|
|
- docker: unit/smoke quick check는 Docker를 요구하지 않는다. compose dev 검증은 `docker compose --env-file .env.dev.example ...`로 수행한다.
|
|
- external service: dev Edge runtime 주소 후보 `toki-labs.com:19003`
|
|
- model endpoint: dev OpenAI-compatible base URL 후보 `http://toki-labs.com:18083/v1`
|
|
- credential: token/secret 원문은 문서에 기록하지 않는다.
|
|
|
|
## dev-runtime Node 접속 기준
|
|
|
|
dev-runtime의 실제 3-node 연결을 점검할 때는 원격 runner `ssh toki@toki-labs.com`의 `/Users/toki/agent-work/iop-dev` checkout과 `build/dev-runtime/edge.yaml`을 기준으로 한다. Node는 dev-runtime provider pool 기준에서 Edge-Node TCP `toki-labs.com:18084`로 붙는다.
|
|
|
|
- mac CLI + MLX provider node: `mac-codex-node` / `mac-codex`
|
|
- SSH/user: `ssh toki@toki-labs.com`
|
|
- 목적: `cli` adapter, `codex app-server` + `mac-mlx-vllm` provider resource
|
|
- workspace: `/Users/toki/agent-work/iop-workspace/nomadcode`
|
|
- MLX vLLM provider: `mac-mlx-vllm`
|
|
- provider endpoint: `http://127.0.0.1:8002/v1`
|
|
- served model: `mlx-community/Qwen3.6-35B-A3B-4bit`
|
|
- capacity baseline: `2`
|
|
- priority baseline: `2`
|
|
- workdir: `/Users/toki/agent-work/iop-mlx-vllm`
|
|
- runtime baseline: `vllm-mlx`, `--max-num-seqs 2`, `--max-kv-size 262144`, `--max-request-tokens 262144`, `--use-paged-cache --paged-cache-block-size 64 --max-cache-blocks 4096`, `--tool-call-parser qwen`, `--reasoning-parser qwen3`, `default_chat_template_kwargs.enable_thinking=true`
|
|
- KV policy: per-call window bound `262144`, one full context-size setting
|
|
- long-context admission baseline: `total_context_tokens=262144`, `long_context_capacity=1` (KV budget `262144` fits one full 262144-window request; long slot count is not the normal capacity `2`)
|
|
- GX10 vLLM node: `gx10-vllm-node` / `gx10-vllm`
|
|
- SSH/user: `ssh toki@192.168.0.91`
|
|
- provider endpoint: `http://192.168.0.91:8001/v1`
|
|
- served model: `nvidia/Qwen3.6-35B-A3B-NVFP4`
|
|
- capacity baseline: `4`
|
|
- priority baseline: `0`
|
|
- runtime baseline: `vllm`, `--max-model-len 262144`, `--max-num-seqs 4`, `--gpu-memory-utilization 0.30`, `--reasoning-parser qwen3`, `default_chat_template_kwargs.enable_thinking=true`
|
|
- agent/tool-call note: tracked GX10 runtime evidence has not yet fixed a Qwen tool-call parser/template option; before using this provider for Pi/Cline-style agent tools, validate `tools[]` non-stream/stream responses and then record the chosen `--tool-call-parser`/`--chat-template` values in `agent-test/dev/inventory.yaml`.
|
|
- long-context admission baseline: `total_context_tokens=262144`, `long_context_capacity=1` (conservative; `max-model-len 262144` until runtime evidence proves a larger concurrent long-context budget)
|
|
- workspace: `/home/toki/iop-gx10-vllm`
|
|
- OneXPlayer Lemonade node: `onexplayer-lemonade-node` / `onexplayer-lemonade`
|
|
- SSH/user: `ssh r0bin@192.168.0.59`
|
|
- 접속 기준: 현재 작업 호스트에서 직접 SSH
|
|
- provider endpoint: `http://192.168.0.59:13305/v1`
|
|
- served model: `Qwen3.6-35B-A3B-MTP-GGUF`
|
|
- capacity baseline: `3`
|
|
- priority baseline: `1`
|
|
- load baseline: backend `vulkan`, ctx size `524288`, `llamacpp_args="--spec-type none -np 3 -cb -fa on -b 4096 -ub 1024"`, `save_options=true`
|
|
- long-context admission baseline: `total_context_tokens=524288`, `long_context_capacity=2` (SDD D04 fixed; `ctx_size=524288`, `-np 3` 유지, `ctx_size`를 `524288` 초과로 키우지 않는다)
|
|
- workspace: `C:/Users/r0bin/iop-field`
|
|
|
|
OneXPlayer Lemonade는 `Qwen3.6-35B-A3B-MTP-GGUF` artifact를 사용하되 runtime MTP speculative decoding은 끈 상태를 dev 기준으로 삼는다. Node 검증 전 `/v1/load`의 `recipe_options`가 `model_name=Qwen3.6-35B-A3B-MTP-GGUF`, Vulkan, `ctx_size=524288`, `--spec-type none -np 3 -cb -fa on -b 4096 -ub 1024`를 포함하는지 확인한다. backend `/slots`에서는 총 ctx `524288`이 slot 3개로 나뉘어 2026-07-04 기준 slot별 `n_ctx=174848`로 보인다.
|
|
|
|
GX10은 Linux/ARM64 bootstrap, OneXPlayer는 Windows native PowerShell bootstrap을 기본으로 한다. OneXPlayer는 현재 작업 호스트에서 직접 접속해 세팅하며, 원격 runner나 Edge host에서 `node-onexplayer-lemonade.yaml`로 proxy 실행하지 않는다.
|
|
|
|
mac-mlx-vllm provider는 mac-codex-node 소속 resource로, Edge host와 같은 macOS host에서 vllm-mlx process로 실행한다. vllm-mlx API는 외부에 직접 노출하지 않고 `127.0.0.1:8002`에 bind하며, Edge의 OpenAI-compatible adapter가 local bearer header로 호출한다. 운영 확인은 `/Users/toki/agent-work/iop-mlx-vllm/vllm-mlx.pid`, `logs/vllm-mlx.stdout.log`, `logs/vllm-mlx.stderr.log`를 기준으로 한다. Docker와 macOS 여유 메모리를 고려해 capacity는 `2`를 기본선으로 유지한다.
|
|
|
|
OneXPlayer에서 SSH 세션 안의 `Start-Process`로 `iop-node.exe`를 띄우면 SSH 세션 종료와 함께 process가 정리될 수 있다. dev 반복 배포에서는 `Win32_Process.Create` 또는 동등한 세션 독립 실행 방식으로 `C:/Users/r0bin/iop-field`에서 `iop-node.exe --config node.yaml serve`를 시작하고, WMI/process query와 `iop-node.log`의 `connected to edge` 로그로 유지 여부를 확인한다.
|
|
|
|
Qwen provider를 agent/tool-call 용도로 검증할 때는 일반 chat smoke와 별도로 forced tool call, auto tool call, streaming `delta.tool_calls`, multi-turn tool result 후 최종 답변을 확인한다. raw native marker나 reasoning text가 assistant content로 새면 해당 model/runtime의 parser/template profile 미확정으로 보고한다.
|
|
Qwen runtime에는 Qwen 전용 parser/template 검증값만 사용한다. dev-corp Gemma 계열의 `tool_call_parser=gemma4`, `reasoning_parser=gemma4`, Gemma4 chat template/profile을 Qwen provider에 복사하지 않는다.
|
|
|
|
## 명령
|
|
|
|
- setup:
|
|
- lint:
|
|
- unit: `go test ./apps/node/...`
|
|
- smoke: `./scripts/e2e-smoke.sh`는 기본 포트 임시 설정을 쓰는 보조 smoke이므로 dev 포트 override 필요 여부를 먼저 확인한다.
|
|
- e2e: `make test-e2e`
|
|
- model:
|
|
- full-cycle: repo 내부 edge-node 진단과 사용자 실행 cycle 수동 검증
|
|
|
|
## 필수 검증
|
|
|
|
- 변경한 node 패키지 또는 `go test ./apps/node/...`를 실행한다.
|
|
- 실행 요청, stream, cancel, status, session, adapter registry 경로를 바꾼 경우 repo 내부 edge-node 진단과 full-cycle 실제 구동 기준을 함께 적용한다.
|
|
- CLI profile 변경 시 `/capabilities`, `/transport`, `/sessions`, persistent profile이면 `/terminate-session`을 확인한다.
|
|
- dev Edge runtime으로 연결하는 경우 Node가 `19003`을 사용하고 local/test `19090` field baseline으로 붙지 않는지 확인한다.
|
|
|
|
## 보조 검증
|
|
|
|
- `./scripts/e2e-smoke.sh`는 mock adapter 기반 보조 smoke로 사용한다.
|
|
- `make test-e2e`는 보조 smoke이며 full-cycle 실제 구동을 대체하지 않는다.
|
|
|
|
## 판정 기준
|
|
|
|
- node 등록 후 edge console에서 node가 조회된다.
|
|
- 같은 session에서 메시지 2회가 start, 기대 payload를 포함한 `[node-*-message]`, 같은 run의 complete 순서로 edge 화면에 도착한다.
|
|
- node 로컬 `[node-message]` payload 라인 목록과 edge `[node-*-message]` payload 라인 목록이 run별로 내용/순서까지 동일해야 한다.
|
|
- edge complete는 같은 run의 마지막 `[node-*-message]` 이후에만 정상이다.
|
|
- command 결과가 `[node-*-<command>]` 또는 명확한 성공/unsupported/error 출력으로 edge 화면에 표시된다.
|
|
|
|
## 기준 출력 예시
|
|
|
|
```text
|
|
edge> /nodes
|
|
edge> Convert token iop_manual_one and reply only with converted token
|
|
[node-*-event] start
|
|
[node-*-message] IOP_MANUAL_ONE_OK
|
|
[node-*-event] complete
|
|
```
|
|
|
|
## 차단 기준
|
|
|
|
- dev host 또는 Edge-Node TCP port 접근이 불가능하다.
|
|
- 외부 CLI profile 검증에 필요한 CLI 설치, 계정, provider 상태가 없다.
|
|
|
|
## 보고 항목
|
|
|
|
- 실행한 명령:
|
|
- 성공한 검증:
|
|
- 실패/차단된 검증:
|
|
- 생략 사유:
|
|
- 남은 위험:
|
|
|
|
## 금지 사항
|
|
|
|
- 사용자 실행 파이프라인 변경을 unit test만으로 완료 처리하지 않는다.
|
|
- `proto/gen/iop/*.pb.go` 생성 파일을 직접 수정하지 않는다.
|
|
- secret, token, 개인 endpoint 원문은 tracked 파일에 기록하지 않는다.
|