teff.provider.providers¶
teff.provider.providers
¶
Backward-compatible alias for the :mod:teff.provider package.
Provider machinery now lives in focused submodules (base, registry,
resolve, concurrency, and one module per built-in preset); this
module only re-exports it so from teff.provider.providers import ...
keeps working.
Classes:
| Name | Description |
|---|---|
Provider |
A named model endpoint: wire protocol + endpoint data. |
ProviderRegistry |
A named collection of providers. |
Functions:
| Name | Description |
|---|---|
provider_concurrency |
Return the current global concurrency limit for provider (if any). |
resolve_provider |
Resolve a provider key from an explicit value or a default name. |
resolve_provider_entry |
Resolve the effective :class: |
set_provider_concurrency |
Globally cap concurrent model calls for provider. |
to_provider_registry |
Normalize providers into a :class: |
validate_provider_refs |
Enforce that every provider reference is declared in providers. |
Provider
¶
A named model endpoint: wire protocol + endpoint data.
name is the registry key used by provider= references.
type is the protocol discriminator — openai_compatible /
anthropic_compatible / ollama — and decides the request body,
streaming chunk parsing, and response extraction held by
:class:~teff.harness.Harness.
Built-in presets subclass this and set name (and the other fields)
once; a custom provider is a plain instance. Fields may be overridden
at construction:
Provider(name="my-vllm", type="openai_compatible", base_url="http://vllm:8000/v1")
type is deliberately a distinct concept from name: the name is
just a key and never carries protocol meaning.
Methods:
| Name | Description |
|---|---|
from_mapping |
Build from a config dict, keeping only known fields. |
to_dict |
All provider fields as a plain dict (for YAML serialisation). |
Source code in teff/provider/builtin/base.py
22 23 24 25 26 27 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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | |
from_mapping
classmethod
¶
from_mapping(cfg)
Build from a config dict, keeping only known fields.
Source code in teff/provider/builtin/base.py
58 59 60 61 | |
to_dict
¶
to_dict()
All provider fields as a plain dict (for YAML serialisation).
Source code in teff/provider/builtin/base.py
63 64 65 | |
ProviderRegistry
¶
A named collection of providers.
Register providers once and reference them by name anywhere a provider
key is expected. The registry starts empty and is authoritative: an
unregistered name raises :class:ConfigError rather than silently
loading a built-in preset — every provider a graph uses must be
declared here.
Because the canonical input is a dict {name: Provider}, the same
value can also be built from one and consumed with :func:dict-style
lookups, so graph.run(state, providers={...}) keeps working.
Example::
from teff import Provider, ProviderRegistry
reg = ProviderRegistry()
reg.register(Provider(name="vllm", base_url="http://vllm:8000/v1"))
reg.register(AnthropicCompatibleProvider(name="claude-proxy", base_url="http://proxy"))
graph = Graph(
{"llm": LLM(model="m", provider="claude-proxy")}, [], "llm",
providers=reg,
default_provider="claude-proxy",
)
await graph.run({})
Registering a name that is already registered (including by a previous
call) raises :class:ConfigError — names are unique.
Methods:
| Name | Description |
|---|---|
from_presets |
Build a registry holding the named built-in presets. |
items |
Registered |
register |
Add provider under |
resolve |
Resolve name to a registered :class: |
Source code in teff/provider/registry.py
19 20 21 22 23 24 25 26 27 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 53 54 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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | |
from_presets
classmethod
¶
from_presets(*names)
Build a registry holding the named built-in presets.
Convenience for declaring built-ins explicitly::
reg = ProviderRegistry.from_presets("openai", "ollama")
An unknown preset name raises :class:ConfigError.
Source code in teff/provider/registry.py
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | |
items
¶
items()
Registered (name, provider) pairs (custom entries only).
Source code in teff/provider/registry.py
111 112 113 | |
register
¶
register(provider)
Add provider under provider.name; returns self for chaining.
Raises:
| Type | Description |
|---|---|
ConfigError
|
If |
Source code in teff/provider/registry.py
64 65 66 67 68 69 70 71 72 73 74 75 | |
resolve
¶
resolve(name)
Resolve name to a registered :class:Provider.
Only explicitly registered providers are usable. Unknown names
raise :class:ConfigError.
Source code in teff/provider/registry.py
77 78 79 80 81 82 83 84 85 86 87 88 89 | |
provider_concurrency
¶
provider_concurrency(provider)
Return the current global concurrency limit for provider (if any).
Returns the active semaphore's capacity (explicit or auto-grown via
max_parallel), or None when the provider has no semaphore.
Source code in teff/provider/concurrency.py
44 45 46 47 48 49 50 | |
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 | |
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 |
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 | |
set_provider_concurrency
¶
set_provider_concurrency(provider, limit)
Globally cap concurrent model calls for provider.
Overrides any per-harness max_parallel for that provider.
Pass limit <= 0 to remove the cap.
Source code in teff/provider/concurrency.py
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | |
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 | |
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 | |