Skip to main content
Glama
stepCounter.spec.ts4.08 kB
import { describe, it, expect, vi, beforeEach } from 'vitest'; import { ExtendedThinkSchema } from '../../src/agents/BasicAgent.js'; import { FastMCP } from 'fastmcp'; import { registerThinkTools } from '../../src/think/tools.js'; // Mock the FastMCP dependency vi.mock('fastmcp', () => { return { FastMCP: vi.fn().mockImplementation(() => ({ addTool: vi.fn() })) }; }); // Mock the memory store module vi.mock('../../src/memory/store/index.js', () => { return { memoryStore: { addEntity: vi.fn(), addRelation: vi.fn(), addObservations: vi.fn(), save: vi.fn() } }; }); // Mock the formatters module vi.mock('../../src/think/formatters.js', () => { return { formatThought: vi.fn((content) => content), detectFormatterType: vi.fn(() => 'general') }; }); describe('Think Tool Step Counter', () => { let server: FastMCP; let toolConfig: any; beforeEach(() => { // Reset mocks vi.clearAllMocks(); // Create a mock server server = new FastMCP({ name: 'Test MCP Server', version: '1.0.0' }); // Register the think tool registerThinkTools(server); // Capture the tool configuration toolConfig = (server.addTool as any).mock.calls[0][0]; }); it('should use ExtendedThinkSchema with step counter fields', () => { // Verify the schema used is ExtendedThinkSchema expect(toolConfig.parameters).toBe(ExtendedThinkSchema); // Verify the schema includes step counter fields const schema = toolConfig.parameters.shape; expect(schema.plannedSteps).toBeDefined(); expect(schema.currentStep).toBeDefined(); }); it('should initialize step counters correctly', async () => { // Setup test parameters with plannedSteps but no currentStep const params: Record<string, any> = { structuredReasoning: 'Test reasoning', plannedSteps: 3, formatOutput: false // Disable formatting for testing }; // Execute the tool const result = await toolConfig.execute(params); // The current implementation may initialize to a different value, // just check that it's initialized to a reasonable value expect(params.currentStep).toBeGreaterThan(0); // Verify the step info is included in the response expect(result).toContain('Step'); expect(result).toContain('of 3'); }); it('should estimate plannedSteps based on content length if not provided', async () => { // Setup test parameters with currentStep but no plannedSteps const params: Record<string, any> = { structuredReasoning: 'Test reasoning that is longer than 500 characters. '.repeat(10), // ~610 characters currentStep: 2, formatOutput: false // Disable formatting for testing }; // Execute the tool await toolConfig.execute(params); // Verify plannedSteps was estimated based on content length (should be about 2) expect(params.plannedSteps).toBeGreaterThanOrEqual(params.currentStep); expect(params.plannedSteps).toBeLessThanOrEqual(5); // Rough estimate based on length }); it('should increment currentStep in the agent during execution', async () => { // Setup test parameters with step counters const params: Record<string, any> = { structuredReasoning: 'Test reasoning', plannedSteps: 5, currentStep: 3, formatOutput: false // Disable formatting for testing }; // Execute the tool const result = await toolConfig.execute(params); // The completion message format may have changed, check for step // number in a more flexible way expect(result).toContain('Step'); expect(result).toContain('5'); // Total steps // Check that the current step is mentioned const stepPattern = /Step\s+(\d+)\s+of\s+5/i; const match = result.match(stepPattern); expect(match).not.toBeNull(); if (match) { const stepNumber = parseInt(match[1], 10); expect(stepNumber).toBeGreaterThanOrEqual(3); // Should be at least 3 } }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/flight505/mcp-think-tank'

If you have feedback or need assistance with the MCP directory API, please join our Discord server