# The same order assistant in Spring AI and in LangChain4j, one question: "Where is ORD-1001?" Spring AI : ChatClient.builder(model).defaultSystem(..).defaultTools(new SpringAiTools(orders)) LangChain4j: AiServices.builder(Support.class).chatModel(model).tools(new Lc4jTools(orders)) Spring AI answer : Done: "Order ORD-1001: Status=SHIPPED, ETA=2026-10-14" LangChain4j answer : Done: Order ORD-1001: Status=SHIPPED, ETA=2026-10-14 HTTP requests sent : Spring AI 2, LangChain4j 2. Tool body executed: Spring AI 1, LangChain4j 1. What differs on the wire (computed from the four bodies below): top-level fields : Spring AI [messages, model, tools], LangChain4j [messages, model, stream, tools] tool schema : Spring AI has $schema=true additionalProperties=true; LangChain4j has $schema=false additionalProperties=false tool result message: Spring AI sent "\"Order ORD-1001: Status=SHIPPED, ETA=2026-10-14\"", LangChain4j sent "Order ORD-1001: Status=SHIPPED, ETA=2026-10-14" --- Spring AI, request 1 fields: [messages, model, tools] system: "You are a customer support agent. Use the tools for order questions. Be concise." user: "Where is ORD-1001?" tool getOrderStatus - Get current order status by order ID params {"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"orderId":{"type":"string","description":"The unique identifier of the order"}},"required":["orderId"],"additionalProperties":false} --- Spring AI, request 2 fields: [messages, model, tools] system: "You are a customer support agent. Use the tools for order questions. Be concise." user: "Where is ORD-1001?" assistant: tool_call getOrderStatus {"orderId":"ORD-1001"} tool: ""Order ORD-1001: Status=SHIPPED, ETA=2026-10-14"" tool getOrderStatus - Get current order status by order ID params {"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"orderId":{"type":"string","description":"The unique identifier of the order"}},"required":["orderId"],"additionalProperties":false} --- LangChain4j, request 1 fields: [messages, model, stream, tools] system: "You are a customer support agent. Use the tools for order questions. Be concise." user: "Where is ORD-1001?" tool getOrderStatus - Get current order status by order ID params {"type":"object","properties":{"orderId":{"type":"string","description":"The unique identifier of the order"}},"required":["orderId"]} --- LangChain4j, request 2 fields: [messages, model, stream, tools] system: "You are a customer support agent. Use the tools for order questions. Be concise." user: "Where is ORD-1001?" assistant: tool_call getOrderStatus {"orderId":"ORD-1001"} tool: "Order ORD-1001: Status=SHIPPED, ETA=2026-10-14" tool getOrderStatus - Get current order status by order ID params {"type":"object","properties":{"orderId":{"type":"string","description":"The unique identifier of the order"}},"required":["orderId"]}