MakerAi
The AI Operating System for Delphi. 100% native framework with RAG 2.0, autonomous agents, MCP protocol, and universal LLM connector. Supports OpenAI, Claude, Gemini, Ollama, and more. Delphi 10.4+ (limited), full support from Delphi 12 Athens.
Links
README
From the repo.
MakerAI Suite v3.7 — The AI Ecosystem for Delphi
🌐 Official Website: https://makerai.cimamaker.com 📖 Manual: https://www.gustavoenriquez.com/book-makerai — available in English and Spanish
Free Pascal / Lazarus port available — Full port of MakerAI Suite for FPC 3.2+ (12 LLM drivers, RAG, Agents, MCP, Embeddings). See the
fpcbranch.
MakerAI is more than an API wrapper
Most AI libraries for Delphi stop at wrapping REST calls. MakerAI is different.
Yes, MakerAI includes native, provider-specific components that give you direct, full-fidelity access to each provider's API — every model parameter, every response field, every streaming event, exactly as the provider defines it.
But on top of that, MakerAI is a complete AI application ecosystem that lets you build production-grade intelligent systems entirely in Delphi:
- RAG pipelines (vector and graph-based) with SQL-like query languages (VQL / GQL)
- Autonomous Agents with graph orchestration, checkpoints, and human-in-the-loop approval
- MCP Servers and Clients — expose or consume tools using the Model Context Protocol (dual-era: stateless spec 2026-07-28 + legacy handshake)
- Native ChatTools — bridge AI reasoning with deterministic real-world capabilities (PDF, Vision, Speech, Web Search, Shell, Computer Use)
- FMX Visual Components — drop-in UI for multimodal chat interfaces
- Universal Connector — switch providers at runtime without changing your application code
Whether you need a simple one-provider integration or a multi-agent, multi-provider, retrieval-augmented production system, MakerAI covers the full stack — natively in Delphi.
🧪 On dev — not yet released
Work merged after v3.7.0. Three items change existing behaviour; they are called out below.
Computer Use on Linux
TAiLinuxExecutor (Source/Tools/uMakerAi.Tools.ComputerUse.Linux.pas) drives X11 through
xdotool and captures with scrot, covering the 19 canonical actions with the same
public interface as the Windows and macOS executors. The framework itself needed no change:
TAiComputerUseTool only ever used the RTL and delegates everything to
OnExecuteAction / OnRequestScreenshot, so it cross-compiled to Linux64 untouched — what
was missing was only the executor. Runtime-tested on Xvfb with gpt-6-astra and
claude-opus-4-8, driving both a text editor and Chrome. Demo: 083-ComputerUseLinux.
Computer Use delegation — handing the call to a remote client
A headless process (a broker on a VPS) can now claim a computer_call and forward it to
whoever actually owns a screen. The contract already existed in the base class and in Claude
— fill ToolCall.Response from OnCallToolFunction and the driver does not execute
locally — but OpenAI ignored it and Gemini never even fired the event. Both now honour
it. For OpenAI the delegation is atomic over the batch: gpt-6-astra sends an array of
actions that admits a single computer_call_output, so splitting it between a local and a
remote executor would leave the final screenshot ownerless. Demo: 082-ComputerUsePassthru.
⚠️ TLS certificates are now verified on POSIX
TOpenSSLTransport used to run with SSL_VERIFY_NONE — it accepted any certificate,
from anyone, and that is the transport the Realtime module uses on Linux and macOS. It now
verifies the chain against the system CA store and the hostname (SSL_set1_host;
SSL_VERIFY_PEER alone validates the chain but not that the certificate was issued for the
host you dialed). Verified against badssl.com, 7/7, including the wrong.host case.
Breaking: pointing Realtime at an endpoint with a self-signed certificate (a local LM Studio, an internal proxy) now fails until you set
InsecureSkipVerify := True.
⚠️ Gemini executed no user functions at all
TAiGeminiChat.DoCallFunction had its inherited commented out and answered
'Command <name> not found' to every non-Computer-Use tool call — and it is the driver's
only dispatch point. Neither AiFunctions nor OnCallToolFunction ever ran. Restored.
Behaviour change: tools that silently returned "not found" with Gemini now execute.
⚠️ TAiShell crashed on non-English Windows
Shell output was decoded with TEncoding.UTF8.GetString, which validates its input and
raises EEncodingError. cmd.exe writes in the console OEM codepage (cp850 on a Spanish
Windows) and even its own banner carries accents, so the component died on the first
command. Invisible in English (pure ASCII) and on Linux (bash does emit UTF-8). Decoding
now falls back to the OEM codepage. Two more, found while exercising it on Linux: stderr was
dropped whenever the sentinel arrived in the same read, and a timeout left the session
permanently unusable (the Restart was written but commented out).
Also
- Claude sometimes sends coordinates as a JSON array and sometimes as a string containing
one — within the same turn.
TryGetValue<TJSONArray>missed the second form, the coordinate was lost and the action landed on (0,0): a click in the screen corner, after which the model retried until it ran out of turns. Affectedcoordinate,start_coordinateandregion, i.e. click, double/triple click, drag and zoom. - OpenTelemetry validated against a real collector for the first time (Jaeger): the trace
crosses the A2A boundary, so
traceparentpropagation through_metaworks. Fixedotel.scope.version, hardcoded to3.5while the framework was on 3.7. - Demos 031 and 077 now build and run on Linux64 — which also makes FireDAC on Linux a
tested path (PostgreSQL 18 + pgvector 0.8.1 through
libpq.so.5). - Documented that the Realtime module needs
CheckSynchronizein console apps and services: every event is dispatched withTThread.Queue, so without a message loop no event ever fires — not evenOnError.
🚀 What's New in v3.7
Computer Use, Refreshed on Both Live Providers
Both vendor APIs changed under our feet, and one of them had gone silently dead. Claude was broken: the driver still declared computer_20251124, a tool type the Anthropic API now rejects for every model. It is now computer_toolset_20260801, which takes no parameters and explodes the old single computer tool into 17 individually named tools. OpenAI joins natively with gpt-6-astra and the parameterless computer tool, which sends a whole batch of actions per turn — the driver runs them in order and answers with one final screenshot.
Both APIs converged on the same design: the tool declares no screen dimensions (the model infers them from the screenshot) and coordinates come back as pixels of the image you sent.
GLM (Zhipu AI / Z.ai) — New Provider
TAiGLMChat brings a 14th provider: OpenAI-compatible endpoint, explicit thinking control (the API ships it ON by default, the driver decides), reasoning_content captured and re-sent across turns, and free tiers (glm-4.7-flash, glm-4.6v-flash).
Correctness Pass
RAG on pgvector (OFFSET was trimming instead of paginating; the vector did not survive the round trip), token and cache accounting across OpenAI, Claude and MakerAi streams, a race where the model travelled through the global registry, tool-calling continuation off the main thread, and reasoning no longer leaking into the user-visible answer.
What's New in v3.6
MCP Specification 2026-07-28 — Stateless, Dual-Era
The Model Context Protocol dropped sessions and the initialize handshake. MakerAI implements the new stateless revision on both sides and keeps talking to legacy peers: clients probe with server/discover and fall back automatically; the server serves modern per-request _meta requests statelessly while the legacy handshake and session gating keep working. Includes the MRTR pattern, so a tool can pause and ask the user for confirmation (OnInputRequired on the client, TAiAuthContext.InputResponses on the server).
Observability — OpenTelemetry Tracing
TAiTelemetry exports OTLP traces to any standard collector (Jaeger, Grafana Tempo, Langfuse, Arize Phoenix) following the GenAI semantic conventions. Spans cover chat turns with token usage, tool executions, agent graphs and nodes, RAG retrieval and MCP requests — with W3C traceparent propagated through MCP _meta, so a client and a server in different processes share one distributed trace. Opt-in, zero overhead when disabled.
A2A — Agent-to-Agent Protocol (first Delphi implementation)
If MCP is the agent-to-tool layer, A2A (Linux Foundation) is the agent-to-agent layer. TAiA2AServer publishes any agent graph as a standard A2A agent (Agent Card + JSON-RPC), TAiA2AClient consumes remote agents, and TAiA2ARemoteAgentTool federates: a node in your graph can delegate its work to a remote agent — including one written in another language or framework. Demo: 072-A2AFederation.
Guardrails & Evals
TAiGuardrails intercepts every tool call before it executes (allowlists, blocklists, forbidden argument patterns, programmatic veto) — blocked calls never run and the LLM gets the reason so it can replan. TAiEvalRunner brings systematic evaluation: fluent test cases against any target, deterministic checks plus optional LLM-as-judge, with ToJSON reports for CI.
First Automated Regression Suite
Tests/RegressionSuite/ — 17 in-process cases covering MCP, agents, A2A, guardrails and evals. No API keys, under a second, exit code for CI. Built on TAiEvalRunner itself.
What's New in v3.5
Typed ModelConfig Channel
Capability configuration now lives in a single typed surface: ModelConfig.ModelCaps / SessionCaps / Tool_Active / ThinkingLevel moved out of the string-based Params/RTTI channel, with per-field user pins and transparent compatibility migration — existing code keeps working unchanged.
Full-Duplex Voice Suite
TAiGrokRealtimeChat— xAI Grok Voice speech-to-speech (function calling, session resumption with replay, binary audio transport, ephemeral tokens)TAiOpenAiRealtimeTranslate— continuous streaming speech translation (one WebSocket per direction; demo 071-VoiceBridgeTranslate)TAiRealtimeVoiceBase— shared full-duplex base; voice events flow through the universalTAiRealtimeConnection- gpt-transcribe / gpt-live-transcribe — OpenAI's Whisper successors, fully integrated
August 2026 Provider Refresh — All 9 Cloud Providers, Runtime-Tested
Claude 5 family (adaptive thinking, FastMode, compaction, server-side fallbacks) · Gemini 3.5/3.6 + Nano Banana GA · Mistral Voxtral TTS + OCR 4 · Kimi K3 · DeepSeek V4 (explicit thinking control) · Cohere Command A+ · Groq qwen3.6 · xAI grok-4.3/4.5/build — with retired-model cleanup and compatibility aliases throughout.
Grok Native Video & Image Generation
TAiGrokChat now generates video with grok-imagine (async job + polling + mp4 as TAiMediaFile, new VideoDurationSeconds property) and images with grok-imagine-image — activated by cmVideoGeneration/cmImageGeneration or the [cap_GenVideo]/[cap_GenImage] gaps.
What's New in v3.4
Delphi 13.1 Florence Support
v3.4 is fully tested and compatible with Delphi 13.1 Florence (CompilerVersion 37.1), in addition to the existing range from Delphi 10.4 Sydney through Delphi 13 Florence.
Selective Driver Registration
The biggest infrastructure change in v3.4: TAiChatConnection no longer force-loads all providers at startup. Each driver now self-registers only when explicitly imported, eliminating unnecessary initialization overhead:
// Load only what you need
uses uMakerAi.Chat.AiConnection, uMakerAi.Chat.OpenAi, uMakerAi.Chat.Claude;
// Load all drivers at once (legacy behavior)
uses uMakerAi.Chat.Initializations;
Real-Time STT — TAiRealtimeConnection
New universal connector for real-time speech-to-text via WebSocket:
TAiRealtimeConnection— provider-agnostic STT connector; switch providers viaDriverNameTAiOpenAiRealtimeSTT— full OpenAI Realtime API implementation (24 kHz PCM16, VAD modes, streaming transcription)- Pure-Pascal WebSocket client with native TLS via Windows SChannel — no extra DLLs required
- Thread-safe PCM16 resampler; supports push-based audio streaming from any source
GPT-Transcribe — Next-Gen OpenAI Transcription (Whisper successors) 🆕
OpenAI's new transcription models (Aug 2026) are fully integrated — better accuracy on real-world audio, accents, numbers, specialized terminology and loud background noise:
| Model | Use case | Word Error Rate |
|---|---|---|
gpt-live-transcribe | Live low-latency STT (Realtime WebSocket) | 9.60% (vs 11.65% Whisper) |
gpt-transcribe | Completed files and batch workloads | 8.98% (vs 15.21% Whisper) |
TAiOpenAiRealtimeSTTnow defaults togpt-live-transcribe, with new context properties:TranscriptionPrompt(free-form topic),TranscriptionKeywords(domain terms),Languages(multi-language guided autodetection) andLowDelayTAiOpenAiAudiogainstmGptTranscribe/tmGptLiveTranscribewithTranscriptionKeywords+TranscriptionLanguagesfor REST/batch transcription- Legacy models (
whisper-1,gpt-4o-transcribe) remain available — they're still required for subtitles (SRT/VTT), word timestamps and diarization (gpt-4o-transcribe-diarize), which the new models don't support; the components degrade formats safely per model - VoiceBridge demos (062–065) migrated: live channels use
gpt-live-transcribewith contextual prompts and guided language detection; diarized channels stay ongpt-4o-transcribe-diarize
Grok Voice — Real-Time Speech-to-Speech (xAI) 🆕
Full-duplex voice conversation with xAI's Grok Voice models (grok-voice-think-fast-2.0) over a single WebSocket — the user speaks, Grok listens, reasons and answers back with voice:
TAiGrokRealtimeChat— complete driver forwss://api.x.ai/v1/realtime(OpenAI Realtime-compatible protocol, 24 kHz PCM16)TAiRealtimeVoiceBase— new base class for full-duplex voice drivers; addsOnAssistantText,OnAssistantTextDelta,OnAudioChunk,OnAudioDone(shared withTAiMakerAiRealtimeChat)- Live user transcription (
OnTranscriptDelta/OnTranscriptCompleted), server VAD, streamed assistant text and TTS audio - Function calling by voice: assign a
TAiFunctionscomponent (local functions + MCP) and Grok invokes your Delphi code mid-conversation — the driver handles the whole round-trip (execution on worker threads,function_call_output, continuation) - xAI native tools:
EnableWebSearch/EnableXSearch— executed server-side by xAI - Session options:
Voice(eva, ara, rex, sal, leo or custom voice_id),Instructions,ReasoningEffort(high / none for lower latency),OutputSpeed,Keyterms(transcription biasing),PronunciationReplace(TTS corrections), automatic regional language hints (es→es-MX,pt→pt-BR) ForceMessage()— scripted TTS utterance bypassing the model (IVR prompts, disclosures)- Session resumption:
EnableResumption+ConversationId— reconnect and the server replays the cached turns (transcripts, tool calls and outputs; 30-min window) - Binary audio transport:
BinaryAudio := True— raw PCM over WebSocket binary frames, ~33% less bandwidth than base64 - Ephemeral tokens for mobile/browser clients:
MintEphemeralToken()on your backend +EphemeralTokenon the client — the API key never leaves the server file_searchover xAI Collections (FileSearchCollections) and remote MCP servers viaCustomToolsJson- Works through
TAiRealtimeConnectiontoo — just setDriverName := 'Grok'
uses uMakerAi.Realtime.AiConnection, uMakerAi.Realtime.Grok;
Voice := TAiRealtimeConnection.Create(nil);
Voice.DriverName := 'Grok';
Voice.ApiKey := '@GROK_API_KEY';
Voice.Language := 'es';
Voice.OnTranscriptCompleted := HandleUserText; // what the user said
Voice.OnAssistantText := HandleGrokText; // what Grok answered
Voice.OnAudioChunk := HandleGrokAudio; // Grok's voice (PCM16 24 kHz)
Voice.Connect;
// ... stream microphone audio via Voice.SendAudioChunk(Data) ...
// For file-based audio (non-continuous), close the turn explicitly:
// Voice.CommitAudio; TAiGrokRealtimeChat(Voice.Instance).CreateResponse;
cmSmartDispatch — Intelligent Chat Routing
New ChatMode value for automatic two-pass routing:
- Pass 1 — classifies the user intent and rewrites the prompt for the target capability (image generation, speech synthesis, web search, etc.)
- Pass 2 — dispatches to the appropriate bridge or tool based on classification
- Works with all existing ChatTools (
IAiImageTool,IAiSpeechTool,IAiWebSearchTool, etc.)
Models Updated (May 2026)
| Provider | New / Updated Models |
|---|---|
| OpenAI | gpt-5.4, gpt-5.4-mini, gpt-5.5, gpt-image-1 |
| Claude | claude-opus-4-7 (Adaptive Thinking), claude-sonnet-4-6, claude-haiku-4-5 |
| Gemini | gemini-3.1-pro, gemini-3-flash, gemini-3.1-flash-lite, gemini-3.1-flash-image |
| Grok | grok-4-fast, grok-3, grok-code-fast-1 |
| Mistral | magistral-medium/small, devstral, voxtral |
| Groq | llama-4-scout/maverick, kimi-k2, qwen3, compound-beta |
| Kimi | kimi-k2, kimi-k2.5, kimi-k2-thinking |
| Cohere | command-a-03-2025, command-a-reasoning, command-a-vision |
Agent Improvements
TAiAgentManager.Rundeclaredvirtual— proper subclassing now supported- jmAll join node fix —
FJoinInputscleared after each execution; eliminates premature firing on retries and loops TChatInput.EnterAsSend— new property (defaultFalse): Enter sends the prompt, Shift+Enter / Ctrl+Enter inserts a line breakTChatBubble— eliminated spurious vertical scrollbar (ShowScrollBars := False)
Bug Fixes
- Claude Opus 4.7 Adaptive Thinking — temperature, top_p, top_k and the
thinkingblock are now correctly omitted forclaude-opus-4-7models. Anthropic manages sampling internally for these models; sending these parameters caused HTTP 400 errors. RegisterDefaultParams— Max_Tokens key — corrected in 10 drivers (Claude, Gemini, Mistral, Groq, DeepSeek, Grok, Kimi, LMStudio, GenericLLM, Ollama). The wrong keyMaxTokenswas never resolved by RTTI to theMax_tokensproperty, causingMax_Tokensto be silently ignored when set viaRegisterDefaultParams.ApplyParamsToChat— locale-independent float parsing —TryStrToFloatnow tries invariant format (dot decimal) first, then falls back to the system locale. BothTemperature=0.7andTemperature=0,7are valid regardless of regional settings.
Bug Fixes (March 2026)
-
MCP concurrent tool calls — race condition (
uMakerAi.MCPClient.Core.pas): When a model responded with two or more tools from the same MCP server in a single turn,ParseChatlaunched all tool calls as parallelTTasks. SinceTMCPClientStdIoshares a single process/pipe per instance (no synchronization), concurrent calls corrupted the JSON-RPC communication, causing intermittent failures. Fixed by addingFCallLock: TCriticalSectiontoTMCPClientCustom— calls to the same server are now serialized while calls to different servers still run in parallel. -
EAggregateExceptionon tool errors — Claude driver (uMakerAi.Chat.Claude.pas): The local_CreateTaskprocedure inTAiClaudeChat.ParseChatlacked thetry/exceptpresent in the base class. Any exception raised inside a tool task (MCP timeout, network error, etc.) escaped unhandled, causingTTask.WaitForAllto wrap it in anEAggregateExceptionand crash the application. Fixed to match base class behavior: exceptions are caught, reported viaOnError, and the tool receives an error response so the conversation can continue.
🏗️ Architecture
┌──────────────────────────────────────────────────────────────────┐
│ Your Delphi Application │
└────┬──────────────────┬─────────────────┬────────────────────────┘
│ │ │
┌────▼────┐ ┌─────────▼──────────┐ ┌──▼────────────────────────┐
│ ChatUI │ │ Agents │ │ Design-Time │
│ FMX │ │ TAIAgentManager │ │ Property Editors │
│ Visual │ │ TAIBlackboard │ │ Object Inspector support │
│ Comps │ │ Checkpoint/Approve │ └───────────────────────────┘
└────┬────┘ └─────────┬──────────┘
│ │
┌────▼──────────────────▼──────────────────────────────────────────┐
│ TAiChatConnection — Universal Connector │
│ Switch provider at runtime via DriverName property │
└──────────────────────────────┬───────────────────────────────────┘
│
┌──────────────────────────────▼───────────────────────────────────┐
│ Native Provider Drivers (direct API access, full fidelity) │
│ OpenAI · Claude · Gemini · Grok · Mistral · DeepSeek · Kimi │
│ GLM · Groq · Cohere · Ollama · LM Studio · GenericLLM │
└──────────────────────────────┬───────────────────────────────────┘
│
┌─────────────────────────┼────────────────────────┐
│ │ │
┌────▼────────┐ ┌────────────▼────────┐ ┌───────────▼─────────┐
│ ChatTools │ │ RAG │ │ MCP │
│ PDF/Vision │ │ Vector (VQL) │ │ Server (HTTP/SSE │
│ Speech/STT │ │ Graph (GQL) │ │ StdIO/Direct) │
│ Web Search │ │ PostgreSQL/SQLite │ │ Client │
│ Shell │ │ HNSW · BM25 · RRF │ │ TAiFunctions bridge│
│ ComputerUse│ │ Rerank · Documents │ └─────────────────────┘
└─────────────┘ └─────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ Realtime Voice — parallel WebSocket stack │
│ TAiRealtimeConnection · OpenAI STT · Grok Voice S2S · MakerAI │
│ Pure-Pascal RFC 6455 + TLS (SChannel / OpenSSL / Android) │
└──────────────────────────────────────────────────────────────────┘
📡 Supported AI Providers
MakerAI gives you two ways to work with each provider, which you can mix freely:
Direct Provider Components
Full, provider-specific access to every API feature. Use when you need complete control:
| Component | Provider | Latest Models |
|---|---|---|
TAiOpenChat | OpenAI | gpt-6-astra, gpt-5.6-sol/-terra/-luna, gpt-5.5, gpt-image-1 |
TAiClaudeChat | Anthropic | claude-opus-5, claude-sonnet-5, claude-fable-5, claude-haiku-4-5 |
TAiGeminiChat | gemini-3.5-flash, gemini-3.6-flash, gemini-3.1-pro | |
TAiGrokChat | xAI | grok-4.3, grok-4.5, grok-build, grok-imagine (image/video) |
TAiMistralChat | Mistral AI | mistral-large/medium/small, magistral, devstral, voxtral (STT/TTS) |
TAiDeepSeekChat | DeepSeek | deepseek-flash, deepseek-v4-pro |
TAiKimiChat | Moonshot | kimi-k3, kimi-k2.7-code, kimi-k2.6 |
TAiGLMChat | GLM (Zhipu / Z.ai) | glm-4.7, glm-5.3, glm-5v-turbo, free tiers: glm-4.7-flash / glm-4.6v-flash |
TAiGroqChat | Groq | llama-3.3-70b, openai/gpt-oss-120b, qwen3.6, whisper-large-v3 |
TCohereChat | Cohere | command-a-plus, command-a-03-2025, north-mini-code |
TAiOllamaChat | Ollama | Any local model |
TAiLMStudioChat | LM Studio | Any local model |
TAiGenericChat | OpenAI-compatible | Any OpenAI-API endpoint |
Universal Connector
Provider-agnostic code. Switch models or providers by changing one property:
AiConn.DriverName := 'OpenAI';
AiConn.Model := 'gpt-5.6';
AiConn.ApiKey := '@OPENAI_API_KEY'; // resolved from environment variable
// Switch to Gemini without changing anything else
AiConn.DriverName := 'Gemini';
AiConn.Model := 'gemini-3.6-flash';
AiConn.ApiKey := '@GEMINI_API_KEY';
// Or to GLM (Zhipu / Z.ai) — glm-4.7-flash is free
AiConn.DriverName := 'GLM';
AiConn.Model := 'glm-4.7-flash';
AiConn.ApiKey := '@GLM_API_KEY';
📊 Feature Support Matrix
| Feature | OpenAI (gpt-6-astra) | Claude (5) | Gemini (3.6) | Grok (4.5) | Mistral | DeepSeek | Ollama |
|---|---|---|---|---|---|---|---|
| Text Generation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Streaming (SSE) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Function Calling | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| JSON Mode / Schema | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Image Input | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
| PDF / Files | ✅ | ✅ | ✅ | ⚠️ | ✅ | ❌ | ⚠️ |
| Image Generation | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Video Generation | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Extended Thinking | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| Speech (TTS/STT) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ⚠️ |
| Realtime Voice (WebSocket) | ✅ STT | ❌ | ⚠️ | ✅ S2S | ❌ | ❌ | ❌ |
| Web Search | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Computer Use ¹ | ✅ | ✅ | ⚠️ | ❌ | ❌ | ❌ | ❌ |
| RAG (all modes) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| MCP Client/Server | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Agents | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Legend: ✅ Native | ⚠️ Tool-Assisted bridge | ❌ Not Supported
¹ Computer Use is opt-in.
cap_ComputerUsehands the model the real mouse and keyboard, so no model enables it by default — you add the capability yourself (see the Computer Use section below). Native support: OpenAIgpt-6-astra; Claudeclaude-opus-4-8/-opus-5/-sonnet-5/-fable-5. Gemini is marked ⚠️ because the registry still points at thegemini-2.5-computer-use-previewmodel, which has not been re-verified since the 3.5/3.6 generation shipped.
🧩 Ecosystem Modules
🧠 RAG — Retrieval-Augmented Generation
Two complementary retrieval engines with their own query languages:
Vector RAG — semantic and hybrid search over document embeddings:
- HNSW index for approximate nearest-neighbor search
- BM25 lexical index for keyword matching
- Hybrid search with RRF (Reciprocal Rank Fusion) or weighted fusion
- Reranking and Lost-in-the-Middle reordering for LLM context
- VQL (Vector Query Language) — SQL-like DSL for complex retrieval queries:
MATCH documents SEARCH 'machine learning' USING HYBRID WEIGHTS(semantic: 0.7, lexical: 0.3) FUSION RRF WHERE category = 'tech' AND date > '2025-01-01' RERANK 'neural networks' WITH REGENERATE LIMIT 10 - Drivers: PostgreSQL/pgvector, SQLite, in-memory
Graph RAG — knowledge graph with semantic search over entities and relationships:
- Nodes and edges with embeddings and metadata
- MakerGQL — Graph Query Language based on ISO/IEC 39075:2024 (GQL standard):
MATCH (p:Person)-[r:WORKS_AT]->(c:Company) WHERE c.city = 'Madrid' DEPTH 2 RETURN p, r, c - Dijkstra shortest path, centrality analysis, hub detection
- Export to GraphViz DOT, GraphML (Gephi), native JSON format
- Document lifecycle management (ingest → chunk → embed → link)
🤖 Agents — Autonomous Orchestration
Graph-based multi-agent workflows with full thread safety:
TAIAgentManager— executes directed graphs of AI nodes via thread poolTAIAgentsNode— single execution unit; runs an LLM call, a tool, or custom logicTAIBlackboard— thread-safe shared state dictionary between all nodes- Link modes:
lmFanout(parallel broadcast),lmConditional(routing),lmExpression(binding),lmManual - Join modes:
jmAny(first arrival wins),jmAll(wait for all inputs) - Durable execution:
IAiCheckpointerpersists full agent state between process restarts; built-in implementations:TAiFileCheckpointer(JSON files) andTAiDatabaseCheckpointer(FireDAC — SQLite, PostgreSQL, Firebird, etc.) - Human-in-the-loop:
Node.Suspend(Reason, Context)pauses a node and saves the checkpoint;TAiWaitApprovalToolprovides a drop-in approval tool; resume withResumeThread(ThreadID, NextNode, HumanInput) - Supports any LLM provider via
TAiChatConnection
🔗 MCP — Model Context Protocol
Full dual-era implementation of the MCP standard for both consuming and exposing tools: supports the stateless spec revision 2026-07-28 (per-request _meta, server/discover, MRTR elicitation) and interoperates automatically with legacy peers that still use the initialize handshake.
MCP Server — expose Delphi functions as MCP tools, callable by any MCP client (Claude Desktop, AI agents, etc.):
- Transports: HTTP (Streamable HTTP — stateless per spec 2026-07-28), StdIO, Direct (in-process), SSE (legacy — see deprecation note below)
- Dual-era per request: modern clients are served stateless (per-request
_metaidentity +OnClientConnectvetting); legacy clients keep theinitializehandshake andMcp-Session-Idsession gating - MRTR (Multi Round-Trip Requests): tools can pause and ask the user for confirmation or data via elicitation (
resultType: "input_required"+ opaquerequestState) — working example inDemos/031-MCPServer/uTool.ConfirmDemo.pas - Bridge
TAiFunctions → IAiMCPTool— any existingTAiFunctionscomponent becomes an MCP server instantly - API Key authentication, CORS configuration
TAiMCPResponseBuilderfor structured responses (text + files + media)- RTTI-based automatic JSON Schema generation from parameter classes
MCP Client — consume any external MCP server from your Delphi app:
- Dual-era probe: tries
server/discoverfirst and falls back to the legacy handshake automatically; the negotiated mode is exposed inNegotiatedProtocol OnInputRequiredevent resolves MRTR elicitations (retry loop withrequestStateecho; assigning the handler declares theelicitationcapability)- Connect to Claude Desktop tools, filesystem servers, database tools, etc.
- Integrated into
TAiFunctionscomponent alongside native function definitions
Quick way to try TMCPClientHttp against a public MCP server — this example uses Parallel Search, a third-party commercial service (Parallel Web Systems, not affiliated with MakerAI) that exposes web_search / web_fetch tools over MCP:
var
MCPClient: TMCPClientHttp;
begin
MCPClient := TMCPClientHttp.Create(nil);
try
MCPClient.URL := 'https://search.parallel.ai/mcp';
if MCPClient.Initialize then
Writeln(MCPClient.Tools.Text);
finally
MCPClient.Free;
end;
end;
Note: at the time of writing (Aug 2026) Parallel offers a rate-limited free tier that works without an API key, but pricing, limits and availability are set by Parallel and may change at any time — check their terms before relying on it in production. Be aware that your search queries and any fetched URLs are sent to their servers. MakerAI has no relationship with this service; it is shown only as a convenient public endpoint for testing the MCP HTTP client, and any spec-compliant MCP server works the same way.
⚠️ SSE transport deprecation (spec 2026-07-28): the classic HTTP+SSE transport (GET
/sse+ POST/messages) was formally moved to Deprecated state by MCP spec revision 2026-07-28 under the project's feature-lifecycle policy, which mandates a minimum 12-month window. Its earliest possible removal from the spec is July 2027 — actual removal happens in the first spec revision published after that date, at the maintainers' discretion, and may come later. Removal deletes the transport from future spec revisions only: existing MakerAI SSE endpoints keep working between themselves, but third-party clients (Claude Desktop, official SDKs) will progressively drop it. Use the HTTP or StdIO transports for anything new. Note that SSE as a streaming response format survives inside Streamable HTTP — only the standalone HTTP+SSE transport is being retired.
🛠️ ChatTools — AI × Deterministic Capabilities
ChatTools bridge the gap between AI reasoning and real-world operations. They activate automatically based on gap analysis between SessionCaps and ModelCaps:
| Tool Interface | What it does | Implementations |
|---|---|---|
IAiPdfTool | Extract text from PDFs | Mistral OCR, Ollama OCR |
IAiVisionTool | Describe / analyze images | Any vision model |
IAiSpeechTool | Text-to-speech / speech-to-text | Whisper, Gemini Speech, OpenAI TTS |
IAiWebSearchTool | Live web search | Gemini Web Search |
IAiImageTool | Generate images | DALL-E 3, gpt-image-1, Gemini, Grok |
IAiVideoTool | Generate video | Sora, Gemini Veo |
TAiShell | Execute shell commands | Windows/Linux |
TAiTextEditorTool | Read/write/patch files | Diff-based editing |
TAiComputerUseTool | Control mouse and keyboard | Claude computer_toolset, OpenAI computer (gpt-6-astra) |
Tools follow a common pattern: SetContext(AiChat) + Execute*(). They can run standalone, as function-call bridges, or as automatic capability bridges.
🖱️ Computer Use — Driving the Desktop
TAiComputerUseTool lets a model look at the screen and drive the real mouse and
keyboard. One canonical action model is shared by every provider, so the same
executors and the same event handlers work regardless of who is driving:
// Opt-in: no model ships with cap_ComputerUse enabled
TAiChatFactory.Instance.RegisterUserParam('OpenAi', 'gpt-6-astra',
'ModelCaps', '[cap_Image, cap_Reasoning, cap_ComputerUse]');
TAiChatFactory.Instance.RegisterUserParam('OpenAi', 'gpt-6-astra',
'SessionCaps', '[cap_Image, cap_Reasoning, cap_ComputerUse]');
AiConn.ChatTools.ComputerUseTool := MyComputerUseTool; // + OnExecuteAction / OnRequestScreenshot
| Provider | Tool declared | Action shape |
|---|---|---|
OpenAI (gpt-6-astra) | computer (no parameters) | one computer_call carrying an array of actions |
| Claude (opus-4-8 / family 5) | computer_toolset_20260801 (no parameters) | 17 individually named tools, several tool_use blocks per turn |
| Gemini | computerUse (ENVIRONMENT_BROWSER) | one function call per action, coordinates normalised 0–1000 |
The two APIs refreshed in 2026 (OpenAI and Claude) converged independently on the same
design: the tool declares no screen dimensions — the model infers them from the
screenshot — and coordinates come back as pixels of the image you sent.
ScreenWidth/ScreenHeight are therefore local-only now: they must match the image you
actually submit, because that is the divisor used to translate coordinates back to
physical pixels.
- Safety:
OnSafetyConfirmationgates risky actions (human-in-the-loop); denying is the default when no handler is assigned - Executors: Windows VCL and FMX (Win32
SendInput) and Linux/X11 (TAiLinuxExecutor, xdotool + scrot), all runtime-tested. A macOS executor (CGEvent) is written but has not yet been compiled or tested on macOS. They are interchangeable: an executor is just the pair of handlers, soTAiComputerUseToolitself is platform-agnostic - Delegation: fill
ToolCall.ResponsefromOnCallToolFunctionand the driver will not execute locally — a headless process can forward the call to whoever owns a screen - Capture area:
AreaLeft/AreaTop/AreaWidth/AreaHeightselect a sub-region; multi-monitor works but is still lightly tested - Demos:
066-ComputerUseTest(Windows, real desktop —-provider=openai|claude|gemini,-prompt=...,-autorun,run.lognext to the executable),082-ComputerUsePassthru(who executes the call: delegated, missing tool, local — self-verifying, does not touch the screen) and083-ComputerUseLinux(real agentic loop on Xvfb)
🎙️ Realtime Voice — WebSocket STT & Speech-to-Speech
A parallel component stack for live audio over WebSocket, with the same universal-connector pattern as chat (TAiRealtimeConnection.DriverName):
| Driver | Type | Endpoint |
|---|---|---|
TAiOpenAiRealtimeSTT | STT only — streaming transcription (gpt-live-transcribe default) | OpenAI Realtime API |
TAiGrokRealtimeChat | Full-duplex speech-to-speech — the user talks, Grok answers with voice | xAI wss://api.x.ai/v1/realtime |
TAiMakerAiRealtimeChat | STT + LLM + TTS in one socket | MakerAI server |
TAiGeminiRealtimeSTT | STT (planned) | Gemini Live |
TAiRealtimeVoiceBase— shared base for full-duplex drivers:OnAssistantText[Delta],OnAudioChunk,OnAudioDone, on top of the STT events (OnTranscriptDelta/Completed,OnSpeechStarted/Stopped)- Voice function calling (Grok): plug a
TAiFunctionscomponent and the model invokes your Delphi functions mid-conversation - Session resumption, binary audio transport, ephemeral tokens for mobile/browser clients (Grok)
- Audio pipeline:
TAIVoiceMonitor(mic) → thread-safe PCM16 resampler → provider rate (24 kHz); push audio from any source viaSendAudioChunk - Pure-Pascal WebSocket stack (
TAiWSClient, RFC 6455) with pluggable TLS: Windows SChannel (zero DLLs), OpenSSL (Linux/macOS),javax.net.ssl(Android). The POSIX transport verifies the server certificate — chain and hostname — withInsecureSkipVerifyas an explicit opt-out
⚙️ Model Capabilities — TAiCapabilities
Introduced in v3.3 and refined in v3.4, the TAiCapabilities system replaces all manual feature flags with two declarative sets:
ModelCaps— what the model natively supports (e.g.,[cap_Image, cap_Reasoning])SessionCaps— what the session needs- Gap = SessionCaps − ModelCaps — any missing capability activates an automatic ChatTool bridge; for example, a text-only model with
cap_GenImageinSessionCapsautomatically routes image generation requests through a DALL-E or Gemini bridge
// Default capabilities for all models of a provider
TAiChatFactory.Instance.RegisterUserParam('MyProvider', 'ModelCaps', '[cap_Image, cap_Pdf]');
TAiChatFactory.Instance.RegisterUserParam('MyProvider', 'SessionCaps', '[cap_Image, cap_Pdf, cap_GenImage]');
// Per-model override (e.g., a reasoning model)
TAiChatFactory.Instance.RegisterUserParam('MyProvider', 'my-model', 'ModelCaps', '[cap_Image, cap_Reasoning]');
TAiChatFactory.Instance.RegisterUserParam('MyProvider', 'my-model', 'ThinkingLevel', 'tlMedium');
Available capabilities: cap_Image, cap_Audio, cap_Video, cap_Pdf, cap_Reasoning, cap_WebSearch, cap_GenImage, cap_GenVideo, cap_TTS, cap_STT, cap_ComputerUse
ThinkingLevel controls reasoning depth: tlLow, tlMedium, tlHigh.
🎨 FMX Visual Components
Two generations of FireMonkey components for building multimodal chat UIs:
Next-generation (v3.4) — Skia-native, virtualized, zero FMX child controls:
TAIChatView— single-canvas virtualized conversation renderer; only visible messages are painted; supports multi-message text selection, dark/light theme, context menu, long-press (mobile), copy-button feedback with timer, and a scrollbar that doesn't interfere with contentTAIChatInput— fully Skia-painted input bar with custom dropdown overlay (noTPopupMenurequired), voice-mode indicator, file attachment chips, andTAIVoiceMonitorintegration; layout adapts from 1 to N attachment chips automatically
Classic components — FMX-layout-based, simpler to subclass:
TChatList— scrollable message container with Markdown rendering, code blocks, copy buttonsTChatBubble— individual message bubble (user / assistant / tool)TChatInput— text input bar with voice recording, file attachment, and send button
Both sets are compatible with all providers and work with streaming responses.
📐 Design-Time Integration
Full Delphi IDE support via the MakerAiDsg.dpk design-time package:
DriverNameproperty shows a dropdown of all registered providers in the Object InspectorModelproperty lists all models for the selected provider- MCP Client configuration editor with transport type selection
- Embedding connection editor
- Version/About dialog
📦 Installation
git clone https://github.com/gustavoeenriquez/MakerAi.git
Step 1 — Add Library Paths
Before compiling any package, add all of these to Tools > Options > Language > Delphi > Library:
Source/Agents
Source/Chat
Source/ChatUI
Source/Core
Source/Design
Source/Embeddings
Source/MCPClient
Source/MCPServer
Source/Packages
Source/RAG
Source/Realtime
Source/Resources
Source/Tools
Source/Utils
Source/WebSocket
Step 2 — Compile and Install Packages
Compile and install in this exact order:
Source/Packages/MakerAI.dpk— Runtime core (~100 units)Source/Packages/MakerAi.RAG.Drivers.dpk— PostgreSQL/pgvector connectorSource/Packages/MakerAi.UI.dpk— FMX visual componentsSource/Packages/MakerAiDsg.dpk— Design-time editors (requires VCL + DesignIDE)
Open Source/Packages/MakerAiGrp.groupproj to compile all packages at once.
API Keys
API keys are resolved from environment variables using the @VAR_NAME convention:
AiConn.ApiKey := '@OPENAI_API_KEY'; // reads OPENAI_API_KEY from environment
AiConn.ApiKey := '@CLAUDE_API_KEY'; // reads CLAUDE_API_KEY
AiConn.ApiKey := '@GEMINI_API_KEY'; // reads GEMINI_API_KEY
AiConn.ApiKey := '@GROK_API_KEY'; // reads GROK_API_KEY (xAI chat and Grok Voice)
AiConn.ApiKey := 'sk-...'; // or set a literal key directly
Delphi Version Compatibility
| Delphi Version | Support |
|---|---|
| 10.4 Sydney | Limited (minimum supported) |
| 11 Alexandria | Full support |
| 12 Athens | Full support |
| 13 Florence | Full support |
| 13.1 Florence | Full support (latest tested) |
🗂️ Demo Projects
Open Demos/DemosVersion31.groupproj to access all demos.
| Demo | Description |
|---|---|
010-Minimalchat | Minimal chat with Ollama and TAiChatConnection |
012-ChatAllFunctions | Full-featured multimodal chat (images, audio, streaming, tools) |
012-ChatWebList | Chat with web-based content list |
021-RAG+Postgres-UpdateDB | Build a vector RAG database with PostgreSQL/pgvector |
022-1-RAG_SQLite | Lightweight vector RAG with SQLite |
023-RAGVQL | VQL query language for semantic search |
025-RAGGraph | Knowledge graph RAG with GQL queries |
026-RAGGraph-Basic | Simplified graph RAG patterns |
027-DocumentManager | Document ingestion and management |
031-MCPServer | Multi-protocol MCP server (HTTP, SSE, StdIO) |
032-MCP_StdIO_FileManager | File manager exposed via MCP StdIO |
032-MCPServerDataSnap | MCP server using DataSnap transport |
034-MCPServer_Http_FileManager | File manager via MCP HTTP |
035-MCPServerWithTAiFunctions | TAiFunctions bridge to MCP |
036-MCPServerStdIO_AiFunction | StdIO MCP server with AI functions |
041-GeminiVeo | Video generation with Google Veo |
051-AgentDemo | Visual agent graph builder and runner |
052-AgentConsole | Console-based agent execution (conditional and parallel flows) |
053-DemoAgentesTools | Agents with integrated tool use |
054-AgentCheckpointDB | Durable agent execution: suspend/resume with TAiDatabaseCheckpointer (SQLite via FireDAC) |
060-AIChatUI | Next-generation TAIChatView + TAIChatInput components — full multimodal demo |
072-A2AFederation | Agent federation over the A2A 1.0 protocol: expose a graph as an A2A agent, consume it, and delegate a local node to a remote agent (no LLM required; --otel for tracing) |
077-RagPostgresConsole | Headless vector RAG on PostgreSQL + pgvector with local Ollama embeddings — no API key. Runs on Windows and Linux64 |
082-ComputerUsePassthru | Who executes a computer_call: delegated to a remote client, missing tool, or local. Self-verifying with an exit code; never touches the screen |
083-ComputerUseLinux | Computer Use on Linux/X11 over Xvfb — the headless counterpart of 066 |
🔄 Changelog
Unreleased (on dev)
- New: Computer Use on Linux —
TAiLinuxExecutor(X11 via xdotool + scrot) covers the 19 canonical actions with the same public interface as the Windows and macOS executors. The framework needed no change:TAiComputerUseToolonly uses the RTL and delegates through its two events, so it cross-compiled to Linux64 untouched. Runtime-tested on Xvfb withgpt-6-astraandclaude-opus-4-8against a text editor and Chrome. Demo083-ComputerUseLinux, plus a repeatable setup script for a headless VPS - New: Computer Use delegation — OpenAI and Gemini now honour the framework contract (fill
ToolCall.ResponsefromOnCallToolFunctionand the driver does not execute locally), which is what lets a headless broker forward the call to a remote client. OpenAI ignoredResponseand executed anyway; Gemini never fired the event at all. For OpenAI the delegation is atomic over the batch, sincegpt-6-astrasends an array of actions that admits exactly onecomputer_call_output. Without aTAiComputerUseToolassigned the synchronous path used to emit an output with noimage_url, which the API rejects with 400; it now ends the turn and reports throughLastError. Demo082-ComputerUsePassthru - Fix: Claude sends coordinates as an array and as a string containing one, within the same turn —
"coordinate": [299, 282]in the first calls,"coordinate": "[299, 400]"later.TryGetValue<TJSONArray>does not match the second form, so the coordinate was lost and the action fell back to (0,0): a click in the screen corner, after which the model retried until the turn ran out. Affectedcoordinate,start_coordinate,region(zoom) and numeric fields ("duration": "1"), i.e. click, double/triple click, drag and zoom. Not a Linux issue — it hit Windows and macOS just the same - Fix:
TAiGeminiChatexecuted no user functions —DoCallFunctionhad itsinheritedcommented out and answered'Command <name> not found'to every non-Computer-Use tool call, and it is the driver's only dispatch point. NeitherAiFunctionsnorOnCallToolFunctionever ran. Present since before v3.3. Behaviour change: those tools now execute - Fix (security):
TOpenSSLTransportdid not validate the server certificate — it ran withSSL_VERIFY_NONE, and that is the transport the Realtime module uses on Linux and macOS. Now verifies the chain (system CA store) and the hostname viaSSL_set1_host;SSL_VERIFY_PEERon its own checks the chain but not that the certificate was issued for the host you dialed, which is the classic half-done validation. Failures carry theX509_Vcode. Verified against badssl.com 7/7 (self-signed 18, expired 10, untrusted root 19, hostname mismatch 62). Breaking: self-signed endpoints needInsecureSkipVerify := True - Fix:
TAiShelldied on the first command on any non-English Windows — output was decoded withTEncoding.UTF8.GetString, which validates and raisesEEncodingError, whilecmd.exewrites in the console OEM codepage (cp850 on a Spanish Windows) and even its banner carries accents. Invisible in English and on Linux. Also: stderr was dropped when the sentinel arrived in the same read (a failing command reported nothing), and a timeout left the session unusable for the life of the process (theRestartwas written but commented out). Documented thatTimeOutis an inactivity timeout, not a total one - Fix:
otel.scope.versionwas hardcoded to3.5with the framework on 3.7 — every span lied about which version produced it. Found while looking at the traces in a real Jaeger for the first time, which also confirmed that the trace crosses the A2A boundary (client and server spans share a trace, sotraceparentpropagation through_metaworks) - Fix: demos
031-MCPServerand077-RagPostgresConsolenow build and run on Linux64.031called the Windows API from the body of itssystem_infotool, which took the whole MCP server down outside Windows;077neededFireDAC.ConsoleUI.Waitand assumed its catalogue tables already existed. Verified end to end on Ubuntu 26.04 — which also makes FireDAC on Linux a tested path (PostgreSQL 18.6 + pgvector 0.8.1 throughlibpq.so.5) - Docs: the Realtime module needs
CheckSynchronizein console apps and services — every event is dispatched withTThread.Queue(nil, ...), so without a message loop no event ever fires, not evenOnError, while the WebSocket connects and the audio is sent
v3.7.0 (2026-09-10)
- Fix: Claude Computer Use was broken, not merely outdated — the driver still declared
computer_20251124, a tool type the Anthropic API now rejects for every model (does not match any of the expected tags). Updated tocomputer_toolset_20260801, which changed shape as well as date: it is a toolset entry taking no parameters at all (noname, nodisplay_width_px/display_height_px, noenable_zoom— the API answers "Extra inputs are not permitted") and it needs no beta header. Structurally the singlecomputertool with anactiondiscriminator was exploded into 17 individually named tools (left_click,right_click,middle_click,double_click,triple_click,left_click_drag,left_mouse_down,left_mouse_up,mouse_move,cursor_position,key,hold_key,type,scroll,wait,screenshot,zoom), so dispatch now goes bytool_use.name; Claude emits several of them per turn. Coordinates arrive as pixels of the submitted screenshot. Supported only onclaude-opus-4-8,claude-opus-5,claude-sonnet-5andclaude-fable-5— every older model lost computer use entirely. Also removedTAiClaudeChat.TranslateClaudeComputerArgs, dead private code that had silently diverged from the live translator - New: OpenAI Computer Use —
gpt-6-astra— the Responses API tool{"type":"computer"}(no parameters; it replacescomputer_use_preview, whose dedicated model was shut down on 2026-07-23 and which astra rejects). Unlike Claude and Gemini, astra sends a batch: onecomputer_callcarrying anactionsarray (e.g.keypress[WIN,r]→type "notepad"→keypress[ENTER]). The driver runs them in order and answers with a singlecomputer_call_outputholding the final screenshot, which is what the API expects percall_id— and as a side effect avoids the screenshot amplification the per-action providers suffer. Implemented on both the synchronous and the streaming paths, including history serialisation ofcomputer_call/computer_call_output. NewTAiComputerUseTool.TranslateOpenAIToolCallkeeps the canonical action model in the tool, next to the Claude translator. Runtime-tested end-to-end (screenshot → click → type → screenshot, against a real desktop) - Fix: agentic loop stalled after the first Computer Use step (OpenAI) — the synchronous continuation condition was
(last message is 'tool') and (FLastContent = ''), written for shell/patch calls, which never emit commentary. astra does emit text (phase:'commentary') in the same turn as thecomputer_call, soFLastContentwas never empty and the loop stopped after one action. Recursion is now forced when a computer call was processed - New:
gpt-6-astraregistered — 1.05M context (272K before surcharge), 128K output, vision + reasoning + tools. Note: astra acceptsxhighandmaxreasoning efforts, whichTAiThinkingLevel(tlDefault/tlLow/tlMedium/tlHigh) cannot yet express — capped attlHigh - Update: demo
066-ComputerUseTest— third provider option (OpenAI (gpt-6-astra)), command-line startup (-provider=,-prompt=,-autorun) and arun.lognext to the executable, so the loop can be exercised without touching the GUI - New: GLM driver (Zhipu AI / Z.ai) —
TAiGLMChat(DriverName='GLM',@GLM_API_KEY), OpenAI-compatible endpointhttps://api.z.ai/api/paas/v4/(mainland China via theURLproperty). The API ships with thinking ON by default — the driver controls it explicitly (cap_Reasoning→thinking:{enabled}, disabled otherwise;glm-5.3uses forced thinking and is always sent enabled);reasoning_effort(low/high/max) sent on glm-5.2/5.3 perThinkingLevel;reasoning_contentcaptured in parse and streaming and re-sent in multi-turn history (required by Z.ai). Registered models:glm-4.7(driver default),glm-4.7-flash(free),glm-4.7-flashx,glm-5.3/glm-5.2/glm-5.1/glm-5(reasoning),glm-5-turbo, and visionglm-5v-turbo/glm-4.6v(native tool calling)/glm-4.6v-flash(free)/glm-4.6v-flashx/glm-4.5v(no tools, 16K output). Sampling clamped to the Z.ai ranges (temperature [0,1], top_p [0.01,1], max_tokens ≤131072);tool_choicesupports onlyauto. Capabilities verified against the official docs; not runtime-tested yet
v3.6.0 (2026-08-02)
- New: Regression suite —
Tests/RegressionSuite/— the framework finally has an automated safety net: 17 cases covering MCP dual-era + MRTR, agent graphs, A2A 1.0 + federation, guardrails and the evals runner itself. Fully in-process (spins up its own MCP and A2A servers, plus a legacy-only MCP server to exercise the dual-era fallback), no API keys, runs in under a second. Built onTAiEvalRunner, so it doubles as the canonical usage example.--jsonwrites a CI-friendly report;--oteltraces every case as aneval.casespan - New: Guardrails —
TAiGuardrails— policy layer that intercepts every tool call before execution (the single choke point inTAiFunctions.DoCallFunction, so it covers local functions, MCP tools and AutoMCP alike). Strict allowlist and blocklist with wildcard masks, forbidden substring patterns in tool arguments, and a programmaticOnCheckToolCallveto; blocked calls never execute and the LLM receives the reason as a JSON error so it can replan.OnBlockedfor auditing,BlockedCountfor metrics, and aguardrail.blockedspan attribute. Assign viaTAiFunctions.Guardrails(opt-in, zero impact when unassigned) - New: Evals —
TAiEvalRunner— lightweight evaluation framework for AI pipelines: fluent test cases (AddCase('x').Input(...).ExpectContains(...).ExpectRegex(...).ExpectMaxLength(...)) run against a generic target function, so the same suite can evaluate aTAiChat, an agent graph, an MCP tool or an A2A agent. Deterministic checks plus optional LLM-as-judge (ExpectJudge('criteria')with aJudgechat). Reports offerToTextfor consoles andToJSONfor CI, and each case emits aneval.caseOTel span - New: A2A protocol (Agent-to-Agent, Linux Foundation) — MVP — first Delphi implementation of the A2A 1.0 spec:
TAiA2AServerexposes anyTAIAgentManagergraph as an A2A agent (Agent Card at/.well-known/agent-card.json, JSON-RPCSendMessage/GetTask/CancelTaskwith 0.x method aliases; graph suspension maps toTASK_STATE_INPUT_REQUIREDfor human-in-the-loop) andTAiA2AClientconsumes remote A2A agents (FetchAgentCard,SendText, task lifecycle). No streaming/push yet (declaredfalseper spec,UnsupportedOperationErroron streaming calls). OTel spansa2a.client/a2a.serverincluded. Agent federation:TAiA2ARemoteAgentToollets any graph node delegate its input to a remote A2A agent (assign it as the node'sTool). Runtime-tested e2e (card + SendMessage → COMPLETED + GetTask, plus a local graph federating to a remote A2A graph) - New: OpenTelemetry tracing —
TAiTelemetry(observability phase 1) — opt-in OTLP/HTTP JSON exporter (standard collector endpointlocalhost:4318; works with Jaeger, Grafana Tempo, Langfuse, Arize Phoenix). Spans follow the OpenTelemetry GenAI semantic conventions: chat turns (chat <model>withgen_ai.request.model,gen_ai.system,gen_ai.usage.input/output_tokens, sync and async), tool executions (execute_tool <name>), agent graphs (agent.graph+agent.node <name>nested across pool threads via explicit trace context), RAG retrieval (rag.searchwith top-K/results/hybrid flags), and MCP client/server requests — with W3Ctraceparentpropagated through MCP_meta(spec 2026-07-28 convention) so client and server processes share one distributed trace. Zero overhead when noTAiTelemetryinstance is enabled. Demo 031 gains an--otelflag. Runtime-tested end-to-end (27 spans, cross-process trace propagation, live OpenAI chat span with token usage) - New: MCP spec 2026-07-28 (stateless) — dual-era support — the server implements
server/discover, per-request_meta(protocol version, client identity, capabilities),resultType+serverInfoon every result,ttlMs/cacheScopecache hints on list results, and the reserved error codes-32020(HeaderMismatch) /-32022(UnsupportedProtocolVersion withdata.supported). Modern stateless requests bypass the session gate with per-requestOnClientConnectvetting; the legacyinitializehandshake +Mcp-Session-Idgating remain fully functional - New: MCP client dual-era probe —
TMCPClientStdIo/TMCPClientHttptryserver/discoverand fall back to the legacy handshake automatically (NegotiatedProtocolexposes the result); modern requests carry_metaplus theMCP-Protocol-Version/Mcp-Method/Mcp-Nameheaders; the StdIO reader now rescues JSON-RPC embedded in noisy stdout lines - New: MRTR (Multi Round-Trip Requests) — tools can request user input via elicitation: the server plumbs
params.inputResponses/params.requestStateintoTAiAuthContext; the client's newOnInputRequiredevent drives the retry loop (max 3 rounds, opaquerequestStateecho; assigning the handler declares theelicitationcapability). New demo toolconfirm_demoin031-MCPServer - Update: MCP spec alignment — deterministic
tools/list/resources/listordering (client caching + LLM prompt-cache friendly); unknown tool/resource now returns-32602Invalid Params; the 031 demo sends banners to stderr in stdio mode (stdout is protocol-only) - Note: the legacy HTTP+SSE transport is formally Deprecated by MCP spec 2026-07-28 (earliest removal from the spec: July 2027, 12-month minimum window); MakerAI keeps it as frozen legacy — prefer HTTP or StdIO for new work
v3.5.0 (2026-08-01)
- New: Typed ModelConfig channel —
ModelCaps/SessionCaps/Tool_Active/ThinkingLevelmoved out of Params/RTTI into a typed surface with per-field user pins (UserFields) and transparent compatibility migration - New: MSSQL driver for RAG Vector (FireDAC SQL Server)
- New: Agents hardening — strict JSON graph validation, public RTTI mapper
TAiToolParams,[TSecret]attribute,out_failurein conditional mode,Compileno longer clears the Blackboard - New: ChatTools single surface with
OnChangepropagation;ToolCall.ResMsgavailable in streaming; media delivered atOnReceiveDataEnd - Fix:
LastErrornow populated on every error path —DoErrorassignsFLastError, so synchronous callers can diagnose HTTP 4xx/5xx (previously empty string with no exception) - New: Grok video generation —
TAiGrokChat.InternalRunNativeVideoGenerationimplements the grok-imagine async video job (POST /videos/generations+ polling + mp4 download asTAiMediaFile), with newVideoDurationSecondsproperty; activated viacmVideoGenerationor the[cap_GenVideo]gap. Runtime-tested (image generation also verified live) - New: xAI Grok Aug 2026 — full catalog turnover:
grok-4.3(new driver default, 1M ctx, vision + always-on reasoning),grok-4.5(premium),grok-build-0.1(coding),grok-imagine-image-qualityandgrok-imagine-video-1.5registered; entire grok-3/grok-4-fast/4.1 families and grok-2 models retired with compatibility aliases (grok-3→grok-4.3, etc.). Runtime-tested 6/6 - New: Groq Aug 2026 —
qwen/qwen3.6-27bregistered (replaces retiredqwen3-32b, alias kept) plusallam-2-7b; retired entries removed (llama-4-scout,moonshotai/kimi-k2-instruct(-0905)). Fix:openai/gpt-oss-120bis text-only on Groq —cap_Imageremoved (no vision chat model on Groq currently). Runtime-tested 4/4 - New: Cohere Aug 2026 —
command-a-plus-05-2026flagship (436K ctx, vision + always-on reasoning) andnorth-mini-code-1-0registered; thinking-mode control viacap_Reasoning(blocks captured intoReasoningContent/OnReceiveThinking, non-streaming and streaming); Rerank v4.0 and tiny-aya noted; retired 8b Aya entries removed. Fix: synchronous tool-calling return was always empty (second round now reuses the sameResMsg). Runtime-tested 5/5 - New: DeepSeek V4 —
deepseek-v4-flash(new driver default) anddeepseek-v4-pro(1M ctx, 384K output); explicit thinking-mode control (cap_Reasoning+ThinkingLevel→thinking/reasoning_effort, disabled otherwise since the API defaults to thinking ON); retired aliasesdeepseek-chat/deepseek-reasonerflagged (officially sunset Jul 24, 2026). Runtime-tested 4/4 including tool calling in thinking mode - New: Kimi K3 family —
kimi-k3(new driver default, 1M ctx, vision + reasoning),kimi-k2.7-code/-highspeedandkimi-k2.6registered; retired models (kimi-k2,kimi-k2-thinking) removed and Aug 31 sunsets flagged (kimi-k2.5,moonshot-v1-*). Fix: the new family rejectstop_p(400) — removed from Kimi defaults. Runtime-tested 4/4 including K3 vision - New: Mistral Voxtral TTS —
voxtral-mini-tts-2603viaPOST /v1/audio/speech(TtsVoicefrom the/v1/audio/voicescatalog +TtsFormat); activated by the[cap_GenAudio]gap; runtime-tested. Plus OCR 4 support:OcrIncludeBlocks(paragraph-level bounding boxes) and page-range syntax - New: Gemini 3.5/3.6 family registered (
gemini-3.5-flash+gemini-flash-latestalias,gemini-3.6-flash,gemini-3.5-flash-lite), Nano Banana GA image models (gemini-3.1-flash-image,gemini-3-pro-image,gemini-3.1-flash-lite-image),gemini-omni-flash-preview(video) andgemini-embedding-2; the driver omits deprecated sampling params (temperature/topP) on the 3.5+/3.6/omni family. Veo 2.0/3.0 profiles removed (shut down by Google Jun 30) and Imagen 4.0 shutdown (Aug 17) flagged. Not runtime-tested — no Gemini API key available - New: Claude driver phase 2 —
FastMode(speed:"fast", Opus 5/4.8, research preview — requires org quota), mid-conversationsystemmessages in the history (cache-preserving on Opus 5/4.8/Fable; auto-degraded to<system-reminder>user turns elsewhere),EnableCompaction(server-side compaction with compaction-block echo),RefusalFallbackModel(server-side fallback on refusals), andaa_claude-sonnet-5-thinking/aa_claude-opus-5-thinking/aa_claude-opus-5-agentprofiles; runtime-tested 4/4 (Fast mode blocked only by org quota) - New: Claude 5 family support —
claude-opus-5,claude-sonnet-5,claude-fable-5, plusclaude-opus-4-7/claude-opus-4-8registered; the driver now sendsthinking: {type: "adaptive"}on the 4.6+ families and mapsThinkingLevel→output_config.effort(budget_tokens/sampling params return 400 on 4.7+ and are only sent on legacy models). Runtime-tested (sonnet-5, opus-4-6 adaptive, haiku legacy) - Update: Claude driver —
output_formatmigrated tooutput_config.format; web search upgraded toweb_search_20260209(dynamic filtering) on 4.6+;stop_reason: "refusal"now parsesstop_detailsand firesOnError - New:
TAiOpenAiRealtimeTranslate— streaming speech translation viagpt-realtime-translate(wss://api.openai.com/v1/realtime/translations); continuous stream without VAD/turns; emits translated text (OnAssistantTextDelta), translated TTS audio (OnAudioChunk) and optional source transcript (SourceTranscription); runtime-tested (es→en) - New: demo
071-VoiceBridgeTranslate— the 063 voice bridge refactored withTAiOpenAiRealtimeTranslate: one WebSocket per direction replaces the STT→LLM→TTS pipeline (lower latency, ~1/3 of the code) - New: GPT-5.6 family registered (
gpt-5.6-sol/-terra/-luna+gpt-5.6alias) — 1.05M ctx, vision + reasoning + tools;gpt-5.6-lunaruntime-tested - Update: Realtime session default model →
gpt-realtime-2.1(better alphanumeric recognition and noise handling) inTAiOpenAiRealtimeSTTand demos 062–064 - Update:
TAiDalle/TAiDalleImageTooldefault model →gpt-image-1— thedall-e-2/dall-e-3snapshots were deprecated by OpenAI (May 2026); both remain selectable while the API accepts them - New: OpenAI
gpt-transcribe/gpt-live-transcribe(Whisper successors, Aug 2026) —TAiOpenAiAudiogainstmGptTranscribe/tmGptLiveTranscribewithTranscriptionKeywords+TranscriptionLanguages;TAiOpenAiRealtimeSTTdefaults togpt-live-transcribewith new context props (TranscriptionPrompt,TranscriptionKeywords,Languages,LowDelay); both runtime-tested. Registry entries added - Update: VoiceBridge demos (062–065) migrated to
gpt-live-transcribeon live channels (contextual prompt + guided language autodetection); diarized channels stay ongpt-4o-transcribe-diarize(new models don't support diarization) - New:
TAiGrokRealtimeChat— xAI Grok Voice speech-to-speech driver (wss://api.x.ai/v1/realtime, OpenAI Realtime-compatible, 24 kHz PCM16); live user transcription + streamed assistant text and TTS audio; runtime-tested against the live API - New: Voice function calling for Grok Voice —
AiFunctions(TAiFunctions: local functions + MCP) declared as session tools; automatic tool round-trip (worker-thread execution,function_call_output, single continuationresponse.create);OnCallToolFunctionfallback event; runtime-tested end-to-end - New: Grok Voice extras —
EnableWebSearch/EnableXSearch(xAI server-side tools),OutputSpeed,Keyterms,PronunciationReplace,ForceMessage()(scripted TTS) - New: Grok Voice phase 3 — session resumption with turn replay (
EnableResumption+ConversationId), binary audio transport (BinaryAudio), ephemeral tokens (MintEphemeralToken+EphemeralToken),file_searchover Collections and remote MCP viaCustomToolsJson; all runtime-tested except MCP declarations - New:
TAiRealtimeVoiceBase— shared base for full-duplex voice drivers (OnAssistantText,OnAssistantTextDelta,OnAudioChunk,OnAudioDone);TAiMakerAiRealtimeChatandTAiRealtimeConnectionnow inherit from it, so voice events flow through the universal connector
v3.4 (May 2026)
- Tested with Delphi 13.1 Florence
- Selective driver registration — each driver self-registers only when imported
- New:
TAIChatView— next-generation Skia-native virtualized chat renderer (single canvas, no FMX child controls, multi-message text selection, dark/light theme, mobile long-press) - New:
TAIChatInput— fully Skia-painted input bar with custom dropdown overlay, attachment chips, voice indicator (noTPopupMenu/ no FMX buttons) - New:
TAiRealtimeConnection+TAiOpenAiRealtimeSTT— real-time STT via WebSocket (24 kHz PCM16, VAD, streaming transcription; pure-Pascal TLS via Windows SChannel) - New:
cmSmartDispatchchat mode — two-pass intelligent routing - Models: claude-opus-4-7, gpt-5.4/5.5, gemini-3.1-pro, grok-4-fast, kimi-k2, groq llama-4
- Fix: Claude Opus 4.7 Adaptive Thinking — HTTP 400 eliminated (temperature/top_p/top_k + thinking block now omitted for claude-opus-4-7)
- Fix: AV on async abort — nil guard in
TAiChatConnection.OnInternalReceiveDataEnd - Fix:
TStringStreamleak in async HTTP requests —FCurrentPostStreamlifetime now correctly tied to request completion - Fix:
RegisterDefaultParamsMax_Tokenskey corrected in 10 drivers - Fix:
ApplyParamsToChatTryStrToFloatnow locale-independent - Fix: Agent jmAll join node premature firing on retries
- Fix:
TChatBubblespurious vertical scrollbar eliminated - New:
TChatInput.EnterAsSendproperty - New:
TAiDatabaseCheckpointer— FireDAC-based checkpoint persistence; works with SQLite, PostgreSQL, Firebird, MySQL, SQL Server, and any other FireDAC driver - Fix: D11 Alexandria compatibility —
TInterlocked.Exchange(Boolean)(D12-only) replaced with Integer-based atomic;AddStream(AShareOwnership)boundary corrected toCompilerVersion >= 36;THashSet<T>boundary corrected toCompilerVersion >= 36 - Fix:
ModelCaps/SessionCapsduplicated in the Object Inspector —TAiChatpublished these at both the root level and insideModelConfig, out of sync with each other. Now there's a single source of truth (ModelConfig.ModelCaps/ModelConfig.SessionCaps); the root shortcuts still work in code but were moved out ofpublished, so the Object Inspector shows the property only once
v3.3 (February 2026)
- New
TAiCapabilitiessystem (ModelCaps/SessionCaps/ThinkingLevel) - Models updated: OpenAI gpt-5.2, Claude 4.6, Gemini 3.0, Grok 4, Mistral Magistral, DeepSeek-reasoner, Kimi k2.5
- Agents: durable execution (checkpoints), human-in-the-loop approval tool
- RAG: Graph Document management (
uMakerAi.RAG.Graph.Documents) - Fix:
reasoning_contentpreserved in multi-turn tool calls (DeepSeek, Kimi, Groq) - New:
TAiEmbeddingsConnection,TAiAudioPushStream - New demos: DocumentManager, ChatWebList
v3.2 (January 2026)
- Native ChatTools framework (
IAiPdfTool,IAiVisionTool,IAiSpeechTool, etc.) - Unified deterministic tool orchestration and capability bridges
v3.1 (November 2025)
- GPT-5.1, Gemini 3.0, Claude 4.5 initial support
- FMX multimodal UI components
- RAG Rerank + Graph RAG engine
- MCP Server framework (SSE, StdIO, HTTP)
v3.0 (October 2025)
- Major architecture redesign
- Visual FMX chat components
- Graph-based vector database
- Delphi 10.4–13 compatible (limited: 10.4 Sydney; full support: 11 Alexandria+)
v2.5 (August 2025)
- MCP Client/Server (Model Context Protocol)
- Agent graph orchestration
- Linux/POSIX full support
💬 Community & Support
- Website: https://makerai.cimamaker.com
- Manual (EN/ES): https://www.gustavoenriquez.com/book-makerai
- Telegram (Spanish): https://t.me/MakerAi_Suite_Delphi
- Telegram (English): https://t.me/MakerAi_Delphi_Suite_English
- Email: gustavoeenriquez@gmail.com
- GitHub Issues: https://github.com/gustavoeenriquez/MakerAi/issues
📜 License
MIT License — see LICENSE.txt for details.
Copyright © 2024–2026 Gustavo Enríquez — CimaMaker
Collected info
- ★ 206 stars
- ⎇ 60 forks
- Language: Pascal
- Source updated: 9/20/2026