--- id: LLM-WP-0003 type: workplan title: llm-connect — Functional Extensions (FR-2 RoutingPolicy + FR-1 HTTP server) domain: custodian status: completed owner: llm-connect created: 2026-04-01 repo: llm-connect planning_priority: high planning_order: 3 state_hub_workstream_id: 7b463cdc-40a2-4cc5-8b55-b59cc5ae3443 --- # LLM-WP-0003 — Functional Extensions (FR-2 + FR-1) **status:** completed **owner:** llm-connect **repo:** llm-connect **created:** 2026-04-01 **depends-on:** LLM-WP-0001 (test infrastructure must exist) ## Purpose Implement the two IHF feature requests that add new Functional-layer modules. Neither touches Core. Both can be developed independently of WP-0002. Origin: IHUB-WP-0012 Phase 11 — Advanced AI Federation (completed 2026-04-01). ## GAAF notes Both additions are Functional-layer under GAAF-2026: - Demand signal is explicit: IHF (inter-hub) is the primary consumer for both. - Each gets its own functional contract doc in `/contracts/functional/`. - Maturity on release: Beta (single known consumer, interface not yet stabilised). ## Tasks ```task id: T01 title: 'RoutingPolicy data model: rules list with task_type, prefer, max_cost_per_1k, fallback' priority: high status: done state_hub_task_id: "85cf92fd-cddd-4e19-8782-970f6480a37f" ``` ```task id: T02 title: 'policy.resolve(task_type) returns configured LLMAdapter' priority: high status: done state_hub_task_id: "352701ce-4b21-4f5d-a22e-462136e58fd2" ``` ```task id: T03 title: 'Export RoutingPolicy from llm_connect.__init__ and update __all__' priority: medium status: done state_hub_task_id: "baeb9b39-7fee-4f2b-86cc-ce64ff9e9b95" ``` ```task id: T04 title: 'Functional contract doc for RoutingPolicy' priority: medium status: done state_hub_task_id: "aa4488c6-950e-4cea-99b1-89defa4677ce" ``` ```task id: T05 title: 'Tests: rule match, cost-cap fallback, unknown task_type fallback, no-match default' priority: high status: done state_hub_task_id: "a4ad9c9e-64a4-44f0-85f3-b9cfe9ef59f7" ``` ```task id: T06 title: 'Design /execute JSON schema (request: provider, model, prompt, config; response: LLMResponse)' priority: high status: done state_hub_task_id: "cf79bce2-8d1a-4708-90b2-5e6569908b14" ``` ```task id: T07 title: 'Implement llm_connect/server.py: POST /execute, GET /health' priority: high status: done state_hub_task_id: "c91964ab-7366-4b34-acd4-1ee12f96881e" ``` ```task id: T08 title: 'python -m llm_connect.server --port N --provider X --model Y CLI entry point' priority: high status: done state_hub_task_id: "e3115bb4-cf3b-4ca0-9992-136e317068ac" ``` ```task id: T09 title: 'Add server optional dep (httpx or aiohttp) to pyproject.toml' priority: medium status: done state_hub_task_id: "2caf5531-8e10-40e9-a595-8652882a10e0" ``` ```task id: T10 title: 'Functional contract doc: HTTP API schema (request/response shapes, error codes)' priority: medium status: done state_hub_task_id: "dc3c81c2-698d-4fee-b1dd-1af156a4276f" ``` ```task id: T11 title: 'Tests: server POST round-trip (MockAdapter), GET /health, error responses' priority: high status: done state_hub_task_id: "848a1622-abdd-4938-8bb4-3da27f5f9867" ``` ### FR-2 — RoutingPolicy | ID | Title | Priority | Status | |-----|-------|----------|--------| | T01 | `RoutingPolicy` data model: `rules` list with `task_type`, `prefer`, `max_cost_per_1k`, `fallback` | high | done | | T02 | `policy.resolve(task_type)` → returns configured `LLMAdapter` | high | done | | T03 | Export from `llm_connect.__init__` and update `__all__` | medium | done | | T04 | Functional contract doc for `RoutingPolicy` | medium | done | | T05 | Tests: rule match, cost-cap fallback, unknown task_type fallback, no-match default | high | done | ### FR-1 — HTTP serve mode | ID | Title | Priority | Status | |-----|-------|----------|--------| | T06 | Design `/execute` JSON schema (request: provider, model, prompt, config; response: LLMResponse fields) | high | done | | T07 | Implement `llm_connect/server.py` — minimal HTTP server, `POST /execute`, `GET /health` | high | done | | T08 | `python -m llm_connect.server --port N --provider X --model Y` CLI entry point | high | done | | T09 | Add `httpx` or `aiohttp` server dep under `[project.optional-dependencies] server` | medium | done | | T10 | Functional contract doc (API schema — request/response shapes, error codes) | medium | done | | T11 | Tests: spin up server in subprocess or via `TestClient`, POST round-trip (MockAdapter), error responses | high | done | ## Exit criteria - `RoutingPolicy.resolve("triage")` returns the correct adapter per rules in tests - `python -m llm_connect.server --port 9999` starts and responds to `POST /execute` - `GET /health` returns 200 - All functional contract docs present in `/contracts/functional/`