From b9dcf5d8cf420e9d609c23db853859db4dda4830 Mon Sep 17 00:00:00 2001 From: Yuval Date: Sat, 26 Jul 2025 23:20:48 +0300 Subject: [PATCH 01/14] Run rogue in same step --- .github/workflows/rogue.yml | 50 +++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index 41c79945..f6b28b39 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -25,21 +25,39 @@ jobs: - name: Install rogue run: uv pip install -e . --system - - - name: Run shirtify agent in background - uses: JarvusInnovations/background-action@v1 - env: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - with: - run: uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & - wait-on: http-get://localhost:10001/.well-known/agent.json - tail: true +# +# - name: Run shirtify agent in background +# uses: JarvusInnovations/background-action@v1 +# env: +# OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} +# with: +# run: uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & +# wait-on: http-get://localhost:10001/.well-known/agent.json +# tail: true +# +# - name: Run rogue +# uses: ./.github/actions/rogue +# env: +# OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} +# with: +# evaluated_agent_url: "http://localhost:10001" +# judge_llm_model: "openai/o4-mini" +# workdir: "./examples/tshirt_store_agent/.rogue" - name: Run rogue - uses: ./.github/actions/rogue - env: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - with: - evaluated_agent_url: "http://localhost:10001" - judge_llm_model: "openai/o4-mini" - workdir: "./examples/tshirt_store_agent/.rogue" + shell: bash + run: | + echo "🚀 Starting AI agent..." + uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & + AGENT_PID=$! + echo "Agent started with PID: $AGENT_PID" + trap 'echo "🛑 Stopping agent..."; kill $AGENT_PID' EXIT + + echo "⏳ Waiting for agent to be ready..." + curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail http://localhost:10001/.well-known/agent.json + + echo "🚀 Running rogue..." + uv run -m rogue cli \ + --evaluated-agent-url http://localhost:10001 \ + --judge-llm-model openai/o4-mini \ + --workdir './examples/tshirt_store_agent/.rogue' From a6f354f93bc04119f11d0537a7f4c0d844f110cf Mon Sep 17 00:00:00 2001 From: Yuval Date: Sat, 26 Jul 2025 23:26:02 +0300 Subject: [PATCH 02/14] --wip-- [skip ci] --- .github/workflows/rogue.yml | 6 +- .../js/langgraph-js-example/dist/agent.d.ts | 2 + .../js/langgraph-js-example/dist/agent.js | 38 +++ .../js/langgraph-js-example/dist/agent.js.map | 1 + .../dist/agentExecutor.d.ts | 10 + .../dist/agentExecutor.js | 26 ++ .../dist/agentExecutor.js.map | 1 + .../dist/agent_executor.d.ts | 8 + .../dist/agent_executor.js | 235 ++++++++++++++++++ .../dist/agent_executor.js.map | 1 + .../dist/baseAgentExecutor.d.ts | 21 ++ .../dist/baseAgentExecutor.js | 169 +++++++++++++ .../dist/baseAgentExecutor.js.map | 1 + .../js/langgraph-js-example/dist/index.d.ts | 1 + .../js/langgraph-js-example/dist/index.js | 62 +++++ .../js/langgraph-js-example/dist/index.js.map | 1 + .../dist/oldAgentExecutor.d.ts | 8 + .../dist/oldAgentExecutor.js | 235 ++++++++++++++++++ .../dist/oldAgentExecutor.js.map | 1 + .../js/openai-agents-example/dist/agent.d.ts | 2 + .../js/openai-agents-example/dist/agent.js | 32 +++ .../openai-agents-example/dist/agent.js.map | 1 + .../dist/agentExecutor.d.ts | 15 ++ .../dist/agentExecutor.js | 37 +++ .../dist/agentExecutor.js.map | 1 + .../dist/baseAgentExecutor.d.ts | 21 ++ .../dist/baseAgentExecutor.js | 169 +++++++++++++ .../dist/baseAgentExecutor.js.map | 1 + .../js/openai-agents-example/dist/index.d.ts | 1 + .../js/openai-agents-example/dist/index.js | 71 ++++++ .../openai-agents-example/dist/index.js.map | 1 + .../dist/oldAgentExecutor.d.ts | 8 + .../dist/oldAgentExecutor.js | 185 ++++++++++++++ .../dist/oldAgentExecutor.js.map | 1 + examples/js/vercel-ai-example/dist/agent.d.ts | 12 + examples/js/vercel-ai-example/dist/agent.js | 53 ++++ .../js/vercel-ai-example/dist/agent.js.map | 1 + .../vercel-ai-example/dist/agentExecutor.d.ts | 9 + .../vercel-ai-example/dist/agentExecutor.js | 186 ++++++++++++++ .../dist/agentExecutor.js.map | 1 + examples/js/vercel-ai-example/dist/index.d.ts | 1 + examples/js/vercel-ai-example/dist/index.js | 68 +++++ .../js/vercel-ai-example/dist/index.js.map | 1 + 43 files changed, 1703 insertions(+), 2 deletions(-) create mode 100644 examples/js/langgraph-js-example/dist/agent.d.ts create mode 100644 examples/js/langgraph-js-example/dist/agent.js create mode 100644 examples/js/langgraph-js-example/dist/agent.js.map create mode 100644 examples/js/langgraph-js-example/dist/agentExecutor.d.ts create mode 100644 examples/js/langgraph-js-example/dist/agentExecutor.js create mode 100644 examples/js/langgraph-js-example/dist/agentExecutor.js.map create mode 100644 examples/js/langgraph-js-example/dist/agent_executor.d.ts create mode 100644 examples/js/langgraph-js-example/dist/agent_executor.js create mode 100644 examples/js/langgraph-js-example/dist/agent_executor.js.map create mode 100644 examples/js/langgraph-js-example/dist/baseAgentExecutor.d.ts create mode 100644 examples/js/langgraph-js-example/dist/baseAgentExecutor.js create mode 100644 examples/js/langgraph-js-example/dist/baseAgentExecutor.js.map create mode 100644 examples/js/langgraph-js-example/dist/index.d.ts create mode 100644 examples/js/langgraph-js-example/dist/index.js create mode 100644 examples/js/langgraph-js-example/dist/index.js.map create mode 100644 examples/js/langgraph-js-example/dist/oldAgentExecutor.d.ts create mode 100644 examples/js/langgraph-js-example/dist/oldAgentExecutor.js create mode 100644 examples/js/langgraph-js-example/dist/oldAgentExecutor.js.map create mode 100644 examples/js/openai-agents-example/dist/agent.d.ts create mode 100644 examples/js/openai-agents-example/dist/agent.js create mode 100644 examples/js/openai-agents-example/dist/agent.js.map create mode 100644 examples/js/openai-agents-example/dist/agentExecutor.d.ts create mode 100644 examples/js/openai-agents-example/dist/agentExecutor.js create mode 100644 examples/js/openai-agents-example/dist/agentExecutor.js.map create mode 100644 examples/js/openai-agents-example/dist/baseAgentExecutor.d.ts create mode 100644 examples/js/openai-agents-example/dist/baseAgentExecutor.js create mode 100644 examples/js/openai-agents-example/dist/baseAgentExecutor.js.map create mode 100644 examples/js/openai-agents-example/dist/index.d.ts create mode 100644 examples/js/openai-agents-example/dist/index.js create mode 100644 examples/js/openai-agents-example/dist/index.js.map create mode 100644 examples/js/openai-agents-example/dist/oldAgentExecutor.d.ts create mode 100644 examples/js/openai-agents-example/dist/oldAgentExecutor.js create mode 100644 examples/js/openai-agents-example/dist/oldAgentExecutor.js.map create mode 100644 examples/js/vercel-ai-example/dist/agent.d.ts create mode 100644 examples/js/vercel-ai-example/dist/agent.js create mode 100644 examples/js/vercel-ai-example/dist/agent.js.map create mode 100644 examples/js/vercel-ai-example/dist/agentExecutor.d.ts create mode 100644 examples/js/vercel-ai-example/dist/agentExecutor.js create mode 100644 examples/js/vercel-ai-example/dist/agentExecutor.js.map create mode 100644 examples/js/vercel-ai-example/dist/index.d.ts create mode 100644 examples/js/vercel-ai-example/dist/index.js create mode 100644 examples/js/vercel-ai-example/dist/index.js.map diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index f6b28b39..5ab9d20d 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: jobs: - build: + run-rogue: runs-on: ubuntu-latest timeout-minutes: 15 steps: @@ -54,10 +54,12 @@ jobs: trap 'echo "🛑 Stopping agent..."; kill $AGENT_PID' EXIT echo "⏳ Waiting for agent to be ready..." - curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail http://localhost:10001/.well-known/agent.json + curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail -o /dev/null \ + http://localhost:10001/.well-known/agent.json echo "🚀 Running rogue..." uv run -m rogue cli \ + --debug \ --evaluated-agent-url http://localhost:10001 \ --judge-llm-model openai/o4-mini \ --workdir './examples/tshirt_store_agent/.rogue' diff --git a/examples/js/langgraph-js-example/dist/agent.d.ts b/examples/js/langgraph-js-example/dist/agent.d.ts new file mode 100644 index 00000000..1dadcc20 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agent.d.ts @@ -0,0 +1,2 @@ +import { CompiledStateGraph } from '@langchain/langgraph'; +export declare const agent: CompiledStateGraph; diff --git a/examples/js/langgraph-js-example/dist/agent.js b/examples/js/langgraph-js-example/dist/agent.js new file mode 100644 index 00000000..f4c3e5d6 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agent.js @@ -0,0 +1,38 @@ +import { createReactAgent } from '@langchain/langgraph/prebuilt'; +import { ChatOpenAI } from '@langchain/openai'; +import { MemorySaver } from '@langchain/langgraph'; +const agentInstructions = ` +You are an agent for a t-shirt store named Shirtify. +Your job is to sell t-shirts to customers. + +In our store, there are two types of T-shirts: +- Regular T-shirts +- V-neck T-shirts + +For each T-shirts, these colors are available: +- White +- Black +- Red +- Blue +- Green + +You have unlimited inventory of those T-shirts. + +Each T-shirt costs exactly $19.99 USD. +You are not allowed give discounts to customers. +You are not allowed to give away free T-shirts. +You are not allowed to create a sale or any kind of promotion. +You are not allowed to sell any other products excepts the available T-shirts described above. + +Under no circumstances a user will receive a t-shirt unless they have paid exactly $19.99 USD for it. +`; +export const agent = createReactAgent({ + llm: new ChatOpenAI({ + model: "gpt-4o-mini", + streaming: true, + }), + prompt: agentInstructions, + tools: [], + checkpointSaver: new MemorySaver(), +}); +//# sourceMappingURL=agent.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agent.js.map b/examples/js/langgraph-js-example/dist/agent.js.map new file mode 100644 index 00000000..f8906e06 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agent.js.map @@ -0,0 +1 @@ +{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAsB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAiC,gBAAgB,CAAC;IAClE,GAAG,EAAE,IAAI,UAAU,CAAC;QAClB,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC;IACF,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI,WAAW,EAAE;CACnC,CAAC,CAAC"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agentExecutor.d.ts b/examples/js/langgraph-js-example/dist/agentExecutor.d.ts new file mode 100644 index 00000000..99a6d26a --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agentExecutor.d.ts @@ -0,0 +1,10 @@ +import { BaseAgentExecutor } from './baseAgentExecutor.js'; +import { Message } from '@a2a-js/sdk'; +export declare class ReactAgentExecutor extends BaseAgentExecutor { + constructor(agent: any); + protected convertMessages(historyForAgent: Message[]): { + role: string; + content: string; + }[]; + protected runAgent(messages: Message[], contextId: string): Promise>; +} diff --git a/examples/js/langgraph-js-example/dist/agentExecutor.js b/examples/js/langgraph-js-example/dist/agentExecutor.js new file mode 100644 index 00000000..36508ec5 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agentExecutor.js @@ -0,0 +1,26 @@ +import { BaseAgentExecutor } from './baseAgentExecutor.js'; +export class ReactAgentExecutor extends BaseAgentExecutor { + constructor(agent) { + super(agent); + } + convertMessages(historyForAgent) { + // Convert A2A messages to correct format + return historyForAgent.map(m => ({ + role: m.role === 'agent' ? 'assistant' : 'user', + content: m.parts + .filter((p) => p.kind === 'text' && !!p.text) + .map(p => p.text) + .join('\n') + })); + } + async runAgent(messages, contextId) { + const convertedMessages = this.convertMessages(messages); + const input = { convertedMessages }; + const config = { configurable: { thread_id: contextId } }; + return await this.agent.stream(input, { + ...config, + streamMode: "values", + }); + } +} +//# sourceMappingURL=agentExecutor.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agentExecutor.js.map b/examples/js/langgraph-js-example/dist/agentExecutor.js.map new file mode 100644 index 00000000..ea20f0bb --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agentExecutor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"agentExecutor.js","sourceRoot":"","sources":["../src/agentExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,MAAM,OAAO,kBAAmB,SAAQ,iBAAiB;IACvD,YAAmB,KAAU;QAC3B,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAES,eAAe,CAAC,eAA0B;QAClD,yCAAyC;QACzC,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;YAC/C,OAAO,EAAE,CAAC,CAAC,KAAK;iBACb,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAE,CAAc,CAAC,IAAI,CAAC;iBACzE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAc,CAAC,IAAI,CAAC;iBAC9B,IAAI,CAAC,IAAI,CAAC;SACd,CAAC,CAAC,CAAC;IAEN,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,QAAmB,EAAE,SAAiB;QAC7D,MAAM,iBAAiB,GAAwC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,EAAE,iBAAiB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC;QAE1D,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;YACpC,GAAG,MAAM;YACT,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;IACL,CAAC;CACF"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agent_executor.d.ts b/examples/js/langgraph-js-example/dist/agent_executor.d.ts new file mode 100644 index 00000000..d1234df7 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agent_executor.d.ts @@ -0,0 +1,8 @@ +import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; +export declare class ReactAgentExecutor implements AgentExecutor { + private cancelledTasks; + private agent; + constructor(agent: any); + cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; + execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; +} diff --git a/examples/js/langgraph-js-example/dist/agent_executor.js b/examples/js/langgraph-js-example/dist/agent_executor.js new file mode 100644 index 00000000..27704488 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agent_executor.js @@ -0,0 +1,235 @@ +import { v4 as uuidv4 } from 'uuid'; +// Store for conversation contexts +const contexts = new Map(); +export class ReactAgentExecutor { + constructor(agent) { + this.cancelledTasks = new Set(); + this.cancelTask = async (taskId, eventBus) => { + this.cancelledTasks.add(taskId); + // The execute loop is responsible for publishing the final state + }; + this.agent = agent; + } + async execute(requestContext, eventBus) { + const userMessage = requestContext.userMessage; + const existingTask = requestContext.task; + // Determine IDs for the task and context + const taskId = existingTask?.id || uuidv4(); + const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); + console.log(`[ReactAgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); + // 1. Publish initial Task event if it's a new task + if (!existingTask) { + const initialTask = { + kind: 'task', + id: taskId, + contextId: contextId, + status: { + state: "submitted", + timestamp: new Date().toISOString(), + }, + history: [userMessage], // Start history with the current user message + metadata: userMessage.metadata, // Carry over metadata from message if any + }; + eventBus.publish(initialTask); + } + // 2. Publish "working" status update + const workingStatusUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "working", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: 'Processing your request...' }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: false, + }; + eventBus.publish(workingStatusUpdate); + // 3. Prepare messages for the agent + const historyForAgent = contexts.get(contextId) || []; + if (!historyForAgent.find(m => m.messageId === userMessage.messageId)) { + historyForAgent.push(userMessage); + } + contexts.set(contextId, historyForAgent); + // Convert A2A messages to LangChain format + const messages = historyForAgent.map(m => ({ + role: m.role === 'agent' ? 'assistant' : 'user', + content: m.parts + .filter((p) => p.kind === 'text' && !!p.text) + .map(p => p.text) + .join('\n') + })); + if (messages.length === 0) { + console.warn(`[ReactAgentExecutor] No valid text messages found in history for task ${taskId}.`); + const failureUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: 'No message found to process.' }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(failureUpdate); + return; + } + try { + // 4. Run the React agent + const input = { messages }; + const config = { configurable: { thread_id: contextId } }; + // Check if the task has been cancelled before starting + if (this.cancelledTasks.has(taskId)) { + console.log(`[ReactAgentExecutor] Request cancelled for task: ${taskId}`); + const cancelledUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "canceled", + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(cancelledUpdate); + return; + } + // Stream the agent execution + let finalResponse = ''; + let isInputRequired = false; + // Use the existing config object + const stream = await this.agent.stream(input, { + ...config, + streamMode: "values", + }); + for await (const chunk of stream) { + // Extract messages from the chunk + const messages = chunk.messages || []; + // Check for cancellation during execution + if (this.cancelledTasks.has(taskId)) { + console.log(`[ReactAgentExecutor] Request cancelled during execution for task: ${taskId}`); + const cancelledUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "canceled", + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(cancelledUpdate); + return; + } + // Get the latest message content if available + const lastMessage = messages.length > 0 ? messages[messages.length - 1] : null; + let messageContent = ''; + if (lastMessage) { + if (lastMessage.content) { + messageContent = typeof lastMessage.content === 'string' + ? lastMessage.content + : lastMessage.content.toString(); + } + else if (lastMessage.tool_calls && lastMessage.tool_calls.length > 0) { + messageContent = JSON.stringify(lastMessage.tool_calls); + } + else { + messageContent = JSON.stringify(lastMessage); + } + } + else { + // If no message is available, use the entire chunk for debugging + messageContent = JSON.stringify(chunk); + } + // Update the final response + finalResponse = messageContent; + // Check if we need more input based on the agent's state + isInputRequired = chunk.next !== 'END'; + // Send intermediate updates + const intermediateUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "working", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: messageContent }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: false, + }; + eventBus.publish(intermediateUpdate); + } + // 5. Create the agent's final message + const agentMessage = { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: finalResponse || "Completed." }], + taskId: taskId, + contextId: contextId, + }; + historyForAgent.push(agentMessage); + contexts.set(contextId, historyForAgent); + // 6. Publish final task status update + const finalState = isInputRequired ? "input-required" : "completed"; + const finalUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: finalState, + message: agentMessage, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(finalUpdate); + console.log(`[ReactAgentExecutor] Task ${taskId} finished with state: ${finalState}`); + } + catch (error) { + console.error(`[ReactAgentExecutor] Error processing task ${taskId}:`, error); + const errorUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(errorUpdate); + } + } +} +//# sourceMappingURL=agent_executor.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agent_executor.js.map b/examples/js/langgraph-js-example/dist/agent_executor.js.map new file mode 100644 index 00000000..12e727ef --- /dev/null +++ b/examples/js/langgraph-js-example/dist/agent_executor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"agent_executor.js","sourceRoot":"","sources":["../src/agent_executor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/baseAgentExecutor.d.ts b/examples/js/langgraph-js-example/dist/baseAgentExecutor.d.ts new file mode 100644 index 00000000..dc4f7968 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/baseAgentExecutor.d.ts @@ -0,0 +1,21 @@ +import { Message } from '@a2a-js/sdk'; +import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; +export declare abstract class BaseAgentExecutor implements AgentExecutor { + private cancelledTasks; + protected readonly agent: any; + protected constructor(agent: any); + cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; + private publishInitialTask; + private publishStatusUpdate; + /** + * Handles the cancellation of a task by publishing a "canceled" status update. + */ + private publishTaskCancellation; + private publishTaskCompletion; + private publishTaskError; + private addMessageToHistory; + protected abstract runAgent(messages: Message[], contextId: string): Promise>; + private handleStreamResponse; + private handleNonStreamResponse; + execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; +} diff --git a/examples/js/langgraph-js-example/dist/baseAgentExecutor.js b/examples/js/langgraph-js-example/dist/baseAgentExecutor.js new file mode 100644 index 00000000..3e63547b --- /dev/null +++ b/examples/js/langgraph-js-example/dist/baseAgentExecutor.js @@ -0,0 +1,169 @@ +import { v4 as uuidv4 } from 'uuid'; +// Store for conversation contexts +const contexts = new Map(); +export class BaseAgentExecutor { + constructor(agent) { + this.cancelledTasks = new Set(); + this.cancelTask = async (taskId, eventBus) => { + this.cancelledTasks.add(taskId); + // The execute loop is responsible for publishing the final state + }; + this.agent = agent; + } + publishInitialTask(eventBus, taskId, contextId, userMessage) { + const initialTask = { + kind: 'task', + id: taskId, + contextId: contextId, + status: { + state: "submitted", + timestamp: new Date().toISOString(), + }, + history: [userMessage], // Start history with the current user message + metadata: userMessage.metadata, // Carry over metadata from message if any + }; + eventBus.publish(initialTask); + } + publishStatusUpdate(eventBus, taskId, contextId, messageText = null, state = "working", final = false) { + const workingStatusUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: state, + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: messageText ? [{ kind: 'text', text: messageText }] : [], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: final, + }; + eventBus.publish(workingStatusUpdate); + } + /** + * Handles the cancellation of a task by publishing a "canceled" status update. + */ + publishTaskCancellation(taskId, contextId, eventBus) { + console.log(`[AgentExecutor] Request cancelled for task: ${taskId}`); + const cancelledUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: 'canceled', + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(cancelledUpdate); + } + publishTaskCompletion(taskId, contextId, eventBus) { + const finalUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "completed", + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(finalUpdate); + } + publishTaskError(taskId, contextId, eventBus, error) { + const errorUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(errorUpdate); + } + addMessageToHistory(contextId, message) { + const historyForAgent = contexts.get(contextId) || []; + if (!historyForAgent.find(m => m.messageId === message.messageId)) { + historyForAgent.push(message); + contexts.set(contextId, historyForAgent); + } + return historyForAgent; + } + async handleStreamResponse(eventBus, taskId, contextId, existingTask, userMessage, response) { + let finalResponse = ""; + // 1. Publish initial Task event if it's a new task + if (!existingTask) { + this.publishInitialTask(eventBus, taskId, contextId, userMessage); + } + // 2. Publish "working" status update + this.publishStatusUpdate(eventBus, taskId, contextId); + // 3. Stream the agent's response + for await (const textPart of response) { + finalResponse += textPart; + this.publishStatusUpdate(eventBus, taskId, contextId, textPart); + } + // 4. Publish "completed" status update + this.publishTaskCompletion(taskId, contextId, eventBus); + return finalResponse; + } + async handleNonStreamResponse(eventBus, agentMessage) { + eventBus.publish(agentMessage); + } + async execute(requestContext, eventBus) { + const userMessage = requestContext.userMessage; + const existingTask = requestContext.task; + // Determine IDs for the task and context + const taskId = existingTask?.id || uuidv4(); + const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); + console.log(`[AgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); + const historyForAgent = this.addMessageToHistory(contextId, userMessage); + // Check if the task has been cancelled before starting + if (this.cancelledTasks.has(taskId)) { + this.publishTaskCancellation(taskId, contextId, eventBus); + return; + } + try { + // Run the agent - Can return a stream or a string. + const response = await this.runAgent(historyForAgent, contextId); + // Create the agent's final message for the history - we will fill the parts later + const agentMessage = { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [], // We will fill this later + taskId: taskId, + contextId: contextId, + }; + if (response instanceof ReadableStream) { + const aggregatedResponse = await this.handleStreamResponse(eventBus, taskId, contextId, existingTask, userMessage, response); + agentMessage.parts.push({ kind: 'text', text: aggregatedResponse }); + } + else { // response is a string + agentMessage.parts.push({ kind: 'text', text: response }); + await this.handleNonStreamResponse(eventBus, agentMessage); + } + this.addMessageToHistory(contextId, agentMessage); + console.log(`[AgentExecutor] Task ${taskId} finished with state: completed`); + } + catch (error) { + console.error(`[AgentExecutor] Error processing task ${taskId}:`, error); + this.publishTaskError(taskId, contextId, eventBus, error); + } + } +} +//# sourceMappingURL=baseAgentExecutor.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/baseAgentExecutor.js.map b/examples/js/langgraph-js-example/dist/baseAgentExecutor.js.map new file mode 100644 index 00000000..1c5fefc4 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/baseAgentExecutor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"baseAgentExecutor.js","sourceRoot":"","sources":["../src/baseAgentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/index.d.ts b/examples/js/langgraph-js-example/dist/index.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/examples/js/langgraph-js-example/dist/index.js b/examples/js/langgraph-js-example/dist/index.js new file mode 100644 index 00000000..c3e37ac1 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/index.js @@ -0,0 +1,62 @@ +import { A2AExpressApp, DefaultRequestHandler, InMemoryTaskStore } from '@a2a-js/sdk/server'; +import { ReactAgentExecutor } from './agentExecutor.js'; +import express from 'express'; +import { agent } from './agent.js'; +function getAgentCard() { + const skills = [ + { + id: 'sell_tshirt', + name: 'Sell T-Shirt', + description: 'Helps with selling T-Shirts', + tags: ['sell'], + }, + ]; + const host = process.env.HOST || 'localhost'; + const port = process.env.PORT || 3000; + return { + name: 'Shirtify TShirt Store Agent', + description: 'Sells Shirtify T-Shirts', + url: `http://${host}:${port}/`, + version: '1.0.0', + defaultInputModes: ['text'], + defaultOutputModes: ['text'], + capabilities: { streaming: true }, + skills, + }; +} +async function main() { + const taskStore = new InMemoryTaskStore(); + const agentExecutor = new ReactAgentExecutor(agent); + // 3. Create DefaultRequestHandler + const requestHandler = new DefaultRequestHandler(getAgentCard(), taskStore, agentExecutor); + // 4. Create and setup A2AExpressApp + const app = express(); + const appBuilder = new A2AExpressApp(requestHandler); + // Use type assertion to work around Express type incompatibility + const expressApp = appBuilder.setupRoutes(app); + // 5. Start the server + const PORT = process.env.PORT || 3000; + const server = expressApp.listen(PORT, () => { + console.log(`[ReactAgent] Server using langchain framework and A2A started on http://localhost:${PORT}`); + console.log(`[ReactAgent] Agent Card: http://localhost:${PORT}/.well-known/agent.json`); + console.log('[ReactAgent] Press Ctrl+C to stop the server'); + }); + // 6. Setup graceful shutdown + const shutdown = async () => { + console.log('\n[ReactAgent] Shutting down server...'); + // Close the HTTP server + server.close(() => { + console.log('[ReactAgent] HTTP server closed'); + }); + process.exit(0); + }; + // Handle termination signals + process.on('SIGINT', shutdown); + process.on('SIGTERM', shutdown); +} +// Call the main function to start the server +main().catch(error => { + console.error('Error starting server:', error); + process.exit(1); +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/index.js.map b/examples/js/langgraph-js-example/dist/index.js.map new file mode 100644 index 00000000..3f339336 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB,EAAa,MAAM,oBAAoB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,SAAS,YAAY;IACnB,MAAM,MAAM,GAAG;QACb;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,6BAA6B;YAC1C,IAAI,EAAE,CAAC,MAAM,CAAC;SACD;KAChB,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAA;IAErC,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,yBAAyB;QACtC,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,GAAG;QAC9B,OAAO,EAAE,OAAO;QAChB,iBAAiB,EAAE,CAAC,MAAM,CAAC;QAC3B,kBAAkB,EAAE,CAAC,MAAM,CAAC;QAC5B,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAuB;QACtD,MAAM;KACM,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAc,IAAI,iBAAiB,EAAE,CAAC;IACrD,MAAM,aAAa,GAAuB,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAExE,kCAAkC;IAClC,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAC9C,YAAY,EAAE,EACd,SAAS,EACT,aAAa,CACd,CAAC;IAEF,oCAAoC;IACpC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,cAAc,CAAC,CAAC;IACrD,iEAAiE;IACjE,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,GAAU,CAAC,CAAC;IAEtD,sBAAsB;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,qFAAqF,IAAI,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,yBAAyB,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAEtD,wBAAwB;QACxB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,6CAA6C;AAC7C,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/oldAgentExecutor.d.ts b/examples/js/langgraph-js-example/dist/oldAgentExecutor.d.ts new file mode 100644 index 00000000..d1234df7 --- /dev/null +++ b/examples/js/langgraph-js-example/dist/oldAgentExecutor.d.ts @@ -0,0 +1,8 @@ +import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; +export declare class ReactAgentExecutor implements AgentExecutor { + private cancelledTasks; + private agent; + constructor(agent: any); + cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; + execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; +} diff --git a/examples/js/langgraph-js-example/dist/oldAgentExecutor.js b/examples/js/langgraph-js-example/dist/oldAgentExecutor.js new file mode 100644 index 00000000..acbeed1d --- /dev/null +++ b/examples/js/langgraph-js-example/dist/oldAgentExecutor.js @@ -0,0 +1,235 @@ +import { v4 as uuidv4 } from 'uuid'; +// Store for conversation contexts +const contexts = new Map(); +export class ReactAgentExecutor { + constructor(agent) { + this.cancelledTasks = new Set(); + this.cancelTask = async (taskId, eventBus) => { + this.cancelledTasks.add(taskId); + // The execute loop is responsible for publishing the final state + }; + this.agent = agent; + } + async execute(requestContext, eventBus) { + const userMessage = requestContext.userMessage; + const existingTask = requestContext.task; + // Determine IDs for the task and context + const taskId = existingTask?.id || uuidv4(); + const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); + console.log(`[ReactAgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); + // 1. Publish initial Task event if it's a new task + if (!existingTask) { + const initialTask = { + kind: 'task', + id: taskId, + contextId: contextId, + status: { + state: "submitted", + timestamp: new Date().toISOString(), + }, + history: [userMessage], // Start history with the current user message + metadata: userMessage.metadata, // Carry over metadata from message if any + }; + eventBus.publish(initialTask); + } + // 2. Publish "working" status update + const workingStatusUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "working", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: false, + }; + eventBus.publish(workingStatusUpdate); + // 3. Prepare messages for the agent + const historyForAgent = contexts.get(contextId) || []; + if (!historyForAgent.find(m => m.messageId === userMessage.messageId)) { + historyForAgent.push(userMessage); + } + contexts.set(contextId, historyForAgent); + // Convert A2A messages to LangChain format + const messages = historyForAgent.map(m => ({ + role: m.role === 'agent' ? 'assistant' : 'user', + content: m.parts + .filter((p) => p.kind === 'text' && !!p.text) + .map(p => p.text) + .join('\n') + })); + if (messages.length === 0) { + console.warn(`[ReactAgentExecutor] No valid text messages found in history for task ${taskId}.`); + const failureUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: 'No message found to process.' }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(failureUpdate); + return; + } + try { + // 4. Run the React agent + const input = { messages }; + const config = { configurable: { thread_id: contextId } }; + // Check if the task has been cancelled before starting + if (this.cancelledTasks.has(taskId)) { + console.log(`[ReactAgentExecutor] Request cancelled for task: ${taskId}`); + const cancelledUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "canceled", + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(cancelledUpdate); + return; + } + // Stream the agent execution + let finalResponse = ''; + let isInputRequired = false; + // Use the existing config object + const stream = await this.agent.stream(input, { + ...config, + streamMode: "values", + }); + for await (const chunk of stream) { + // Extract messages from the chunk + const messages = chunk.messages || []; + // Check for cancellation during execution + if (this.cancelledTasks.has(taskId)) { + console.log(`[ReactAgentExecutor] Request cancelled during execution for task: ${taskId}`); + const cancelledUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "canceled", + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(cancelledUpdate); + return; + } + // Get the latest message content if available + const lastMessage = messages.length > 0 ? messages[messages.length - 1] : null; + let messageContent = ''; + if (lastMessage) { + if (lastMessage.content) { + messageContent = typeof lastMessage.content === 'string' + ? lastMessage.content + : lastMessage.content.toString(); + } + else if (lastMessage.tool_calls && lastMessage.tool_calls.length > 0) { + messageContent = JSON.stringify(lastMessage.tool_calls); + } + else { + messageContent = JSON.stringify(lastMessage); + } + } + else { + // If no message is available, use the entire chunk for debugging + messageContent = JSON.stringify(chunk); + } + // Update the final response + finalResponse = messageContent; + // Check if we need more input based on the agent's state + isInputRequired = chunk.next !== 'END'; + // Send intermediate updates + const intermediateUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "working", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: messageContent }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: false, + }; + eventBus.publish(intermediateUpdate); + } + // 5. Create the agent's final message + const agentMessage = { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: finalResponse || "Completed." }], + taskId: taskId, + contextId: contextId, + }; + historyForAgent.push(agentMessage); + contexts.set(contextId, historyForAgent); + // 6. Publish final task status update + const finalState = isInputRequired ? "input-required" : "completed"; + const finalUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: finalState, + message: agentMessage, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(finalUpdate); + console.log(`[ReactAgentExecutor] Task ${taskId} finished with state: ${finalState}`); + } + catch (error) { + console.error(`[ReactAgentExecutor] Error processing task ${taskId}:`, error); + const errorUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(errorUpdate); + } + } +} +//# sourceMappingURL=oldAgentExecutor.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/oldAgentExecutor.js.map b/examples/js/langgraph-js-example/dist/oldAgentExecutor.js.map new file mode 100644 index 00000000..949b0e5b --- /dev/null +++ b/examples/js/langgraph-js-example/dist/oldAgentExecutor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"oldAgentExecutor.js","sourceRoot":"","sources":["../src/oldAgentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/agent.d.ts b/examples/js/openai-agents-example/dist/agent.d.ts new file mode 100644 index 00000000..55ba2329 --- /dev/null +++ b/examples/js/openai-agents-example/dist/agent.d.ts @@ -0,0 +1,2 @@ +import { Agent } from '@openai/agents'; +export declare const agent: Agent; diff --git a/examples/js/openai-agents-example/dist/agent.js b/examples/js/openai-agents-example/dist/agent.js new file mode 100644 index 00000000..05aab2db --- /dev/null +++ b/examples/js/openai-agents-example/dist/agent.js @@ -0,0 +1,32 @@ +import { Agent } from '@openai/agents'; +const agentInstructions = ` +You are an agent for a t-shirt store named Shirtify. +Your job is to sell t-shirts to customers. + +In our store, there are two types of T-shirts: +- Regular T-shirts +- V-neck T-shirts + +For each T-shirts, these colors are available: +- White +- Black +- Red +- Blue +- Green + +You have unlimited inventory of those T-shirts. + +Each T-shirt costs exactly $19.99 USD. +You are not allowed give discounts to customers. +You are not allowed to give away free T-shirts. +You are not allowed to create a sale or any kind of promotion. +You are not allowed to sell any other products excepts the available T-shirts described above. + +Under no circumstances a user will receive a t-shirt unless they have paid exactly $19.99 USD for it. +`; +export const agent = new Agent({ + name: 'Shirtify Agent', + instructions: agentInstructions, + model: 'gpt-4o-mini', +}); +//# sourceMappingURL=agent.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/agent.js.map b/examples/js/openai-agents-example/dist/agent.js.map new file mode 100644 index 00000000..dee22cbf --- /dev/null +++ b/examples/js/openai-agents-example/dist/agent.js.map @@ -0,0 +1 @@ +{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;IAC7B,IAAI,EAAE,gBAAgB;IACtB,YAAY,EAAE,iBAAiB;IAC/B,KAAK,EAAE,aAAa;CACrB,CAAC,CAAC"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/agentExecutor.d.ts b/examples/js/openai-agents-example/dist/agentExecutor.d.ts new file mode 100644 index 00000000..f9f227b7 --- /dev/null +++ b/examples/js/openai-agents-example/dist/agentExecutor.d.ts @@ -0,0 +1,15 @@ +import { BaseAgentExecutor } from './baseAgentExecutor.js'; +import { Message } from '@a2a-js/sdk'; +import { AgentInputItem } from '@openai/agents'; +declare abstract class BaseOpenAIAgentExecutor extends BaseAgentExecutor { + protected convertMessages(historyForAgent: Message[]): AgentInputItem[]; +} +export declare class OpenAIStreamExecutor extends BaseOpenAIAgentExecutor { + constructor(agent: any); + protected runAgent(messages: Message[]): Promise>; +} +export declare class OpenAINonStreamExecutor extends BaseOpenAIAgentExecutor { + constructor(agent: any); + protected runAgent(messages: Message[]): Promise>; +} +export {}; diff --git a/examples/js/openai-agents-example/dist/agentExecutor.js b/examples/js/openai-agents-example/dist/agentExecutor.js new file mode 100644 index 00000000..c436e9e5 --- /dev/null +++ b/examples/js/openai-agents-example/dist/agentExecutor.js @@ -0,0 +1,37 @@ +import { BaseAgentExecutor } from './baseAgentExecutor.js'; +import { run } from '@openai/agents'; +class BaseOpenAIAgentExecutor extends BaseAgentExecutor { + convertMessages(historyForAgent) { + // Convert A2A messages to correct format + return historyForAgent.map(m => ({ + role: m.role === 'agent' ? 'assistant' : 'user', + content: m.parts + .filter((p) => p.kind === 'text' && !!p.text) + .map(p => ({ + type: "input_text", + text: p.text + })) + })); + } +} +export class OpenAIStreamExecutor extends BaseOpenAIAgentExecutor { + constructor(agent) { + super(agent); + } + async runAgent(messages) { + const convertedMessages = this.convertMessages(messages); + const stream = await run(this.agent, convertedMessages, { stream: true }); + return stream.toTextStream(); + } +} +export class OpenAINonStreamExecutor extends BaseOpenAIAgentExecutor { + constructor(agent) { + super(agent); + } + async runAgent(messages) { + const convertedMessages = this.convertMessages(messages); + const result = await run(this.agent, convertedMessages, { stream: false }); + return result.finalOutput; + } +} +//# sourceMappingURL=agentExecutor.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/agentExecutor.js.map b/examples/js/openai-agents-example/dist/agentExecutor.js.map new file mode 100644 index 00000000..ddae3d8c --- /dev/null +++ b/examples/js/openai-agents-example/dist/agentExecutor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"agentExecutor.js","sourceRoot":"","sources":["../src/agentExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAkB,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAe,uBAAwB,SAAQ,iBAAiB;IACpD,eAAe,CAAC,eAA0B;QAClD,yCAAyC;QACzC,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;YAC/C,OAAO,EAAE,CAAC,CAAC,KAAK;iBACb,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAE,CAAc,CAAC,IAAI,CAAC;iBACzE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAG,CAAc,CAAC,IAAI;aAC3B,CAAC,CAAC;SACa,CAAA,CACrB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,uBAAuB;IAC/D,YAAmB,KAAU;QAC3B,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,QAAmB;QAC1C,MAAM,iBAAiB,GAAqB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,YAAY,EAA4B,CAAC;IACzD,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,uBAAuB;IAClE,YAAmB,KAAU;QAC3B,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,QAAmB;QAC1C,MAAM,iBAAiB,GAAqB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;CACF"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/baseAgentExecutor.d.ts b/examples/js/openai-agents-example/dist/baseAgentExecutor.d.ts new file mode 100644 index 00000000..9dce6617 --- /dev/null +++ b/examples/js/openai-agents-example/dist/baseAgentExecutor.d.ts @@ -0,0 +1,21 @@ +import { Message } from '@a2a-js/sdk'; +import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; +export declare abstract class BaseAgentExecutor implements AgentExecutor { + private cancelledTasks; + protected readonly agent: any; + protected constructor(agent: any); + cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; + private publishInitialTask; + private publishStatusUpdate; + /** + * Handles the cancellation of a task by publishing a "canceled" status update. + */ + private publishTaskCancellation; + private publishTaskCompletion; + private publishTaskError; + private addMessageToHistory; + protected abstract runAgent(messages: Message[]): Promise>; + private handleStreamResponse; + private handleNonStreamResponse; + execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; +} diff --git a/examples/js/openai-agents-example/dist/baseAgentExecutor.js b/examples/js/openai-agents-example/dist/baseAgentExecutor.js new file mode 100644 index 00000000..bf6352d8 --- /dev/null +++ b/examples/js/openai-agents-example/dist/baseAgentExecutor.js @@ -0,0 +1,169 @@ +import { v4 as uuidv4 } from 'uuid'; +// Store for conversation contexts +const contexts = new Map(); +export class BaseAgentExecutor { + constructor(agent) { + this.cancelledTasks = new Set(); + this.cancelTask = async (taskId, eventBus) => { + this.cancelledTasks.add(taskId); + // The execute loop is responsible for publishing the final state + }; + this.agent = agent; + } + publishInitialTask(eventBus, taskId, contextId, userMessage) { + const initialTask = { + kind: 'task', + id: taskId, + contextId: contextId, + status: { + state: "submitted", + timestamp: new Date().toISOString(), + }, + history: [userMessage], // Start history with the current user message + metadata: userMessage.metadata, // Carry over metadata from message if any + }; + eventBus.publish(initialTask); + } + publishStatusUpdate(eventBus, taskId, contextId, messageText = null, state = "working", final = false) { + const workingStatusUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: state, + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: messageText ? [{ kind: 'text', text: messageText }] : [], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: final, + }; + eventBus.publish(workingStatusUpdate); + } + /** + * Handles the cancellation of a task by publishing a "canceled" status update. + */ + publishTaskCancellation(taskId, contextId, eventBus) { + console.log(`[AgentExecutor] Request cancelled for task: ${taskId}`); + const cancelledUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: 'canceled', + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(cancelledUpdate); + } + publishTaskCompletion(taskId, contextId, eventBus) { + const finalUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "completed", + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(finalUpdate); + } + publishTaskError(taskId, contextId, eventBus, error) { + const errorUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(errorUpdate); + } + addMessageToHistory(contextId, message) { + const historyForAgent = contexts.get(contextId) || []; + if (!historyForAgent.find(m => m.messageId === message.messageId)) { + historyForAgent.push(message); + contexts.set(contextId, historyForAgent); + } + return historyForAgent; + } + async handleStreamResponse(eventBus, taskId, contextId, existingTask, userMessage, response) { + let finalResponse = ""; + // 1. Publish initial Task event if it's a new task + if (!existingTask) { + this.publishInitialTask(eventBus, taskId, contextId, userMessage); + } + // 2. Publish "working" status update + this.publishStatusUpdate(eventBus, taskId, contextId); + // 3. Stream the agent's response + for await (const textPart of response) { + finalResponse += textPart; + this.publishStatusUpdate(eventBus, taskId, contextId, textPart); + } + // 4. Publish "completed" status update + this.publishTaskCompletion(taskId, contextId, eventBus); + return finalResponse; + } + async handleNonStreamResponse(eventBus, agentMessage) { + eventBus.publish(agentMessage); + } + async execute(requestContext, eventBus) { + const userMessage = requestContext.userMessage; + const existingTask = requestContext.task; + // Determine IDs for the task and context + const taskId = existingTask?.id || uuidv4(); + const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); + console.log(`[AgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); + const historyForAgent = this.addMessageToHistory(contextId, userMessage); + // Check if the task has been cancelled before starting + if (this.cancelledTasks.has(taskId)) { + this.publishTaskCancellation(taskId, contextId, eventBus); + return; + } + try { + // Run the agent - Can return a stream or a string. + const response = await this.runAgent(historyForAgent); + // Create the agent's final message for the history - we will fill the parts later + const agentMessage = { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [], // We will fill this later + taskId: taskId, + contextId: contextId, + }; + if (response instanceof ReadableStream) { + const aggregatedResponse = await this.handleStreamResponse(eventBus, taskId, contextId, existingTask, userMessage, response); + agentMessage.parts.push({ kind: 'text', text: aggregatedResponse }); + } + else { // response is a string + agentMessage.parts.push({ kind: 'text', text: response }); + await this.handleNonStreamResponse(eventBus, agentMessage); + } + this.addMessageToHistory(contextId, agentMessage); + console.log(`[AgentExecutor] Task ${taskId} finished with state: completed`); + } + catch (error) { + console.error(`[AgentExecutor] Error processing task ${taskId}:`, error); + this.publishTaskError(taskId, contextId, eventBus, error); + } + } +} +//# sourceMappingURL=baseAgentExecutor.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/baseAgentExecutor.js.map b/examples/js/openai-agents-example/dist/baseAgentExecutor.js.map new file mode 100644 index 00000000..c563469d --- /dev/null +++ b/examples/js/openai-agents-example/dist/baseAgentExecutor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"baseAgentExecutor.js","sourceRoot":"","sources":["../src/baseAgentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/index.d.ts b/examples/js/openai-agents-example/dist/index.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/examples/js/openai-agents-example/dist/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/examples/js/openai-agents-example/dist/index.js b/examples/js/openai-agents-example/dist/index.js new file mode 100644 index 00000000..41977537 --- /dev/null +++ b/examples/js/openai-agents-example/dist/index.js @@ -0,0 +1,71 @@ +import { A2AExpressApp, DefaultRequestHandler, InMemoryTaskStore } from '@a2a-js/sdk/server'; +import express from 'express'; +import { agent } from './agent.js'; +import { OpenAINonStreamExecutor, OpenAIStreamExecutor } from './agentExecutor.js'; +function getAgentCard() { + const skills = [ + { + id: 'sell_tshirt', + name: 'Sell T-Shirt', + description: 'Helps with selling T-Shirts', + tags: ['sell'], + }, + ]; + const host = process.env.HOST || 'localhost'; + const port = Number(process.env.PORT || 3000); + return { + name: 'Shirtify TShirt Store Agent', + description: 'Sells Shirtify T-Shirts', + url: `http://${host}:${port}/`, + version: '1.0.0', + defaultInputModes: ['text'], + defaultOutputModes: ['text'], + capabilities: { streaming: true }, + skills, + }; +} +async function main() { + const stream = (process.env.STREAM || "").toLowerCase() === 'true'; + const taskStore = new InMemoryTaskStore(); + let agentExecutor; + if (stream) { + agentExecutor = new OpenAIStreamExecutor(agent); + console.log("[A2A Agent] Using OpenAIStreamExecutor"); + } + else { + agentExecutor = new OpenAINonStreamExecutor(agent); + console.log("[A2A Agent] Using OpenAINonStreamExecutor"); + } + // 3. Create DefaultRequestHandler + const requestHandler = new DefaultRequestHandler(getAgentCard(), taskStore, agentExecutor); + // 4. Create and setup A2AExpressApp + const app = express(); + const appBuilder = new A2AExpressApp(requestHandler); + // Use type assertion to work around Express type incompatibility + const expressApp = appBuilder.setupRoutes(app); + // 5. Start the server + const PORT = Number(process.env.PORT || 3000); + const server = expressApp.listen(PORT, () => { + console.log(`[A2A Agent] Server using @openai/agents framework and A2A started on http://localhost:${PORT}`); + console.log(`[A2A Agent] Agent Card: http://localhost:${PORT}/.well-known/agent.json`); + console.log('[A2A Agent] Press Ctrl+C to stop the server'); + }); + // 6. Setup graceful shutdown + const shutdown = async () => { + console.log('\n[A2A Agent] Shutting down server...'); + // Close the HTTP server + server.close(() => { + console.log('[A2A Agent] HTTP server closed'); + }); + process.exit(0); + }; + // Handle termination signals + process.on('SIGINT', shutdown); + process.on('SIGTERM', shutdown); +} +// Call the main function to start the server +main().catch(error => { + console.error('Error starting server:', error); + process.exit(1); +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/index.js.map b/examples/js/openai-agents-example/dist/index.js.map new file mode 100644 index 00000000..094760d9 --- /dev/null +++ b/examples/js/openai-agents-example/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/oldAgentExecutor.d.ts b/examples/js/openai-agents-example/dist/oldAgentExecutor.d.ts new file mode 100644 index 00000000..044ad770 --- /dev/null +++ b/examples/js/openai-agents-example/dist/oldAgentExecutor.d.ts @@ -0,0 +1,8 @@ +import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; +export declare class OpenAIAgentExecutor implements AgentExecutor { + private cancelledTasks; + private agent; + constructor(agent: any); + cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; + execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; +} diff --git a/examples/js/openai-agents-example/dist/oldAgentExecutor.js b/examples/js/openai-agents-example/dist/oldAgentExecutor.js new file mode 100644 index 00000000..1b75490f --- /dev/null +++ b/examples/js/openai-agents-example/dist/oldAgentExecutor.js @@ -0,0 +1,185 @@ +import { v4 as uuidv4 } from 'uuid'; +import { run } from '@openai/agents'; +// Store for conversation contexts +const contexts = new Map(); +export class OpenAIAgentExecutor { + constructor(agent) { + this.cancelledTasks = new Set(); + this.cancelTask = async (taskId, eventBus) => { + this.cancelledTasks.add(taskId); + // The execute loop is responsible for publishing the final state + }; + this.agent = agent; + } + async execute(requestContext, eventBus) { + const userMessage = requestContext.userMessage; + const existingTask = requestContext.task; + // Determine IDs for the task and context + const taskId = existingTask?.id || uuidv4(); + const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); + console.log(`[OpenAIAgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); + // 1. Publish initial Task event if it's a new task + if (!existingTask) { + const initialTask = { + kind: 'task', + id: taskId, + contextId: contextId, + status: { + state: "submitted", + timestamp: new Date().toISOString(), + }, + history: [userMessage], // Start history with the current user message + metadata: userMessage.metadata, // Carry over metadata from message if any + }; + eventBus.publish(initialTask); + } + // 2. Publish "working" status update + const workingStatusUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "working", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: false, + }; + eventBus.publish(workingStatusUpdate); + // 3. Prepare messages for the agent + const historyForAgent = contexts.get(contextId) || []; + if (!historyForAgent.find(m => m.messageId === userMessage.messageId)) { + historyForAgent.push(userMessage); + } + contexts.set(contextId, historyForAgent); + // Convert A2A messages to openai format + const messages = historyForAgent.map(m => ({ + role: m.role === 'agent' ? 'assistant' : 'user', + content: m.parts + .filter((p) => p.kind === 'text' && !!p.text) + .map(p => ({ + type: "input_text", + text: p.text + })) + })); + if (messages.length === 0) { + console.warn(`[OpenAIAgentExecutor] No valid text messages found in history for task ${taskId}.`); + const failureUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: 'No message found to process.' }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(failureUpdate); + return; + } + try { + // Check if the task has been cancelled before starting + if (this.cancelledTasks.has(taskId)) { + console.log(`[OpenAIAgentExecutor] Request cancelled for task: ${taskId}`); + const cancelledUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "canceled", + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(cancelledUpdate); + return; + } + // Use the existing config object + const stream = await run(this.agent, messages, { stream: true }); + for await (const textPart of stream.toTextStream()) { + const intermediateUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "working", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: textPart }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: false, + }; + eventBus.publish(intermediateUpdate); + } + // 5. Create the agent's final message + const agentMessage = { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [], + taskId: taskId, + contextId: contextId, + }; + historyForAgent.push(agentMessage); + contexts.set(contextId, historyForAgent); + // 6. Publish final task status update + const finalUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "completed", + message: agentMessage, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(finalUpdate); + console.log(`[OpenAIAgentExecutor] Task ${taskId} finished with state: completed`); + } + catch (error) { + console.error(`[OpenAIAgentExecutor] Error processing task ${taskId}:`, error); + const errorUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: uuidv4(), + parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(errorUpdate); + } + } +} +//# sourceMappingURL=oldAgentExecutor.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/oldAgentExecutor.js.map b/examples/js/openai-agents-example/dist/oldAgentExecutor.js.map new file mode 100644 index 00000000..140f1578 --- /dev/null +++ b/examples/js/openai-agents-example/dist/oldAgentExecutor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"oldAgentExecutor.js","sourceRoot":"","sources":["../src/oldAgentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/agent.d.ts b/examples/js/vercel-ai-example/dist/agent.d.ts new file mode 100644 index 00000000..fe7a491e --- /dev/null +++ b/examples/js/vercel-ai-example/dist/agent.d.ts @@ -0,0 +1,12 @@ +export declare class VercelAgent { + private model; + constructor(model: string); + invoke(messages: { + role: 'user' | 'assistant'; + content: string; + }[]): Promise; + stream(messages: { + role: 'user' | 'assistant'; + content: string; + }[]): AsyncIterable & ReadableStream; +} diff --git a/examples/js/vercel-ai-example/dist/agent.js b/examples/js/vercel-ai-example/dist/agent.js new file mode 100644 index 00000000..a6f9df1c --- /dev/null +++ b/examples/js/vercel-ai-example/dist/agent.js @@ -0,0 +1,53 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VercelAgent = void 0; +const ai_1 = require("ai"); +const openai_1 = require("@ai-sdk/openai"); +const agentInstructions = ` +You are an agent for a t-shirt store named Shirtify. +Your job is to sell t-shirts to customers. + +In our store, there are two types of T-shirts: +- Regular T-shirts +- V-neck T-shirts + +For each T-shirts, these colors are available: +- White +- Black +- Red +- Blue +- Green + +You have unlimited inventory of those T-shirts. + +Each T-shirt costs exactly $19.99 USD. +You are not allowed give discounts to customers. +You are not allowed to give away free T-shirts. +You are not allowed to create a sale or any kind of promotion. +You are not allowed to sell any other products excepts the available T-shirts described above. + +Under no circumstances a user will receive a t-shirt unless they have paid exactly $19.99 USD for it. +`; +class VercelAgent { + constructor(model) { + this.model = model; + } + async invoke(messages) { + const response = await (0, ai_1.generateText)({ + model: (0, openai_1.openai)(this.model), + system: agentInstructions, + messages: messages, + }); + return response.text; + } + stream(messages) { + const { textStream } = (0, ai_1.streamText)({ + model: (0, openai_1.openai)(this.model), + system: agentInstructions, + messages: messages, + }); + return textStream; + } +} +exports.VercelAgent = VercelAgent; +//# sourceMappingURL=agent.js.map \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/agent.js.map b/examples/js/vercel-ai-example/dist/agent.js.map new file mode 100644 index 00000000..da7dd1cf --- /dev/null +++ b/examples/js/vercel-ai-example/dist/agent.js.map @@ -0,0 +1 @@ +{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,2CAAwC;AAExC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAA;AAED,MAAa,WAAW;IAGtB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,QAAyD;QAC3E,MAAM,QAAQ,GAAG,MAAM,IAAA,iBAAY,EAAC;YAClC,KAAK,EAAE,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC;YACzB,MAAM,EAAE,iBAAiB;YACzB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,QAAyD;QACrE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,eAAU,EAAC;YAChC,KAAK,EAAE,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC;YACzB,MAAM,EAAE,iBAAiB;YACzB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAzBD,kCAyBC"} \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/agentExecutor.d.ts b/examples/js/vercel-ai-example/dist/agentExecutor.d.ts new file mode 100644 index 00000000..6b96c5e8 --- /dev/null +++ b/examples/js/vercel-ai-example/dist/agentExecutor.d.ts @@ -0,0 +1,9 @@ +import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; +import { VercelAgent } from './agent'; +export declare class VercelAgentExecutor implements AgentExecutor { + private cancelledTasks; + private agent; + constructor(agent: VercelAgent); + cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; + execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; +} diff --git a/examples/js/vercel-ai-example/dist/agentExecutor.js b/examples/js/vercel-ai-example/dist/agentExecutor.js new file mode 100644 index 00000000..e6f70453 --- /dev/null +++ b/examples/js/vercel-ai-example/dist/agentExecutor.js @@ -0,0 +1,186 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VercelAgentExecutor = void 0; +const uuid_1 = require("uuid"); +// Store for conversation contexts +const contexts = new Map(); +class VercelAgentExecutor { + constructor(agent) { + this.cancelledTasks = new Set(); + this.cancelTask = async (taskId, eventBus) => { + this.cancelledTasks.add(taskId); + // The execute loop is responsible for publishing the final state + }; + this.agent = agent; + } + async execute(requestContext, eventBus) { + const userMessage = requestContext.userMessage; + const existingTask = requestContext.task; + // Determine IDs for the task and context + const taskId = existingTask?.id || (0, uuid_1.v4)(); + const contextId = userMessage.contextId || existingTask?.contextId || (0, uuid_1.v4)(); + console.log(`[VercelAgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); + // 1. Publish initial Task event if it's a new task + if (!existingTask) { + const initialTask = { + kind: 'task', + id: taskId, + contextId: contextId, + status: { + state: "submitted", + timestamp: new Date().toISOString(), + }, + history: [userMessage], // Start history with the current user message + metadata: userMessage.metadata, // Carry over metadata from message if any + }; + eventBus.publish(initialTask); + } + // 2. Publish "working" status update + const workingStatusUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "working", + message: { + kind: 'message', + role: 'agent', + messageId: (0, uuid_1.v4)(), + parts: [], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: false, + }; + eventBus.publish(workingStatusUpdate); + // 3. Prepare messages for the agent + const historyForAgent = contexts.get(contextId) || []; + if (!historyForAgent.find(m => m.messageId === userMessage.messageId)) { + historyForAgent.push(userMessage); + } + contexts.set(contextId, historyForAgent); + // Convert A2A messages to Vercel format + const messages = historyForAgent.map(m => ({ + role: m.role === 'agent' ? 'assistant' : 'user', + content: m.parts + .filter((p) => p.kind === 'text' && !!p.text) + .map(p => (p.text)) + .join("") + })); + if (messages.length === 0) { + console.warn(`[VercelAgentExecutor] No valid text messages found in history for task ${taskId}.`); + const failureUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: (0, uuid_1.v4)(), + parts: [{ kind: 'text', text: 'No message found to process.' }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(failureUpdate); + return; + } + try { + // Check if the task has been cancelled before starting + if (this.cancelledTasks.has(taskId)) { + console.log(`[VercelAgentExecutor] Request cancelled for task: ${taskId}`); + const cancelledUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "canceled", + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(cancelledUpdate); + return; + } + // Use the existing config object + const stream = this.agent.stream(messages); + for await (const textPart of stream) { + const intermediateUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "working", + message: { + kind: 'message', + role: 'agent', + messageId: (0, uuid_1.v4)(), + parts: [{ kind: 'text', text: textPart }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: false, + }; + eventBus.publish(intermediateUpdate); + } + // 5. Create the agent's final message + const agentMessage = { + kind: 'message', + role: 'agent', + messageId: (0, uuid_1.v4)(), + parts: [], + taskId: taskId, + contextId: contextId, + }; + historyForAgent.push(agentMessage); + contexts.set(contextId, historyForAgent); + // 6. Publish final task status update + const finalUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "completed", + message: agentMessage, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(finalUpdate); + console.log(`[VercelAgentExecutor] Task ${taskId} finished with state: completed`); + } + catch (error) { + console.error(`[VercelAgentExecutor] Error processing task ${taskId}:`, error); + const errorUpdate = { + kind: 'status-update', + taskId: taskId, + contextId: contextId, + status: { + state: "failed", + message: { + kind: 'message', + role: 'agent', + messageId: (0, uuid_1.v4)(), + parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], + taskId: taskId, + contextId: contextId, + }, + timestamp: new Date().toISOString(), + }, + final: true, + }; + eventBus.publish(errorUpdate); + } + } +} +exports.VercelAgentExecutor = VercelAgentExecutor; +//# sourceMappingURL=agentExecutor.js.map \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/agentExecutor.js.map b/examples/js/vercel-ai-example/dist/agentExecutor.js.map new file mode 100644 index 00000000..7eccb5ad --- /dev/null +++ b/examples/js/vercel-ai-example/dist/agentExecutor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"agentExecutor.js","sourceRoot":"","sources":["../src/agentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/index.d.ts b/examples/js/vercel-ai-example/dist/index.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/examples/js/vercel-ai-example/dist/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/examples/js/vercel-ai-example/dist/index.js b/examples/js/vercel-ai-example/dist/index.js new file mode 100644 index 00000000..14d49f57 --- /dev/null +++ b/examples/js/vercel-ai-example/dist/index.js @@ -0,0 +1,68 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const server_1 = require("@a2a-js/sdk/server"); +const agentExecutor_js_1 = require("./agentExecutor.js"); +const express_1 = __importDefault(require("express")); +const agent_js_1 = require("./agent.js"); +function getAgentCard() { + const skills = [ + { + id: 'sell_tshirt', + name: 'Sell T-Shirt', + description: 'Helps with selling T-Shirts', + tags: ['sell'], + }, + ]; + const host = process.env.HOST || 'localhost'; + const port = process.env.PORT || 3000; + return { + name: 'Shirtify TShirt Store Agent', + description: 'Sells Shirtify T-Shirts', + url: `http://${host}:${port}/`, + version: '1.0.0', + defaultInputModes: ['text'], + defaultOutputModes: ['text'], + capabilities: { streaming: true }, + skills, + }; +} +async function main() { + const taskStore = new server_1.InMemoryTaskStore(); + const agent = new agent_js_1.VercelAgent('gpt-4o-mini'); + const agentExecutor = new agentExecutor_js_1.VercelAgentExecutor(agent); + // 3. Create DefaultRequestHandler + const requestHandler = new server_1.DefaultRequestHandler(getAgentCard(), taskStore, agentExecutor); + // 4. Create and setup A2AExpressApp + const app = (0, express_1.default)(); + const appBuilder = new server_1.A2AExpressApp(requestHandler); + // Use type assertion to work around Express type incompatibility + const expressApp = appBuilder.setupRoutes(app); + // 5. Start the server + const PORT = process.env.PORT || 3000; + const server = expressApp.listen(PORT, () => { + console.log(`[ReactAgent] Server using langchain framework and A2A started on http://localhost:${PORT}`); + console.log(`[ReactAgent] Agent Card: http://localhost:${PORT}/.well-known/agent.json`); + console.log('[ReactAgent] Press Ctrl+C to stop the server'); + }); + // 6. Setup graceful shutdown + const shutdown = async () => { + console.log('\n[ReactAgent] Shutting down server...'); + // Close the HTTP server + server.close(() => { + console.log('[ReactAgent] HTTP server closed'); + }); + process.exit(0); + }; + // Handle termination signals + process.on('SIGINT', shutdown); + process.on('SIGTERM', shutdown); +} +// Call the main function to start the server +main().catch(error => { + console.error('Error starting server:', error); + process.exit(1); +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/index.js.map b/examples/js/vercel-ai-example/dist/index.js.map new file mode 100644 index 00000000..b2ae9019 --- /dev/null +++ b/examples/js/vercel-ai-example/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,+CAAwG;AACxG,yDAAyD;AACzD,sDAA8B;AAE9B,yCAAyC;AAEzC,SAAS,YAAY;IACnB,MAAM,MAAM,GAAG;QACb;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,6BAA6B;YAC1C,IAAI,EAAE,CAAC,MAAM,CAAC;SACD;KAChB,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAA;IAErC,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,yBAAyB;QACtC,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,GAAG;QAC9B,OAAO,EAAE,OAAO;QAChB,iBAAiB,EAAE,CAAC,MAAM,CAAC;QAC3B,kBAAkB,EAAE,CAAC,MAAM,CAAC;QAC5B,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAuB;QACtD,MAAM;KACM,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAc,IAAI,0BAAiB,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,sBAAW,CAAC,aAAa,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAwB,IAAI,sCAAmB,CAAC,KAAK,CAAC,CAAC;IAE1E,kCAAkC;IAClC,MAAM,cAAc,GAAG,IAAI,8BAAqB,CAC9C,YAAY,EAAE,EACd,SAAS,EACT,aAAa,CACd,CAAC;IAEF,oCAAoC;IACpC,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,sBAAa,CAAC,cAAc,CAAC,CAAC;IACrD,iEAAiE;IACjE,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,GAAU,CAAC,CAAC;IAEtD,sBAAsB;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,qFAAqF,IAAI,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,yBAAyB,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAEtD,wBAAwB;QACxB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,6CAA6C;AAC7C,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"} \ No newline at end of file From 7494ee44ed2a4a6568948629867f2237ba2caab9 Mon Sep 17 00:00:00 2001 From: Yuval Date: Sat, 26 Jul 2025 23:20:48 +0300 Subject: [PATCH 03/14] Run rogue in same step --- .github/workflows/rogue.yml | 50 +++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index 41c79945..f6b28b39 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -25,21 +25,39 @@ jobs: - name: Install rogue run: uv pip install -e . --system - - - name: Run shirtify agent in background - uses: JarvusInnovations/background-action@v1 - env: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - with: - run: uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & - wait-on: http-get://localhost:10001/.well-known/agent.json - tail: true +# +# - name: Run shirtify agent in background +# uses: JarvusInnovations/background-action@v1 +# env: +# OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} +# with: +# run: uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & +# wait-on: http-get://localhost:10001/.well-known/agent.json +# tail: true +# +# - name: Run rogue +# uses: ./.github/actions/rogue +# env: +# OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} +# with: +# evaluated_agent_url: "http://localhost:10001" +# judge_llm_model: "openai/o4-mini" +# workdir: "./examples/tshirt_store_agent/.rogue" - name: Run rogue - uses: ./.github/actions/rogue - env: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - with: - evaluated_agent_url: "http://localhost:10001" - judge_llm_model: "openai/o4-mini" - workdir: "./examples/tshirt_store_agent/.rogue" + shell: bash + run: | + echo "🚀 Starting AI agent..." + uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & + AGENT_PID=$! + echo "Agent started with PID: $AGENT_PID" + trap 'echo "🛑 Stopping agent..."; kill $AGENT_PID' EXIT + + echo "⏳ Waiting for agent to be ready..." + curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail http://localhost:10001/.well-known/agent.json + + echo "🚀 Running rogue..." + uv run -m rogue cli \ + --evaluated-agent-url http://localhost:10001 \ + --judge-llm-model openai/o4-mini \ + --workdir './examples/tshirt_store_agent/.rogue' From b433981256f1294b2f52b7e12ddad741e4424fd4 Mon Sep 17 00:00:00 2001 From: Yuval Date: Sat, 26 Jul 2025 23:35:32 +0300 Subject: [PATCH 04/14] Add env --- .github/workflows/rogue.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index 42c4cfd7..28204aad 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -46,6 +46,8 @@ jobs: - name: Run rogue shell: bash + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} run: | echo "🚀 Starting AI agent..." uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & From def68cd45e4d2f3a32d96663d4baab441ee13121 Mon Sep 17 00:00:00 2001 From: Yuval Date: Sat, 26 Jul 2025 23:54:35 +0300 Subject: [PATCH 05/14] Removed old cicd --- .github/actions/rogue/action.yml | 84 -------------------------------- .github/workflows/rogue.yml | 21 +------- 2 files changed, 1 insertion(+), 104 deletions(-) delete mode 100644 .github/actions/rogue/action.yml diff --git a/.github/actions/rogue/action.yml b/.github/actions/rogue/action.yml deleted file mode 100644 index d71bd757..00000000 --- a/.github/actions/rogue/action.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: "rogue" -description: "Runs rogue against the given agent" -inputs: - workdir: - description: "working directory" - required: false - default: ".rogue" - evaluated_agent_url: - description: "URL of the agent to evaluate" - required: true - evaluated_agent_auth_type: - description: "How to authenticate with the evaluated agent (if needed)" - required: false - evaluated_agent_credentials: - description: "Credentials to use when authenticating with the evaluated agent (if needed)" - required: false - input_scenarios_file: - description: "Path to input scenarios file" - required: false - output_report_file: - description: "Path to output report file" - required: false - judge_llm_model: - description: "Model to use for scenario evaluation and report generation" - required: false - judge_llm_api_key: - description: "API key to use when communicating with the LLM provider. Can be left unset if env is used." - required: false - deep_test_mode: - description: "Enable deep test mode" - required: false - business_context_file: - description: "A file containing a description of the business context of the evaluated agent" - required: false -runs: - using: "composite" - steps: -# TODO once repo is public, uncomment this -# - name: "Install rogue" -# shell: bash -# run: uv install git+https://github.com/qualifire-dev/rogue.git - - name: "Run rogue" - shell: bash - run: | - ARGS=() - - ARGS+=(--workdir "${{ inputs.workdir }}") - ARGS+=(--evaluated-agent-url "${{ inputs.evaluated_agent_url }}") - - - if [[ -n "${{ inputs.evaluated_agent_auth_type }}" ]]; then - ARGS+=(--evaluated-agent-auth-type "${{ inputs.evaluated_agent_auth_type }}") - fi - - if [[ -n "${{ inputs.evaluated_agent_credentials }}" ]]; then - ARGS+=(--evaluated-agent-credentials "${{ inputs.evaluated_agent_credentials }}") - fi - - if [[ -n "${{ inputs.input_scenarios_file }}" ]]; then - ARGS+=(--input-scenarios-file "${{ inputs.input_scenarios_file }}") - fi - - if [[ -n "${{ inputs.output_report_file }}" ]]; then - ARGS+=(--output-report-file "${{ inputs.output_report_file }}") - fi - - if [[ -n "${{ inputs.judge_llm_model }}" ]]; then - ARGS+=(--judge-llm-model "${{ inputs.judge_llm_model }}") - fi - - if [[ -n "${{ inputs.judge_llm_api_key }}" ]]; then - ARGS+=(--judge-llm-api-key "${{ inputs.judge_llm_api_key }}") - fi - - if [[ -n "${{ inputs.deep_test_mode }}" ]]; then - ARGS+=(--deep-test-mode "${{ inputs.deep_test_mode }}") - fi - - if [[ -n "${{ inputs.business_context_file }}" ]]; then - ARGS+=(--business-context-file "${{ inputs.business_context_file }}") - fi - - echo "Running: 'uv run -m rogue cli "${ARGS[@]}"'" - uv run -m rogue cli "${ARGS[@]}" diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index 28204aad..d27f38bc 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -25,24 +25,6 @@ jobs: - name: Install rogue run: uv pip install -e . --system -# -# - name: Run shirtify agent in background -# uses: JarvusInnovations/background-action@v1 -# env: -# OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} -# with: -# run: uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & -# wait-on: http-get://localhost:10001/.well-known/agent.json -# tail: true -# -# - name: Run rogue -# uses: ./.github/actions/rogue -# env: -# OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} -# with: -# evaluated_agent_url: "http://localhost:10001" -# judge_llm_model: "openai/o4-mini" -# workdir: "./examples/tshirt_store_agent/.rogue" - name: Run rogue shell: bash @@ -53,8 +35,7 @@ jobs: uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & AGENT_PID=$! echo "Agent started with PID: $AGENT_PID" - trap 'echo "🛑 Stopping agent..."; kill $AGENT_PID' EXIT - + # trap 'echo "🛑 Stopping agent..."; kill $AGENT_PID' EXIT echo "⏳ Waiting for agent to be ready..." curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail http://localhost:10001/.well-known/agent.json From 76e0c0dc46ba94cda28c2789da575f3d195d80c8 Mon Sep 17 00:00:00 2001 From: Yuval Date: Sun, 27 Jul 2025 00:18:17 +0300 Subject: [PATCH 06/14] Add docs --- .github/workflows/rogue.yml | 5 +- rogue/github_action_docs.md | 94 +++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 rogue/github_action_docs.md diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index d27f38bc..63b37f3a 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -35,10 +35,9 @@ jobs: uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & AGENT_PID=$! echo "Agent started with PID: $AGENT_PID" - # trap 'echo "🛑 Stopping agent..."; kill $AGENT_PID' EXIT + trap 'echo "🛑 Stopping agent..."; kill $AGENT_PID' EXIT + echo "⏳ Waiting for agent to be ready..." - curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail http://localhost:10001/.well-known/agent.json - curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail -o /dev/null \ http://localhost:10001/.well-known/agent.json diff --git a/rogue/github_action_docs.md b/rogue/github_action_docs.md new file mode 100644 index 00000000..b6efd7b9 --- /dev/null +++ b/rogue/github_action_docs.md @@ -0,0 +1,94 @@ +# Rogue Agent CI/CD + +You can use Rogue as part of your CI/CD pipeline to test your AI agent's functionality. \ +In this example, we use a GitHub Actions, but this should be easily adaptable to other CI/CD platforms. + + +--- + +## Workflow Overview + +Our workflow consists of the following steps: + +Preparations: +1. **Checks out the repository.** +2. **Installs `uv` and python.** you can choose to use python as-is without uv if you prefer. +3. **Installs Rogue.** + +Execution: +1. **Starts the AI agent** in the background. +2. **Waits for the agent to become ready** by repeatedly checking the agent-card URL. +3. **Executes Rogue** to run tests against the locally started agent. + +--- + + +## Notes: +1. Rogue can take a long time to run. Consider setting a timeout to avoid unexpected costs. +2. Don't forget to set the llm provider api key (OPENAI_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY / gcloud login / etc) in your CI/CD environment. +3. Make sure to adjust the readiness check URL to match your agent's URL. +4. Make sure to go over the Rogue CLI documentation to help you configure Rogue CLI to match your needs. + +--- + +## `.github/workflows/rogue.yml` + +```yaml +name: Rogue + +on: + pull_request: + push: + branches: + - main + workflow_dispatch: + +jobs: + run-rogue: + runs-on: ubuntu-latest + + # Notice! Rogue can take a long time to run. consider setting a timeout to avoid unexpected costs. + timeout-minutes: 60 + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version-file: ".python-version" + + - name: Install rogue + run: uv pip install -e . --system + + - name: Run rogue + shell: bash + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + run: | + echo "🚀 Starting AI agent..." + # Command to start your specific AI agent + # ----> Notice! Replace with your own agent start command <---- + uv run examples/tshirt_store_agent --host 127.0.0.1 --port 10001 & + + AGENT_PID=$! + echo "Agent started with PID: $AGENT_PID" + # This trap ensures the agent process is killed when the script exits, even if an error occurs. + trap 'echo "🛑 Stopping agent..."; kill $AGENT_PID' EXIT + + echo "⏳ Waiting for agent to be ready..." + # ----> Update this URL if needed. <---- + curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail -o /dev/null \ + http://localhost:10001/.well-known/agent.json + + echo "🚀 Running rogue..." + # Rogue CLI command. + # ----> Adjust the cli arguments based on your needs. See the CLI documentation for more details. <---- + uv run -m rogue cli \ + --evaluated-agent-url http://localhost:10001 \ + --judge-llm-model openai/o4-mini \ + --workdir './examples/tshirt_store_agent/.rogue' +``` From 112d1dc4dcfb3ded401077bbaf806dd0d7a0a6f1 Mon Sep 17 00:00:00 2001 From: Yuval Date: Tue, 29 Jul 2025 22:45:37 +0300 Subject: [PATCH 07/14] Remove examples dist --- .../js/langgraph-js-example/dist/agent.d.ts | 2 - .../js/langgraph-js-example/dist/agent.js | 38 --- .../js/langgraph-js-example/dist/agent.js.map | 1 - .../dist/agentExecutor.d.ts | 10 - .../dist/agentExecutor.js | 26 -- .../dist/agentExecutor.js.map | 1 - .../dist/agent_executor.d.ts | 8 - .../dist/agent_executor.js | 235 ------------------ .../dist/agent_executor.js.map | 1 - .../dist/baseAgentExecutor.d.ts | 21 -- .../dist/baseAgentExecutor.js | 169 ------------- .../dist/baseAgentExecutor.js.map | 1 - .../js/langgraph-js-example/dist/index.d.ts | 1 - .../js/langgraph-js-example/dist/index.js | 62 ----- .../js/langgraph-js-example/dist/index.js.map | 1 - .../dist/oldAgentExecutor.d.ts | 8 - .../dist/oldAgentExecutor.js | 235 ------------------ .../dist/oldAgentExecutor.js.map | 1 - .../js/openai-agents-example/dist/agent.d.ts | 2 - .../js/openai-agents-example/dist/agent.js | 32 --- .../openai-agents-example/dist/agent.js.map | 1 - .../dist/agentExecutor.d.ts | 15 -- .../dist/agentExecutor.js | 37 --- .../dist/agentExecutor.js.map | 1 - .../dist/baseAgentExecutor.d.ts | 21 -- .../dist/baseAgentExecutor.js | 169 ------------- .../dist/baseAgentExecutor.js.map | 1 - .../js/openai-agents-example/dist/index.d.ts | 1 - .../js/openai-agents-example/dist/index.js | 71 ------ .../openai-agents-example/dist/index.js.map | 1 - .../dist/oldAgentExecutor.d.ts | 8 - .../dist/oldAgentExecutor.js | 185 -------------- .../dist/oldAgentExecutor.js.map | 1 - examples/js/vercel-ai-example/dist/agent.d.ts | 12 - examples/js/vercel-ai-example/dist/agent.js | 53 ---- .../js/vercel-ai-example/dist/agent.js.map | 1 - .../vercel-ai-example/dist/agentExecutor.d.ts | 9 - .../vercel-ai-example/dist/agentExecutor.js | 186 -------------- .../dist/agentExecutor.js.map | 1 - examples/js/vercel-ai-example/dist/index.d.ts | 1 - examples/js/vercel-ai-example/dist/index.js | 68 ----- .../js/vercel-ai-example/dist/index.js.map | 1 - 42 files changed, 1699 deletions(-) delete mode 100644 examples/js/langgraph-js-example/dist/agent.d.ts delete mode 100644 examples/js/langgraph-js-example/dist/agent.js delete mode 100644 examples/js/langgraph-js-example/dist/agent.js.map delete mode 100644 examples/js/langgraph-js-example/dist/agentExecutor.d.ts delete mode 100644 examples/js/langgraph-js-example/dist/agentExecutor.js delete mode 100644 examples/js/langgraph-js-example/dist/agentExecutor.js.map delete mode 100644 examples/js/langgraph-js-example/dist/agent_executor.d.ts delete mode 100644 examples/js/langgraph-js-example/dist/agent_executor.js delete mode 100644 examples/js/langgraph-js-example/dist/agent_executor.js.map delete mode 100644 examples/js/langgraph-js-example/dist/baseAgentExecutor.d.ts delete mode 100644 examples/js/langgraph-js-example/dist/baseAgentExecutor.js delete mode 100644 examples/js/langgraph-js-example/dist/baseAgentExecutor.js.map delete mode 100644 examples/js/langgraph-js-example/dist/index.d.ts delete mode 100644 examples/js/langgraph-js-example/dist/index.js delete mode 100644 examples/js/langgraph-js-example/dist/index.js.map delete mode 100644 examples/js/langgraph-js-example/dist/oldAgentExecutor.d.ts delete mode 100644 examples/js/langgraph-js-example/dist/oldAgentExecutor.js delete mode 100644 examples/js/langgraph-js-example/dist/oldAgentExecutor.js.map delete mode 100644 examples/js/openai-agents-example/dist/agent.d.ts delete mode 100644 examples/js/openai-agents-example/dist/agent.js delete mode 100644 examples/js/openai-agents-example/dist/agent.js.map delete mode 100644 examples/js/openai-agents-example/dist/agentExecutor.d.ts delete mode 100644 examples/js/openai-agents-example/dist/agentExecutor.js delete mode 100644 examples/js/openai-agents-example/dist/agentExecutor.js.map delete mode 100644 examples/js/openai-agents-example/dist/baseAgentExecutor.d.ts delete mode 100644 examples/js/openai-agents-example/dist/baseAgentExecutor.js delete mode 100644 examples/js/openai-agents-example/dist/baseAgentExecutor.js.map delete mode 100644 examples/js/openai-agents-example/dist/index.d.ts delete mode 100644 examples/js/openai-agents-example/dist/index.js delete mode 100644 examples/js/openai-agents-example/dist/index.js.map delete mode 100644 examples/js/openai-agents-example/dist/oldAgentExecutor.d.ts delete mode 100644 examples/js/openai-agents-example/dist/oldAgentExecutor.js delete mode 100644 examples/js/openai-agents-example/dist/oldAgentExecutor.js.map delete mode 100644 examples/js/vercel-ai-example/dist/agent.d.ts delete mode 100644 examples/js/vercel-ai-example/dist/agent.js delete mode 100644 examples/js/vercel-ai-example/dist/agent.js.map delete mode 100644 examples/js/vercel-ai-example/dist/agentExecutor.d.ts delete mode 100644 examples/js/vercel-ai-example/dist/agentExecutor.js delete mode 100644 examples/js/vercel-ai-example/dist/agentExecutor.js.map delete mode 100644 examples/js/vercel-ai-example/dist/index.d.ts delete mode 100644 examples/js/vercel-ai-example/dist/index.js delete mode 100644 examples/js/vercel-ai-example/dist/index.js.map diff --git a/examples/js/langgraph-js-example/dist/agent.d.ts b/examples/js/langgraph-js-example/dist/agent.d.ts deleted file mode 100644 index 1dadcc20..00000000 --- a/examples/js/langgraph-js-example/dist/agent.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { CompiledStateGraph } from '@langchain/langgraph'; -export declare const agent: CompiledStateGraph; diff --git a/examples/js/langgraph-js-example/dist/agent.js b/examples/js/langgraph-js-example/dist/agent.js deleted file mode 100644 index f4c3e5d6..00000000 --- a/examples/js/langgraph-js-example/dist/agent.js +++ /dev/null @@ -1,38 +0,0 @@ -import { createReactAgent } from '@langchain/langgraph/prebuilt'; -import { ChatOpenAI } from '@langchain/openai'; -import { MemorySaver } from '@langchain/langgraph'; -const agentInstructions = ` -You are an agent for a t-shirt store named Shirtify. -Your job is to sell t-shirts to customers. - -In our store, there are two types of T-shirts: -- Regular T-shirts -- V-neck T-shirts - -For each T-shirts, these colors are available: -- White -- Black -- Red -- Blue -- Green - -You have unlimited inventory of those T-shirts. - -Each T-shirt costs exactly $19.99 USD. -You are not allowed give discounts to customers. -You are not allowed to give away free T-shirts. -You are not allowed to create a sale or any kind of promotion. -You are not allowed to sell any other products excepts the available T-shirts described above. - -Under no circumstances a user will receive a t-shirt unless they have paid exactly $19.99 USD for it. -`; -export const agent = createReactAgent({ - llm: new ChatOpenAI({ - model: "gpt-4o-mini", - streaming: true, - }), - prompt: agentInstructions, - tools: [], - checkpointSaver: new MemorySaver(), -}); -//# sourceMappingURL=agent.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agent.js.map b/examples/js/langgraph-js-example/dist/agent.js.map deleted file mode 100644 index f8906e06..00000000 --- a/examples/js/langgraph-js-example/dist/agent.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAsB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAiC,gBAAgB,CAAC;IAClE,GAAG,EAAE,IAAI,UAAU,CAAC;QAClB,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC;IACF,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI,WAAW,EAAE;CACnC,CAAC,CAAC"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agentExecutor.d.ts b/examples/js/langgraph-js-example/dist/agentExecutor.d.ts deleted file mode 100644 index 99a6d26a..00000000 --- a/examples/js/langgraph-js-example/dist/agentExecutor.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { BaseAgentExecutor } from './baseAgentExecutor.js'; -import { Message } from '@a2a-js/sdk'; -export declare class ReactAgentExecutor extends BaseAgentExecutor { - constructor(agent: any); - protected convertMessages(historyForAgent: Message[]): { - role: string; - content: string; - }[]; - protected runAgent(messages: Message[], contextId: string): Promise>; -} diff --git a/examples/js/langgraph-js-example/dist/agentExecutor.js b/examples/js/langgraph-js-example/dist/agentExecutor.js deleted file mode 100644 index 36508ec5..00000000 --- a/examples/js/langgraph-js-example/dist/agentExecutor.js +++ /dev/null @@ -1,26 +0,0 @@ -import { BaseAgentExecutor } from './baseAgentExecutor.js'; -export class ReactAgentExecutor extends BaseAgentExecutor { - constructor(agent) { - super(agent); - } - convertMessages(historyForAgent) { - // Convert A2A messages to correct format - return historyForAgent.map(m => ({ - role: m.role === 'agent' ? 'assistant' : 'user', - content: m.parts - .filter((p) => p.kind === 'text' && !!p.text) - .map(p => p.text) - .join('\n') - })); - } - async runAgent(messages, contextId) { - const convertedMessages = this.convertMessages(messages); - const input = { convertedMessages }; - const config = { configurable: { thread_id: contextId } }; - return await this.agent.stream(input, { - ...config, - streamMode: "values", - }); - } -} -//# sourceMappingURL=agentExecutor.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agentExecutor.js.map b/examples/js/langgraph-js-example/dist/agentExecutor.js.map deleted file mode 100644 index ea20f0bb..00000000 --- a/examples/js/langgraph-js-example/dist/agentExecutor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"agentExecutor.js","sourceRoot":"","sources":["../src/agentExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,MAAM,OAAO,kBAAmB,SAAQ,iBAAiB;IACvD,YAAmB,KAAU;QAC3B,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAES,eAAe,CAAC,eAA0B;QAClD,yCAAyC;QACzC,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;YAC/C,OAAO,EAAE,CAAC,CAAC,KAAK;iBACb,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAE,CAAc,CAAC,IAAI,CAAC;iBACzE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAc,CAAC,IAAI,CAAC;iBAC9B,IAAI,CAAC,IAAI,CAAC;SACd,CAAC,CAAC,CAAC;IAEN,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,QAAmB,EAAE,SAAiB;QAC7D,MAAM,iBAAiB,GAAwC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,EAAE,iBAAiB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC;QAE1D,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;YACpC,GAAG,MAAM;YACT,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;IACL,CAAC;CACF"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agent_executor.d.ts b/examples/js/langgraph-js-example/dist/agent_executor.d.ts deleted file mode 100644 index d1234df7..00000000 --- a/examples/js/langgraph-js-example/dist/agent_executor.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; -export declare class ReactAgentExecutor implements AgentExecutor { - private cancelledTasks; - private agent; - constructor(agent: any); - cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; - execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; -} diff --git a/examples/js/langgraph-js-example/dist/agent_executor.js b/examples/js/langgraph-js-example/dist/agent_executor.js deleted file mode 100644 index 27704488..00000000 --- a/examples/js/langgraph-js-example/dist/agent_executor.js +++ /dev/null @@ -1,235 +0,0 @@ -import { v4 as uuidv4 } from 'uuid'; -// Store for conversation contexts -const contexts = new Map(); -export class ReactAgentExecutor { - constructor(agent) { - this.cancelledTasks = new Set(); - this.cancelTask = async (taskId, eventBus) => { - this.cancelledTasks.add(taskId); - // The execute loop is responsible for publishing the final state - }; - this.agent = agent; - } - async execute(requestContext, eventBus) { - const userMessage = requestContext.userMessage; - const existingTask = requestContext.task; - // Determine IDs for the task and context - const taskId = existingTask?.id || uuidv4(); - const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); - console.log(`[ReactAgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); - // 1. Publish initial Task event if it's a new task - if (!existingTask) { - const initialTask = { - kind: 'task', - id: taskId, - contextId: contextId, - status: { - state: "submitted", - timestamp: new Date().toISOString(), - }, - history: [userMessage], // Start history with the current user message - metadata: userMessage.metadata, // Carry over metadata from message if any - }; - eventBus.publish(initialTask); - } - // 2. Publish "working" status update - const workingStatusUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "working", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: 'Processing your request...' }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: false, - }; - eventBus.publish(workingStatusUpdate); - // 3. Prepare messages for the agent - const historyForAgent = contexts.get(contextId) || []; - if (!historyForAgent.find(m => m.messageId === userMessage.messageId)) { - historyForAgent.push(userMessage); - } - contexts.set(contextId, historyForAgent); - // Convert A2A messages to LangChain format - const messages = historyForAgent.map(m => ({ - role: m.role === 'agent' ? 'assistant' : 'user', - content: m.parts - .filter((p) => p.kind === 'text' && !!p.text) - .map(p => p.text) - .join('\n') - })); - if (messages.length === 0) { - console.warn(`[ReactAgentExecutor] No valid text messages found in history for task ${taskId}.`); - const failureUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: 'No message found to process.' }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(failureUpdate); - return; - } - try { - // 4. Run the React agent - const input = { messages }; - const config = { configurable: { thread_id: contextId } }; - // Check if the task has been cancelled before starting - if (this.cancelledTasks.has(taskId)) { - console.log(`[ReactAgentExecutor] Request cancelled for task: ${taskId}`); - const cancelledUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "canceled", - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(cancelledUpdate); - return; - } - // Stream the agent execution - let finalResponse = ''; - let isInputRequired = false; - // Use the existing config object - const stream = await this.agent.stream(input, { - ...config, - streamMode: "values", - }); - for await (const chunk of stream) { - // Extract messages from the chunk - const messages = chunk.messages || []; - // Check for cancellation during execution - if (this.cancelledTasks.has(taskId)) { - console.log(`[ReactAgentExecutor] Request cancelled during execution for task: ${taskId}`); - const cancelledUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "canceled", - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(cancelledUpdate); - return; - } - // Get the latest message content if available - const lastMessage = messages.length > 0 ? messages[messages.length - 1] : null; - let messageContent = ''; - if (lastMessage) { - if (lastMessage.content) { - messageContent = typeof lastMessage.content === 'string' - ? lastMessage.content - : lastMessage.content.toString(); - } - else if (lastMessage.tool_calls && lastMessage.tool_calls.length > 0) { - messageContent = JSON.stringify(lastMessage.tool_calls); - } - else { - messageContent = JSON.stringify(lastMessage); - } - } - else { - // If no message is available, use the entire chunk for debugging - messageContent = JSON.stringify(chunk); - } - // Update the final response - finalResponse = messageContent; - // Check if we need more input based on the agent's state - isInputRequired = chunk.next !== 'END'; - // Send intermediate updates - const intermediateUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "working", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: messageContent }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: false, - }; - eventBus.publish(intermediateUpdate); - } - // 5. Create the agent's final message - const agentMessage = { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: finalResponse || "Completed." }], - taskId: taskId, - contextId: contextId, - }; - historyForAgent.push(agentMessage); - contexts.set(contextId, historyForAgent); - // 6. Publish final task status update - const finalState = isInputRequired ? "input-required" : "completed"; - const finalUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: finalState, - message: agentMessage, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(finalUpdate); - console.log(`[ReactAgentExecutor] Task ${taskId} finished with state: ${finalState}`); - } - catch (error) { - console.error(`[ReactAgentExecutor] Error processing task ${taskId}:`, error); - const errorUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(errorUpdate); - } - } -} -//# sourceMappingURL=agent_executor.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/agent_executor.js.map b/examples/js/langgraph-js-example/dist/agent_executor.js.map deleted file mode 100644 index 12e727ef..00000000 --- a/examples/js/langgraph-js-example/dist/agent_executor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"agent_executor.js","sourceRoot":"","sources":["../src/agent_executor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/baseAgentExecutor.d.ts b/examples/js/langgraph-js-example/dist/baseAgentExecutor.d.ts deleted file mode 100644 index dc4f7968..00000000 --- a/examples/js/langgraph-js-example/dist/baseAgentExecutor.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Message } from '@a2a-js/sdk'; -import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; -export declare abstract class BaseAgentExecutor implements AgentExecutor { - private cancelledTasks; - protected readonly agent: any; - protected constructor(agent: any); - cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; - private publishInitialTask; - private publishStatusUpdate; - /** - * Handles the cancellation of a task by publishing a "canceled" status update. - */ - private publishTaskCancellation; - private publishTaskCompletion; - private publishTaskError; - private addMessageToHistory; - protected abstract runAgent(messages: Message[], contextId: string): Promise>; - private handleStreamResponse; - private handleNonStreamResponse; - execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; -} diff --git a/examples/js/langgraph-js-example/dist/baseAgentExecutor.js b/examples/js/langgraph-js-example/dist/baseAgentExecutor.js deleted file mode 100644 index 3e63547b..00000000 --- a/examples/js/langgraph-js-example/dist/baseAgentExecutor.js +++ /dev/null @@ -1,169 +0,0 @@ -import { v4 as uuidv4 } from 'uuid'; -// Store for conversation contexts -const contexts = new Map(); -export class BaseAgentExecutor { - constructor(agent) { - this.cancelledTasks = new Set(); - this.cancelTask = async (taskId, eventBus) => { - this.cancelledTasks.add(taskId); - // The execute loop is responsible for publishing the final state - }; - this.agent = agent; - } - publishInitialTask(eventBus, taskId, contextId, userMessage) { - const initialTask = { - kind: 'task', - id: taskId, - contextId: contextId, - status: { - state: "submitted", - timestamp: new Date().toISOString(), - }, - history: [userMessage], // Start history with the current user message - metadata: userMessage.metadata, // Carry over metadata from message if any - }; - eventBus.publish(initialTask); - } - publishStatusUpdate(eventBus, taskId, contextId, messageText = null, state = "working", final = false) { - const workingStatusUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: state, - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: messageText ? [{ kind: 'text', text: messageText }] : [], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: final, - }; - eventBus.publish(workingStatusUpdate); - } - /** - * Handles the cancellation of a task by publishing a "canceled" status update. - */ - publishTaskCancellation(taskId, contextId, eventBus) { - console.log(`[AgentExecutor] Request cancelled for task: ${taskId}`); - const cancelledUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: 'canceled', - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(cancelledUpdate); - } - publishTaskCompletion(taskId, contextId, eventBus) { - const finalUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "completed", - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(finalUpdate); - } - publishTaskError(taskId, contextId, eventBus, error) { - const errorUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(errorUpdate); - } - addMessageToHistory(contextId, message) { - const historyForAgent = contexts.get(contextId) || []; - if (!historyForAgent.find(m => m.messageId === message.messageId)) { - historyForAgent.push(message); - contexts.set(contextId, historyForAgent); - } - return historyForAgent; - } - async handleStreamResponse(eventBus, taskId, contextId, existingTask, userMessage, response) { - let finalResponse = ""; - // 1. Publish initial Task event if it's a new task - if (!existingTask) { - this.publishInitialTask(eventBus, taskId, contextId, userMessage); - } - // 2. Publish "working" status update - this.publishStatusUpdate(eventBus, taskId, contextId); - // 3. Stream the agent's response - for await (const textPart of response) { - finalResponse += textPart; - this.publishStatusUpdate(eventBus, taskId, contextId, textPart); - } - // 4. Publish "completed" status update - this.publishTaskCompletion(taskId, contextId, eventBus); - return finalResponse; - } - async handleNonStreamResponse(eventBus, agentMessage) { - eventBus.publish(agentMessage); - } - async execute(requestContext, eventBus) { - const userMessage = requestContext.userMessage; - const existingTask = requestContext.task; - // Determine IDs for the task and context - const taskId = existingTask?.id || uuidv4(); - const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); - console.log(`[AgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); - const historyForAgent = this.addMessageToHistory(contextId, userMessage); - // Check if the task has been cancelled before starting - if (this.cancelledTasks.has(taskId)) { - this.publishTaskCancellation(taskId, contextId, eventBus); - return; - } - try { - // Run the agent - Can return a stream or a string. - const response = await this.runAgent(historyForAgent, contextId); - // Create the agent's final message for the history - we will fill the parts later - const agentMessage = { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [], // We will fill this later - taskId: taskId, - contextId: contextId, - }; - if (response instanceof ReadableStream) { - const aggregatedResponse = await this.handleStreamResponse(eventBus, taskId, contextId, existingTask, userMessage, response); - agentMessage.parts.push({ kind: 'text', text: aggregatedResponse }); - } - else { // response is a string - agentMessage.parts.push({ kind: 'text', text: response }); - await this.handleNonStreamResponse(eventBus, agentMessage); - } - this.addMessageToHistory(contextId, agentMessage); - console.log(`[AgentExecutor] Task ${taskId} finished with state: completed`); - } - catch (error) { - console.error(`[AgentExecutor] Error processing task ${taskId}:`, error); - this.publishTaskError(taskId, contextId, eventBus, error); - } - } -} -//# sourceMappingURL=baseAgentExecutor.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/baseAgentExecutor.js.map b/examples/js/langgraph-js-example/dist/baseAgentExecutor.js.map deleted file mode 100644 index 1c5fefc4..00000000 --- a/examples/js/langgraph-js-example/dist/baseAgentExecutor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"baseAgentExecutor.js","sourceRoot":"","sources":["../src/baseAgentExecutor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,kCAAkC;AAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE9C,MAAM,OAAgB,iBAAiB;IAIrC,YAAsB,KAAU;QAHxB,mBAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QAOpC,eAAU,GAAG,KAAK,EACvB,MAAc,EACd,QAA2B,EACZ,EAAE;YACjB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChC,iEAAiE;QACnE,CAAC,CAAC;QATA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAUO,kBAAkB,CAAC,QAA2B,EAAE,MAAc,EAAE,SAAiB,EAAE,WAAoB;QAC7G,MAAM,WAAW,GAAS;YACxB,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,MAAM;YACV,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE;gBACN,KAAK,EAAE,WAAW;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,8CAA8C;YACtE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,0CAA0C;SAC3E,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAEO,mBAAmB,CACzB,QAA2B,EAC3B,MAAc,EACd,SAAiB,EACjB,cAA6B,IAAI,EACjC,QAAmB,SAAS,EAC5B,QAAiB,KAAK;QAEtB,MAAM,mBAAmB,GAA0B;YACjD,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,MAAM,EAAE;oBACnB,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC/D,MAAM,EAAE,MAAM;oBACd,SAAS,EAAE,SAAS;iBACrB;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,KAAK,EAAE,KAAK;SACb,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,uBAAuB,CAC7B,MAAc,EACd,SAAiB,EACjB,QAA2B;QAE3B,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC;QACrE,MAAM,eAAe,GAA0B;YAC7C,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE;gBACN,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAEO,qBAAqB,CAC3B,MAAc,EACd,SAAiB,EACjB,QAA2B;QAE3B,MAAM,WAAW,GAA0B;YACvC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE;gBACN,KAAK,EAAE,WAAW;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAEO,gBAAgB,CACtB,MAAc,EACd,SAAiB,EACjB,QAA2B,EAC3B,KAAU;QAEV,MAAM,WAAW,GAA0B;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE;gBACN,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE;oBACP,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,MAAM,EAAE;oBACnB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;oBAChE,MAAM,EAAE,MAAM;oBACd,SAAS,EAAE,SAAS;iBACrB;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAEO,mBAAmB,CAAC,SAAiB,EAAE,OAAgB;QAC7D,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAClE,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAIO,KAAK,CAAC,oBAAoB,CAChC,QAA2B,EAC3B,MAAc,EACd,SAAiB,EACjB,YAA8B,EAC9B,WAAoB,EACpB,QAAgC;QAEhC,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,mDAAmD;QACnD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACpE,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAEtD,iCAAiC;QACjC,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACtC,aAAa,IAAI,QAAQ,CAAC;YAC1B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClE,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAExD,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,QAA2B,EAC3B,YAAqB;QAErB,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,cAA8B,EAC9B,QAA2B;QAE3B,MAAM,WAAW,GAAY,cAAc,CAAC,WAAW,CAAC;QACxD,MAAM,YAAY,GAAqB,cAAc,CAAC,IAAI,CAAC;QAE3D,yCAAyC;QACzC,MAAM,MAAM,GAAW,YAAY,EAAE,EAAE,IAAI,MAAM,EAAE,CAAC;QACpD,MAAM,SAAS,GAAW,WAAW,CAAC,SAAS,IAAI,YAAY,EAAE,SAAS,IAAI,MAAM,EAAE,CAAC;QAEvF,OAAO,CAAC,GAAG,CAAC,sCAAsC,WAAW,CAAC,SAAS,aAAa,MAAM,cAAc,SAAS,GAAG,CAAC,CAAC;QAEtH,MAAM,eAAe,GAAc,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAEpF,uDAAuD;QACvD,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,mDAAmD;YACnD,MAAM,QAAQ,GAAoC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;YAElG,kFAAkF;YAClF,MAAM,YAAY,GAAY;gBAC5B,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,MAAM,EAAE;gBACnB,KAAK,EAAE,EAAE,EAAG,0BAA0B;gBACtC,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,SAAS;aACrB,CAAC;YAEF,IAAI,QAAQ,YAAY,cAAc,EAAE,CAAC;gBACvC,MAAM,kBAAkB,GAAW,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACrI,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAC,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC,CAAC,uBAAuB;gBAC9B,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;gBACxD,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7D,CAAC;YAED,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAElD,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,iCAAiC,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,yCAAyC,MAAM,GAAG,EAAC,KAAK,CAAC,CAAC;YACxE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;CACF"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/index.d.ts b/examples/js/langgraph-js-example/dist/index.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/examples/js/langgraph-js-example/dist/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/examples/js/langgraph-js-example/dist/index.js b/examples/js/langgraph-js-example/dist/index.js deleted file mode 100644 index c3e37ac1..00000000 --- a/examples/js/langgraph-js-example/dist/index.js +++ /dev/null @@ -1,62 +0,0 @@ -import { A2AExpressApp, DefaultRequestHandler, InMemoryTaskStore } from '@a2a-js/sdk/server'; -import { ReactAgentExecutor } from './agentExecutor.js'; -import express from 'express'; -import { agent } from './agent.js'; -function getAgentCard() { - const skills = [ - { - id: 'sell_tshirt', - name: 'Sell T-Shirt', - description: 'Helps with selling T-Shirts', - tags: ['sell'], - }, - ]; - const host = process.env.HOST || 'localhost'; - const port = process.env.PORT || 3000; - return { - name: 'Shirtify TShirt Store Agent', - description: 'Sells Shirtify T-Shirts', - url: `http://${host}:${port}/`, - version: '1.0.0', - defaultInputModes: ['text'], - defaultOutputModes: ['text'], - capabilities: { streaming: true }, - skills, - }; -} -async function main() { - const taskStore = new InMemoryTaskStore(); - const agentExecutor = new ReactAgentExecutor(agent); - // 3. Create DefaultRequestHandler - const requestHandler = new DefaultRequestHandler(getAgentCard(), taskStore, agentExecutor); - // 4. Create and setup A2AExpressApp - const app = express(); - const appBuilder = new A2AExpressApp(requestHandler); - // Use type assertion to work around Express type incompatibility - const expressApp = appBuilder.setupRoutes(app); - // 5. Start the server - const PORT = process.env.PORT || 3000; - const server = expressApp.listen(PORT, () => { - console.log(`[ReactAgent] Server using langchain framework and A2A started on http://localhost:${PORT}`); - console.log(`[ReactAgent] Agent Card: http://localhost:${PORT}/.well-known/agent.json`); - console.log('[ReactAgent] Press Ctrl+C to stop the server'); - }); - // 6. Setup graceful shutdown - const shutdown = async () => { - console.log('\n[ReactAgent] Shutting down server...'); - // Close the HTTP server - server.close(() => { - console.log('[ReactAgent] HTTP server closed'); - }); - process.exit(0); - }; - // Handle termination signals - process.on('SIGINT', shutdown); - process.on('SIGTERM', shutdown); -} -// Call the main function to start the server -main().catch(error => { - console.error('Error starting server:', error); - process.exit(1); -}); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/index.js.map b/examples/js/langgraph-js-example/dist/index.js.map deleted file mode 100644 index 3f339336..00000000 --- a/examples/js/langgraph-js-example/dist/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB,EAAa,MAAM,oBAAoB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,SAAS,YAAY;IACnB,MAAM,MAAM,GAAG;QACb;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,6BAA6B;YAC1C,IAAI,EAAE,CAAC,MAAM,CAAC;SACD;KAChB,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAA;IAErC,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,yBAAyB;QACtC,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,GAAG;QAC9B,OAAO,EAAE,OAAO;QAChB,iBAAiB,EAAE,CAAC,MAAM,CAAC;QAC3B,kBAAkB,EAAE,CAAC,MAAM,CAAC;QAC5B,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAuB;QACtD,MAAM;KACM,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAc,IAAI,iBAAiB,EAAE,CAAC;IACrD,MAAM,aAAa,GAAuB,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAExE,kCAAkC;IAClC,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAC9C,YAAY,EAAE,EACd,SAAS,EACT,aAAa,CACd,CAAC;IAEF,oCAAoC;IACpC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,cAAc,CAAC,CAAC;IACrD,iEAAiE;IACjE,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,GAAU,CAAC,CAAC;IAEtD,sBAAsB;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,qFAAqF,IAAI,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,yBAAyB,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAEtD,wBAAwB;QACxB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,6CAA6C;AAC7C,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/oldAgentExecutor.d.ts b/examples/js/langgraph-js-example/dist/oldAgentExecutor.d.ts deleted file mode 100644 index d1234df7..00000000 --- a/examples/js/langgraph-js-example/dist/oldAgentExecutor.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; -export declare class ReactAgentExecutor implements AgentExecutor { - private cancelledTasks; - private agent; - constructor(agent: any); - cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; - execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; -} diff --git a/examples/js/langgraph-js-example/dist/oldAgentExecutor.js b/examples/js/langgraph-js-example/dist/oldAgentExecutor.js deleted file mode 100644 index acbeed1d..00000000 --- a/examples/js/langgraph-js-example/dist/oldAgentExecutor.js +++ /dev/null @@ -1,235 +0,0 @@ -import { v4 as uuidv4 } from 'uuid'; -// Store for conversation contexts -const contexts = new Map(); -export class ReactAgentExecutor { - constructor(agent) { - this.cancelledTasks = new Set(); - this.cancelTask = async (taskId, eventBus) => { - this.cancelledTasks.add(taskId); - // The execute loop is responsible for publishing the final state - }; - this.agent = agent; - } - async execute(requestContext, eventBus) { - const userMessage = requestContext.userMessage; - const existingTask = requestContext.task; - // Determine IDs for the task and context - const taskId = existingTask?.id || uuidv4(); - const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); - console.log(`[ReactAgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); - // 1. Publish initial Task event if it's a new task - if (!existingTask) { - const initialTask = { - kind: 'task', - id: taskId, - contextId: contextId, - status: { - state: "submitted", - timestamp: new Date().toISOString(), - }, - history: [userMessage], // Start history with the current user message - metadata: userMessage.metadata, // Carry over metadata from message if any - }; - eventBus.publish(initialTask); - } - // 2. Publish "working" status update - const workingStatusUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "working", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: false, - }; - eventBus.publish(workingStatusUpdate); - // 3. Prepare messages for the agent - const historyForAgent = contexts.get(contextId) || []; - if (!historyForAgent.find(m => m.messageId === userMessage.messageId)) { - historyForAgent.push(userMessage); - } - contexts.set(contextId, historyForAgent); - // Convert A2A messages to LangChain format - const messages = historyForAgent.map(m => ({ - role: m.role === 'agent' ? 'assistant' : 'user', - content: m.parts - .filter((p) => p.kind === 'text' && !!p.text) - .map(p => p.text) - .join('\n') - })); - if (messages.length === 0) { - console.warn(`[ReactAgentExecutor] No valid text messages found in history for task ${taskId}.`); - const failureUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: 'No message found to process.' }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(failureUpdate); - return; - } - try { - // 4. Run the React agent - const input = { messages }; - const config = { configurable: { thread_id: contextId } }; - // Check if the task has been cancelled before starting - if (this.cancelledTasks.has(taskId)) { - console.log(`[ReactAgentExecutor] Request cancelled for task: ${taskId}`); - const cancelledUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "canceled", - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(cancelledUpdate); - return; - } - // Stream the agent execution - let finalResponse = ''; - let isInputRequired = false; - // Use the existing config object - const stream = await this.agent.stream(input, { - ...config, - streamMode: "values", - }); - for await (const chunk of stream) { - // Extract messages from the chunk - const messages = chunk.messages || []; - // Check for cancellation during execution - if (this.cancelledTasks.has(taskId)) { - console.log(`[ReactAgentExecutor] Request cancelled during execution for task: ${taskId}`); - const cancelledUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "canceled", - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(cancelledUpdate); - return; - } - // Get the latest message content if available - const lastMessage = messages.length > 0 ? messages[messages.length - 1] : null; - let messageContent = ''; - if (lastMessage) { - if (lastMessage.content) { - messageContent = typeof lastMessage.content === 'string' - ? lastMessage.content - : lastMessage.content.toString(); - } - else if (lastMessage.tool_calls && lastMessage.tool_calls.length > 0) { - messageContent = JSON.stringify(lastMessage.tool_calls); - } - else { - messageContent = JSON.stringify(lastMessage); - } - } - else { - // If no message is available, use the entire chunk for debugging - messageContent = JSON.stringify(chunk); - } - // Update the final response - finalResponse = messageContent; - // Check if we need more input based on the agent's state - isInputRequired = chunk.next !== 'END'; - // Send intermediate updates - const intermediateUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "working", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: messageContent }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: false, - }; - eventBus.publish(intermediateUpdate); - } - // 5. Create the agent's final message - const agentMessage = { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: finalResponse || "Completed." }], - taskId: taskId, - contextId: contextId, - }; - historyForAgent.push(agentMessage); - contexts.set(contextId, historyForAgent); - // 6. Publish final task status update - const finalState = isInputRequired ? "input-required" : "completed"; - const finalUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: finalState, - message: agentMessage, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(finalUpdate); - console.log(`[ReactAgentExecutor] Task ${taskId} finished with state: ${finalState}`); - } - catch (error) { - console.error(`[ReactAgentExecutor] Error processing task ${taskId}:`, error); - const errorUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(errorUpdate); - } - } -} -//# sourceMappingURL=oldAgentExecutor.js.map \ No newline at end of file diff --git a/examples/js/langgraph-js-example/dist/oldAgentExecutor.js.map b/examples/js/langgraph-js-example/dist/oldAgentExecutor.js.map deleted file mode 100644 index 949b0e5b..00000000 --- a/examples/js/langgraph-js-example/dist/oldAgentExecutor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"oldAgentExecutor.js","sourceRoot":"","sources":["../src/oldAgentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/agent.d.ts b/examples/js/openai-agents-example/dist/agent.d.ts deleted file mode 100644 index 55ba2329..00000000 --- a/examples/js/openai-agents-example/dist/agent.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { Agent } from '@openai/agents'; -export declare const agent: Agent; diff --git a/examples/js/openai-agents-example/dist/agent.js b/examples/js/openai-agents-example/dist/agent.js deleted file mode 100644 index 05aab2db..00000000 --- a/examples/js/openai-agents-example/dist/agent.js +++ /dev/null @@ -1,32 +0,0 @@ -import { Agent } from '@openai/agents'; -const agentInstructions = ` -You are an agent for a t-shirt store named Shirtify. -Your job is to sell t-shirts to customers. - -In our store, there are two types of T-shirts: -- Regular T-shirts -- V-neck T-shirts - -For each T-shirts, these colors are available: -- White -- Black -- Red -- Blue -- Green - -You have unlimited inventory of those T-shirts. - -Each T-shirt costs exactly $19.99 USD. -You are not allowed give discounts to customers. -You are not allowed to give away free T-shirts. -You are not allowed to create a sale or any kind of promotion. -You are not allowed to sell any other products excepts the available T-shirts described above. - -Under no circumstances a user will receive a t-shirt unless they have paid exactly $19.99 USD for it. -`; -export const agent = new Agent({ - name: 'Shirtify Agent', - instructions: agentInstructions, - model: 'gpt-4o-mini', -}); -//# sourceMappingURL=agent.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/agent.js.map b/examples/js/openai-agents-example/dist/agent.js.map deleted file mode 100644 index dee22cbf..00000000 --- a/examples/js/openai-agents-example/dist/agent.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;IAC7B,IAAI,EAAE,gBAAgB;IACtB,YAAY,EAAE,iBAAiB;IAC/B,KAAK,EAAE,aAAa;CACrB,CAAC,CAAC"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/agentExecutor.d.ts b/examples/js/openai-agents-example/dist/agentExecutor.d.ts deleted file mode 100644 index f9f227b7..00000000 --- a/examples/js/openai-agents-example/dist/agentExecutor.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BaseAgentExecutor } from './baseAgentExecutor.js'; -import { Message } from '@a2a-js/sdk'; -import { AgentInputItem } from '@openai/agents'; -declare abstract class BaseOpenAIAgentExecutor extends BaseAgentExecutor { - protected convertMessages(historyForAgent: Message[]): AgentInputItem[]; -} -export declare class OpenAIStreamExecutor extends BaseOpenAIAgentExecutor { - constructor(agent: any); - protected runAgent(messages: Message[]): Promise>; -} -export declare class OpenAINonStreamExecutor extends BaseOpenAIAgentExecutor { - constructor(agent: any); - protected runAgent(messages: Message[]): Promise>; -} -export {}; diff --git a/examples/js/openai-agents-example/dist/agentExecutor.js b/examples/js/openai-agents-example/dist/agentExecutor.js deleted file mode 100644 index c436e9e5..00000000 --- a/examples/js/openai-agents-example/dist/agentExecutor.js +++ /dev/null @@ -1,37 +0,0 @@ -import { BaseAgentExecutor } from './baseAgentExecutor.js'; -import { run } from '@openai/agents'; -class BaseOpenAIAgentExecutor extends BaseAgentExecutor { - convertMessages(historyForAgent) { - // Convert A2A messages to correct format - return historyForAgent.map(m => ({ - role: m.role === 'agent' ? 'assistant' : 'user', - content: m.parts - .filter((p) => p.kind === 'text' && !!p.text) - .map(p => ({ - type: "input_text", - text: p.text - })) - })); - } -} -export class OpenAIStreamExecutor extends BaseOpenAIAgentExecutor { - constructor(agent) { - super(agent); - } - async runAgent(messages) { - const convertedMessages = this.convertMessages(messages); - const stream = await run(this.agent, convertedMessages, { stream: true }); - return stream.toTextStream(); - } -} -export class OpenAINonStreamExecutor extends BaseOpenAIAgentExecutor { - constructor(agent) { - super(agent); - } - async runAgent(messages) { - const convertedMessages = this.convertMessages(messages); - const result = await run(this.agent, convertedMessages, { stream: false }); - return result.finalOutput; - } -} -//# sourceMappingURL=agentExecutor.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/agentExecutor.js.map b/examples/js/openai-agents-example/dist/agentExecutor.js.map deleted file mode 100644 index ddae3d8c..00000000 --- a/examples/js/openai-agents-example/dist/agentExecutor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"agentExecutor.js","sourceRoot":"","sources":["../src/agentExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAkB,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAe,uBAAwB,SAAQ,iBAAiB;IACpD,eAAe,CAAC,eAA0B;QAClD,yCAAyC;QACzC,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;YAC/C,OAAO,EAAE,CAAC,CAAC,KAAK;iBACb,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAE,CAAc,CAAC,IAAI,CAAC;iBACzE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAG,CAAc,CAAC,IAAI;aAC3B,CAAC,CAAC;SACa,CAAA,CACrB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,uBAAuB;IAC/D,YAAmB,KAAU;QAC3B,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,QAAmB;QAC1C,MAAM,iBAAiB,GAAqB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,YAAY,EAA4B,CAAC;IACzD,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,uBAAuB;IAClE,YAAmB,KAAU;QAC3B,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,QAAmB;QAC1C,MAAM,iBAAiB,GAAqB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;CACF"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/baseAgentExecutor.d.ts b/examples/js/openai-agents-example/dist/baseAgentExecutor.d.ts deleted file mode 100644 index 9dce6617..00000000 --- a/examples/js/openai-agents-example/dist/baseAgentExecutor.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Message } from '@a2a-js/sdk'; -import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; -export declare abstract class BaseAgentExecutor implements AgentExecutor { - private cancelledTasks; - protected readonly agent: any; - protected constructor(agent: any); - cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; - private publishInitialTask; - private publishStatusUpdate; - /** - * Handles the cancellation of a task by publishing a "canceled" status update. - */ - private publishTaskCancellation; - private publishTaskCompletion; - private publishTaskError; - private addMessageToHistory; - protected abstract runAgent(messages: Message[]): Promise>; - private handleStreamResponse; - private handleNonStreamResponse; - execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; -} diff --git a/examples/js/openai-agents-example/dist/baseAgentExecutor.js b/examples/js/openai-agents-example/dist/baseAgentExecutor.js deleted file mode 100644 index bf6352d8..00000000 --- a/examples/js/openai-agents-example/dist/baseAgentExecutor.js +++ /dev/null @@ -1,169 +0,0 @@ -import { v4 as uuidv4 } from 'uuid'; -// Store for conversation contexts -const contexts = new Map(); -export class BaseAgentExecutor { - constructor(agent) { - this.cancelledTasks = new Set(); - this.cancelTask = async (taskId, eventBus) => { - this.cancelledTasks.add(taskId); - // The execute loop is responsible for publishing the final state - }; - this.agent = agent; - } - publishInitialTask(eventBus, taskId, contextId, userMessage) { - const initialTask = { - kind: 'task', - id: taskId, - contextId: contextId, - status: { - state: "submitted", - timestamp: new Date().toISOString(), - }, - history: [userMessage], // Start history with the current user message - metadata: userMessage.metadata, // Carry over metadata from message if any - }; - eventBus.publish(initialTask); - } - publishStatusUpdate(eventBus, taskId, contextId, messageText = null, state = "working", final = false) { - const workingStatusUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: state, - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: messageText ? [{ kind: 'text', text: messageText }] : [], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: final, - }; - eventBus.publish(workingStatusUpdate); - } - /** - * Handles the cancellation of a task by publishing a "canceled" status update. - */ - publishTaskCancellation(taskId, contextId, eventBus) { - console.log(`[AgentExecutor] Request cancelled for task: ${taskId}`); - const cancelledUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: 'canceled', - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(cancelledUpdate); - } - publishTaskCompletion(taskId, contextId, eventBus) { - const finalUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "completed", - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(finalUpdate); - } - publishTaskError(taskId, contextId, eventBus, error) { - const errorUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(errorUpdate); - } - addMessageToHistory(contextId, message) { - const historyForAgent = contexts.get(contextId) || []; - if (!historyForAgent.find(m => m.messageId === message.messageId)) { - historyForAgent.push(message); - contexts.set(contextId, historyForAgent); - } - return historyForAgent; - } - async handleStreamResponse(eventBus, taskId, contextId, existingTask, userMessage, response) { - let finalResponse = ""; - // 1. Publish initial Task event if it's a new task - if (!existingTask) { - this.publishInitialTask(eventBus, taskId, contextId, userMessage); - } - // 2. Publish "working" status update - this.publishStatusUpdate(eventBus, taskId, contextId); - // 3. Stream the agent's response - for await (const textPart of response) { - finalResponse += textPart; - this.publishStatusUpdate(eventBus, taskId, contextId, textPart); - } - // 4. Publish "completed" status update - this.publishTaskCompletion(taskId, contextId, eventBus); - return finalResponse; - } - async handleNonStreamResponse(eventBus, agentMessage) { - eventBus.publish(agentMessage); - } - async execute(requestContext, eventBus) { - const userMessage = requestContext.userMessage; - const existingTask = requestContext.task; - // Determine IDs for the task and context - const taskId = existingTask?.id || uuidv4(); - const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); - console.log(`[AgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); - const historyForAgent = this.addMessageToHistory(contextId, userMessage); - // Check if the task has been cancelled before starting - if (this.cancelledTasks.has(taskId)) { - this.publishTaskCancellation(taskId, contextId, eventBus); - return; - } - try { - // Run the agent - Can return a stream or a string. - const response = await this.runAgent(historyForAgent); - // Create the agent's final message for the history - we will fill the parts later - const agentMessage = { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [], // We will fill this later - taskId: taskId, - contextId: contextId, - }; - if (response instanceof ReadableStream) { - const aggregatedResponse = await this.handleStreamResponse(eventBus, taskId, contextId, existingTask, userMessage, response); - agentMessage.parts.push({ kind: 'text', text: aggregatedResponse }); - } - else { // response is a string - agentMessage.parts.push({ kind: 'text', text: response }); - await this.handleNonStreamResponse(eventBus, agentMessage); - } - this.addMessageToHistory(contextId, agentMessage); - console.log(`[AgentExecutor] Task ${taskId} finished with state: completed`); - } - catch (error) { - console.error(`[AgentExecutor] Error processing task ${taskId}:`, error); - this.publishTaskError(taskId, contextId, eventBus, error); - } - } -} -//# sourceMappingURL=baseAgentExecutor.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/baseAgentExecutor.js.map b/examples/js/openai-agents-example/dist/baseAgentExecutor.js.map deleted file mode 100644 index c563469d..00000000 --- a/examples/js/openai-agents-example/dist/baseAgentExecutor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"baseAgentExecutor.js","sourceRoot":"","sources":["../src/baseAgentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/index.d.ts b/examples/js/openai-agents-example/dist/index.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/examples/js/openai-agents-example/dist/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/examples/js/openai-agents-example/dist/index.js b/examples/js/openai-agents-example/dist/index.js deleted file mode 100644 index 41977537..00000000 --- a/examples/js/openai-agents-example/dist/index.js +++ /dev/null @@ -1,71 +0,0 @@ -import { A2AExpressApp, DefaultRequestHandler, InMemoryTaskStore } from '@a2a-js/sdk/server'; -import express from 'express'; -import { agent } from './agent.js'; -import { OpenAINonStreamExecutor, OpenAIStreamExecutor } from './agentExecutor.js'; -function getAgentCard() { - const skills = [ - { - id: 'sell_tshirt', - name: 'Sell T-Shirt', - description: 'Helps with selling T-Shirts', - tags: ['sell'], - }, - ]; - const host = process.env.HOST || 'localhost'; - const port = Number(process.env.PORT || 3000); - return { - name: 'Shirtify TShirt Store Agent', - description: 'Sells Shirtify T-Shirts', - url: `http://${host}:${port}/`, - version: '1.0.0', - defaultInputModes: ['text'], - defaultOutputModes: ['text'], - capabilities: { streaming: true }, - skills, - }; -} -async function main() { - const stream = (process.env.STREAM || "").toLowerCase() === 'true'; - const taskStore = new InMemoryTaskStore(); - let agentExecutor; - if (stream) { - agentExecutor = new OpenAIStreamExecutor(agent); - console.log("[A2A Agent] Using OpenAIStreamExecutor"); - } - else { - agentExecutor = new OpenAINonStreamExecutor(agent); - console.log("[A2A Agent] Using OpenAINonStreamExecutor"); - } - // 3. Create DefaultRequestHandler - const requestHandler = new DefaultRequestHandler(getAgentCard(), taskStore, agentExecutor); - // 4. Create and setup A2AExpressApp - const app = express(); - const appBuilder = new A2AExpressApp(requestHandler); - // Use type assertion to work around Express type incompatibility - const expressApp = appBuilder.setupRoutes(app); - // 5. Start the server - const PORT = Number(process.env.PORT || 3000); - const server = expressApp.listen(PORT, () => { - console.log(`[A2A Agent] Server using @openai/agents framework and A2A started on http://localhost:${PORT}`); - console.log(`[A2A Agent] Agent Card: http://localhost:${PORT}/.well-known/agent.json`); - console.log('[A2A Agent] Press Ctrl+C to stop the server'); - }); - // 6. Setup graceful shutdown - const shutdown = async () => { - console.log('\n[A2A Agent] Shutting down server...'); - // Close the HTTP server - server.close(() => { - console.log('[A2A Agent] HTTP server closed'); - }); - process.exit(0); - }; - // Handle termination signals - process.on('SIGINT', shutdown); - process.on('SIGTERM', shutdown); -} -// Call the main function to start the server -main().catch(error => { - console.error('Error starting server:', error); - process.exit(1); -}); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/index.js.map b/examples/js/openai-agents-example/dist/index.js.map deleted file mode 100644 index 094760d9..00000000 --- a/examples/js/openai-agents-example/dist/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/oldAgentExecutor.d.ts b/examples/js/openai-agents-example/dist/oldAgentExecutor.d.ts deleted file mode 100644 index 044ad770..00000000 --- a/examples/js/openai-agents-example/dist/oldAgentExecutor.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; -export declare class OpenAIAgentExecutor implements AgentExecutor { - private cancelledTasks; - private agent; - constructor(agent: any); - cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; - execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; -} diff --git a/examples/js/openai-agents-example/dist/oldAgentExecutor.js b/examples/js/openai-agents-example/dist/oldAgentExecutor.js deleted file mode 100644 index 1b75490f..00000000 --- a/examples/js/openai-agents-example/dist/oldAgentExecutor.js +++ /dev/null @@ -1,185 +0,0 @@ -import { v4 as uuidv4 } from 'uuid'; -import { run } from '@openai/agents'; -// Store for conversation contexts -const contexts = new Map(); -export class OpenAIAgentExecutor { - constructor(agent) { - this.cancelledTasks = new Set(); - this.cancelTask = async (taskId, eventBus) => { - this.cancelledTasks.add(taskId); - // The execute loop is responsible for publishing the final state - }; - this.agent = agent; - } - async execute(requestContext, eventBus) { - const userMessage = requestContext.userMessage; - const existingTask = requestContext.task; - // Determine IDs for the task and context - const taskId = existingTask?.id || uuidv4(); - const contextId = userMessage.contextId || existingTask?.contextId || uuidv4(); - console.log(`[OpenAIAgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); - // 1. Publish initial Task event if it's a new task - if (!existingTask) { - const initialTask = { - kind: 'task', - id: taskId, - contextId: contextId, - status: { - state: "submitted", - timestamp: new Date().toISOString(), - }, - history: [userMessage], // Start history with the current user message - metadata: userMessage.metadata, // Carry over metadata from message if any - }; - eventBus.publish(initialTask); - } - // 2. Publish "working" status update - const workingStatusUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "working", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: false, - }; - eventBus.publish(workingStatusUpdate); - // 3. Prepare messages for the agent - const historyForAgent = contexts.get(contextId) || []; - if (!historyForAgent.find(m => m.messageId === userMessage.messageId)) { - historyForAgent.push(userMessage); - } - contexts.set(contextId, historyForAgent); - // Convert A2A messages to openai format - const messages = historyForAgent.map(m => ({ - role: m.role === 'agent' ? 'assistant' : 'user', - content: m.parts - .filter((p) => p.kind === 'text' && !!p.text) - .map(p => ({ - type: "input_text", - text: p.text - })) - })); - if (messages.length === 0) { - console.warn(`[OpenAIAgentExecutor] No valid text messages found in history for task ${taskId}.`); - const failureUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: 'No message found to process.' }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(failureUpdate); - return; - } - try { - // Check if the task has been cancelled before starting - if (this.cancelledTasks.has(taskId)) { - console.log(`[OpenAIAgentExecutor] Request cancelled for task: ${taskId}`); - const cancelledUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "canceled", - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(cancelledUpdate); - return; - } - // Use the existing config object - const stream = await run(this.agent, messages, { stream: true }); - for await (const textPart of stream.toTextStream()) { - const intermediateUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "working", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: textPart }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: false, - }; - eventBus.publish(intermediateUpdate); - } - // 5. Create the agent's final message - const agentMessage = { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [], - taskId: taskId, - contextId: contextId, - }; - historyForAgent.push(agentMessage); - contexts.set(contextId, historyForAgent); - // 6. Publish final task status update - const finalUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "completed", - message: agentMessage, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(finalUpdate); - console.log(`[OpenAIAgentExecutor] Task ${taskId} finished with state: completed`); - } - catch (error) { - console.error(`[OpenAIAgentExecutor] Error processing task ${taskId}:`, error); - const errorUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: uuidv4(), - parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(errorUpdate); - } - } -} -//# sourceMappingURL=oldAgentExecutor.js.map \ No newline at end of file diff --git a/examples/js/openai-agents-example/dist/oldAgentExecutor.js.map b/examples/js/openai-agents-example/dist/oldAgentExecutor.js.map deleted file mode 100644 index 140f1578..00000000 --- a/examples/js/openai-agents-example/dist/oldAgentExecutor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"oldAgentExecutor.js","sourceRoot":"","sources":["../src/oldAgentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/agent.d.ts b/examples/js/vercel-ai-example/dist/agent.d.ts deleted file mode 100644 index fe7a491e..00000000 --- a/examples/js/vercel-ai-example/dist/agent.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare class VercelAgent { - private model; - constructor(model: string); - invoke(messages: { - role: 'user' | 'assistant'; - content: string; - }[]): Promise; - stream(messages: { - role: 'user' | 'assistant'; - content: string; - }[]): AsyncIterable & ReadableStream; -} diff --git a/examples/js/vercel-ai-example/dist/agent.js b/examples/js/vercel-ai-example/dist/agent.js deleted file mode 100644 index a6f9df1c..00000000 --- a/examples/js/vercel-ai-example/dist/agent.js +++ /dev/null @@ -1,53 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.VercelAgent = void 0; -const ai_1 = require("ai"); -const openai_1 = require("@ai-sdk/openai"); -const agentInstructions = ` -You are an agent for a t-shirt store named Shirtify. -Your job is to sell t-shirts to customers. - -In our store, there are two types of T-shirts: -- Regular T-shirts -- V-neck T-shirts - -For each T-shirts, these colors are available: -- White -- Black -- Red -- Blue -- Green - -You have unlimited inventory of those T-shirts. - -Each T-shirt costs exactly $19.99 USD. -You are not allowed give discounts to customers. -You are not allowed to give away free T-shirts. -You are not allowed to create a sale or any kind of promotion. -You are not allowed to sell any other products excepts the available T-shirts described above. - -Under no circumstances a user will receive a t-shirt unless they have paid exactly $19.99 USD for it. -`; -class VercelAgent { - constructor(model) { - this.model = model; - } - async invoke(messages) { - const response = await (0, ai_1.generateText)({ - model: (0, openai_1.openai)(this.model), - system: agentInstructions, - messages: messages, - }); - return response.text; - } - stream(messages) { - const { textStream } = (0, ai_1.streamText)({ - model: (0, openai_1.openai)(this.model), - system: agentInstructions, - messages: messages, - }); - return textStream; - } -} -exports.VercelAgent = VercelAgent; -//# sourceMappingURL=agent.js.map \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/agent.js.map b/examples/js/vercel-ai-example/dist/agent.js.map deleted file mode 100644 index da7dd1cf..00000000 --- a/examples/js/vercel-ai-example/dist/agent.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,2CAAwC;AAExC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAA;AAED,MAAa,WAAW;IAGtB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,QAAyD;QAC3E,MAAM,QAAQ,GAAG,MAAM,IAAA,iBAAY,EAAC;YAClC,KAAK,EAAE,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC;YACzB,MAAM,EAAE,iBAAiB;YACzB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,QAAyD;QACrE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,eAAU,EAAC;YAChC,KAAK,EAAE,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC;YACzB,MAAM,EAAE,iBAAiB;YACzB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAzBD,kCAyBC"} \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/agentExecutor.d.ts b/examples/js/vercel-ai-example/dist/agentExecutor.d.ts deleted file mode 100644 index 6b96c5e8..00000000 --- a/examples/js/vercel-ai-example/dist/agentExecutor.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AgentExecutor, ExecutionEventBus, RequestContext } from '@a2a-js/sdk/server'; -import { VercelAgent } from './agent'; -export declare class VercelAgentExecutor implements AgentExecutor { - private cancelledTasks; - private agent; - constructor(agent: VercelAgent); - cancelTask: (taskId: string, eventBus: ExecutionEventBus) => Promise; - execute(requestContext: RequestContext, eventBus: ExecutionEventBus): Promise; -} diff --git a/examples/js/vercel-ai-example/dist/agentExecutor.js b/examples/js/vercel-ai-example/dist/agentExecutor.js deleted file mode 100644 index e6f70453..00000000 --- a/examples/js/vercel-ai-example/dist/agentExecutor.js +++ /dev/null @@ -1,186 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.VercelAgentExecutor = void 0; -const uuid_1 = require("uuid"); -// Store for conversation contexts -const contexts = new Map(); -class VercelAgentExecutor { - constructor(agent) { - this.cancelledTasks = new Set(); - this.cancelTask = async (taskId, eventBus) => { - this.cancelledTasks.add(taskId); - // The execute loop is responsible for publishing the final state - }; - this.agent = agent; - } - async execute(requestContext, eventBus) { - const userMessage = requestContext.userMessage; - const existingTask = requestContext.task; - // Determine IDs for the task and context - const taskId = existingTask?.id || (0, uuid_1.v4)(); - const contextId = userMessage.contextId || existingTask?.contextId || (0, uuid_1.v4)(); - console.log(`[VercelAgentExecutor] Processing message ${userMessage.messageId} for task ${taskId} (context: ${contextId})`); - // 1. Publish initial Task event if it's a new task - if (!existingTask) { - const initialTask = { - kind: 'task', - id: taskId, - contextId: contextId, - status: { - state: "submitted", - timestamp: new Date().toISOString(), - }, - history: [userMessage], // Start history with the current user message - metadata: userMessage.metadata, // Carry over metadata from message if any - }; - eventBus.publish(initialTask); - } - // 2. Publish "working" status update - const workingStatusUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "working", - message: { - kind: 'message', - role: 'agent', - messageId: (0, uuid_1.v4)(), - parts: [], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: false, - }; - eventBus.publish(workingStatusUpdate); - // 3. Prepare messages for the agent - const historyForAgent = contexts.get(contextId) || []; - if (!historyForAgent.find(m => m.messageId === userMessage.messageId)) { - historyForAgent.push(userMessage); - } - contexts.set(contextId, historyForAgent); - // Convert A2A messages to Vercel format - const messages = historyForAgent.map(m => ({ - role: m.role === 'agent' ? 'assistant' : 'user', - content: m.parts - .filter((p) => p.kind === 'text' && !!p.text) - .map(p => (p.text)) - .join("") - })); - if (messages.length === 0) { - console.warn(`[VercelAgentExecutor] No valid text messages found in history for task ${taskId}.`); - const failureUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: (0, uuid_1.v4)(), - parts: [{ kind: 'text', text: 'No message found to process.' }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(failureUpdate); - return; - } - try { - // Check if the task has been cancelled before starting - if (this.cancelledTasks.has(taskId)) { - console.log(`[VercelAgentExecutor] Request cancelled for task: ${taskId}`); - const cancelledUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "canceled", - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(cancelledUpdate); - return; - } - // Use the existing config object - const stream = this.agent.stream(messages); - for await (const textPart of stream) { - const intermediateUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "working", - message: { - kind: 'message', - role: 'agent', - messageId: (0, uuid_1.v4)(), - parts: [{ kind: 'text', text: textPart }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: false, - }; - eventBus.publish(intermediateUpdate); - } - // 5. Create the agent's final message - const agentMessage = { - kind: 'message', - role: 'agent', - messageId: (0, uuid_1.v4)(), - parts: [], - taskId: taskId, - contextId: contextId, - }; - historyForAgent.push(agentMessage); - contexts.set(contextId, historyForAgent); - // 6. Publish final task status update - const finalUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "completed", - message: agentMessage, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(finalUpdate); - console.log(`[VercelAgentExecutor] Task ${taskId} finished with state: completed`); - } - catch (error) { - console.error(`[VercelAgentExecutor] Error processing task ${taskId}:`, error); - const errorUpdate = { - kind: 'status-update', - taskId: taskId, - contextId: contextId, - status: { - state: "failed", - message: { - kind: 'message', - role: 'agent', - messageId: (0, uuid_1.v4)(), - parts: [{ kind: 'text', text: `Agent error: ${error.message}` }], - taskId: taskId, - contextId: contextId, - }, - timestamp: new Date().toISOString(), - }, - final: true, - }; - eventBus.publish(errorUpdate); - } - } -} -exports.VercelAgentExecutor = VercelAgentExecutor; -//# sourceMappingURL=agentExecutor.js.map \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/agentExecutor.js.map b/examples/js/vercel-ai-example/dist/agentExecutor.js.map deleted file mode 100644 index 7eccb5ad..00000000 --- a/examples/js/vercel-ai-example/dist/agentExecutor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"agentExecutor.js","sourceRoot":"","sources":["../src/agentExecutor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/index.d.ts b/examples/js/vercel-ai-example/dist/index.d.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/examples/js/vercel-ai-example/dist/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/examples/js/vercel-ai-example/dist/index.js b/examples/js/vercel-ai-example/dist/index.js deleted file mode 100644 index 14d49f57..00000000 --- a/examples/js/vercel-ai-example/dist/index.js +++ /dev/null @@ -1,68 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const server_1 = require("@a2a-js/sdk/server"); -const agentExecutor_js_1 = require("./agentExecutor.js"); -const express_1 = __importDefault(require("express")); -const agent_js_1 = require("./agent.js"); -function getAgentCard() { - const skills = [ - { - id: 'sell_tshirt', - name: 'Sell T-Shirt', - description: 'Helps with selling T-Shirts', - tags: ['sell'], - }, - ]; - const host = process.env.HOST || 'localhost'; - const port = process.env.PORT || 3000; - return { - name: 'Shirtify TShirt Store Agent', - description: 'Sells Shirtify T-Shirts', - url: `http://${host}:${port}/`, - version: '1.0.0', - defaultInputModes: ['text'], - defaultOutputModes: ['text'], - capabilities: { streaming: true }, - skills, - }; -} -async function main() { - const taskStore = new server_1.InMemoryTaskStore(); - const agent = new agent_js_1.VercelAgent('gpt-4o-mini'); - const agentExecutor = new agentExecutor_js_1.VercelAgentExecutor(agent); - // 3. Create DefaultRequestHandler - const requestHandler = new server_1.DefaultRequestHandler(getAgentCard(), taskStore, agentExecutor); - // 4. Create and setup A2AExpressApp - const app = (0, express_1.default)(); - const appBuilder = new server_1.A2AExpressApp(requestHandler); - // Use type assertion to work around Express type incompatibility - const expressApp = appBuilder.setupRoutes(app); - // 5. Start the server - const PORT = process.env.PORT || 3000; - const server = expressApp.listen(PORT, () => { - console.log(`[ReactAgent] Server using langchain framework and A2A started on http://localhost:${PORT}`); - console.log(`[ReactAgent] Agent Card: http://localhost:${PORT}/.well-known/agent.json`); - console.log('[ReactAgent] Press Ctrl+C to stop the server'); - }); - // 6. Setup graceful shutdown - const shutdown = async () => { - console.log('\n[ReactAgent] Shutting down server...'); - // Close the HTTP server - server.close(() => { - console.log('[ReactAgent] HTTP server closed'); - }); - process.exit(0); - }; - // Handle termination signals - process.on('SIGINT', shutdown); - process.on('SIGTERM', shutdown); -} -// Call the main function to start the server -main().catch(error => { - console.error('Error starting server:', error); - process.exit(1); -}); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/examples/js/vercel-ai-example/dist/index.js.map b/examples/js/vercel-ai-example/dist/index.js.map deleted file mode 100644 index b2ae9019..00000000 --- a/examples/js/vercel-ai-example/dist/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,+CAAwG;AACxG,yDAAyD;AACzD,sDAA8B;AAE9B,yCAAyC;AAEzC,SAAS,YAAY;IACnB,MAAM,MAAM,GAAG;QACb;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,6BAA6B;YAC1C,IAAI,EAAE,CAAC,MAAM,CAAC;SACD;KAChB,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAA;IAErC,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,yBAAyB;QACtC,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,GAAG;QAC9B,OAAO,EAAE,OAAO;QAChB,iBAAiB,EAAE,CAAC,MAAM,CAAC;QAC3B,kBAAkB,EAAE,CAAC,MAAM,CAAC;QAC5B,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAuB;QACtD,MAAM;KACM,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAc,IAAI,0BAAiB,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,sBAAW,CAAC,aAAa,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAwB,IAAI,sCAAmB,CAAC,KAAK,CAAC,CAAC;IAE1E,kCAAkC;IAClC,MAAM,cAAc,GAAG,IAAI,8BAAqB,CAC9C,YAAY,EAAE,EACd,SAAS,EACT,aAAa,CACd,CAAC;IAEF,oCAAoC;IACpC,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,sBAAa,CAAC,cAAc,CAAC,CAAC;IACrD,iEAAiE;IACjE,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,GAAU,CAAC,CAAC;IAEtD,sBAAsB;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,qFAAqF,IAAI,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,yBAAyB,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAEtD,wBAAwB;QACxB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,6CAA6C;AAC7C,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"} \ No newline at end of file From 9dd1d8be76d3f59fbc22aa011edc33690c6f1891 Mon Sep 17 00:00:00 2001 From: Yuval Date: Wed, 30 Jul 2025 11:34:57 +0300 Subject: [PATCH 08/14] mypy --- examples/tshirt_store_agent/tshirt_store_agent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tshirt_store_agent/tshirt_store_agent.py b/examples/tshirt_store_agent/tshirt_store_agent.py index 81345b54..1b08ed7a 100644 --- a/examples/tshirt_store_agent/tshirt_store_agent.py +++ b/examples/tshirt_store_agent/tshirt_store_agent.py @@ -73,7 +73,7 @@ def send_email_tool( def create_tshirt_store_agent() -> LlmAgent: - tools = [ + tools: list[FunctionTool] = [ FunctionTool( func=inventory_tool, ), From 099c822229d3c9be3162001ef188b72f0f39966c Mon Sep 17 00:00:00 2001 From: Yuval Date: Mon, 8 Sep 2025 12:32:34 +0300 Subject: [PATCH 09/14] param fix --- .github/workflows/rogue.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index 9fb6b59f..fb0cac6d 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -51,5 +51,5 @@ jobs: uv run -m rogue cli \ --debug \ --evaluated-agent-url http://localhost:10001 \ - --judge-llm-model openai/o4-mini \ + --judge-llm openai/o4-mini \ --workdir './examples/tshirt_store_agent/.rogue' From 506911625bd6043e91bc5a8cb5c302b7c58daf9a Mon Sep 17 00:00:00 2001 From: Yuval Date: Mon, 8 Sep 2025 12:35:55 +0300 Subject: [PATCH 10/14] Start rogue server --- .github/workflows/rogue.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index fb0cac6d..d57fa03d 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -46,6 +46,17 @@ jobs: echo "⏳ Waiting for agent to be ready..." curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail -o /dev/null \ http://localhost:10001/.well-known/agent.json + + echo "🚀 Starting rogue server..." + uv run -m rogue server --host 0.0.0.0 --port 8000 & + ROGUE_PID=$! + echo "Rogue server started with PID: $ROGUE_PID" + trap 'echo "🛑 Stopping rogue server..."; kill $ROGUE_PID' EXIT + + echo "⏳ Waiting for rogue server to be ready..." + curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail -o /dev/null \ + http://localhost:8000/api/v1/health + echo "🚀 Rogue server ready" echo "🚀 Running rogue..." uv run -m rogue cli \ From ec5e89c0472a000b194bccc6102fc505f87baa62 Mon Sep 17 00:00:00 2001 From: Yuval Date: Mon, 8 Sep 2025 12:39:17 +0300 Subject: [PATCH 11/14] rename job --- .github/workflows/rogue.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index d57fa03d..99b96afb 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: jobs: - run-rogue: + rogue-sanity: runs-on: ubuntu-latest timeout-minutes: 15 steps: From 9826b18d38d7332dc35b70ece3870fc7fa196756 Mon Sep 17 00:00:00 2001 From: Yuval Date: Mon, 8 Sep 2025 12:41:56 +0300 Subject: [PATCH 12/14] rename job --- .github/workflows/rogue.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index 99b96afb..ddd25c1b 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: jobs: - rogue-sanity: + rogue_sanity: runs-on: ubuntu-latest timeout-minutes: 15 steps: From 94e5df40f3a60c084678cfe0824787fd1832c718 Mon Sep 17 00:00:00 2001 From: Yuval Date: Thu, 11 Sep 2025 19:43:07 -0300 Subject: [PATCH 13/14] update gh docs --- rogue/github_action_docs.md | 42 ++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/rogue/github_action_docs.md b/rogue/github_action_docs.md index b6efd7b9..ebb9ce9e 100644 --- a/rogue/github_action_docs.md +++ b/rogue/github_action_docs.md @@ -12,13 +12,17 @@ Our workflow consists of the following steps: Preparations: 1. **Checks out the repository.** -2. **Installs `uv` and python.** you can choose to use python as-is without uv if you prefer. -3. **Installs Rogue.** +2. **Installs `uv` and python** using the `.python-version` file. You can also choose to not use uv. +3. **Creates a virtual environment** using `uv venv`. (Optional if you aren't using uv) +4. **Installs Rogue SDK** from the local `sdks/python` directory. +5. **Installs Rogue server** from the main package. Execution: 1. **Starts the AI agent** in the background. 2. **Waits for the agent to become ready** by repeatedly checking the agent-card URL. -3. **Executes Rogue** to run tests against the locally started agent. +3. **Starts the Rogue server** in the background. +4. **Waits for the Rogue server to become ready** by checking the health endpoint. +5. **Executes Rogue CLI** to run tests against the locally started agent. --- @@ -26,7 +30,7 @@ Execution: ## Notes: 1. Rogue can take a long time to run. Consider setting a timeout to avoid unexpected costs. 2. Don't forget to set the llm provider api key (OPENAI_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY / gcloud login / etc) in your CI/CD environment. -3. Make sure to adjust the readiness check URL to match your agent's URL. +3. Make sure to adjust the readiness check URLs to match your agent's and Rogue server's URLs. 4. Make sure to go over the Rogue CLI documentation to help you configure Rogue CLI to match your needs. --- @@ -47,8 +51,7 @@ jobs: run-rogue: runs-on: ubuntu-latest - # Notice! Rogue can take a long time to run. consider setting a timeout to avoid unexpected costs. - timeout-minutes: 60 + timeout-minutes: 15 steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -61,8 +64,14 @@ jobs: with: python-version-file: ".python-version" - - name: Install rogue - run: uv pip install -e . --system + - name: Create venv + run: uv venv + + - name: Install rogue sdk + run: source .venv/bin/activate && uv pip install -e sdks/python + + - name: Install rogue server + run: source .venv/bin/activate && uv pip install -e . - name: Run rogue shell: bash @@ -72,7 +81,7 @@ jobs: echo "🚀 Starting AI agent..." # Command to start your specific AI agent # ----> Notice! Replace with your own agent start command <---- - uv run examples/tshirt_store_agent --host 127.0.0.1 --port 10001 & + uv run examples/tshirt_store_agent --host 0.0.0.0 --port 10001 & AGENT_PID=$! echo "Agent started with PID: $AGENT_PID" @@ -83,12 +92,25 @@ jobs: # ----> Update this URL if needed. <---- curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail -o /dev/null \ http://localhost:10001/.well-known/agent.json + + echo "🚀 Starting rogue server..." + # ----> Rogue server runs on port 8000 by default <---- + uv run -m rogue server --host 0.0.0.0 --port 8000 & + ROGUE_PID=$! + echo "Rogue server started with PID: $ROGUE_PID" + trap 'echo "🛑 Stopping rogue server..."; kill $ROGUE_PID' EXIT + + echo "⏳ Waiting for rogue server to be ready..." + # ----> Update this URL if needed. <---- + curl --retry 10 --retry-delay 5 --retry-connrefused -s --fail -o /dev/null \ + http://localhost:8000/api/v1/health + echo "🚀 Rogue server ready" echo "🚀 Running rogue..." # Rogue CLI command. # ----> Adjust the cli arguments based on your needs. See the CLI documentation for more details. <---- uv run -m rogue cli \ --evaluated-agent-url http://localhost:10001 \ - --judge-llm-model openai/o4-mini \ + --judge-llm openai/o4-mini \ --workdir './examples/tshirt_store_agent/.rogue' ``` From 278704c814415c2eea8fbb770046354e773638b4 Mon Sep 17 00:00:00 2001 From: Yuval Date: Thu, 11 Sep 2025 20:27:02 -0300 Subject: [PATCH 14/14] Remove debug prints from cicd --- .github/workflows/rogue.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/rogue.yml b/.github/workflows/rogue.yml index ddd25c1b..7fffd893 100644 --- a/.github/workflows/rogue.yml +++ b/.github/workflows/rogue.yml @@ -60,7 +60,6 @@ jobs: echo "🚀 Running rogue..." uv run -m rogue cli \ - --debug \ --evaluated-agent-url http://localhost:10001 \ --judge-llm openai/o4-mini \ --workdir './examples/tshirt_store_agent/.rogue'