From dbd6b380be0986aba1d3c738a107a406036cbbda Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Thu, 5 Jun 2025 17:41:55 +0900 Subject: [PATCH 1/2] Reduce warning/stdout outputs during test executions --- packages/agents-core/src/runImplementation.ts | 7 +- packages/agents-core/test/run.test.ts | 4 + .../test/runImplementation.test.ts | 2 + packages/agents-core/test/runState.test.ts | 8 +- .../test/shims/mcp-stdio/node.test.ts | 76 ++++++++++++++++++- packages/agents-core/test/stubs.ts | 9 ++- packages/agents-extensions/test/aiSdk.test.ts | 2 +- packages/agents-extensions/test/index.test.ts | 1 - 8 files changed, 97 insertions(+), 12 deletions(-) diff --git a/packages/agents-core/src/runImplementation.ts b/packages/agents-core/src/runImplementation.ts index 18b7b3d3..c41a6f47 100644 --- a/packages/agents-core/src/runImplementation.ts +++ b/packages/agents-core/src/runImplementation.ts @@ -12,7 +12,7 @@ import { RunToolCallItem, RunToolCallOutputItem, } from './items'; -import logger from './logger'; +import logger, { Logger } from './logger'; import { ModelResponse, ModelSettings } from './model'; import { ComputerTool, FunctionTool, Tool, FunctionToolResult } from './tool'; import { AgentInputItem, UnknownContext } from './types'; @@ -695,7 +695,9 @@ export async function executeComputerActions( actions: ToolRunComputer[], runner: Runner, runContext: RunContext, + customLogger: Logger | undefined = undefined, ): Promise { + const _logger = customLogger ?? logger; const results: RunItem[] = []; for (const action of actions) { const computer = action.computer.computer; @@ -712,7 +714,7 @@ export async function executeComputerActions( try { output = await _runComputerActionAndScreenshot(computer, toolCall); } catch (err) { - logger.error('Failed to execute computer action:', err); + _logger.error('Failed to execute computer action:', err); output = ''; } @@ -930,7 +932,6 @@ export async function checkForFinalOutputFromTools< return toolUseBehavior(state._context, toolResults); } - logger.error('Invalid toolUseBehavior: ', toolUseBehavior); throw new UserError(`Invalid toolUseBehavior: ${toolUseBehavior}`, state); } diff --git a/packages/agents-core/test/run.test.ts b/packages/agents-core/test/run.test.ts index 6b979041..1ef76f19 100644 --- a/packages/agents-core/test/run.test.ts +++ b/packages/agents-core/test/run.test.ts @@ -8,7 +8,9 @@ import { run, Runner, setDefaultModelProvider, + setTraceProcessors, setTracingDisabled, + BatchTraceProcessor, } from '../src'; import { RunStreamEvent } from '../src/events'; import { handoff } from '../src/handoff'; @@ -25,6 +27,7 @@ import { FakeModel, fakeModelMessage, FakeModelProvider, + FakeTracingExporter, TEST_MODEL_MESSAGE, TEST_MODEL_RESPONSE_BASIC, TEST_TOOL, @@ -425,6 +428,7 @@ describe('Runner.run', () => { it('does nothing when no input guardrails are configured', async () => { setTracingDisabled(false); + setTraceProcessors([new BatchTraceProcessor(new FakeTracingExporter())]); const agent = new Agent({ name: 'NoIG', model: new FakeModel([ diff --git a/packages/agents-core/test/runImplementation.test.ts b/packages/agents-core/test/runImplementation.test.ts index 67b4fefe..fdcf8ac9 100644 --- a/packages/agents-core/test/runImplementation.test.ts +++ b/packages/agents-core/test/runImplementation.test.ts @@ -46,6 +46,7 @@ import * as protocol from '../src/types/protocol'; import { Runner } from '../src/run'; import { RunContext } from '../src/runContext'; import { setDefaultModelProvider } from '../src'; +import { Logger } from '../src/logger'; beforeAll(() => { setTracingDisabled(true); @@ -627,6 +628,7 @@ describe('executeComputerActions', () => { [call], new Runner({ tracingDisabled: true }), new RunContext(), + { error: (_: string) => {} } as unknown as Logger, ), ); diff --git a/packages/agents-core/test/runState.test.ts b/packages/agents-core/test/runState.test.ts index 6ca4d12f..609e9394 100644 --- a/packages/agents-core/test/runState.test.ts +++ b/packages/agents-core/test/runState.test.ts @@ -50,7 +50,7 @@ describe('RunState', () => { expect(JSON.parse(str)).toEqual(json); }); - it('throws error if schema version is missing or invalid', () => { + it('throws error if schema version is missing or invalid', async () => { const context = new RunContext(); const agent = new Agent({ name: 'Agent1' }); const state = new RunState(context, 'input1', agent, 2); @@ -58,13 +58,13 @@ describe('RunState', () => { delete jsonVersion.$schemaVersion; const str = JSON.stringify(jsonVersion); - expect(async () => await RunState.fromString(agent, str)).rejects.toThrow( + await expect(() => RunState.fromString(agent, str)).rejects.toThrow( 'Run state is missing schema version', ); jsonVersion.$schemaVersion = '0.1'; - expect( - async () => await RunState.fromString(agent, JSON.stringify(jsonVersion)), + await expect(() => + RunState.fromString(agent, JSON.stringify(jsonVersion)), ).rejects.toThrow( `Run state schema version 0.1 is not supported. Please use version ${CURRENT_SCHEMA_VERSION}`, ); diff --git a/packages/agents-core/test/shims/mcp-stdio/node.test.ts b/packages/agents-core/test/shims/mcp-stdio/node.test.ts index cbe272fe..762ff348 100644 --- a/packages/agents-core/test/shims/mcp-stdio/node.test.ts +++ b/packages/agents-core/test/shims/mcp-stdio/node.test.ts @@ -1,7 +1,29 @@ -import { describe, test, expect } from 'vitest'; +import { describe, test, expect, vi, afterAll, beforeAll } from 'vitest'; import { NodeMCPServerStdio } from '../../../src/shims/mcp-stdio/node'; +import { TransportSendOptions } from '@modelcontextprotocol/sdk/shared/transport'; +import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types'; describe('NodeMCPServerStdio', () => { + beforeAll(() => { + vi.mock( + '@modelcontextprotocol/sdk/client/stdio.js', + async (importOriginal) => { + return { + ...(await importOriginal()), + StdioClientTransport: MockStdioClientTransport, + }; + }, + ); + vi.mock( + '@modelcontextprotocol/sdk/client/index.js', + async (importOriginal) => { + return { + ...(await importOriginal()), + Client: MockClient, + }; + }, + ); + }); test('should be available', async () => { const server = new NodeMCPServerStdio({ name: 'test', @@ -11,6 +33,56 @@ describe('NodeMCPServerStdio', () => { expect(server).toBeDefined(); expect(server.name).toBe('test'); expect(server.cacheToolsList).toBe(true); - await expect(server.connect()).rejects.toThrow(); + await server.connect(); + await server.close(); + }); + + afterAll(() => { + vi.clearAllMocks(); }); }); + +class MockStdioClientTransport { + options: { + command: string; + args: string[]; + env: Record; + cwd: string; + }; + constructor(options: { + command: string; + args: string[]; + env: Record; + cwd: string; + }) { + this.options = options; + } + start(): Promise { + return Promise.resolve(); + } + send( + _message: JSONRPCMessage, + _options?: TransportSendOptions, + ): Promise { + return Promise.resolve(); + } + close(): Promise { + return Promise.resolve(); + } +} + +class MockClient { + options: { + name: string; + version: string; + }; + constructor(options: { name: string; version: string }) { + this.options = options; + } + connect(): Promise { + return Promise.resolve(); + } + close(): Promise { + return Promise.resolve(); + } +} diff --git a/packages/agents-core/test/stubs.ts b/packages/agents-core/test/stubs.ts index d5261262..34508f98 100644 --- a/packages/agents-core/test/stubs.ts +++ b/packages/agents-core/test/stubs.ts @@ -11,6 +11,7 @@ import type { Computer } from '../src/computer'; import type { Environment } from '../src/computer'; import * as protocol from '../src/types/protocol'; import { Usage } from '../src/usage'; +import { Span, Trace, TracingExporter } from '../src'; export const TEST_MODEL_MESSAGE: protocol.AssistantMessageItem = { id: '123', @@ -93,7 +94,7 @@ export class FakeComputer implements Computer { dimensions: [number, number] = [1, 1]; async screenshot(): Promise { - return ''; + return 'img'; } async click(_x: number, _y: number, _button: any): Promise {} async doubleClick(_x: number, _y: number): Promise {} @@ -134,3 +135,9 @@ export class FakeModelProvider implements ModelProvider { return new FakeModel([TEST_MODEL_RESPONSE_BASIC]); } } + +export class FakeTracingExporter implements TracingExporter { + export(_items: (Trace | Span)[], _signal?: AbortSignal): Promise { + return Promise.resolve(); + } +} diff --git a/packages/agents-extensions/test/aiSdk.test.ts b/packages/agents-extensions/test/aiSdk.test.ts index ec96db81..4e8bd91d 100644 --- a/packages/agents-extensions/test/aiSdk.test.ts +++ b/packages/agents-extensions/test/aiSdk.test.ts @@ -551,7 +551,7 @@ describe('AiSdkModel.getStreamedResponse', () => { }), ); - expect(async () => { + await expect(async () => { const iter = model.getStreamedResponse({ input: 'hi', tools: [], diff --git a/packages/agents-extensions/test/index.test.ts b/packages/agents-extensions/test/index.test.ts index 9570f9b3..e9d9ef6c 100644 --- a/packages/agents-extensions/test/index.test.ts +++ b/packages/agents-extensions/test/index.test.ts @@ -60,7 +60,6 @@ describe('TwilioRealtimeTransportLayer', () => { const call = sendEventSpy.mock.calls.find( (c) => c[0]?.type === 'conversation.item.truncate', ); - console.log('call', call); expect(call?.[0].audio_end_ms).toBe(50); }); }); From 457073cb2589971145ce3b1a9d204f473bafee79 Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Fri, 6 Jun 2025 06:13:05 +0900 Subject: [PATCH 2/2] pnpm changeset --- .changeset/hip-needles-love.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/hip-needles-love.md diff --git a/.changeset/hip-needles-love.md b/.changeset/hip-needles-love.md new file mode 100644 index 00000000..a34a8cd2 --- /dev/null +++ b/.changeset/hip-needles-love.md @@ -0,0 +1,5 @@ +--- +'@openai/agents-core': patch +--- + +Update internal module in agents-core to accept a custom logger