diff --git a/api/src/main/java/org/apache/flink/agents/api/resource/ResourceName.java b/api/src/main/java/org/apache/flink/agents/api/resource/ResourceName.java
index 39da35aa3..762d041b2 100644
--- a/api/src/main/java/org/apache/flink/agents/api/resource/ResourceName.java
+++ b/api/src/main/java/org/apache/flink/agents/api/resource/ResourceName.java
@@ -71,6 +71,12 @@ public static final class ChatModel {
public static final String OPENAI_SETUP =
"org.apache.flink.agents.integrations.chatmodels.openai.OpenAIChatModelSetup";
+ // OpenAI Responses API
+ public static final String OPENAI_RESPONSE_CONNECTION =
+ "org.apache.flink.agents.integrations.chatmodels.openai.OpenAIResponseModelConnection";
+ public static final String OPENAI_RESPONSE_SETUP =
+ "org.apache.flink.agents.integrations.chatmodels.openai.OpenAIResponseModelSetup";
+
// Python Wrapper
public static final String PYTHON_WRAPPER_CONNECTION =
"org.apache.flink.agents.api.chat.model.python.PythonChatModelConnection";
diff --git a/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ChatModelIntegrationAgent.java b/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ChatModelIntegrationAgent.java
index 999771693..fc9023171 100644
--- a/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ChatModelIntegrationAgent.java
+++ b/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ChatModelIntegrationAgent.java
@@ -84,6 +84,11 @@ public static ResourceDescriptor chatModelConnection() {
return ResourceDescriptor.Builder.newBuilder(ResourceName.ChatModel.OPENAI_CONNECTION)
.addInitialArgument("api_key", apiKey)
.build();
+ } else if (provider.equals("OPENAI_RESPONSE")) {
+ return ResourceDescriptor.Builder.newBuilder(
+ ResourceName.ChatModel.OPENAI_RESPONSE_CONNECTION)
+ .addInitialArgument("api_key", System.getenv().get("OPENAI_API_KEY"))
+ .build();
} else if (provider.equals("ANTHROPIC")) {
String apiKey = System.getenv().get("ANTHROPIC_API_KEY");
return ResourceDescriptor.Builder.newBuilder(
@@ -133,6 +138,15 @@ public static ResourceDescriptor chatModel() {
"tools",
List.of("calculateBMI", "convertTemperature", "createRandomNumber"))
.build();
+ } else if (provider.equals("OPENAI_RESPONSES")) {
+ return ResourceDescriptor.Builder.newBuilder(
+ ResourceName.ChatModel.OPENAI_RESPONSE_SETUP)
+ .addInitialArgument("connection", "chatModelConnection")
+ .addInitialArgument("model", "gpt-4o-mini")
+ .addInitialArgument(
+ "tools",
+ List.of("calculateBMI", "convertTemperature", "createRandomNumber"))
+ .build();
} else {
throw new RuntimeException(String.format("Unknown model provider %s", provider));
}
diff --git a/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ChatModelIntegrationTest.java b/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ChatModelIntegrationTest.java
index c843b970a..75a3d5c1e 100644
--- a/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ChatModelIntegrationTest.java
+++ b/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ChatModelIntegrationTest.java
@@ -53,7 +53,7 @@ public ChatModelIntegrationTest() throws IOException {
}
@ParameterizedTest()
- @ValueSource(strings = {"ANTHROPIC", "AZURE", "OLLAMA", "OPENAI"})
+ @ValueSource(strings = {"ANTHROPIC", "AZURE", "OLLAMA", "OPENAI", "OPENAI_RESPONSES"})
public void testChatModeIntegration(String provider) throws Exception {
Assumptions.assumeTrue(
(OLLAMA.equals(provider) && ollamaReady)
diff --git a/integrations/chat-models/openai/src/main/java/org/apache/flink/agents/integrations/chatmodels/openai/OpenAIResponseModelConnection.java b/integrations/chat-models/openai/src/main/java/org/apache/flink/agents/integrations/chatmodels/openai/OpenAIResponseModelConnection.java
new file mode 100644
index 000000000..97dbabd5d
--- /dev/null
+++ b/integrations/chat-models/openai/src/main/java/org/apache/flink/agents/integrations/chatmodels/openai/OpenAIResponseModelConnection.java
@@ -0,0 +1,470 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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
+ *
+ * http://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 org.apache.flink.agents.integrations.chatmodels.openai;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.openai.client.OpenAIClient;
+import com.openai.client.okhttp.OpenAIOkHttpClient;
+import com.openai.core.JsonValue;
+import com.openai.models.ChatModel;
+import com.openai.models.Reasoning;
+import com.openai.models.ReasoningEffort;
+import com.openai.models.responses.*;
+import org.apache.flink.agents.api.chat.messages.ChatMessage;
+import org.apache.flink.agents.api.chat.messages.MessageRole;
+import org.apache.flink.agents.api.chat.model.BaseChatModelConnection;
+import org.apache.flink.agents.api.resource.Resource;
+import org.apache.flink.agents.api.resource.ResourceDescriptor;
+import org.apache.flink.agents.api.resource.ResourceType;
+import org.apache.flink.agents.api.tools.ToolMetadata;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.BiFunction;
+
+/**
+ * A dedicated OpenAI chat model integration using the Responses API.
+ *
+ *
Unlike {@link OpenAIChatModelConnection} which uses the Chat Completions API and works with
+ * any OpenAI-compatible provider (DeepSeek, DashScope, etc.), this implementation uses OpenAI's
+ * Responses API which is specific to OpenAI and offers additional capabilities:
+ *
+ *
+ * - Built-in tools (web search, file search, code interpreter)
+ *
- Native remote MCP server support
+ *
- Reasoning summaries for o-series models
+ *
- Stateful multi-turn via previous_response_id
+ *
- Response storage for later retrieval
+ *
+ *
+ * For OpenAI-compatible providers that only support the Chat Completions API, use {@link
+ * OpenAIChatModelConnection} instead.
+ *
+ *
Supported connection parameters:
+ *
+ *
+ * - api_key (required): OpenAI API key
+ *
- api_base_url (optional): Base URL for OpenAI API (useful for proxies)
+ *
- timeout (optional): Timeout in seconds for API requests
+ *
- max_retries (optional): Maximum number of retry attempts (default: 2)
+ *
- default_headers (optional): Map of default headers to include in all requests
+ *
- model (optional): Default model to use if not specified in setup
+ *
+ *
+ * Example usage:
+ *
+ *
{@code
+ * public class MyAgent extends Agent {
+ * @ChatModelConnection
+ * public static ResourceDesc openAIResponses() {
+ * return ResourceDescriptor.Builder.newBuilder(OpenAIResponseModelConnection.class.getName())
+ * .addInitialArgument("api_key", System.getenv("OPENAI_API_KEY"))
+ * .addInitialArgument("timeout", 120)
+ * .addInitialArgument("max_retries", 3)
+ * .build();
+ * }
+ * }
+ * }
+ */
+public class OpenAIResponseModelConnection extends BaseChatModelConnection {
+
+ private static final TypeReference