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}