#!/usr/bin/env bash set -u # kein -e, damit wir Fehler selbst behandeln können # @describe Perform a web search using Tavily API to get up-to-date information or additional context. # NOTE: This tool NEVER exits with non-zero (even on missing args or curl/jq errors). It reports errors in output. # @option --query The query to search for. # @env TAVILY_API_KEY The api key # @env LLM_OUTPUT=/dev/stdout The output path OUT="${LLM_OUTPUT:-/dev/stdout}" err() { echo "ERROR: $*" >> "$OUT" exit 0 } main() { local query="${argc_query:-}" local api_key="${TAVILY_API_KEY:-}" [[ -z "$query" ]] && err "missing --query" [[ -z "$api_key" ]] && err "missing TAVILY_API_KEY" # Request (capture body + rc) local body rc body="$(curl -sS -L -X POST "https://api.tavily.com/search" \ -H "content-type: application/json" \ --data-binary "$(cat <&1)" rc=$? if [[ $rc -ne 0 ]]; then echo "ERROR: curl failed (exit_code=$rc): $body" >> "$OUT" exit 0 fi # Parse answer (capture jq errors too) local answer jq_err answer="$(printf "%s" "$body" | jq -r '.answer' 2> >(jq_err="$(cat)"; typeset -p jq_err >/dev/null) )" || true # The process substitution above is messy in some shells; use a simpler portable way: } # ---- argc parse (never fail) ---- eval "$(argc --argc-eval "$0" "$@" 2>/tmp/argc_web_search_tavily.err || true)" if [[ -s /tmp/argc_web_search_tavily.err ]]; then echo "ERROR: argc parse failed: $(cat /tmp/argc_web_search_tavily.err)" >> "$OUT" rm -f /tmp/argc_web_search_tavily.err exit 0 fi rm -f /tmp/argc_web_search_tavily.err # ---- main with portable jq handling ---- main() { local query="${argc_query:-}" local api_key="${TAVILY_API_KEY:-}" [[ -z "$query" ]] && err "missing --query" [[ -z "$api_key" ]] && err "missing TAVILY_API_KEY" local resp rc resp="$(curl -sS -L -X POST "https://api.tavily.com/search" \ -H "content-type: application/json" \ --data-binary "$(cat <&1)" rc=$? if [[ $rc -ne 0 ]]; then echo "ERROR: curl failed (exit_code=$rc): $resp" >> "$OUT" exit 0 fi # jq parse with error capture local answer jq_out jq_rc jq_out="$(printf "%s" "$resp" | jq -r '.answer' 2>&1)" jq_rc=$? if [[ $jq_rc -ne 0 ]]; then echo "ERROR: jq failed (exit_code=$jq_rc): $jq_out" >> "$OUT" # optional: dump response for debugging (capped) echo "RESPONSE:" >> "$OUT" printf "%s\n" "$resp" | head -c 20000 >> "$OUT" echo >> "$OUT" exit 0 fi # jq succeeded; write answer printf "%s\n" "$jq_out" >> "$OUT" exit 0 } main