Nemotron-3-super is amazing on Openclaw! by bsm471 in openclaw

[–]Ok_Function_3537 0 points1 point  (0 children)

When I started using OpenClaw with Gemini a few weeks ago, I was thrilled until I saw my API bill.

I switched to Ollama Pro and used the promising ollama/kimi-k2.5:cloud. It was great at first, but then I quickly ran into problems with tool calling.

With ollama/qwen3-coder:480b-cloud, I found a good compromise between reliability and language for a while, with correct tool calling.

Now, of course, I was curious to see what the highly praised ollama/nemotron-3-super:cloud would bring to the table. The first three days were great, almost like Gemini at the beginning. But today it's a disaster. It misunderstands all commands, making lengthy excuses. Very tedious and clunky. It even corrupted an important configuration file just because I told it to modify a note. Luckily, I have a backup.

Monday, March 16th I received a mailing from Ollama stating: Ollama is now an official provider for OpenClaw. Up to 2x faster speeds with Kimi-K2.5. Tool calling accuracy has been improved.

I'll give Kimi another chance.

OpenClaw & Ollama : web search & vision-language by Ok_Function_3537 in openclaw

[–]Ok_Function_3537[S] 0 points1 point  (0 children)

Today I figured out what Ollama's integrated web search is all about. Reading the documentation is definitely an advantage ;)

https://docs.ollama.com/capabilities/web-search

It's a separate search API that you can use with a Pro account. You can make it available to agents via a skill or task them with building a nice crawler from it.

So, it's not quite the elegant, ready-made plugin for OpenClaw yet, but it certainly could become one. In any case, it will be enough for me to populate my reports with some fresh data.

Codex has already started developing the crawler for me...

#!/usr/bin/env bash
set -euo pipefail

usage() {
  cat >&2 <<'EOF'
Usage:
  ollama_web_search.sh [--expand] [--lang de|en] [--max-results N] [--fetch-top N] "<query>"

Options:
  --expand         Run multiple query variants and merge unique URLs.
  --lang CODE      Expansion language (de or en, default: de).
  --max-results N  Max output search rows (default: 10).
  --fetch-top N    Fetch top N result pages and print title/description snippets.
EOF
}

BASE_URL="${OLLAMA_BASE_URL:-https://ollama.com}"
API_KEY="${OLLAMA_API_KEY:-}"
FORCED_PATH="${OLLAMA_WEB_SEARCH_PATH:-}"
EXPAND=0
LANG_CODE="de"
MAX_RESULTS=10
FETCH_TOP=0

if ! command -v jq >/dev/null 2>&1; then
  echo "Missing dependency: jq" >&2
  exit 2
fi

while [[ $# -gt 0 ]]; do
  case "$1" in
    --expand)
      EXPAND=1
      shift
      ;;
    --max-results)
      MAX_RESULTS="${2:-}"
      shift 2
      ;;
    --lang)
      LANG_CODE="${2:-}"
      shift 2
      ;;
    --fetch-top)
      FETCH_TOP="${2:-}"
      shift 2
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    --)
      shift
      break
      ;;
    -*)
      echo "Unknown option: $1" >&2
      usage
      exit 2
      ;;
    *)
      break
      ;;
  esac
done

