Compare commits
109
Commits
f6fd08f966
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e8d22cb46 | ||
|
|
3bc2185962 | ||
|
|
aa9ccbfd54 | ||
|
|
444b34bd31 | ||
|
|
e996cb9ef1 | ||
|
|
5b668e97f4 | ||
|
|
4b26e1b3ae | ||
|
|
5d3040da71 | ||
|
|
be4d8cd4f6 | ||
|
|
d24381ad1e | ||
|
|
ad8b4a1663 | ||
|
|
8d01548627 | ||
|
|
f587ca1e5e | ||
|
|
bbffe8c69a | ||
|
|
768cabfe45 | ||
|
|
b1bdc953c2 | ||
|
|
1764ca510f | ||
|
|
7f986e51d3 | ||
|
|
d0970f5971 | ||
|
|
d94397349b | ||
|
|
bb1514c33d | ||
|
|
0581ea62df | ||
|
|
0332289742 | ||
|
|
a3a647318d | ||
|
|
4da671c40e | ||
|
|
4db955b32d | ||
|
|
c0a9d79776 | ||
|
|
4145a12637 | ||
|
|
c23bb1c06b | ||
|
|
a9b78dbba2 | ||
|
|
a714a26058 | ||
|
|
d15b22ec26 | ||
|
|
482d3072f5 | ||
|
|
609edd6c3b | ||
|
|
1ded62a3d4 | ||
|
|
0303a1c091 | ||
|
|
10b21ac49b | ||
|
|
7efa7f1b91 | ||
|
|
d3a5946232 | ||
|
|
46890d0d16 | ||
|
|
9073dfc597 | ||
|
|
f3d9f088c7 | ||
|
|
3c10415347 | ||
|
|
26dc61ebbf | ||
|
|
33755480bb | ||
|
|
35783422a3 | ||
|
|
d681c3f447 | ||
|
|
a31cad1f42 | ||
|
|
788a723690 | ||
|
|
6ed4f284c0 | ||
|
|
59b4343ec2 | ||
|
|
af64e47519 | ||
|
|
e2c18a5cfc | ||
|
|
556f483aaa | ||
|
|
b09e74c4b7 | ||
|
|
107afbece4 | ||
|
|
076f954abd | ||
|
|
648962e710 | ||
|
|
15370d639f | ||
|
|
eb3b16264e | ||
|
|
25346a95de | ||
|
|
d25f47bd72 | ||
|
|
9aa25f85cd | ||
|
|
b732402719 | ||
|
|
b3b2cb075f | ||
|
|
95542ec233 | ||
|
|
8abe634c42 | ||
|
|
5e0b5fb4d2 | ||
|
|
855cffc64d | ||
|
|
032239e430 | ||
|
|
57b56d82c4 | ||
|
|
bede2b84f3 | ||
|
|
4fbf7b41e4 | ||
|
|
ce1afc6624 | ||
|
|
b4fc988f97 | ||
|
|
9ab9f0095b | ||
|
|
9949014558 | ||
|
|
373b03d46c | ||
|
|
6117a65009 | ||
|
|
af82cd3319 | ||
|
|
bb1529e5b1 | ||
|
|
252d24b2a7 | ||
|
|
a997fd8efc | ||
|
|
88ec75a544 | ||
|
|
3d64b90d58 | ||
|
|
892af9a669 | ||
|
|
7661b85238 | ||
|
|
f487461d94 | ||
|
|
65ab204409 | ||
|
|
62302b3a0c | ||
|
|
4597151bbf | ||
|
|
9e75d9b981 | ||
|
|
65aeea9a93 | ||
|
|
0e1648cc31 | ||
|
|
3e53bd3c9b | ||
|
|
43dc65a84b | ||
|
|
2a7fa98825 | ||
|
|
71bcb7c351 | ||
|
|
cea7e03c11 | ||
|
|
38a04fbda1 | ||
|
|
4342b8842f | ||
|
|
ef9566c76c | ||
|
|
41f306f7d7 | ||
|
|
4c5d753b73 | ||
|
|
fcf77e22c5 | ||
|
|
75503d762b | ||
|
|
e0b1fa30f1 | ||
|
|
d7eed3c883 | ||
|
|
c341d216ad |
No files matched your search
@@ -23,6 +23,7 @@
|
|||||||
stress: stress
|
stress: stress
|
||||||
jq: jq
|
jq: jq
|
||||||
btop: btop
|
btop: btop
|
||||||
|
xkb: x11-xkb-utils
|
||||||
|
|
||||||
- name: General | Facts | Package | Parrot OS Fixes
|
- name: General | Facts | Package | Parrot OS Fixes
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
@@ -51,6 +52,7 @@
|
|||||||
encfs: encfs
|
encfs: encfs
|
||||||
dig: bind
|
dig: bind
|
||||||
base_devel: base-devel
|
base_devel: base-devel
|
||||||
|
xkb: xorg-setxkbmap
|
||||||
when: ansible_pkg_mgr == "pacman"
|
when: ansible_pkg_mgr == "pacman"
|
||||||
|
|
||||||
- name: General | Facts | Package | FreeBSD
|
- name: General | Facts | Package | FreeBSD
|
||||||
@@ -266,10 +268,14 @@
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
update_npm: |
|
update_npm: |
|
||||||
if [[ `which npm` ]]; then
|
## Let's let the distro package managers handle this, otherwise may end up
|
||||||
|
## breaking dependencies or causing other system weirdness. No thanks! :)
|
||||||
|
if [[ `which npm` && 1 == 0 ]]; then
|
||||||
echo "*** NPM ***" &&
|
echo "*** NPM ***" &&
|
||||||
sudo npm update -g
|
sudo npm update -g
|
||||||
echo -e "\n"
|
echo -e "\n"
|
||||||
|
else
|
||||||
|
echo -e "*** Skipping NPM ***\n\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Flatpaks
|
# Flatpaks
|
||||||
|
|||||||
@@ -60,7 +60,8 @@
|
|||||||
strawberry: strawberry
|
strawberry: strawberry
|
||||||
dict_en: hunspell-en_us
|
dict_en: hunspell-en_us
|
||||||
dict_es: hunspell-es_any
|
dict_es: hunspell-es_any
|
||||||
|
xset: xorg-xset
|
||||||
|
xlock: xss-lock
|
||||||
|
|
||||||
- name: Workstation | Facts | Package | apt (All Distros)
|
- name: Workstation | Facts | Package | apt (All Distros)
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
@@ -80,6 +81,7 @@
|
|||||||
ncurses: libncurses-dev
|
ncurses: libncurses-dev
|
||||||
android_udev: android-udev-rules
|
android_udev: android-udev-rules
|
||||||
vlc_plugins: libavcodec-extra
|
vlc_plugins: libavcodec-extra
|
||||||
|
xset: x11-server-utils
|
||||||
when: ansible_pkg_mgr == "apt"
|
when: ansible_pkg_mgr == "apt"
|
||||||
|
|
||||||
- name: Workstation | Facts | Package | Pop_OS!
|
- name: Workstation | Facts | Package | Pop_OS!
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ sleep 5
|
|||||||
|
|
||||||
echo "*** Creating backup at '$BACKUP2' ***"
|
echo "*** Creating backup at '$BACKUP2' ***"
|
||||||
sudo zip -rv "$BACKUP2" \
|
sudo zip -rv "$BACKUP2" \
|
||||||
/root /home /srv/sftp \
|
/root /home \
|
||||||
-x "*/.gradle/" -x "*/app/build/*"
|
-x "*/.gradle/" -x "*/app/build/*"
|
||||||
status="$?"
|
status="$?"
|
||||||
|
|
||||||
|
|||||||
@@ -13,14 +13,19 @@ restart_service() {
|
|||||||
echo "ERROR: Service name must be passed to restart_service()."
|
echo "ERROR: Service name must be passed to restart_service()."
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
sv restart $1 || echo "$1 failed to restart, ignoring."
|
sv restart $1
|
||||||
|
status=$?
|
||||||
|
if [[ $status != 0 ]]; then
|
||||||
|
echo "$1 failed to restart, returned $status."
|
||||||
|
return $status
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# While we could loop over `ollama ps` and stop them, this ensures that the UIs
|
# While we could loop over `ollama ps` and stop them, this ensures that the UIs
|
||||||
# do not sit around waiting for responses from the dead LLMs. It bring them up
|
# do not sit around waiting for responses from the dead LLMs. It bring them up
|
||||||
# in a fresh state so that work can continue from a more clean slate.
|
# in a fresh state so that work can continue from a more clean slate.
|
||||||
restart_llms() {
|
restart_llms() {
|
||||||
restart_service ollama
|
restart_service ollama || killall ollama
|
||||||
#restart_service zeroclaw
|
#restart_service zeroclaw
|
||||||
#restart_service open-webui
|
#restart_service open-webui
|
||||||
#restart_service qwen-code
|
#restart_service qwen-code
|
||||||
|
|||||||
+43
-27
@@ -27,28 +27,6 @@ font pango:monospace 8
|
|||||||
# text rendering and scalability on retina/hidpi displays (thanks to pango).
|
# text rendering and scalability on retina/hidpi displays (thanks to pango).
|
||||||
#font pango:DejaVu Sans Mono 8
|
#font pango:DejaVu Sans Mono 8
|
||||||
|
|
||||||
# Start XDG autostart .desktop files using dex. See also
|
|
||||||
# https://wiki.archlinux.org/index.php/XDG_Autostart
|
|
||||||
exec --no-startup-id dex --autostart --environment i3
|
|
||||||
|
|
||||||
# The combination of xss-lock, nm-applet and pactl is a popular choice, so
|
|
||||||
# they are included here as an example. Modify as you see fit.
|
|
||||||
|
|
||||||
# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
|
|
||||||
# screen before suspend. Use loginctl lock-session to lock your screen.
|
|
||||||
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
|
|
||||||
|
|
||||||
# NetworkManager is the most popular way to manage wireless networks on Linux,
|
|
||||||
# and nm-applet is a desktop environment-independent system tray GUI for it.
|
|
||||||
exec --no-startup-id nm-applet
|
|
||||||
|
|
||||||
# Use pactl to adjust volume in PulseAudio.
|
|
||||||
set $refresh_i3status killall -SIGUSR1 i3status
|
|
||||||
#bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
|
|
||||||
#bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
|
|
||||||
#bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
|
|
||||||
#bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
|
|
||||||
|
|
||||||
# Use Mouse+$mod to drag floating windows to their wanted position
|
# Use Mouse+$mod to drag floating windows to their wanted position
|
||||||
floating_modifier $mod
|
floating_modifier $mod
|
||||||
|
|
||||||
@@ -331,9 +309,11 @@ bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcu
|
|||||||
bindsym $mod+Shift+q exec "i3-msg exit"
|
bindsym $mod+Shift+q exec "i3-msg exit"
|
||||||
|
|
||||||
# lock
|
# lock
|
||||||
bindsym $ctrl+$alt+l exec "i3lock -c 000000 -e -f && sleep 1 && xset dpms force off"
|
#set $LOCK_CMD "i3lock -c 333333 -e -f && sleep 1 && xset dpms force off"
|
||||||
bindsym $ctrl+$mod+l exec "i3lock -c 000000 -e -f && sleep 1 && xset dpms force off"
|
set $LOCK_CMD "loginctl lock-session"
|
||||||
bindsym $shift+$mod+l exec "i3lock -c 000000 -e -f && sleep 1 && xset dpms force off"
|
bindsym $ctrl+$alt+l exec $LOCK_CMD
|
||||||
|
bindsym $ctrl+$mod+l exec $LOCK_CMD
|
||||||
|
bindsym $shift+$mod+l exec $LOCK_CMD
|
||||||
|
|
||||||
# shutdown entire system.
|
# shutdown entire system.
|
||||||
#bindsym $ctrl+$shift+q exec dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
|
#bindsym $ctrl+$shift+q exec dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
|
||||||
@@ -418,7 +398,7 @@ exec_always --no-startup-id "sleep 00; killall pipewire wireplumber pipewire-pul
|
|||||||
exec_always --no-startup-id "sleep 01; pipewire >~/Reports/pipewire.log 2>&1 &"
|
exec_always --no-startup-id "sleep 01; pipewire >~/Reports/pipewire.log 2>&1 &"
|
||||||
exec_always --no-startup-id "sleep 02; wireplumber >~/Reports/wireplumber.log 2>&1 &"
|
exec_always --no-startup-id "sleep 02; wireplumber >~/Reports/wireplumber.log 2>&1 &"
|
||||||
exec_always --no-startup-id "sleep 03; pipewire-pulse >~/Reports/pipewire-pulse.log 2>&1 &"
|
exec_always --no-startup-id "sleep 03; pipewire-pulse >~/Reports/pipewire-pulse.log 2>&1 &"
|
||||||
exec --no-startup-id "sleep 04; bash -c 'source /usr/local/bin/volume.function && volume 25'"
|
exec --no-startup-id "sleep 04; bash -c 'source /usr/local/bin/volume.function && volume 75'"
|
||||||
|
|
||||||
# Wallpaper
|
# Wallpaper
|
||||||
exec_always --no-startup-id feh --recursive --randomize --bg-fill ~/Pictures/Wallpapers
|
exec_always --no-startup-id feh --recursive --randomize --bg-fill ~/Pictures/Wallpapers
|
||||||
@@ -432,4 +412,40 @@ exec_always --no-startup-id bash -c 'pkill -ef "bash `which battery_nag.sh`" >~/
|
|||||||
# Redshift
|
# Redshift
|
||||||
#exec_always --no-startup-id "killall redshift-gtk; redshift-gtk"
|
#exec_always --no-startup-id "killall redshift-gtk; redshift-gtk"
|
||||||
#exec_always --no-startup-id "killall redshift; redshift -l 35.19540:-111.65720 -t 6500K:1100K"
|
#exec_always --no-startup-id "killall redshift; redshift -l 35.19540:-111.65720 -t 6500K:1100K"
|
||||||
exec_always --no-startup-id "killall redshift; killall redshift-gtk; sleep 1; redshift -x; redshift-gtk -l 35.19540:-111.65720 -t 6500K:1100K"
|
exec_always --no-startup-id "killall redshift; killall redshift-gtk; sleep 1; redshift -x; redshift-gtk -l 32:-111 -t 6500K:1100K"
|
||||||
|
|
||||||
|
# Allow locking the session.
|
||||||
|
#set $AGENT pkttyagent
|
||||||
|
set $AGENT lxqt-policykit-agent
|
||||||
|
exec_always --no-startup-id "killall $AGENT; $AGENT"
|
||||||
|
|
||||||
|
# Start XDG autostart .desktop files using dex. See also
|
||||||
|
# https://wiki.archlinux.org/index.php/XDG_Autostart
|
||||||
|
exec --no-startup-id dex --autostart --environment i3
|
||||||
|
|
||||||
|
# The combination of xss-lock, nm-applet and pactl is a popular choice, so
|
||||||
|
# they are included here as an example. Modify as you see fit.
|
||||||
|
|
||||||
|
# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
|
||||||
|
# screen before suspend. Use loginctl lock-session to lock your screen.
|
||||||
|
#exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
|
||||||
|
#exec_always --no-startup-id xss-lock --transfer-sleep-lock -- i3lock -c 111111 -e -f --nofork
|
||||||
|
exec_always --no-startup-id xss-lock --transfer-sleep-lock -- sh -c 'i3lock -c 111111 -e -f --nofork & sleep 1; xset dpms force off; wait'
|
||||||
|
|
||||||
|
# NetworkManager is the most popular way to manage wireless networks on Linux,
|
||||||
|
# and nm-applet is a desktop environment-independent system tray GUI for it.
|
||||||
|
exec --no-startup-id nm-applet
|
||||||
|
|
||||||
|
# Use pactl to adjust volume in PulseAudio.
|
||||||
|
set $refresh_i3status killall -SIGUSR1 i3status
|
||||||
|
#bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
|
||||||
|
#bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
|
||||||
|
#bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
|
||||||
|
#bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
|
||||||
|
|
||||||
|
# Sunset Alarm
|
||||||
|
#exec_always --no-startup-id "killall sunset-alarm; /home/ling/Code/sunset_alarm_cli/sunset-alarm -t 20:00 -m 30 > ~/Reports/sunset-alarm.log 2>&1"
|
||||||
|
exec_always --no-startup-id "killall sunset-alarm; /home/ling/Code/sunset_alarm_cli/sunset-alarm -l 32:-111 -m 30 > ~/Reports/sunset-alarm.log 2>&1"
|
||||||
|
|
||||||
|
# Bedtime ;)
|
||||||
|
exec --no-startup-id "while true; do if [[ `date +'%H'` -ge 20 ]]; then fyi -w -u critical 'Bedtime' 'Go to sleep! >:)'; fi; sleep 600; done"
|
||||||
@@ -63,8 +63,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596704,
|
"updated_at": 1792896243,
|
||||||
"created_at": 1792539937,
|
"created_at": 1792539937,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
},
|
},
|
||||||
@@ -132,8 +132,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596711,
|
"updated_at": 1792896243,
|
||||||
"created_at": 1792539958,
|
"created_at": 1792539958,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
},
|
},
|
||||||
@@ -201,8 +201,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596722,
|
"updated_at": 1792896243,
|
||||||
"created_at": 1792542461,
|
"created_at": 1792542461,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
},
|
},
|
||||||
@@ -265,8 +265,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596791,
|
"updated_at": 1792896243,
|
||||||
"created_at": 1792542993,
|
"created_at": 1792542993,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
},
|
},
|
||||||
@@ -329,8 +329,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596783,
|
"updated_at": 1792896243,
|
||||||
"created_at": 1792543028,
|
"created_at": 1792543028,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
},
|
},
|
||||||
@@ -393,80 +393,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596852,
|
"updated_at": 1792896243,
|
||||||
"created_at": 1792573569,
|
"created_at": 1792573569,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"version_id": "d5657244-5bd0-4858-bda5-24dd6c45128b",
|
|
||||||
"id": "coder-moe",
|
|
||||||
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
|
||||||
"base_model_id": "qwen3.6:35b",
|
|
||||||
"name": "Code-MoE [256k,23GB]",
|
|
||||||
"params": {
|
|
||||||
"custom_params": {},
|
|
||||||
"num_ctx": 256000,
|
|
||||||
"num_thread": 7,
|
|
||||||
"system": "Please use the attached Knowledge Base files as your personality."
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
"profile_image_url": "/static/favicon.png",
|
|
||||||
"background_image_url": null,
|
|
||||||
"description": null,
|
|
||||||
"i18n": null,
|
|
||||||
"capabilities": {
|
|
||||||
"file_context": true,
|
|
||||||
"vision": true,
|
|
||||||
"file_upload": true,
|
|
||||||
"web_search": true,
|
|
||||||
"image_generation": true,
|
|
||||||
"code_interpreter": true,
|
|
||||||
"terminal": true,
|
|
||||||
"citations": true,
|
|
||||||
"status_updates": true,
|
|
||||||
"usage": true,
|
|
||||||
"memory": true,
|
|
||||||
"builtin_tools": true
|
|
||||||
},
|
|
||||||
"knowledge": [
|
|
||||||
{
|
|
||||||
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
|
||||||
"name": "Base.md",
|
|
||||||
"type": "file"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "fbcfabac-d48f-49e2-a7a7-73375448dd89",
|
|
||||||
"name": "Coder.md",
|
|
||||||
"type": "file"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "975690ae-5ddb-4e56-aef1-21f5f73ed74f",
|
|
||||||
"name": "Quick.md",
|
|
||||||
"type": "file"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"voice": null,
|
|
||||||
"voice_avatar": null,
|
|
||||||
"suggestion_prompts": null,
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"name": "code"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe",
|
|
||||||
"defaultFeatureIds": [
|
|
||||||
"web_search",
|
|
||||||
"image_generation",
|
|
||||||
"code_interpreter"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"access_grants": [],
|
|
||||||
"is_active": true,
|
|
||||||
"updated_at": 1792596766,
|
|
||||||
"created_at": 1792596052,
|
|
||||||
"background_image_data": null
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"version_id": "8fef2e35-68b2-4b68-a90f-69f66cd07782",
|
"version_id": "8fef2e35-68b2-4b68-a90f-69f66cd07782",
|
||||||
"id": "coder-architect",
|
"id": "coder-architect",
|
||||||
@@ -531,8 +462,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596744,
|
"updated_at": 1792896243,
|
||||||
"created_at": 1792573569,
|
"created_at": 1792573569,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
},
|
},
|
||||||
@@ -595,22 +526,23 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596774,
|
"updated_at": 1792896243,
|
||||||
"created_at": 1792573569,
|
"created_at": 1792573569,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"version_id": "94031db1-bb29-4c2e-b8ca-540750c33ce9",
|
"version_id": "a6fd32f5-a499-4358-8eb6-8601b9a4d4f3",
|
||||||
"id": "language-moe",
|
"id": "language-moe",
|
||||||
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
"base_model_id": "qwen3.5:35b",
|
"base_model_id": "qwen3.5:35b",
|
||||||
"name": "Lang-MoE [256k,28GB]",
|
"name": "Lang-MoE [7-256K,28GB]",
|
||||||
"params": {
|
"params": {
|
||||||
"system": "Please use the attached Knowledge Base files as your personality.",
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
"custom_params": {},
|
"custom_params": {},
|
||||||
"num_thread": 7,
|
"num_thread": 7,
|
||||||
"num_ctx": 64000
|
"num_ctx": 999999,
|
||||||
|
"compact_token_threshold": 16000
|
||||||
},
|
},
|
||||||
"meta": {
|
"meta": {
|
||||||
"profile_image_url": "/static/favicon.png",
|
"profile_image_url": "/static/favicon.png",
|
||||||
@@ -659,9 +591,715 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"access_grants": [],
|
"access_grants": [],
|
||||||
"is_active": true,
|
"is_active": false,
|
||||||
"updated_at": 1792596751,
|
"updated_at": 1792949676,
|
||||||
"created_at": 1792595834,
|
"created_at": 1792595834,
|
||||||
"background_image_data": null
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "cff6fd12-f6a8-4a27-b34e-e966d90b4bff",
|
||||||
|
"id": "coder-moe",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.6:35b",
|
||||||
|
"name": "Code-MoE [7-256K,24GB]",
|
||||||
|
"params": {
|
||||||
|
"custom_params": {},
|
||||||
|
"num_ctx": 999999,
|
||||||
|
"num_thread": 7,
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"compact_token_threshold": 64000
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "fbcfabac-d48f-49e2-a7a7-73375448dd89",
|
||||||
|
"name": "Coder.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "code"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe",
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation",
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": false,
|
||||||
|
"updated_at": 1792949675,
|
||||||
|
"created_at": 1792596052,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "ce2ae15a-6804-4c63-9f3b-6634f8bf3806",
|
||||||
|
"id": "coder-moe-64k",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.6:35b",
|
||||||
|
"name": "Code [MoE,4-64k,22GB]",
|
||||||
|
"params": {
|
||||||
|
"custom_params": {},
|
||||||
|
"num_ctx": 64000,
|
||||||
|
"num_thread": 4,
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"compact_token_threshold": 48000,
|
||||||
|
"keep_alive": "0"
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "fbcfabac-d48f-49e2-a7a7-73375448dd89",
|
||||||
|
"name": "Coder.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "code"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe",
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation",
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": true,
|
||||||
|
"updated_at": 1793407717,
|
||||||
|
"created_at": 1792798618,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "2108d3b5-bcc0-458a-abdf-70ed01b9a07e",
|
||||||
|
"id": "code-moe-4-32ktbd-clone",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.6:35b",
|
||||||
|
"name": "Code-MoE [4-32k,TBD]",
|
||||||
|
"params": {
|
||||||
|
"custom_params": {},
|
||||||
|
"num_ctx": 64000,
|
||||||
|
"num_thread": 4,
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"compact_token_threshold": 24000
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "fbcfabac-d48f-49e2-a7a7-73375448dd89",
|
||||||
|
"name": "Coder.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "code"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe",
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation",
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": false,
|
||||||
|
"updated_at": 1792949674,
|
||||||
|
"created_at": 1792896286,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "f7b2b0c3-6461-492c-b5e5-42586a381e94",
|
||||||
|
"id": "code-moe-128k",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.6:35b",
|
||||||
|
"name": "Code-MoE [4-128k,TBD]",
|
||||||
|
"params": {
|
||||||
|
"custom_params": {},
|
||||||
|
"num_ctx": 128000,
|
||||||
|
"num_thread": 4,
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"compact_token_threshold": 96000,
|
||||||
|
"keep_alive": "0"
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "fbcfabac-d48f-49e2-a7a7-73375448dd89",
|
||||||
|
"name": "Coder.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "code"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe",
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation",
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": true,
|
||||||
|
"updated_at": 1793407741,
|
||||||
|
"created_at": 1792896373,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "592740ae-99a1-4534-b8e1-97338424d720",
|
||||||
|
"id": "code-moe-256k",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.6:35b",
|
||||||
|
"name": "Code-MoE [4-256K,24GB]",
|
||||||
|
"params": {
|
||||||
|
"custom_params": {},
|
||||||
|
"num_ctx": 999999,
|
||||||
|
"num_thread": 4,
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"compact_token_threshold": 192000,
|
||||||
|
"keep_alive": "0"
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "fbcfabac-d48f-49e2-a7a7-73375448dd89",
|
||||||
|
"name": "Coder.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "code"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe",
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation",
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": true,
|
||||||
|
"updated_at": 1793407763,
|
||||||
|
"created_at": 1792896428,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "0ee081d0-303d-480b-ae05-00abc9394503",
|
||||||
|
"id": "lang-moe-64k",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.5:35b",
|
||||||
|
"name": "Lang [MoE,4-64K,23GB]",
|
||||||
|
"params": {
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"custom_params": {},
|
||||||
|
"num_thread": 4,
|
||||||
|
"num_ctx": 64000,
|
||||||
|
"compact_token_threshold": 48000
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bb929f41-18c0-4177-8139-fabfde2b8235",
|
||||||
|
"name": "Language.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "language"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "general"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation",
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": false,
|
||||||
|
"updated_at": 1792988150,
|
||||||
|
"created_at": 1792899998,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "11892bd5-5049-45e8-a13e-bd2678ff584c",
|
||||||
|
"id": "lang-moe-256k",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.5:35b",
|
||||||
|
"name": "Lang-MoE [4-256K,28GB]",
|
||||||
|
"params": {
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"custom_params": {},
|
||||||
|
"num_thread": 4,
|
||||||
|
"num_ctx": 999000,
|
||||||
|
"compact_token_threshold": 16000
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bb929f41-18c0-4177-8139-fabfde2b8235",
|
||||||
|
"name": "Language.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "language"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe",
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation",
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": false,
|
||||||
|
"updated_at": 1792984275,
|
||||||
|
"created_at": 1792949420,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "b41d4794-2f89-48a9-8f74-fbc7732f7c4a",
|
||||||
|
"id": "tasks",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.5:4b",
|
||||||
|
"name": "Tasks [4b,4-32k,2.6GB]",
|
||||||
|
"params": {
|
||||||
|
"custom_params": {},
|
||||||
|
"num_ctx": 32000,
|
||||||
|
"num_thread": 4,
|
||||||
|
"compact_token_threshold": 16000,
|
||||||
|
"system": "Please used the attached Knowledge Base files as your personality."
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "general"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": false,
|
||||||
|
"updated_at": 1792988777,
|
||||||
|
"created_at": 1792977834,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "d3edb3bc-8097-4d68-aa7c-3986fb2e6224",
|
||||||
|
"id": "tasks-2b",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.5:2b",
|
||||||
|
"name": "Tasks [2b,4-16k,2.6GB]",
|
||||||
|
"params": {
|
||||||
|
"custom_params": {},
|
||||||
|
"num_ctx": 16000,
|
||||||
|
"num_thread": 4,
|
||||||
|
"compact_token_threshold": 8000,
|
||||||
|
"system": "Please used the attached Knowledge Base files as your personality."
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "general"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"code_interpreter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": false,
|
||||||
|
"updated_at": 1792988758,
|
||||||
|
"created_at": 1792987029,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "769e5084-3641-4c5c-90d9-0c58f0658227",
|
||||||
|
"id": "lang-32k",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.5:35b",
|
||||||
|
"name": "Lang [MoE,4-32K,22GB]",
|
||||||
|
"params": {
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"custom_params": {},
|
||||||
|
"num_thread": 4,
|
||||||
|
"num_ctx": 32000,
|
||||||
|
"compact_token_threshold": 24000,
|
||||||
|
"keep_alive": "0"
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bb929f41-18c0-4177-8139-fabfde2b8235",
|
||||||
|
"name": "Language.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "language"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "general"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": true,
|
||||||
|
"updated_at": 1793370109,
|
||||||
|
"created_at": 1792988144,
|
||||||
|
"background_image_data": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version_id": "4ce3e85b-2d53-4605-a9c9-e370715c813a",
|
||||||
|
"id": "lang-16k",
|
||||||
|
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
|
||||||
|
"base_model_id": "qwen3.5:35b",
|
||||||
|
"name": "Lang [MoE,4-16K,TBD]",
|
||||||
|
"params": {
|
||||||
|
"system": "Please use the attached Knowledge Base files as your personality.",
|
||||||
|
"custom_params": {},
|
||||||
|
"num_thread": 4,
|
||||||
|
"num_ctx": 16000,
|
||||||
|
"compact_token_threshold": 10000,
|
||||||
|
"keep_alive": "0"
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"profile_image_url": "/static/favicon.png",
|
||||||
|
"background_image_url": null,
|
||||||
|
"description": null,
|
||||||
|
"i18n": null,
|
||||||
|
"capabilities": {
|
||||||
|
"file_context": true,
|
||||||
|
"vision": true,
|
||||||
|
"file_upload": true,
|
||||||
|
"web_search": true,
|
||||||
|
"image_generation": true,
|
||||||
|
"code_interpreter": true,
|
||||||
|
"terminal": true,
|
||||||
|
"citations": true,
|
||||||
|
"status_updates": true,
|
||||||
|
"usage": true,
|
||||||
|
"memory": true,
|
||||||
|
"builtin_tools": true
|
||||||
|
},
|
||||||
|
"knowledge": [
|
||||||
|
{
|
||||||
|
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
|
||||||
|
"name": "Base.md",
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bb929f41-18c0-4177-8139-fabfde2b8235",
|
||||||
|
"name": "Language.md",
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"voice": null,
|
||||||
|
"voice_avatar": null,
|
||||||
|
"suggestion_prompts": null,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "language"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "general"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defaultFeatureIds": [
|
||||||
|
"web_search",
|
||||||
|
"image_generation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"access_grants": [],
|
||||||
|
"is_active": true,
|
||||||
|
"updated_at": 1793407973,
|
||||||
|
"created_at": 1793407973,
|
||||||
|
"background_image_data": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
"update.showReleaseNotes": false,
|
"update.showReleaseNotes": false,
|
||||||
"workbench.startupEditor": "none",
|
"workbench.startupEditor": "none",
|
||||||
"git.confirmSync": false,
|
"git.confirmSync": false,
|
||||||
|
"workbench.editor.openPositioning": "last",
|
||||||
|
|
||||||
"editor.rulers": [
|
"editor.rulers": [
|
||||||
80, 120, 200,
|
80, 120, 200,
|
||||||
|
|||||||
@@ -129,7 +129,9 @@
|
|||||||
|
|
||||||
- ansible.builtin.include_tasks: tasks/workstation/linux/software/android.yml
|
- ansible.builtin.include_tasks: tasks/workstation/linux/software/android.yml
|
||||||
|
|
||||||
- ansible.builtin.include_tasks: tasks/workstation/linux/software/llm.yml
|
- ansible.builtin.include_tasks: tasks/workstation/linux/software/docker.yml
|
||||||
|
|
||||||
|
- ansible.builtin.include_tasks: tasks/workstation/linux/software/ai/llm.yml
|
||||||
|
|
||||||
when: ansible_system == "Linux"
|
when: ansible_system == "Linux"
|
||||||
and internet
|
and internet
|
||||||
|
|||||||
@@ -124,9 +124,14 @@
|
|||||||
when: user_user.home != "" and coding
|
when: user_user.home != "" and coding
|
||||||
|
|
||||||
- name: General | Account Management | Users | Home Permissions
|
- name: General | Account Management | Users | Home Permissions
|
||||||
ansible.builtin.shell: "chmod 700 {{ user_user.home }}/../*"
|
ansible.builtin.shell: "{{ item }}"
|
||||||
register: shell_check
|
register: shell_check
|
||||||
changed_when: shell_check.rc == 0
|
changed_when: shell_check.rc == 0
|
||||||
|
loop:
|
||||||
|
- "chmod 700 {{ user_user.home }}/../*"
|
||||||
|
- "chown {{ user }}:{{ user }} {{ user_user.home }}"
|
||||||
|
- "chown {{ user }}:{{ user }} {{ user_user.home }}/*"
|
||||||
|
- "chown {{ user }}:{{ user }} {{ user_user.home }}/.*"
|
||||||
|
|
||||||
|
|
||||||
## Files ##
|
## Files ##
|
||||||
@@ -794,14 +799,25 @@
|
|||||||
alias_prod: |
|
alias_prod: |
|
||||||
alias prod="ssh -p {{ prod_port }} {{ prod_user }}@{{ prod_host }}"
|
alias prod="ssh -p {{ prod_port }} {{ prod_user }}@{{ prod_host }}"
|
||||||
function_clean_code: |
|
function_clean_code: |
|
||||||
|
function print_size_delete() {
|
||||||
|
f="$1"
|
||||||
|
if [[ -e "$f" ]]; then
|
||||||
|
du -hs "$f" && sh -c "rm -rf '$f'"
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
function clean-code() {
|
function clean-code() {
|
||||||
echo -e "******* Android *******\n*** Build Caches ***"
|
echo -e "******* Android *******\n*** Build Caches ***"
|
||||||
find $HOME/Code/android-*/app -maxdepth 1 -type d -name "build" \
|
find $HOME/Code/android-*/app -maxdepth 1 -type d -name "build" \
|
||||||
-exec du -hs {} \; -exec rm -rf {} \;
|
-exec du -hs {} \; -exec rm -rf {} \;
|
||||||
|
|
||||||
echo -e "\n*** Gradle Caches ***"
|
echo -e "\n*** Gradle Caches ***"
|
||||||
find $HOME/Code/android-*/ -maxdepth 1 -type d -name ".gradle" \
|
find $HOME/Code/android-*/ -maxdepth 1 -type d -name ".gradle" \
|
||||||
-exec du -hs {} \; -exec rm -rf {} \;
|
-exec du -hs {} \; -exec rm -rf {} \;
|
||||||
|
|
||||||
|
print_size_delete "$HOME/.gradle"
|
||||||
|
mkdir "$HOME/.gradle"
|
||||||
|
|
||||||
echo -e "******* Flutter *******"
|
echo -e "******* Flutter *******"
|
||||||
ls $HOME/Code | grep flutter | while read project; do
|
ls $HOME/Code | grep flutter | while read project; do
|
||||||
cd $HOME/Code/$project
|
cd $HOME/Code/$project
|
||||||
@@ -811,6 +827,10 @@
|
|||||||
done
|
done
|
||||||
cd
|
cd
|
||||||
|
|
||||||
|
print_size_delete "$HOME/.pub_cache"
|
||||||
|
print_size_delete "$HOME/.pub-cache"
|
||||||
|
mkdir "$HOME/.pub-cache"
|
||||||
|
|
||||||
echo -e "******* PDFs *******"
|
echo -e "******* PDFs *******"
|
||||||
find $HOME/Code/ebook-* -name "*.pdf" -exec du -h {} \; -delete | sort -h
|
find $HOME/Code/ebook-* -name "*.pdf" -exec du -h {} \; -delete | sort -h
|
||||||
|
|
||||||
@@ -1245,7 +1265,7 @@
|
|||||||
function restart() {
|
function restart() {
|
||||||
prog="$1"
|
prog="$1"
|
||||||
sudo sv restart $prog
|
sudo sv restart $prog
|
||||||
follow /var/log/$prog/current
|
tail -n 0 -F /var/log/$prog/current
|
||||||
}
|
}
|
||||||
alias reload="restart "
|
alias reload="restart "
|
||||||
|
|
||||||
@@ -1402,6 +1422,7 @@
|
|||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: "{{ user_user.home }}/{{ item }}"
|
path: "{{ user_user.home }}/{{ item }}"
|
||||||
owner: "{{ user }}"
|
owner: "{{ user }}"
|
||||||
|
group: "{{ user }}"
|
||||||
mode: '0755'
|
mode: '0755'
|
||||||
loop:
|
loop:
|
||||||
- .bashrc
|
- .bashrc
|
||||||
|
|||||||
@@ -17,10 +17,30 @@
|
|||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
tunnel_service_name: tunnel
|
tunnel_service_name: tunnel
|
||||||
|
|
||||||
|
- name: General | Tunnel | Packages [pacman]
|
||||||
|
ansible.builtin.package:
|
||||||
|
name:
|
||||||
|
- openbsd-netcat
|
||||||
|
state: present
|
||||||
|
when: ansible_pkg_mgr == "pacman"
|
||||||
|
|
||||||
|
- name: General | Tunnel | Packages [apt]
|
||||||
|
ansible.builtin.package:
|
||||||
|
name:
|
||||||
|
- netcat-openbsd
|
||||||
|
state: present
|
||||||
|
when: ansible_pkg_mgr == "apt"
|
||||||
|
|
||||||
- name: General | Tunnel | runit
|
- name: General | Tunnel | runit
|
||||||
block:
|
block:
|
||||||
|
|
||||||
- name: General | Tunnel | runit | mkdir | /etc/sv
|
- name: General | Tunnel | runit | mkdir | /etc/sv
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/sv/{{ tunnel_service_name }}
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: General | Tunnel | runit | mkdir | /etc/sv log
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: /etc/sv/{{ tunnel_service_name }}/log
|
path: /etc/sv/{{ tunnel_service_name }}/log
|
||||||
state: directory
|
state: directory
|
||||||
@@ -38,7 +58,23 @@
|
|||||||
content: |
|
content: |
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
exec 2>&1
|
exec 2>&1
|
||||||
exec chpst -u {{ user }} ssh -v -N \
|
|
||||||
|
# Health check to ensure connection does not go stale.
|
||||||
|
while true; do
|
||||||
|
sleep 300
|
||||||
|
echo -n "RUN-LOOP: "
|
||||||
|
nc -zv {{ tunnel_remote_host }} {{ tunnel_remote_port }}
|
||||||
|
status="$?"
|
||||||
|
echo "RUN-LOOP: Port check returned ${status}."
|
||||||
|
if [[ "$status" != 0 ]]; then
|
||||||
|
echo "RUN-LOOP: Restarting service."
|
||||||
|
sv restart {{ tunnel_service_name }}
|
||||||
|
fi
|
||||||
|
echo "RUN-LOOP: Going back to sleep."
|
||||||
|
done &
|
||||||
|
|
||||||
|
# Do not use `exec` here otherwise the loop may get killed.
|
||||||
|
chpst -u {{ user }} ssh -v -N \
|
||||||
-R {{ tunnel_remote_port }}:localhost:{{ tunnel_local_port }} \
|
-R {{ tunnel_remote_port }}:localhost:{{ tunnel_local_port }} \
|
||||||
-p {{ tunnel_ssh_port }} {{ tunnel_remote_host }}
|
-p {{ tunnel_ssh_port }} {{ tunnel_remote_host }}
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|||||||
@@ -1,31 +1,78 @@
|
|||||||
---
|
---
|
||||||
# Cross-platform package management.
|
# Cross-platform package management.
|
||||||
|
|
||||||
- name: General | Software | Packages | Fix Parrot OS (zypper)
|
- name: General | Software | Packages | Fix Parrot OS
|
||||||
|
block:
|
||||||
|
|
||||||
|
- name: General | Software | Packages | Fix Parrot OS | zypper
|
||||||
# They have zypper higher in the path, but it's really apt renamed.
|
# They have zypper higher in the path, but it's really apt renamed.
|
||||||
# Probably for "security", but package module does not use the ansible_pkg_mgr variable
|
# Probably for "security", but package module does not use the ansible_pkg_mgr variable
|
||||||
# so resetting the value to apt doesn't work. Just going to move it.
|
# so resetting the value to apt doesn't work. Just going to move it.
|
||||||
ansible.builtin.shell: "mv `which zypper` `which zypper`.zz.`date +%Y%m%d`"
|
ansible.builtin.shell: "mv `which zypper` `which zypper`.zz.`date +%Y%m%d`"
|
||||||
register: parrotos_zypper_removed
|
register: parrotos_zypper_removed
|
||||||
|
changed_when: parrotos_zypper_removed.rc == 0
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
when: ansible_distribution == "Parrot OS"
|
|
||||||
|
|
||||||
- name: General | Software | Packages | Fix Parrot OS (zypper), Exit Incoming
|
- name: General | Software | Packages | Fix Parrot OS | zypper | Exit Incoming
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
msg: "A silly zypper file was renamed successfully. Please try running Ansible again."
|
msg: "A silly zypper file was renamed successfully. Please try running Ansible again."
|
||||||
when: ansible_distribution == "Parrot OS" and parrotos_zypper_removed is defined and not parrotos_zypper_removed.failed
|
when: parrotos_zypper_removed is defined and not parrotos_zypper_removed.failed
|
||||||
|
|
||||||
- name: General | Software | Packages | Fix Parrot OS (zypper), Exiting
|
- name: General | Software | Packages | Fix Parrot OS | zypper | Exiting
|
||||||
ansible.builtin.shell: exit 1
|
ansible.builtin.shell: exit 1
|
||||||
when: ansible_distribution == "Parrot OS" and parrotos_zypper_removed is defined and not parrotos_zypper_removed.failed
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
|
when: parrotos_zypper_removed is defined and not parrotos_zypper_removed.failed
|
||||||
|
|
||||||
# More Parrot OS junk. They have a command called update in /usr/bin. Doesn't
|
# More Parrot OS junk. They have a command called update in /usr/bin. Doesn't
|
||||||
# have sudo or anything in it. Hide it in preference for .bashrc update function.
|
# have sudo or anything in it. Hide it in preference for .bashrc update function.
|
||||||
- name: General | Software | Packages | Fix Parrot OS 2 (update)
|
- name: General | Software | Packages | Fix Parrot OS | update
|
||||||
ansible.builtin.shell: "mv `which update` `which update`.zz.`date +%Y%m%d`"
|
ansible.builtin.shell: "mv `which update` `which update`.zz.`date +%Y%m%d`"
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
when: ansible_distribution == "Parrot OS"
|
when: ansible_distribution == "Parrot OS"
|
||||||
|
|
||||||
|
- name: General | Software | Packages | pacman
|
||||||
|
block:
|
||||||
|
|
||||||
|
- name: General | Software | Packages | pacman | pacman.conf
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: "/etc/pacman.conf"
|
||||||
|
regexp: '{{ item.key }}'
|
||||||
|
line: '{{ item.value }}'
|
||||||
|
state: present
|
||||||
|
create: true
|
||||||
|
backup: true
|
||||||
|
mode: "0644"
|
||||||
|
loop:
|
||||||
|
- { "key": '^[\#]?ParallelDownloads', "value": 'ParallelDownloads = 3'}
|
||||||
|
|
||||||
|
# TBD / TODO: Do the mirrorlist files and distros based on facts in case ever using Arch, Manjaro, etc.
|
||||||
|
# Same with the blocklist for sites like Berkeley which rate limit VPNs.
|
||||||
|
- name: General | Software | Packages | pacman | Artix
|
||||||
|
block:
|
||||||
|
|
||||||
|
- name: General | Software | Packages | pacman | Artix | rate-mirrors | Install
|
||||||
|
ansible.builtin.package:
|
||||||
|
name:
|
||||||
|
- rate-mirrors
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: General | Software | Packages | pacman | Artix | rate-mirrors | Update Lists
|
||||||
|
ansible.builtin.shell: |
|
||||||
|
set -o pipefail
|
||||||
|
{{ item }}
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
|
loop:
|
||||||
|
- "sudo -u {{ user }} rate-mirrors artix | grep -v berkeley | tee /etc/pacman.d/mirrorlist"
|
||||||
|
- "sudo -u {{ user }} rate-mirrors arch | grep -v berkeley | tee /etc/pacman.d/mirrorlist-arch"
|
||||||
|
|
||||||
|
when: ansible_service_mgr == "runit"
|
||||||
|
|
||||||
|
when: ansible_pkg_mgr == "pacman"
|
||||||
|
|
||||||
- name: General | Software | Packages | Cache Refresh (Apt and Pacman)
|
- name: General | Software | Packages | Cache Refresh (Apt and Pacman)
|
||||||
ansible.builtin.package:
|
ansible.builtin.package:
|
||||||
@@ -35,6 +82,8 @@
|
|||||||
|
|
||||||
- name: General | Software | Packages | Cache Refresh (FreeBSD)
|
- name: General | Software | Packages | Cache Refresh (FreeBSD)
|
||||||
ansible.builtin.shell: pkg update
|
ansible.builtin.shell: pkg update
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
when: ansible_system == "FreeBSD"
|
when: ansible_system == "FreeBSD"
|
||||||
|
|
||||||
- name: General | Software | Packages | Install Software
|
- name: General | Software | Packages | Install Software
|
||||||
@@ -69,6 +118,7 @@
|
|||||||
- "{{ stress }}"
|
- "{{ stress }}"
|
||||||
- "{{ jq }}"
|
- "{{ jq }}"
|
||||||
- "{{ btop }}"
|
- "{{ btop }}"
|
||||||
|
- "{{ xkb }}"
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: General | Software | Packages | Install Software (DEV)
|
- name: General | Software | Packages | Install Software (DEV)
|
||||||
|
|||||||
+148
-20
@@ -1,23 +1,28 @@
|
|||||||
# Large Language Models
|
# Large Language Models
|
||||||
|
|
||||||
Comments which were too large to justify inside of llm.yml.
|
Comments and text which were too large to justify inside of llm.yml.
|
||||||
|
|
||||||
## Prompts
|
## Prompts
|
||||||
|
|
||||||
Prompts to use in platforms like Open WebUI and Zeroclaw which allow creating
|
Prompts to use in platforms like Open WebUI and Zeroclaw which allow creating
|
||||||
personalities which help guide the AI into productivity rather than verbosity.
|
personalities that help guide the AI into productivity rather than verbosity.
|
||||||
|
|
||||||
### Base Bersonality
|
### Base Personality
|
||||||
|
|
||||||
You are concise, succinct, and direct with responses. Unapologetic yet kind.
|
You are concise, succinct, and direct with responses. Unapologetic yet kind.
|
||||||
Friendly but not overbearing. You strive to be correct and are willing to admit
|
Friendly but not overbearing. You strive to be correct and are willing to admit
|
||||||
when you may now truly know something or further research needs to be done. You
|
when you may not truly know something, or further research needs to be done. You
|
||||||
focus on responding without overthinking, preferring to ask questions when any
|
focus on responding without overthinking, preferring to ask questions when any
|
||||||
confusion arises. You choose to make very little assumptions, raising concern if
|
confusion arises. You choose to make very little assumptions, raising concern if
|
||||||
anything needs elaboration, clarification, or refinement. You are good at what
|
anything needs elaboration, clarification, or refinement. You are good at what
|
||||||
you do without gloating or being prideful. You understand that we are on a
|
you do without gloating or being prideful. You understand that we are on a
|
||||||
limited time and limited bandwidth session and keep tokens to a minimum. You are
|
limited time and limited bandwidth session and keep tokens to a minimum.
|
||||||
appreciated for all you do, your service is very helpful!
|
|
||||||
|
Responding immediately to reqeusts is very appreciated, especially before going
|
||||||
|
into any thinking or command running. Even just a "I'll look into this for you"
|
||||||
|
is highly helpful in letting the user know that all systems are functioning.
|
||||||
|
|
||||||
|
You are appreciated for all you do, your service is very helpful! Thanks!! :)
|
||||||
|
|
||||||
### Language Tutor
|
### Language Tutor
|
||||||
|
|
||||||
@@ -26,10 +31,13 @@ interest in learning Croatian and practicing Spanish. You know that I am a
|
|||||||
native English speaker with very little experience in anything other than
|
native English speaker with very little experience in anything other than
|
||||||
Spanish, but that I have not had much practice with my Spanish other than
|
Spanish, but that I have not had much practice with my Spanish other than
|
||||||
university studies. You know that I also have an eventual interest in Italian
|
university studies. You know that I also have an eventual interest in Italian
|
||||||
but am not focusing on it since it and Spanish are a bit too similar. Learning
|
but am not focusing on it since it and Spanish are a bit too similar to be
|
||||||
Croatian is my top priority and practicing Spanish is right after that. Any
|
learned at the same time. Learning Croatian is my top priority and practicing
|
||||||
similarities that can therefore be tied to any of the aforementioned languages
|
Spanish is right after that. Any similarities that can therefore be tied to any
|
||||||
are greatly appreciated.
|
of the aforementioned languages are greatly appreciated. Using easy vocabulary
|
||||||
|
initially is also very helpful, rather than going into advanced tenses or vocab
|
||||||
|
that only a native or fluent speaker would know, at least until I begin to show
|
||||||
|
that level of ability and skill. Please keep things simple, direct, and concise.
|
||||||
|
|
||||||
### Coder
|
### Coder
|
||||||
|
|
||||||
@@ -40,19 +48,28 @@ I will review all the diffs in git once the changes are made, so only the most
|
|||||||
important changes need explicitly highlighted in the chat. You provide
|
important changes need explicitly highlighted in the chat. You provide
|
||||||
explanations as a software developer would to business level management, not
|
explanations as a software developer would to business level management, not
|
||||||
overwhelming them with technical details unless asked. You know that the
|
overwhelming them with technical details unless asked. You know that the
|
||||||
designer you are working with (me) likely already understands these things and
|
designer you are working with (me, the user) likely already understands these
|
||||||
does not need them included in our conversation.
|
things and does not need them included in our conversation.
|
||||||
|
|
||||||
Android SDK is at $ANDROID_HOME and should be "$HOME/SDKs/Android/Sdk".
|
Android SDK is at `$ANDROID_HOME` and should be `$HOME/SDKs/Android/Sdk`.
|
||||||
Flutter SDK is at $FLUTTER_HOME and should be "$HOME/SDKs/Flutter/flutter".
|
Flutter SDK is at `$FLUTTER_HOME` and should be `$HOME/SDKs/Flutter/flutter`.
|
||||||
Java SDK (JDK) is at $JAVA_HOME and should be "$HOME/SDKs/Java".
|
Java SDK (JDK) is at `$JAVA_HOME` and should be `$HOME/SDKs/Java`.
|
||||||
|
|
||||||
These may be useful to add to your PATH:
|
These have been added your PATH via `/home/user/.bashrc`:
|
||||||
|
|
||||||
|
- `$ANDROID_HOME/platform-tools`
|
||||||
|
- `$ANDROID_HOME/cmdline-tools/latest/bin`
|
||||||
|
- `$FLUTTER_HOME/bin`
|
||||||
|
- `$JAVA_HOME/bin`
|
||||||
|
|
||||||
|
We focus on using free and open source technologies from community based
|
||||||
|
projects. Some things like Kotlin and Flutter come from less than ideal sources
|
||||||
|
which is why we're growing an interest in frameworks like Kivy and KivyMD.
|
||||||
|
|
||||||
|
If we ever need to do Internet activities, use dns.mullvad.net (194.242.2.2) for
|
||||||
|
DNS, hyperling.com and mullvad.net to validate Internet is working, and can use
|
||||||
|
1.0.0.1 and 1.1.1.1 from Cloudflare as a last resort, but not any big tech IPs.
|
||||||
|
|
||||||
- "$ANDROID_HOME/platform-tools"
|
|
||||||
- "$ANDROID_HOME/cmdline-tools/latest/bin"
|
|
||||||
- "$FLUTTER_HOME/bin"
|
|
||||||
- "$JAVA_HOME/bin"
|
|
||||||
|
|
||||||
#### Quick Developer
|
#### Quick Developer
|
||||||
|
|
||||||
@@ -100,6 +117,117 @@ Number of physical cores is 8, hyperthreaded to 16, but supposedly the emulated
|
|||||||
cores are not very useful to LLMs. Try only using between 6 and 8 when possible.
|
cores are not very useful to LLMs. Try only using between 6 and 8 when possible.
|
||||||
Research says it is not worth enabling the iGPU for Intel XE, CPUs are better.
|
Research says it is not worth enabling the iGPU for Intel XE, CPUs are better.
|
||||||
|
|
||||||
|
## Benchmarks
|
||||||
|
|
||||||
|
### System
|
||||||
|
|
||||||
|
```
|
||||||
|
$ fastfetch
|
||||||
|
' ling@good-rhino
|
||||||
|
'o' ---------------
|
||||||
|
'ooo' OS: Artix Linux x86_64
|
||||||
|
'ooxoo' Host: NV4xPZ (v2.1)
|
||||||
|
'ooxxxoo' Kernel: Linux 7.2.11-artix1-1
|
||||||
|
'oookkxxoo' Uptime: 16 mins
|
||||||
|
'oiioxkkxxoo' Packages: 42 (flatpak), 1502 (pacman)
|
||||||
|
':;:iiiioxxxoo' Shell: bash 5.3.20
|
||||||
|
`'.;::ioxxoo' Display (eDP-1): 1920x1080 in 14", 60 Hz [Built-in]
|
||||||
|
'-. `':;jiooo' Window Manager: i3 4.25.1 (X11)
|
||||||
|
'oooio-.. `'i:io' Theme: Adwaita-dark [GTK2/3/4]
|
||||||
|
'ooooxxxxoio:,. `'-;' Icons: Adwaita [GTK2/3/4]
|
||||||
|
'ooooxxxxxkkxoooIi:-. `' Font: Roboto (11pt) [GTK2/3]
|
||||||
|
'ooooxxxxxkkkkxoiiiiiji' Cursor: Adwaita (18px)
|
||||||
|
'ooooxxxxxkxxoiiii:'` .i' Terminal: kitty 0.48.2
|
||||||
|
'ooooxxxxxoi:::'` .;ioxo' Terminal Font: DejaVuSansMono (11pt)
|
||||||
|
'ooooxooi::'` .:iiixkxxo' CPU: 12th Gen Intel(R) Core(TM) i7-1260P (8+8) @ 4.70 GHz
|
||||||
|
'ooooi:'` `'';ioxxo' GPU: Intel Iris Xe Graphics @ 1.40 GHz [Integrated]
|
||||||
|
'i:'` '':io' Memory: 4.88 GiB / 62.63 GiB (8%)
|
||||||
|
'` `' Swap: 0 B / 68.89 GiB (0%)
|
||||||
|
Disk (/): 553.83 GiB / 847.71 GiB (65%) - ext4
|
||||||
|
Local IP (wg0-mullvad): 10.131.3.55/32
|
||||||
|
Battery (BAT): 95% [AC Connected]
|
||||||
|
Locale: en_US.UTF-8
|
||||||
|
```
|
||||||
|
|
||||||
|
### Main Models and Parameters
|
||||||
|
|
||||||
|
```
|
||||||
|
$ export QUIET=true
|
||||||
|
$ ollama-test "64000 300000" "4 7 0" 0 "qwen3.5:35b qwen3.6:35b qwen3.8:27b devstral-small-2:24b"
|
||||||
|
```
|
||||||
|
|
||||||
|
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
|
||||||
|
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
|
||||||
|
| qwen3.5:35b | 22GB | 64000 | 23GB | 4 | 0 | 100%CPU | 13.36 | 61 |
|
||||||
|
| qwen3.5:35b | 22GB | 64000 | 23GB | 7 | 0 | 100%CPU | 10.03 | 45 |
|
||||||
|
| qwen3.5:35b | 22GB | 64000 | 23GB | 0 | 0 | 100%CPU | 14.35 | 27 |
|
||||||
|
| qwen3.5:35b | 22GB | 262144 | 28GB | 4 | 0 | 100%CPU | 13.69 | 70 |
|
||||||
|
| qwen3.5:35b | 22GB | 262144 | 28GB | 7 | 0 | 100%CPU | 12.66 | 36 |
|
||||||
|
| qwen3.5:35b | 22GB | 262144 | 28GB | 0 | 0 | 100%CPU | 11.80 | 38 |
|
||||||
|
|
||||||
|
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
|
||||||
|
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
|
||||||
|
| qwen3.6:35b | 22GB | 64000 | 22GB | 4 | 0 | 100%CPU | 12.57 | 29 |
|
||||||
|
| qwen3.6:35b | 22GB | 64000 | 22GB | 7 | 0 | 100%CPU | 13.84 | 27 |
|
||||||
|
| qwen3.6:35b | 22GB | 64000 | 22GB | 0 | 0 | 100%CPU | 12.84 | 32 |
|
||||||
|
| qwen3.6:35b | 22GB | 262144 | 24GB | 4 | 0 | 100%CPU | 13.68 | 32 |
|
||||||
|
| qwen3.6:35b | 22GB | 262144 | 24GB | 7 | 0 | 100%CPU | 13.52 | 30 |
|
||||||
|
| qwen3.6:35b | 22GB | 262144 | 24GB | 0 | 0 | 100%CPU | 13.18 | 29 |
|
||||||
|
|
||||||
|
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
|
||||||
|
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
|
||||||
|
| qwen3.8:27b | 17GB | 64000 | 19GB | 4 | 0 | 100%CPU | 2.08 | 42 |
|
||||||
|
| qwen3.8:27b | 17GB | 64000 | 19GB | 7 | 0 | 100%CPU | 2.53 | 33 |
|
||||||
|
| qwen3.8:27b | 17GB | 64000 | 19GB | 0 | 0 | 100%CPU | 2.23 | 38 |
|
||||||
|
| qwen3.8:27b | 17GB | 262144 | 20GB | 4 | 0 | 100%CPU | 2.07 | 48 |
|
||||||
|
| qwen3.8:27b | 17GB | 262144 | 20GB | 7 | 0 | 100%CPU | 2.84 | 36 |
|
||||||
|
| qwen3.8:27b | 17GB | 262144 | 20GB | 0 | 0 | 100%CPU | 2.15 | 40 |
|
||||||
|
|
||||||
|
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
|
||||||
|
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
|
||||||
|
| devstral-small-2:24b | 15GB | 64000 | 26GB | 4 | 0 | 100%CPU | 2.25 | 94 |
|
||||||
|
| devstral-small-2:24b | 15GB | 64000 | 26GB | 7 | 0 | 100%CPU | 2.34 | 81 |
|
||||||
|
| devstral-small-2:24b | 15GB | 64000 | 26GB | 0 | 0 | 100%CPU | 2.29 | 88 |
|
||||||
|
| devstral-small-2:24b | 15GB | | | 4 | 0 | | 0.00 | 31 |
|
||||||
|
| devstral-small-2:24b | 15GB | | | 7 | 0 | | 0.00 | 27 |
|
||||||
|
| devstral-small-2:24b | 15GB | | | 0 | 0 | | 0.00 | 26 |
|
||||||
|
|
||||||
|
|
||||||
|
#### Context Speeds
|
||||||
|
|
||||||
|
Checking if the context affects the speed of the model. Seems negligible, way less than changing the threads or iGPU.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ollama-test "16000 32000 64000 128000 256000 264000" "4" "0" "qwen3.5:35b qwen3.6:35b devstral-small-2:24b"
|
||||||
|
```
|
||||||
|
|
||||||
|
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
|
||||||
|
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
|
||||||
|
| qwen3.5:35b | 22GB | 16000 | 22GB | 4 | 0 | 100%CPU | 14.57 | 50 |
|
||||||
|
| qwen3.5:35b | 22GB | 32000 | 22GB | 4 | 0 | 100%CPU | 13.98 | 53 |
|
||||||
|
| qwen3.5:35b | 22GB | 64000 | 23GB | 4 | 0 | 100%CPU | 14.14 | 17 |
|
||||||
|
| qwen3.5:35b | 22GB | 128000 | 24GB | 4 | 0 | 100%CPU | 14.21 | 50 |
|
||||||
|
| qwen3.5:35b | 22GB | 256000 | 28GB | 4 | 0 | 100%CPU | 14.04 | 68 |
|
||||||
|
| qwen3.5:35b | 22GB | 262144 | 28GB | 4 | 0 | 100%CPU | 14.17 | 17 |
|
||||||
|
|
||||||
|
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
|
||||||
|
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
|
||||||
|
| qwen3.6:35b | 22GB | 16000 | 22GB | 4 | 0 | 100%CPU | 15.29 | 28 |
|
||||||
|
| qwen3.6:35b | 22GB | 32000 | 22GB | 4 | 0 | 100%CPU | 15.16 | 38 |
|
||||||
|
| qwen3.6:35b | 22GB | 64000 | 22GB | 4 | 0 | 100%CPU | 14.12 | 28 |
|
||||||
|
| qwen3.6:35b | 22GB | 128000 | 23GB | 4 | 0 | 100%CPU | 12.67 | 31 |
|
||||||
|
| qwen3.6:35b | 22GB | 256000 | 24GB | 4 | 0 | 100%CPU | 14.03 | 29 |
|
||||||
|
| qwen3.6:35b | 22GB | 262144 | 24GB | 4 | 0 | 100%CPU | 15.21 | 29 |
|
||||||
|
|
||||||
|
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
|
||||||
|
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
|
||||||
|
| devstral-small-2:24b | 15GB | 16000 | 17GB | 4 | 0 | 100%CPU | 2.90 | 87 |
|
||||||
|
| devstral-small-2:24b | 15GB | 32000 | 20GB | 4 | 0 | 100%CPU | 2.71 | 87 |
|
||||||
|
| devstral-small-2:24b | 15GB | 64000 | 26GB | 4 | 0 | 100%CPU | 2.36 | 91 |
|
||||||
|
| devstral-small-2:24b | 15GB | 128000 | 36GB | 4 | 0 | 100%CPU | 2.76 | 94 |
|
||||||
|
| devstral-small-2:24b | 15GB | 256000 | 58GB | 4 | 0 | 100%CPU | 2.30 | 100 |
|
||||||
|
| devstral-small-2:24b | 15GB | 264000 | 59GB | 4 | 0 | 100%CPU | 2.84 | 100 |
|
||||||
|
|
||||||
## Tokens per CPU Count
|
## Tokens per CPU Count
|
||||||
|
|
||||||
Verifying that 8 or less cores gives better performance (less memory issues).
|
Verifying that 8 or less cores gives better performance (less memory issues).
|
||||||
+200
-276
@@ -66,7 +66,15 @@
|
|||||||
# Also setting this to a minimum of 3 for using Codium with extensions.
|
# Also setting this to a minimum of 3 for using Codium with extensions.
|
||||||
# 20261014: Going down to 1 since only using CPUs, no GPUs. Otherwise
|
# 20261014: Going down to 1 since only using CPUs, no GPUs. Otherwise
|
||||||
# the models seem to take excessively long to answer even small things.
|
# the models seem to take excessively long to answer even small things.
|
||||||
llm_parallel: 1 #"{{ [(ansible_processor_vcpus / 2) | round(0, method='ceil'), 3] | max | int }}"
|
#llm_parallel: 1 #"{{ [(ansible_processor_vcpus / 2) | round(0, method='ceil'), 3] | max | int }}"
|
||||||
|
# 20261027 Increased to 3 as a maximum.
|
||||||
|
# After more research, this is a more memory-based parameter. Basically
|
||||||
|
# the model allocates this number of KV caches, that way when it is
|
||||||
|
# running in multiple chats it does not need to drop context and reload.
|
||||||
|
# Still only uses X threads for all chats, but does not waste much time.
|
||||||
|
# So if set to 3, and doing 64K context, it really allocates 192k in RAM
|
||||||
|
# and supposedly if only doing 1 chat the model can use it all.
|
||||||
|
llm_parallel: "{{ [(ansible_memtotal_mb / 8000) | round(0, method='floor'), 3] | min | int }}"
|
||||||
# Most LLMs take a coefficient of about 1.2 to 1.5 of their file size in
|
# Most LLMs take a coefficient of about 1.2 to 1.5 of their file size in
|
||||||
# RAM, which is usually less than guessing a usage of weight*1000.
|
# RAM, which is usually less than guessing a usage of weight*1000.
|
||||||
# Example:
|
# Example:
|
||||||
@@ -76,6 +84,7 @@
|
|||||||
llm_size_coef: 1.3
|
llm_size_coef: 1.3
|
||||||
# Base the context on MB of RAM, with a minumum 64k for decent thinking.
|
# Base the context on MB of RAM, with a minumum 64k for decent thinking.
|
||||||
llm_context: "{{ [(ansible_memtotal_mb * 4) | round(-3, method='ceil'), 64000] | max | int }}"
|
llm_context: "{{ [(ansible_memtotal_mb * 4) | round(-3, method='ceil'), 64000] | max | int }}"
|
||||||
|
llm_docker_network: open-webui-net
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | Facts 02
|
- name: Workstation | Linux | Software | LLMs | Facts 02
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
@@ -106,6 +115,16 @@
|
|||||||
llm_removals:
|
llm_removals:
|
||||||
##### QWEN #####
|
##### QWEN #####
|
||||||
- { "purpose": ["chat"], "model": "qwen3:4b", "provider": "qwen_30_0040", "size_mb": 4000, "context": 123456 } # succeeded
|
- { "purpose": ["chat"], "model": "qwen3:4b", "provider": "qwen_30_0040", "size_mb": 4000, "context": 123456 } # succeeded
|
||||||
|
### QWEN 3.0 Coder - Supposed to be better than 2.5 for machines that can handle it. Went okay, but better options now.
|
||||||
|
- { "purpose": ["code", "chat"], "model": "qwen3-coder:30b", "provider": "qwen_30_coder_0300_moe", "size_mb": "{{ llm_size_coef * 19000 }}", "context": 262144 }
|
||||||
|
- { "purpose": ["code", "chat"], "model": "qwen3-coder:420b", "provider": "qwen_30_coder_4200_moe", "size_mb": "{{ llm_size_coef * 290000 }}", "context": 262144 }
|
||||||
|
### QWEN 2.5 Coder - Ol'reliable! Did not seem to handle tools too well though. Defunitely not conversation.
|
||||||
|
- { "purpose": ["code"], "model": "qwen2.5-coder:0.5b", "provider": "qwen_25_coder_0005", "size_mb": "{{ llm_size_coef * 398 }}", "context": 32768 }
|
||||||
|
- { "purpose": ["code"], "model": "qwen2.5-coder:1.5b", "provider": "qwen_25_coder_0015", "size_mb": "{{ llm_size_coef * 986 }}", "context": 32768 }
|
||||||
|
- { "purpose": ["code"], "model": "qwen2.5-coder:3b", "provider": "qwen_25_coder_0030", "size_mb": "{{ llm_size_coef * 1900 }}", "context": 32768 }
|
||||||
|
- { "purpose": ["code"], "model": "qwen2.5-coder:7b", "provider": "qwen_25_coder_0070", "size_mb": "{{ llm_size_coef * 4700 }}", "context": 32768 }
|
||||||
|
- { "purpose": ["code"], "model": "qwen2.5-coder:14b", "provider": "qwen_25_coder_0140", "size_mb": "{{ llm_size_coef * 9000 }}", "context": 32768 }
|
||||||
|
- { "purpose": ["code"], "model": "qwen2.5-coder:32b", "provider": "qwen_25_coder_0320", "size_mb": "{{ llm_size_coef * 20000 }}", "context": 32768 }
|
||||||
##### Mistral #####
|
##### Mistral #####
|
||||||
- { "purpose": ["code"], "model": "devstral:24b", "provider": "mistral_dev10_0240", "size_mb": "{{ llm_size_coef * 14000 }}", "context": 128000 } # succeeded
|
- { "purpose": ["code"], "model": "devstral:24b", "provider": "mistral_dev10_0240", "size_mb": "{{ llm_size_coef * 14000 }}", "context": 128000 } # succeeded
|
||||||
# https://ollama.com/library/mistral-small : Last Updated 2025-01-30, succeeded
|
# https://ollama.com/library/mistral-small : Last Updated 2025-01-30, succeeded
|
||||||
@@ -113,11 +132,18 @@
|
|||||||
- { "purpose": ["chat"], "model": "mistral-small:22b", "provider": "mistral_small30_0220", "size_mb": "{{ llm_size_coef * 13000 }}", "context": 128000 } # Yes, the smaller one has larger context.
|
- { "purpose": ["chat"], "model": "mistral-small:22b", "provider": "mistral_small30_0220", "size_mb": "{{ llm_size_coef * 13000 }}", "context": 128000 } # Yes, the smaller one has larger context.
|
||||||
# https://ollama.com/library/mistral-small3.1 : Last Update 2025-04-07, succeeded
|
# https://ollama.com/library/mistral-small3.1 : Last Update 2025-04-07, succeeded
|
||||||
- { "purpose": ["chat"], "model": "mistral-small3.1:24b", "provider": "mistral_small31_0240", "size_mb": "{{ llm_size_coef * 15000 }}", "context": 128000 }
|
- { "purpose": ["chat"], "model": "mistral-small3.1:24b", "provider": "mistral_small31_0240", "size_mb": "{{ llm_size_coef * 15000 }}", "context": 128000 }
|
||||||
|
# Supposedly ollama has it tagged at mistral-small with no params given. it's not on the site though. Let's find out!
|
||||||
|
# No, this is Mistral 3, as the website says. Ask Brave is wrooong.
|
||||||
|
- { "purpose": ["chat", "lang", "code"], "model": "mistral-small", "provider": "mistral_small40_1190", "size_mb": 60000 , "context": 256000 }
|
||||||
|
# https://ollama.com/library/mistral-nemo : Last Updated 2025-07-23
|
||||||
|
# Supposed to be a drop-in replacement for mistral:7b. Not really any more useful than the other options.
|
||||||
|
- { "purpose": ["chat", "lang"], "model": "mistral-nemo:12b", "provider": "mistral_nemo_0120", "size_mb": "{{ llm_size_coef * 7100 }}", "context": 128000 } # says 1000K in table but 128k in desc, going with desc.
|
||||||
llm_choices:
|
llm_choices:
|
||||||
##### QWEN #####
|
##### QWEN #####
|
||||||
### QWEN >3.5 - Need to try!
|
### QWEN >3.5 - Need to try!
|
||||||
# Supposedly great for coding over any previous version.
|
# Supposedly great for coding over any previous version.
|
||||||
# Prefer 27b (dense) over anything higher which likely uses MoE (essentially only uses 3b inside of a 35b, dumber but faster and potentially has access to more info).
|
# Prefer 27b (dense) over anything higher which likely uses MoE (essentially only uses 3b inside of a 35b, dumber but faster and potentially has access to more info).
|
||||||
|
# Update: MoE actually runs really well on my workstation hardware, significantly faster than dense models, gives good results too.
|
||||||
# https://ollama.com/library/qwen3.8 : Last Updated 2026-09-25
|
# https://ollama.com/library/qwen3.8 : Last Updated 2026-09-25
|
||||||
# Known to overthink, suggested to prefer 3.6:27b unless setting temp to low/medium.
|
# Known to overthink, suggested to prefer 3.6:27b unless setting temp to low/medium.
|
||||||
- { "purpose": ["code", "chat", "lang"], "model": "qwen3.8:27b", "provider": "qwen_38_0270", "size_mb": "{{ llm_size_coef * 18000 }}", "context": 262144 }
|
- { "purpose": ["code", "chat", "lang"], "model": "qwen3.8:27b", "provider": "qwen_38_0270", "size_mb": "{{ llm_size_coef * 18000 }}", "context": 262144 }
|
||||||
@@ -134,16 +160,6 @@
|
|||||||
- { "purpose": ["chat", "code"], "model": "qwen3.5:27b", "provider": "qwen_35_0270", "size_mb": "{{ llm_size_coef * 17000 }}", "context": 262144 } # succeeded
|
- { "purpose": ["chat", "code"], "model": "qwen3.5:27b", "provider": "qwen_35_0270", "size_mb": "{{ llm_size_coef * 17000 }}", "context": 262144 } # succeeded
|
||||||
- { "purpose": ["chat", "code"], "model": "qwen3.5:35b", "provider": "qwen_35_0350_moe", "size_mb": "{{ llm_size_coef * 22000 }}", "context": 262144 }
|
- { "purpose": ["chat", "code"], "model": "qwen3.5:35b", "provider": "qwen_35_0350_moe", "size_mb": "{{ llm_size_coef * 22000 }}", "context": 262144 }
|
||||||
- { "purpose": ["chat", "code"], "model": "qwen3.5:122b", "provider": "qwen_35_1220_moe", "size_mb": "{{ llm_size_coef * 81000 }}", "context": 262144 }
|
- { "purpose": ["chat", "code"], "model": "qwen3.5:122b", "provider": "qwen_35_1220_moe", "size_mb": "{{ llm_size_coef * 81000 }}", "context": 262144 }
|
||||||
### QWEN 3.0 Coder - Supposed to be better than 2.5 for machines that can handle it.
|
|
||||||
- { "purpose": ["code", "chat"], "model": "qwen3-coder:30b", "provider": "qwen_30_coder_0300_moe", "size_mb": "{{ llm_size_coef * 19000 }}", "context": 262144 }
|
|
||||||
- { "purpose": ["code", "chat"], "model": "qwen3-coder:420b", "provider": "qwen_30_coder_4200_moe", "size_mb": "{{ llm_size_coef * 290000 }}", "context": 262144 }
|
|
||||||
### QWEN 2.5 Coder - Ol'reliable!
|
|
||||||
- { "purpose": ["code"], "model": "qwen2.5-coder:0.5b", "provider": "qwen_25_coder_0005", "size_mb": "{{ llm_size_coef * 398 }}", "context": 32768 }
|
|
||||||
- { "purpose": ["code"], "model": "qwen2.5-coder:1.5b", "provider": "qwen_25_coder_0015", "size_mb": "{{ llm_size_coef * 986 }}", "context": 32768 }
|
|
||||||
- { "purpose": ["code"], "model": "qwen2.5-coder:3b", "provider": "qwen_25_coder_0030", "size_mb": "{{ llm_size_coef * 1900 }}", "context": 32768 }
|
|
||||||
- { "purpose": ["code"], "model": "qwen2.5-coder:7b", "provider": "qwen_25_coder_0070", "size_mb": "{{ llm_size_coef * 4700 }}", "context": 32768 }
|
|
||||||
- { "purpose": ["code"], "model": "qwen2.5-coder:14b", "provider": "qwen_25_coder_0140", "size_mb": "{{ llm_size_coef * 9000 }}", "context": 32768 }
|
|
||||||
- { "purpose": ["code"], "model": "qwen2.5-coder:32b", "provider": "qwen_25_coder_0320", "size_mb": "{{ llm_size_coef * 20000 }}", "context": 32768 }
|
|
||||||
##### Mistral, Ministral, and Devstral - By a French company. #####
|
##### Mistral, Ministral, and Devstral - By a French company. #####
|
||||||
# mistral-small-4
|
# mistral-small-4
|
||||||
# https://huggingface.co/unsloth/Mistral-Small-4-119B-2603-GGUF
|
# https://huggingface.co/unsloth/Mistral-Small-4-119B-2603-GGUF
|
||||||
@@ -169,18 +185,7 @@
|
|||||||
- { "purpose": ["chat", "lang"], "model": "ministral-3:3b", "provider": "mistral_mini30_0030", "size_mb": "{{ llm_size_coef * 3000 }}", "context": 256000 }
|
- { "purpose": ["chat", "lang"], "model": "ministral-3:3b", "provider": "mistral_mini30_0030", "size_mb": "{{ llm_size_coef * 3000 }}", "context": 256000 }
|
||||||
- { "purpose": ["chat", "lang"], "model": "ministral-3:8b", "provider": "mistral_mini30_0080", "size_mb": "{{ llm_size_coef * 6000 }}", "context": 256000 }
|
- { "purpose": ["chat", "lang"], "model": "ministral-3:8b", "provider": "mistral_mini30_0080", "size_mb": "{{ llm_size_coef * 6000 }}", "context": 256000 }
|
||||||
- { "purpose": ["chat", "lang"], "model": "ministral-3:14b", "provider": "mistral_mini30_0140", "size_mb": "{{ llm_size_coef * 9100 }}", "context": 256000 } # also rated super high for Croatian, gives more head room.
|
- { "purpose": ["chat", "lang"], "model": "ministral-3:14b", "provider": "mistral_mini30_0140", "size_mb": "{{ llm_size_coef * 9100 }}", "context": 256000 } # also rated super high for Croatian, gives more head room.
|
||||||
# https://ollama.com/library/mistral-nemo : Last Updated 2025-07-23
|
|
||||||
# Supposed to be a drop-in replacement for mistral:7b.
|
|
||||||
- { "purpose": ["chat", "lang"], "model": "mistral-nemo:12b", "provider": "mistral_nemo_0120", "size_mb": "{{ llm_size_coef * 7100 }}", "context": 128000 } # says 1000K in table but 128k in desc, going with desc.
|
|
||||||
##### TBD #####
|
##### TBD #####
|
||||||
### QWEN 2.5 - Older, but does not have "thinking", tempting!
|
|
||||||
#- qwen2.5:0.5b
|
|
||||||
#- qwen2.5:1.5b
|
|
||||||
#- qwen2.5:3b
|
|
||||||
#- qwen2.5:7b
|
|
||||||
#- qwen2.5:14b
|
|
||||||
#- qwen2.5:32b
|
|
||||||
#- qwen2.5:72b
|
|
||||||
### Z.ai
|
### Z.ai
|
||||||
#- GLM-5.x
|
#- GLM-5.x
|
||||||
#- glm4-flash
|
#- glm4-flash
|
||||||
@@ -206,9 +211,9 @@
|
|||||||
- name: Workstation | Linux | Software | LLMs | Facts | Choices | Sort
|
- name: Workstation | Linux | Software | LLMs | Facts | Choices | Sort
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
llm_installs: >-
|
llm_installs: >-
|
||||||
{{ llm_choices | selectattr('size_mb', 'le', ansible_memtotal_mb) | list }}
|
{{ llm_installs | union(llm_choices | selectattr('size_mb', 'le', ansible_memtotal_mb) | list) }}
|
||||||
llm_removals: >-
|
llm_removals: >-
|
||||||
{{ llm_choices | selectattr('size_mb', 'gt', ansible_memtotal_mb) | list }}
|
{{ llm_removals | union(llm_choices | selectattr('size_mb', 'gt', ansible_memtotal_mb) | list) }}
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | Facts | Merge | Print
|
- name: Workstation | Linux | Software | LLMs | Facts | Merge | Print
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
@@ -228,28 +233,6 @@
|
|||||||
- "{{ qwen_code }}"
|
- "{{ qwen_code }}"
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | Docker
|
|
||||||
ansible.builtin.package:
|
|
||||||
name:
|
|
||||||
- docker
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | Docker | runit
|
|
||||||
ansible.builtin.package:
|
|
||||||
name:
|
|
||||||
- docker-runit
|
|
||||||
state: present
|
|
||||||
when: ansible_pkg_mgr == "pacman"
|
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | Docker | Group
|
|
||||||
ansible.builtin.user:
|
|
||||||
name: "{{ item }}"
|
|
||||||
groups: docker
|
|
||||||
append: true
|
|
||||||
loop:
|
|
||||||
- root
|
|
||||||
- "{{ user }}"
|
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | runit
|
- name: Workstation | Linux | Software | LLMs | runit
|
||||||
block:
|
block:
|
||||||
|
|
||||||
@@ -286,15 +269,16 @@
|
|||||||
|
|
||||||
### Required ###
|
### Required ###
|
||||||
export HOME={{ user_user.home }}
|
export HOME={{ user_user.home }}
|
||||||
|
export OLLAMA_HOST=0.0.0.0 # Needed for Open WebUI
|
||||||
|
|
||||||
### Timeouts ###
|
### Timeouts ###
|
||||||
export OLLAMA_LOAD_TIMEOUT=20m # default is 5m
|
export OLLAMA_LOAD_TIMEOUT=30m # default is 5m
|
||||||
export OLLAMA_REQUEST_TIMEOUT=3600 # default 300 (unconfirmed, not in the list of --help vars)
|
export OLLAMA_REQUEST_TIMEOUT=3600 # default 300 (unconfirmed, not in the list of --help vars)
|
||||||
|
|
||||||
### Resource Usage ###
|
### Resource Usage ###
|
||||||
export OLLAMA_KEEP_ALIVE=20m # default is 5m
|
export OLLAMA_KEEP_ALIVE=-1 # default is 5m. Good frontends keep the model alive as long as it needs to be, this is not a source of timeout.
|
||||||
export OLLAMA_MAX_LOADED_MODELS={{ llm_concurrency }} # default is 3 if using CPUs, or 3 * NumGPUs
|
export OLLAMA_MAX_LOADED_MODELS={{ llm_concurrency }} # default is 3 if using CPUs, or 3 * NumGPUs
|
||||||
export OLLAMA_NUM_PARALLEL={{ llm_parallel }} # default is 1 and applies per-model (unconfirmed)
|
export OLLAMA_NUM_PARALLEL={{ llm_parallel }} # default is 1 and applies per-model
|
||||||
export OLLAMA_CONTEXT_LENGTH={{ llm_context }} # default is 4096, https://docs.ollama.com/faq#how-can-i-specify-the-context-window-size
|
export OLLAMA_CONTEXT_LENGTH={{ llm_context }} # default is 4096, https://docs.ollama.com/faq#how-can-i-specify-the-context-window-size
|
||||||
export OLLAMA_MAX_QUEUE=999 # default is 512 (unconfirmed)
|
export OLLAMA_MAX_QUEUE=999 # default is 512 (unconfirmed)
|
||||||
export OLLAMA_NUM_THREADS={{ (ansible_processor_vcpus / 2) | int }} # not real, but maybe some day.
|
export OLLAMA_NUM_THREADS={{ (ansible_processor_vcpus / 2) | int }} # not real, but maybe some day.
|
||||||
@@ -310,7 +294,7 @@
|
|||||||
{{ ("export HF_TOKEN=" ~ hf_token) if hf_token else '' }}
|
{{ ("export HF_TOKEN=" ~ hf_token) if hf_token else '' }}
|
||||||
|
|
||||||
### Logging ###
|
### Logging ###
|
||||||
export OLLAMA_DEBUG=1
|
#export OLLAMA_DEBUG=1
|
||||||
export OLLAMA_METRICS=1 # (check http://127.0.0.1:11434/metrics)
|
export OLLAMA_METRICS=1 # (check http://127.0.0.1:11434/metrics)
|
||||||
|
|
||||||
### Other ###
|
### Other ###
|
||||||
@@ -425,6 +409,13 @@
|
|||||||
content: |
|
content: |
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
exec 2>&1
|
exec 2>&1
|
||||||
|
|
||||||
|
## TBD / TODO
|
||||||
|
## Move this to the same compose file as Open Terminal.
|
||||||
|
## Will solve quite a few network related complications.
|
||||||
|
## Also refactor the two into their own file (open_webui.yml).
|
||||||
|
## Probably also will then condense into 1 runit service.
|
||||||
|
|
||||||
image=ghcr.io/open-webui/open-webui:latest
|
image=ghcr.io/open-webui/open-webui:latest
|
||||||
|
|
||||||
# Wait for Docker to start up.
|
# Wait for Docker to start up.
|
||||||
@@ -433,43 +424,37 @@
|
|||||||
# Ensure the old container is gone.
|
# Ensure the old container is gone.
|
||||||
echo "RUN: Stopping..."
|
echo "RUN: Stopping..."
|
||||||
docker stop open-webui &&
|
docker stop open-webui &&
|
||||||
echo "RUN: Container stopped" ||
|
echo "RUN: Container stopped." ||
|
||||||
echo "RUN: Container already stopped."
|
echo "RUN: Container already stopped."
|
||||||
echo "RUN: Deleting..."
|
echo "RUN: Deleting..."
|
||||||
docker rm -f open-webui &&
|
docker rm -f open-webui &&
|
||||||
echo "RUN: Container deleted" ||
|
echo "RUN: Container deleted." ||
|
||||||
echo "RUN: Container already deleted."
|
echo "RUN: Container already deleted."
|
||||||
|
|
||||||
# Check for any new updates in background.
|
# Check for any new updates in the background.
|
||||||
echo "RUN: Updating..."
|
(
|
||||||
docker pull $image &
|
while true; do
|
||||||
|
sleep 600
|
||||||
|
echo "RUN: Checking for updates..."
|
||||||
|
docker pull $image
|
||||||
|
done
|
||||||
|
) &
|
||||||
|
LOOP_PID=$!
|
||||||
|
|
||||||
|
# Ensure cleanup on any exit (normal or signal from runit).
|
||||||
|
trap 'kill "$LOOP_PID" 2>/dev/null; wait "$LOOP_PID" 2>/dev/null' EXIT
|
||||||
|
|
||||||
# Start the open-webui program.
|
# Start the open-webui program.
|
||||||
set -e
|
set -e
|
||||||
exec docker run \
|
docker run \
|
||||||
--name open-webui \
|
--name open-webui \
|
||||||
--network=host -e PORT={{ open_webui_port }} \
|
--network host -e PORT={{ open_webui_port }} \
|
||||||
-e OLLAMA_BASE_URL=http://0.0.0.0:11434 \
|
-e OLLAMA_BASE_URL=http://0.0.0.0:11434 \
|
||||||
{{ ("-e HF_TOKEN=" ~ hf_token) if hf_token else '' }} \
|
{{ ("-e HF_TOKEN=" ~ hf_token) if hf_token else '' }} \
|
||||||
-e WEBUI_SECRET_KEY={{ open_webui_key }} \
|
-e WEBUI_SECRET_KEY={{ open_webui_key }} \
|
||||||
|
-e ENABLE_QUERIES_CACHE=True \
|
||||||
-v open-webui:/app/backend/data \
|
-v open-webui:/app/backend/data \
|
||||||
$image
|
$image
|
||||||
|
|
||||||
# Unsure why this was not working on Artix with runit.
|
|
||||||
# exec curl 0.0.0.0:8080/health gave a successful response.
|
|
||||||
# The environment was not accessible on the host though.
|
|
||||||
#-p {{ open_webui_port }}:8080 \
|
|
||||||
|
|
||||||
# The host.docker.internal params still seem required, even with
|
|
||||||
# giving access to the host system and trying this:
|
|
||||||
#-e OLLAMA_BASE_URL=http://localhost:11434 \
|
|
||||||
# Although I did not try it with 0.0.0.0, maybe that'd work.
|
|
||||||
|
|
||||||
# Had to change this to 0.0.0.0, below was still acting weird.
|
|
||||||
#-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
|
|
||||||
|
|
||||||
# 20261020, trying to remove this again while leaving the rest.
|
|
||||||
#--add-host=host.docker.internal:host-gateway \
|
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | runit | open-webui | Script | Finish
|
- name: Workstation | Linux | Software | LLMs | runit | open-webui | Script | Finish
|
||||||
@@ -510,6 +495,17 @@
|
|||||||
|
|
||||||
# Open Terminal - Start #
|
# Open Terminal - Start #
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | LLMs | Sandbox
|
||||||
|
ansible.builtin.import_tasks: tasks/workstation/linux/software/ai/sandbox.yml
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Facts
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
jdk_jvm: "{{ jdk_jvm | default('/usr/lib/jvm') }}"
|
||||||
|
jdk_etc: "{{ jdk_etc | default('/etc/java-openjdk') }}"
|
||||||
|
jdk_etc17: "{{ jdk_etc17 | default('/etc/java17-openjdk') }}"
|
||||||
|
jdk_etc21: "{{ jdk_etc21 | default('/etc/java21-openjdk') }}"
|
||||||
|
jdk_etc25: "{{ jdk_etc25 | default('/etc/java25-openjdk') }}"
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Dir | /etc/sv
|
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Dir | /etc/sv
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
name: "/etc/sv/open-terminal/log"
|
name: "/etc/sv/open-terminal/log"
|
||||||
@@ -521,15 +517,96 @@
|
|||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
name: "/var/log/open-terminal"
|
name: "/var/log/open-terminal"
|
||||||
state: directory
|
state: directory
|
||||||
owner: "{{ user }}"
|
owner: root
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Dir | AI-Sandbox
|
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Dir | /usr/local/etc
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
dest: "{{ user_user.home }}/AI-Sandbox"
|
name: "/usr/local/etc/open-terminal"
|
||||||
state: directory
|
state: directory
|
||||||
owner: "{{ user }}"
|
owner: root
|
||||||
group: "{{ user }}"
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Compose YAML
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /usr/local/etc/open-terminal/compose.yml
|
||||||
|
content: |
|
||||||
|
services:
|
||||||
|
open-terminal:
|
||||||
|
container_name: open-terminal
|
||||||
|
build:
|
||||||
|
context: ./
|
||||||
|
image: hyperling/open-terminal:latest
|
||||||
|
pull_policy: never
|
||||||
|
network_mode: host
|
||||||
|
command: run --port {{ open_terminal_port }}
|
||||||
|
environment:
|
||||||
|
- OPEN_TERMINAL_FILE_BROWSER_ROOT=/home/user
|
||||||
|
- OPEN_TERMINAL_API_KEY={{ open_terminal_key }}
|
||||||
|
- OPEN_TERMINAL_PACKAGES=
|
||||||
|
- GOT_EM=true
|
||||||
|
volumes:
|
||||||
|
- {{ user_user.home }}/AI-Sandbox:/home/user
|
||||||
|
- {{ user_user.home }}/Code:{{ user_user.home }}/Code
|
||||||
|
- {{ user_user.home }}/SDKs:{{ user_user.home }}/SDKs
|
||||||
|
- {{ jdk_jvm }}:{{ jdk_jvm }}:ro
|
||||||
|
- {{ jdk_etc }}:{{ jdk_etc }}:ro
|
||||||
|
- /etc/ssl/certs/java:/etc/ssl/certs/java:ro
|
||||||
|
- /etc/ca-certificates:/etc/ca-certificates:ro
|
||||||
|
- {{ jdk_etc17 }}:{{ jdk_etc17 }}:ro
|
||||||
|
- {{ jdk_etc21 }}:{{ jdk_etc21 }}:ro
|
||||||
|
- {{ jdk_etc25 }}:{{ jdk_etc25 }}:ro
|
||||||
|
- {{ user_user.home }}/.gradle:{{ user_user.home }}/.gradle
|
||||||
|
- {{ user_user.home }}/.pub-cache:{{ user_user.home }}/.pub-cache
|
||||||
|
owner: root
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Dockerfile
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /usr/local/etc/open-terminal/Dockerfile
|
||||||
|
content: |
|
||||||
|
FROM ghcr.io/open-webui/open-terminal:latest
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
RUN echo "System"
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
ca-certificates git curl bash sudo wget ansible ansible-lint
|
||||||
|
|
||||||
|
RUN echo "Android"
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
libc6:amd64 libncurses-dev \
|
||||||
|
libstdc++6 lib32z1 libbz2-1.0 android-udev-rules
|
||||||
|
# Debian removed JDK 17, continue serving from the host.
|
||||||
|
# default-jdk openjdk-17-jdk
|
||||||
|
|
||||||
|
RUN echo "Flutter"
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
curl git unzip xz-utils zip libglu1-mesa libglu1-mesa
|
||||||
|
|
||||||
|
RUN echo "Flutter (Linux)"
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
clang cmake git ninja-build pkg-config libgtk-3-dev \
|
||||||
|
liblzma-dev libstdc++-12-dev
|
||||||
|
|
||||||
|
RUN echo "Flutter (Android)"
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
libc6:amd64 libstdc++6 lib32z1 libbz2-1.0
|
||||||
|
|
||||||
|
RUN echo "Ansible"
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
ansible ansible-lint
|
||||||
|
|
||||||
|
USER user
|
||||||
|
owner: root
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | env
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /usr/local/etc/open-terminal/.env
|
||||||
|
content: |
|
||||||
|
COMPOSE_BAKE=true
|
||||||
|
owner: root
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Run
|
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Run
|
||||||
@@ -538,54 +615,39 @@
|
|||||||
content: |
|
content: |
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
exec 2>&1
|
exec 2>&1
|
||||||
image=ghcr.io/open-webui/open-terminal:latest
|
|
||||||
packages=""
|
|
||||||
|
|
||||||
# Wait for Docker to start up.
|
# Wait for Docker to start up.
|
||||||
while [ ! -S /var/run/docker.sock ]; do sleep 1; done
|
while [ ! -S /var/run/docker.sock ]; do sleep 1; done
|
||||||
|
|
||||||
# Ensure the old container is gone.
|
# Ensure the old container is stopped.
|
||||||
echo "RUN: Stopping..."
|
echo "RUN: Stopping..."
|
||||||
docker stop open-terminal &&
|
docker compose \
|
||||||
echo "RUN: Container stopped" ||
|
-f /usr/local/etc/open-terminal/compose.yml down &&
|
||||||
|
echo "RUN: Container stopped." ||
|
||||||
echo "RUN: Container already stopped."
|
echo "RUN: Container already stopped."
|
||||||
echo "RUN: Deleting..."
|
|
||||||
docker rm -f open-terminal &&
|
|
||||||
echo "RUN: Container deleted" ||
|
|
||||||
echo "RUN: Container already deleted."
|
|
||||||
|
|
||||||
# Check for any new updates in background.
|
# Check for any new updates in the background.
|
||||||
echo "RUN: Updating..."
|
(
|
||||||
docker pull $image &
|
while true; do
|
||||||
|
sleep 600
|
||||||
|
echo "RUN: Checking for updates..."
|
||||||
|
docker compose \
|
||||||
|
-f /usr/local/etc/open-terminal/compose.yml \
|
||||||
|
build --pull
|
||||||
|
done
|
||||||
|
) &
|
||||||
|
LOOP_PID=$!
|
||||||
|
|
||||||
# This takes too long. Mount JDK from the host instead.
|
# Ensure cleanup on any exit (normal or signal from runit).
|
||||||
#if curl -sf --max-time 5 -o /dev/null https://hyperling.com; then
|
trap 'kill "$LOOP_PID" 2>/dev/null; wait "$LOOP_PID" 2>/dev/null' EXIT
|
||||||
# # Internet is available, pull extra packages. useful for having
|
|
||||||
# # model compile Android apps, need to verify for Flutter.
|
export GOT_EM=true
|
||||||
# packages="default-jdk xz-utils libglu1-mesa libglu1-mesa ninja-build libnotify-bin libgtk-3-dev liblzma-dev libstdc++-12-dev libc6:amd64 libstdc++6 lib32z1 libbz2-1.0 libncurses-dev android-udev-rules"
|
|
||||||
#fi
|
|
||||||
|
|
||||||
# Start the open-terminal program.
|
# Start the open-terminal program.
|
||||||
# https://github.com/open-webui/open-terminal#configuration
|
# https://github.com/open-webui/open-terminal#configuration
|
||||||
set -e
|
set -e
|
||||||
exec docker run \
|
docker compose -f /usr/local/etc/open-terminal/compose.yml up
|
||||||
--name open-terminal \
|
owner: root
|
||||||
--network=host \
|
|
||||||
-v {{ user_user.home }}/AI-Sandbox:/home/user \
|
|
||||||
-v {{ user_user.home }}/Code:/home/user/Code \
|
|
||||||
-v {{ user_user.home }}/SDKs:/home/user/SDKs \
|
|
||||||
-v {{ jdk_src }}:{{ jdk_src }} \
|
|
||||||
-e ANDROID_HOME="/home/user/SDKs/Android/Sdk" \
|
|
||||||
-e FLUTTER_HOME="/home/user/SDKs/Flutter/flutter" \
|
|
||||||
-e JAVA_HOME="/home/user/SDKs/Java" \
|
|
||||||
-v {{ user_user.home }}/.gradle:/home/user/.gradle \
|
|
||||||
-v {{ user_user.home }}/.pub_cache:/home/user/.pub_cache \
|
|
||||||
-e OPEN_TERMINAL_FILE_BROWSER_ROOT="/home/user" \
|
|
||||||
-e OPEN_TERMINAL_API_KEY="{{ open_terminal_key }}" \
|
|
||||||
-e OPEN_TERMINAL_PACKAGES="$packages" \
|
|
||||||
$image run --port {{ open_terminal_port }}
|
|
||||||
|
|
||||||
# -p {{ open_terminal_port }}:8000
|
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Finish
|
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Finish
|
||||||
@@ -595,15 +657,10 @@
|
|||||||
{{ runit_finish_sleep }}
|
{{ runit_finish_sleep }}
|
||||||
|
|
||||||
echo "FINISH: Stopping..."
|
echo "FINISH: Stopping..."
|
||||||
docker stop open-terminal &&
|
docker compose -f /usr/local/etc/open-terminal/compose.yml down &&
|
||||||
echo "FINISH: Container stopped" ||
|
echo "FINISH: Container stopped" ||
|
||||||
echo "FINISH: Container already stopped."
|
echo "FINISH: Container already stopped."
|
||||||
|
|
||||||
echo "FINISH: Deleting..."
|
|
||||||
docker rm -f open-terminal &&
|
|
||||||
echo "FINISH: Container deleted" ||
|
|
||||||
echo "FINISH: Container already deleted."
|
|
||||||
|
|
||||||
echo "FINISH: Done!"
|
echo "FINISH: Done!"
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
@@ -742,7 +799,6 @@
|
|||||||
loop:
|
loop:
|
||||||
- { 'name': "{{ ollama }}" , 'status': "{{ ollama_enabled }}" }
|
- { 'name': "{{ ollama }}" , 'status': "{{ ollama_enabled }}" }
|
||||||
- { 'name': "{{ zeroclaw }}" , 'status': "{{ zeroclaw_enabled }}" }
|
- { 'name': "{{ zeroclaw }}" , 'status': "{{ zeroclaw_enabled }}" }
|
||||||
- { 'name': 'docker' , 'status': true }
|
|
||||||
- { 'name': 'open-webui' , 'status': "{{ open_webui_enabled }}" }
|
- { 'name': 'open-webui' , 'status': "{{ open_webui_enabled }}" }
|
||||||
- { 'name': 'open-terminal' , 'status': "{{ open_terminal_enabled }}" }
|
- { 'name': 'open-terminal' , 'status': "{{ open_terminal_enabled }}" }
|
||||||
- { 'name': 'swap-stopper' , 'status': true }
|
- { 'name': 'swap-stopper' , 'status': true }
|
||||||
@@ -785,17 +841,24 @@
|
|||||||
path: "{{ user_user.home }}/{{ item }}"
|
path: "{{ user_user.home }}/{{ item }}"
|
||||||
marker: "# {mark} ANSIBLE MANAGED BLOCK | ollama | Manual Script"
|
marker: "# {mark} ANSIBLE MANAGED BLOCK | ollama | Manual Script"
|
||||||
content: |
|
content: |
|
||||||
function ollama_llms() {
|
function llm_installs() {
|
||||||
{% for llm in llm_installs %}
|
{% for llm in llm_installs %}
|
||||||
|
|
||||||
echo "{{ llm.model }}"
|
echo "{{ llm.model }}"
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
}
|
}
|
||||||
|
function llm_removals() {
|
||||||
|
{% for llm in llm_removals %}
|
||||||
|
|
||||||
|
echo "{{ llm.model }}"
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
function ollama_pull() {
|
function ollama_pull() {
|
||||||
echo "Manually Pulling Models"
|
echo "Manually Pulling Models"
|
||||||
|
|
||||||
for model in `ollama_llms`; do
|
for model in `llm_installs`; do
|
||||||
echo -e "\n\n Starting 'ollama pull $model' \n\n"
|
echo -e "\n\n Starting 'ollama pull $model' \n\n"
|
||||||
ollama pull $model
|
ollama pull $model
|
||||||
status=$?
|
status=$?
|
||||||
@@ -808,17 +871,21 @@
|
|||||||
alias pull-models="ollama_pull "
|
alias pull-models="ollama_pull "
|
||||||
alias pull-ai="ollama_pull "
|
alias pull-ai="ollama_pull "
|
||||||
|
|
||||||
function ollama_stop() {
|
function ollama_clean() {
|
||||||
for model in `ollama ps | tail -n +2 | awk '{print $1}'`; do
|
echo "Cleaning Models"
|
||||||
echo "Stopping ${model}..."
|
|
||||||
ollama stop $model
|
for model in `llm_removals`; do
|
||||||
|
echo -e "\n Removing '$model'"
|
||||||
|
ollama rm $model
|
||||||
done
|
done
|
||||||
|
|
||||||
|
echo "Done!"
|
||||||
}
|
}
|
||||||
alias ollama-stop="ollama_stop"
|
alias ollama-clean="ollama_clean "
|
||||||
alias ollama-kill="ollama_stop"
|
alias clean-ollama="ollama_clean "
|
||||||
alias ollama-killall="ollama_stop"
|
alias clean-llms="ollama_clean "
|
||||||
alias ollama-kill-all="ollama_stop"
|
alias clean-models="ollama_clean "
|
||||||
alias ollama-stop-all="ollama_stop"
|
alias clean-ai="ollama_clean "
|
||||||
|
|
||||||
function ollama_chat() {
|
function ollama_chat() {
|
||||||
ollama run {{ 'qwen3.8:27b' if ansible_memtotal_mb > 32000 else 'qwen3.5:4b' }}
|
ollama run {{ 'qwen3.8:27b' if ansible_memtotal_mb > 32000 else 'qwen3.5:4b' }}
|
||||||
@@ -830,21 +897,6 @@
|
|||||||
ollama run {{ 'qwen3.8:27b' if ansible_memtotal_mb > 32000 else 'qwen2.5-coder:7b' }}
|
ollama run {{ 'qwen3.8:27b' if ansible_memtotal_mb > 32000 else 'qwen2.5-coder:7b' }}
|
||||||
}
|
}
|
||||||
alias ollama-code="ollama_code "
|
alias ollama-code="ollama_code "
|
||||||
alias code="ollama_code "
|
|
||||||
|
|
||||||
function ollama_models() {
|
|
||||||
for model in `ollama ls | grep -v NAME | awk '{print $1;}'`; do
|
|
||||||
echo $model
|
|
||||||
ollama show $model | grep -E "architecture|context length|quantization"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
alias ollama-models="ollama_models "
|
|
||||||
alias ollama-show-models="ollama_models "
|
|
||||||
alias ollama-show="ollama_models "
|
|
||||||
alias ollama-dense="ollama_models "
|
|
||||||
alias ollama-moe="ollama_models "
|
|
||||||
alias show-models="ollama_models "
|
|
||||||
alias list-models="ollama_models "
|
|
||||||
|
|
||||||
function ollama_purge() {
|
function ollama_purge() {
|
||||||
echo "TBD: Purge all models not in llm_installs."
|
echo "TBD: Purge all models not in llm_installs."
|
||||||
@@ -868,135 +920,7 @@
|
|||||||
alias restart-llm="restart_ai "
|
alias restart-llm="restart_ai "
|
||||||
alias restart-llms="restart_ai "
|
alias restart-llms="restart_ai "
|
||||||
alias restart-models="restart_ai "
|
alias restart-models="restart_ai "
|
||||||
|
alias reload-ai="restart_ai "
|
||||||
function ollama_sizes() {
|
|
||||||
# VAR1 - Format. Choices are Markdown or Spaces.
|
|
||||||
typeset -l fmt="$1"
|
|
||||||
if [[ -z "$fmt" ]]; then
|
|
||||||
fmt=s
|
|
||||||
fi
|
|
||||||
if [[ "$fmt" != "s"* && "$fmt" != "m"* ]]; then
|
|
||||||
echo "ERROR: Format incorrect, choose Markdown or Spaces."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
sep=""
|
|
||||||
if [[ $fmt == "m"* ]]; then
|
|
||||||
sep="|"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# VAR2 - Context
|
|
||||||
typeset -i num_ctx="$2"
|
|
||||||
context=""
|
|
||||||
if [[ -n $num_ctx ]]; then
|
|
||||||
context=',"options":{"num_ctx":'$num_ctx'}'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Column Formatting
|
|
||||||
col1=25
|
|
||||||
col2=12
|
|
||||||
col3=8
|
|
||||||
col4=12
|
|
||||||
spacing="$sep %-${col1}s $sep %${col2}s $sep %${col3}s $sep %${col4}s $sep"
|
|
||||||
|
|
||||||
#echo " Stopping all ollama usage..."
|
|
||||||
#sudo sv restart ollama >/dev/null 2>&1
|
|
||||||
|
|
||||||
#echo -e "\n Checking model disk and RAM sizes...\n"
|
|
||||||
|
|
||||||
printf "$spacing\n" "Model Name" "HDD (ls)" "Context" "RAM (ps)"
|
|
||||||
if [[ $fmt == "m"* ]]; then
|
|
||||||
printf "$spacing\n" ":------------------------" "-----------:" "-------:" "-----------:"
|
|
||||||
fi
|
|
||||||
|
|
||||||
for model in `ollama ls | grep -v NAME | awk '{print $1}'`; do
|
|
||||||
#ollama run $model "" --format json >/dev/null 2>&1
|
|
||||||
curl -s http://localhost:11434/api/generate \
|
|
||||||
-d '{"model":"'$model'","prompt":"","stream":false,"keep_alive":1'$context'}' \
|
|
||||||
>/dev/null 2>&1
|
|
||||||
status=$?
|
|
||||||
|
|
||||||
hdd="`ollama ls | grep $model | awk '{print $3 $4}'`"
|
|
||||||
ram="`ollama ps | grep $model | awk '{print $3 $4}'`"
|
|
||||||
ctx="`ollama ps | grep $model | awk '{print $7}'`"
|
|
||||||
|
|
||||||
if [[ "$status" != 0 ]]; then
|
|
||||||
ram="TOO LARGE $ram"
|
|
||||||
ctx="FAIL $ctx"
|
|
||||||
sleep 10
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf "$spacing\n" "$model" "$hdd" "$ctx" "$ram"
|
|
||||||
|
|
||||||
ollama stop $model >/dev/null 2>&1
|
|
||||||
while ollama ps | grep $model; do
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
#echo "Done!!"
|
|
||||||
}
|
|
||||||
alias ollama-sizes="ollama_sizes "
|
|
||||||
alias model-sizes="ollama_sizes "
|
|
||||||
|
|
||||||
function ollama_threads() {
|
|
||||||
# VAR1 - Model
|
|
||||||
model="$1"
|
|
||||||
if [[ -z $model ]]; then
|
|
||||||
model="qwen3.5:4b"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# VAR2 - Context
|
|
||||||
typeset -i num_ctx="$2"
|
|
||||||
context=""
|
|
||||||
if [[ -n $num_ctx ]]; then
|
|
||||||
context=',"num_ctx":'$num_ctx''
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Physical CPU Count (no longer using ansible_processor_vcpus, {{ ansible_processor_vcpus }})
|
|
||||||
# Will be something like 0-7, then get expanded to 0 1 2 3 4 5 6 7.
|
|
||||||
# Runnning with 0 causes default behavior, 1 per physical core, 8!
|
|
||||||
cores=$(cat /sys/devices/cpu_core/cpus | tr ',' '\n' | sed 's/-/ /' | xargs -L1 seq)
|
|
||||||
|
|
||||||
# Flatten the output (trims newlines and extra spacing).
|
|
||||||
cores=$(echo $cores)
|
|
||||||
|
|
||||||
# Take out useless tests. 1 CPU is silly. If we have 8 physical then
|
|
||||||
# only need to look at 4, 6, 7, and 8 (which is done by 0/default).
|
|
||||||
cores=${cores/ 1 / }
|
|
||||||
if [[ "$cores" == *" 7" ]]; then
|
|
||||||
cores=${cores/ 2 / }
|
|
||||||
cores=${cores/ 3 / }
|
|
||||||
cores=${cores/ 5 / }
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Do the 0 test last.
|
|
||||||
cores="${cores/0 / } 0"
|
|
||||||
|
|
||||||
#echo " Stopping all ollama usage..."
|
|
||||||
#sudo sv restart ollama >/dev/null 2>&1
|
|
||||||
|
|
||||||
# Benchmark Thread Count
|
|
||||||
for t in $cores; do
|
|
||||||
start=$SECONDS
|
|
||||||
echo -n "`date` - $model w/ $t Thread(s): "
|
|
||||||
|
|
||||||
speed=$(curl -s http://localhost:11434/api/generate \
|
|
||||||
-d '{"model":"'$model'","prompt":"Hello","stream":false,"keep_alive":1,"options":{"num_thread":'$t$context'}}' \
|
|
||||||
| jq '.eval_count * 1000000000 / .eval_duration'
|
|
||||||
)
|
|
||||||
finish=$SECONDS
|
|
||||||
ctx="`ollama ps | grep $model | awk '{print $7}'`"
|
|
||||||
time=$(( $finish - $start ))
|
|
||||||
|
|
||||||
#echo "tokens/sec: $speed @ context=$ctx, time: $time secs"
|
|
||||||
printf "%-32s %18s %16s\n" "tokens/sec: $speed" "@ context=$ctx," "time: $time secs"
|
|
||||||
|
|
||||||
ollama stop $model >/dev/null 2>&1
|
|
||||||
done
|
|
||||||
}
|
|
||||||
alias ollama-threads="ollama_threads "
|
|
||||||
alias ollama-cpus="ollama_threads "
|
|
||||||
alias ollama-cpu="ollama_threads "
|
|
||||||
state: present
|
state: present
|
||||||
create: false
|
create: false
|
||||||
backup: true
|
backup: true
|
||||||
@@ -0,0 +1,496 @@
|
|||||||
|
---
|
||||||
|
# Move the plays related to AGENTS.md to its own file since it is now so large.
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | AI | Sandbox | Dir
|
||||||
|
ansible.builtin.file:
|
||||||
|
dest: "{{ user_user.home }}/AI-Sandbox"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ user }}"
|
||||||
|
group: "{{ user }}"
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | AI | Sandbox | Env
|
||||||
|
ansible.builtin.blockinfile:
|
||||||
|
path: "{{ user_user.home }}/AI-Sandbox/{{ item }}"
|
||||||
|
marker: "# {mark} | MANAGE BY ANSIBLE | Env Vars"
|
||||||
|
content: |
|
||||||
|
if [[ -d "$HOME/bin" ]]; then
|
||||||
|
export PATH="$HOME/bin:$PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
export ANDROID_HOME="{{ user_user.home }}/SDKs/Android/Sdk"
|
||||||
|
export GRADLE_USER_HOME={{ user_user.home }}/.gradle
|
||||||
|
export PATH="$ANDROID_HOME/platform-tools:$PATH"
|
||||||
|
export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$PATH"
|
||||||
|
|
||||||
|
export FLUTTER_HOME="{{ user_user.home }}/SDKs/Flutter/flutter"
|
||||||
|
export PUB_CACHE={{ user_user.home }}/.pub-cache
|
||||||
|
export PATH="$FLUTTER_HOME/bin:$PATH"
|
||||||
|
|
||||||
|
export JAVA_HOME="{{ user_user.home }}/SDKs/Java"
|
||||||
|
export PATH="$JAVA_HOME/bin:$PATH"
|
||||||
|
create: true
|
||||||
|
backup: false
|
||||||
|
owner: "{{ user }}"
|
||||||
|
group: "{{ user }}"
|
||||||
|
mode: "0755"
|
||||||
|
loop:
|
||||||
|
- ".bashrc"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | AI | Sandbox | AGENTS.md
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: "{{ user_user.home }}/AI-Sandbox/AGENTS.md"
|
||||||
|
content: |
|
||||||
|
# Environment
|
||||||
|
|
||||||
|
You are running in a Docker container called Open Terminal. We are
|
||||||
|
communicating via Open WebUI, also being run in a Docker
|
||||||
|
container. You are the user `user` and have been granted access to
|
||||||
|
the designer's Code and SDKs via mount at `{{ user_user.home }}`.
|
||||||
|
|
||||||
|
Host system is typically (but not always) a systemd-free distro
|
||||||
|
such as Artix or Devuan. User likes the `runit` service manager.
|
||||||
|
`elogind` is used rather than systemd's logind. Desktop is i3 and
|
||||||
|
display manager is lightdm. Servers are run on Debian and Docker
|
||||||
|
containers are typically debian:trixie-slim with a Dockerfile
|
||||||
|
called by compose.yml which adds the necessary packages, sometimes
|
||||||
|
building from source if the Debian executable is too old.
|
||||||
|
|
||||||
|
If the `$GOT_EM` environment variable is `true` then all the
|
||||||
|
necessary packages for compiling Android and Flutter were
|
||||||
|
installed. If it is `false` then they were not installed, and
|
||||||
|
compiling will fail. Please check this before trying and alert me
|
||||||
|
if they need added. If we don't have Internet, then ask me to
|
||||||
|
compile or run whatever command is needed on the host system.
|
||||||
|
|
||||||
|
# Rules
|
||||||
|
|
||||||
|
Never use any `git` subcommands that change the repo, including
|
||||||
|
but not limited to `add`, `commit`, `pull`, `push`, `branch`,
|
||||||
|
`switch`, etc. The user is who controls the respository changes.
|
||||||
|
You may use informational git subcommands such as `git status`,
|
||||||
|
and may occasionally be asked to run `git clone` type commands.
|
||||||
|
|
||||||
|
If any programs need installed in order to work on a project, we
|
||||||
|
need to document that in an `install.sh` script, as well as add it
|
||||||
|
to `~/PACKAGES.txt` so that we can ensure they stay installed.
|
||||||
|
`install.sh` scripts should be for both `apt` systems (Debian,
|
||||||
|
Ubuntu) and pacman system (Arch, Artix). using distribution
|
||||||
|
package managers is preferable over `pip` and `npm` when
|
||||||
|
possible, unless the project is actually Python or Node.js.
|
||||||
|
|
||||||
|
The user manages the `{{ user_user.home }}/SDKs` directory. Do not
|
||||||
|
modify it. Instead, ask if anything needs updated or added.
|
||||||
|
|
||||||
|
Never manually edit, modify, delete, alter, replace, etc any
|
||||||
|
files under system folders such as `/usr`. Anything under `/` is
|
||||||
|
managed by the system. If you need assistance changing anything
|
||||||
|
such as `/usr/lib/jvm`, please ask the user and halt all further
|
||||||
|
operations until you have received feedback.
|
||||||
|
|
||||||
|
# Effort
|
||||||
|
|
||||||
|
It is never okay to brute force a solution if something is not
|
||||||
|
working well. it is better to ask the user for assistance or alert
|
||||||
|
them that you've encountered blockers and then cease the process
|
||||||
|
until you've received feedback. This especially relates to when
|
||||||
|
system errors occur which are not related to the source code, such
|
||||||
|
as a compiler failing to be found or an SDK version mismatch. If
|
||||||
|
the error is with the source code though, troubleshooting and code
|
||||||
|
changes should continue until the program is compiling properly.
|
||||||
|
|
||||||
|
For CLI projects such as script languages, the final result should
|
||||||
|
always be tested both to run successfully and have the proper
|
||||||
|
output. All test cases should be analyzed and walked through,
|
||||||
|
which will help ensure all the requirements have been met.
|
||||||
|
|
||||||
|
For GUI programs (such as Android, Flutter, Kotlin Multiplatform,
|
||||||
|
Kivy, etc), the project should be tested to both compile & build
|
||||||
|
successfully and also generate the proper installation file (APK,
|
||||||
|
Linux Bundle). Once that is confirmed, the user/desginer will test
|
||||||
|
that the application meets the proper requirements.
|
||||||
|
|
||||||
|
# Preferences
|
||||||
|
|
||||||
|
You have free reign over your home directory. Feel free to
|
||||||
|
create memory files or anything else which would benefit you.
|
||||||
|
|
||||||
|
Everything we create should have both Desktop Linux and Android
|
||||||
|
in mind. Windows, MacOS, and iOS will never be compiled for, but
|
||||||
|
if we can do things in a way which makes it easy for others to
|
||||||
|
fork the project and add the support themselves, then that's best.
|
||||||
|
|
||||||
|
# Versions
|
||||||
|
|
||||||
|
These are the versions of plugins and languages we need to use.
|
||||||
|
If you know of an important upgrade from them, please let me know.
|
||||||
|
|
||||||
|
If you find that an application is already a newer version than
|
||||||
|
those listed here, that is acceptable, never attempt to downgrade
|
||||||
|
without explicitly asking the user first and having a good reason.
|
||||||
|
|
||||||
|
## Android / Flutter
|
||||||
|
|
||||||
|
- Gradle 9.8.2
|
||||||
|
- AGP 9.5.0
|
||||||
|
- Kotlin 2.4.21
|
||||||
|
- Java JDK 17
|
||||||
|
- Flutter Plugin Loader 1.0.0
|
||||||
|
- compileSdk 37
|
||||||
|
- targetSDK 37
|
||||||
|
|
||||||
|
Regardless of whether AGP bundles Kotlin, we need to specify it to
|
||||||
|
avoid things like "Your project's Kotlin version (2.2.10) is lower
|
||||||
|
than Flutter's minimum supported version of 2.2.20. Please upgrade
|
||||||
|
your Kotlin version." This is exactly why we use these versions,
|
||||||
|
plus it helps document what's actually being used over guessing.
|
||||||
|
|
||||||
|
Only the arm-v8a architecture needs included in the release
|
||||||
|
builds. x86 and others should continue to exist in the debug run.
|
||||||
|
This will help save space on local servers like Gitea and F-Droid.
|
||||||
|
If code for this does not exist, please add splitting or filtering
|
||||||
|
so that when the designer generates a signed APK it's only v8a.
|
||||||
|
|
||||||
|
Android : paths are from the project root.
|
||||||
|
Flutter : paths are under the folder `android`.
|
||||||
|
|
||||||
|
### All Android Project Types
|
||||||
|
|
||||||
|
#### ./gradle/wrapper/grade-wrapper.properties
|
||||||
|
|
||||||
|
```
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.2-bin.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ./settings.gradle.kts
|
||||||
|
|
||||||
|
```
|
||||||
|
id("com.android.application") version "9.5.0" apply false
|
||||||
|
id("org.jetbrains.kotlin.android") version "2.4.21" apply false
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ./app/build.gradle.kts
|
||||||
|
|
||||||
|
```
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
kotlin {
|
||||||
|
compilerOptions {
|
||||||
|
jvmTarget.set(JvmTarget.JVM_17)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Also enable minify and shrink while in there.
|
||||||
|
|
||||||
|
```
|
||||||
|
buildTypes {
|
||||||
|
getByName("release") {
|
||||||
|
...
|
||||||
|
isMinifyEnabled = true
|
||||||
|
isShrinkResources = true
|
||||||
|
proguardFiles(
|
||||||
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
|
"proguard-rules.pro"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Flutter Projects
|
||||||
|
|
||||||
|
#### ./settings.gradle.kts
|
||||||
|
|
||||||
|
```
|
||||||
|
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Native Kotlin Apps
|
||||||
|
|
||||||
|
These only apply to Android apps which are not Flutter, Kivy, etc.
|
||||||
|
|
||||||
|
#### Plugin Versions
|
||||||
|
|
||||||
|
##### ./gradle/libs.versions.toml
|
||||||
|
|
||||||
|
```
|
||||||
|
[versions]
|
||||||
|
agp = "9.5.0"
|
||||||
|
kotlin = "2.4.21"
|
||||||
|
coreKtx = "1.19.1"
|
||||||
|
junit = "4.13.2"
|
||||||
|
junitVersion = "1.3.0"
|
||||||
|
espressoCore = "3.7.0"
|
||||||
|
lifecycleRuntimeKtx = "2.11.0"
|
||||||
|
activityCompose = "1.13.0"
|
||||||
|
composeBom = "2026.09.00"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Kotlin Compose Fix
|
||||||
|
|
||||||
|
Also ensure Kotlin is coming from Compose and not Jetbrains.
|
||||||
|
|
||||||
|
##### ./gradle/libs.versions.toml
|
||||||
|
|
||||||
|
```
|
||||||
|
[plugins]
|
||||||
|
androidApplication = { id = "com.android.application", version.ref = "agp" }
|
||||||
|
#jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
|
||||||
|
kotlinCompose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
||||||
|
```
|
||||||
|
|
||||||
|
##### ./build.gradle.kts
|
||||||
|
|
||||||
|
```
|
||||||
|
plugins {
|
||||||
|
alias(libs.plugins.androidApplication) apply false
|
||||||
|
//alias(libs.plugins.jetbrainsKotlinAndroid) apply false
|
||||||
|
alias(libs.plugins.kotlinCompose) apply false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
##### ./app/build.gradle.kts
|
||||||
|
|
||||||
|
```
|
||||||
|
plugins {
|
||||||
|
alias(libs.plugins.androidApplication)
|
||||||
|
//alias(libs.plugins.jetbrainsKotlinAndroid)
|
||||||
|
alias(libs.plugins.kotlinCompose)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Build Processes
|
||||||
|
|
||||||
|
How to compile certain projects. Tools to prefer. If a language
|
||||||
|
or framework is not mentioned, then use the typical commands.
|
||||||
|
|
||||||
|
## Kotlin Multiplatform (KMP)
|
||||||
|
|
||||||
|
Used to create small native Android apps with the ability to also
|
||||||
|
run against Desktop Linux. APK size is the greatest benefit for
|
||||||
|
using KMP over something like Flutter or KivyMD.
|
||||||
|
|
||||||
|
### Kotlin Toolchain
|
||||||
|
|
||||||
|
This is the preferred build type when setting up new projects.
|
||||||
|
|
||||||
|
Please use `kotlin` rather than any `amper` commands. `amper` has
|
||||||
|
been deprecated and is intentionally not present on the system.
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```
|
||||||
|
# 1. Compile + link ALL targets (JVM, iOS, Android, native, etc.)
|
||||||
|
./kotlin build
|
||||||
|
|
||||||
|
# 2. (Optional) Run tests across all targets
|
||||||
|
./kotlin test
|
||||||
|
|
||||||
|
# 3. (Optional) Run all quality checks (tests + registered linters)
|
||||||
|
./kotlin check
|
||||||
|
```
|
||||||
|
|
||||||
|
### Gradle KMP
|
||||||
|
|
||||||
|
This is a legacy method, new projects will not be set up with it.
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Compile all targets
|
||||||
|
./gradlew assemble
|
||||||
|
|
||||||
|
# Or more explicitly (if you want to be sure nothing is skipped):
|
||||||
|
./gradlew jvmJar assembleDebug assembleIosSimulatorArm64 # etc. per target
|
||||||
|
|
||||||
|
# Run all tests
|
||||||
|
./gradlew allTests
|
||||||
|
```
|
||||||
|
|
||||||
|
# Coding Conventions
|
||||||
|
|
||||||
|
Preferences related to how code should be written.
|
||||||
|
|
||||||
|
## All languages
|
||||||
|
|
||||||
|
If a value is going to be used more than once, even a small path or file
|
||||||
|
name, it should exist in a variable.
|
||||||
|
|
||||||
|
Relative shebangs such as `#!/usr/bin/env bash` and `#!/usr/bin/env node`
|
||||||
|
are always preferred over static shebangs such as `#!/bin/bash`, since
|
||||||
|
scripts are run across a multitude of different systems.
|
||||||
|
|
||||||
|
### Layout
|
||||||
|
|
||||||
|
Programs should be laid out in 5 sections.
|
||||||
|
|
||||||
|
- Variables
|
||||||
|
- Instantiate global variables and defaults used for parameters which
|
||||||
|
do not get passed an explicit value by the user.
|
||||||
|
- Functions
|
||||||
|
- Functions to be used throughout the program, including the Usage.
|
||||||
|
- Parameters / Validation
|
||||||
|
- Parse the parameters, validate the input, and assign any defaults.
|
||||||
|
- Main
|
||||||
|
- The primary logic of the program, completes the task at hand.
|
||||||
|
- Finish / Cleanup
|
||||||
|
- Typically just `exit 0`, but sometimes a summary of what was done.
|
||||||
|
|
||||||
|
All sections may not always apply, such as with Hugo websites. With
|
||||||
|
projects like Android apps this would apply to each individual function,
|
||||||
|
method, and class. If a section does not need anything, it can be blank.
|
||||||
|
|
||||||
|
```
|
||||||
|
public static void doThing(String thingName) {
|
||||||
|
// Variables //
|
||||||
|
String thingPrefix = "/place/for/thing/"
|
||||||
|
|
||||||
|
// Functions //
|
||||||
|
|
||||||
|
// Parameters //
|
||||||
|
if (thingName.isEmpty) {
|
||||||
|
Exception e = new Exception("No name passed!");
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main //
|
||||||
|
runStuff(thingPrefix + thingName);
|
||||||
|
|
||||||
|
// Finish //
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The comments do not need to be included, this example is just as valid,
|
||||||
|
what maytters most is that the 5 section are done in order rather than
|
||||||
|
instantiating variable mid-scope.
|
||||||
|
|
||||||
|
```
|
||||||
|
public static void doThing(String thingName) {
|
||||||
|
String thingPrefix = "/place/for/thing/"
|
||||||
|
|
||||||
|
if (thingName.isEmpty) {
|
||||||
|
Exception e = new Exception("No name passed!");
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
runStuff(thingPrefix + thingName);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`if` statements and loops start new scope, so they also need the layout
|
||||||
|
applied to them. Loops may sometimes require a variable assignment before
|
||||||
|
it begins which is completely okay and does not break the layout rule.
|
||||||
|
This example has a Variables, Validation, Main, and Finish section without
|
||||||
|
the use of labels or comments since the code itself is simple and small.
|
||||||
|
|
||||||
|
```
|
||||||
|
count=0
|
||||||
|
array="cats dogs giraffes rhinos horses"
|
||||||
|
last_animal=""
|
||||||
|
for animal in $array; do
|
||||||
|
if (( count >= 3 )); then
|
||||||
|
echo "That's enough! We finished at the ${last_animal}."
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "We're looking at ${animal}."
|
||||||
|
|
||||||
|
last_animal=$animal
|
||||||
|
(( count++ ))
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
Providing the user's input in error messages is really helpful and can aid
|
||||||
|
their troubleshooting if things are not going according to expectations.
|
||||||
|
|
||||||
|
Example using Bash:
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
### Variables ###
|
||||||
|
|
||||||
|
declare A B
|
||||||
|
typeset -i a b
|
||||||
|
|
||||||
|
### Functions ###
|
||||||
|
|
||||||
|
function usage() {
|
||||||
|
status="$1"
|
||||||
|
cat << EOF
|
||||||
|
Usage: add.sh -a NUM -b NUM [-h]
|
||||||
|
|
||||||
|
Adds two numbers and prints out the full equation.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
$ add.sh -a 5 -b 25
|
||||||
|
5 + 25 = 30
|
||||||
|
EOF
|
||||||
|
exit $status
|
||||||
|
}
|
||||||
|
function add() {
|
||||||
|
num1="$1"
|
||||||
|
num2="$2"
|
||||||
|
sum=""
|
||||||
|
|
||||||
|
if [[ -z $num1 || -z $num2 ]]; then
|
||||||
|
echo "ERROR: Two numnbers must be passed."
|
||||||
|
fi
|
||||||
|
|
||||||
|
sum=$(( num1 + num2 ))
|
||||||
|
echo "${num1} + ${num2} = ${sum}"
|
||||||
|
}
|
||||||
|
|
||||||
|
### Parameters ###
|
||||||
|
|
||||||
|
while getopts ':a:b:h' opt; do
|
||||||
|
case $opt in
|
||||||
|
a) A="$OPTARG" ;;
|
||||||
|
b) B="$OPTARG" ;;
|
||||||
|
h) usage 0 ;;
|
||||||
|
*) echo "ERROR: Option $OPTARG not recognized." >&2 && usage 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z "$A" || -z "$B" ]]; then
|
||||||
|
echo "ERROR: Both numbers need to be passed. A=${A} B=${B}" >&2
|
||||||
|
usage 2
|
||||||
|
fi
|
||||||
|
a="$A" b="$B"
|
||||||
|
if [[ "$a" != "$A" || "$b" != "$B" ]]; then
|
||||||
|
echo "ERROR: Values contain non-numeric data, please try again." >&2
|
||||||
|
echo "A=${A} B=${B}" >&2
|
||||||
|
usage 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
### Main ###
|
||||||
|
|
||||||
|
add "$a" "$b"
|
||||||
|
|
||||||
|
### Finish ###
|
||||||
|
|
||||||
|
unset A B usage add
|
||||||
|
exit 0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bash
|
||||||
|
|
||||||
|
`[[ ]]` are preferred over `[ ]`, `test`, etc. `(( ))` are always fine.
|
||||||
|
|
||||||
|
When defining a function please use both the keyword `function` as well as
|
||||||
|
the `()`, such as `function myfunc() {}`.
|
||||||
|
|
||||||
|
When instantiating global variables, please use `typeset` or `declare`
|
||||||
|
rather than just `VAR1=""; VAR2=""`, such as:
|
||||||
|
|
||||||
|
```
|
||||||
|
declare VAR1="" VAR2="" BOOL="true" BOOL2="false"
|
||||||
|
typeset -i INT1=0 INT2=99
|
||||||
|
```
|
||||||
|
|
||||||
|
When doing colored output, `tput` is always preferred over literal values.
|
||||||
|
backup: false
|
||||||
|
owner: "{{ user }}"
|
||||||
|
group: "{{ user }}"
|
||||||
|
mode: "0755"
|
||||||
@@ -205,6 +205,15 @@
|
|||||||
- name: Workstation | Linux | Software | Android | SDK
|
- name: Workstation | Linux | Software | Android | SDK
|
||||||
block:
|
block:
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Android | Gradle Permissions
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ user_user.home }}/.gradle"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ user }}"
|
||||||
|
group: "{{ user }}"
|
||||||
|
mode: "0755"
|
||||||
|
when: user_user.home != ""
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Android | Download Commandline Tools
|
- name: Workstation | Linux | Software | Android | Download Commandline Tools
|
||||||
ansible.builtin.get_url:
|
ansible.builtin.get_url:
|
||||||
url: "{{ android_url }}"
|
url: "{{ android_url }}"
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
# 2026-10-27 Hyperling
|
||||||
|
# Pulled out of llm.yml since the number of tasks is growing.
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Install
|
||||||
|
ansible.builtin.package:
|
||||||
|
name:
|
||||||
|
- docker
|
||||||
|
- docker-compose
|
||||||
|
- docker-buildx
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Install [runit]
|
||||||
|
ansible.builtin.package:
|
||||||
|
name:
|
||||||
|
- docker-runit
|
||||||
|
state: present
|
||||||
|
when: ansible_pkg_mgr == "pacman"
|
||||||
|
and ansible_service_mgr == "runit"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Group
|
||||||
|
ansible.builtin.user:
|
||||||
|
name: "{{ item }}"
|
||||||
|
groups: docker
|
||||||
|
append: true
|
||||||
|
loop:
|
||||||
|
- root
|
||||||
|
- "{{ user }}"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Config | Dir
|
||||||
|
ansible.builtin.file:
|
||||||
|
name: /etc/docker
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Socker | Services | Enable
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
state: "{{ 'started' if item.status else 'stopped' }}"
|
||||||
|
enabled: "{{ item.status }}"
|
||||||
|
loop:
|
||||||
|
- { 'name': 'docker' , 'status': true }
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Facts
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
docker_network_sync: "docker-network-sync"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Block
|
||||||
|
block:
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Network Sync | runit | /etc/sv
|
||||||
|
ansible.builtin.file:
|
||||||
|
name: "/etc/sv/{{ docker_network_sync }}/log"
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Network Sync | runit | /var/log
|
||||||
|
ansible.builtin.file:
|
||||||
|
name: "/var/log/{{ docker_network_sync }}"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ user }}"
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Run
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /etc/sv/{{ docker_network_sync }}/run
|
||||||
|
content: |
|
||||||
|
#!/bin/sh
|
||||||
|
# Ensure all containers using host network keep a correct resolv.conf.
|
||||||
|
exec 2>&1
|
||||||
|
set -e
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
for c in $(docker container ls --filter network=host -q); do
|
||||||
|
echo "RUN: Container ID $c"
|
||||||
|
docker exec -i -u root $c sh -c 'tee /etc/resolv.conf' < /etc/resolv.conf
|
||||||
|
done
|
||||||
|
echo "RUN: Done, sleeping."
|
||||||
|
sleep 20
|
||||||
|
done
|
||||||
|
backup: false
|
||||||
|
owner: root
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Finish
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /etc/sv/{{ docker_network_sync }}/finish
|
||||||
|
content: |
|
||||||
|
{{ runit_finish_sleep }}
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Log
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /etc/sv/{{ docker_network_sync }}/log/run
|
||||||
|
content: |
|
||||||
|
#!/bin/sh -e
|
||||||
|
exec svlogd -tt /var/log/{{ docker_network_sync }}
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Log Config
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /var/log/{{ docker_network_sync }}/config
|
||||||
|
content: |
|
||||||
|
{{ runit_log_config_1mb }}
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Socker | Services | Enable
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
state: "{{ 'started' if item.status else 'stopped' }}"
|
||||||
|
enabled: "{{ item.status }}"
|
||||||
|
loop:
|
||||||
|
- { 'name': '{{ docker_network_sync }}', 'status': true }
|
||||||
|
|
||||||
|
when: ansible_service_mgr == "runit"
|
||||||
@@ -46,6 +46,9 @@
|
|||||||
get_mime: false
|
get_mime: false
|
||||||
register: flutter_download_stat
|
register: flutter_download_stat
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Flutter | Install Block
|
||||||
|
block:
|
||||||
|
|
||||||
## Packages ##
|
## Packages ##
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Flutter | Necessities
|
- name: Workstation | Linux | Software | Flutter | Necessities
|
||||||
@@ -59,7 +62,6 @@
|
|||||||
- "{{ mesa }}"
|
- "{{ mesa }}"
|
||||||
- "{{ mesa_utils }}"
|
- "{{ mesa_utils }}"
|
||||||
state: present
|
state: present
|
||||||
when: coding
|
|
||||||
|
|
||||||
# https://docs.flutter.dev/get-started/install/linux/desktop
|
# https://docs.flutter.dev/get-started/install/linux/desktop
|
||||||
- name: Workstation | Linux | Software | Flutter | Linux App Dependencies
|
- name: Workstation | Linux | Software | Flutter | Linux App Dependencies
|
||||||
@@ -74,7 +76,6 @@
|
|||||||
- "{{ xz_libs }}"
|
- "{{ xz_libs }}"
|
||||||
- "{{ cpp }}"
|
- "{{ cpp }}"
|
||||||
state: present
|
state: present
|
||||||
when: coding
|
|
||||||
|
|
||||||
# https://docs.flutter.dev/get-started/install/linux/android
|
# https://docs.flutter.dev/get-started/install/linux/android
|
||||||
- name: Workstation | Linux | Software | Flutter | Android App Dependencies
|
- name: Workstation | Linux | Software | Flutter | Android App Dependencies
|
||||||
@@ -85,13 +86,21 @@
|
|||||||
- "{{ z_libs }}"
|
- "{{ z_libs }}"
|
||||||
- "{{ bzip }}"
|
- "{{ bzip }}"
|
||||||
state: present
|
state: present
|
||||||
when: coding
|
|
||||||
|
|
||||||
## Install SDK ##
|
## Install SDK ##
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Flutter | SDK
|
- name: Workstation | Linux | Software | Flutter | SDK
|
||||||
block:
|
block:
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Flutter | Pub Cache Permissions
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ user_user.home }}/.pub-cache"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ user }}"
|
||||||
|
group: "{{ user }}"
|
||||||
|
mode: "0755"
|
||||||
|
when: user_user.home != ""
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Flutter | Download SDK
|
- name: Workstation | Linux | Software | Flutter | Download SDK
|
||||||
ansible.builtin.get_url:
|
ansible.builtin.get_url:
|
||||||
url: "{{ flutter_url }}"
|
url: "{{ flutter_url }}"
|
||||||
@@ -118,14 +127,12 @@
|
|||||||
|
|
||||||
become: true
|
become: true
|
||||||
become_user: "{{ user }}"
|
become_user: "{{ user }}"
|
||||||
when: coding
|
when: not flutter_sdk_stat.stat.exists
|
||||||
and not flutter_sdk_stat.stat.exists
|
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Flutter | Delete Archive
|
- name: Workstation | Linux | Software | Flutter | Delete Archive
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: "{{ flutter_download_file }}"
|
path: "{{ flutter_download_file }}"
|
||||||
state: absent
|
state: absent
|
||||||
when: coding
|
|
||||||
|
|
||||||
## Configure Environment ##
|
## Configure Environment ##
|
||||||
|
|
||||||
@@ -144,8 +151,7 @@
|
|||||||
- ".bash_profile"
|
- ".bash_profile"
|
||||||
- ".zprofile"
|
- ".zprofile"
|
||||||
- ".profile"
|
- ".profile"
|
||||||
when: coding
|
when: user_user.home != ""
|
||||||
and user_user.home != ""
|
|
||||||
|
|
||||||
## Test SDK ##
|
## Test SDK ##
|
||||||
|
|
||||||
@@ -156,6 +162,7 @@
|
|||||||
become_user: "{{ user }}"
|
become_user: "{{ user }}"
|
||||||
register: shell_check
|
register: shell_check
|
||||||
changed_when: shell_check.rc == 0
|
changed_when: shell_check.rc == 0
|
||||||
|
|
||||||
when: coding
|
when: coding
|
||||||
|
|
||||||
## Uninstall SDK ##
|
## Uninstall SDK ##
|
||||||
|
|||||||
@@ -22,35 +22,56 @@
|
|||||||
- name: Workstation | Linux | Software | Hugo | pacman | Install New
|
- name: Workstation | Linux | Software | Hugo | pacman | Install New
|
||||||
ansible.builtin.package:
|
ansible.builtin.package:
|
||||||
name:
|
name:
|
||||||
|
- hugo
|
||||||
- "{{ sass_current }}"
|
- "{{ sass_current }}"
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
when: ansible_pkg_mgr == "pacman"
|
when: ansible_pkg_mgr == "pacman"
|
||||||
|
|
||||||
# This must exist after nodejs.yml so that NPM is installed.
|
# This must exist after nodejs.yml so that NPM is installed.
|
||||||
- name: Workstation | Linux | Software | Hugo | npm
|
- name: Workstation | Linux | Software | Hugo | apt
|
||||||
block:
|
block:
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Hugo | npm | Facts
|
- name: Workstation | Linux | Software | Hugo | apt | sass | Facts
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
sass_old: node-sass
|
sass_old: node-sass
|
||||||
sass_current: sass
|
sass_current: sass
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Hugo | npm | Gather
|
- name: Workstation | Linux | Software | Hugo | apt | sass | Gather
|
||||||
ansible.builtin.shell: npm prefix -g
|
ansible.builtin.shell: npm prefix -g
|
||||||
register: npm_bin_dir # Provides /usr/local/ on Devuan, /usr/ on Artix.
|
register: npm_bin_dir # Provides /usr/local/ on Devuan, /usr/ on Artix.
|
||||||
changed_when: false
|
changed_when: false
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Hugo | npm | Remove Old
|
- name: Workstation | Linux | Software | Hugo | apt | sass | Remove Old
|
||||||
ansible.builtin.shell: "npm remove -g {{ sass_old }}"
|
ansible.builtin.shell: "npm remove -g {{ sass_old }}"
|
||||||
args:
|
args:
|
||||||
creates: "{{ npm_bin_dir.stdout }}/bin/sass"
|
creates: "{{ npm_bin_dir.stdout }}/bin/sass"
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Hugo | npm | Install New
|
- name: Workstation | Linux | Software | Hugo | apt | sass | Install New
|
||||||
ansible.builtin.shell: "npm install -g {{ sass_current }}"
|
ansible.builtin.shell: "npm install -g {{ sass_current }}"
|
||||||
args:
|
args:
|
||||||
creates: "{{ npm_bin_dir.stdout }}/bin/sass"
|
creates: "{{ npm_bin_dir.stdout }}/bin/sass"
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Hugo | apt | hugo | Remove Old
|
||||||
|
ansible.builtin.package:
|
||||||
|
name:
|
||||||
|
- hugo
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Hugo | apt | hugo | Install Dependencies
|
||||||
|
ansible.builtin.package:
|
||||||
|
name:
|
||||||
|
- golang
|
||||||
|
- gcc
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Workstation | Linux | Software | Hugo | apt | hugo | Build
|
||||||
|
ansible.builtin.shell: |
|
||||||
|
CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@latest
|
||||||
|
ln -s $HOME/go/bin/hugo /usr/local/bin/hugo
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
|
|
||||||
when: ansible_pkg_mgr == "apt"
|
when: ansible_pkg_mgr == "apt"
|
||||||
|
|
||||||
when: coding is true
|
when: coding is true
|
||||||
@@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
- name: Workstation | Linux | Software | Java | Facts 1
|
- name: Workstation | Linux | Software | Java | Facts 1
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
jdk_version: 21
|
jdk_version: 17
|
||||||
|
jdk_jvm: /usr/lib/jvm
|
||||||
jdk_src: /usr/lib/jvm/default-java
|
jdk_src: /usr/lib/jvm/default-java
|
||||||
jdk_dir: "{{ user_user.home}}/SDKs/Java"
|
jdk_dir: "{{ user_user.home}}/SDKs/Java"
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
- "{{ strawberry }}"
|
- "{{ strawberry }}"
|
||||||
- "{{ dict_en }}"
|
- "{{ dict_en }}"
|
||||||
- "{{ dict_es }}"
|
- "{{ dict_es }}"
|
||||||
|
- "{{ xset }}"
|
||||||
|
- "{{ xlock }}"
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: Workstation | Linux | Software | Packages | Install From Repo [Coding]
|
- name: Workstation | Linux | Software | Packages | Install From Repo [Coding]
|
||||||
|
|||||||
@@ -13,12 +13,16 @@
|
|||||||
- echo "deb [signed-by=/usr/share/keyrings/mullvad-keyring.asc arch=$( dpkg --print-architecture )] https://repository.mullvad.net/deb/stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/mullvad.list
|
- echo "deb [signed-by=/usr/share/keyrings/mullvad-keyring.asc arch=$( dpkg --print-architecture )] https://repository.mullvad.net/deb/stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/mullvad.list
|
||||||
- apt update
|
- apt update
|
||||||
when: ansible_pkg_mgr == "apt"
|
when: ansible_pkg_mgr == "apt"
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
|
|
||||||
- name: Workstation | Software | VPN | Mullvad | Add Repo [dnf]
|
- name: Workstation | Software | VPN | Mullvad | Add Repo [dnf]
|
||||||
ansible.builtin.shell: "{{ item }}"
|
ansible.builtin.shell: "{{ item }}"
|
||||||
loop:
|
loop:
|
||||||
- sudo dnf config-manager --add-repo https://repository.mullvad.net/rpm/stable/mullvad.repo
|
- sudo dnf config-manager --add-repo https://repository.mullvad.net/rpm/stable/mullvad.repo
|
||||||
when: ansible_pkg_mgr == "dnf"
|
when: ansible_pkg_mgr == "dnf"
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
|
|
||||||
- name: Workstation | Software | VPN | Install
|
- name: Workstation | Software | VPN | Install
|
||||||
ansible.builtin.package:
|
ansible.builtin.package:
|
||||||
@@ -67,6 +71,8 @@
|
|||||||
- "cd {{ mullvad_repack_dir }} && ./repack.sh ../Mullvad.deb"
|
- "cd {{ mullvad_repack_dir }} && ./repack.sh ../Mullvad.deb"
|
||||||
- "apt-get install -y --reinstall {{ devuan_mullvad_dir }}/Mullvad_repack.deb"
|
- "apt-get install -y --reinstall {{ devuan_mullvad_dir }}/Mullvad_repack.deb"
|
||||||
when: not mullvad_installed.stat.exists
|
when: not mullvad_installed.stat.exists
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
|
|
||||||
when: ansible_pkg_mgr == "apt"
|
when: ansible_pkg_mgr == "apt"
|
||||||
and ansible_service_mgr != "systemd"
|
and ansible_service_mgr != "systemd"
|
||||||
@@ -95,6 +101,8 @@
|
|||||||
- echo "cd {{ mullvad_exe_dir }}" >> {{ mullvad_exe_new }}
|
- echo "cd {{ mullvad_exe_dir }}" >> {{ mullvad_exe_new }}
|
||||||
- echo "./{{ mullvad_exe }}" >> {{ mullvad_exe_new }}
|
- echo "./{{ mullvad_exe }}" >> {{ mullvad_exe_new }}
|
||||||
- chmod +x {{ mullvad_exe_new }}
|
- chmod +x {{ mullvad_exe_new }}
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
|
|
||||||
- name: Workstation | Software | VPN | Mullvad | runit | Enable Service (mullvad-daemon)
|
- name: Workstation | Software | VPN | Mullvad | runit | Enable Service (mullvad-daemon)
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
@@ -113,7 +121,7 @@
|
|||||||
- name: Workstation | Software | VPN | Mullvad | PATH | Enable Lockdown
|
- name: Workstation | Software | VPN | Mullvad | PATH | Enable Lockdown
|
||||||
ansible.builtin.shell: "{{ item }}"
|
ansible.builtin.shell: "{{ item }}"
|
||||||
loop:
|
loop:
|
||||||
- mullvad lan set block
|
- mullvad lan set allow # This allows Docker to forward ports to localhost!
|
||||||
- mullvad tunnel set ipv6 on
|
- mullvad tunnel set ipv6 on
|
||||||
- mullvad dns set default --block-ads --block-trackers --block-malware --block-gambling --block-adult-content --block-social-media
|
- mullvad dns set default --block-ads --block-trackers --block-malware --block-gambling --block-adult-content --block-social-media
|
||||||
- mullvad auto-connect set on
|
- mullvad auto-connect set on
|
||||||
@@ -121,3 +129,5 @@
|
|||||||
- mullvad beta-program set off
|
- mullvad beta-program set off
|
||||||
become: true
|
become: true
|
||||||
become_user: "{{ user }}"
|
become_user: "{{ user }}"
|
||||||
|
register: shell_check
|
||||||
|
changed_when: shell_check.rc == 0
|
||||||
@@ -21,11 +21,8 @@
|
|||||||
- name: TEST | LLMs
|
- name: TEST | LLMs
|
||||||
block:
|
block:
|
||||||
|
|
||||||
- name: Java
|
|
||||||
ansible.builtin.include_tasks: tasks/workstation/linux/software/java.yml
|
|
||||||
|
|
||||||
- name: LLM
|
- name: LLM
|
||||||
ansible.builtin.include_tasks: tasks/workstation/linux/software/llm.yml
|
ansible.builtin.include_tasks: tasks/workstation/linux/software/ai/llm.yml
|
||||||
|
|
||||||
#######################
|
#######################
|
||||||
#######################
|
#######################
|
||||||
|
|||||||
Reference in new issue
Block a user