AIMessage.tool_calls is the standardized, provider-agnostic field for modern tool calling, while additional_kwargs.function_call is a legacy field that stores provider-specific raw outputs for backward compatibility [citation:6].
The existence of both fields is a reflection of LangChain's evolution and its commitment to both standardization and provider fidelity. tool_calls is a unified, LangChain-defined format that abstracts away the differences between how OpenAI, Anthropic, and other providers structure their tool calls. This is the field you should use in your application code for maximum compatibility. The additional_kwargs field is a container for any extra data returned by the provider that LangChain does not natively parse. The function_call sub-field is a legacy pattern from older versions and provider-specific APIs. LangChain keeps it to ensure that applications written for older versions continue to work and that users have access to raw provider output for edge cases [citation:6].