diff --git a/core/src/main/java/com/google/adk/models/ChatCompletionsResponse.java b/core/src/main/java/com/google/adk/models/ChatCompletionsResponse.java
deleted file mode 100644
index fe5cdd116..000000000
--- a/core/src/main/java/com/google/adk/models/ChatCompletionsResponse.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright 2026 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.adk.models;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Data Transfer Objects for Chat Completion and Chat Completion Chunk API responses.
- *
- *
These classes are used for deserializing JSON responses from the `/chat/completions` endpoint.
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-final class ChatCompletionsResponse {
-
- private ChatCompletionsResponse() {}
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class ChatCompletion {
- public String id;
- public List choices;
- public Long created;
- public String model;
- public String object;
-
- @JsonProperty("service_tier")
- public String serviceTier;
-
- @JsonProperty("system_fingerprint")
- public String systemFingerprint;
-
- public Usage usage;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class Choice {
- @JsonProperty("finish_reason")
- public String finishReason;
-
- public Integer index;
- public Logprobs logprobs;
- public Message message;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class ChatCompletionChunk {
- public String id;
- public List choices;
- public Long created;
- public String model;
- public String object;
-
- @JsonProperty("service_tier")
- public String serviceTier;
-
- @JsonProperty("system_fingerprint")
- public String systemFingerprint;
-
- public Usage usage;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class ChunkChoice {
- @JsonProperty("finish_reason")
- public String finishReason;
-
- public Integer index;
- public Logprobs logprobs;
- public Message delta;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class Message {
- public String content;
- public String refusal;
- public String role;
-
- @JsonProperty("tool_calls")
- public List toolCalls;
-
- // function_call is not supported in ChatCompletionChunk and ChatCompletion support is
- // deprecated.
- @JsonProperty("function_call")
- public Function functionCall; // Fallback for deprecated top-level function calls
-
- public List annotations;
- public Audio audio;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class ToolCall {
- // Index is only used in ChatCompletionChunk.
- public Integer index;
- public String id;
- public String type;
- public Function function;
- public Custom custom;
-
- @JsonProperty("extra_content")
- public Map extraContent;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class Function {
- public String name;
- public String arguments; // JSON string
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class Custom {
- public String input;
- public String name;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class Logprobs {
- public List content;
- public List refusal;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- @JsonInclude(JsonInclude.Include.NON_NULL)
- static class TokenLogprob {
- public String token;
- public List bytes;
- public Double logprob;
-
- @JsonProperty("top_logprobs")
- public List topLogprobs;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class Usage {
- @JsonProperty("completion_tokens")
- public Integer completionTokens;
-
- @JsonProperty("prompt_tokens")
- public Integer promptTokens;
-
- @JsonProperty("total_tokens")
- public Integer totalTokens;
-
- @JsonProperty("thoughts_token_count")
- public Integer thoughtsTokenCount; // Gemini-specific extension
-
- @JsonProperty("completion_tokens_details")
- public CompletionTokensDetails completionTokensDetails;
-
- @JsonProperty("prompt_tokens_details")
- public PromptTokensDetails promptTokensDetails;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class CompletionTokensDetails {
- @JsonProperty("accepted_prediction_tokens")
- public Integer acceptedPredictionTokens;
-
- @JsonProperty("audio_tokens")
- public Integer audioTokens;
-
- @JsonProperty("reasoning_tokens")
- public Integer reasoningTokens;
-
- @JsonProperty("rejected_prediction_tokens")
- public Integer rejectedPredictionTokens;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class PromptTokensDetails {
- @JsonProperty("audio_tokens")
- public Integer audioTokens;
-
- @JsonProperty("cached_tokens")
- public Integer cachedTokens;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class Annotation {
- public String type;
-
- @JsonProperty("url_citation")
- public UrlCitation urlCitation;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class UrlCitation {
- @JsonProperty("end_index")
- public Integer endIndex;
-
- @JsonProperty("start_index")
- public Integer startIndex;
-
- public String title;
- public String url;
- }
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- static class Audio {
- public String id;
- public String data;
-
- @JsonProperty("expires_at")
- public Long expiresAt;
-
- public String transcript;
- }
-}
diff --git a/core/src/main/java/com/google/adk/models/chat/ChatCompletionsCommon.java b/core/src/main/java/com/google/adk/models/chat/ChatCompletionsCommon.java
new file mode 100644
index 000000000..cd5b4d7bf
--- /dev/null
+++ b/core/src/main/java/com/google/adk/models/chat/ChatCompletionsCommon.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.adk.models.chat;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.genai.types.FunctionCall;
+import com.google.genai.types.Part;
+import java.util.Base64;
+import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
+/** Shared models for Chat Completions Request and Response. */
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+final class ChatCompletionsCommon {
+
+ private ChatCompletionsCommon() {}
+
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+
+ public static final String ROLE_ASSISTANT = "assistant";
+ public static final String ROLE_MODEL = "model";
+
+ public static final String METADATA_KEY_ID = "id";
+ public static final String METADATA_KEY_CREATED = "created";
+ public static final String METADATA_KEY_OBJECT = "object";
+ public static final String METADATA_KEY_SYSTEM_FINGERPRINT = "system_fingerprint";
+ public static final String METADATA_KEY_SERVICE_TIER = "service_tier";
+
+ /**
+ * See
+ * https://developers.openai.com/api/reference/resources/chat#(resource)%20chat.completions%20%3E%20(model)%20chat_completion_message_tool_call%20%3E%20(schema)
+ */
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ static class ToolCall {
+ /** See class definition for more details. */
+ public Integer index;
+
+ /** See class definition for more details. */
+ public String id;
+
+ /** See class definition for more details. */
+ public String type;
+
+ /** See class definition for more details. */
+ public Function function;
+
+ /** See class definition for more details. */
+ public Custom custom;
+
+ /**
+ * Used to supply additional parameters for specific models, for example:
+ * https://ai.google.dev/gemini-api/docs/openai#thinking
+ */
+ @JsonProperty("extra_content")
+ public Map extraContent;
+
+ /**
+ * Converts the tool call to a {@link Part}.
+ *
+ * @return a {@link Part} containing the function call, or {@code null} if this tool call does
+ * not contain a function call.
+ */
+ public @Nullable Part toPart() {
+ if (function != null) {
+ FunctionCall fc = function.toFunctionCall(id);
+ Part part = Part.builder().functionCall(fc).build();
+ return applyThoughtSignature(part);
+ }
+ return null;
+ }
+
+ /**
+ * Applies the thought signature from {@code extraContent} to the given {@link Part} if present.
+ * This is used to support the Google Gemini/Vertex AI implementation of the chat/completions
+ * API.
+ *
+ * @param part the {@link Part} to modify.
+ * @return a new {@link Part} with the thought signature applied, or the original {@link Part}
+ * if no thought signature is found.
+ */
+ public Part applyThoughtSignature(Part part) {
+ if (extraContent != null && extraContent.containsKey("google")) {
+ Object googleObj = extraContent.get("google");
+ if (googleObj instanceof Map, ?> googleMap) {
+ Object sigObj = googleMap.get("thought_signature");
+ if (sigObj instanceof String sig) {
+ return part.toBuilder().thoughtSignature(Base64.getDecoder().decode(sig)).build();
+ }
+ }
+ }
+ return part;
+ }
+ }
+
+ /**
+ * See
+ * https://developers.openai.com/api/reference/resources/chat#(resource)%20chat.completions%20%3E%20(model)%20chat_completion_message_function_tool_call%20%3E%20(schema)
+ */
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ static class Function {
+ /** See class definition for more details. */
+ public String name;
+
+ /** See class definition for more details. */
+ public String arguments; // JSON string
+
+ /**
+ * Converts this function to a {@link FunctionCall}.
+ *
+ * @param toolCallId the ID of the tool call, or {@code null} if not applicable.
+ * @return the {@link FunctionCall} object.
+ */
+ public FunctionCall toFunctionCall(@Nullable String toolCallId) {
+ FunctionCall.Builder fcBuilder = FunctionCall.builder();
+ if (name != null) {
+ fcBuilder.name(name);
+ }
+ if (arguments != null) {
+ try {
+ Map args =
+ objectMapper.readValue(arguments, new TypeReference