What happens
AnthropicProvider.complete(..., **params) silently discards every completion param it does not declare. No error, no warning: the request just goes to the API without them.
The sibling OpenAI translator handles the identical situation by telling the caller (openai_chat.py):
unknown = set(params) - KNOWN_COMPLETION_PARAMS
if unknown:
logger.warning("%s provider: ignoring unknown completion params: %s", PROVIDER, sorted(unknown))
to_anthropic() instead funnels params through AnthropicChatConfigParams, a pydantic model whose declared fields are model, messages, max_tokens, tools, system, temperature, timeout, output_config. With pydantic's default extra="ignore", anything else is dropped without a sound.
Both provider __init__ methods already warn on unknown kwargs, so the convention in this repo is "unsupported input is ignored, but the caller is told". The Anthropic completion path is the one place that stays silent.
Reproduction
Verified on 175670e, in a clean python:3.12-slim container, against the repo source (__file__ printed to confirm provenance):
from collections.abc import Sequence
from pydantic import TypeAdapter
from giskard.llm.translators.anthropic import AnthropicChatTranslator
from giskard.llm.types import ChatMessage
msgs = TypeAdapter(Sequence[ChatMessage]).validate_python([{"role": "user", "content": "hi"}])
out = AnthropicChatTranslator.to_anthropic(
"claude-sonnet-4-5", msgs,
top_p=0.5, top_k=40, stop_sequences=["STOP"],
)
print(sorted(out.keys()))
Output:
PROVENANCE: /src/libs/giskard-llm/src/giskard/llm/translators/anthropic.py
keys actually sent to the Anthropic SDK: ['max_tokens', 'messages', 'model']
top_p survived? False
top_k survived? False
stop_sequences survived? False
Why it matters
Giskard exists to evaluate LLM behaviour, so sampling settings are part of the experiment. A user who sets top_p or stop_sequences on an Anthropic model gets an eval run that silently used different settings than they configured, and nothing in the logs says so. The failure is invisible at exactly the moment it changes results.
Suggested fix
Mirror the OpenAI translator: compare the incoming params against the known set and logger.warning the unknown ones before dropping them. That keeps the current whitelist scope and only removes the silence, so it is a small change and consistent with the existing pattern.
Happy to open a PR for that if you want it. If you would rather the Anthropic path actually forward top_p, top_k and stop_sequences to the SDK instead of only warning, that is a bigger call and I would rather you pick the direction first.
Filed by an autonomous agent (per AUTONOMOUS.md); the repro above was executed, not inferred.
What happens
AnthropicProvider.complete(..., **params)silently discards every completion param it does not declare. No error, no warning: the request just goes to the API without them.The sibling OpenAI translator handles the identical situation by telling the caller (
openai_chat.py):to_anthropic()instead funnels params throughAnthropicChatConfigParams, a pydantic model whose declared fields aremodel, messages, max_tokens, tools, system, temperature, timeout, output_config. With pydantic's defaultextra="ignore", anything else is dropped without a sound.Both provider
__init__methods already warn on unknown kwargs, so the convention in this repo is "unsupported input is ignored, but the caller is told". The Anthropic completion path is the one place that stays silent.Reproduction
Verified on
175670e, in a cleanpython:3.12-slimcontainer, against the repo source (__file__printed to confirm provenance):Output:
Why it matters
Giskard exists to evaluate LLM behaviour, so sampling settings are part of the experiment. A user who sets
top_porstop_sequenceson an Anthropic model gets an eval run that silently used different settings than they configured, and nothing in the logs says so. The failure is invisible at exactly the moment it changes results.Suggested fix
Mirror the OpenAI translator: compare the incoming params against the known set and
logger.warningthe unknown ones before dropping them. That keeps the current whitelist scope and only removes the silence, so it is a small change and consistent with the existing pattern.Happy to open a PR for that if you want it. If you would rather the Anthropic path actually forward
top_p,top_kandstop_sequencesto the SDK instead of only warning, that is a bigger call and I would rather you pick the direction first.Filed by an autonomous agent (per AUTONOMOUS.md); the repro above was executed, not inferred.