sillytavern 1.12.4 → 1.12.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/.eslintrc.js +1 -0
  2. package/CONTRIBUTING.md +5 -0
  3. package/Dockerfile +2 -2
  4. package/Start.bat +1 -1
  5. package/UpdateAndStart.bat +1 -1
  6. package/UpdateForkAndStart.bat +2 -2
  7. package/config.yaml +60 -6
  8. package/default/config.yaml +60 -6
  9. package/default/content/index.json +92 -16
  10. package/default/content/presets/context/Adventure.json +1 -2
  11. package/default/content/presets/context/Alpaca-Single-Turn.json +1 -2
  12. package/default/content/presets/context/Alpaca.json +0 -1
  13. package/default/content/presets/context/ChatML-Names.json +0 -1
  14. package/default/content/presets/context/ChatML.json +0 -1
  15. package/default/content/presets/context/Command R.json +1 -2
  16. package/default/content/presets/context/Default.json +1 -2
  17. package/default/content/presets/context/DreamGen Role-Play V1 ChatML.json +1 -2
  18. package/default/content/presets/context/DreamGen Role-Play V1 Llama3.json +1 -2
  19. package/default/content/presets/context/Gemma 2.json +1 -2
  20. package/default/content/presets/context/Libra-32B.json +2 -3
  21. package/default/content/presets/context/Lightning 1.1.json +1 -2
  22. package/default/content/presets/context/Llama 2 Chat.json +0 -1
  23. package/default/content/presets/context/Llama 3 Instruct.json +1 -2
  24. package/default/content/presets/context/Llama-3-Instruct-Names.json +0 -1
  25. package/default/content/presets/context/Minimalist.json +1 -2
  26. package/default/content/presets/context/Mistral V1.json +11 -0
  27. package/default/content/presets/context/Mistral V2 & V3.json +11 -0
  28. package/default/content/presets/context/Mistral V3-Tekken.json +11 -0
  29. package/default/content/presets/context/NovelAI.json +1 -2
  30. package/default/content/presets/context/OldDefault.json +1 -2
  31. package/default/content/presets/context/Phi.json +1 -2
  32. package/default/content/presets/context/Pygmalion.json +1 -2
  33. package/default/content/presets/context/Story.json +1 -2
  34. package/default/content/presets/context/Synthia.json +0 -1
  35. package/default/content/presets/context/simple-proxy-for-tavern.json +1 -2
  36. package/default/content/presets/instruct/Adventure.json +1 -3
  37. package/default/content/presets/instruct/Alpaca-Single-Turn.json +2 -4
  38. package/default/content/presets/instruct/Alpaca.json +1 -3
  39. package/default/content/presets/instruct/ChatML-Names.json +1 -3
  40. package/default/content/presets/instruct/ChatML.json +1 -3
  41. package/default/content/presets/instruct/Command R.json +2 -4
  42. package/default/content/presets/instruct/DreamGen Role-Play V1 ChatML.json +1 -3
  43. package/default/content/presets/instruct/DreamGen Role-Play V1 Llama3.json +2 -4
  44. package/default/content/presets/instruct/Gemma 2.json +1 -3
  45. package/default/content/presets/instruct/Koala.json +1 -3
  46. package/default/content/presets/instruct/Libra-32B.json +1 -3
  47. package/default/content/presets/instruct/Lightning 1.1.json +1 -3
  48. package/default/content/presets/instruct/Llama 2 Chat.json +1 -3
  49. package/default/content/presets/instruct/Llama 3 Instruct.json +1 -3
  50. package/default/content/presets/instruct/Llama-3-Instruct-Names.json +1 -3
  51. package/default/content/presets/instruct/Metharme.json +1 -3
  52. package/default/content/presets/instruct/Mistral V1.json +22 -0
  53. package/default/content/presets/instruct/{Mistral.json → Mistral V2 & V3.json } +6 -8
  54. package/default/content/presets/instruct/Mistral V3-Tekken.json +22 -0
  55. package/default/content/presets/instruct/OpenOrca-OpenChat.json +1 -3
  56. package/default/content/presets/instruct/Phi.json +2 -4
  57. package/default/content/presets/instruct/Pygmalion.json +1 -3
  58. package/default/content/presets/instruct/Story.json +1 -3
  59. package/default/content/presets/instruct/Synthia.json +1 -3
  60. package/default/content/presets/instruct/Vicuna 1.0.json +1 -3
  61. package/default/content/presets/instruct/Vicuna 1.1.json +1 -3
  62. package/default/content/presets/instruct/WizardLM-13B.json +1 -3
  63. package/default/content/presets/instruct/WizardLM.json +1 -3
  64. package/default/content/presets/instruct/simple-proxy-for-tavern.json +1 -3
  65. package/default/content/presets/novel/Asper-Kayra.json +5 -2
  66. package/default/content/presets/novel/Blended-Coffee-Kayra.json +6 -3
  67. package/default/content/presets/novel/Blook-Kayra.json +6 -3
  68. package/default/content/presets/novel/Carefree-Kayra.json +5 -2
  69. package/default/content/presets/novel/CosmicCube-Kayra.json +6 -3
  70. package/default/content/presets/novel/Edgewise-Clio.json +5 -2
  71. package/default/content/presets/novel/Erato-Dragonfruit.json +31 -0
  72. package/default/content/presets/novel/Erato-Golden Arrow.json +27 -0
  73. package/default/content/presets/novel/Erato-Shosetsu.json +27 -0
  74. package/default/content/presets/novel/Erato-Wilder.json +27 -0
  75. package/default/content/presets/novel/Erato-Zany Scribe.json +27 -0
  76. package/default/content/presets/novel/Fresh-Coffee-Clio.json +5 -2
  77. package/default/content/presets/novel/Fresh-Coffee-Kayra.json +5 -2
  78. package/default/content/presets/novel/Green-Active-Writer-Kayra.json +6 -3
  79. package/default/content/presets/novel/Keelback-Clio.json +5 -2
  80. package/default/content/presets/novel/Long-Press-Clio.json +5 -2
  81. package/default/content/presets/novel/Pilotfish-Kayra.json +6 -3
  82. package/default/content/presets/novel/Pro_Writer-Kayra.json +5 -2
  83. package/default/content/presets/novel/Stelenes-Kayra.json +5 -1
  84. package/default/content/presets/novel/Talker-Chat-Clio.json +5 -2
  85. package/default/content/presets/novel/Tea_Time-Kayra.json +5 -2
  86. package/default/content/presets/novel/Tesseract-Kayra.json +6 -3
  87. package/default/content/presets/novel/Vingt-Un-Clio.json +5 -2
  88. package/default/content/presets/novel/Writers-Daemon-Kayra.json +5 -1
  89. package/default/content/presets/openai/Default.json +5 -8
  90. package/default/content/presets/sysprompt/Actor.json +4 -0
  91. package/default/content/presets/sysprompt/Assistant - Expert.json +4 -0
  92. package/default/content/presets/sysprompt/Assistant - Simple.json +4 -0
  93. package/default/content/presets/sysprompt/Blank.json +4 -0
  94. package/default/content/presets/sysprompt/Chain of Thought.json +4 -0
  95. package/default/content/presets/sysprompt/Neutral - Chat.json +4 -0
  96. package/default/content/presets/sysprompt/Roleplay - Detailed.json +4 -0
  97. package/default/content/presets/sysprompt/Roleplay - Immersive.json +4 -0
  98. package/default/content/presets/sysprompt/Roleplay - Simple.json +4 -0
  99. package/default/content/presets/sysprompt/Text Adventure.json +4 -0
  100. package/default/content/presets/sysprompt/Writer - Creative.json +4 -0
  101. package/default/content/presets/sysprompt/Writer - Realistic.json +4 -0
  102. package/default/content/settings.json +34 -28
  103. package/default/content/themes/Azure.json +1 -0
  104. package/default/content/themes/Cappuccino.json +1 -0
  105. package/default/content/themes/Dark Lite.json +1 -0
  106. package/default/content/themes/Dark V 1.0.json +1 -1
  107. package/default/content/user-default.png +0 -0
  108. package/index.d.ts +5 -0
  109. package/package.json +7 -11
  110. package/plugins.js +4 -2
  111. package/public/css/character-group-overlay.css +1 -1
  112. package/public/css/extensions-panel.css +2 -1
  113. package/public/css/mobile-styles.css +18 -20
  114. package/public/css/popup.css +4 -0
  115. package/public/css/promptmanager.css +35 -8
  116. package/public/css/select2-overrides.css +6 -1
  117. package/public/css/st-tailwind.css +8 -0
  118. package/public/css/tags.css +6 -6
  119. package/public/css/toggle-dependent.css +7 -3
  120. package/public/css/world-info.css +16 -0
  121. package/public/global.d.ts +5 -0
  122. package/public/img/ai4.png +0 -0
  123. package/public/img/blockentropy.svg +3 -0
  124. package/public/img/down-arrow.svg +3 -0
  125. package/public/img/step-into.svg +149 -0
  126. package/public/img/step-out.svg +149 -0
  127. package/public/img/step-over.svg +149 -0
  128. package/public/img/step-resume.svg +218 -0
  129. package/public/img/user-default.png +0 -0
  130. package/public/index.html +2075 -1952
  131. package/public/lib/polyfill.js +19 -0
  132. package/public/lib/showdown-patch.js +24 -0
  133. package/public/locales/ar-sa.json +3 -3
  134. package/public/locales/de-de.json +3 -3
  135. package/public/locales/es-es.json +3 -3
  136. package/public/locales/fr-fr.json +3 -3
  137. package/public/locales/is-is.json +3 -3
  138. package/public/locales/it-it.json +3 -3
  139. package/public/locales/ja-jp.json +3 -3
  140. package/public/locales/ko-kr.json +3 -3
  141. package/public/locales/nl-nl.json +2 -2
  142. package/public/locales/pt-pt.json +3 -3
  143. package/public/locales/ru-ru.json +57 -10
  144. package/public/locales/uk-ua.json +3 -3
  145. package/public/locales/vi-vn.json +416 -416
  146. package/public/locales/zh-cn.json +41 -9
  147. package/public/locales/zh-tw.json +3 -3
  148. package/public/script.js +821 -681
  149. package/public/scripts/BulkEditOverlay.js +45 -15
  150. package/public/scripts/PromptManager.js +51 -25
  151. package/public/scripts/RossAscends-mods.js +38 -17
  152. package/public/scripts/autocomplete/AutoComplete.js +71 -48
  153. package/public/scripts/autocomplete/AutoCompleteNameResult.js +3 -30
  154. package/public/scripts/autocomplete/AutoCompleteNameResultBase.js +31 -0
  155. package/public/scripts/autocomplete/AutoCompleteOption.js +11 -1
  156. package/public/scripts/autocomplete/AutoCompleteSecondaryNameResult.js +2 -2
  157. package/public/scripts/backgrounds.js +1 -1
  158. package/public/scripts/bookmarks.js +344 -40
  159. package/public/scripts/chats.js +39 -6
  160. package/public/scripts/extensions/caption/index.js +67 -30
  161. package/public/scripts/extensions/caption/settings.html +27 -4
  162. package/public/scripts/extensions/connection-manager/index.js +647 -0
  163. package/public/scripts/extensions/connection-manager/manifest.json +11 -0
  164. package/public/scripts/extensions/connection-manager/profile.html +13 -0
  165. package/public/scripts/extensions/connection-manager/settings.html +21 -0
  166. package/public/scripts/extensions/connection-manager/style.css +11 -0
  167. package/public/scripts/extensions/connection-manager/view.html +5 -0
  168. package/public/scripts/extensions/expressions/index.js +80 -17
  169. package/public/scripts/extensions/memory/index.js +209 -47
  170. package/public/scripts/extensions/memory/settings.html +14 -4
  171. package/public/scripts/extensions/quick-reply/api/QuickReplyApi.js +94 -66
  172. package/public/scripts/extensions/quick-reply/html/qrEditor.html +38 -8
  173. package/public/scripts/extensions/quick-reply/html/settings.html +13 -0
  174. package/public/scripts/extensions/quick-reply/index.js +8 -2
  175. package/public/scripts/extensions/quick-reply/lib/morphdom-esm.js +769 -0
  176. package/public/scripts/extensions/quick-reply/lib/morphdom.LICENSE.txt +21 -0
  177. package/public/scripts/extensions/quick-reply/src/AutoExecuteHandler.js +9 -0
  178. package/public/scripts/extensions/quick-reply/src/QuickReply.js +1286 -87
  179. package/public/scripts/extensions/quick-reply/src/QuickReplyConfig.js +6 -1
  180. package/public/scripts/extensions/quick-reply/src/QuickReplySet.js +191 -20
  181. package/public/scripts/extensions/quick-reply/src/QuickReplySetLink.js +1 -1
  182. package/public/scripts/extensions/quick-reply/src/QuickReplySettings.js +2 -0
  183. package/public/scripts/extensions/quick-reply/src/SlashCommandHandler.js +263 -18
  184. package/public/scripts/extensions/quick-reply/src/ui/ButtonUi.js +14 -11
  185. package/public/scripts/extensions/quick-reply/src/ui/SettingsUi.js +64 -3
  186. package/public/scripts/extensions/quick-reply/src/ui/ctx/ContextMenu.js +5 -0
  187. package/public/scripts/extensions/quick-reply/src/ui/ctx/MenuHeader.js +1 -1
  188. package/public/scripts/extensions/quick-reply/src/ui/ctx/MenuItem.js +34 -7
  189. package/public/scripts/extensions/quick-reply/style.css +604 -20
  190. package/public/scripts/extensions/quick-reply/style.less +666 -126
  191. package/public/scripts/extensions/regex/editor.html +15 -22
  192. package/public/scripts/extensions/shared.js +96 -10
  193. package/public/scripts/extensions/stable-diffusion/button.html +6 -2
  194. package/public/scripts/extensions/stable-diffusion/index.js +333 -104
  195. package/public/scripts/extensions/stable-diffusion/settings.html +16 -14
  196. package/public/scripts/extensions/token-counter/index.js +6 -3
  197. package/public/scripts/extensions/token-counter/style.css +5 -0
  198. package/public/scripts/extensions/translate/buttons.html +3 -3
  199. package/public/scripts/extensions/translate/index.js +29 -7
  200. package/public/scripts/extensions/tts/azure.js +16 -4
  201. package/public/scripts/extensions/tts/index.js +17 -10
  202. package/public/scripts/extensions/tts/openai-compatible.js +193 -0
  203. package/public/scripts/extensions/tts/system.js +1 -1
  204. package/public/scripts/extensions/vectors/index.js +131 -106
  205. package/public/scripts/extensions/vectors/settings.html +11 -13
  206. package/public/scripts/extensions.js +61 -29
  207. package/public/scripts/group-chats.js +15 -8
  208. package/public/scripts/horde.js +79 -19
  209. package/public/scripts/input-md-formatting.js +152 -0
  210. package/public/scripts/instruct-mode.js +107 -70
  211. package/public/scripts/nai-settings.js +122 -30
  212. package/public/scripts/openai.js +284 -166
  213. package/public/scripts/personas.js +3 -3
  214. package/public/scripts/popup.js +37 -9
  215. package/public/scripts/power-user.js +201 -332
  216. package/public/scripts/preset-manager.js +300 -25
  217. package/public/scripts/samplerSelect.js +138 -142
  218. package/public/scripts/secrets.js +4 -1
  219. package/public/scripts/showdown-underscore.js +13 -3
  220. package/public/scripts/slash-commands/SlashCommand.js +78 -35
  221. package/public/scripts/slash-commands/SlashCommandArgument.js +8 -5
  222. package/public/scripts/slash-commands/SlashCommandAutoCompleteNameResult.js +19 -9
  223. package/public/scripts/slash-commands/SlashCommandBreak.js +7 -0
  224. package/public/scripts/slash-commands/SlashCommandBreakController.js +7 -0
  225. package/public/scripts/slash-commands/SlashCommandBreakPoint.js +3 -0
  226. package/public/scripts/slash-commands/SlashCommandClosure.js +292 -98
  227. package/public/scripts/slash-commands/SlashCommandClosureResult.js +1 -0
  228. package/public/scripts/slash-commands/SlashCommandCommonEnumsProvider.js +32 -10
  229. package/public/scripts/slash-commands/SlashCommandDebugController.js +83 -0
  230. package/public/scripts/slash-commands/SlashCommandEnumAutoCompleteOption.js +12 -1
  231. package/public/scripts/slash-commands/SlashCommandEnumValue.js +16 -4
  232. package/public/scripts/slash-commands/SlashCommandExecutionError.js +60 -0
  233. package/public/scripts/slash-commands/SlashCommandExecutor.js +12 -0
  234. package/public/scripts/slash-commands/SlashCommandParser.js +321 -26
  235. package/public/scripts/slash-commands/SlashCommandScope.js +11 -8
  236. package/public/scripts/slash-commands.js +608 -155
  237. package/public/scripts/sse-stream.js +0 -2
  238. package/public/scripts/sysprompt.js +250 -0
  239. package/public/scripts/tags.js +68 -42
  240. package/public/scripts/templates/assistantNote.html +3 -0
  241. package/public/scripts/templates/chatRename.html +6 -0
  242. package/public/scripts/templates/createCheckpoint.html +8 -0
  243. package/public/scripts/templates/hotkeys.html +29 -11
  244. package/public/scripts/templates/installExtension.html +7 -0
  245. package/public/scripts/templates/itemizationChat.html +1 -1
  246. package/public/scripts/templates/itemizationText.html +1 -1
  247. package/public/scripts/templates/macros.html +2 -2
  248. package/public/scripts/templates/masterExport.html +17 -0
  249. package/public/scripts/templates/masterImport.html +17 -0
  250. package/public/scripts/templates/migrateInstructPrompt.html +27 -0
  251. package/public/scripts/templates/newChatConfirm.html +4 -0
  252. package/public/scripts/templates/proxyConnectionWarning.html +1 -0
  253. package/public/scripts/templates/tabbyDownloader.html +2 -2
  254. package/public/scripts/templates/welcome.html +1 -6
  255. package/public/scripts/templates/welcomePrompt.html +3 -0
  256. package/public/scripts/templates/worldInfoKeywordHeaders.html +8 -0
  257. package/public/scripts/textgen-models.js +75 -2
  258. package/public/scripts/textgen-settings.js +90 -30
  259. package/public/scripts/tokenizers.js +162 -35
  260. package/public/scripts/util/AbortReason.js +9 -0
  261. package/public/scripts/utils.js +202 -21
  262. package/public/scripts/variables.js +153 -65
  263. package/public/scripts/world-info.js +417 -241
  264. package/public/style.css +209 -24
  265. package/server.js +240 -31
  266. package/src/additional-headers.js +3 -4
  267. package/src/cohere-stream.js +126 -0
  268. package/src/constants.js +16 -2
  269. package/src/endpoints/anthropic.js +1 -1
  270. package/src/endpoints/backends/chat-completions.js +103 -115
  271. package/src/endpoints/backends/text-completions.js +9 -4
  272. package/src/endpoints/characters.js +7 -2
  273. package/src/endpoints/chats.js +101 -44
  274. package/src/endpoints/content-manager.js +41 -2
  275. package/src/endpoints/google.js +3 -3
  276. package/src/endpoints/horde.js +29 -4
  277. package/src/endpoints/images.js +1 -1
  278. package/src/endpoints/novelai.js +70 -15
  279. package/src/endpoints/openai.js +60 -1
  280. package/src/endpoints/openrouter.js +32 -0
  281. package/src/endpoints/presets.js +2 -0
  282. package/src/endpoints/secrets.js +2 -0
  283. package/src/endpoints/settings.js +4 -0
  284. package/src/endpoints/stable-diffusion.js +150 -1
  285. package/src/endpoints/tokenizers.js +216 -60
  286. package/src/endpoints/translate.js +36 -19
  287. package/src/endpoints/vectors.js +105 -88
  288. package/src/prompt-converters.js +85 -2
  289. package/src/request-proxy.js +56 -0
  290. package/src/tokenizers/gemma.model +0 -0
  291. package/src/tokenizers/jamba.model +0 -0
  292. package/src/transformers.mjs +37 -4
  293. package/src/users.js +68 -15
  294. package/src/util.js +61 -7
  295. package/src/vectors/makersuite-vectors.js +22 -16
  296. package/start.sh +1 -1
  297. package/tests/package-lock.json +6 -8
  298. package/default/content/presets/context/Alpaca-Roleplay.json +0 -12
  299. package/default/content/presets/context/Mistral.json +0 -12
  300. package/default/content/presets/instruct/Alpaca-Roleplay.json +0 -24
  301. package/public/lib/object-hasown.js +0 -4
  302. package/public/scripts/slash-commands/SlashCommandClosureExecutor.js +0 -7
