Skip to main content

Tool Calling

A Tool Calling is a function that the LLM can invoke autonomously during a conversation to retrieve information or perform an action. Instead of relying purely on training data, the LLM calls tools to fetch live data, search indexed content, execute code, and more — then incorporates the results into its reasoning.

Turing ES includes native tools organized into categories, plus support for external tools via MCP Servers. Tools are enabled per AI Agent — each agent selects only the tools it needs.


DSL Search — 6 tools

These tools provide Elasticsearch-compatible Query DSL access to any Semantic Navigation Site. Inspired by the Elasticsearch MCP Server, they allow the LLM to build and execute full DSL queries, aggregations, and analytics — automatically translated to the site's configured search engine (Elasticsearch, Solr, or Lucene).

ToolDescription
dsl_list_indicesLists all available SN Sites with engine type, locales, and status
dsl_get_mappingsReturns field mappings (types, facets, multi-valued) in Elasticsearch format
dsl_searchExecutes a full Elasticsearch Query DSL search (40 query types, 35 aggregations)
dsl_get_documentRetrieves a document by ID with all stored fields
dsl_suggestAutocomplete suggestions and spell-check corrections
dsl_get_shardsShard/core information: document counts, engine type, endpoints, locales

How the LLM uses DSL tools

The LLM follows a pattern similar to how a developer uses the Elasticsearch API:

  1. Discoverdsl_list_indices("*") to find available sites
  2. Understand schemadsl_get_mappings("mySite") to see fields and types
  3. Searchdsl_search("mySite", "en", queryBody) with full DSL
  4. Deep divedsl_get_document("mySite", "en", "doc-123") for full content
  5. Correct typosdsl_suggest("mySite", "en", "enterprse") for corrections

The dsl_search tool

This is the most powerful tool. The queryBody parameter accepts the complete Elasticsearch _search request body as a JSON string. The LLM constructs the query based on the user's intent:

Simple search:

{"query":{"match":{"title":"machine learning"}},"size":5}

Filtered search with aggregations:

{
"query":{"bool":{"must":[{"match":{"title":"security"}}],"filter":[{"term":{"type":"article"}}]}},
"size":10,
"aggs":{"by_author":{"terms":{"field":"author","size":5}}},
"highlight":{"fields":{"title":{},"body":{}}}
}

Date range with sorting:

{
"query":{"range":{"date":{"gte":"2025-01-01"}}},
"sort":[{"date":"desc"}],
"size":20
}

Similar documents (More Like This):

{"query":{"more_like_this":{"fields":["title","body"],"like":"enterprise search platform","min_term_freq":1}}}

Facet value discovery (terms aggregation):

{"query":{"match_all":{}},"size":0,"aggs":{"categories":{"terms":{"field":"category","size":50}}}}

For the complete DSL reference, see DSL Query API and DSL Compatibility Matrix.

Prompt examples

  • "Search for documents about authentication in the Sample site"dsl_search with match query
  • "What fields can I filter by on the Sample site?"dsl_get_mappings
  • "Show me the full content of document ID abc-123"dsl_get_document
  • "How many documents do we have per content type?"dsl_search with terms aggregation
  • "Find documents similar to the article about Solr configuration"dsl_search with more_like_this
  • "What articles were updated in the last 7 days about security?"dsl_search with range + sort
  • "Compare the features of Product A and Product B"dsl_get_document called for each product
  • "What categories are available?"dsl_search with size:0 and terms aggregation
  • "How many documents per locale does the site have?"dsl_get_shards

RAG / Knowledge Base — 4 tools

These tools enable the LLM to query the Knowledge Base — files indexed from MinIO via the Assets section — using semantic similarity search.

ToolDescription
search_knowledge_baseSearches for relevant documents by semantic similarity (top 10, threshold 0.7)
knowledge_base_statsReturns statistics: total files, chunks, and storage size
list_knowledge_base_filesLists all indexed files, with optional keyword filter
get_file_from_knowledge_baseRetrieves the full indexed content of a specific file

