{"id":124050,"date":"2026-06-02T12:27:07","date_gmt":"2026-06-02T12:27:07","guid":{"rendered":"https:\/\/foojay.io\/?p=124050"},"modified":"2026-06-02T12:33:49","modified_gmt":"2026-06-02T12:33:49","slug":"boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability","status":"publish","type":"post","link":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/","title":{"rendered":"BoxLang AI 3.2.0 \u2014 Image Generation, Web Search, Fluent Audio, Agent Registry &amp; MCP Observability"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/foojay.io\/wp-content\/uploads\/2026\/06\/BoxLangAI-3.2-700x394.jpg\" alt=\"\" \/><\/p>\n<p>BoxLang AI 3.2.0 is here, and it's a landmark release. We're shipping five major features: image generation, web search, a fluent audio builder API, a centralized agent registry, and deep MCP observability along with a suite of analytics improvements and a critical bug fix. Let's dig in. \ud83c\udf89<\/p>\n<p>\ud83d\uddbc\ufe0f Image Generation \u2014 aiImage()<br \/>\nYou can now generate images directly from BoxLang using any provider that supports text-to-image generation. The aiImage() BIF follows the same fluent, chainable philosophy as the rest of bx-ai then act on the result with expressive method calls.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/\/ Generate and save in one fluent chain\naiImage( \"A futuristic cityscape at sunset\" )\n    .saveToFile( \"\/images\/cityscape.png\" )\n\n\/\/ Full control with params and provider\nresponse = aiImage(\n    \"A watercolor painting of a mountain lake\",\n    { n: 2, size: \"1024x1024\", quality: \"hd\" },\n    { provider: \"openai\" }\n)\n\n\/\/ Embed directly in HTML output\ndataURI = response.toDataURI()\n<\/pre>\n<p>The returned AiImageResponse object gives you everything you need: hasImages(), getCount(), getFirstURL(), getFirstBase64(), saveToFile(), saveAllToDirectory(), toDataURI(), getMimeType(), and toStruct().<\/p>\n<p>Supported providers out of the box:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left\">Provider<\/th>\n<th style=\"text-align: left\">Model<\/th>\n<th style=\"text-align: left\">Env Var<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left\">OpenAI<\/td>\n<td style=\"text-align: left\">gpt-image-1 (default), DALL-E models<\/td>\n<td style=\"text-align: left\">OPENAI_API_KEY<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">Gemini<\/td>\n<td style=\"text-align: left\">imagen-3.0-generate-008<\/td>\n<td style=\"text-align: left\">GEMINI_API_KEY<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">Grok \/ xAI<\/td>\n<td style=\"text-align: left\">grok-2-image<\/td>\n<td style=\"text-align: left\">GROK_API_KEY<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">OpenRouter<\/td>\n<td style=\"text-align: left\">FLUX Schnell (default), many others<\/td>\n<td style=\"text-align: left\">OPENROUTER_API_KEY<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A generateImage@bxai agent tool is auto-registered in the global tool registry at module startup, so your agents can generate images without any manual wiring:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">agent = aiAgent( tools: [ \"generateImage@bxai\" ] )\n<\/pre>\n<p>\ud83d\udcda <strong><a target=\"_blank\" title=\"Image Generation Docs\" href=\"https:\/\/ai.ortusbooks.com\/main-components\/image-generation\">Image Generation Docs<\/a><\/strong><\/p>\n<p>\ud83d\udd0d Web Search \u2014 aiWebSearch() &amp; aiWebSearchAsync()<br \/>\nBoxLang AI now ships a unified web search system with provider abstraction and normalized results. Every provider returns the same fields \u2014 title, url, snippet, publishedDate, domain, score, thumbnail, language \u2014 so you can swap providers without touching your code.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/\/ Synchronous search\nresults = aiWebSearch( \"latest BoxLang AI updates\", { provider: \"brave\", maxResults: 8 } )\n\n\/\/ Async \u2014 returns a BoxFuture\nfuture = aiWebSearchAsync( \"BoxLang release highlights\", { provider: \"tavily\" } )\nresults = future.get()\n<\/pre>\n<p>Supported providers:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left\">Provider<\/th>\n<th style=\"text-align: left\">Notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left\">http<\/td>\n<td style=\"text-align: left\">URL fetching &amp; parsing \u2014 no API key required<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">brave<\/td>\n<td style=\"text-align: left\">Privacy-focused; country\/language filters<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">google<\/td>\n<td style=\"text-align: left\">Google Custom Search<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">tavily<\/td>\n<td style=\"text-align: left\">Retrieval-focused, great for AI agents<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">exa<\/td>\n<td style=\"text-align: left\">Semantic and neural search modes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The webSearch@bxai tool is auto-registered globally, so any agent can search the web immediately:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">agent = aiAgent(\n    name: \"ResearchAgent\",\n    tools: [ \"webSearch@bxai\" ]\n)\n\nresponse = agent.run( \"Find and summarize recent BoxLang AI release highlights\" )\n<\/pre>\n<p>\ud83d\udcda <strong><a target=\"_blank\" title=\"Web Search Docs\" href=\"https:\/\/ai.ortusbooks.com\/main-components\/web-search\">Web Search Docs<\/a><\/strong><\/p>\n<p>\ud83c\udfa4 Fluent Builder API for Audio BIFs<br \/>\naiSpeak(), aiTranscribe(), and aiTranslate() now support a full fluent builder API. Call any of them with no arguments to get the request object back, then chain your configuration before executing. The traditional positional-argument syntax continues to work exactly as before \u2014 the fluent builder is purely additive.<\/p>\n<p>aiSpeak()<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/\/ Traditional syntax \u2014 still works\naudio = aiSpeak( \"Hello!\", { voice: \"nova\" }, { provider: \"openai\" } )\n\n\/\/ Fluent builder \u2014 expressive and self-documenting\naudio = aiSpeak()\n    .of( \"Hello, world!\" )\n    .voice( \"nova\" )\n    .provider( \"openai\" )\n    .asMP3()\n    .speak()\n\n\/\/ Gender shortcuts\naudio = aiSpeak()\n    .of( \"Welcome aboard!\" )\n    .male()\n    .speed( 1.2 )\n    .speak()\n\n\/\/ Format shortcuts\naudio = aiSpeak()\n    .of( \"System alert.\" )\n    .asWav()\n    .outputFile( \"\/audio\/alert.wav\" )\n    .speak()\n<\/pre>\n<p>Key builder methods: .of(), .voice(), .male() \/ .female(), .speed(), .instructions(), .outputFile(), .asMP3() \/ .asWav() \/ .asFlac() \/ .asOpus() \/ .asPCM(), .provider(), .speak().<\/p>\n<p>aiTranscribe()<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/\/ From file\ntext = aiTranscribe()\n    .file( \"\/audio\/meeting.mp3\" )\n    .withWordTimestamps()\n    .asVerboseJSON()\n    .transcribe()\n\n\/\/ From URL\ntext = aiTranscribe()\n    .url( \"https:\/\/example.com\/audio.mp3\" )\n    .language( \"es\" )\n    .transcribe()\n\n\/\/ Translate audio directly to English\nenglish = aiTranscribe()\n    .file( \"\/audio\/french.mp3\" )\n    .translate()\n<\/pre>\n<p>Key builder methods: .file(), .url(), .data(), .language(), .withWordTimestamps(), .withSegmentTimestamps(), .diarize(), .asJSON() \/ .asText() \/ .asVerboseJSON() \/ .asSRT() \/ .asVTT(), .transcribe(), .translate().<\/p>\n<p>aiTranslate()<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">english = aiTranslate()\n    .file( \"\/audio\/german.mp3\" )\n    .asText()\n    .translate()\n<\/pre>\n<p>\ud83d\udcda <strong><a target=\"_blank\" title=\"Audio Docs\" href=\"https:\/\/ai.ortusbooks.com\/main-components\/audio\">Audio Docs<\/a><\/strong><\/p>\n<p>\ud83e\udd16 Agent Registry \u2014 aiAgentRegistry()<br \/>\n3.2.0 introduces the AIAgentRegistry \u2014 a global singleton that gives you centralized discoverability, observability, and lifecycle management for all agents running in your BoxLang application.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/\/ Auto-register at creation time\nagent = aiAgent(\n    name: \"support-agent\",\n    description: \"Customer support agent\",\n    register: true,\n    module: \"my-app\"\n)\n\n\/\/ Or register manually\naiAgentRegistry().register( agent, \"my-app\" )\n\n\/\/ Discover what's running\nagents = aiAgentRegistry().listAgents()\ninfo   = aiAgentRegistry().getAgentInfo( \"support-agent@my-app\" )\n\n\/\/ Resolve a mixed array of string keys and live instances\nresolved = aiAgentRegistry().resolveAgents( [\n    \"support-agent@my-app\",\n    anotherAgentInstance\n] )\n\n\/\/ Clean up\naiAgentRegistry().unregister( \"support-agent@my-app\" )\naiAgentRegistry().unregisterByModule( \"my-app\" )\n<\/pre>\n<p>Module Authors: First-Class Agent &amp; Tool Registration \ud83c\udfaf<br \/>\nThis is a big deal for the BoxLang ecosystem. Developers building BoxLang modules can now ship agents and tools that auto-register themselves globally when the module loads \u2014 no manual wiring by the application developer required.<\/p>\n<p>Define your aiAgent() instances with register: true and a module namespace<br \/>\nDefine your tools, scan them via aiToolRegistry().scan( new MyTools(), \"my-module\" ), and they appear globally as toolName@my-module<br \/>\nApplication developers can consume your agents and tools by name, from any part of their app, the moment your module is installed<br \/>\nThis makes bx-ai a genuine platform for building composable, discoverable AI ecosystems \u2014 publish a module to ForgeBox, and your agents and tools show up ready to use. \ud83d\ude80<\/p>\n<p>Two new interception points fire on registry changes: onAIAgentRegistryRegister and onAIAgentRegistryUnregister.<\/p>\n<p>\u23f8\ufe0f MCP Server Pause\/Resume<br \/>\nMCPServer now supports pausing and resuming without tearing down configuration or losing registered tools. Ideal for maintenance windows, graceful degradation, or controlled rollouts.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">server = MCPServer( \"my-tools\", \"Provides custom tools\" )\n    .registerTool( myTool )\n\nserver.pause()\n\nif ( server.isPaused() ) {\n    println( \"Server is paused \u2014 rejecting all non-ping requests\" )\n}\n\nserver.resume()\n<\/pre>\n<p>pause() \u2014 fires onMCPServerPause; all non-ping requests receive error code -32005<br \/>\nresume() \u2014 fires onMCPServerResume; normal handling restored<br \/>\ngetSummary() now includes a paused boolean<br \/>\n\ud83d\udcca MCP Server &amp; Client Observability<br \/>\nServer Analytics<br \/>\nMCP server monitoring gets a major overhaul in 3.2.0:<\/p>\n<p>Thread-safe counters using named locks across all stat operations<br \/>\nSecurity failure tracking \u2014 auth failures, API key rejections, body-size violations all get dedicated counters<br \/>\nPer-tool error tracking \u2014 byTool[name].errors with errors.byTool roll-up<br \/>\nActive concurrent request counter \u2014 activeRequests increments and decrements in real time<br \/>\nRequests-per-minute rate \u2014 exposed in getSummary()<br \/>\nX-Request-ID correlation \u2014 request IDs echoed in response headers and event payloads<br \/>\nPaused-request stats \u2014 rejected requests tracked when server is paused<br \/>\nonMCPError now fires for METHOD_NOT_FOUND<br \/>\nClient Stats \u2014 MCPClient<br \/>\nMCPClient gains full internal usage and performance tracking:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">client = MCP( \"http:\/\/localhost:3000\" )\n\ntools  = client.listTools()\nresult = client.callTool( \"search\", { query: \"BoxLang\" } )\n\n\/\/ Inspect what's happening\nstats   = client.getStats()   \/\/ per-operation, per-tool, per-URI breakdowns\nsummary = client.getSummary() \/\/ totalCalls, successRate, avgResponseTime\n\n\/\/ Reset when needed\nclient.resetStats()\n<\/pre>\n<p>Three new interception points cover the full client lifecycle: onMCPClientRequest, onMCPClientResponse, onMCPClientError.<\/p>\n<p>\ud83d\udd27 Type-Aware Tool Argument Support<br \/>\nTool schemas in bx-ai are now generated directly from callable parameter metadata, so LLMs finally receive accurate JSON Schema types for every argument instead of a flat bag of strings. ClosureTool.getArgumentsSchema() maps BoxLang types naturally \u2014 numeric, integer, float, and double become \"number\", boolean becomes \"boolean\", array becomes \"array\" with \"items\": {}, and struct becomes \"object\" \u2014 meaning LLMs can send native JSON values for non-string arguments and tools behave exactly as their signatures declare. On the output side, BaseTool.invoke() continues to serialize results consistently for provider compatibility, converting simple values via toString() and complex values via JSON serialization, keeping the tool contract clean in both directions. \ud83c\udfaf<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/\/ Tool with numeric and boolean arguments\n\/\/ LLM sends { \"quantity\": 3, \"applyDiscount\": true } \u2014 no casting needed\ncalculateTotal = aiTool(\n    name: \"calculateTotal\",\n    description: \"Calculate order total with optional discount\",\n    tool: ( numeric price, numeric quantity, boolean applyDiscount = false ) -&gt; {\n        total = price * quantity\n        if ( applyDiscount ) total *= 0.9\n        return { summary: \"Order total calculated\", total: total }\n    }\n)\n\n\/\/ Tool with an array argument\n\/\/ LLM sends { \"tags\": [\"boxlang\", \"ai\", \"tools\"] } \u2014 native array\ntagContent = aiTool(\n    name: \"tagContent\",\n    description: \"Apply a list of tags to a content item\",\n    tool: ( string contentId, array tags ) -&gt; {\n        \/\/ tags arrives as a real BoxLang array\n        return {\n            summary : \"Tags applied to #contentId#\",\n            applied : tags.len(),\n            tags    : tags\n        }\n    }\n)\n\n\/\/ Tool with a struct argument\n\/\/ LLM sends { \"filter\": { \"status\": \"active\", \"minAge\": 18 } } \u2014 native struct\nqueryUsers = aiTool(\n    name: \"queryUsers\",\n    description: \"Query users by filter criteria\",\n    tool: ( struct filter, numeric limit = 10 ) -&gt; {\n        results = userService.query( filter, limit )\n        return {\n            summary : \"Found #results.len()# users\",\n            count   : results.len(),\n            data    : results\n        }\n    }\n)\n\nagent = aiAgent(\n    tools: [ calculateTotal, tagContent, queryUsers ]\n)\n<\/pre>\n<p>\ud83d\udc1b Bug Fix \u2014 ClosureTool.doInvoke() JSON Struct Handling<br \/>\nMCP clients that send JSON fields as real objects or arrays (rather than pre-stringified JSON) no longer cause \"Can't cast Struct to a string\" errors. doInvoke() now inspects declared parameters and calls jsonSerialize() on any non-simple value whose declared type is string. Silent, automatic, no code changes required.<\/p>\n<p>\ud83d\udce6 Module Configuration<br \/>\nNew image Settings Block<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">{\n  \"modules\": {\n    \"bxai\": {\n      \"settings\": {\n        \"image\": {\n          \"defaultProvider\": \"openai\",\n          \"defaultApiKey\": \"\",\n          \"defaultModel\": \"gpt-image-1\",\n          \"defaultSize\": \"1024x1024\",\n          \"defaultQuality\": \"standard\",\n          \"defaultStyle\": \"vivid\",\n          \"defaultInstructions\": \"\"\n        }\n      }\n    }\n  }\n}\n<\/pre>\n<p>New Interception Points<br \/>\n3.2.0 brings bx-ai to 50 total interception points, adding 10 new events:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left\">Event<\/th>\n<th style=\"text-align: left\">When Fired<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left\">beforeAIImageGeneration<\/td>\n<td style=\"text-align: left\">Before image generation request<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">afterAIImageGeneration<\/td>\n<td style=\"text-align: left\">After image generation response<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onAIImageRequest<\/td>\n<td style=\"text-align: left\">Image request object created<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onAIImageResponse<\/td>\n<td style=\"text-align: left\">Image response received<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onAIAgentRegistryRegister<\/td>\n<td style=\"text-align: left\">Agent registered<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onAIAgentRegistryUnregister<\/td>\n<td style=\"text-align: left\">Agent unregistered<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onMCPServerPause<\/td>\n<td style=\"text-align: left\">MCP server paused<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onMCPServerResume<\/td>\n<td style=\"text-align: left\">MCP server resumed<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onMCPClientRequest<\/td>\n<td style=\"text-align: left\">MCP client HTTP request<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onMCPClientResponse<\/td>\n<td style=\"text-align: left\">MCP client HTTP response<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left\">onMCPClientError<\/td>\n<td style=\"text-align: left\">MCP client HTTP error<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ud83d\ude80 Upgrade Now<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\"># CommandBox\nbox install bx-ai\n\n# OS\ninstall-bx-module bx-ai\n<\/pre>\n<p>\ud83d\udcda Full Docs: ai.ortusbooks.com \ud83d\udcac Community: community.ortussolutions.com \u2b50 GitHub: github.com\/ortus-boxlang\/bx-ai<\/p>\n<p>BoxLang AI 3.2.0 is a platform release: image generation, web search, fluent audio, a global agent &amp; tool registry, and deep observability all land together. We can't wait to see what you build. \ud83c\udf89<\/p>\n","protected":false},"excerpt":{"rendered":"<p>BoxLang AI 3.2.0 is here, and it&#8217;s a landmark release. We&#8217;re shipping five major features: image generation, web search, a fluent audio builder API, a centralized agent registry, and deep MCP observability along with a suite of analytics improvements and &#8230;<\/p>\n","protected":false},"author":726,"featured_media":124055,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2334,2373,675,2331,1722,2332,1620,220],"tags":[2691,2566,550,2422,2666,2694,2685,2692,2682,2687,2688,2689,2684,2702,1126,2686,2586,2462,2576,2699,2471,2597,818,2701,2656,2690,2635,2578,1895,2696,2681,33,1439,2695,170,1829,2259,2680,2678,2679,2567,869,1738,2698,2598,2664,242,2505,2700,2693,2683,2697],"class_list":["post-124050","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-boxlang","category-developer-tools","category-genai","category-java","category-llm","category-observability","category-tools","tag-agent-registry","tag-agentic-ai","tag-ai","tag-ai-agents","tag-ai-providers","tag-ai-tools","tag-ai-web-search","tag-aiagentregistry","tag-aiimage","tag-aispeak","tag-aitranscribe","tag-aitranslate","tag-aiwebsearch","tag-analytics","tag-asynchronous-programming","tag-audio-ai","tag-boxfuture","tag-boxlang","tag-boxlang-ai","tag-brave-search","tag-bx-ai","tag-commandbox","tag-developer-tools","tag-exa","tag-fluent-api","tag-fluent-builder","tag-forgebox","tag-gemini","tag-genai","tag-grok","tag-image-generation","tag-java","tag-java-21","tag-json-schema","tag-jvm","tag-llm","tag-mcp","tag-mcp-client","tag-mcp-observability","tag-mcp-server","tag-model-context-protocol","tag-observability","tag-openai","tag-openrouter","tag-ortus-solutions","tag-provider-abstraction","tag-security","tag-streaming","tag-tavily","tag-tool-registry","tag-web-search","tag-xai"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>foojay \u2013 a place for friends of OpenJDK<\/title>\n<meta name=\"description\" content=\"foojay is the place for all OpenJDK Update Release Information. Learn More.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"foojay \u2013 a place for friends of OpenJDK\" \/>\n<meta property=\"og:description\" content=\"foojay is the place for all OpenJDK Update Release Information. Learn More.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/\" \/>\n<meta property=\"og:site_name\" content=\"foojay\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-02T12:27:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-02T12:33:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/foojay.io\/wp-content\/uploads\/2026\/06\/bx-jwt-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1701\" \/>\n\t<meta property=\"og:image:height\" content=\"1701\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Cristobal Escobar\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Cristobal Escobar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/\"},\"author\":{\"name\":\"Cristobal Escobar\",\"@id\":\"https:\\\/\\\/foojay.io\\\/#\\\/schema\\\/person\\\/564774eb143418c09ad916cce47854f8\"},\"headline\":\"BoxLang AI 3.2.0 \u2014 Image Generation, Web Search, Fluent Audio, Agent Registry &amp; MCP Observability\",\"datePublished\":\"2026-06-02T12:27:07+00:00\",\"dateModified\":\"2026-06-02T12:33:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/\"},\"wordCount\":980,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/bx-jwt-2.png\",\"keywords\":[\"agent registry\",\"agentic AI\",\"ai\",\"AI agents\",\"AI providers\",\"AI tools\",\"AI web search\",\"AIAgentRegistry\",\"aiImage\",\"aiSpeak\",\"aiTranscribe\",\"aiTranslate\",\"aiWebSearch\",\"analytics\",\"asynchronous programming\",\"audio AI\",\"BoxFuture\",\"BoxLang\",\"BoxLang AI\",\"Brave Search\",\"bx-ai\",\"CommandBox\",\"Developer tools\",\"Exa\",\"fluent API\",\"fluent builder\",\"ForgeBox\",\"Gemini\",\"GenAI\",\"Grok\",\"image generation\",\"Java\",\"Java 21\",\"JSON Schema\",\"JVM\",\"LLM\",\"MCP\",\"MCP client\",\"MCP observability\",\"MCP server\",\"Model Context Protocol\",\"Observability\",\"openai\",\"OpenRouter\",\"Ortus Solutions\",\"provider abstraction\",\"Security\",\"Streaming\",\"Tavily\",\"tool registry\",\"web search\",\"xAI\"],\"articleSection\":[\"AI\",\"BoxLang\",\"Developer Tools\",\"GenAI\",\"Java\",\"LLM\",\"Observability\",\"Tools\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/\",\"url\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/\",\"name\":\"foojay \u2013 a place for friends of OpenJDK\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/bx-jwt-2.png\",\"datePublished\":\"2026-06-02T12:27:07+00:00\",\"dateModified\":\"2026-06-02T12:33:49+00:00\",\"description\":\"foojay is the place for all OpenJDK Update Release Information. Learn More.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/#primaryimage\",\"url\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/bx-jwt-2.png\",\"contentUrl\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/bx-jwt-2.png\",\"width\":1701,\"height\":1701},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/foojay.io\\\/today\\\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/foojay.io\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"BoxLang AI 3.2.0 \u2014 Image Generation, Web Search, Fluent Audio, Agent Registry &amp; MCP Observability\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/foojay.io\\\/#website\",\"url\":\"https:\\\/\\\/foojay.io\\\/\",\"name\":\"foojay\",\"description\":\"a place for friends of OpenJDK\",\"publisher\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/foojay.io\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/foojay.io\\\/#organization\",\"name\":\"foojay\",\"url\":\"https:\\\/\\\/foojay.io\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/foojay.io\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/cropped-Favicon.png\",\"contentUrl\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/cropped-Favicon.png\",\"width\":512,\"height\":512,\"caption\":\"foojay\"},\"image\":{\"@id\":\"https:\\\/\\\/foojay.io\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/foojay2020\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/foojay.io\\\/#\\\/schema\\\/person\\\/564774eb143418c09ad916cce47854f8\",\"name\":\"Cristobal Escobar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/1719238563023-96x96.jpeg\",\"url\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/1719238563023-96x96.jpeg\",\"contentUrl\":\"https:\\\/\\\/foojay.io\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/1719238563023-96x96.jpeg\",\"caption\":\"Cristobal Escobar\"},\"description\":\"Development and promotion of BoxLang, a modern dynamic JVM language deployable on various platforms, including all operating systems, web servers, Java application servers, AWS Lambda, iOS, Android, web assembly, and more.\",\"sameAs\":[\"https:\\\/\\\/www.boxlang.io\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/cristobalescobarh\\\/\",\"https:\\\/\\\/x.com\\\/crisescobar\"],\"url\":\"https:\\\/\\\/foojay.io\\\/today\\\/author\\\/cristobal-escobar\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"foojay \u2013 a place for friends of OpenJDK","description":"foojay is the place for all OpenJDK Update Release Information. Learn More.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/","og_locale":"en_US","og_type":"article","og_title":"foojay \u2013 a place for friends of OpenJDK","og_description":"foojay is the place for all OpenJDK Update Release Information. Learn More.","og_url":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/","og_site_name":"foojay","article_published_time":"2026-06-02T12:27:07+00:00","article_modified_time":"2026-06-02T12:33:49+00:00","og_image":[{"width":1701,"height":1701,"url":"https:\/\/foojay.io\/wp-content\/uploads\/2026\/06\/bx-jwt-2.png","type":"image\/png"}],"author":"Cristobal Escobar","twitter_misc":{"Written by":"Cristobal Escobar","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/#article","isPartOf":{"@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/"},"author":{"name":"Cristobal Escobar","@id":"https:\/\/foojay.io\/#\/schema\/person\/564774eb143418c09ad916cce47854f8"},"headline":"BoxLang AI 3.2.0 \u2014 Image Generation, Web Search, Fluent Audio, Agent Registry &amp; MCP Observability","datePublished":"2026-06-02T12:27:07+00:00","dateModified":"2026-06-02T12:33:49+00:00","mainEntityOfPage":{"@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/"},"wordCount":980,"commentCount":0,"publisher":{"@id":"https:\/\/foojay.io\/#organization"},"image":{"@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/#primaryimage"},"thumbnailUrl":"https:\/\/foojay.io\/wp-content\/uploads\/2026\/06\/bx-jwt-2.png","keywords":["agent registry","agentic AI","ai","AI agents","AI providers","AI tools","AI web search","AIAgentRegistry","aiImage","aiSpeak","aiTranscribe","aiTranslate","aiWebSearch","analytics","asynchronous programming","audio AI","BoxFuture","BoxLang","BoxLang AI","Brave Search","bx-ai","CommandBox","Developer tools","Exa","fluent API","fluent builder","ForgeBox","Gemini","GenAI","Grok","image generation","Java","Java 21","JSON Schema","JVM","LLM","MCP","MCP client","MCP observability","MCP server","Model Context Protocol","Observability","openai","OpenRouter","Ortus Solutions","provider abstraction","Security","Streaming","Tavily","tool registry","web search","xAI"],"articleSection":["AI","BoxLang","Developer Tools","GenAI","Java","LLM","Observability","Tools"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/","url":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/","name":"foojay \u2013 a place for friends of OpenJDK","isPartOf":{"@id":"https:\/\/foojay.io\/#website"},"primaryImageOfPage":{"@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/#primaryimage"},"image":{"@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/#primaryimage"},"thumbnailUrl":"https:\/\/foojay.io\/wp-content\/uploads\/2026\/06\/bx-jwt-2.png","datePublished":"2026-06-02T12:27:07+00:00","dateModified":"2026-06-02T12:33:49+00:00","description":"foojay is the place for all OpenJDK Update Release Information. Learn More.","breadcrumb":{"@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/#primaryimage","url":"https:\/\/foojay.io\/wp-content\/uploads\/2026\/06\/bx-jwt-2.png","contentUrl":"https:\/\/foojay.io\/wp-content\/uploads\/2026\/06\/bx-jwt-2.png","width":1701,"height":1701},{"@type":"BreadcrumbList","@id":"https:\/\/foojay.io\/today\/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/foojay.io\/"},{"@type":"ListItem","position":2,"name":"BoxLang AI 3.2.0 \u2014 Image Generation, Web Search, Fluent Audio, Agent Registry &amp; MCP Observability"}]},{"@type":"WebSite","@id":"https:\/\/foojay.io\/#website","url":"https:\/\/foojay.io\/","name":"foojay","description":"a place for friends of OpenJDK","publisher":{"@id":"https:\/\/foojay.io\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/foojay.io\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/foojay.io\/#organization","name":"foojay","url":"https:\/\/foojay.io\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/foojay.io\/#\/schema\/logo\/image\/","url":"https:\/\/foojay.io\/wp-content\/uploads\/2020\/04\/cropped-Favicon.png","contentUrl":"https:\/\/foojay.io\/wp-content\/uploads\/2020\/04\/cropped-Favicon.png","width":512,"height":512,"caption":"foojay"},"image":{"@id":"https:\/\/foojay.io\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/foojay2020"]},{"@type":"Person","@id":"https:\/\/foojay.io\/#\/schema\/person\/564774eb143418c09ad916cce47854f8","name":"Cristobal Escobar","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/foojay.io\/wp-content\/uploads\/2025\/10\/1719238563023-96x96.jpeg","url":"https:\/\/foojay.io\/wp-content\/uploads\/2025\/10\/1719238563023-96x96.jpeg","contentUrl":"https:\/\/foojay.io\/wp-content\/uploads\/2025\/10\/1719238563023-96x96.jpeg","caption":"Cristobal Escobar"},"description":"Development and promotion of BoxLang, a modern dynamic JVM language deployable on various platforms, including all operating systems, web servers, Java application servers, AWS Lambda, iOS, Android, web assembly, and more.","sameAs":["https:\/\/www.boxlang.io","https:\/\/www.linkedin.com\/in\/cristobalescobarh\/","https:\/\/x.com\/crisescobar"],"url":"https:\/\/foojay.io\/today\/author\/cristobal-escobar\/"}]}},"_links":{"self":[{"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/posts\/124050","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/users\/726"}],"replies":[{"embeddable":true,"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/comments?post=124050"}],"version-history":[{"count":0,"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/posts\/124050\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/media\/124055"}],"wp:attachment":[{"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/media?parent=124050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/categories?post=124050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/foojay.io\/wp-json\/wp\/v2\/tags?post=124050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}