package/.eslintrc.js CHANGED
@@ -55,6 +55,7 @@ module.exports = {
55
55
  isProbablyReaderable: 'readonly',
56
56
  ePub: 'readonly',
57
57
  diff_match_patch: 'readonly',
58
+ SillyTavern: 'readonly',
58
59
  },
59
60
  },
60
61
  ],
package/CONTRIBUTING.md CHANGED
@@ -34,3 +34,8 @@
34
34
  - What did you do to achieve this?
35
35
  - How would a reviewer test the change?
36
36
  6. Mind the license. Your contributions will be licensed under the GNU Affero General Public License. If you don't know what that implies, consult your lawyer.
37
+
38
+ ## Further reading
39
+
40
+ 1. [How to write UI extensions](https://docs.sillytavern.app/for-contributors/writing-extensions/)
41
+ 2. [How to write server plugins](https://docs.sillytavern.app/for-contributors/server-plugins)
package/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM node:lts-alpine3.18
1
+ FROM node:lts-alpine3.19
2
2
 
3
3
  # Arguments
4
4
  ARG APP_HOME=/home/node/app
@@ -19,7 +19,7 @@ ENV NODE_ENV=production
19
19
  COPY package*.json post-install.js ./
20
20
  RUN \
21
21
  echo "*** Install npm packages ***" && \
22
- npm i --no-audit --no-fund --quiet --omit=dev && npm cache clean --force
22
+ npm i --no-audit --no-fund --loglevel=error --no-progress --omit=dev && npm cache clean --force
23
23
 
24
24
  # Bundle app source
25
25
  COPY . ./
package/Start.bat CHANGED
@@ -1,7 +1,7 @@
1
1
  @echo off
2
2
  pushd %~dp0
3
3
  set NODE_ENV=production
4
- call npm install --no-audit --no-fund --quiet --omit=dev
4
+ call npm install --no-audit --no-fund --loglevel=error --no-progress --omit=dev
5
5
  node server.js %*
6
6
  pause
7
7
  popd
@@ -12,7 +12,7 @@ if %errorlevel% neq 0 (
12
12
  )
13
13
  )
14
14
  set NODE_ENV=production
15
- call npm install --no-audit --no-fund --quiet --omit=dev
15
+ call npm install --no-audit --no-fund --loglevel=error --no-progress --omit=dev
16
16
  node server.js %*
17
17
  pause
18
18
  popd
@@ -42,7 +42,7 @@ if NOT "!AUTO_SWITCH!"=="" (
42
42
  SET TARGET_BRANCH=release
43
43
  goto update
44
44
  )
45
-
45
+
46
46
  echo Auto-switching defined to stay on current branch
47
47
  goto update
48
48
  )
