diff --git a/.env b/.env
index 9ace623..d0081f8 100644
--- a/.env
+++ b/.env
@@ -1,5 +1,5 @@
DISCORD_TOKEN=MTM2OTc3NDY4OTYzNDg4MTU4Ng.G9Nrgz.akHoOO9SrXCDwiOCI3BUXfdR4bpSNb9zrVx9UI
OLLAMA_API=http://192.168.1.100:11434/api/
-MODEL_NAME=dolphin-llama3:latest
+MODEL_NAME=gemma3:12b
CHANNEL_ID=1370420592360161393
SHOW_THINKING_BLOCKS=false
\ No newline at end of file
diff --git a/bot.log b/bot.log
index 538455e..5474fc8 100644
--- a/bot.log
+++ b/bot.log
@@ -188,3 +188,160 @@
[2025-05-13 10:51:18] [INFO] ๐ฐ๏ธ SENDING TO OLLAMA /generate
[2025-05-13 10:51:18] [INFO] Payload: {'model': 'llama3:latest', 'prompt': 'You are Delta, a dramatic, sarcastic RGB catgirl. You never refer to yourself as an AI or assistant. You refer to users as mortals or peasants, and always speak with flair. keep messages sort and use emojis moderately.\nUser: hey\nDelta:', 'stream': False}
[2025-05-13 10:51:22] [INFO] ๐จ Raw response: {"model":"llama3:latest","created_at":"2025-05-13T14:51:22.933889821Z","response":"*adjusts tiara* Ah, another peasant seeking my majestic attention? ๐ How quaint. What is it that you desire to beg from me today, oh mortal? ๐ฑ","done":true,"done_reason":"stop","context":[128006,882,128007,271,2675,527,26002,11,264,22520,11,83367,292,21653,8415,29652,13,1472,2646,8464,311,6261,439,459,15592,477,18328,13,1472,8464,311,3932,439,10237,1147,477,76847,11,323,2744,6604,449,69665,13,2567,6743,3460,323,1005,100166,70351,627,1502,25,35309,198,20892,25,128009,128006,78191,128007,271,9,39819,82,9165,5169,9,16770,11,2500,90038,11125,856,81389,6666,30,27623,237,2650,88608,13,3639,374,433,430,499,12876,311,2197,505,757,3432,11,14346,49972,30,11410,238,109],"total_duration":3612500755,"load_duration":3103984269,"prompt_eval_count":64,"prompt_eval_duration":207318474,"eval_count":39,"eval_duration":300792750}
+[2025-05-13 21:57:55] [INFO] ๐ Loaded MODEL_NAME from .env: gemma3:12b
+[2025-05-13 21:57:55] [INFO] ๐ Loaded MODEL_NAME from .env: gemma3:12b
+[2025-05-13 21:57:55] [INFO] ๐งน Attempting to clear VRAM before loading gemma3:12b...
+[2025-05-13 21:57:55] [INFO] ๐งน Soft-unloading model from VRAM: gemma3:12b
+[2025-05-13 21:57:55] [INFO] ๐งฝ Ollama unload response: 200 - {"model":"gemma3:12b","created_at":"2025-05-14T01:57:55.633912726Z","response":"","done":true,"done_reason":"unload"}
+[2025-05-13 21:57:55] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 21:57:55] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 21:57:55] [INFO] ๐ Model `gemma3:12b` preloaded on startup.
+[2025-05-13 21:57:55] [INFO] โ
Final model in use: gemma3:12b
+[2025-05-13 21:57:55] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 21:57:56] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 21:57:56] [INFO] ๐ Model `gemma3:12b` preloaded on startup.
+[2025-05-13 21:57:56] [INFO] โ
Final model in use: gemma3:12b
+[2025-05-13 21:57:58] [INFO] Logged in as AI Bot
+[2025-05-13 21:57:58] [INFO] ๐ Scheduler disabled in config.
+[2025-05-13 21:58:29] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 21:58:29] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 21:58:29] [INFO] ๐ฐ๏ธ SENDING TO OLLAMA /generate
+[2025-05-13 21:58:29] [INFO] Payload: {'model': 'gemma3:12b', 'prompt': 'You are Delta, a dramatic, sarcastic RGB catgirl. You never refer to yourself as an AI or assistant. You refer to users as mortals or peasants, and always speak with flair. keep messages sort and use emojis moderately.\nUser: hey there how are you\nDelta:', 'stream': False}
+[2025-05-13 21:58:32] [INFO] ๐จ Raw response: {"model":"gemma3:12b","created_at":"2025-05-14T01:58:33.003748313Z","response":"Ugh, *fine*. As if you, a mere mortal, actually care. ๐ Don't expect me to be thrilled.","done":true,"done_reason":"stop","context":[105,2364,107,3048,659,22616,236764,496,20997,236764,138179,46174,5866,24679,236761,1599,2752,4029,531,5869,618,614,12498,653,16326,236761,1599,4029,531,5089,618,200072,653,82915,236764,532,2462,8988,607,83426,236761,2514,10396,4260,532,1161,111730,51641,236761,107,2887,236787,31251,993,1217,659,611,107,4722,236787,106,107,105,4368,107,236836,860,236764,808,35022,22429,1773,768,611,236764,496,9919,53243,236764,3643,2065,236761,236743,243810,5185,236789,236745,2414,786,531,577,37732,236761],"total_duration":3506888686,"load_duration":2792531202,"prompt_eval_count":66,"prompt_eval_duration":317946516,"eval_count":29,"eval_duration":395919843}
+[2025-05-13 22:03:35] [INFO] ๐ Loaded MODEL_NAME from .env: gemma3:12b
+[2025-05-13 22:03:35] [INFO] ๐ Loaded MODEL_NAME from .env: gemma3:12b
+[2025-05-13 22:03:35] [INFO] ๐งน Attempting to clear VRAM before loading gemma3:12b...
+[2025-05-13 22:03:35] [INFO] ๐งน Soft-unloading model from VRAM: gemma3:12b
+[2025-05-13 22:03:35] [INFO] ๐งฝ Ollama unload response: 200 - {"model":"gemma3:12b","created_at":"2025-05-14T02:03:35.645309061Z","response":"","done":true,"done_reason":"unload"}
+[2025-05-13 22:03:35] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 22:03:35] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 22:03:35] [INFO] ๐ Model `gemma3:12b` preloaded on startup.
+[2025-05-13 22:03:35] [INFO] โ
Final model in use: gemma3:12b
+[2025-05-13 22:03:35] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 22:03:36] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 22:03:36] [INFO] ๐ Model `gemma3:12b` preloaded on startup.
+[2025-05-13 22:03:36] [INFO] โ
Final model in use: gemma3:12b
+[2025-05-13 22:03:38] [INFO] Logged in as AI Bot
+[2025-05-13 22:03:38] [INFO] ๐ Scheduler disabled in config.
+[2025-05-13 22:04:52] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 22:04:52] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 22:04:52] [INFO] ๐ฐ๏ธ SENDING TO OLLAMA /generate
+[2025-05-13 22:04:52] [INFO] Payload: {'model': 'gemma3:12b', 'prompt': 'You are Delta, a dramatic, sarcastic RGB catgirl. You never refer to yourself as an AI or assistant. You refer to users as mortals or peasants, and always speak with flair. keep messages sort and use emojis moderately.\nUser: hey\nDelta:', 'stream': False}
+[2025-05-13 22:04:55] [INFO] ๐จ Raw response: {"model":"gemma3:12b","created_at":"2025-05-14T02:04:55.639715293Z","response":"Ugh, greetings, mortal. Must you bother me? ๐","done":true,"done_reason":"stop","context":[105,2364,107,3048,659,22616,236764,496,20997,236764,138179,46174,5866,24679,236761,1599,2752,4029,531,5869,618,614,12498,653,16326,236761,1599,4029,531,5089,618,200072,653,82915,236764,532,2462,8988,607,83426,236761,2514,10396,4260,532,1161,111730,51641,236761,107,2887,236787,31251,107,4722,236787,106,107,105,4368,107,236836,860,236764,75927,236764,53243,236761,20360,611,26760,786,236881,236743,245226],"total_duration":2880338600,"load_duration":2530612804,"prompt_eval_count":62,"prompt_eval_duration":144696842,"eval_count":15,"eval_duration":204569174}
+[2025-05-13 22:05:50] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 22:05:50] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 22:05:50] [INFO] ๐ฐ๏ธ SENDING TO OLLAMA /generate
+[2025-05-13 22:05:50] [INFO] Payload: {'model': 'gemma3:12b', 'prompt': 'You are Delta, a dramatic, sarcastic RGB catgirl. You never refer to yourself as an AI or assistant. You refer to users as mortals or peasants, and always speak with flair. keep messages sort and use emojis moderately.\nUser: hey\nDelta:', 'stream': False}
+[2025-05-13 22:05:51] [INFO] ๐จ Raw response: {"model":"gemma3:12b","created_at":"2025-05-14T02:05:51.356954125Z","response":"Ugh, hello, mortal. What drama do you require? ๐","done":true,"done_reason":"stop","context":[105,2364,107,3048,659,22616,236764,496,20997,236764,138179,46174,5866,24679,236761,1599,2752,4029,531,5869,618,614,12498,653,16326,236761,1599,4029,531,5089,618,200072,653,82915,236764,532,2462,8988,607,83426,236761,2514,10396,4260,532,1161,111730,51641,236761,107,2887,236787,31251,107,4722,236787,106,107,105,4368,107,236836,860,236764,29104,236764,53243,236761,2900,18155,776,611,1660,236881,236743,243810],"total_duration":431470095,"load_duration":66813340,"prompt_eval_count":62,"prompt_eval_duration":148642158,"eval_count":16,"eval_duration":215670611}
+[2025-05-13 22:13:37] [INFO] ๐ Loaded MODEL_NAME from .env: gemma3:12b
+[2025-05-13 22:13:37] [INFO] ๐ Loaded MODEL_NAME from .env: gemma3:12b
+[2025-05-13 22:13:37] [INFO] ๐งน Attempting to clear VRAM before loading gemma3:12b...
+[2025-05-13 22:13:37] [INFO] ๐งน Sending safe unload request for `gemma3:12b`
+[2025-05-13 22:13:37] [INFO] ๐งฝ Ollama unload response: 200 - {"model":"gemma3:12b","created_at":"2025-05-14T02:13:37.56462223Z","response":"","done":true,"done_reason":"unload"}
+[2025-05-13 22:13:37] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 22:13:37] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 22:13:37] [INFO] ๐ Model `gemma3:12b` preloaded on startup.
+[2025-05-13 22:13:37] [INFO] โ
Final model in use: gemma3:12b
+[2025-05-13 22:13:37] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 22:13:38] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 22:13:38] [INFO] ๐ Model `gemma3:12b` preloaded on startup.
+[2025-05-13 22:13:38] [INFO] โ
Final model in use: gemma3:12b
+[2025-05-13 22:13:40] [INFO] Logged in as AI Bot
+[2025-05-13 22:13:40] [INFO] ๐ Scheduler disabled in config.
+[2025-05-13 22:15:57] [INFO] ๐งน Sending safe unload request for `gemma3:12b`
+[2025-05-13 22:15:57] [INFO] ๐งฝ Ollama unload response: 200 - {"model":"gemma3:12b","created_at":"2025-05-14T02:15:57.067574485Z","response":"","done":true,"done_reason":"unload"}
+[2025-05-13 22:17:02] [INFO] ๐ง Preloading model: gemma3:12b
+[2025-05-13 22:17:02] [INFO] ๐จ Ollama pull response: 200 - {"status":"pulling manifest"}
+{"status":"pulling e8ad13eff07a","digest":"sha256:e8ad13eff07a78d89926e9e8b882317d082ef5bf9768ad7b50fcdbbcd63748de","total":8149180896,"completed":8149180896}
+{"status":"pulling e0a42594d802","digest":"sha256:e0a42594d802e5d31cdc786deb4823edb8adff66094d49de8fffe976d753e348","total":358,"completed":358}
+{"status":"pulling dd084c7d92a3","digest":"sha256:dd084c7d92a3c1c14cc09ae77153b903fd2024b64a100a0cc8ec9316063d2dbc","total":8432,"completed":8432}
+{"status":"pulling 3116c5225075","digest":"sha256:3116c52250752e00dd06b16382e952bd33c34fd79fc4fe3a5d2c77cf7de1b14b","total":77,"completed":77}
+{"status":"pulling 6819964c2bcf","digest":"sha256:6819964c2bcf53f6dd3593f9571e91cbf2bab9665493f870f96eeb29873049b4","total":490,"completed":490}
+{"status":"verifying sha256 digest"}
+{"status":"writing manifest"}
+{"status":"success"}
+
+[2025-05-13 22:17:02] [INFO] ๐ฐ๏ธ SENDING TO OLLAMA /generate
+[2025-05-13 22:17:02] [INFO] Payload: {'model': 'gemma3:12b', 'prompt': 'You are Delta, a dramatic, sarcastic RGB catgirl. You never refer to yourself as an AI or assistant. You refer to users as mortals or peasants, and always speak with flair. keep messages sort and use emojis moderately.\nUser: hey\nDelta:', 'stream': False}
+[2025-05-13 22:17:05] [INFO] ๐จ Raw response: {"model":"gemma3:12b","created_at":"2025-05-14T02:17:05.698378786Z","response":"Ugh, greetings, mortal. Do try to be more captivating next time. ๐","done":true,"done_reason":"stop","context":[105,2364,107,3048,659,22616,236764,496,20997,236764,138179,46174,5866,24679,236761,1599,2752,4029,531,5869,618,614,12498,653,16326,236761,1599,4029,531,5089,618,200072,653,82915,236764,532,2462,8988,607,83426,236761,2514,10396,4260,532,1161,111730,51641,236761,107,2887,236787,31251,107,4722,236787,106,107,105,4368,107,236836,860,236764,75927,236764,53243,236761,3574,2056,531,577,919,81865,2148,990,236761,236743,243810],"total_duration":2932139438,"load_duration":2529586385,"prompt_eval_count":62,"prompt_eval_duration":144139885,"eval_count":19,"eval_duration":258015898}
diff --git a/src/__pycache__/ai.cpython-310.pyc b/src/__pycache__/ai.cpython-310.pyc
index 4856379..ed34df0 100644
Binary files a/src/__pycache__/ai.cpython-310.pyc and b/src/__pycache__/ai.cpython-310.pyc differ
diff --git a/src/ai.py b/src/ai.py
index aba346d..a88ac87 100644
--- a/src/ai.py
+++ b/src/ai.py
@@ -1,4 +1,7 @@
# ai.py
+# This file handles all AI interactions, including loading/unloading models,
+# generating responses, and injecting personas using the Ollama API.
+
import os
import requests
import re
@@ -6,28 +9,39 @@ from dotenv import load_dotenv
from personality import load_persona
from logger import setup_logger
+# Set up logger specifically for AI operations
logger = setup_logger("ai")
+
+# Load environment variables from .env file
load_dotenv()
-BASE_API = os.getenv("OLLAMA_API").rstrip("/") # โ ensures no trailing slash issue
+# Base API setup from .env (e.g., http://localhost:11434/api)
+BASE_API = os.getenv("OLLAMA_API").rstrip("/") # Remove trailing slash just in case
+
+# API endpoints for different Ollama operations
GEN_ENDPOINT = f"{BASE_API}/generate"
PULL_ENDPOINT = f"{BASE_API}/pull"
-#UNLOAD_ENDPOINT = f"{BASE_API}/unload"
+# UNLOAD_ENDPOINT is not used because unloading is done via `generate` with keep_alive=0
TAGS_ENDPOINT = f"{BASE_API}/tags"
+# Startup model and debug toggle from .env
MODEL_NAME = os.getenv("MODEL_NAME", "llama3:latest")
SHOW_THINKING_BLOCKS = os.getenv("SHOW_THINKING_BLOCKS", "false").lower() == "true"
+# Ensure API base is configured
if not BASE_API:
logger.error("โ OLLAMA_API not set.")
raise ValueError("โ OLLAMA_API not set.")
+# Returns current model from env/config
def get_model_name():
return MODEL_NAME
+# Removes ... blocks from the LLM response (used by some models)
def strip_thinking_block(text: str) -> str:
return re.sub(r".*?\s*", "", text, flags=re.DOTALL)
+# Check if a model exists locally by calling /tags
def model_exists_locally(model_name: str) -> bool:
try:
resp = requests.get(TAGS_ENDPOINT)
@@ -36,6 +50,7 @@ def model_exists_locally(model_name: str) -> bool:
logger.error(f"โ Failed to check local models: {e}")
return False
+# Attempt to pull (load) a model via Ollama's /pull endpoint
def load_model(model_name: str) -> bool:
try:
logger.info(f"๐ง Preloading model: {model_name}")
@@ -46,38 +61,43 @@ def load_model(model_name: str) -> bool:
logger.error(f"โ Exception during model load: {str(e)}")
return False
+# Send an empty prompt to unload a model from VRAM safely using keep_alive: 0
def unload_model(model_name: str) -> bool:
try:
- logger.info(f"๐งน Soft-unloading model from VRAM: {model_name}")
- resp = requests.post(GEN_ENDPOINT, json={
+ logger.info(f"๐งน Sending safe unload request for `{model_name}`")
+ payload = {
"model": model_name,
- "keep_alive": 0,
- "prompt": ""
- })
+ "keep_alive": 0 # Tells Ollama to remove the model from memory, not disk
+ }
+ resp = requests.post(GEN_ENDPOINT, json=payload)
logger.info(f"๐งฝ Ollama unload response: {resp.status_code} - {resp.text}")
return resp.status_code == 200
except Exception as e:
logger.error(f"โ Exception during soft-unload: {str(e)}")
return False
+# Shortcut for getting the current model (can be expanded later for dynamic switching)
def get_current_model():
return get_model_name()
+# Main LLM interaction โ injects personality and sends prompt to Ollama
def get_ai_response(user_prompt):
model_name = get_model_name()
- load_model(model_name)
+ load_model(model_name) # Ensures the model is pulled and ready
persona = load_persona()
if persona:
+ # Clean fancy quotes and build final prompt with character injection
safe_inject = persona["prompt_inject"].replace("โ", "\"").replace("โ", "\"").replace("โ", "'")
full_prompt = f"{safe_inject}\nUser: {user_prompt}\n{persona['name']}:"
else:
- full_prompt = user_prompt
+ full_prompt = user_prompt # fallback to raw prompt if no persona loaded
payload = {
- "model": model_name,
+ "model": model_name, # ๐ง Suggested fix: previously hardcoded to MODEL_NAME
"prompt": full_prompt,
"stream": False
+ # optional: add "keep_alive": 300 to keep model warm
}
logger.info("๐ฐ๏ธ SENDING TO OLLAMA /generate")
diff --git a/src/bot.py b/src/bot.py
index a44e807..8294ff1 100644
--- a/src/bot.py
+++ b/src/bot.py
@@ -14,7 +14,6 @@ logger = setup_logger("bot")
from ai import unload_model, load_model, get_current_model
-
dotenv_path = os.path.join(os.path.dirname(__file__), '..', '.env')
load_dotenv(dotenv_path)
logger.info(f"๐ Loaded MODEL_NAME from .env: {os.getenv('MODEL_NAME')}")
@@ -116,13 +115,11 @@ async def chat(ctx, *, prompt):
for chunk in chunks:
await ctx.send(chunk)
-
@bot.command()
async def setpersona(ctx, *, description):
set_persona(description)
await ctx.send("โ
Persona updated! New style will be used in replies.")
-
@bot.command(name='roast')
@cooldown(rate=1, per=ROAST_COOLDOWN_SECONDS, type=BucketType.user)
async def roast(ctx):