From f4f5973f3cf84e0fbe5f46e6db0523da2699fb48 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Sun, 4 May 2025 14:07:17 -0700 Subject: [PATCH] improvement(speed): refactor to skip proxy now that llm requests are done server-side, skip extra network hop (#325) * improvement(speed): refactor to skip proxy now that llm requests are done server-side, skip extra network hop * removed extraneous logs * standardized logger names --- sim/app/api/auth/forget-password/route.ts | 2 +- sim/app/api/auth/oauth/utils.ts | 2 +- sim/app/api/chat/subdomains/validate/route.ts | 2 +- sim/app/api/proxy/image/route.ts | 2 +- sim/app/api/proxy/tts/route.ts | 2 +- sim/app/api/user/api-keys/[id]/route.ts | 2 +- sim/app/api/user/api-keys/route.ts | 2 +- sim/instrumentation.ts | 2 +- sim/lib/telemetry.ts | 2 +- sim/providers/anthropic/index.ts | 4 +- sim/providers/cerebras/index.ts | 4 +- sim/providers/deepseek/index.ts | 4 +- sim/providers/google/index.ts | 5 +- sim/providers/groq/index.ts | 4 +- sim/providers/ollama/index.ts | 4 +- sim/providers/openai/index.ts | 5 +- sim/providers/xai/index.ts | 4 +- sim/stores/copilot/store.ts | 2 +- sim/stores/panel/variables/store.ts | 2 +- sim/stores/settings/environment/store.ts | 2 +- sim/stores/sync-core.ts | 2 +- sim/stores/sync-registry.ts | 2 +- sim/stores/workflows/persistence.ts | 2 +- sim/stores/workflows/registry/store.ts | 2 +- sim/stores/workflows/sync.ts | 2 +- sim/tools/autoblocks/prompt_manager.ts | 2 +- sim/tools/browser_use/run_task.ts | 2 +- sim/tools/google_docs/create.ts | 2 +- sim/tools/google_drive/export.ts | 2 +- sim/tools/http/request.ts | 2 +- sim/tools/index.ts | 97 +++++++++++-------- sim/tools/mistral/parser.ts | 2 +- sim/tools/utils.ts | 2 +- sim/tools/whatsapp/send_message.ts | 2 +- 34 files changed, 96 insertions(+), 85 deletions(-) diff --git a/sim/app/api/auth/forget-password/route.ts b/sim/app/api/auth/forget-password/route.ts index da834df42b..a43f63b20f 100644 --- a/sim/app/api/auth/forget-password/route.ts +++ b/sim/app/api/auth/forget-password/route.ts @@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from 'next/server' import { auth } from '@/lib/auth' import { createLogger } from '@/lib/logs/console-logger' -const logger = createLogger('ForgetPassword') +const logger = createLogger('ForgetPasswordAPI') export async function POST(request: NextRequest) { try { diff --git a/sim/app/api/auth/oauth/utils.ts b/sim/app/api/auth/oauth/utils.ts index 4eb50c063f..d5f3c07c51 100644 --- a/sim/app/api/auth/oauth/utils.ts +++ b/sim/app/api/auth/oauth/utils.ts @@ -5,7 +5,7 @@ import { refreshOAuthToken } from '@/lib/oauth' import { db } from '@/db' import { account, workflow } from '@/db/schema' -const logger = createLogger('OAuthUtils') +const logger = createLogger('OAuthUtilsAPI') /** * Get the user ID based on either a session or a workflow ID diff --git a/sim/app/api/chat/subdomains/validate/route.ts b/sim/app/api/chat/subdomains/validate/route.ts index 77e4b14bf8..c82e4f3e97 100644 --- a/sim/app/api/chat/subdomains/validate/route.ts +++ b/sim/app/api/chat/subdomains/validate/route.ts @@ -6,7 +6,7 @@ import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console-logger' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' -const logger = createLogger('SubdomainValidate') +const logger = createLogger('SubdomainValidateAPI') export async function GET(request: Request) { // Check if the user is authenticated diff --git a/sim/app/api/proxy/image/route.ts b/sim/app/api/proxy/image/route.ts index a582dbaf2b..8342ae5632 100644 --- a/sim/app/api/proxy/image/route.ts +++ b/sim/app/api/proxy/image/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { createLogger } from '@/lib/logs/console-logger' -const logger = createLogger('ProxyImage') +const logger = createLogger('ProxyImageAPI') export async function GET(request: Request) { try { diff --git a/sim/app/api/proxy/tts/route.ts b/sim/app/api/proxy/tts/route.ts index f4d49ee03f..6a19ec2a17 100644 --- a/sim/app/api/proxy/tts/route.ts +++ b/sim/app/api/proxy/tts/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { createLogger } from '@/lib/logs/console-logger' -const logger = createLogger('ProxyTTS') +const logger = createLogger('ProxyTTSAPI') export async function POST(request: Request) { try { diff --git a/sim/app/api/user/api-keys/[id]/route.ts b/sim/app/api/user/api-keys/[id]/route.ts index 69fb95d622..6c865d6865 100644 --- a/sim/app/api/user/api-keys/[id]/route.ts +++ b/sim/app/api/user/api-keys/[id]/route.ts @@ -5,7 +5,7 @@ import { createLogger } from '@/lib/logs/console-logger' import { db } from '@/db' import { apiKey } from '@/db/schema' -const logger = createLogger('ApiKeyRoute') +const logger = createLogger('ApiKeyAPI') // DELETE /api/user/api-keys/[id] - Delete an API key export async function DELETE( diff --git a/sim/app/api/user/api-keys/route.ts b/sim/app/api/user/api-keys/route.ts index 8f27120077..739887fe10 100644 --- a/sim/app/api/user/api-keys/route.ts +++ b/sim/app/api/user/api-keys/route.ts @@ -7,7 +7,7 @@ import { generateApiKey } from '@/lib/utils' import { db } from '@/db' import { apiKey } from '@/db/schema' -const logger = createLogger('ApiKeysRoute') +const logger = createLogger('ApiKeysAPI') // GET /api/user/api-keys - Get all API keys for the current user export async function GET(request: NextRequest) { diff --git a/sim/instrumentation.ts b/sim/instrumentation.ts index 55d4d58e96..7789e44bd0 100644 --- a/sim/instrumentation.ts +++ b/sim/instrumentation.ts @@ -15,7 +15,7 @@ import { createLogger } from '@/lib/logs/console-logger' import * as Sentry from '@sentry/nextjs' -const logger = createLogger('otel-instrumentation') +const logger = createLogger('OtelInstrumentation') const DEFAULT_TELEMETRY_CONFIG = { endpoint: process.env.TELEMETRY_ENDPOINT || 'https://telemetry.simstudio.ai/v1/traces', diff --git a/sim/lib/telemetry.ts b/sim/lib/telemetry.ts index f92af0d820..59c1b7b376 100644 --- a/sim/lib/telemetry.ts +++ b/sim/lib/telemetry.ts @@ -14,7 +14,7 @@ import { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api' diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR) -const logger = createLogger('telemetry') +const logger = createLogger('Telemetry') export type TelemetryEvent = { name: string diff --git a/sim/providers/anthropic/index.ts b/sim/providers/anthropic/index.ts index 9cd0bc85fd..965c3db9d9 100644 --- a/sim/providers/anthropic/index.ts +++ b/sim/providers/anthropic/index.ts @@ -5,7 +5,7 @@ import { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from ' import { StreamingExecution } from '@/executor/types' import { prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils' -const logger = createLogger('Anthropic Provider') +const logger = createLogger('AnthropicProvider') /** * Helper to wrap Anthropic streaming (async iterable of SSE events) into a browser-friendly @@ -449,7 +449,7 @@ ${fieldDescriptions} ...toolArgs, ...(request.workflowId ? { _context: { workflowId: request.workflowId } } : {}), } - const result = await executeTool(toolName, mergedArgs) + const result = await executeTool(toolName, mergedArgs, true) const toolCallEndTime = Date.now() const toolCallDuration = toolCallEndTime - toolCallStartTime diff --git a/sim/providers/cerebras/index.ts b/sim/providers/cerebras/index.ts index 7a73a4368e..902ab5fd49 100644 --- a/sim/providers/cerebras/index.ts +++ b/sim/providers/cerebras/index.ts @@ -4,7 +4,7 @@ import { executeTool } from '@/tools' import { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types' import { StreamingExecution } from '@/executor/types' -const logger = createLogger('Cerebras Provider') +const logger = createLogger('CerebrasProvider') /** * Helper to convert a Cerebras streaming response (async iterable) into a ReadableStream. @@ -280,7 +280,7 @@ export const cerebrasProvider: ProviderConfig = { ...toolArgs, ...(request.workflowId ? { _context: { workflowId: request.workflowId } } : {}), } - const result = await executeTool(toolName, mergedArgs) + const result = await executeTool(toolName, mergedArgs, true) const toolCallEndTime = Date.now() const toolCallDuration = toolCallEndTime - toolCallStartTime diff --git a/sim/providers/deepseek/index.ts b/sim/providers/deepseek/index.ts index 36caaf3e62..a48c4e1d0f 100644 --- a/sim/providers/deepseek/index.ts +++ b/sim/providers/deepseek/index.ts @@ -5,7 +5,7 @@ import { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from ' import { StreamingExecution } from '@/executor/types' import { prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils' -const logger = createLogger('Deepseek Provider') +const logger = createLogger('DeepseekProvider') /** * Helper function to convert a DeepSeek (OpenAI-compatible) stream to a ReadableStream @@ -285,7 +285,7 @@ export const deepseekProvider: ProviderConfig = { ...toolArgs, ...(request.workflowId ? { _context: { workflowId: request.workflowId } } : {}), } - const result = await executeTool(toolName, mergedArgs) + const result = await executeTool(toolName, mergedArgs, true) const toolCallEndTime = Date.now() const toolCallDuration = toolCallEndTime - toolCallStartTime diff --git a/sim/providers/google/index.ts b/sim/providers/google/index.ts index c8905d3282..7c109fc34c 100644 --- a/sim/providers/google/index.ts +++ b/sim/providers/google/index.ts @@ -3,7 +3,7 @@ import { executeTool } from '@/tools' import { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types' import { StreamingExecution } from '@/executor/types' -const logger = createLogger('Google Provider') +const logger = createLogger('GoogleProvider') /** * Creates a ReadableStream from Google's Gemini stream response @@ -371,8 +371,7 @@ export const googleProvider: ProviderConfig = { hasRequiredParams: Object.keys(requiredToolCallParams).length > 0, requiredParamKeys: Object.keys(requiredToolCallParams), }) - - const result = await executeTool(toolName, mergedArgs) + const result = await executeTool(toolName, mergedArgs, true) const toolCallEndTime = Date.now() const toolCallDuration = toolCallEndTime - toolCallStartTime diff --git a/sim/providers/groq/index.ts b/sim/providers/groq/index.ts index 891eb5ba84..3f5ffe1136 100644 --- a/sim/providers/groq/index.ts +++ b/sim/providers/groq/index.ts @@ -4,7 +4,7 @@ import { executeTool } from '@/tools' import { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types' import { StreamingExecution } from '@/executor/types' -const logger = createLogger('Groq Provider') +const logger = createLogger('GroqProvider') /** * Helper to wrap Groq streaming into a browser-friendly ReadableStream @@ -255,7 +255,7 @@ export const groqProvider: ProviderConfig = { ...toolArgs, ...(request.workflowId ? { _context: { workflowId: request.workflowId } } : {}), } - const result = await executeTool(toolName, mergedArgs) + const result = await executeTool(toolName, mergedArgs, true) const toolCallEndTime = Date.now() const toolCallDuration = toolCallEndTime - toolCallStartTime diff --git a/sim/providers/ollama/index.ts b/sim/providers/ollama/index.ts index e3f84d770e..0464631a15 100644 --- a/sim/providers/ollama/index.ts +++ b/sim/providers/ollama/index.ts @@ -5,7 +5,7 @@ import { executeTool } from '@/tools' import { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types' import { ModelsObject } from './types' -const logger = createLogger('Ollama Provider') +const logger = createLogger('OllamaProvider') const OLLAMA_HOST = process.env.OLLAMA_HOST || 'http://localhost:11434' export const ollamaProvider: ProviderConfig = { @@ -188,7 +188,7 @@ export const ollamaProvider: ProviderConfig = { ...toolArgs, ...(request.workflowId ? { _context: { workflowId: request.workflowId } } : {}), } - const result = await executeTool(toolName, mergedArgs) + const result = await executeTool(toolName, mergedArgs, true) const toolCallEndTime = Date.now() const toolCallDuration = toolCallEndTime - toolCallStartTime diff --git a/sim/providers/openai/index.ts b/sim/providers/openai/index.ts index 1281ab0843..d707695950 100644 --- a/sim/providers/openai/index.ts +++ b/sim/providers/openai/index.ts @@ -5,7 +5,7 @@ import { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from ' import { prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils' import { StreamingExecution } from '@/executor/types' -const logger = createLogger('OpenAI Provider') +const logger = createLogger('OpenAIProvider') /** * Helper function to convert an OpenAI stream to a standard ReadableStream @@ -351,7 +351,8 @@ export const openaiProvider: ProviderConfig = { ...toolArgs, ...(request.workflowId ? { _context: { workflowId: request.workflowId } } : {}), } - const result = await executeTool(toolName, mergedArgs) + + const result = await executeTool(toolName, mergedArgs, true) const toolCallEndTime = Date.now() const toolCallDuration = toolCallEndTime - toolCallStartTime diff --git a/sim/providers/xai/index.ts b/sim/providers/xai/index.ts index 6a7b8ce72e..39c1bbc8be 100644 --- a/sim/providers/xai/index.ts +++ b/sim/providers/xai/index.ts @@ -5,7 +5,7 @@ import { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from ' import { StreamingExecution } from '@/executor/types' import { prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils' -const logger = createLogger('XAI Provider') +const logger = createLogger('XAIProvider') /** * Helper to wrap XAI (OpenAI-compatible) streaming into a browser-friendly @@ -300,7 +300,7 @@ export const xAIProvider: ProviderConfig = { ...toolArgs, ...(request.workflowId ? { _context: { workflowId: request.workflowId } } : {}), } - const result = await executeTool(toolName, mergedArgs) + const result = await executeTool(toolName, mergedArgs, true) const toolCallEndTime = Date.now() const toolCallDuration = toolCallEndTime - toolCallStartTime diff --git a/sim/stores/copilot/store.ts b/sim/stores/copilot/store.ts index dd7b00a5b8..df88a9b743 100644 --- a/sim/stores/copilot/store.ts +++ b/sim/stores/copilot/store.ts @@ -6,7 +6,7 @@ import { useWorkflowStore } from '../workflows/workflow/store' import { CopilotMessage, CopilotStore } from './types' import { calculateBlockPosition, getNextBlockNumber } from './utils' -const logger = createLogger('Copilot Store') +const logger = createLogger('CopilotStore') export const useCopilotStore = create()( devtools( diff --git a/sim/stores/panel/variables/store.ts b/sim/stores/panel/variables/store.ts index 7e5aeffe88..b420b97d86 100644 --- a/sim/stores/panel/variables/store.ts +++ b/sim/stores/panel/variables/store.ts @@ -6,7 +6,7 @@ import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import { useSubBlockStore } from '@/stores/workflows/subblock/store' import { Variable, VariablesStore } from './types' -const logger = createLogger('Variables Store') +const logger = createLogger('VariablesStore') const SAVE_DEBOUNCE_DELAY = 500 // 500ms debounce delay // Map to store debounce timers for each workflow diff --git a/sim/stores/settings/environment/store.ts b/sim/stores/settings/environment/store.ts index 974686b445..a2cfda8a00 100644 --- a/sim/stores/settings/environment/store.ts +++ b/sim/stores/settings/environment/store.ts @@ -3,7 +3,7 @@ import { createLogger } from '@/lib/logs/console-logger' import { API_ENDPOINTS } from '../../constants' import { EnvironmentStore, EnvironmentVariable } from './types' -const logger = createLogger('Environment Store') +const logger = createLogger('EnvironmentStore') export const useEnvironmentStore = create()((set, get) => ({ variables: {}, diff --git a/sim/stores/sync-core.ts b/sim/stores/sync-core.ts index 8b39eec6bf..77dca12d22 100644 --- a/sim/stores/sync-core.ts +++ b/sim/stores/sync-core.ts @@ -1,6 +1,6 @@ import { createLogger } from '@/lib/logs/console-logger' -const logger = createLogger('Sync Core') +const logger = createLogger('SyncCore') /** * Core sync types and utilities for optimistic state synchronization diff --git a/sim/stores/sync-registry.ts b/sim/stores/sync-registry.ts index 82a481b59b..9090e3eb4c 100644 --- a/sim/stores/sync-registry.ts +++ b/sim/stores/sync-registry.ts @@ -5,7 +5,7 @@ import { SyncManager } from './sync' import { isLocalStorageMode } from './sync-core' import { fetchWorkflowsFromDB, workflowSync } from './workflows/sync' -const logger = createLogger('Sync Registry') +const logger = createLogger('SyncRegistry') // Initialize managers lazily let initialized = false diff --git a/sim/stores/workflows/persistence.ts b/sim/stores/workflows/persistence.ts index 321747b5ac..6c8a1ae386 100644 --- a/sim/stores/workflows/persistence.ts +++ b/sim/stores/workflows/persistence.ts @@ -8,7 +8,7 @@ import { useWorkflowRegistry } from './registry/store' import { useSubBlockStore } from './subblock/store' import { useWorkflowStore } from './workflow/store' -const logger = createLogger('Workflows Persistence') +const logger = createLogger('WorkflowsPersistence') /** * Save data to localStorage with error handling diff --git a/sim/stores/workflows/registry/store.ts b/sim/stores/workflows/registry/store.ts index 1f39f4f371..5d16781182 100644 --- a/sim/stores/workflows/registry/store.ts +++ b/sim/stores/workflows/registry/store.ts @@ -16,7 +16,7 @@ import { useWorkflowStore } from '../workflow/store' import { WorkflowMetadata, WorkflowRegistry } from './types' import { generateUniqueName, getNextWorkflowColor } from './utils' -const logger = createLogger('Workflow Registry') +const logger = createLogger('WorkflowRegistry') // Storage key for active workspace const ACTIVE_WORKSPACE_KEY = 'active-workspace-id' diff --git a/sim/stores/workflows/sync.ts b/sim/stores/workflows/sync.ts index e73b51ea26..83943212f7 100644 --- a/sim/stores/workflows/sync.ts +++ b/sim/stores/workflows/sync.ts @@ -10,7 +10,7 @@ import { useSubBlockStore } from './subblock/store' import { useWorkflowStore } from './workflow/store' import { BlockState } from './workflow/types' -const logger = createLogger('Workflows Sync') +const logger = createLogger('WorkflowsSync') // Add debounce utility let syncDebounceTimer: NodeJS.Timeout | null = null diff --git a/sim/tools/autoblocks/prompt_manager.ts b/sim/tools/autoblocks/prompt_manager.ts index 95844d87ae..2913da2a36 100644 --- a/sim/tools/autoblocks/prompt_manager.ts +++ b/sim/tools/autoblocks/prompt_manager.ts @@ -2,7 +2,7 @@ import { createLogger } from '@/lib/logs/console-logger' import { ToolConfig } from '../types' import { PromptManagerParams, PromptManagerResponse } from './types' -const logger = createLogger('AutoblocksPromptManager') +const logger = createLogger('AutoblocksPromptManagerTool') export const promptManagerTool: ToolConfig = { id: 'autoblocks_prompt_manager', diff --git a/sim/tools/browser_use/run_task.ts b/sim/tools/browser_use/run_task.ts index eb87284815..da25b370a5 100644 --- a/sim/tools/browser_use/run_task.ts +++ b/sim/tools/browser_use/run_task.ts @@ -2,7 +2,7 @@ import { createLogger } from '@/lib/logs/console-logger' import { ToolConfig } from '../types' import { BrowserUseRunTaskParams, BrowserUseRunTaskResponse, BrowserUseTaskOutput } from './types' -const logger = createLogger('BrowserUseTools') +const logger = createLogger('BrowserUseTool') export const runTaskTool: ToolConfig = { id: 'browser_use_run_task', diff --git a/sim/tools/google_docs/create.ts b/sim/tools/google_docs/create.ts index a2700e9dd9..4b5e632636 100644 --- a/sim/tools/google_docs/create.ts +++ b/sim/tools/google_docs/create.ts @@ -2,7 +2,7 @@ import { createLogger } from '@/lib/logs/console-logger' import { ToolConfig } from '../types' import { GoogleDocsCreateResponse, GoogleDocsToolParams } from './types' -const logger = createLogger('Google Docs Create Tool') +const logger = createLogger('GoogleDocsCreateTool') export const createTool: ToolConfig = { id: 'google_docs_create', diff --git a/sim/tools/google_drive/export.ts b/sim/tools/google_drive/export.ts index 078eb022e8..4c3b403e65 100644 --- a/sim/tools/google_drive/export.ts +++ b/sim/tools/google_drive/export.ts @@ -3,7 +3,7 @@ import { ToolConfig } from '../types' import { GoogleDriveDownloadResponse } from './types' import { GoogleDriveToolParams } from './types' -const logger = createLogger('Google Drive Export Tool') +const logger = createLogger('GoogleDriveExportTool') export const exportTool: ToolConfig< GoogleDriveToolParams & { mimeType?: string }, diff --git a/sim/tools/http/request.ts b/sim/tools/http/request.ts index 38ae727c98..33158ae051 100644 --- a/sim/tools/http/request.ts +++ b/sim/tools/http/request.ts @@ -2,7 +2,7 @@ import { HttpMethod, TableRow, ToolConfig } from '../types' import { createLogger } from '@/lib/logs/console-logger' import { RequestParams, RequestResponse } from './types' -const logger = createLogger('HTTP Request Tool') +const logger = createLogger('HTTPRequestTool') // Function to get the appropriate referer based on environment const getReferer = (): string => { diff --git a/sim/tools/index.ts b/sim/tools/index.ts index 8be1c4b766..35602663d6 100644 --- a/sim/tools/index.ts +++ b/sim/tools/index.ts @@ -39,6 +39,58 @@ export async function executeTool( throw new Error(`Tool not found: ${toolId}`) } + // If we have a credential parameter, fetch the access token + if (contextParams.credential) { + logger.info(`[executeTool] Credential found for ${toolId}, fetching access token.`); + try { + const baseUrl = process.env.NEXT_PUBLIC_APP_URL + if (!baseUrl) { + throw new Error('NEXT_PUBLIC_APP_URL environment variable is not set') + } + + const isServerSide = typeof window === 'undefined' + + // Prepare the token payload + const tokenPayload: OAuthTokenPayload = { + credentialId: contextParams.credential, + } + + // Add workflowId if it exists in params or context (only server-side) + if (isServerSide) { + const workflowId = contextParams.workflowId || contextParams._context?.workflowId + if (workflowId) { + tokenPayload.workflowId = workflowId + logger.info(`[executeTool] Added workflowId ${workflowId} to token payload for ${toolId}`); + } + } + + const tokenUrl = new URL('/api/auth/oauth/token', baseUrl).toString() + const response = await fetch(tokenUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(tokenPayload), + }) + + if (!response.ok) { + const errorText = await response.text() + logger.error('[executeTool] Token fetch failed:', response.status, errorText) + throw new Error(`Failed to fetch access token: ${response.status} ${errorText}`) + } + + const data = await response.json() + contextParams.accessToken = data.accessToken + logger.info(`[executeTool] Successfully fetched access token for ${toolId}`); + + // Clean up params we don't need to pass to the actual tool + delete contextParams.credential + if (contextParams.workflowId) delete contextParams.workflowId + } catch (error) { + logger.error('[executeTool] Error fetching access token:', { error }) + // Re-throw the error to fail the tool execution if token fetching fails + throw new Error(`Failed to obtain credential for tool ${toolId}: ${error instanceof Error ? error.message : String(error)}`); + } + } + // For any tool with direct execution capability, try it first if (tool.directExecution) { try { @@ -148,6 +200,7 @@ export async function executeTool( } // For external APIs, use the proxy + logger.info(`[executeTool] Using handleProxyRequest for toolId=${toolId}`); const result = await handleProxyRequest(toolId, contextParams) // Apply post-processing if available and not skipped @@ -482,54 +535,12 @@ async function handleProxyRequest( toolId: string, params: Record ): Promise { + logger.info(`[handleProxyRequest] Entry: toolId=${toolId}`); const baseUrl = process.env.NEXT_PUBLIC_APP_URL if (!baseUrl) { throw new Error('NEXT_PUBLIC_APP_URL environment variable is not set') } - // If we have a credential parameter, fetch the access token - if (params.credential) { - try { - const isServerSide = typeof window === 'undefined' - - // Prepare the token payload - const tokenPayload: OAuthTokenPayload = { - credentialId: params.credential, - } - - // Add workflowId if it exists in params or context - if (isServerSide) { - // Try to get workflowId from params or context - const workflowId = params.workflowId || params._context?.workflowId - if (workflowId) { - tokenPayload.workflowId = workflowId - } - } - - const response = await fetch(`${baseUrl}/api/auth/oauth/token`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(tokenPayload), - }) - - if (!response.ok) { - const errorText = await response.text() - logger.error('Token fetch failed:', response.status, errorText) - throw new Error(`Failed to fetch access token: ${response.status} ${errorText}`) - } - - const data = await response.json() - params.accessToken = data.accessToken - - // Clean up params we don't need to pass to the actual tool - delete params.credential - if (params.workflowId) delete params.workflowId - } catch (error) { - logger.error('Error fetching access token:', { error }) - throw error - } - } - const proxyUrl = new URL('/api/proxy', baseUrl).toString() try { const response = await fetch(proxyUrl, { diff --git a/sim/tools/mistral/parser.ts b/sim/tools/mistral/parser.ts index ae7b43114e..45a0ba9a8a 100644 --- a/sim/tools/mistral/parser.ts +++ b/sim/tools/mistral/parser.ts @@ -2,7 +2,7 @@ import { createLogger } from '@/lib/logs/console-logger' import { ToolConfig } from '../types' import { MistralParserInput, MistralParserOutput } from './types' -const logger = createLogger('mistral-parser') +const logger = createLogger('MistralParserTool') export const mistralParserTool: ToolConfig = { id: 'mistral_parser', diff --git a/sim/tools/utils.ts b/sim/tools/utils.ts index 71afa36d77..1bf746017b 100644 --- a/sim/tools/utils.ts +++ b/sim/tools/utils.ts @@ -5,7 +5,7 @@ import { useEnvironmentStore } from '@/stores/settings/environment/store' import { tools } from './registry' import { useCustomToolsStore } from '@/stores/custom-tools/store' -const logger = createLogger('Tools Utils') +const logger = createLogger('ToolsUtils') /** * Transforms a table from the store format to a key-value object diff --git a/sim/tools/whatsapp/send_message.ts b/sim/tools/whatsapp/send_message.ts index 81180dce59..e7b861ebf5 100644 --- a/sim/tools/whatsapp/send_message.ts +++ b/sim/tools/whatsapp/send_message.ts @@ -2,7 +2,7 @@ import { createLogger } from '@/lib/logs/console-logger' import { ToolConfig } from '../types' import { WhatsAppToolResponse } from './types' -const logger = createLogger('WhatsApp Send Message Tool') +const logger = createLogger('WhatsAppSendMessageTool') export const sendMessageTool: ToolConfig = { id: 'whatsapp_send_message',