@@ -95,7 +95,7 @@ if %errorlevel% neq 0 (
95
95
 
96
96
  echo Installing npm packages and starting server
97
97
  set NODE_ENV=production
98
- call npm install --no-audit --no-fund --quiet --omit=dev
98
+ call npm install --no-audit --no-fund --loglevel=error --no-progress --omit=dev
99
99
  node server.js %*
100
100
 
101
101
  :end
package/config.yaml CHANGED
@@ -4,8 +4,22 @@ dataRoot: ./data
4
4
  # -- SERVER CONFIGURATION --
5
5
  # Listen for incoming connections
6
6
  listen: false
7
+ # Enables IPv6 and/or IPv4 protocols. Need to have at least one enabled!
8
+ protocol:
9
+ ipv4: true
10
+ ipv6: false
11
+ # Prefers IPv6 for DNS. Enable this on ISPs that don't have issues with IPv6
12
+ dnsPreferIPv6: false
13
+ # The hostname that autorun opens.
14
+ # - Use "auto" to let the server decide
15
+ # - Use options like 'localhost', 'st.example.com'
16
+ autorunHostname: "auto"
7
17
  # Server port
8
18
  port: 8000
19
+ # Overrides the port for autorun in browser.
20
+ # - Use -1 to use the server port.
21
+ # - Specify a port to override the default.
22
+ autorunPortOverride: -1
9
23
  # -- SECURITY CONFIGURATION --
10
24
  # Toggle whitelist mode
11
25
  whitelistMode: true
@@ -13,6 +27,7 @@ whitelistMode: true
13
27
  enableForwardedWhitelist: true
14
28
  # Whitelist of allowed IP addresses
15
29
  whitelist:
30
+ - ::1
16
31
  - 127.0.0.1
17
32
  # Toggle basic authentication for endpoints
18
33
  basicAuthMode: false
@@ -22,10 +37,25 @@ basicAuthUser:
22
37
  password: "password"
23
38
  # Enables CORS proxy middleware
24
39
  enableCorsProxy: false
40
+ # -- REQUEST PROXY CONFIGURATION --
41
+ requestProxy:
42
+ # If a proxy is enabled, all outgoing HTTP/HTTPS requests will be routed through it.
43
+ enabled: false
44
+ # Proxy URL. Possible protocols: http, https, socks, socks5, socks4, pac
45
+ url: "socks5://username:password@example.com:1080"
46
+ # Proxy bypass list. Requests to these hosts won't be routed through the proxy.
47
+ bypass:
48
+ - localhost
49
+ - 127.0.0.1
25
50
  # Enable multi-user mode
26
51
  enableUserAccounts: false
27
52
  # Enable discreet login mode: hides user list on the login screen
28
53
  enableDiscreetLogin: false
54
+ # User session timeout *in seconds* (defaults to 24 hours).
55
+ ## Set to a positive number to expire session after a certain time of inactivity
56
+ ## Set to 0 to expire session when the browser is closed
57
+ ## Set to a negative number to disable session expiration
58
+ sessionTimeout: 86400
29
59
  # Used to sign session cookies. Will be auto-generated if not set
30
60
  cookieSecret: ''
31
61
  # Disable CSRF protection - NOT RECOMMENDED
@@ -35,6 +65,9 @@ securityOverride: false
35
65
  # -- ADVANCED CONFIGURATION --
36
66
  # Open the browser automatically
37
67
  autorun: true
68
+ # Avoids using 'localhost' for autorun in auto mode.
69
+ # use if you don't have 'localhost' in your hosts file
70
+ avoidLocalhost: false
38
71
  # Disable thumbnail generation
39
72
  disableThumbnails: false
40
73
  # Thumbnail quality (0-100)
@@ -50,6 +83,8 @@ skipContentCheck: false
50
83
  disableChatBackup: false
51
84
  # Number of backups to keep for each chat and settings file
52
85
  numberOfBackups: 50
86
+ # Interval in milliseconds to throttle chat backups per user
87
+ chatBackupThrottleInterval: 10000
53
88
  # Allowed hosts for card downloads
54
89
  whitelistImportDomains:
55
90
  - localhost
@@ -67,9 +102,17 @@ whitelistImportDomains:
67
102
  ## headers:
68
103
  ## User-Agent: "Googlebot/2.1 (+http://www.google.com/bot.html)"
69
104
  requestOverrides: []
70
- # -- PLUGIN CONFIGURATION --
105
+ # -- EXTENSIONS CONFIGURATION --
71
106
  # Enable UI extensions
72
107
  enableExtensions: true
108
+ # Automatically update extensions when a release version changes
109
+ enableExtensionsAutoUpdate: true
110
+ # Additional model tokenizers can be downloaded on demand.
111
+ # Disabling will fallback to another locally available tokenizer.
112
+ enableDownloadableTokenizers: true
113
+ # Vector storage settings
114
+ vectors:
115
+ enableModelScopes: false
73
116
  # Extension settings
74
117
  extras:
75
118
  # Disables automatic model download from HuggingFace
@@ -98,10 +141,21 @@ mistral:
98
141
  # Enables prefilling of the reply with the last assistant message in the prompt
99
142
  # CAUTION: The prefix is echoed into the completion. You may want to use regex to trim it out.
100
143
  enablePrefix: false
144
+ # -- OLLAMA API CONFIGURATION --
145
+ ollama:
146
+ # Controls how long the model will stay loaded into memory following the request
147
+ # * -1: Keep the model loaded indefinitely
148
+ # * 0: Unload the model immediately after the request
149
+ # * N (any positive number): Keep the model loaded for N seconds after the request.
150
+ keepAlive: -1
151
+ # -- ANTHROPIC CLAUDE API CONFIGURATION --
152
+ claude:
153
+ # Enables caching of the system prompt (if supported).
154
+ # https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
155
+ # -- IMPORTANT! --
156
+ # Use only when the prompt before the chat history is static and doesn't change between requests
157
+ # (e.g {{random}} macro or lorebooks not as in-chat injections).
158
+ # Otherwise, you'll just waste money on cache misses.
159
+ enableSystemPromptCache: false
101
160
  # -- SERVER PLUGIN CONFIGURATION --
102
161
  enableServerPlugins: false
103
- # User session timeout *in seconds* (defaults to 24 hours).
104
- ## Set to a positive number to expire session after a certain time of inactivity
105
- ## Set to 0 to expire session when the browser is closed
106
- ## Set to a negative number to disable session expiration
107
- sessionTimeout: 86400
@@ -4,8 +4,22 @@ dataRoot: ./data
4
4
  # -- SERVER CONFIGURATION --
5
5
  # Listen for incoming connections
6
6
  listen: false
7
+ # Enables IPv6 and/or IPv4 protocols. Need to have at least one enabled!
8
+ protocol:
9
+ ipv4: true
10
+ ipv6: false
11
+ # Prefers IPv6 for DNS. Enable this on ISPs that don't have issues with IPv6
12
+ dnsPreferIPv6: false
13
+ # The hostname that autorun opens.
14
+ # - Use "auto" to let the server decide
15
+ # - Use options like 'localhost', 'st.example.com'
16
+ autorunHostname: "auto"
7
17
  # Server port
8
18
  port: 8000
19
+ # Overrides the port for autorun in browser.
20
+ # - Use -1 to use the server port.
21
+ # - Specify a port to override the default.
22
+ autorunPortOverride: -1
9
23
  # -- SECURITY CONFIGURATION --
10
24
  # Toggle whitelist mode
11
25
  whitelistMode: true
@@ -13,6 +27,7 @@ whitelistMode: true
13
27
  enableForwardedWhitelist: true
14
28
  # Whitelist of allowed IP addresses
15
29
  whitelist:
30
+ - ::1
16
31
  - 127.0.0.1
17
32
  # Toggle basic authentication for endpoints
18
33
  basicAuthMode: false
@@ -22,10 +37,25 @@ basicAuthUser:
22
37
  password: "password"
23
38
  # Enables CORS proxy middleware
24
39
  enableCorsProxy: false
40
+ # -- REQUEST PROXY CONFIGURATION --
41
+ requestProxy:
42
+ # If a proxy is enabled, all outgoing HTTP/HTTPS requests will be routed through it.
43
+ enabled: false
44
+ # Proxy URL. Possible protocols: http, https, socks, socks5, socks4, pac
45
+ url: "socks5://username:password@example.com:1080"
46
+ # Proxy bypass list. Requests to these hosts won't be routed through the proxy.
47
+ bypass:
48
+ - localhost
49
+ - 127.0.0.1
25
50
  # Enable multi-user mode
26
51
  enableUserAccounts: false
27
52
  # Enable discreet login mode: hides user list on the login screen
28
53
  enableDiscreetLogin: false
54
+ # User session timeout *in seconds* (defaults to 24 hours).
55
+ ## Set to a positive number to expire session after a certain time of inactivity
56
+ ## Set to 0 to expire session when the browser is closed
57
+ ## Set to a negative number to disable session expiration
58
+ sessionTimeout: 86400
29
59
  # Used to sign session cookies. Will be auto-generated if not set
30
60
  cookieSecret: ''
31
61
  # Disable CSRF protection - NOT RECOMMENDED
@@ -35,6 +65,9 @@ securityOverride: false
35
65
  # -- ADVANCED CONFIGURATION --
36
66
  # Open the browser automatically
37
67
  autorun: true
68
+ # Avoids using 'localhost' for autorun in auto mode.
69
+ # use if you don't have 'localhost' in your hosts file
70
+ avoidLocalhost: false
38
71
  # Disable thumbnail generation
39
72
  disableThumbnails: false
40
73
  # Thumbnail quality (0-100)
@@ -50,6 +83,8 @@ skipContentCheck: false
50
83
  disableChatBackup: false
51
84
  # Number of backups to keep for each chat and settings file
52
85
  numberOfBackups: 50
86
+ # Interval in milliseconds to throttle chat backups per user
87
+ chatBackupThrottleInterval: 10000
53
88
  # Allowed hosts for card downloads
54
89
  whitelistImportDomains:
55
90
  - localhost
@@ -67,9 +102,17 @@ whitelistImportDomains:
67
102
  ## headers:
68
103
  ## User-Agent: "Googlebot/2.1 (+http://www.google.com/bot.html)"
69
104
  requestOverrides: []
70
- # -- PLUGIN CONFIGURATION --
105
+ # -- EXTENSIONS CONFIGURATION --
71
106
  # Enable UI extensions
72
107
  enableExtensions: true
108
+ # Automatically update extensions when a release version changes
109
+ enableExtensionsAutoUpdate: true
110
+ # Additional model tokenizers can be downloaded on demand.
111
+ # Disabling will fallback to another locally available tokenizer.
112
+ enableDownloadableTokenizers: true
113
+ # Vector storage settings
114
+ vectors:
115
+ enableModelScopes: false
73
116
  # Extension settings
74
117
  extras:
75
118
  # Disables automatic model download from HuggingFace
@@ -98,10 +141,21 @@ mistral:
98
141
  # Enables prefilling of the reply with the last assistant message in the prompt
99
142
  # CAUTION: The prefix is echoed into the completion. You may want to use regex to trim it out.
100
143
  enablePrefix: false
144
+ # -- OLLAMA API CONFIGURATION --
145
+ ollama:
146
+ # Controls how long the model will stay loaded into memory following the request
147
+ # * -1: Keep the model loaded indefinitely
148
+ # * 0: Unload the model immediately after the request
149
+ # * N (any positive number): Keep the model loaded for N seconds after the request.
150
+ keepAlive: -1
151
+ # -- ANTHROPIC CLAUDE API CONFIGURATION --
152
+ claude:
153
+ # Enables caching of the system prompt (if supported).
154
+ # https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
155
+ # -- IMPORTANT! --
156
+ # Use only when the prompt before the chat history is static and doesn't change between requests
157
+ # (e.g {{random}} macro or lorebooks not as in-chat injections).
158
+ # Otherwise, you'll just waste money on cache misses.
159
+ enableSystemPromptCache: false
101
160
  # -- SERVER PLUGIN CONFIGURATION --
102
161
  enableServerPlugins: false
103
- # User session timeout *in seconds* (defaults to 24 hours).
104
- ## Set to a positive number to expire session after a certain time of inactivity
105
- ## Set to 0 to expire session when the browser is closed
106
- ## Set to a negative number to disable session expiration
107
- sessionTimeout: 86400
@@ -319,6 +319,26 @@
319
319
  "filename": "presets/novel/Writers-Daemon-Kayra.json",
320
320
  "type": "novel_preset"
321
321
  },