Prompt examples:

  • "What does our internal documentation say about deployment procedures?" → triggers search_knowledge_base
  • "How many files are indexed in the knowledge base?" → triggers knowledge_base_stats
  • "Show me the full content of the file onboarding-guide.pdf" → triggers list_knowledge_base_files then get_file_from_knowledge_base

Web Crawler — 2 tools

ToolDescription
fetch_webpageFetches a web page by URL and returns its content as plain text
extract_linksExtracts all links from a web page, with optional keyword filter

Prompt examples:

  • "What does the Apache Solr documentation say about faceted search?" → triggers fetch_webpage
  • "List all links on our company blog homepage" → triggers extract_links

Finance — 2 tools

ToolDescription
get_stock_quoteCurrent price and market data for a stock ticker symbol
search_tickerLooks up a ticker symbol by company name or keyword

Prompt examples:

  • "What is the current stock price of Apple?" → triggers search_ticker then get_stock_quote
  • "Show me the market data for MSFT" → triggers get_stock_quote

Weather — 1 tool

ToolDescription
get_weatherCurrent weather and forecast for a city (1–7 day range)

Prompt examples:

  • "What's the weather forecast for São Paulo this week?" → triggers get_weather

Image Search — 1 tool

ToolDescription
search_imagesSearches the web for images and returns URLs and descriptions

Prompt examples:

  • "Find images of enterprise search architecture diagrams" → triggers search_images

DateTime — 1 tool

ToolDescription
get_current_timeReturns the current date and time for a given IANA timezone

Prompt examples:

  • "What time is it right now in Tokyo?" → triggers get_current_time

Code Interpreter — 1 tool

ToolDescription
execute_pythonExecutes Python code in a sandboxed environment and returns stdout/stderr

The Code Interpreter runs Python in an isolated sandbox directory with a 30-second execution timeout. It supports:

  • Standard output capture
  • Matplotlib chart generation (with Agg backend — no display required)
  • Automatic print() wrapping for bare expressions

The Python executable path is configured in Administration → Settings → Python Path.

Prompt examples:

  • "Calculate the compound interest on $10,000 at 5% for 10 years" → triggers execute_python
  • "Generate a bar chart showing monthly sales: Jan=100, Feb=150, Mar=120" → triggers execute_python with matplotlib

Execution modes: NATIVE vs DOCKER

You choose how Python actually runs in Console → Global Settings → Code Interpreter:

ModeWhat it isWhen to use
NATIVE (default)A host subprocess running the configured PythonTrusted content, simplest setup
DOCKEREach execution runs in a fresh, hardened containerUntrusted input, multi-tenant, defense-in-depth

DOCKER is the recommended posture when code might be influenced by untrusted input. Every execution gets a throwaway container with baseline hardening always applied — --cap-drop ALL, --no-new-privileges, --read-only, and Docker's built-in seccomp profile — plus configurable limits under turing.code-interpreter.docker.*:

KeyDefaultPurpose
networknonenone = no egress; or a named docker network
memory512mhard RAM cap per execution
cpus1.0CPU quota per execution
pids-limit128max PIDs (fork-bomb containment)
runtime(host default)set runsc for gVisor extra isolation (opt-in)
seccomp-profile(Docker default)path to a tighter seccomp profile (opt-in)

A "Check Docker" probe in Global Settings verifies the daemon is reachable before you switch.

Resource limits for the NATIVE path

DOCKER caps via the container runtime; the NATIVE path can stop a runaway script (e.g. [x*x for x in range(10**9)]) from exhausting host RAM before the timeout fires. Opt in under turing.code-interpreter.native.limits (Linux only):

turing:
code-interpreter:
native:
limits:
enabled: true # default false (timeout is the only guard)
memory-max: 1g # hard RAM cap
cpu-seconds: 35 # CPU-time cap
limiter: auto # auto | prlimit | systemd-run | none

Warm pool (NATIVE only)

A frequently-invoked tool pays a ~200ms cold-boot each call. Enable a pre-warmed pool of single-use interpreters to skip it:

turing:
code-interpreter:
warm-pool:
enabled: true # default false
size: 2 # interpreters kept booted and ready

