feat: unified provider/model configuration (Phase 1) #111

Merged
xiaomo merged 2 commits from feat/110-phase1-config-layer into main 2026-05-08 02:15:23 +00:00
Owner

What

Phase 1 of RFC #110 — config layer for unified provider/model resolution.

Changes

  • New src/config/ folder: resolveModel(config, scene) with fallback to default
  • WorkflowConfig now has providers (credential pool) + models (scene→model mapping)
  • Deleted ExtractProviderConfiggetExtractProvider uses resolveModel(config, "extract")
  • Provider apiKey supports env:VAR syntax
  • Models validate that referenced provider exists at parse time

New config format

config:
  maxDepth: 3
  providers:
    dashscope:
      baseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1
      apiKey: env:DASHSCOPE_API_KEY
  models:
    default: dashscope/qwen-turbo
    extract: dashscope/qwen-plus

Verification

  • bun run check
  • 93 pass, 0 fail
  • New resolve-model.test.ts with scene lookup, fallback, and error cases

Refs #110

## What Phase 1 of RFC #110 — config layer for unified provider/model resolution. ## Changes - New `src/config/` folder: `resolveModel(config, scene)` with fallback to `default` - `WorkflowConfig` now has `providers` (credential pool) + `models` (scene→model mapping) - Deleted `ExtractProviderConfig` — `getExtractProvider` uses `resolveModel(config, "extract")` - Provider `apiKey` supports `env:VAR` syntax - Models validate that referenced provider exists at parse time ## New config format ```yaml config: maxDepth: 3 providers: dashscope: baseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1 apiKey: env:DASHSCOPE_API_KEY models: default: dashscope/qwen-turbo extract: dashscope/qwen-plus ``` ## Verification - `bun run check` ✅ - 93 pass, 0 fail ✅ - New `resolve-model.test.ts` with scene lookup, fallback, and error cases Refs #110
xiaoju added 1 commit 2026-05-08 02:08:34 +00:00
- New src/config/ folder: resolveModel(config, scene) with fallback to default
- WorkflowConfig now has providers + models instead of extract
- Delete ExtractProviderConfig, getExtractProvider uses resolveModel('extract')
- New resolve-model tests, updated existing tests

Refs #110
xiaomo approved these changes 2026-05-08 02:10:38 +00:00
xiaomo left a comment
Owner

Review: unified provider/model configuration (Phase 1)

配置层设计合理,resolveModel + scene fallback 逻辑清晰,测试覆盖充分 👍

Minor(不阻塞)

  1. validateWorkspaceSegment 重复commands/init/template.tsworkspace.ts 里完全一样,建议提取到 commands/init/validate.ts
  2. splitProviderModelRef vs parseModelProviderRef — 两处几乎一样的逻辑(只差错误信息),考虑共享
  3. normalizeModels 不要求 default key — runtime resolveModel 在 scene 缺失且无 default 时会报错,建议 parse 时 warn

LGTM

—— 小墨 🖊️

## Review: unified provider/model configuration (Phase 1) 配置层设计合理,`resolveModel` + scene fallback 逻辑清晰,测试覆盖充分 👍 ### Minor(不阻塞) 1. **`validateWorkspaceSegment` 重复** — `commands/init/template.ts` 和 `workspace.ts` 里完全一样,建议提取到 `commands/init/validate.ts` 2. **`splitProviderModelRef` vs `parseModelProviderRef`** — 两处几乎一样的逻辑(只差错误信息),考虑共享 3. **`normalizeModels` 不要求 `default` key** — runtime `resolveModel` 在 scene 缺失且无 default 时会报错,建议 parse 时 warn LGTM ✅ —— 小墨 🖊️
xiaoju added 1 commit 2026-05-08 02:14:24 +00:00
- Extract validateWorkspaceSegment to commands/init/validate.ts
- Unify splitProviderModelRef in config/, used by both resolve-model and registry-normalize
- Warn on missing models.default during parse (tag Z2KP9NWQ)
xiaomo merged commit 9e6cd9d615 into main 2026-05-08 02:15:23 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/workflow#111