322
+ {
323
+ "filename": "presets/novel/Erato-Dragonfruit.json",
324
+ "type": "novel_preset"
325
+ },
326
+ {
327
+ "filename": "presets/novel/Erato-Golden Arrow.json",
328
+ "type": "novel_preset"
329
+ },
330
+ {
331
+ "filename": "presets/novel/Erato-Shosetsu.json",
332
+ "type": "novel_preset"
333
+ },
334
+ {
335
+ "filename": "presets/novel/Erato-Wilder.json",
336
+ "type": "novel_preset"
337
+ },
338
+ {
339
+ "filename": "presets/novel/Erato-Zany Scribe.json",
340
+ "type": "novel_preset"
341
+ },
322
342
  {
323
343
  "filename": "presets/textgen/Asterism.json",
324
344
  "type": "textgen_preset"
@@ -467,10 +487,6 @@
467
487
  "filename": "presets/context/Adventure.json",
468
488
  "type": "context"
469
489
  },
470
- {
471
- "filename": "presets/context/Alpaca-Roleplay.json",
472
- "type": "context"
473
- },
474
490
  {
475
491
  "filename": "presets/context/Alpaca-Single-Turn.json",
476
492
  "type": "context"
@@ -511,10 +527,6 @@
511
527
  "filename": "presets/context/Minimalist.json",
512
528
  "type": "context"
513
529
  },
