llxprt.zsh

  1# SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
  2#
  3# SPDX-License-Identifier: Unlicense
  4
  5# llxprt agent definition for synu
  6# Provides model configuration for routing through Synthetic API
  7# llxprt only accepts configuration via CLI flags
  8
  9# Fallback default (used when no cache entry exists)
 10typeset -g _SYNU_LLXPRT_FALLBACK_MODEL="hf:zai-org/GLM-4.6"
 11
 12_synu_llxprt_default() {
 13    local cached
 14    cached=$(_synu_cache_get llxprt model)
 15    if [[ $? -eq 0 ]]; then
 16        echo "${cached}"
 17    else
 18        echo "${_SYNU_LLXPRT_FALLBACK_MODEL}"
 19    fi
 20}
 21
 22_synu_agent_llxprt_flags() {
 23    echo "m/model="
 24}
 25
 26_synu_agent_llxprt_configure() {
 27    local -A opts
 28
 29    # Parse flags passed from main synu
 30    while [[ $# -gt 0 ]]; do
 31        case "$1" in
 32            --model=*) opts[model]="${1#*=}" ;;
 33        esac
 34        shift
 35    done
 36
 37    # Start with default (from cache or fallback)
 38    typeset -g _SYNU_LLXPRT_SELECTED_MODEL=$(_synu_llxprt_default)
 39
 40    # Apply override if provided
 41    [[ -n "${opts[model]}" ]] && typeset -g _SYNU_LLXPRT_SELECTED_MODEL="${opts[model]}"
 42    return 0
 43}
 44
 45_synu_agent_llxprt_args() {
 46    echo --provider
 47    echo Synthetic
 48    echo --model
 49    echo "${_SYNU_LLXPRT_SELECTED_MODEL}"
 50}
 51
 52_synu_agent_llxprt_interactive() {
 53    # Check for gum
 54    if ! (( $+commands[gum] )); then
 55        print -u2 "Error: gum is required for interactive mode. Install: https://github.com/charmbracelet/gum"
 56        return 1
 57    fi
 58
 59    # Fetch available models
 60    local models_json
 61    models_json=$(gum spin --spinner dot --title "Fetching models..." -- \
 62        curl -s -H "Authorization: Bearer ${SYNTHETIC_API_KEY}" \
 63        "https://api.synthetic.new/openai/v1/models")
 64    [[ $? -ne 0 ]] && return 1
 65
 66    local -a model_names
 67    model_names=("${(@f)$(echo "${models_json}" | jq -r '.data[].name')}")
 68    [[ $? -ne 0 ]] && return 1
 69
 70    # Get current model for display
 71    local current_id=$(_synu_llxprt_default)
 72    local current_name=$(echo "${models_json}" | \
 73        jq -r --arg id "${current_id}" '.data[] | select(.id == $id) | .name // "unknown"')
 74
 75    # Select model
 76    local model_name
 77    model_name=$(printf "%s\n" "${model_names[@]}" | \
 78        gum filter --limit 1 --header "Select model for llxprt (current: ${current_name})" \
 79        --placeholder "Filter models...")
 80    [[ $? -ne 0 ]] && return 1
 81
 82
 83    local model_id
 84    model_id=$(echo "${models_json}" | \
 85        jq -r --arg name "${model_name}" '.data[] | select(.name == $name) | .id')
 86
 87
 88    if [[ -z "${model_id}" ]]; then
 89        print -u2 "Error: Could not find model ID"
 90        return 1
 91    fi
 92
 93    # Build flags
 94    local flags="--model=${model_id}"
 95
 96    # Offer to save as default
 97    if gum confirm "Save as default for 'llxprt'?"; then
 98        _synu_cache_set llxprt model "${model_id}"
 99    fi
100
101    # Output flags for caller to use
102    printf '%s\n' "${flags}"
103}