UNPKG

@agentforce/adk

Version:

AgentForce Agent Development Kit - A powerful framework for building AI agents and servers

148 lines (135 loc) 6.59 kB
import type { ToolImplementation } from "../types"; import { formatResponseAsJson } from "../utils/json"; import { formatResponseAsMarkdown } from "../utils/markdown"; import { formatResponseAsYaml } from "../utils/yaml"; import { formatResponseAsHtml, type HtmlFilterConfig } from "../utils/html"; /** * Content filter tool * Extracts JSON, Markdown, YAML, or HTML content from agent responses using code block parsing */ export const filter_content: ToolImplementation = { definition: { type: "function", function: { name: "filter_content", description: "Extract JSON, Markdown, YAML, or HTML content from text using code block parsing. Filters code blocks like ```json, ```yaml, ```markdown, ```html and returns only the extracted content. For HTML, can also filter specific elements like body, div, links, etc.", parameters: { type: "object", properties: { content: { type: "string", description: "The text content to filter and extract from", }, format: { type: "string", description: "The format to extract (json, yaml, markdown, md, html)", enum: ["json", "yaml", "markdown", "md", "html"], }, enable_code_block_parsing: { type: "boolean", description: "Whether to extract content from code blocks (default: true). Set to false to return whole content.", default: true, }, html_elements: { type: "string", description: "For HTML format: Comma-separated list of HTML elements to extract (e.g., 'body,div,links'). Special elements: 'links' for <a> tags, 'styles' for <style> tags.", }, html_text_only: { type: "boolean", description: "For HTML format: Extract only text content without HTML tags.", default: false, }, html_include_attributes: { type: "boolean", description: "For HTML format: Include HTML attributes in the extracted content.", default: false, }, html_selector: { type: "string", description: "For HTML format: Custom CSS selector for more precise element selection.", }, html_remove_elements: { type: "string", description: "For HTML format: Comma-separated list of elements to remove before processing (e.g., 'script,style').", }, }, required: ["content", "format"], }, }, }, execute: async (args: Record<string, any>) => { const content = args.content; const format = args.format; const enableCodeBlockParsing = args.enable_code_block_parsing !== false; // Default to true try { // Validate input if (!content || typeof content !== "string") { return { success: false, error: "Content must be a non-empty string", format: format, }; } if (!format || typeof format !== "string") { return { success: false, error: "Format must be specified (json, yaml, markdown, md, html)", format: format, }; } let extractedContent: string | object; let actualFormat = format.toLowerCase(); // Normalize markdown format if (actualFormat === "md") { actualFormat = "markdown"; } // Extract content based on format switch (actualFormat) { case "json": extractedContent = formatResponseAsJson(content, enableCodeBlockParsing); break; case "yaml": extractedContent = formatResponseAsYaml(content, enableCodeBlockParsing); break; case "markdown": extractedContent = formatResponseAsMarkdown(content, enableCodeBlockParsing); break; case "html": // Build HTML filter configuration from parameters const htmlConfig: HtmlFilterConfig = { elements: args.html_elements, textOnly: args.html_text_only || false, includeAttributes: args.html_include_attributes || false, selector: args.html_selector, removeElements: args.html_remove_elements ? args.html_remove_elements.split(",").map((s: string) => s.trim()) : undefined, }; extractedContent = formatResponseAsHtml(content, htmlConfig, enableCodeBlockParsing); break; default: return { success: false, error: `Unsupported format: ${format}. Supported formats: json, yaml, markdown, md, html`, format: format, }; } // Determine if content was extracted from code blocks const wasExtracted = enableCodeBlockParsing && extractedContent !== content.trim(); return { success: true, format: actualFormat, original_length: content.length, extracted_length: typeof extractedContent === "string" ? extractedContent.length : JSON.stringify(extractedContent).length, was_extracted: wasExtracted, code_block_parsing_enabled: enableCodeBlockParsing, content: extractedContent, }; } catch (error: any) { return { success: false, error: `Failed to filter content: ${error.message}`, format: format, content: content, }; } }, };