provider pool 모델 catalog의 출력 토큰 기본값과 thinking budget을 OpenAI-compatible 요청에 반영하고, Ornith dev-runtime 기준과 관련 계약 문서를 함께 맞춘다.
5.1 KiB
5.1 KiB
Edge Config And Runtime Refresh Contract
계약 메타
- id:
iop.edge-config-runtime-refresh - boundary:
inner - status: active
- 원본 경로:
packages/go/config/config.goconfigs/edge.yamlapps/edge/internal/configrefresh/request.goapps/edge/internal/configrefresh/result.goapps/edge/internal/configrefresh/classify.goproto/iop/runtime.protoapps/edge/internal/node/mapper.goapps/node/internal/adapters/config_set.go
- human docs:
apps/edge/README.md
읽는 조건
configs/edge.yaml,packages/go/config, provider pool,openai.model_routes,models[],nodes[].providers[], adapter instance 설정을 바꿀 때iop-edge config refresh의 dry-run/apply 결과 schema나 restart/applied 분류를 바꿀 때- Edge가 Node에 전달하는
NodeConfigPayload또는NodeConfigRefresh*payload를 바꿀 때
범위
이 계약은 Edge 설정 YAML, Go config struct, config refresh 결과, Edge-to-Node runtime config payload의 연결 규칙이다. tracked config에는 public 예시와 기본 구조만 두고, 실제 endpoint/credential/private host 값은 환경별 private 설정으로 주입한다.
핵심 규칙
openai.model_routes[]는 외부 OpenAI-compatiblemodelid를 내부adapter + targetroute로 매핑하는 compatibility catalog다.models[]는 provider pool 방향의 canonical routing key이며nodes[].providers[].id를 참조한다.default_max_tokens,min_max_tokens,default_thinking_token_budget은 OpenAI-compatible 요청을 내부 실행으로 넘기기 전에 적용하는 모델 단위 generation policy다.nodes[].providers[]는 Node 아래 resource/provider catalog다.category는api,cli,local_inferenceresource kind를 나타낸다.nodes[].providers[].id는 전체 Edge config 안에서 중복되면 안 된다.nodes[].providers[].adapter는 같은 Node 안의 enabled adapter instance key를 참조해야 한다. Exact instance key를 우선하고, legacy type-name route는 같은 type의 enabled instance가 정확히 하나일 때만 허용한다.category: cliresource는 enabled CLI adapter가 필요하다.nodes[].providers[].enabled: 생략 또는true→ provider pool dispatch 후보에 포함.false→ dispatch pool에서 제외. 비활성화된 provider는 status snapshot에status=disabled,health=disabled,capacity=0으로 표시된다. adapter process lifecycle 변경 없음. config refresh 시enabled토글은 live-apply(restart 불필요)로 분류된다. disabled provider의 adapter reference check는 skip되지만 structural validation(type, category, models, numeric bounds)은 수행된다.nodes[].providers[].priority: provider-pool dispatch tie-breaker다. 기본값은0이고 음수는 validation error다. dispatch는in_flight < capacity후보 중 가장 낮은in_flight를 먼저 선택하며,in_flight가 같은 후보에서만 낮은 숫자의priority를 우선한다.in_flight와priority가 모두 같으면 기존 순환을 유지한다. priority 변경은 live-apply(restart 불필요)로 분류된다.- legacy single-instance adapter 설정은 load 시 named instance slice로 normalize된다.
NodeConfigPayload는 Edge가 Node에 내려주는 실행 adapter/runtime payload다.- refresh 결과는
applied,restart_required,rejected를 구분하고, changed node/provider/model/report slice는 안정적으로 non-nil이어야 한다.
refresh 분류 기준
- live apply 가능: provider capacity, provider priority, provider max queue, provider queue timeout, provider
enabledtoggle,models[]display/provider/generation policy mapping, legacy node runtime concurrency metadata. - restart required: Edge identity/listen/bootstrap/logging/metrics/console/control-plane/openai/a2a listener config, node 추가/삭제, node token/alias/agent kind, adapter 설정, provider type/category/adapter/models/health/lifecycle capability, provider-first execution fields(
provider,endpoint,base_url,headers,command,args,env,mode,resume_args,output_format,context_size,request_timeout_ms) 변경. - rejected: candidate config load/validate 실패, invalid refresh mode, apply failure.
금지 사항
- 설정 파일만 바꾸고
packages/go/configloading/default/validation과 불일치하게 두지 않는다. - provider id, model id, route id의 의미를 섞지 않는다. 외부
model은 OpenAI-compatible 경계의 route key이고, 내부 실행은adapter + target이다. - credential, bearer token, private endpoint 원문을 tracked docs/roadmap/contract에 기록하지 않는다.
- Node bootstrap 기본 경로에서 사용자가 직접 node config를 작성하거나 adapter/provider 값을 명령줄로 넣어야 하는 계약을 만들지 않는다.
변경 시 확인할 코드/테스트
packages/go/config/config_test.goapps/edge/internal/configrefresh/classify_test.goapps/edge/internal/edgecmd/edgecmd_test.goapps/edge/internal/node/mapper_test.goapps/node/internal/adapters/config_set_test.goagent-test/local/platform-common-smoke.mdagent-test/local/edge-smoke.md