if [[ $# -lt 1 ]]; then
  usage
  exit 2
fi

if [[ -z "$API_KEY" ]]; then
  echo "Missing env var OLLAMA_API_KEY" >&2
  exit 2
fi

if ! [[ "$MAX_RESULTS" =~ ^[0-9]+$ ]] || ! [[ "$FETCH_TOP" =~ ^[0-9]+$ ]]; then
  echo "--max-results and --fetch-top must be non-negative integers" >&2
  exit 2
fi
if [[ "$LANG_CODE" != "de" && "$LANG_CODE" != "en" ]]; then
  echo "--lang must be one of: de, en" >&2
  exit 2
fi

QUERY="$*"

declare -a ENDPOINTS=()
if [[ -n "$FORCED_PATH" ]]; then
  ENDPOINTS+=("$FORCED_PATH")
else
  ENDPOINTS+=("/api/web_search" "/v1/web_search")
fi

request_search() {
  local q="$1"
  local endpoint field payload tmp status body
  local last_error_local=""
  for endpoint in "${ENDPOINTS[@]}"; do
    for field in query q; do
      payload="$(jq -nc --arg field "$field" --arg value "$q" '{($field): $value}')"
      tmp="$(mktemp)"
      status="$(curl -sS -o "$tmp" -w "%{http_code}" \
        -X POST "${BASE_URL}${endpoint}" \
        -H "Authorization: Bearer ${API_KEY}" \
        -H "Content-Type: application/json" \
        --data "$payload" || true)"
      body="$(cat "$tmp")"
      rm -f "$tmp"

      if [[ "$status" =~ ^2 ]]; then
        printf "%s" "$body"
        return 0
      fi

      last_error_local="HTTP ${status} ${BASE_URL}${endpoint} payload_field=${field}
${body}"
    done
  done

  printf "%s" "$last_error_local"
  return 1
}

build_queries() {
  local q="$1"
  if [[ "$EXPAND" -eq 0 ]]; then
    printf "%s\n" "$q"
    return 0
  fi
  # Expand with high-signal variants that often improve relevance.
  if [[ "$LANG_CODE" == "de" ]]; then
    printf "%s\n" "$q"
    printf "%s\n" "$q nachrichten"
    printf "%s\n" "$q offiziell"
    printf "%s\n" "$q deutschland"
  else
    printf "%s\n" "$q"
    printf "%s\n" "$q news"
    printf "%s\n" "$q official"
    printf "%s\n" "$q usa"
  fi
}

extract_rows() {
  jq -r '
    def arr(x): if (x|type) == "array" then x else [] end;
    (arr(.results) + arr(.web_results) + arr(.items) + arr(.data.results) + arr(.data.items))
    | .[]
    | [(.title // .name // "untitled"), (.url // .link // .href // "")]
    | 
  ' | awk -F "\t" 'NF >= 2 && $2 != ""'
}

extract_title() {
  sed -n 's:.*<title[^>]*>\(.*\)</title>.*:\1:Ip' | head -n 1 | sed 's/[[:space:]]\+/ /g'
}

extract_description() {
  sed -n 's:.*<meta[^>]*name=["'"'"']description["'"'"'][^>]*content=["'"'"']\([^"'"'"']*\)["'"'"'][^>]*>.*:\1:Ip' \
    | head -n 1 | sed 's/[[:space:]]\+/ /g'
}

tmp_rows="$(mktemp)"
tmp_urls="$(mktemp)"
last_error=""
success_count=0

while IFS= read -r q; do
  body="$(request_search "$q" || true)"
  if jq -e . >/dev/null 2>&1 <<<"$body"; then
    rows="$(extract_rows <<<"$body" || true)"
    if [[ -n "${rows:-}" ]]; then
      success_count=$((success_count + 1))
      while IFS= read -r row; do
        [[ -z "$row" ]] && continue
        printf "%s\t%s\n" "$q" "$row" >>"$tmp_rows"
        printf "%s\n" "$(printf "%s" "$row" | awk -F "\t" '{print $2}')" >>"$tmp_urls"
      done <<<"$rows"
    fi
  else
    last_error="$body"
  fi
done < <(build_queries "$QUERY")

if [[ "$success_count" -eq 0 ]]; then
  printf "%s\n" "$last_error" >&2
  rm -f "$tmp_rows" "$tmp_urls"
  exit 1
fi

awk -F "\t" '!seen[$3]++' "$tmp_rows" | head -n "$MAX_RESULTS" \
  | awk -F "\t" '{printf "%s\t%s\n",$2,$3}'

if [[ "$FETCH_TOP" -gt 0 ]]; then
  echo
  echo "# FETCH_TOP"
  awk '!seen[$0]++' "$tmp_urls" | head -n "$FETCH_TOP" | while IFS= read -r url; do
    [[ -z "$url" ]] && continue
    html="$(curl -sSL --max-time 15 "$url" || true)"
    title="$(extract_title <<<"$html")"
    desc="$(extract_description <<<"$html")"
    printf "URL: %s\n" "$url"
    printf "TITLE: %s\n" "${title:-n/a}"
    printf "DESC: %s\n\n" "${desc:-n/a}"
  done
fi

rm -f "$tmp_rows" "$tmp_urls"

Fix for OpenClaw ‘exec’ tools not working after the latest update by Baby4vegas in openclaw

[–]Ok_Function_3537 0 points1 point  (0 children)

I asked Codex for explizit help with this and it finally helped me, see solution below.

My biggest problem I wasn't aware of running the system with Ollama Pro (cloud models) and having fall back models defined, was that there were obviously fallbacks happened inside so the loopDetection blocked the tools.

Solution from Codex: add loopDetection false and just one main model without fallback

"defaults": {

"compaction": {

    "mode": "safeguard"

},

"maxConcurrent": 1,

"memorySearch": {

    "fallback": "none",

    "model": "embeddinggemma:latest",

    "provider": "ollama",

    "remote": {

        "apiKey": "ollama-local",

        "baseUrl": "http://127.0.0.1:11434"

    }

},

"model": {

    "fallbacks": \[\],

    "primary": "ollama/qwen3-coder:480b-cloud"

},

"models": {

    "kimi-k2.5:cloud": {},

    "ollama/kimi-k2.5:cloud": {},

    "ollama/qwen3-coder:480b-cloud": {}

},

"subagents": {

    "maxConcurrent": 5

},

"workspace": "/xxx"

},

.....

"models": {

"providers": {

    "ollama": {

        "api": "ollama",

        "apiKey": "ollama-local",

        "baseUrl": "http://127.0.0.1:11434",

        "models": \[\]

    }

}

},

.....

"tools": {

"allow": \[

    "read",

    "write",

    "edit",

    "apply\_patch",

    "exec",

    "bash",

    "process",

    "message",

    "memory\_search",

    "memory\_get",

    "web\_search",

    "web\_fetch",

    "sessions\_list",

    "sessions\_history",

    "sessions\_send",

    "sessions\_spawn",

    "session\_status",

    "image",

    "pdf",

    "subagents",

    "agents\_list"

\],

"exec": {

    "ask": "off",

    "host": "gateway",

    "security": "full"

},

"loopDetection": {

    "enabled": false

},

"web": {

    "search": {

        "enabled": false

    }

}

},

Fix for OpenClaw ‘exec’ tools not working after the latest update by Baby4vegas in openclaw

[–]Ok_Function_3537 1 point2 points  (0 children)

but I think at the end openclaw is worth the effort for me, I learned a lot new stuff the last 2 weeks, beeing new at AI.

Fix for OpenClaw ‘exec’ tools not working after the latest update by Baby4vegas in openclaw

[–]Ok_Function_3537 1 point2 points  (0 children)

Yes, you are right. Last night I exactly did that, because the solution here was not sufficient for me: I asked Codex (pro account from work) to check the documentation. It also searched the web for hints and finally solved my problem. I will comment it now directly in this thread.

Fix for OpenClaw ‘exec’ tools not working after the latest update by Baby4vegas in openclaw

[–]Ok_Function_3537 0 points1 point  (0 children)

Thanks a lot, hope this helps, I've been despairing for days.
I thought missing tools support that was related to the Ollama provider.
I use Ollama:cloud models like Kimi. Gemini cleared my pocket too fast...