llama1's picture
Upload 781 files
5da4770 verified
import { extractToolData, normalizeContentToString } from '../utils';
export interface DataProviderCallData {
serviceName: string | null;
route: string | null;
payload: any;
success?: boolean;
timestamp?: string;
output?: string;
}
export interface DataProviderEndpointsData {
serviceName: string | null;
endpoints: any;
success?: boolean;
timestamp?: string;
}
const parseContent = (content: any): any => {
if (typeof content === 'string') {
try {
return JSON.parse(content);
} catch (e) {
return content;
}
}
return content;
};
const extractFromNewFormat = (content: any): {
serviceName: string | null;
route: string | null;
payload: any;
endpoints: any;
success?: boolean;
timestamp?: string;
output?: string;
} => {
const parsedContent = parseContent(content);
if (!parsedContent || typeof parsedContent !== 'object') {
return { serviceName: null, route: null, payload: null, endpoints: null, success: undefined, timestamp: undefined, output: undefined };
}
if ('tool_execution' in parsedContent && typeof parsedContent.tool_execution === 'object') {
const toolExecution = parsedContent.tool_execution;
const args = toolExecution.arguments || {};
let parsedOutput = toolExecution.result?.output;
if (typeof parsedOutput === 'string') {
try {
parsedOutput = JSON.parse(parsedOutput);
} catch (e) {
}
}
const extractedData = {
serviceName: args.service_name || null,
route: args.route || null,
payload: args.payload || args,
endpoints: parsedOutput || null,
success: toolExecution.result?.success,
timestamp: toolExecution.execution_details?.timestamp,
output: typeof toolExecution.result?.output === 'string' ? toolExecution.result.output : null
};
console.log('DataProviderToolView: Extracted from new format:', {
serviceName: extractedData.serviceName,
route: extractedData.route,
hasPayload: !!extractedData.payload,
hasEndpoints: !!extractedData.endpoints,
success: extractedData.success
});
return extractedData;
}
if ('role' in parsedContent && 'content' in parsedContent) {
return extractFromNewFormat(parsedContent.content);
}
return { serviceName: null, route: null, payload: null, endpoints: null, success: undefined, timestamp: undefined, output: undefined };
};
const parseDataProviderCall = (message: string) => {
const tagRegex = /<execute-data-provider-call\b(?=[^>]*\bservice_name="([^"]+)")(?=[^>]*\broute="([^"]+)")[^>]*>/;
const tagMatch = message.match(tagRegex);
let serviceName = null;
let route = null;
if (tagMatch) {
serviceName = tagMatch[1];
route = tagMatch[2];
}
const contentRegex = /<execute-data-provider-call\b[^>]*>\s*(\{[\s\S]*?\})\s*<\/execute-data-provider-call>/;
const contentMatch = message.match(contentRegex);
let jsonContent = null;
if (contentMatch) {
let jsonString = contentMatch[1].trim();
jsonString = jsonString.replace(/\\"/g, '"');
try {
jsonContent = JSON.parse(jsonString);
} catch (e) {
console.error('Failed to parse JSON content:', e);
console.error('JSON string was:', jsonString);
jsonContent = jsonString;
}
}
return { serviceName, route, jsonContent };
};
const extractServiceName = (message: string): string | null => {
const regex = /<get-data-provider-endpoints\s+service_name="([^"]+)"\s*>/;
const match = message.match(regex);
return match ? match[1] : null;
};
const extractFromLegacyFormat = (content: any): {
serviceName: string | null;
route: string | null;
payload: any;
endpoints: any;
} => {
const toolData = extractToolData(content);
if (toolData.toolResult && toolData.arguments) {
console.log('DataProviderToolView: Extracted from legacy format (extractToolData):', {
serviceName: toolData.arguments.service_name,
route: toolData.arguments.route
});
return {
serviceName: toolData.arguments.service_name || null,
route: toolData.arguments.route || null,
payload: toolData.arguments,
endpoints: null
};
}
const contentStr = normalizeContentToString(content);
if (!contentStr) {
return { serviceName: null, route: null, payload: null, endpoints: null };
}
const parsed = parseDataProviderCall(contentStr);
if (parsed.serviceName || parsed.route) {
console.log('DataProviderToolView: Extracted from legacy format (parseDataProviderCall):', {
serviceName: parsed.serviceName,
route: parsed.route
});
return {
serviceName: parsed.serviceName,
route: parsed.route,
payload: parsed.jsonContent,
endpoints: null
};
}
const serviceName = extractServiceName(contentStr);
if (serviceName) {
console.log('DataProviderToolView: Extracted service name from legacy format:', serviceName);
return {
serviceName,
route: null,
payload: null,
endpoints: null
};
}
return { serviceName: null, route: null, payload: null, endpoints: null };
};
export function extractDataProviderCallData(
assistantContent: any,
toolContent: any,
isSuccess: boolean,
toolTimestamp?: string,
assistantTimestamp?: string
): {
serviceName: string | null;
route: string | null;
payload: any;
output: string | null;
actualIsSuccess: boolean;
actualToolTimestamp?: string;
actualAssistantTimestamp?: string;
} {
let serviceName: string | null = null;
let route: string | null = null;
let payload: any = null;
let output: string | null = null;
let actualIsSuccess = isSuccess;
let actualToolTimestamp = toolTimestamp;
let actualAssistantTimestamp = assistantTimestamp;
const assistantNewFormat = extractFromNewFormat(assistantContent);
const toolNewFormat = extractFromNewFormat(toolContent);
console.log('DataProviderCallToolView: Format detection results:', {
assistantNewFormat: {
hasServiceName: !!assistantNewFormat.serviceName,
hasRoute: !!assistantNewFormat.route,
hasPayload: !!assistantNewFormat.payload
},
toolNewFormat: {
hasServiceName: !!toolNewFormat.serviceName,
hasRoute: !!toolNewFormat.route,
hasPayload: !!toolNewFormat.payload
}
});
if (assistantNewFormat.serviceName || assistantNewFormat.route) {
serviceName = assistantNewFormat.serviceName;
route = assistantNewFormat.route;
payload = assistantNewFormat.payload;
output = assistantNewFormat.output ?? null;
if (assistantNewFormat.success !== undefined) {
actualIsSuccess = assistantNewFormat.success;
}
if (assistantNewFormat.timestamp) {
actualAssistantTimestamp = assistantNewFormat.timestamp;
}
console.log('DataProviderCallToolView: Using assistant new format data');
} else if (toolNewFormat.serviceName || toolNewFormat.route) {
serviceName = toolNewFormat.serviceName;
route = toolNewFormat.route;
payload = toolNewFormat.payload;
output = toolNewFormat.output ?? null;
if (toolNewFormat.success !== undefined) {
actualIsSuccess = toolNewFormat.success;
}
if (toolNewFormat.timestamp) {
actualToolTimestamp = toolNewFormat.timestamp;
}
console.log('DataProviderCallToolView: Using tool new format data');
} else {
const assistantLegacy = extractFromLegacyFormat(assistantContent);
const toolLegacy = extractFromLegacyFormat(toolContent);
serviceName = assistantLegacy.serviceName || toolLegacy.serviceName;
route = assistantLegacy.route || toolLegacy.route;
payload = assistantLegacy.payload || toolLegacy.payload;
console.log('DataProviderCallToolView: Using legacy format data:', {
serviceName,
route,
hasPayload: !!payload
});
}
console.log('DataProviderCallToolView: Final extracted data:', {
serviceName,
route,
hasPayload: !!payload,
hasOutput: !!output,
actualIsSuccess
});
return {
serviceName,
route,
payload,
output,
actualIsSuccess,
actualToolTimestamp,
actualAssistantTimestamp
};
}
export function extractDataProviderEndpointsData(
assistantContent: any,
toolContent: any,
isSuccess: boolean,
toolTimestamp?: string,
assistantTimestamp?: string
): {
serviceName: string | null;
endpoints: any;
actualIsSuccess: boolean;
actualToolTimestamp?: string;
actualAssistantTimestamp?: string;
} {
let serviceName: string | null = null;
let endpoints: any = null;
let actualIsSuccess = isSuccess;
let actualToolTimestamp = toolTimestamp;
let actualAssistantTimestamp = assistantTimestamp;
const assistantNewFormat = extractFromNewFormat(assistantContent);
const toolNewFormat = extractFromNewFormat(toolContent);
console.log('DataProviderEndpointsToolView: Format detection results:', {
assistantNewFormat: {
hasServiceName: !!assistantNewFormat.serviceName,
hasEndpoints: !!assistantNewFormat.endpoints
},
toolNewFormat: {
hasServiceName: !!toolNewFormat.serviceName,
hasEndpoints: !!toolNewFormat.endpoints
}
});
if (assistantNewFormat.serviceName || assistantNewFormat.endpoints) {
serviceName = assistantNewFormat.serviceName;
endpoints = assistantNewFormat.endpoints;
if (assistantNewFormat.success !== undefined) {
actualIsSuccess = assistantNewFormat.success;
}
if (assistantNewFormat.timestamp) {
actualAssistantTimestamp = assistantNewFormat.timestamp;
}
console.log('DataProviderEndpointsToolView: Using assistant new format data');
} else if (toolNewFormat.serviceName || toolNewFormat.endpoints) {
serviceName = toolNewFormat.serviceName;
endpoints = toolNewFormat.endpoints;
if (toolNewFormat.success !== undefined) {
actualIsSuccess = toolNewFormat.success;
}
if (toolNewFormat.timestamp) {
actualToolTimestamp = toolNewFormat.timestamp;
}
console.log('DataProviderEndpointsToolView: Using tool new format data');
} else {
const assistantLegacy = extractFromLegacyFormat(assistantContent);
const toolLegacy = extractFromLegacyFormat(toolContent);
serviceName = assistantLegacy.serviceName || toolLegacy.serviceName;
endpoints = assistantLegacy.endpoints || toolLegacy.endpoints;
console.log('DataProviderEndpointsToolView: Using legacy format data:', {
serviceName,
hasEndpoints: !!endpoints
});
if (!serviceName) {
const extractProviderName = (content: string | object | undefined | null): string => {
const contentStr = normalizeContentToString(content);
const detectedServiceName = extractServiceName(contentStr || '');
if (detectedServiceName) {
return detectedServiceName.toLowerCase();
}
if (!contentStr) return 'linkedin';
const content_lower = contentStr.toLowerCase();
if (content_lower.includes('linkedin')) return 'linkedin';
if (content_lower.includes('twitter')) return 'twitter';
if (content_lower.includes('zillow')) return 'zillow';
if (content_lower.includes('amazon')) return 'amazon';
if (content_lower.includes('yahoo') || content_lower.includes('finance')) return 'yahoo_finance';
if (content_lower.includes('jobs') || content_lower.includes('active')) return 'active_jobs';
return 'linkedin';
};
serviceName = extractProviderName(assistantContent || toolContent);
}
}
console.log('DataProviderEndpointsToolView: Final extracted data:', {
serviceName,
hasEndpoints: !!endpoints,
actualIsSuccess
});
return {
serviceName,
endpoints,
actualIsSuccess,
actualToolTimestamp,
actualAssistantTimestamp
};
}