Workers are single-use (one execution then exit — no cross-tenant state leak) and refilled asynchronously. The pool is automatically bypassed in DOCKER mode and whenever the NATIVE limits above are enabled (a pooled worker can't be wrapped by prlimit/systemd-run).

Structured output & sandbox: URLs

Beyond stdout/stderr, the interpreter can return a structured result — used by Custom Tools via the Groovy code.executePythonStructured(...) / code.executePythonJson(...) bindings. It carries stdout, stderr, an exitCode, timedOut, durationMs, a rendered markdown, and a list of generated files (name, url, image, sizeBytes). Files (a chart PNG, a generated PDF) are addressed with Turing's sandbox: URL scheme (the OpenAI convention) — clients resolve them to a real download URL, and the underlying /api/v2/code-interpreter/{session}/{file} URLs are HMAC-signed and cookie-bound so they can't be replayed across browsers. This retires the old "regex-parse the markdown for file links" approach.

Agents can also declare extra Python dependencies (e.g. reportlab matplotlib qrcode) that Turing ensures are installed before running.

Tool output feeding a slot

A Code Interpreter file can land in a multi-modal slot. Slot types IMAGE / AUDIO / FILE hold an artifact's storage URL, so a generated chart or document becomes a first-class value in a Chat Flow.


External Tools via MCP Servers

Beyond the native tools, AI Agents can access tools from any external server implementing the Model Context Protocol (MCP). This covers company-internal systems, proprietary data APIs, and the growing ecosystem of public MCP servers.

See MCP Servers for configuration details.


Provider-native server tools

The tools above are Turing's own — Turing runs them and feeds results back to the model. Separately, some vendors expose server-side built-in tools that run inside the provider's infrastructure (the model searches the web, executes code, or fetches a URL without Turing doing the work). These are selected through the capability gate, not the agent's tool list, and they coexist with Turing/MCP tools in one tool loop.

FunctionOpenAIAnthropicGemini
Web search(Google Search grounding)
Web fetch / URL context
Code execution
Image generation
Computer use
Remote MCP

Gemini's native primitives (Google Search grounding, URL Context, code execution, image generation, Computer Use — plus thinking budget, context caching, Batch, Files, full-context answering, and native video understanding) are documented in depth in Generative AI → Gemini native primitives. For how server-native and Turing tools share one loop, and the two-level gate that controls them, see Capabilities.

Long and reasoning-heavy tool loops

Two cross-vendor request options shape the tool loop itself:

  • Interleaved thinking (Anthropic) lets Claude reason between tool calls, not just before the first one — useful for multi-step agentic loops.
  • Background mode (OpenAI Responses) runs a long tool loop asynchronously and resumes by polling, so a deep code-interpreter or computer-use loop doesn't hold the HTTP connection open.

Both are opt-in and fail-open. See AI Agents → Reasoning, caching & background execution.


Large results are offloaded automatically

Some tools return a lot — a big search dump, a long catalog, a wide JSON array. Pasting all of that into the prompt every turn is wasteful. When a tool result exceeds turing.genai.tool-result-offload.inline-max-chars (default 4096), Turing writes the full payload to the Agent Workspace and replaces the inline result with a short workspace://… reference. The model pulls the data back only when it needs it, via an always-present workspace_read tool.

This applies uniformly to native, MCP, and Custom tools, and is active only when a storage backend is configured — so the default deployment behaves exactly as before. See Agent Workspace → Auto-offload for details.


PageDescription
AI AgentsHow to compose agents with the tools they need
Custom ToolsAuthor Groovy tools; the code.executePython* bindings
Chat FlowfunctionCall nodes and multi-modal slots fed by tool output
MCP ServersExtend agents with external tools via MCP
Agent WorkspaceWhere large tool results are offloaded
DSL Query APIFull reference for the Elasticsearch-compatible DSL
DSL Compatibility MatrixEngine compatibility for all DSL features
AssetsKnowledge Base files queried by RAG tools
Semantic NavigationThe search experience powering DSL tools