AI: Xbot
XorMon offers its own language model for XBot, xbot-trained-v1, for installations that must not send
any data to a cloud provider.
It is Qwen3.5-9B fine-tuned on XorMon's own tools. It runs on your server in
Ollama. Ollama is only the program that runs the model; the model itself is not in
Ollama's catalog, you download it from us.
nvidia-smi must list the card) and about 25 GB of free disk space.sudo).Download xbot-trained-v1.
The download contains:
model-12m4b-q8_0.gguf: the model (9 786 060 160 bytes)Modelfile: how Ollama creates the modelxbot-warmup.json: a first request that loads XBot's instructions and its 41 tools into memorySHA256SUMS: checksumsCopy the files into one directory on the GPU server, e.g. /opt/xbot-trained-v1, and check them there:
cd /opt/xbot-trained-v1
sha256sum -c SHA256SUMS
Every line must end with OK.
If Ollama is not installed yet (see ollama.com/download):
curl -fsSL https://ollama.com/install.sh | sh
ollama --version
The installer creates the service ollama.service. The version must be 0.34.4 or newer.
Do not edit ollama.service itself: an Ollama upgrade overwrites it. Put the settings into an override file:
mkdir -p /etc/systemd/system/ollama.service.d
cat > /etc/systemd/system/ollama.service.d/override.conf <<'EOF'
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="LLAMA_ARG_CHECKPOINT_MIN_SPACING_NT=1024"
Environment="OLLAMA_GO_TEMPLATE=1"
Environment="OLLAMA_KEEP_ALIVE=-1"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
EOF
systemctl daemon-reload
systemctl restart ollama
systemctl show ollama -p Environment
The last command must print all the variables above. If it does not, the service does not use them: the model is unloaded after a while, or XBot's long instructions are cut off.
What the settings do:
OLLAMA_HOST=0.0.0.0:11434: Ollama listens on all addresses of the server, so XorMon can reach it.
Ollama has no password: anybody who reaches the port can use the model. Allow port 11434 only from the
XorMon server (see Security). If XorMon runs on the same server, use
127.0.0.1:11434 instead.LLAMA_ARG_CHECKPOINT_MIN_SPACING_NT=1024: Ollama reuses the already processed instructions between
questions instead of reading them again. Without it every question is slower.OLLAMA_GO_TEMPLATE=1: Ollama uses the template from the Modelfile. Without it, the model gets its
input in a different form than it was trained on and answers badly.OLLAMA_KEEP_ALIVE=-1: the model stays in GPU memory permanently.OLLAMA_MAX_LOADED_MODELS=1 and OLLAMA_NUM_PARALLEL=1: one copy of the model, one question
at a time. More copies do not fit into the GPU memory.OLLAMA_FLASH_ATTENTION=1 and OLLAMA_KV_CACHE_TYPE=q8_0: save GPU memory. Needed on a 16 GB
card; on a card with 24 GB or more you can leave both lines out.cd /opt/xbot-trained-v1
ollama create xbot-trained-v1 -f Modelfile
ollama list
The name must be exactly xbot-trained-v1 (a tag such as xbot-trained-v1:latest is fine).
XorMon recognises the model by this name and sends it the instructions in the form it was trained on. Under any other
name the model gets XorMon's generic instructions and answers badly.
The Modelfile sets the model's template and a context of 65 536 tokens. Do not lower the context: XBot's instructions would be cut off and the model would not see its tools.
The first question after a start is slow, because the model has to read XBot's long instructions and the descriptions of its 41 tools. A warm-up request does this right after the server starts, so the first real question is fast.
Copy the warm-up request and create the script:
install -d /usr/local/share/xbot-trained-v1
cp /opt/xbot-trained-v1/xbot-warmup.json /usr/local/share/xbot-trained-v1/
cat > /usr/local/bin/xbot-trained-v1-warmup.sh <<'EOF'
#!/bin/bash
for _ in $(seq 1 60); do
curl -sf http://127.0.0.1:11434/api/version >/dev/null && break
sleep 1
done
curl -sf http://127.0.0.1:11434/api/chat \
-H "Content-Type: application/json" \
--data-binary @/usr/local/share/xbot-trained-v1/xbot-warmup.json \
-o /var/lib/xbot-trained-v1-warmup.json
EOF
chmod 755 /usr/local/bin/xbot-trained-v1-warmup.sh
Create the service that runs it after Ollama starts:
cat > /etc/systemd/system/xbot-trained-v1-warmup.service <<'EOF'
[Unit]
Description=Warm up xbot-trained-v1 after Ollama starts
After=ollama.service
Requires=ollama.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/xbot-trained-v1-warmup.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now xbot-trained-v1-warmup.service
Check:
ollama ps
The model xbot-trained-v1 must be listed with 100% GPU, context 65536 and UNTIL
Forever. If PROCESSOR shows a CPU share, the model did not fit into the GPU memory and answers are slow.
The warm-up runs when the server starts. After you restart only Ollama, run it by hand:
systemctl restart xbot-trained-v1-warmup.service
UI ➡ Settings ➡ Application ➡ AI ➡ XBot AI Chat:
http://<gpu-server>:11434/api/chat (http://<gpu-server>:11434
works too)xbot-trained-v1Save, then press Test. The test question "How many devices does XorMon monitor?" must report that the answer matches XorMon.
ufw allow from <xormon-ip> to any port 11434 proto tcp
ufw deny 11434/tcp
Download the new files, check them with sha256sum -c SHA256SUMS, then create the model again under the
same name and warm it up:
cd /opt/xbot-trained-v1
ollama create xbot-trained-v1 -f Modelfile
systemctl restart ollama
systemctl restart xbot-trained-v1-warmup.service
Nothing changes in XorMon.
ollama ps shows a CPU share: the model does not fit into GPU memory.
Check that the two memory-saving lines are in the override file and that no other model is loaded
(ollama ps).xbot-trained-v1) and that systemctl show ollama -p Environment lists
OLLAMA_GO_TEMPLATE=1.curl http://<gpu-server>:11434/api/version. No answer means a firewall, a wrong address, or
OLLAMA_HOST set to 127.0.0.1.journalctl -u ollama; XorMon: server-nest/logs/pyxbot-agent.log
and server-nest/logs/pyxbot-agent-error.log.XorMon 2.4.0 brings significantly enhanced XBot, an AI chat built into XorMon.
You ask in plain language ("Which VMs used the most CPU yesterday?", "Show the capacity of all storage pools in TB") and XBot answers with tables, values, graphs and links to the pages in XorMon.
The AI chat and MCP run in the XBot agent, a Python service that XorMon starts next to itself (it listens only on 127.0.0.1:8610).
server-nest/logs/pyxbot-agent.log and server-nest/logs/pyxbot-agent-error.log.UI ➡ Settings ➡ Application ➡ AI ➡ XBot AI Chat: switch on "AI chat enabled", choose the provider, endpoint, API key and model, Save, then press Test (it checks that the chat can use the model).
Supported providers: Anthropic (Claude), OpenAI, Ollama (self-hosted), DeepSeek and WatsonX. The model must support tool calling.
XBot does the reading, filtering and computing in its own code. The model chooses the tools and writes the sentences. That is why a small, fast model is enough for most questions:
XorMon offers its XBot tools over the Model Context Protocol (MCP).
An AI client you already use, such as Cursor, VS Code with GitHub Copilot, Claude Code, Claude Desktop or Codex, can then ask XorMon about your infrastructure. It sees exactly what your XorMon user may see.
https://<xormon>/api/public/v1/llm/mcp. The same settings page shows it ready to copy under Client JSON.The client sends the key in the HTTP header apiKey.
About 40 tools cover objects and search, metrics, alerts and health, relations and topology, results and selections, and help. The current list with a description of every tool is in UI ➡ Settings ➡ Application ➡ AI (MCP ➡ Tools ➡ show), and every MCP client lists them after it connects.
apiKey header. This needs a certificate the client trusts, see Certificate.npx mcp-remote, it needs Node.js). Use it for Claude Desktop, and for any client while XorMon still has its default self-signed certificate.File ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):
{
"mcpServers": {
"xormon": {
"url": "https://<xormon>/api/public/v1/llm/mcp",
"headers": { "apiKey": "<your-api-key>" }
}
}
}
This is the Client JSON from the XorMon settings page. With the default self-signed certificate, put the mcp-remote form from Claude Desktop into the same file instead.
Cursor documentation: https://cursor.com/docs/mcp
File .vscode/mcp.json in the workspace, or run MCP: Open User Configuration for all workspaces. VS Code asks for the key once and keeps it out of the file:
{
"inputs": [
{ "type": "promptString", "id": "xormon-api-key", "description": "XorMon API key", "password": true }
],
"servers": {
"xormon": {
"type": "http",
"url": "https://<xormon>/api/public/v1/llm/mcp",
"headers": { "apiKey": "${input:xormon-api-key}" }
}
}
}
Use the tools in Copilot Chat in Agent mode. With the default self-signed certificate, define the server as "type": "stdio" with the command, args and env from Claude Desktop.
VS Code documentation: https://code.visualstudio.com/docs/agent-customization/mcp-servers
%USERPROFILE%\.mcp.json (all solutions) or .mcp.json in the solution folder, with the same "servers" block as for VS Code and the key written into "headers".mcp.json from the Copilot settings. The headers go under requestInit:{
"servers": {
"xormon": {
"url": "https://<xormon>/api/public/v1/llm/mcp",
"requestInit": { "headers": { "apiKey": "<your-api-key>" } }
}
}
}
Documentation: https://learn.microsoft.com/en-us/visualstudio/ide/mcp-servers and https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp/extend-copilot-chat-with-mcp (also covers Eclipse and Xcode).
claude mcp add --transport http xormon https://<xormon>/api/public/v1/llm/mcp --header "apiKey: <your-api-key>"
Check it with claude mcp list. With the default self-signed certificate, add the server through mcp-remote instead, so the setting applies to this server only:
claude mcp add --env NODE_TLS_REJECT_UNAUTHORIZED=0 --transport stdio xormon -- npx -y mcp-remote https://<xormon>/api/public/v1/llm/mcp --header apiKey:<your-api-key> --transport http-only
Claude Code documentation: https://code.claude.com/docs/en/mcp
Open UI ➡ Settings ➡ Developer ➡ Edit Config. The file is ~/Library/Application Support/Claude/claude_desktop_config.json on macOS and %APPDATA%\Claude\claude_desktop_config.json on Windows:
{
"mcpServers": {
"xormon": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://<xormon>/api/public/v1/llm/mcp",
"--header", "apiKey:<your-api-key>",
"--transport", "http-only"
],
"env": { "NODE_TLS_REJECT_UNAUTHORIZED": "0" }
}
}
}
Leave out the env line once XorMon has a trusted certificate. Then quit Claude Desktop completely and start it again. Claude's Connectors (Customize ➡ Connectors) cannot reach XorMon, see Not supported.
Documentation: https://modelcontextprotocol.io/docs/develop/connect-local-servers and https://github.com/geelen/mcp-remote
The Codex CLI and its VS Code extension share ~/.codex/config.toml:
[mcp_servers.xormon]
url = "https://<xormon>/api/public/v1/llm/mcp"
env_http_headers = { "apiKey" = "XORMON_API_KEY" }
Codex reads the key from the environment variable XORMON_API_KEY. To keep the key in the file instead, write http_headers = { "apiKey" = "<your-api-key>" }.
With the default self-signed certificate:
[mcp_servers.xormon]
command = "npx"
args = ["-y", "mcp-remote", "https://<xormon>/api/public/v1/llm/mcp", "--header", "apiKey:<your-api-key>", "--transport", "http-only"]
[mcp_servers.xormon.env]
NODE_TLS_REJECT_UNAUTHORIZED = "0"
On Windows, write command = "C:\\Program Files\\nodejs\\npx.cmd".
Codex documentation: https://learn.chatgpt.com/docs/extend/mcp?surface=cli
apiKey header.npx -y mcp-remote https://<xormon>/api/public/v1/llm/mcp --header apiKey:<your-api-key> --transport http-onlyXorMon's default certificate is self-signed and issued for localhost. A client that connects by IP address or host name refuses it.
NODE_TLS_REJECT_UNAUTHORIZED=0. This switches off certificate checking for that bridge only. Use it only in a network you trust.npx.C:\Program Files\nodejs\npx.cmd; Codex does.apiKey:<your-api-key>. Cursor, Codex and Claude Desktop on Windows break arguments that contain spaces.Cloud connectors, that is Claude Connectors (claude.ai, Customize ➡ Connectors) and ChatGPT connectors, call the server from the vendor's cloud.
A XorMon in your company network is not reachable from there, and these connectors do not offer the apiKey header.
Use a client that runs on your computer.
inputs, Codex env_http_headers.The MCP endpoint keeps its address (/api/public/v1/llm/mcp) and the apiKey header, but since 2.4.0 it serves the XBot agent's tools (about 40) instead of the 12 tools of the older built-in server.
-k skips the certificate check for this test only):curl -k -X POST https://<xormon>/api/public/v1/llm/mcp -H "apiKey: <your-api-key>" -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
A JSON list of tools means the address and the key work.
application/json and text/event-stream.claude mcp list in Claude Code; Claude Desktop writes mcp*.log to ~/Library/Logs/Claude (macOS) or %APPDATA%\Claude\logs (Windows).![]() |
![]() |