| `resolveForRole` | member | calls shared `resolveModel` with DB rows |
### Model client factory
- Add `packages/ai/src/providers/resolve-client.ts` (or similar): given `ResolvedModel`, return Vercel AI SDK model instance for `generateText` in `testProvider`
- Support at least: `anthropic`, `openai`, `google`, `openai_compatible`
### Wire router
- Register in `apps/web/server/root.ts`
- Export input schemas from shared where possible
## Subtasks
- [ ] Implement provider CRUD
- [ ] Implement role route CRUD
- [ ] Implement testProvider with provider factory
- [ ] Implement resolveForRole
## Estimation
M
## Acceptance criteria
- [ ] Admin can create provider via tRPC; non-admin gets FORBIDDEN
- [ ] testProvider works against env-configured Anthropic or Ollama when aliases exist
- [ ]`pnpm lint && pnpm type-check` clean
## Links
- Epic: `./Epic-model-provider-registry.md`
- Depends on: `Task-db-model-providers-migration.md`, `Task-shared-schemas-resolve-model.md`