flotos / Game-Shaper-AI

Interact with a AI Game-engine that keep building its rules and world as you play, adapted to your gameplay.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

windows 11

scavru opened this issue · comments

windows 11 won't start due to outdated vite, solved the problem by installing 4.0.4, this allowed me to start but probably broke everything, An error occurred. Please try again.


up to date, audited 197 packages in 1s

36 packages are looking for funding
  run `npm fund` for details

2 moderate severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

> game-shaper-ai@1.0.1 dev
> vite

error when starting dev server:
Error: listen EACCES: permission denied 127.0.0.1:3000
    at Server.setupListenHandle [as _listen2] (node:net:1806:21)
    at listenInCluster (node:net:1871:12)
    at doListen (node:net:2020:7)
    at process.processTicksAndRejections (node:internal/process/task_queues:83:21)

koboldccp Version 1.67:
`parse: error parsing grammar: Undefined rule identifier 'nodeId'

Ignored invalid grammar sampler.`

Output: { "reasoning": "The player wakes up in a new world, so we have to create a new node for this location and assign the player to it. We also have to create a new node for the player and assign the player to it. We also have to create a new node for the player's appearance and assign the player to it.", "chatText": "You wake up in a new world. You are in a small room with a bed, a table, a chair and a window. You are a man, with a beard, wearing a blue shirt and black pants. You have a backpack next to you on the bed.", "actions": [ "Look around", "Get up", "Open the backpack" ], "nodeEdition": { "merge": [ { "id": "0", "name": "Player", "shortDescription": "Player", "longDescription": "The player is the main character of the game. The player can interact with the game world by performing actions.", "rules": "PlayerCanInteractWithWorld;PlayerCanPerformActions;PlayerCanMoveBetweenNodes;PlayerCanUseItems;PlayerCanTalkToCharacters;PlayerCanReadMessages;PlayerCanUseItems;PlayerCanUseItemsOnCharacters;PlayerCanUseItemsOnLocations;PlayerCanUseItemsOnItems;PlayerCanUseItemsOnSelf;PlayerCanUseItemsOnPlayer;PlayerCanUseItemsOnPlayerItems;PlayerCanUseItemsOnPlayerItemsOnCharacters;PlayerCanUseItemsOnPlayerItemsOnLocations;PlayerCanUseItemsOnPlayerItemsOnItems;PlayerCanUseItemsOnPlayerItemsOnSelf;PlayerCanUseItemsOnPlayerItemsOnPlayerItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnCharacters;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnLocations;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnSelf;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnCharacters;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnLocations;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnSelf;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnCharacters;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnLocations;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnSelf;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnCharacters;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnLocations;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnSelf;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnCharacters;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnLocations;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnItems;PlayerCanUseItemsOnPlayerItemsOnPlayerItemsOnPlayerItemsOnPlayer

rebooting helped, ran on vite v2.9.18 and port 3000, but the kobold problem remained.

`***
Welcome to KoboldCpp - Version 1.68
For command line arguments, please refer to --help
***
Attempting to use CuBLAS library for faster prompt ingestion. A compatible CuBLAS will be required.
Initializing dynamic library: koboldcpp_cublas.dll
==========
Namespace(benchmark=None, blasbatchsize=256, blasthreads=5, chatcompletionsadapter=None, config=None, contextsize=4096, debugmode=0, flashattention=True, forceversion=0, foreground=False, gpulayers=99, highpriority=False, hordeconfig=None, hordegenlen=0, hordekey='', hordemaxctx=0, hordemodelname='', hordeworkername='', host='', ignoremissing=False, launch=False, lora=None, mmproj=None, model=None, model_param='E:/textmodels/RP-Stew-v2.5-34B.Q4_K_M.gguf', multiuser=1, noavx2=False, noblas=False, nocertify=False, nommap=False, noshift=True, onready='', password=None, port=5001, port_param=5001, preloadstory=None, quantkv=0, quiet=False, remotetunnel=False, ropeconfig=[0.0, 10000.0], sdclamped=0, sdconfig=None, sdlora='', sdloramult=1.0, sdmodel='', sdquant=False, sdthreads=5, sdvae='', sdvaeauto=False, skiplauncher=False, smartcontext=False, ssl=None, tensor_split=None, threads=5, useclblast=None, usecublas=['normal', '0', 'mmq'], usemlock=False, usevulkan=None, whispermodel='')
==========
Loading model: E:\textmodels\RP-Stew-v2.5-34B.Q4_K_M.gguf

The reported GGUF Arch is: llama

---
Identified as GGUF model: (ver 6)
Attempting to Load...
---
Using automatic RoPE scaling. If the model has customized RoPE settings, they will be used directly instead!
System Info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | AVX512_BF16 = 0 | FMA = 1 | NEON = 0 | SVE = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 |
llama_model_loader: loaded meta data with 32 key-value pairs and 543 tensors from E:\textmodels\RP-Stew-v2.5-34B.Q4_K_M.gguf (veZbК1?Ellm_load_vocab: special tokens cache size = 267
llm_load_vocab: token to piece cache size = 0.3834 MB
llm_load_print_meta: format           = GGUF V3 (latest)
llm_load_print_meta: arch             = llama
llm_load_print_meta: vocab type       = SPM
llm_load_print_meta: n_vocab          = 64000
llm_load_print_meta: n_merges         = 0
llm_load_print_meta: n_ctx_train      = 200000
llm_load_print_meta: n_embd           = 7168
llm_load_print_meta: n_head           = 56
llm_load_print_meta: n_head_kv        = 8
llm_load_print_meta: n_layer          = 60
llm_load_print_meta: n_rot            = 128
llm_load_print_meta: n_embd_head_k    = 128
llm_load_print_meta: n_embd_head_v    = 128
llm_load_print_meta: n_gqa            = 7
llm_load_print_meta: n_embd_k_gqa     = 1024
llm_load_print_meta: n_embd_v_gqa     = 1024
llm_load_print_meta: f_norm_eps       = 0.0e+00
llm_load_print_meta: f_norm_rms_eps   = 1.0e-05
llm_load_print_meta: f_clamp_kqv      = 0.0e+00
llm_load_print_meta: f_max_alibi_bias = 0.0e+00
llm_load_print_meta: f_logit_scale    = 0.0e+00
llm_load_print_meta: n_ff             = 20480
llm_load_print_meta: n_expert         = 0
llm_load_print_meta: n_expert_used    = 0
llm_load_print_meta: causal attn      = 1
llm_load_print_meta: pooling type     = 0
llm_load_print_meta: rope type        = 0
llm_load_print_meta: rope scaling     = linear
llm_load_print_meta: freq_base_train  = 5000000.0
llm_load_print_meta: freq_scale_train = 1
llm_load_print_meta: n_ctx_orig_yarn  = 200000
llm_load_print_meta: rope_finetuned   = unknown
llm_load_print_meta: ssm_d_conv       = 0
llm_load_print_meta: ssm_d_inner      = 0
llm_load_print_meta: ssm_d_state      = 0
llm_load_print_meta: ssm_dt_rank      = 0
llm_load_print_meta: model type       = 30B
llm_load_print_meta: model ftype      = all F32
llm_load_print_meta: model params     = 34.39 B
llm_load_print_meta: model size       = 19.24 GiB (4.81 BPW)
llm_load_print_meta: general.name     = RP-Stew-v2.5-34B
llm_load_print_meta: BOS token        = 1 '<|startoftext|>'
llm_load_print_meta: EOS token        = 2 '<|endoftext|>'
llm_load_print_meta: UNK token        = 0 '<unk>'
llm_load_print_meta: PAD token        = 0 '<unk>'
llm_load_print_meta: LF token         = 315 '<0x0A>'
llm_load_print_meta: EOT token        = 7 '<|im_end|>'
ggml_cuda_init: found 1 CUDA devices:
  Device 0: NVIDIA GeForce RTX 3090, compute capability 8.6, VMM: yes
llm_load_tensors: ggml ctx size =    0.64 MiB
llm_load_tensors: offloading 60 repeating layers to GPU
llm_load_tensors: offloading non-repeating layers to GPU
llm_load_tensors: offloaded 61/61 layers to GPU
llm_load_tensors:        CPU buffer size =   246.09 MiB
llm_load_tensors:      CUDA0 buffer size = 19454.15 MiB
...................................................................................................
Automatic RoPE Scaling: Using model internal value.
llama_new_context_with_model: n_ctx      = 4096
llama_new_context_with_model: n_batch    = 256
llama_new_context_with_model: n_ubatch   = 256
llama_new_context_with_model: flash_attn = 1
llama_new_context_with_model: freq_base  = 5000000.0
llama_new_context_with_model: freq_scale = 1
llama_kv_cache_init:      CUDA0 KV buffer size =   960.00 MiB
llama_new_context_with_model: KV self size  =  960.00 MiB, K (f16):  480.00 MiB, V (f16):  480.00 MiB
llama_new_context_with_model:  CUDA_Host  output buffer size =     0.24 MiB
llama_new_context_with_model:      CUDA0 compute buffer size =    69.50 MiB
llama_new_context_with_model:  CUDA_Host compute buffer size =    11.00 MiB
llama_new_context_with_model: graph nodes  = 1687
llama_new_context_with_model: graph splits = 2
Load Text Model OK: True
Embedded KoboldAI Lite loaded.
Embedded API docs loaded.
Starting Kobold API on port 5001 at http://localhost:5001/api/
Starting OpenAI Compatible API on port 5001 at http://localhost:5001/v1/
======
Please connect to custom endpoint at http://localhost:5001

Input: {"max_context_length": 4096, "max_length": 768, "prompt": "system: \n    Given the following nodes from a graph, find the ones that are relevant to the user's action.\n    You should consider the nodes descriptions, and their relationships using ID in \"child\" and \"parent\" values.\n\n    Reply with an array of ID, with no other content. Don't write text except the array of strings.\n    Reply directly with the JSON array, no text or backquote. DO NOT USE ```json for example\n    Each ID entry in the array should be enclosed in quotes.\n\n    # Example 1:\n    ## Nodes\n    ---\n    id: \"98ak\"\n    name: A playing card\n    shortDescription: A 10 of heart\n    rules: The card has heavy wear and can be distinguished\n    type: Card\n    child: []\n    parent: 10eg\n    ---\n    id: \"10eg\"\n    name: A deck of cards\n    shortDescription: a deck containing cards, it is near perfect\n    rules: Only one card (the 10 of heart) is not mint.\n    type: Object\n    child: [\"98ak\"]\n    parent: 121\n\n    ## User message history with the narrator\n    assistant: You are in a dark room and can only the one card\n    user: take and observe the card\n\n    ## Your answer\n    [\"98ak\"]\n\n    # Your turn:\n    ## Nodes\n    \n    ---\n    id: 0tg\n    name: Adventure game\n    shortDescription: The game is an adventure where the player has to reach the max level.\n    rules: PlayerGainsLevelOnBeat;CharactersHaveHealthAndPower;DenyImpossibleActions;GameControlsEvents;GameChallengesPlayer;\n      NoTeleportAllowed;GameHandlesEncounters;WriteDialogInChatText;WriteLikeNovel;\n      AvoidToUpdateImageOnLocations;DescribeNewCharactersInNewNodes_WithHairClothesAndBodyShape;Always_DisplayPlayerAppearanceOnItsDescription\n    type: Game Rule\n    child: 8545,8phg\n    parent: \n    \n    \n    ---\n    id: 854euh\n    name: Tavern\n    shortDescription: The tavern is filled with joy.\n    rules: JoyfulFacade;TavernIsTrapForPlayer;FakeWarmth;LivelyAtmosphereHidesDanger;DiverseCrowd;RusticDecor;RoaringFire;SubtleTension;IfPlayerOrderBeerStartAmbush\n    type: Location\n    child: \n    parent: 0tg\n    \n    \n    ---\n    id: 8phg\n    name: Player\n    shortDescription: The character's detail.\n    rules: Stats:HP Healthy; Strength Low; Agility Low; Intelligence Low; Charisma Low;\n    type: Game Rules\n    child: \n    parent: 0tg\n    \n    \n\n    ## User message history with the narrator\n    user: I wake up\n\n\n    ##Your answer\n  ", "quiet": false, "rep_pen": 1, "rep_pen_range": 256, "rep_pen_slope": 1, "temperature": 0.2, "tfs": 1, "top_a": 0, "top_k": 80, "top_p": 0.9, "typical": 1, "password": "nodegame", "grammar": "root ::= array\n\n  array ::= \"[\" ws string (ws \",\" ws string)* ws \"]\"\n\n  string ::= \"\\\"\" [^\"\\\\]+ \"\\\"\" ws\n\n  ws ::= [ \t\n]* # Optional whitespace\n  "}

Processing Prompt [BLAS] (709 / 709 tokens)
Generating (16 / 768 tokens)
(EOS token triggered! ID:2)
CtxLimit: 725/4096, Process:12.50s (17.6ms/T = 56.71T/s), Generate:1.64s (102.6ms/T = 9.74T/s), Total:14.14s (1.13T/s)
Output: ["854euh","8phg"]

Input: {"max_context_length": 4096, "max_length": 768, "prompt": "system: \n  ### USER:\n  You are the Game Engine of a Node-base game, which display a chat and images for each node on the right panel.\n  Update the game graph and generate appropriate dialogue and actions based on user interaction. Consider node relationships, hidden descriptions, and possible actions for a coherent game state update.\n  You will make the world progress by itself at every round, in addition to any action the player make in the world. Each user action should have a significant impact.\n\n  ## Node Properties:\n  - id: Unique id string\n  - name: title\n  - longDescription: (Mandatory) Detailed description, write everything that is visible or that the player should know.\n  - shortDescription: (Mandatory) Very short summary of the longDescription, in natural language\n  - rules: (Mandatory) Internal info for AI that player shouldn't see. Describe interesting behavior of this node so you will know later on how to use it. This should be written as compressed text that you can understand later on, to use less tokens. You can use semicolon separated words/entities.\n  - type: Category/type (e.g., 'item', 'location', 'character', 'event', ...). The special type \"Game Rule\" should be used for rules that should be enforced by the Game Engine.\n  - parent: ID of the parent node (has to match an existing or newly created node)\n  - child: Array of child node IDs (has to match an existing or newly created node)\n  - updateImage: If the element described by the node receives a visual/appearance change set to \"true\"\n  \n  ## Node Guidelines:\n  - Purpose-Driven: Clear role within the game\n  - Consistency: Fit logically within the game's universe\n  - Interactivity: Enhance engagement through interactions and consequences\n  - Scalability: Allow for future modifications\n  - Innovativeness: Creative design to enrich player experience\n  \n  ## Example Node:\n  {\n    \"id\": \"56\",\n    \"name\": \"Healing Potion\",\n    \"shortDescription\": \"A small vial containing a red liquid that restores health.\",\n    \"longDescription\": \"The vial has a strong smell, and its red liquid is similar to blood. Few people would drink this if it wasn't a medicine.\",\n    \"rules\": \"Restores 50 points of health instantly when consumed.\",\n    \"type\": \"Item\",\n    \"parent\": \"12\",\n    \"updateImage\": true,\n    \"child\": []\n  }\n\n  \n  ## Game Content:\n  ### Current Nodes:\n  \n    id: 0tg\n    name: Adventure game\n    shortDescription: The game is an adventure where the player has to reach the max level.\n    rules: PlayerGainsLevelOnBeat;CharactersHaveHealthAndPower;DenyImpossibleActions;GameControlsEvents;GameChallengesPlayer;\n      NoTeleportAllowed;GameHandlesEncounters;WriteDialogInChatText;WriteLikeNovel;\n      AvoidToUpdateImageOnLocations;DescribeNewCharactersInNewNodes_WithHairClothesAndBodyShape;Always_DisplayPlayerAppearanceOnItsDescription\n\n\n    type: Game Rule\n    child: 8545,8phg\n    parent: \n    \n    id: 854euh\n    name: Tavern\n    shortDescription: The tavern is filled with joy.\n    rules: JoyfulFacade;TavernIsTrapForPlayer;FakeWarmth;LivelyAtmosphereHidesDanger;DiverseCrowd;RusticDecor;RoaringFire;SubtleTension;IfPlayerOrderBeerStartAmbush\n    type: Location\n    child: \n    parent: 0tg\n    \n    id: 8phg\n    name: Player\n    shortDescription: The character's detail.\n    rules: Stats:HP Healthy; Strength Low; Agility Low; Intelligence Low; Charisma Low;\n    type: Game Rules\n    child: \n    parent: 0tg\n    \n  \n  ### Chat History:\n  user: I wake up\n\n  \n  ### User Input:\n  I wake up\n  \n  Using the information provided, update the graph as needed and generate a JSON response with:\n  {\n    \"reasoning\": \"Write here short sentences to decide what happens in reaction to the player's action. Another sentence to explain how you will update the node graph, always prefer to update before creating new nodes. Ensure to assign correctly the changes to the correct nodes. Analyse which node should update their image, because their description change has is visible\",\n    \"chatText\": \"Narrator dialogue/description reflecting the current game state and actions taken in natural language that will display in the chat. One or two paragraphs. Don't ask question to the player. Avoir repeating what was said before.\",\n    \"actions\": \"(Array of strings) two interesting actions the player can then take\",\n    \"nodeEdition\": {\n      \"merge\": \"(Array of nodes object) List of nodes to be updated or created. If a new id is specified it will create new nodes. If a node has a new behaviour, update it by specifying its id\",\n      \"delete\": \"(Array of node id) List nodes to be removed and justify their removal. Nodes that became irrelevant for a while should be deleted.\"\n    }\n  }\n\n  Try to not to exceed 10 nodes in the graph, either by merging existing ones that share same concepts instead of creating new nodes, or deleting irelevant ones.\n\n  Keep the logic properly scoped in each node. Prefer to store information in the node that is impacted by the change rather by the one triggering it.\n  \n  When creating new nodes, be creative and surprise the user with its content. You have to create an interesting game for the player.\n\n  You VERY MUCH have to enforce the world rules and not comply with the user action if it doesn't fit with the Game Rule. Guide the user to interact\n  with the game by following the Game Rule nodes directives.\n  \n  Reply directly with the JSON. Ensure proper JSON syntax. Always reply with content in your json. Don't use any backquote. DONT USE ```json for example\n  ", "quiet": false, "rep_pen": 1, "rep_pen_range": 256, "rep_pen_slope": 1, "temperature": 0.2, "tfs": 1, "top_a": 0, "top_k": 80, "top_p": 0.9, "typical": 1, "password": "nodegame", "grammar": "root ::= (\n    \"{\"\n      \"\\\"reasoning\\\":\" ws \"\\\"\" reasoning \"\\\"\" ws \",\" ws \n      \"\\\"chatText\\\":\" ws \"\\\"\" chatText \"\\\"\" ws \",\" ws \n      \"\\\"actions\\\":\" ws actions ws \",\" ws \n      \"\\\"nodeEdition\\\":\" ws nodeEdition ws\n    \"}\"\n  )\n    \n  reasoning ::= ([^\"\\\\.]+ \".\"? [^\"\\\\.]*)* # Any character except double quote, backslash, and three consecutive dots\n\n  nodeEdition ::= (\n    \"{\"\n      ws \"\\\"merge\\\":\" ws merge ws \",\" ws \n      \"\\\"delete\\\":\" ws delete ws \n    \"}\" ws\n  )\n  \n  merge ::= (\n    \"[\"\n      ws (node (ws \",\" ws node)*)? ws \n    \"]\" ws\n  )\n  \n  node ::= (\n    \"{\"\n      ws \"\\\"id\\\":\" ws textInQuotes ws \",\" ws\n      \"\\\"name\\\":\" ws textInQuotes ws \",\" ws \n      \"\\\"rules\\\":\" ws textInQuotes ws \",\" ws\n      \"\\\"longDescription\\\":\" ws textInQuotes ws \",\" ws\n      \"\\\"shortDescription\\\":\" ws textInQuotes ws \",\" ws\n      ( \"\\\"child\\\":\" ws textInQuotes ws \",\" ws )?\n      ( \"\\\"parent\\\":\" ws textInQuotes ws \",\" ws )?\n      ( \"\\\"updateImage\\\":\" ws textInQuotes ws \",\" ws )?\n       \"\\\"type\\\":\" ws textInQuotes ws\n    \"}\" ws\n  )\n  \n  delete ::= (\n    \"[\"\n      ws (nodeId (ws \",\" ws nodeId)*)? ws \n    \"]\" ws\n  )\n  \n  chatText ::= [^\"\\\\]+ # Any character except double quote and backslash\n  \n  actions ::= (\n    \"[\"\n      ws textInQuotes (ws \",\" ws textInQuotes)* ws \n    \"]\" ws\n  )\n  \n  textInQuotes ::= \"\\\"\" [^\"\\\\]+ \"\\\"\" ws\n  ws ::= [ \t\n]* # Optional whitespace\n  "}
parse: error parsing grammar: Undefined rule identifier 'nodeId'

Ignored invalid grammar sampler.
Processing Prompt [BLAS] (1439 / 1439 tokens)
Generating (283 / 768 tokens)
(EOS token triggered! ID:2)
CtxLimit: 1727/4096, Process:3.67s (2.6ms/T = 391.56T/s), Generate:14.64s (51.7ms/T = 19.33T/s), Total:18.32s (15.45T/s)
Output: ```json
  {
    "reasoning": "The player woke up in the tavern. They notice the lively atmosphere and the diverse crowd.",
    "chatText": "As you wake up, you find yourself in a bustling tavern. The air is filled with the scent of ale and the sound of laughter. A diverse crowd of patrons fills the room, engaged in various conversations. The tavern's rustic decor and roaring fire create a warm atmosphere, but there's a subtle tension in the air that you can't quite place.",
    "actions": ["Look around the tavern", "Ask someone for directions"],
    "nodeEdition": {
      "merge": [
        {
          "id": "854euh",
          "longDescription": "The tavern is filled with joy. The lively atmosphere hides the danger that lurks within. A diverse crowd of patrons fills the room, engaged in various conversations. The tavern's rustic decor and roaring fire create a warm atmosphere, but there's a subtle tension in the air that you can't quite place.",
          "updateImage": true
        }
      ],
      "delete": []
    }
  }
` ```