This gist summarizes the comparison between ReqLlmNext (metadata‑driven spike) and the current ReqLLM v1, plus a recommended v2 simplification path.
- Central pipeline clarity: Resolver → Validation → Constraints → Adapter → Wire → Provider.
- Metadata-driven model expansion: adding models via LLMDB updates is genuinely faster.
- Provider boilerplate shrinks: base_url + auth only.
- Scenario + fixture testing matches the metadata-first world.
- Conditional quirks aren’t static: Anthropic thinking rules, OpenAI reasoning defaults, etc. already require adapters.
- Transport complexity is real: OAuth, SigV4, Azure URL pathing, Bedrock, etc. cannot be metadata-only.
- Wire protocols are code, not config: new API families will still require new wire modules.
- Response assembly is thinner than v1: no equivalent to ResponseBuilder parity and provider meta richness.
- Metadata as runtime truth is brittle: incorrect capabilities or limits become correctness bugs.
- It can simplify if metadata stays declarative and quirks are handled in code.
- It becomes brittle if you push conditional behaviors into config DSLs.
- The practical outcome is a hybrid: metadata for discovery/limits, code for behavior.
Split the system into Protocol, Transport, Policy, and Metadata.
- Protocol: encode/decode wire formats (OpenAI Chat, Responses, Anthropic Messages, Gemini, etc.)
- Transport: auth + base URL + headers + signing (Bearer, x‑api‑key, OAuth, SigV4, Azure)
- Policy: small conditional transforms (reasoning defaults, max_tokens rules, temperature removal)
- Metadata: discovery, capabilities, limits, pricing only
This keeps metadata declarative and moves conditional behavior into explicit, testable code.
- Model Registry (LLMDB + overrides)
- Protocol Layer (wire codecs)
- Transport Layer (auth + URL + HTTP)
- Policy Layer (quirk transforms)
- ResponseBuilder (shared for streaming + non‑streaming)
Keep convenience functions, but add a single explicit request API:
ReqLLM.request/2or/3→ returnsResponse(streaming or buffered)ReqLLM.stream/2→ returnsStreamResponse- Keep:
generate_text/3generate_object/4embed/3generate_image/3
Normalize options around:
operation: :chat | :embed | :image | :moderateoutput: :text | :json | :tooltools,tool_choicestream: true | falseprotocol_optionsandprovider_options
- Provider modules become thin transports.
- Protocol logic is centralized and reusable.
- Conditional quirks stay explicit and testable.
- Streaming/non‑streaming share a single builder.
- Metadata stays static (no “config DSL”).
Use metadata for discovery/limits, protocols for encoding, transports for auth, and policies for quirks. This keeps ReqLLM v2 simpler, predictable, and far less brittle than a config‑heavy design.