diff --git a/dist/index.mjs b/dist/index.mjs
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -959,7 +959,7 @@
   model: z4.string().nullish(),
   object: z4.literal("response"),
   output: z4.array(outputItemSchema),
-  usage: xaiResponsesUsageSchema,
+  usage: xaiResponsesUsageSchema.nullish(),
   status: z4.string()
 });
 var xaiResponsesChunkSchema = z4.union([
\ No newline at end of file
@@ -1143,6 +1143,18 @@
   z4.object({
     type: z4.literal("response.completed"),
     response: xaiResponsesResponseSchema
+  }),
+  z4.object({
+    type: z4.literal("response.function_call_arguments.delta"),
+    item_id: z4.string(),
+    output_index: z4.number(),
+    delta: z4.string()
+  }),
+  z4.object({
+    type: z4.literal("response.function_call_arguments.done"),
+    item_id: z4.string(),
+    output_index: z4.number(),
+    arguments: z4.string()
   })
 ]);
 
\ No newline at end of file
@@ -1940,6 +1952,9 @@
               if (response2.status) {
                 finishReason = mapXaiResponsesFinishReason(response2.status);
               }
+              if (seenToolCalls.size > 0 && finishReason !== "tool-calls") {
+                finishReason = "tool-calls";
+              }
               return;
             }
             if (event.type === "response.output_item.added" || event.type === "response.output_item.done") {
\ No newline at end of file
@@ -2024,7 +2039,7 @@
                   }
                 }
               } else if (part.type === "function_call") {
-                if (!seenToolCalls.has(part.call_id)) {
+                if (event.type === "response.output_item.done" && !seenToolCalls.has(part.call_id)) {
                   seenToolCalls.add(part.call_id);
                   controller.enqueue({
                     type: "tool-input-start",
\ No newline at end of file
diff --git a/dist/index.js b/dist/index.js
--- a/dist/index.js
+++ b/dist/index.js
@@ -964,7 +964,7 @@
   model: import_v44.z.string().nullish(),
   object: import_v44.z.literal("response"),
   output: import_v44.z.array(outputItemSchema),
-  usage: xaiResponsesUsageSchema,
+  usage: xaiResponsesUsageSchema.nullish(),
   status: import_v44.z.string()
 });
 var xaiResponsesChunkSchema = import_v44.z.union([
\ No newline at end of file
@@ -1148,6 +1148,18 @@
   import_v44.z.object({
     type: import_v44.z.literal("response.completed"),
     response: xaiResponsesResponseSchema
+  }),
+  import_v44.z.object({
+    type: import_v44.z.literal("response.function_call_arguments.delta"),
+    item_id: import_v44.z.string(),
+    output_index: import_v44.z.number(),
+    delta: import_v44.z.string()
+  }),
+  import_v44.z.object({
+    type: import_v44.z.literal("response.function_call_arguments.done"),
+    item_id: import_v44.z.string(),
+    output_index: import_v44.z.number(),
+    arguments: import_v44.z.string()
   })
 ]);
 
\ No newline at end of file
@@ -1935,6 +1947,9 @@
               if (response2.status) {
                 finishReason = mapXaiResponsesFinishReason(response2.status);
               }
+              if (seenToolCalls.size > 0 && finishReason !== "tool-calls") {
+                finishReason = "tool-calls";
+              }
               return;
             }
             if (event.type === "response.output_item.added" || event.type === "response.output_item.done") {
\ No newline at end of file
@@ -2019,7 +2034,7 @@
                   }
                 }
               } else if (part.type === "function_call") {
-                if (!seenToolCalls.has(part.call_id)) {
+                if (event.type === "response.output_item.done" && !seenToolCalls.has(part.call_id)) {
                   seenToolCalls.add(part.call_id);
                   controller.enqueue({
                     type: "tool-input-start",
\ No newline at end of file