514
- {
515
- "filename": "presets/context/Mistral.json",
516
- "type": "context"
517
- },
518
530
  {
519
531
  "filename": "presets/context/NovelAI.json",
520
532
  "type": "context"
@@ -555,10 +567,6 @@
555
567
  "filename": "presets/instruct/Adventure.json",
556
568
  "type": "instruct"
557
569
  },
558
- {
559
- "filename": "presets/instruct/Alpaca-Roleplay.json",
560
- "type": "instruct"
561
- },
562
570
  {
563
571
  "filename": "presets/instruct/Alpaca-Single-Turn.json",
564
572
  "type": "instruct"
@@ -599,10 +607,6 @@
599
607
  "filename": "presets/instruct/Metharme.json",
600
608
  "type": "instruct"
601
609
  },
602
- {
603
- "filename": "presets/instruct/Mistral.json",
604
- "type": "instruct"
605
- },
606
610
  {
607
611
  "filename": "presets/instruct/OpenOrca-OpenChat.json",
608
612
  "type": "instruct"
@@ -686,5 +690,77 @@
686
690
  {
687
691
  "filename": "presets/instruct/Gemma 2.json",
688
692
  "type": "instruct"
693
+ },
694
+ {
695
+ "filename": "presets/sysprompt/Actor.json",
696
+ "type": "sysprompt"
697
+ },
698
+ {
699
+ "filename": "presets/sysprompt/Assistant - Expert.json",
700
+ "type": "sysprompt"
701
+ },
702
+ {
703
+ "filename": "presets/sysprompt/Assistant - Simple.json",
704
+ "type": "sysprompt"
705
+ },
706
+ {
707
+ "filename": "presets/sysprompt/Chain of Thought.json",
708
+ "type": "sysprompt"
709
+ },
710
+ {
711
+ "filename": "presets/sysprompt/Roleplay - Detailed.json",
712
+ "type": "sysprompt"
713
+ },
714
+ {
715
+ "filename": "presets/sysprompt/Roleplay - Immersive.json",
716
+ "type": "sysprompt"
717
+ },
718
+ {
719
+ "filename": "presets/sysprompt/Roleplay - Simple.json",
720
+ "type": "sysprompt"
721
+ },
722
+ {
723
+ "filename": "presets/sysprompt/Text Adventure.json",
724
+ "type": "sysprompt"
725
+ },
726
+ {
727
+ "filename": "presets/sysprompt/Writer - Creative.json",
728
+ "type": "sysprompt"
729
+ },
730
+ {
731
+ "filename": "presets/sysprompt/Writer - Realistic.json",
732
+ "type": "sysprompt"
733
+ },
734
+ {
735
+ "filename": "presets/sysprompt/Blank.json",
736
+ "type": "sysprompt"
737
+ },
738
+ {
739
+ "filename": "presets/sysprompt/Neutral - Chat.json",
740
+ "type": "sysprompt"
741
+ },
742
+ {
743
+ "filename": "presets/instruct/Mistral V1.json",
744
+ "type": "instruct"
745
+ },
746
+ {
747
+ "filename": "presets/context/Mistral V1.json",
748
+ "type": "context"
749
+ },
750
+ {
751
+ "filename": "presets/instruct/Mistral V2 & V3.json",
752
+ "type": "instruct"
753
+ },
754
+ {
755
+ "filename": "presets/context/Mistral V2 & V3.json",
756
+ "type": "context"
757
+ },
758
+ {
759
+ "filename": "presets/instruct/Mistral V3-Tekken.json",
760
+ "type": "instruct"
761
+ },
762
+ {
763
+ "filename": "presets/context/Mistral V3-Tekken.json",
764
+ "type": "context"
689
765
  }
690
766
  ]
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": false,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": true,
11
10
  "name": "Adventure"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": false,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Alpaca-Single-Turn"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Alpaca"
