Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
85d423b
init(openai-agents): Add initial Python SDK integration for AG-UI × O…
abdelrahmanzied May 16, 2026
45783ef
feat(translator): Implement AG-UI<>OpenAI Agents SDK translation logic
abdelrahmanzied Jul 5, 2026
cb02b16
feat(translator): standardize id derivation — tool results and reason…
abdelrahmanzied Jul 5, 2026
7c41a2a
feat(dependencies): remove jsonpatch from project dependencies
abdelrahmanzied Jul 6, 2026
3253d2b
feat(translator): restructure API with public interfaces and engine s…
abdelrahmanzied Jul 6, 2026
917adbd
feat(translator): enhance docstrings for clarity and consistency acro…
abdelrahmanzied Jul 6, 2026
45767d1
feat(translator): update to_agui method to accept RunResultStreaming …
abdelrahmanzied Jul 7, 2026
c118c1a
refactor(openai-agents): support streaming-only architecture and dele…
abdelrahmanzied Jul 7, 2026
c2c4783
feat(translator): add MESSAGES_SNAPSHOT support to to_agui and enhanc…
abdelrahmanzied Jul 8, 2026
91e22a8
feat(translator): update to_agui to always wrap streams with lifecycl…
abdelrahmanzied Jul 9, 2026
5280b10
feat(translator): add emit_run_error and run_error_message options to…
abdelrahmanzied Jul 9, 2026
5c9ceb9
docs: document run_error_message, emit_run_error, and guardrail handling
abdelrahmanzied Jul 9, 2026
aed91df
feat(translator): echo run_input.state as STATE_SNAPSHOT
abdelrahmanzied Jul 10, 2026
f3fd39c
docs: expand human-in-the-loop section in README
abdelrahmanzied Jul 10, 2026
7616b86
feat(openai-agents): add OpenAIAgentsAgent wrapper and FastAPI endpoi…
abdelrahmanzied Jul 11, 2026
5e306d0
feat(openai-agents): add tests for OpenAIAgentsAgent wrapper and Fast…
abdelrahmanzied Jul 11, 2026
96f88e0
test(openai-agents): add streaming event mapping coverage for SDKToAG…
abdelrahmanzied Jul 11, 2026
1387aa3
docs(openai-agents): append session notes on engine-mapping tests and…
abdelrahmanzied Jul 11, 2026
98442c0
fix(translator): defer TEXT_MESSAGE_START until first real delta
abdelrahmanzied Jul 11, 2026
5b0dcfa
feat(openai-agents): add agent examples and configuration files
abdelrahmanzied Jul 11, 2026
a5a3c8c
feat(openai-agents): add OpenAI agents Python integration and example…
abdelrahmanzied Jul 11, 2026
af4b81e
feat(openai-agents): update weather tool to return fixed data for all…
abdelrahmanzied Jul 11, 2026
ba4cae8
feat(openai-agents): add handoff and subagents demos to dojo
abdelrahmanzied Jul 12, 2026
f5ca23c
feat(translator): implement start/end custom event params in to_agui(…
abdelrahmanzied Jul 12, 2026
ad8d479
feat(dojo): show custom lifecycle event usage as per-message label
abdelrahmanzied Jul 12, 2026
b22d413
feat(translator): add initial and final state snapshot options to to_…
abdelrahmanzied Jul 12, 2026
f275c7b
chore(openai-agents): add AGENTS.md to .gitignore
abdelrahmanzied Jul 12, 2026
12ebfe9
feat(translator): update state handling in to_agui() to accept static…
abdelrahmanzied Jul 12, 2026
700b08d
feat(examples): remove handoff example with keeping translator logic
abdelrahmanzied Jul 12, 2026
6ba6e9b
feat(examples): add dynamic-system-prompt to inject user context example
abdelrahmanzied Jul 12, 2026
586697b
test(openai-agents): add multimodal content translation tests
abdelrahmanzied Jul 12, 2026
20c6190
feat(examples): add human in the loop back tool approval example
abdelrahmanzied Jul 12, 2026
08104a0
feat(logging): change debug logs to warnings for unsupported content …
abdelrahmanzied Jul 13, 2026
1bcf6c7
feat(openai-agents): restructure agents and servers examples
abdelrahmanzied Jul 13, 2026
815bfc9
feat(openai-agents): add logging for agent run start events in endpoints
abdelrahmanzied Jul 13, 2026
f559b6f
feat(openai-agents): enhance wrappers to support all translator optio…
abdelrahmanzied Jul 13, 2026
3426b18
feat(examples): add AG-UI Docs Copilot with documentation specialist …
abdelrahmanzied Jul 13, 2026
b06b1d9
feat(openai-agents): update package name to ag-ui-openai-agents and a…
abdelrahmanzied Jul 13, 2026
4bcfe57
feat(examples): update Python version requirement to 3.10 and rename …
abdelrahmanzied Jul 13, 2026
fa7d6a6
feat(openai-agents): optimize imports for python files
abdelrahmanzied Jul 13, 2026
ac66f1c
feat(openai-agents): refactor input translation and streaming logic i…
abdelrahmanzied Jul 13, 2026
0e61b9d
feat(examples): enhance AG-UI Docs Copilot with rendering tool and pr…
abdelrahmanzied Jul 13, 2026
459bef6
feat(openai-agents): introduce specialized agents for AG-UI Protocol …
abdelrahmanzied Jul 13, 2026
0d8cf42
docs(openai-agents): update OpenAI Agents SDK description for clarity
abdelrahmanzied Jul 13, 2026
6635829
feat(openai-agents): enhance README and translator documentation for …
abdelrahmanzied Jul 13, 2026
4b1b007
feat(openai-agents): rename run method to run_streamed for clarity an…
abdelrahmanzied Jul 13, 2026
85c0aad
feat(openai-agents): rename to_sdk() method to to_openai() for consis…
abdelrahmanzied Jul 13, 2026
cd3a648
feat(openai-agents): refine documentation and comments for clarity an…
abdelrahmanzied Jul 13, 2026
cd36f8c
refactor(openai-agents): rename translator classes AGUIToSDKTranslato…
abdelrahmanzied Jul 13, 2026
531f5b1
docs(stream_types): update compatibility note for StrEnum to reflect …
abdelrahmanzied Jul 14, 2026
ec0786f
refactor(openai-agents): rename RawResponseEventType to OpenAIRawResp…
abdelrahmanzied Jul 14, 2026
f2a2b56
refactor(openai-agents): drop unnecessary from __future__ import anno…
abdelrahmanzied Jul 14, 2026
13ec60a
docs(openai-agents): update README and __init__.py for improved clari…
abdelrahmanzied Jul 14, 2026
ca5c779
refactor(openai-agents): rename coerce_to_str to to_string for clarity
abdelrahmanzied Jul 14, 2026
c0f1ae5
refactor(openai-agents): move ClientToolPending class to types.py and…
abdelrahmanzied Jul 14, 2026
a7124b9
refactor(openai-agents): polish agui_to_openai translator
abdelrahmanzied Jul 15, 2026
4e7a4ba
docs(openai-agents): clarify input translation
abdelrahmanzied Jul 15, 2026
31c5cad
refactor(openai-agents): enhance OpenAIToAGUITranslator documentation…
abdelrahmanzied Jul 15, 2026
24229aa
rename(openai-agents): sdk_event -> openai_event across outbound tran…
abdelrahmanzied Jul 15, 2026
dcc0431
docs(openai-agents): update comments and documentation for clarity an…
abdelrahmanzied Jul 15, 2026
d2c35e0
docs(openai-agents): clarify outbound helpers
abdelrahmanzied Jul 15, 2026
ecc27f6
test(openai-agents): refactor project test suites
abdelrahmanzied Jul 15, 2026
f93c0ef
fix(openai-agents): hosted call_id, content drops, audio gate, parent…
abdelrahmanzied Jul 15, 2026
dfd647c
fix(examples): preserve pending approval state
abdelrahmanzied Jul 15, 2026
3551624
fix(openai-agents): search docs by section and harden approval flow
abdelrahmanzied Jul 16, 2026
83678b1
fix(openai-agents): preserve schemas and clean up runs
abdelrahmanzied Jul 17, 2026
a30d4dc
feat(openai-agents): harden wrapper setup
abdelrahmanzied Jul 17, 2026
b02decb
feat(openai-agents): refine lifecycle handling
abdelrahmanzied Jul 18, 2026
5d1bce0
refactor(openai-agents): simplify lifecycle finalization
abdelrahmanzied Jul 18, 2026
cf4ce0e
refactor(openai-agents): remove old translator server example
abdelrahmanzied Jul 18, 2026
aa972a3
fix(openai-agents): remove LLMock configuration from OpenAI Agents la…
abdelrahmanzied Jul 18, 2026
2821d4f
docs(openai-agents): update README for message and event mapping details
abdelrahmanzied Jul 18, 2026
1a388ff
fix(openai-agents): correct approval and subagent demo state
abdelrahmanzied Jul 18, 2026
17f44bb
fix(openai-agents): prevent client tool shadowing
abdelrahmanzied Jul 18, 2026
2e75817
fix(openai-agents): add required image detail
abdelrahmanzied Jul 18, 2026
0d982ce
feat(openai-agents): enhance placeholder ID management for reasoning …
abdelrahmanzied Jul 18, 2026
cf1297f
fix(openai-agents): close text on output_item.done, not output_text.don
abdelrahmanzied Jul 18, 2026
3b63fa1
refactor(openai-agents): simplify docs copilot retrieval to read-by-h…
abdelrahmanzied Jul 18, 2026
3f37103
fix(openai-agents): remove duplicate import
abdelrahmanzied Jul 18, 2026
e659f6a
fix(openai-agents): pass CustomEvent instances to custom_lifecycle_ev…
abdelrahmanzied Jul 18, 2026
cb48d1c
feat(openai-agents): report real input/output token counts in custom_…
abdelrahmanzied Jul 19, 2026
9d22b98
refactor(examples): drop tracing override, defer to SDK's own OPENAI_…
abdelrahmanzied Jul 19, 2026
34d269a
docs(openai-agents): add LICENSE and license metadata
abdelrahmanzied Jul 19, 2026
36164f0
feat(pyproject): add test script configuration for pytest
abdelrahmanzied Jul 19, 2026
1cd5b6e
ci(openai-agents): add dojo e2e matrix entry and agentic_chat spec
abdelrahmanzied Jul 19, 2026
23247a9
feat(openai-agents): add TypeScript HttpAgent client
abdelrahmanzied Jul 19, 2026
40d8471
test(openai-agents): add Dojo E2E coverage
abdelrahmanzied Jul 19, 2026
84b6676
docs(openai-agents): update references to OpenAI Agents SDK to OpenAI…
abdelrahmanzied Jul 19, 2026
a8f7892
fix(openai-agents): preserve per-message usage labels
abdelrahmanzied Jul 19, 2026
54d93c1
ci(openai-agents): add CI configuration for OpenAI Agents Python inte…
abdelrahmanzied Jul 19, 2026
bc05871
docs(openai-agents): polish ag_ui_openai_agents README.md
abdelrahmanzied Jul 19, 2026
c3bc4fc
docs(openai-agents): polish ag_ui_openai_agents examples README.mdch
abdelrahmanzied Jul 19, 2026
e7eef7a
docs(openai-agents): polish ag_ui_openai_agents dojo examples README.md
abdelrahmanzied Jul 19, 2026
5b7e3c6
CR fixes for OpenAI Agents SDK (Python) integration (stacked on #2210…
AlemTuzlak Jul 28, 2026
a6aa39c
Merge branch 'main' into feat/openai-agents
abdelrahmanzied Jul 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/dojo-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,10 @@ jobs:
test_path: tests/agUiDotnetTests
services: ["dojo", "ag-ui-dotnet"]
wait_on: http://localhost:9999,tcp:localhost:8023
- suite: openai-agents-python
test_path: tests/openaiAgentsPythonTests
services: ["dojo", "openai-agents-python"]
wait_on: http://localhost:9999,tcp:localhost:8024
# - suite: vercel-ai-sdk
# test_path: tests/vercelAISdkTests
# services: ["dojo"]
Expand Down
13 changes: 13 additions & 0 deletions .github/workflows/unit-python-sdk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ on:
- "integrations/adk-middleware/python/**"
- "integrations/aws-strands/python/**"
- "integrations/langroid/python/**"
- "integrations/openai-agents/python/**"
- "integrations/crew-ai/python/**"
- ".github/workflows/unit-python-sdk.yml"
pull_request:
Expand All @@ -21,6 +22,7 @@ on:
- "integrations/adk-middleware/python/**"
- "integrations/aws-strands/python/**"
- "integrations/langroid/python/**"
- "integrations/openai-agents/python/**"
- "integrations/crew-ai/python/**"
- ".github/workflows/unit-python-sdk.yml"

Expand Down Expand Up @@ -336,6 +338,7 @@ jobs:
working-directory: integrations/langroid/python
run: uv run python -m unittest discover tests -v

openai-agents-python:
crewai-python:
runs-on: ubuntu-latest

Expand Down Expand Up @@ -366,6 +369,16 @@ jobs:
id: cached-uv-dependencies
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: integrations/openai-agents/python/.venv
key: ${{ steps.fork-check.outputs.prefix }}venv-${{ runner.os }}-openai-agents-python-${{ hashFiles('integrations/openai-agents/python/uv.lock') }}

- name: Install dependencies
working-directory: integrations/openai-agents/python
run: uv sync

- name: Run tests
working-directory: integrations/openai-agents/python
run: uv run pytest
path: integrations/crew-ai/python/.venv
key: ${{ steps.fork-check.outputs.prefix }}venv-${{ runner.os }}-crewai-${{ hashFiles('integrations/crew-ai/python/uv.lock') }}

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,6 @@ node_modules

# actionlint linter binary (dev tool, do not commit)
/actionlint

# Dev
.playwright-mcp/
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ AG-UI was born from CopilotKit's initial **partnership** with LangGraph and Crew
| ---------- | ------- | ---------------- |
| [Claude Agent SDK](https://github.com/ag-ui-protocol/ag-ui/tree/main/integrations/claude-agent-sdk) | ✅ Supported | 🎮 [Demos](https://dojo.ag-ui.com/claude-agent-sdk-python/feature/shared_state) |
| [Langroid](https://github.com/ag-ui-protocol/ag-ui/tree/main/integrations/langroid) | ✅ Supported | 🎮 [Demos](https://dojo.ag-ui.com/langroid/feature/shared_state) |
| [OpenAI Agent SDK](https://openai.github.io/openai-agents-python/) | 🛠️ In Progress | – |
| [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/) | 🛠️ In Progress | – |
| [Cloudflare Agents](https://developers.cloudflare.com/agents/) | 🛠️ In Progress | – |


Expand Down
8 changes: 8 additions & 0 deletions apps/dojo/e2e/aimock-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { LLMock, type ChatMessage } from "@copilotkit/aimock";
import * as path from "node:path";
import { registerA2UIRecoveryFixtures } from "./a2ui-recovery-fixtures";
import { registerA2UIADKFixtures } from "./a2ui-adk-fixtures";
import { registerOpenAIAgentsFixtures } from "./openai-agents-fixtures";

// Configurable so parallel worktrees / runs don't collide on one aimock port.
const MOCK_PORT = Number(process.env.AIMOCK_PORT) || 5555;
Expand Down Expand Up @@ -31,6 +32,7 @@ export async function setupLLMock(): Promise<void> {
// OSS-162 A2UI recovery showcase fixtures (predicate fixtures, must precede
// the generic loadFixtureFile below).
registerA2UIRecoveryFixtures(mockServer);
registerOpenAIAgentsFixtures(mockServer);

// Extract text from message content — handles both string and array-of-parts
// (Strands SDK sends content as [{type: "text", text: "..."}])
Expand Down Expand Up @@ -1339,6 +1341,12 @@ export async function setupLLMock(): Promise<void> {
);
if (hasCrewExitTool && textOf(last.content) === "Crew exited")
return false;
const hasOpenAIAgentsSupervisorTools = req.tools?.some((t) =>
["research_topic", "write_prose", "critique_draft"].includes(
t.function.name,
),
);
if (hasOpenAIAgentsSupervisorTools) return false;
return true;
},
},
Expand Down
192 changes: 192 additions & 0 deletions apps/dojo/e2e/openai-agents-fixtures.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
import { LLMock, type ChatMessage } from "@copilotkit/aimock";

function textOf(content: ChatMessage["content"] | undefined): string {
if (typeof content === "string") return content;
if (!Array.isArray(content)) return "";
return content
.filter((part) => part.type === "text" && typeof part.text === "string")
.map((part) => part.text)
.join("");
}

export function registerOpenAIAgentsFixtures(mockServer: LLMock): void {
const hasTool = (
req: { tools?: { function: { name: string } }[] },
name: string,
) => req.tools?.some((tool) => tool.function.name === name) ?? false;
const messagesText = (messages: ChatMessage[]) =>
messages.map((message) => textOf(message.content)).join("\n");
const systemText = (messages: ChatMessage[]) =>
messages
.filter((message) => message.role === "system")
.map((message) => textOf(message.content))
.join("\n");

mockServer.addFixture({
match: {
predicate: (req) =>
hasTool(req, "read_ag_ui_openai_agents_docs") &&
messagesText(req.messages).includes(
"test the OpenAI Agents integration",
),
},
response: {
toolCalls: [
{
name: "read_ag_ui_openai_agents_docs",
arguments: JSON.stringify({ heading: "Testing" }),
},
],
},
});

mockServer.addFixture({
match: {
predicate: (req) =>
hasTool(req, "issue_refund") &&
messagesText(req.messages).includes("ORD-1001"),
},
response: {
toolCalls: [
{
name: "issue_refund",
arguments: JSON.stringify({ order_id: "ORD-1001" }),
},
],
},
});

const hasSupervisorTools = (req: {
tools?: { function: { name: string } }[];
}) =>
["research_topic", "write_prose", "critique_draft"].every((name) =>
hasTool(req, name),
);

mockServer.addFixture({
match: {
predicate: (req) =>
systemText(req.messages).includes("You research a topic") &&
!hasSupervisorTools(req),
},
response: {
content:
"AI research facts: symbolic AI began in the 1950s; machine learning later became dominant.",
},
});

mockServer.addFixture({
match: {
predicate: (req) =>
systemText(req.messages).includes("You turn bullet-point facts") &&
!hasSupervisorTools(req),
},
response: {
content:
"AI evolved from symbolic systems into modern machine learning and generative models.",
},
});

mockServer.addFixture({
match: {
predicate: (req) =>
systemText(req.messages).includes("You review a draft") &&
!hasSupervisorTools(req),
},
response: {
content:
"1. Improve the opening. 2. Connect the historical eras more clearly.",
},
});

mockServer.addFixture({
match: {
predicate: (req) => {
if (!hasSupervisorTools(req)) return false;
const text = messagesText(req.messages);
return !text.includes("AI research facts");
},
},
response: {
toolCalls: [
{
name: "research_topic",
arguments: JSON.stringify({ input: "history of AI" }),
},
],
},
});

mockServer.addFixture({
match: {
predicate: (req) => {
if (!hasSupervisorTools(req)) return false;
const text = messagesText(req.messages);
return (
text.includes("AI research facts") &&
!text.includes("AI evolved from symbolic systems")
);
},
},
response: {
toolCalls: [
{
name: "write_prose",
arguments: JSON.stringify({ input: "AI research facts" }),
},
],
},
});

mockServer.addFixture({
match: {
predicate: (req) => {
if (!hasSupervisorTools(req)) return false;
const text = messagesText(req.messages);
return (
text.includes("AI evolved from symbolic systems") &&
!text.includes("Improve the opening")
);
},
},
response: {
toolCalls: [
{
name: "critique_draft",
arguments: JSON.stringify({
input:
"AI evolved from symbolic systems into modern machine learning and generative models.",
}),
},
],
},
});

mockServer.addFixture({
match: {
predicate: (req) =>
hasSupervisorTools(req) &&
messagesText(req.messages).includes("Improve the opening"),
},
response: {
content:
"Artificial intelligence grew from early symbolic programs into machine learning and today's generative systems.",
},
});

mockServer.addFixture({
match: {
predicate: (req) =>
systemText(req.messages).includes("Always reply in Arabic"),
},
response: { content: "مرحبًا! أنا أجيب باللغة العربية." },
});

mockServer.addFixture({
match: {
predicate: (req) =>
systemText(req.messages).includes("Always reply in German"),
},
response: { content: "Hallo! Ich antworte auf Deutsch." },
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { test } from "../../test-isolation-helper";
import { AgenticChatPage } from "../../featurePages/AgenticChatPage";

test("[OpenAI Agents Python] Agentic Chat sends and receives a greeting message", async ({
page,
}) => {
await page.goto("/openai-agents-python/feature/agentic_chat");
const chat = new AgenticChatPage(page);
await chat.openChat();
await chat.sendMessage("Hi");
await chat.assertUserMessageVisible("Hi");
await chat.assertAgentReplyVisible(/Hello|Hi|hey/i);
});

test("[OpenAI Agents Python] Agentic Chat retains memory of previous questions", async ({
page,
}) => {
test.slow();
await page.goto("/openai-agents-python/feature/agentic_chat");
const chat = new AgenticChatPage(page);
await chat.openChat();
await chat.sendMessage("Hi, my name is Alex");
await chat.assertUserMessageVisible("Hi, my name is Alex");
await chat.assertAgentReplyVisible(/Hello|Hi|Alex/i);
await chat.sendMessage("What is my name?");
await chat.assertUserMessageVisible("What is my name?");
await chat.assertAgentReplyVisible(/Alex/i);
});

test("[OpenAI Agents Python] Agentic Chat retains user messages during a conversation", async ({
page,
}) => {
test.slow();
await page.goto("/openai-agents-python/feature/agentic_chat");
const chat = new AgenticChatPage(page);
await chat.openChat();
await chat.sendMessage("Hey there");
await chat.assertAgentReplyVisible(/Hello|Hi/i);
await chat.sendMessage("My favorite fruit is Mango");
await chat.assertAgentReplyVisible(/Mango/i);
await chat.sendMessage("and I love listening to Kaavish");
await chat.assertAgentReplyVisible(/Kaavish/i);
await chat.sendMessage("Can you remind me what my favorite fruit is?");
await chat.assertAgentReplyVisible(/Mango/i);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { expect, test } from "../../test-isolation-helper";

test("[OpenAI Agents Python] Backend Tool Rendering displays a weather card", async ({
page,
}) => {
await page.goto("/openai-agents-python/feature/backend_tool_rendering");

await page.getByRole("button", { name: "Weather in San Francisco" }).click();

await expect(page.getByTestId("weather-card").last()).toBeVisible();
await expect(page.getByText("Humidity").last()).toBeVisible();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { expect, test } from "../../test-isolation-helper";
import { sendAndAwaitResponse } from "../../utils/copilot-actions";

test("[OpenAI Agents Python] Custom Lifecycle Events keeps usage with each reply", async ({
page,
}) => {
await page.goto("/openai-agents-python/feature/custom_lifecycle_events");

await sendAndAwaitResponse(page, "Hi");
await sendAndAwaitResponse(page, "Tell me one interesting fact about AI.");

const usageLabels = page.getByLabel("Run usage");
await expect(usageLabels).toHaveCount(2);
for (const usage of await usageLabels.all()) {
await expect(usage).toContainText(/\d+ input tokens/);
await expect(usage).toContainText(/\d+ output tokens/);
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { expect, test } from "../../test-isolation-helper";
import { sendAndAwaitResponse } from "../../utils/copilot-actions";

test("[OpenAI Agents Python] Docs Copilot reads the integration documentation", async ({
page,
}) => {
await page.goto("/openai-agents-python/feature/ag_ui_docs_copilot");

await sendAndAwaitResponse(
page,
"How do I test the OpenAI Agents integration?",
);

await expect(page.getByText("AG-UI OpenAI Agents docs").last()).toBeVisible();
await expect(page.getByText('Read "Testing"').last()).toBeVisible();
});
Loading