iop/agent-test/dev-corp/node-smoke.md
2026-07-09 16:51:06 +09:00

16 KiB

test_env test_profile domain verification_type last_rule_updated_at
dev-corp node-smoke node smoke 2026-07-08

node-smoke dev-corp 테스트

읽기 조건

  • apps/node/** 변경 또는 dev-corp node 실행, adapter, transport, router, store 검증 판단이 필요한 경우

적용 범위

  • 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/**
  • dev-corp Linux ARM64/macOS Node bootstrap과 provider endpoint 연결

분류

  • domain: node
  • verification_type: smoke
  • scope: dev-corp node 실행 파이프라인과 Edge 연결 baseline

환경

  • host: local checkout. dev-corp host, provider, shared Edge runtime evidence가 필요하면 mac-mini ssh fe@172.24.63.178을 사용한다.
  • port: compose Edge-Node TCP transport 19006, native provider-pool Edge-Node TCP 후보 18087
  • runtime: Go 1.24
  • package manager: Go modules / Makefile
  • docker: unit/smoke quick check는 Docker를 요구하지 않는다. compose dev-corp 검증은 mac-mini에서 수행한다.
  • external service: dev-corp node-only/internal Edge runtime 후보 172.24.63.178:18087; 기본 외부 dev-corp 배포/검증 경로는 digitalplatform-iop.cloud이다. 172.24.63.178로 Edge 배포는 사용자 명시 요청 전까지 금지한다.
  • model endpoint: dev-corp OpenAI-compatible base URL 기본 후보 http://digitalplatform-iop.cloud:18086/v1
  • credential: token/secret/API key 원문은 문서에 기록하지 않는다.

dev-corp Node 접속 기준

dev-corp의 실제 3-node 연결을 점검할 때는 mac-mini ssh fe@172.24.63.178/Users/fe/agent-work/iop-dev-corp checkout과 build/dev-corp-runtime/edge.yaml을 기준으로 한다. Node는 provider pool 기준에서 node-only/internal Edge-Node TCP 172.24.63.178:18087 또는 host별 reverse SSH tunnel로 붙을 수 있다. 이 172 경로는 기본 외부 dev-corp serving/smoke 경로가 아니며, Edge 배포 대상도 아니다. 사용자가 172 Edge 경로를 명시 요청한 경우에만 172 Edge 배포/검증으로 취급한다. 2026-07-02 현재 DGX Spark 01/02는 127.0.0.1:28087 -> mac-mini 127.0.0.1:18087 reverse SSH tunnel로 붙고, Mac Studio는 직접 Edge TCP 후보를 사용한다. tunnel pid file은 mac-mini runtime의 build/dev-corp-runtime/node01-tunnel.pid, build/dev-corp-runtime/node02-tunnel.pid다.

  • DGX Spark 01 vLLM node: corp-dgx-spark-01-vllm-node / corp-dgx-spark-01-vllm
    • SSH/user: mac-mini에서 ssh digitalcommerce_dgx_spark_01@192.168.2.2
    • provider endpoint: http://192.168.2.2:8002/v1
    • Edge adapter endpoint: node-local http://127.0.0.1:8002/v1
    • Edge addr: 127.0.0.1:28087 via mac-mini reverse SSH tunnel in the current native runtime
    • served model: gemma-4-26B-A4B-it-NVFP4
    • capacity baseline 후보: 4
    • runtime capacity/context/KV: vllm=0.24.0, --max-num-seqs 4, --max-model-len 262144, --gpu-memory-utilization 0.40; agent/tool-call profile --enforce-eager, --skip-mm-profiling, --limit-mm-per-prompt '{"image": 0, "video": 0}', --mm-processor-cache-gb 0, --enable-auto-tool-choice, --tool-call-parser gemma4, --chat-template /home/digitalcommerce_dgx_spark_01/tool_chat_template_gemma4.jinja, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}'; 2026-07-08 startup log 기준 GPU KV cache 1,453,705 tokens, 262144 full-context concurrency 5.55x; FP4 MoE env VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304
    • start script: /home/digitalcommerce_dgx_spark_01/start_vllm_8002.sh
    • 주의: 0.24.0 venv toolchain을 사용하므로 start script에서 /home/digitalcommerce_dgx_spark_01/vllm_env_0_24_0/binPATH 앞에 둔다.
    • workspace: /home/digitalcommerce_dgx_spark_01
  • DGX Spark 02 vLLM node: corp-dgx-spark-02-vllm-node / corp-dgx-spark-02-vllm
    • SSH/user: mac-mini에서 ssh dplab@192.168.2.4
    • provider endpoint: http://192.168.2.4:8004/v1
    • Edge adapter endpoint: node-local http://127.0.0.1:8004/v1
    • Edge addr: 127.0.0.1:28087 via mac-mini reverse SSH tunnel
    • served model: gemma-4-26B-A4B-it-NVFP4
    • capacity baseline 후보: 4
    • runtime capacity/context/KV: image vllm/vllm-openai:v0.24.0, vllm=0.24.0, --max-num-seqs 4, --max-model-len 262144, --gpu-memory-utilization 0.40; agent/tool-call profile --enforce-eager, --skip-mm-profiling, --limit-mm-per-prompt '{"image": 0, "video": 0}', --mm-processor-cache-gb 0, --enable-auto-tool-choice, --tool-call-parser gemma4, --chat-template /vllm-workspace/examples/tool_chat_template_gemma4.jinja, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}'; 2026-07-08 startup log 기준 GPU KV cache 1,452,633 tokens, 262144 full-context concurrency 5.54x; FP4 MoE env VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304
    • start script: /home/dplab/start_vllm_gemma4_8004.sh
    • workspace: /home/dplab
    • 주의: Docker publish 때문에 host endpoint와 container endpoint 모두 8004이다. 8000, 8001, 8002를 기본 endpoint로 쓰지 않는다.
  • Mac Studio vLLM-MLX node: corp-mac-studio-mlx-vllm-node / corp-mac-studio-mlx-vllm
    • SSH/user: mac-mini에서 ssh dc_dev@192.168.2.3
    • provider endpoint: http://192.168.2.3:8004/v1
    • Edge adapter endpoint: node-local http://127.0.0.1:8004/v1
    • Edge provider catalog type: openai_compat; provider runtime type remains vllm-mlx.
    • served model: mlx-community/gemma-4-26b-a4b-it-nvfp4
    • capacity baseline 후보: 5 (provider catalog capacity; current runtime headroom --max-num-seqs 6)
    • runtime capacity/context/KV: vllm-mlx=0.4.0, python /Users/dc_dev/vllm-env-0.4.0/bin/python, --continuous-batching, --max-num-seqs 6, --prefill-batch-size 6, --completion-batch-size 6, --chunked-prefill-tokens 1024, --disable-prefix-cache, --max-request-tokens 262144, requested KV 262144x3 mapped to --max-kv-size 786432; agent/tool-call profile --enable-auto-tool-choice, --tool-call-parser gemma4, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}'
    • start script: /Users/dc_dev/iop-dev-corp-field/start_vllm_mlx_8004.sh
    • workspace: /Users/dc_dev
    • process manager: 2026-06-25 기준 detached screen session vllm_mlx_8004; 이 host는 Python pyexpat 로딩에 DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib가 필요하다.

DGX Spark nodes는 Linux/ARM64 bootstrap을 기본으로 한다. Mac Studio node는 macOS bootstrap을 기본으로 한다. Windows native bootstrap은 dev-corp provider pool 기본 대상이 아니다.

Mac Studio의 secondary http://192.168.2.3:8005/v1 endpoint는 기본 Node/provider pool 검증 대상이 아니다. 별도 alias/capacity 정책이 확정된 후 추가한다.

런타임 설정/검증 상태

  • DGX Spark 01에는 capacity 4, context window 262144, requested KV 262144x2 이상의 기준을 반영했다. vLLM에는 vLLM-MLX식 --max-kv-size가 없으므로 DGX01은 vllm=0.24.0, --max-num-seqs 4, --max-model-len 262144, --gpu-memory-utilization 0.40, text-only/eager profile로 운용하고, 실제 KV cache는 startup log의 GPU KV cache size로 검증한다.
  • DGX Spark 01은 2026-07-08 재기동 후 mac-mini 내부 endpoint http://192.168.2.2:8002 기준 /health 200, /v1/models, 직접 API forced/auto/streaming tool-call smoke, 로컬 Pi TUI bash/git-push tool-call 흐름을 통과했다. 같은 로그에서 GPU KV cache 1,453,705 tokens, 262144 tokens/request concurrency 5.55x가 확인됐다.
  • DGX Spark 02에는 capacity 4, context window 262144, requested KV 262144x2 이상의 기준을 반영했다. Docker vllm-gemma4는 host/container 8004, image vllm/vllm-openai:v0.24.0, text-only/eager profile 기준으로 동작하며, node-local과 mac-mini 경유 /health, /v1/models, 직접 API auto/streaming tool-call smoke를 통과했다.
  • DGX Spark에서 explicit --max-num-batched-tokens 524288를 사용하는 경우 first profile 중 FP4 MoE 커널 한계에 걸릴 수 있어 VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304 보정이 필요하다.
  • DGX Spark 01은 0.24.0 venv toolchain을 사용하므로 /home/digitalcommerce_dgx_spark_01/vllm_env_0_24_0/bin PATH prefix가 필요하다.
  • Mac Studio에는 vllm-mlx=0.4.0, provider catalog capacity 5, context window 262144, requested KV 262144x3 기준을 continuous batching 유지, runtime headroom --max-num-seqs 6, --max-request-tokens 262144, --max-kv-size 786432, --disable-prefix-cache로 반영했고 /health, /v1/models, 직접 API non-stream/stream auto tool-call, streaming multi-turn tool-result final answer, Pi -p tool-call, Pi TUI 초기 프롬프트 tool-call 로그 종료를 확인했다.
  • Gemma provider-pool은 default_thinking_token_budget: 1024 기준으로 thinking을 기본 활성화한다. vLLM과 vLLM-MLX provider 모두 Edge/Node adapter 요청에서 chat_template_kwargs.enable_thinking=true가 적용되는 방향으로 검증한다.
  • Gemma4 agent/tool-call compatibility profile은 DGX Spark 01/02 vLLM에서 --enable-auto-tool-choice, --tool-call-parser gemma4, Gemma4 tool chat template, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}', --enforce-eager, --skip-mm-profiling, --limit-mm-per-prompt '{"image": 0, "video": 0}', --mm-processor-cache-gb 0을 함께 둔다. Mac Studio vLLM-MLX는 별도 chat template override 없이 --continuous-batching, --disable-prefix-cache, --enable-auto-tool-choice, --tool-call-parser gemma4, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}'를 둔다. Qwen provider는 dev-runtime 문서의 Qwen 전용 parser/template 값을 따른다.
  • Mac Studio vLLM-MLX의 위 값은 2026-07-08 기준 구동 가능한 최종 체크포인트다. 잔여 이슈로 Gemma4 thought channel delimiter가 최종 content에 누수될 수 있으며, 이 경우 runtime option 미세 조정보다 vLLM-MLX Gemma provider 전용 Pi extension/provider adapter sanitizer를 우선 검토한다. 추가 튜닝은 Spark vLLM 설정과 분리된 별도 실험으로만 수행한다.
  • Gemma provider를 Pi/Cline형 agent/tool-call 용도로 검증할 때는 일반 chat smoke와 별도로 forced tool call, auto tool call, streaming delta.tool_calls, multi-turn tool result 후 최종 답변을 확인한다. raw <|tool_call>/<|"|> marker나 thought channel text가 assistant content로 새면 provider parser/template profile 또는 Edge relay 경계 문제로 판정한다.
  • Gemma provider-pool의 provider queue timeout은 두지 않는다. config 값은 queue_timeout_ms=0이며, backend request timeout은 30분 기준인 request_timeout_ms=1800000으로 맞춘다.
  • 2026-07-08 재확인 기준 DGX Spark 02는 mac-mini에서 SSH, provider /health, /v1/models가 회복됐고 직접 API auto/streaming tool-call smoke를 통과했다. Edge OpenAI-compatible capacity smoke는 source ref c2437aaedefbac4312d69dfd10aa017c2739e187 재배포 후 /v1/responses, /v1/chat/completions 각각 15개 동시 요청으로 통과했다.

2026-07-08 연결/용량 검증 상태

  • dev-corp Control Plane native runtime이 활성화되어 http://127.0.0.1:18002/edges/dev-corp-edge/status에서 3개 provider node가 connected로 관측된다.
  • DGX Spark 01, DGX Spark 02, Mac Studio Node binary는 source ref c2437aaedefbac4312d69dfd10aa017c2739e187 기준으로 재배포되었고 각 host의 iop-dev-corp-field/iop-node로 실행된다.
  • Control Plane provider_snapshots 기준 provider 상태는 DGX01 capacity 4, DGX02 capacity 4, Mac Studio capacity 5, 모두 health=healthy, status=available이다.
  • dev-corp capacity smoke 표준은 /v1/responses/v1/chat/completions 각각 15개 동시 요청이다. provider capacity 합 13 기준 peak total in_flight=13, queued>=2를 관측하고, 완료 후 모든 provider가 in_flight=0, queued=0으로 회복해야 한다. 2026-07-08 검증에서는 두 endpoint 모두 15/15 성공, peak total in_flight=13, queued=6, provider별 max queued 2, 최종 회복 in_flight=0, queued=0으로 통과했다.

명령

  • setup:
  • lint:
  • unit: go test ./apps/node/...
  • smoke: ./scripts/e2e-smoke.sh는 기본 포트 임시 설정을 쓰는 보조 smoke이므로 dev-corp 포트 override 필요 여부를 먼저 확인한다.
  • e2e: make test-e2e
  • provider-health: mac-mini에서 curl -fsS http://192.168.2.2:8002/health, curl -fsS http://192.168.2.4:8004/health, curl -fsS http://192.168.2.3:8004/health
  • full-cycle: repo 내부 edge-node 진단과 사용자 실행 cycle 수동 검증

필수 검증

  • 변경한 node 패키지 또는 go test ./apps/node/...를 실행한다.
  • 실행 요청, stream, cancel, status, session, adapter registry 경로를 바꾼 경우 repo 내부 edge-node 진단과 full-cycle 실제 구동 기준을 함께 적용한다.
  • vLLM/OpenAI-compatible adapter 설정을 바꾼 경우 mac-mini에서 provider /health/v1/models를 먼저 확인하고, 이후 Edge OpenAI-compatible 경로에서 model alias 후보 gemma4:26b 또는 작업에서 확정한 alias가 노출되는지 확인한다.
  • dev-corp Edge runtime으로 연결하는 경우 Node가 18087 native provider-pool TCP를 사용하고 local/test/dev baseline으로 붙지 않는지 확인한다.
  • Node bootstrap UX는 Edge가 출력한 완성 명령을 사용하고, 사용자에게 수동 node.yaml 편집이나 named env parameter를 기본 경로로 요구하지 않는다.

보조 검증

  • ./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 화면에 표시된다.
  • provider nodes는 mac-mini에서 내부 endpoint로 /health/v1/models가 성공해야 한다.

기준 출력 예시

curl -fsS http://192.168.2.2:8002/health
curl -fsS http://192.168.2.4:8004/health
curl -fsS http://192.168.2.3:8004/health

차단 기준

  • mac-mini 또는 내부 provider node SSH 접근이 불가능하다.
  • dev-corp Edge-Node TCP 후보 port 접근이 불가능하다.
  • 필수 provider endpoint가 닫혀 있거나 /v1/models가 기대 모델을 노출하지 않는다.
  • DGX Spark 02가 provider port down과 SSH banner exchange timeout을 동시에 보인다.
  • Mac Studio vLLM-MLX node를 재시작해야 하는데 8004 runtime의 screen session 또는 DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib 적용 여부를 확인할 수 없다.
  • 외부 CLI profile 검증에 필요한 CLI 설치, 계정, provider 상태가 없다.

보고 항목

  • 실행한 명령:
  • 성공한 검증:
  • 실패/차단된 검증:
  • 생략 사유:
  • 남은 위험:

금지 사항

  • 사용자 실행 파이프라인 변경을 unit test만으로 완료 처리하지 않는다.
  • proto/gen/iop/*.pb.go 생성 파일을 직접 수정하지 않는다.
  • 사용자가 명시적으로 요청하지 않았는데 172.24.63.178로 Edge를 배포하거나 Node smoke의 172 내부 경로를 Edge public runtime 기본값으로 승격하지 않는다.
  • secret, token, API key 원문은 tracked 파일에 기록하지 않는다.