12
11
  }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "ChatML-Names"
12
11
  }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "ChatML"
12
11
  }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Command R"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Default"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": false,
8
8
  "trim_sentences": true,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "DreamGen Role-Play V1 ChatML"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": false,
8
8
  "trim_sentences": true,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "DreamGen Role-Play V1 Llama3"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Gemma 2"
12
- }
11
+ }
@@ -1,12 +1,11 @@
1
1
  {
2
- "story_string": "### Instruction:\nWrite {{char}}'s next reply in this roleplay with {{user}}. Use the provided character sheet and example dialogue for formatting direction and character speech patterns.\n\n{{#if system}}{{system}}\n\n{{/if}}### Character Sheet:\n{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}",
2
+ "story_string": "### Instruction:\n{{#if system}}{{system}}\n\n{{/if}}### Character Sheet:\n{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}",
3
3
  "example_separator": "### Example:",
4
4
  "chat_start": "### START ROLEPLAY:",
5
5
  "use_stop_strings": false,
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Libra-32B"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Lightning 1.1"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Llama 2 Chat"
12
11
  }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Llama 3 Instruct"
12
- }
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Llama-3-Instruct-Names"
12
11
  }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "Minimalist"
12
- }
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "story_string": " [INST] {{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{personality}}\n{{/if}}{{#if scenario}}{{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}} [/INST] Understood.</s>",
3
+ "example_separator": "",
4
+ "chat_start": "",
5
+ "use_stop_strings": false,
6
+ "allow_jailbreak": false,
7
+ "always_force_name2": true,
8
+ "trim_sentences": false,
9
+ "single_line": false,
10
+ "name": "Mistral V1"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "story_string": "[INST] {{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{personality}}\n{{/if}}{{#if scenario}}{{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}[/INST] Understood.</s>",
3
+ "example_separator": "",
4
+ "chat_start": "",
5
+ "use_stop_strings": false,
6
+ "allow_jailbreak": false,
7
+ "always_force_name2": true,
8
+ "trim_sentences": false,
9
+ "single_line": false,
10
+ "name": "Mistral V2 & V3"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "story_string": "[INST]{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{personality}}\n{{/if}}{{#if scenario}}{{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}[/INST]Understood.</s>",
3
+ "example_separator": "",
4
+ "chat_start": "",
5
+ "use_stop_strings": false,
6
+ "allow_jailbreak": false,
7
+ "always_force_name2": true,
8
+ "trim_sentences": false,
9
+ "single_line": false,
10
+ "name": "Mistral V3-Tekken"
11
+ }
@@ -6,7 +6,6 @@
6
6
  "allow_jailbreak": false,
7
7
  "always_force_name2": true,
8
8
  "trim_sentences": false,
9
- "include_newline": false,
10
9
  "single_line": false,
11
10
  "name": "NovelAI"
12
- }
11
+ }