hi @kylebeni
from my investigation:
The error isn’t raised by LangChain - it comes from the OpenAI Python SDK’s structured-output parse helper (openai/lib/_parsing/_completions.py → validate_input_tools()). Whenever response_format is in the request payload, langchain-openai routes the call through client.chat.completions.parse(), and that helper requires every tool to have "strict": true:
# langchain_openai/chat_models/base.py
if "response_format" in payload:
raw_response = self.root_client.chat.completions.with_raw_response.parse(**payload)
Since with_structured_output(schema, tools=...) defaults to method="json_schema", response_format is always set - so with strict=False/None your tools are converted without the strict flag and the SDK throws the ValueError. That’s also why setting strict=False is a dead end: json_schema method + non-strict tools is inherently incompatible.
With strict=True, OpenAI requires your tool schemas to follow the strict subset: additionalProperties: false on every object, all properties in required (optional fields as anyOf with null, e.g. int | None), and only supported types. A free-form dict[str, Any] can’t be expressed there - replace it with an explicit Pydantic model:
class MyFuncArgs(BaseModel):
entries: list[Entry] # instead of params: dict[str, Any]
@tool(args_schema=MyFuncArgs)
def my_func_tool(entries: list[Entry]) -> str: ...
The “silently dropped parameters” symptom has the same root cause: when a type isn’t expressible in the strict subset, the schema sent to the model is degraded, so the model literally never sees those params.
Alternatives if you can’t make your tools strict-compatible:
- Use
create_agent with response_format - the recommended v1 pattern. It auto-sets strict=True on tools for OpenAI models, and ToolStrategy produces the structured output via a tool call, so strict-schema rules don’t apply to your tools:
from langchain.agents import create_agent
from langchain.agents.structured_output import ToolStrategy
agent = create_agent(model="gpt-5.5", tools=[my_func_tool],
response_format=ToolStrategy(ContactInfo))
result["structured_response"]
method="function_calling" in with_structured_output - no response_format in the payload, so the strict requirement never triggers (you lose the provider-side guarantee on the final answer).
- Two-step: plain
bind_tools() agent, then a separate with_structured_output() call (no tools) on the final text.
- Upgrade
langchain-openai - newer versions auto-default strict=True on tools when response_format is present, so the ValueError goes away by itself. You still need strict-compatible schemas - that’s an OpenAI API constraint, not a LangChain bug.
Docs: LangChain structured output, OpenAI supported schemas