You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Introduce a formal experimental provider tier with a provider capability declaration so that workflows can be statically validated against what each provider actually supports.
Motivated by two in-flight provider PRs (#104claude-agent-sdk, #235hermes) that exposed the gap: both delegate parts of the agentic loop to an upstream SDK/framework and therefore can't honor every parity rule in AGENTS.md (streaming events, MCP passthrough, reasoning.effort, structured-output schema, resume, etc.). Rather than rejecting these case-by-case or silently letting parity rules erode, formalize a tier with explicit allowed carve-outs and a static validator that catches workflow ↔ provider mismatches at conductor validate time.
Keep the supply-chain blast radius small (per-provider extras, no bulk [experimental] extra).
Surface mismatches early via conductor validate; surface runtime mismatches via console + JSONL.
Avoid experimental becoming permanent purgatory: written promotion criteria.
Non-goals (for v1)
A plugin / entry-point architecture. Tier is metadata, not package structure.
A runtime --allow-experimental opt-in. Optional extras already gate installation.
Automatic feature shimming. If a feature isn't supported, surface it — don't silently swallow.
A separate conductor.providers.experimental namespace. Promotion shouldn't require an import-path change.
Design
1. Provider capability descriptor (applies to ALL providers, not just experimental)
Each provider declares its capabilities so conductor validate and the runtime can cross-check. Capabilities are orthogonal to tier — Copilot/Claude declare them too. Without that, the validator only catches issues in experimental, which is backwards.
Proposed mechanism (TBD during implementation): a ProviderCapabilities Pydantic model attached to each AgentProvider subclass as a class-level CAPABILITIES attribute. The factory exposes capabilities for a configured provider without needing to instantiate it (so validate works without API keys).
Proposed initial capability vocabulary (lock this list before letting providers declare against it):
Capability
Type
Notes
tier
stable | experimental
The tier label itself lives on the descriptor.
mcp_tools
bool
Honors runtime.mcp_servers and workflow tools:.
workflow_tools_passthrough
bool
Per-agent tools: allowlist is enforced (vs. ignored).
Safe to run N copies in parallel groups / for_each.
upstream_pin
str | None
E.g., "hermes-agent==0.15.2". Surfaced in the experimental banner.
maintainer
str | None
E.g., "@external-contributor (best-effort)".
2. conductor validate cross-checks
For every agent in the workflow, validate compares declared workflow features against the configured provider's capabilities. Examples:
Workflow sets reasoning.effort: high but provider's reasoning_effort doesn't include "high" → error.
Workflow has mcp_servers: but provider's mcp_tools: false → error.
Agent declares output: schema and provider's structured_output: "prompt_injection" → warning (works, but flaky).
Parallel group references a provider with concurrent_safe: false → error.
Workflow has any tools: allowlist but provider's workflow_tools_passthrough: false → warning (ignored).
Default behavior: validate exits non-zero on errors; warnings print but don't fail. Mirror the existing validator style.
3. Runtime surfacing
Console banner at run start when any agent uses an experimental provider:
⚠ Experimental provider in use: hermes (hermes-agent==0.15.2, maintainer: @external (best-effort))
Limitations: no streaming events, no MCP, reasoning_effort ignored, structured_output via prompt injection.
See docs/providers/experimental.md for stability policy.
JSONL event log: add provider_tier (and upstream_pin) to each agent's provider block in workflow_started.system — so dashboards and downstream log tooling can render the badge consistently.
Web dashboard: render an "experimental" badge on agent nodes that use an experimental provider (consumes the JSONL field — no separate API).
Per-call warnings for dynamic mismatches that validate can't catch statically (e.g., the selected model within a provider doesn't support the requested reasoning effort). Use the existing console event subscriber path; don't reach for logging.warning (it bypasses Rich formatting — see existing repo convention).
4. Optional-extras install policy
Per-provider extras, not a bulk [experimental] bucket. Keeps each provider's dependency graph isolated and limits supply-chain blast radius (a real concern for any provider wrapping a fast-moving 0.x upstream).
The provider module imports its upstream lazily so missing extras surface as a clear "install with pip install conductor[hermes]" error from the factory, not an ImportError at module load.
Non-negotiable rules. Experimental providers MUST still uphold: AgentProvider lifecycle (validate_connection / execute / close), AgentOutput shape (even if fields are None), raising real exceptions on real errors (no silent failure), declaring accurate ProviderCapabilities, providing a smoke test (import + construct + dry-run).
Stability disclaimer. The YAML surface area for an experimental provider may change between minor Conductor releases. Pin Conductor when relying on one.
6. Promotion criteria (written down so the tier doesn't become permanent purgatory)
A provider promotes from experimental → stable when ALL of:
Full parity capabilities declared (no carve-outs in active use across the test suite).
Named maintainer with a track record of responding to issues.
≥6 months of green CI on a real-API integration test (behind a marker, runs nightly or on release).
Upstream is ≥1.0 with a stated stability promise (or is a long-stable 0.x with no breaking minor releases for ≥6 months).
At least one non-trivial workflow in examples/ exercising the provider end-to-end.
7. CI
Per experimental provider: a smoke test (import + construct + dry-run + lint) that runs on every PR.
Real-API integration tests gated behind an existing or new pytest marker (real_api or similar), skipped by default.
The lint/format/typecheck pipeline must cover the new provider files (existing make check workflow should pick this up automatically).
Factory exposes capabilities for any configured provider name without instantiating it.
conductor validate cross-checks workflow features against provider capabilities and produces errors/warnings per the table above, with at least the following covered: mcp_tools, reasoning_effort, structured_output, workflow_tools_passthrough, concurrent_safe.
Console banner prints once at run start for any experimental provider, including upstream_pin and maintainer.
workflow_started.system JSONL event includes provider_tier and upstream_pin per agent's provider.
Web dashboard renders an "experimental" badge on agent nodes whose provider is experimental.
pip install conductor[<provider>] installs each experimental provider's upstream pin; missing-extra path produces a clear error from the factory.
docs/providers/experimental.md exists: explains the tier, the allowed carve-outs, the promotion criteria, the stability disclaimer.
AGENTS.md gets an "Experimental Providers" section covering allowed carve-outs, non-negotiable rules, and promotion criteria.
Re-evaluate Feat/hermes provider #235 against the framework. Hermes-as-stateless-provider may fit cleanly as experimental once carve-outs are formalized; the open design question becomes the concurrent_safe capability and what happens when a parallel group references a concurrent_safe: false provider (validate-time error vs runtime serialization).
Summary
Introduce a formal experimental provider tier with a provider capability declaration so that workflows can be statically validated against what each provider actually supports.
Motivated by two in-flight provider PRs (#104
claude-agent-sdk, #235hermes) that exposed the gap: both delegate parts of the agentic loop to an upstream SDK/framework and therefore can't honor every parity rule inAGENTS.md(streaming events, MCP passthrough,reasoning.effort, structured-output schema, resume, etc.). Rather than rejecting these case-by-case or silently letting parity rules erode, formalize a tier with explicit allowed carve-outs and a static validator that catches workflow ↔ provider mismatches atconductor validatetime.Goals
[experimental]extra).conductor validate; surface runtime mismatches via console + JSONL.Non-goals (for v1)
--allow-experimentalopt-in. Optional extras already gate installation.conductor.providers.experimentalnamespace. Promotion shouldn't require an import-path change.Design
1. Provider capability descriptor (applies to ALL providers, not just experimental)
Each provider declares its capabilities so
conductor validateand the runtime can cross-check. Capabilities are orthogonal to tier — Copilot/Claude declare them too. Without that, the validator only catches issues in experimental, which is backwards.Proposed mechanism (TBD during implementation): a
ProviderCapabilitiesPydantic model attached to eachAgentProvidersubclass as a class-levelCAPABILITIESattribute. The factory exposes capabilities for a configured provider without needing to instantiate it (sovalidateworks without API keys).Proposed initial capability vocabulary (lock this list before letting providers declare against it):
tierstable | experimentalmcp_toolsboolruntime.mcp_serversand workflowtools:.workflow_tools_passthroughbooltools:allowlist is enforced (vs. ignored).streaming_eventsboolagent_message/agent_reasoningincrementally.agent_reasoning_eventsboolagent_reasoningfor thinking content.reasoning_effortlist[Literal["low","medium","high","xhigh"]] | NoneNone= not supported.structured_outputLiteral["native","prompt_injection","none"]output:schema is enforced.interruptboolmax_session_secondsboolcheckpoint_resumeboolusage_trackingboolinput_tokens/output_tokens/model.concurrent_safeboolupstream_pinstr | None"hermes-agent==0.15.2". Surfaced in the experimental banner.maintainerstr | None"@external-contributor (best-effort)".2.
conductor validatecross-checksFor every agent in the workflow,
validatecompares declared workflow features against the configured provider's capabilities. Examples:reasoning.effort: highbut provider'sreasoning_effortdoesn't include"high"→ error.mcp_servers:but provider'smcp_tools: false→ error.output:schema and provider'sstructured_output: "prompt_injection"→ warning (works, but flaky).concurrent_safe: false→ error.tools:allowlist but provider'sworkflow_tools_passthrough: false→ warning (ignored).Default behavior:
validateexits non-zero on errors; warnings print but don't fail. Mirror the existing validator style.3. Runtime surfacing
provider_tier(andupstream_pin) to each agent'sproviderblock inworkflow_started.system— so dashboards and downstream log tooling can render the badge consistently.validatecan't catch statically (e.g., the selected model within a provider doesn't support the requested reasoning effort). Use the existing console event subscriber path; don't reach forlogging.warning(it bypasses Rich formatting — see existing repo convention).4. Optional-extras install policy
Per-provider extras, not a bulk
[experimental]bucket. Keeps each provider's dependency graph isolated and limits supply-chain blast radius (a real concern for any provider wrapping a fast-moving 0.x upstream).The provider module imports its upstream lazily so missing extras surface as a clear "install with
pip install conductor[hermes]" error from the factory, not anImportErrorat module load.5. AGENTS.md addition
New "Experimental Providers" section that names:
agent_reasoningevents, MCP tool passthrough, workflowtools:allowlist enforcement,reasoning.effortsupport, native structured output (prompt-injection acceptable),checkpoint_resume,concurrent_safe,max_session_seconds.AgentProviderlifecycle (validate_connection/execute/close),AgentOutputshape (even if fields areNone), raising real exceptions on real errors (no silent failure), declaring accurateProviderCapabilities, providing a smoke test (import + construct + dry-run).6. Promotion criteria (written down so the tier doesn't become permanent purgatory)
A provider promotes from
experimental→stablewhen ALL of:examples/exercising the provider end-to-end.7. CI
real_apior similar), skipped by default.make checkworkflow should pick this up automatically).Acceptance criteria
ProviderCapabilitiesPydantic model exists and every existing provider (Copilot, Claude, plus feat(providers): add claude-agent-sdk provider #104 once merged) declares accurate values.conductor validatecross-checks workflow features against provider capabilities and produces errors/warnings per the table above, with at least the following covered:mcp_tools,reasoning_effort,structured_output,workflow_tools_passthrough,concurrent_safe.upstream_pinandmaintainer.workflow_started.systemJSONL event includesprovider_tierandupstream_pinper agent's provider.pip install conductor[<provider>]installs each experimental provider's upstream pin; missing-extra path produces a clear error from the factory.docs/providers/experimental.mdexists: explains the tier, the allowed carve-outs, the promotion criteria, the stability disclaimer.claude-agent-sdk) declarestier: experimentaland the capability set that matches its real behavior.examples/exercises the experimental provider end-to-end (smoke test in CI, integration test behind a marker).Out of scope (track separately if pursued)
importlib.metadataproviders from 3rd-party packages).model-provider-plugin/programmatic-integrationsurface).--allow-experimentalruntime gate.Sequencing
tier: experimentaland declare its accurate capabilities. Backfill capabilities for Copilot/Claude astier: stable.concurrent_safecapability and what happens when a parallel group references aconcurrent_safe: falseprovider (validate-time error vs runtime serialization).Related
claude-agent-sdkprovider (intended first experimental member).hermesprovider (to be evaluated against the framework once landed).AGENTS.md"Provider Parity" section — the rules this issue carves explicit exceptions to.