DeepSeekProvider#

Connect a provider and configure retries, credentials, and transport. See the guide.

class zett_agent.providers.deepseek.DeepSeekProvider(model, api_key, transport=None, *, base_url=None, temperature=None, response=False, retry=RetryOptions(base_delay=0.25, max_delay=8.0, max_retries=3), send_prompt_cache_key=False, extra_headers=None, extra_query=None, extra_body=None, timeout=TimeoutOptions(connect=5.0, first_byte=60.0, idle=600.0))[source]#

Stream DeepSeek through its OpenAI-compatible protocol.

Parameters:
  • model (str) – DeepSeek model identifier accepted by the endpoint.

  • api_key (str) – API credential supplied by the application.

  • transport (httpx.AsyncBaseTransport | None) – Optional HTTPX transport for custom routing or tests.

  • base_url (str | None) – API root; None uses the default DeepSeek v1 endpoint.

  • temperature (float | None) – Optional provider sampling temperature.

  • response (bool) – Use DeepSeek’s Responses-compatible endpoint instead of Chat Completions.

  • retry (RetryOptions) – Model-owned retry/backoff policy; never restarts an emitted stream.

  • timeout (TimeoutOptions) – How long the provider may stay silent before the request is given up on: connecting, waiting for the response headers, and between chunks of a response that has started. See TimeoutOptions; a timeout raises ProviderTimeoutError and is not retried.

  • send_prompt_cache_key (bool) – Declare the run’s prompt cache key on every request. Off by default: DeepSeek caches context automatically and its compatibility endpoint does not document the field. Enable it for gateways that route on the key.

  • extra_headers (Mapping[str, str] | None) – HTTP headers sent on every request after the adapter’s own, for gateways that route or bill on a header. A header given here replaces the SDK default of the same name.

  • extra_query (Mapping[str, str] | None) – URL query parameters sent on every request, such as the api-version an Azure-style endpoint requires.

  • extra_body (Mapping[str, JsonValue] | None) – JSON fields merged into every request body last, so they add a vendor option the adapter does not model and may override one it does, such as thinking.

Note

Cache-hit counters are normalized into ModelUsage. Reasoning deltas are emitted only when returned by the provider. Returned reasoning is retained in AssistantMessage and replayed as reasoning_content in later requests, which is required by DeepSeek thinking mode. Close with aclose().

Examples

Select the model explicitly rather than inferring it from the key:

model = DeepSeekProvider(
    model="deepseek-chat",
    api_key=os.environ["DEEPSEEK_API_KEY"],
)
try:
    client = await create_agent(model)
    print((await client.run("Explain this function")).content)
finally:
    await model.aclose()

Note

Reasoning effort is mapped only for models whose endpoint supports the corresponding request fields. A selected effort does not guarantee that the server will return reasoning deltas.

See also

ReasoningEffort lists provider-neutral levels, and Connect a model provider covers shared provider lifecycle rules.

provider_name = 'openai'#

Name stored on messages this provider produced and compared before reasoning is replayed.

request_fields(request)[source]#

Switch thinking on or off, and give the effort to the models that take one.

Parameters:

request (ModelRequest)

Return type:

dict[str, JsonValue]

async aclose()#

Close the SDK’s owned HTTP connection pool.

Return type:

None

chat_stop(finish_reason, *, has_tool_calls, refusal_text, stream_error, native_finish_reason)#

Say why the response ended. Override it for a service with finish reasons of its own.

Parameters:
  • finish_reason (str | None)

  • has_tool_calls (bool)

  • refusal_text (str)

  • stream_error (Mapping[str, JsonValue])

  • native_finish_reason (str | None)

Return type:

StopInfo

merge_replay(blocks, fragment)#

Add one streamed opaque block (ChatDelta.replay) to the ones collected so far.

The default appends. A service that streams one block in pieces overrides this to join them, and blocks is what finally becomes replay_blocks.

Parameters:
Return type:

None

native_deferred_tools = False#

See zett_agent.model.NativeDeferredToolsModel.native_deferred_tools. A provider opts in by overriding this on its class; the default keeps Responses, Chat Completions, Google, and Ollama on the withhold-and-search path.

read_delta(delta)#

Read one streamed delta.

The default reads content, refusal, tool_calls, and the first of reasoning_keys that has text. A service with fields of its own returns a ChatDelta that also carries them, usually by extending super().read_delta.

Parameters:

delta (Mapping[str, JsonValue])

Return type:

ChatDelta

read_usage(usage)#

Read the usage object of a chunk.

The default accepts every spelling of the cache and reasoning counters that the compatible services use.

Parameters:

usage (Mapping[str, JsonValue])

Return type:

ModelUsage

reasoning_keys = ('reasoning_content', 'reasoning')#

Fields of a streamed delta that carry reasoning text, in order of preference. Services differ on the name (reasoning_content and reasoning are the two in use), and reading both is harmless because only the first one that has text is used.

replay_reasoning(message, payload)#

Add what this service needs of an earlier assistant turn to its rendered payload.

The default returns the reasoning as reasoning_content, which reasoning services expect to see again on later requests. A message from another provider is skipped, because reasoning from one model is not context for another.

Parameters:
Return type:

None

response = False#

Whether this adapter uses a Responses-style endpoint instead of its provider’s traditional message or chat-completions endpoint. Only the providers read it; the runtime does not.

status_error(error)#

Turn an HTTP failure into the typed error the runtime reports.

The default reports a refusal the service sent as an HTTP error, a rejected credential, and everything else as ProviderHTTPError. A service that explains failures in a body of its own overrides this and falls back to super().

Parameters:

error (APIStatusError)

Return type:

ProviderError

sync(*, runtime=None)#

Return a context-managed synchronous view; optionally share a runtime.

Omitting runtime creates a new background thread for this view. Passing an existing runtime reuses its loop and leaves its shutdown to the caller. This API is for service entry points, not Extension lifecycle hooks.

Examples

Use a model or tool from a plain function:

with read_file.sync() as read:
    result = read({"path": "README.md"})
Parameters:

runtime (SyncRuntime | None)

Return type:

SyncObject[Self]

vendor_headers()#

Return the headers this service wants on every request.

They are sent before extra_headers, so the application can still replace one.

Return type:

dict[str, str]