Skip to content

teff.provider.resolve

teff.provider.resolve

Provider resolution helpers shared by the harness and graph layers.

Functions:

Name Description
resolve_provider

Resolve a provider key from an explicit value or a default name.

resolve_provider_entry

Resolve the effective :class:Provider for provider_key.

to_provider_registry

Normalize providers into a :class:ProviderRegistry.

validate_provider_refs

Enforce that every provider reference is declared in providers.

resolve_provider

resolve_provider(provider=None, default_provider=None)

Resolve a provider key from an explicit value or a default name.

The explicit provider (node-level) wins; otherwise default_provider (the graph-level default) is used. Model-name auto-detection was removed — a provider must be stated explicitly.

Raises:

Type Description
ConfigError

When neither a provider nor a default is configured.

Source code in teff/provider/resolve.py
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
def resolve_provider(
    provider: str | None = None, default_provider: str | None = None
) -> str:
    """Resolve a provider key from an explicit value or a default name.

    The explicit *provider* (node-level) wins; otherwise *default_provider*
    (the graph-level default) is used.  Model-name auto-detection was removed
    — a provider must be stated explicitly.

    Raises:
        ConfigError: When neither a provider nor a default is configured.
    """
    p = provider or default_provider
    if not p:
        raise ConfigError(
            "no provider configured: set `provider=` on the node, pass "
            "`default_provider=` to the graph, or declare a top-level "
            "`default_provider:` in the workflow"
        )
    return p.lower()

resolve_provider_entry

resolve_provider_entry(provider_key, providers=None)

Resolve the effective :class:Provider for provider_key.

When providers is a :class:ProviderRegistry or dict it is authoritative — provider_key must be declared in it. With None (a bare, standalone Harness) a built-in preset is used. Unknown names raise a :class:ConfigError — there is no silent fallback to the OpenAI shape, so typos surface early instead of silently routing to the wrong wire protocol.

Raises:

Type Description
ConfigError

When provider_key is neither declared in providers nor (with providers=None) a built-in preset name.

Source code in teff/provider/resolve.py
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
def resolve_provider_entry(
    provider_key: str,
    providers: "dict[str, Provider] | ProviderRegistry | None" = None,
) -> Provider:
    """Resolve the effective :class:`Provider` for *provider_key*.

    When *providers* is a :class:`ProviderRegistry` or dict it is
    authoritative — *provider_key* must be declared in it.  With ``None``
    (a bare, standalone ``Harness``) a built-in preset is used.  Unknown
    names raise a :class:`ConfigError` — there is no silent fallback to the
    OpenAI shape, so typos surface early instead of silently routing to the
    wrong wire protocol.

    Raises:
        ConfigError: When *provider_key* is neither declared in *providers*
            nor (with ``providers=None``) a built-in preset name.
    """
    if isinstance(providers, ProviderRegistry):
        return providers.resolve(provider_key)
    if providers and provider_key in providers:
        return providers[provider_key]
    if providers is None:
        preset = BUILTINS.get(provider_key)
        if preset is not None:
            return preset()
    raise ConfigError(
        f"unknown provider: {provider_key!r} — declare it in the `providers=` "
        f"map / `providers:` block, or name a built-in preset "
        f"({', '.join(BUILTINS)})"
    )

to_provider_registry

to_provider_registry(providers)

Normalize providers into a :class:ProviderRegistry.

Accepts an existing :class:ProviderRegistry, a {name: Provider} dict, or None (empty registry). There is no string shorthand — every provider must be an explicit instance, so graph.providers truthfully reflects what is configured.

Source code in teff/provider/resolve.py
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def to_provider_registry(
    providers: "ProviderRegistry | dict[str, Provider] | None",
) -> ProviderRegistry:
    """Normalize *providers* into a :class:`ProviderRegistry`.

    Accepts an existing :class:`ProviderRegistry`, a ``{name: Provider}``
    dict, or ``None`` (empty registry).  There is no string shorthand —
    every provider must be an explicit instance, so ``graph.providers``
    truthfully reflects what is configured.
    """
    if isinstance(providers, ProviderRegistry):
        return providers
    if providers is None:
        return ProviderRegistry()
    return ProviderRegistry(providers)

validate_provider_refs

validate_provider_refs(providers, default_provider=None, nodes=None)

Enforce that every provider reference is declared in providers.

default_provider and each node's config.provider must name a provider registered in providers — there is no implicit built-in fallback. Raises :class:ConfigError on the first undeclared name.

Source code in teff/provider/resolve.py
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def validate_provider_refs(
    providers: ProviderRegistry,
    default_provider: str | None = None,
    nodes: "dict[str, Provider] | dict | None" = None,
) -> None:
    """Enforce that every provider reference is declared in *providers*.

    *default_provider* and each node's ``config.provider`` must name a
    provider registered in *providers* — there is no implicit built-in
    fallback.  Raises :class:`ConfigError` on the first undeclared name.
    """
    valid = set(providers)
    if default_provider and default_provider not in valid:
        raise ConfigError(
            f"default_provider {default_provider!r} is not declared in "
            "`providers=` / `providers:`"
        )
    for nid, node in (nodes or {}).items():
        cfg = getattr(node, "config", None) or {}
        prov = cfg.get("provider")
        if prov and prov not in valid:
            raise ConfigError(
                f"node {nid!r}: provider {prov!r} is not declared in "
                "`providers=` / `providers:`"
            )