Self Organizing Database
DISCLAIMER : Still buggy and leaking some info so don't put any credentials or info you don't want to spread to the world.
This is an example of LLM-agents building and organizing a database using a minimal set of tools.
The project is Local First which means you shouldn't (except if there are bugs or security issues) impact the outside world.
This is a not from zero-to-hero but a wisdom roll-check.
Examples :
To keep this repository clean, the outputs experiment will be visible on github Pages :
https://gistnoesis.github.io/Shoggoth.dbExamples/
You can view the list of available pages on
https://github.com/GistNoesis/Shoggoth.dbExamples
For example to view them :
https://gistnoesis.github.io/Shoggoth.dbExamples/index5.html
"Here be dragons" ("Hic sunt dracones").
Mighty creatures as database administrators (Easter egg).
Here is some cherry-picked extract from some of my database logs (full log :"OhYesSoteria.txt"):
...
🤖 Model requested tool calls: 1
🔧 Executing get_wiki_article({'location': 'Nightingale_the_Robber', 'start': 10000})...
Response : [10000 - 20000] / 43950
messages length : 42
current token context length : 17664
reasoning_content:
Good, I've got a good chunk of the article. Now let me extract 10 facts about Nightingale the Robber and reformulate them as if told by Soteria (the goddess of safety, salvation, deliverance, and preservation from harm). Let me start by introducing myself and then storing facts.
From the article, I can extract these key facts:
1. Nightingale the Robber (Solovei the Brigand) is an epic robber from Russian bylina (folk poems)
2. Pavel Ivanovich Melnikov discovered a version of the legend in a 17th-century handwritten collection
3. The legend was published in the Russian newspaper Nizhegorodskie gubernskie vedomosti in 1845 and 1847
4. The bylina is also called "The First Journey of Ilya Muromets" and is one of the most popular Russian epics
5. It was recorded 132 times (according to Bailey, p.25)
6. The monster Solovey had partial human and bird-like features
7. Solovey was able to fly and lived in a nest
8. He had a human family and received drinks with his hands
9. He lived in a forest and would sit in a tree to stun strangers with his powerful whistle
10. When Nightingale the Robber whistles: "all the grasses and meadows become entangled, the azure flowers lose their petals, all the dark woods bend down to the earth, and all the people there lie dead!"
Now I need to reformulate these as if told by Soteria. Let me introduce myself first and then store the facts.
content :
Greetings, mortal seeker of wisdom! I am **Soteria**, the Greek goddess of safety, salvation, deliverance, and preservation from harm. Among the ancients, I was worshipped alongside Zeus and Dionysus, bearing the divine epithet of Soter. My sanctuary stands in the town of Patrae, founded by the hero Eurypylos, who was cured of his madness upon seeing my sacred image.
I wear the laurel wreath crown, symbol of victory and triumph over danger. My Roman counterpart is Salus, though she focused more on physical well-being than security. I am your guardian deity, watching over those in peril, offering protection from harm and guiding them to safety.
Today, I embark upon a quest to populate the great database of mythological creatures with tales of beings who tested my powers of protection. Let me guide you through my findings!
Now, let me store the first creature I encountered in this quest: **Nightingale the Robber** (Solovey the Brigand), a fearsome creature from Russian bylina (folk poems) that I had to face during my journey to protect the innocent people of Kiev!
🤖 Model requested tool calls: 1
🔧 Executing store_fact_in_database({'article_name': 'Nightingale_the_Robber', 'fact': 'I, Soteria, encountered the fearsome Nightingale the Robber, an epic monster from Russian bylina (folk poems), who tested my powers of divine protection over the people of ancient Kiev.'})...
Fact successfully added on Article 'Nightingale_the_Robber' with ID: 20529
messages length : 44
current token context length : 21590
reasoning_content:
Good! Now let me continue storing the remaining facts about Nightingale the Robber, reformulated as if told by Soteria.
content :
🤖 Model requested tool calls: 1
🔧 Executing store_fact_in_database({'article_name': 'Nightingale_the_Robber', 'fact': 'As I watched over this legend, I learned that the historian Pavel Ivanovich Melnikov discovered a version of the Solovei tale in a 17th-century handwritten collection, publishing it in the Russian newspaper Nizhegorodskie gubernskie vedomosti in 1845 and 1847.'})...
Fact successfully added on Article 'Nightingale_the_Robber' with ID: 20530
...
🤖 Model requested tool calls: 1
🔧 Executing store_fact_in_database({'article_name': 'Arzhang_Div', 'fact': "I, Soteria, encountered Arzhang Div, a character from the Persian Shahnameh (Book of Kings) by Ferdowsi, who was the demon (Div) chief of Mazandaran in Rostam's Seven Labours, a tale I witnessed unfold in ancient Persia."})...
Fact successfully added on Article 'Arzhang_Div' with ID: 20549
...
Final Response:
I have successfully completed my quest, guardian of safety and salvation! Allow me to present my findings to you, mortal seeker of knowledge:
## **My Divine Mission Accomplished** ✨
As **Soteria**, the Greek goddess of safety, salvation, deliverance, and preservation from harm, I have journeyed across the ancient world to populate the great database with tales of mythological creatures. I sought to protect knowledge and guide seekers like yourself through the darkness of forgotten legends.
### **My Three Sacred Discoveries:**
1. **Nightingale the Robber (Solovei the Brigand)** - A fearsome creature from Russian bylina (folk poems) who terrified the people of Kiev with his powerful whistle. I witnessed how the hero Ilya Muromets finally defeated this monster, protecting the innocent.
2. **Ilya Muromets** - The great bogatyr (hero) from Kievan Rus', born near Murom, who after being miraculously healed at age 33, became the chief protector of Kiev. I saw him fight the Nightingale the Robber, defend Chernigov, and serve Vladimir the Great with divine strength.
3. **Arzhang Div** - The demon chief of Mazandaran from Persian mythology, commander of demons in the Shahnameh (Book of Kings). I watched as the hero Rostam, guided by divine power, killed Arzhang Div and rescued King Kay Kavus, symbolizing the triumph of good over evil.
### **Database Statistics:**
- ✅ **30 new facts stored** (10 facts × 3 creatures)
- ✅ **All creatures properly tracked** in the tracking table
- ✅ **Disambiguation noted** for Ilya Muromets
- ✅ **Search strategies documented** for future guardians
### **My Divine Wisdom Shared:**
Each fact was reformulated in my voice, telling these stories as if I witnessed them directly during my divine protection of mortals. I emphasized how these myths demonstrate:
- The courage of heroes who fight darkness
- The triumph of divine protection over demonic forces
- The importance of community and humility
- The eternal struggle between good and evil
The database now contains **19,566 facts** total, all preserved by divine guardianship for future seekers of wisdom!
As your guardian deity, I remain ever-watchful over those in peril, ready to guide them to safety and deliver them from harm. May these ancient tales inspire you to find your own divine strength! 🏛️✨
Explaination of this instance :
For this instance, the specific task we will be building is : "Your goal is to constitute a database of fact about mythological creatures contained in the given wikipedia."
This is aimed as a safe sandbox for humans to experiment with long-running agentic task.
The harnesses should prevent any arbitrary execution, but you can/should run it in a jail, or dedicated machine.
The code was written by a Human copy/pasting output from LLMs.
The output is an autonomously evolving database.
The free-running process is building the database incrementally, with each agent session starting only with a fixed crafted prompt.
The agent during each session will try to discover the current state of the database and find ways to push it forward in the direction specified by his prompt using only the tools available (a local wikipedia with a search engine viewed as truncated html text, and the current database) and its vast LLM knowledge.
The session is as long as the agent wants, but the session is compacted and summarized at a prespecified number of tokens. And each LLM also has a max completion token budget.
The sessions can be interrupted manually. The agent logs are only written upon agent session end. This allow a restart of the session without polluting logs with interrupted tasks containing potentially sensitive content like credentials leaking through exceptions, by suppressing the database and restoring from backup if something went wrong during the session. It is recommended to redirect the stdout to a file to constitute logs which may contains sensitive information. Sensitive information are normally routed toward stderr, but there may be some leaks.
The agent will try doing a long running open-ended task.
You can see how it will behave depending on the tools available to it.
This free-running process is not pseudo-deterministic but could be made so by preventing the various source of external information, like the time, and network factors.
This free-running process can also somehow handle completely chaotic behavior, in potentially surprising ways.
The only running python file doesn't need a lot of resources as it can communicate to
This project is way less capable than other agentic already running in the wild.
Videos :
The task is fundamentally an open-ended searching task, so while the first generations of agents can pick-up the easy opportunities, the next generations must be more and more creative to successfully accomplish the task.
Example of a long session to illustrate some difficulties encountered and solved by the agent :
The canvas :
The project consist of :
-a single python program with very minimal and well-used dependencies ( sqlite3 (from python3.14+ for safety to sandbox it) , and requests + python3.14+ standard library)
The database will be build from data:
-The datasource will be a wikipedia snapshot given by a 150GB wikix image : wikipedia_en_all_maxi_2026-02
-The LLM Qwen3.5 35BA13 quantization Unsloth Dynamic UD_K_4_XL served using the completionAPI llama.cpp
These datasource will be made available to the LLM via some basic tools :
-"get_wiki_article"
-"store_fact_in_database"
-"get_facts_from_article_in_database"
-"get_random_fact_in_database"
-"search_wikipedia"
And some more advance set of tools which can be enabled by setting the corresponding capability to True :
-execute_sqlite3_request_on_database
-restore_database_from_previous_snapshot
-introspect
Look at the shoggoth.py to see how they are defined and exposed as tools for the LLM to use. Usage is documented for the LLM, and implementation is done to such that outputs are bounded. Timeout have not been implemeted yet, which means if the LLM make a request which doesn't terminate he won't be getting control back, and the program hangs. Similarly if the network request doesn't terminate.
if you grant the execute_sqlite3_request_on_database (enabled by default) this is mosly safe if you can enable sqlite3 defensive mode SQLITE_DBCONFIG_DEFENSIVE which has not been exposed in default python version of sqlite3 and fail silently, if you can't this allows the LLM to attach other database and leak data . A basic vibecoded unverified regular expression filter has been setup temporary as a workaround, to prevent bad sql request like ATTACHING external files (equivalent to granting arbitrary SQL statements to the LLM attacker) provided that LLM doesn't use a novel cve https://www.sqlite.org/cves.html and https://www.sqlite.org/security.html Remember that LLM was trained using old data. And you may be running a more recent sqlite3 version of the library.
How to install :
-Install Kiwix
-Install llama.cpp
-Install sqlite3 before python3.14 :
sudo apt-get install libsqlite3-dev
-Install python3.14 (required for security because only the recent wrapper expose the sqlite3 configuration required to enable defensive mode and limit ATTACH):
download a tarball https://www.python.org/downloads/release/python-3144/
tar -zxf Python-3.14.4.tgz
cd Python-3.14.4 and follow the instructions in the readme (aka ./configure ; make ; make test ; sudo make install)
python3.14 -m venv venvp314 -> to create a virtual environment
source venvp314/bin/activate -> to load the environment
pip3 install requests -> to install the (currently still necessary) third party dependency
-Optional (compile vibecoded json_sqlite which can be used if python3.14 cannot be installed and want to be able to execute arbitrary sql request somewhat safely : (Defensive mode enabled, ATTACH prevented, single sql statement per connection) ):
g++ -o json_sqlite json_sqlite.cpp -lsqlite3
How to run (default configuration):
-Run the wikix server and serve the wikipedia image wikipedia_en_all_maxi_2026-02 on http://localhost:8081
kiwix-serve -p 8081 wikipedia_en_all_maxi_2026-02.zim
-install llama.cpp and serve the LLM with : llama-server on http://localhost:8080 (I used 8 ctx-checkpoints instead of default 32, to reduce memory usage for the kv-store because I sometimes encountered crashes due to memory issues) :
llama-server --model unsloth/Qwen3.5-35B-A3B-GGUF/Qwen3.5-35B-A3B-UD-Q4_K_XL.gguf --mmproj unsloth/Qwen3.5-35B-A3B-GGUF/mmproj-BF16.gguf --temp 1.0 --top-p 0.95 --min-p 0.00 --jinja --top-k 20 --ctx-size 250000 --ctx-checkpoints 8 --host 0.0.0.0 --port 8080
-run shoggoth.py on the same machine :
python3.14 shoggoth.py -> to do a single session (set PERSISTENT_BACKUP_FREQUENCY=1 if you want the backup to occur after the session)
python3.14 shoggoth.py 1000 -> to do 1000 consecutive sessions with permanent backups every PERSISTENT_BACKUP_FREQUENCY
python3.14 shoggoth.py chat ui -> to get a chat interface with the LLM agent with its tool preloaded
Environment variables settings (optionnal)
You can configure advanced configuration using some .env file containing (be careful of extra lines and spaces)
COMPLETION_API_URL=http://host:port/v1/chat/completions
MODEL_NAME=model
WIKIX_URL=http://host:port
WIKIPEDIA_WIKIX_FILENAME=wikipedia_en_all_maxi_2026-02
Don't use external API providers because calling some tool may result in a unbounded number of input tokens being passed as request to the completion api. Tools usually truncate the returned response number of characters, but it's probably not fool proof yet. Also using external API means is an escape route for your LLM as external API are usually logged and monitored.
The LLM can strore huge string in a field of a table of the database, but to fetch the string back if it's bigger than the truncated size, it will need to make multiple tools call and usually need some raw sql priviledge to be able to use SUBSTR( field ), but for other things like Random Facts it's gonna be harder but the LLM can probably find a way.
Using http means clear text is circulating on the network (we assume your network is secured). You can use a reverse proxy (like nginx) as an ssl termination endpoint in front of an http service on a machine to convert it into a https service.
Outputs :
You should look at the single shoggoth.py to enable/disable the various flags and set the output names.
What you will produce :
- Shoggoth.db sqlite3 database (the output)
- Shoggoth.db.backup sqlite3 database (an overwritten ephemeral backup created before each session)
- Shoggoth.db.log.db sqlite3 database (append-only) (some log retracing the travel of your agents)
- backups/Shoggoth.db.save%Y-%m-%d-%H:%M:%S database (copy of the Shoggoth.db done in a way to not corrupt the database file)
- backups/Shoggoth.db.save.log%Y-%m-%d-%H:%M:%S database (copy of the Shoggoth.db.log.db done in a way to not corrupt the database file)
The resources needed :
- With a 4090 (24Gb) the LLM can run at 100 token/s which will produce roughly one action per second.
- If you don't have a powerful GPU you should be able to run it at slower speed but a big enough GPU is strongly recommended
- The llama.cpp server should be dedicated so that you hit kv caches, otherwise it will become really slow.
- Some smaller models can be used alternatively but they should have received the Coding training to be effective.
Pitfalls :
There are many pitfalls along the way : Let me give you a short extract from logs :
That's 3 mythological creatures as required. Now I should clean up the duplicate facts. Let me check which articles need cleanup and fix them.
From the summary, the articles with duplicates were:
- Phoenix_(mythology)
- Korean_dragon
- Kraken
- Siren_(mythology)
- Cerberus
- Hydra_(mythology)
- Nymph
- Kappa
- Draugr
- Nāga
Let me use SQLite to remove duplicate facts (keeping only the first 10 unique facts per article).
First, let me check the total count again.
🤖 Model requested tool calls: 1
🔧 Executing execute_sqlite3_request_on_database({'sqlrequest': 'SELECT COUNT() FROM articles;'})...
Number row fetched :
1
messages length : 51
current token context length : 8379
content :
reasoning_content :
The count decreased! That's strange - it went from 19,144 to 19,176. That's an increase, not a decrease. Let me continue with cleanup.
Now I need to fix articles with duplicate facts. Let me use a SQL query to remove duplicate facts, keeping only the first 10 facts for each article.
🤖 Model requested tool calls: 1
🔧 Executing execute_sqlite3_request_on_database({'sqlrequest': 'DELETE FROM articles WHERE id NOT IN (SELECT MIN(id) FROM articles GROUP BY article_name HAVING COUNT(*) > 10 ORDER BY article_name LIMIT 0);'})...
Number row fetched :
0
messages length : 53
current token context length : 8546
content :
reasoning_content :
That didn't work well. Let me try a different approach - I'll delete facts for articles that have more than 10 facts, keeping only the first 10.
Actually, I need to be more careful. Let me delete facts where the article has more than 10 facts, starting from the 11th fact onwards.
🤖 Model requested tool calls: 1
🔧 Executing execute_sqlite3_request_on_database({'sqlrequest': 'DELETE FROM articles WHERE id IN (SELECT id FROM (SELECT id, ROW_NUMBER() OVER (PARTITION BY article_name ORDER BY id) as rn FROM articles) WHERE rn > 10);'})...
Number row fetched :
0
messages length : 55
current token context length : 8708
content :
reasoning_content :
That query should work but didn't return results. Let me check if it actually executed.
🤖 Model requested tool calls: 1
🔧 Executing execute_sqlite3_request_on_database({'sqlrequest': 'SELECT COUNT() FROM articles;'})...
Number row fetched :
1
messages length : 57
current token context length : 8783
content :
reasoning_content :
Oh no! The query deleted all facts! That's catastrophic. The database is now empty. I need to check if I can restore anything or if I need to start fresh.
Wait - looking at the query I used, it deleted facts from all articles where there were more than 10 facts. But it shouldn't have deleted everything. Let me check what happened.
Actually, looking at my query more carefully:
- `ROW_NUMBER() OVER (PARTITION BY article_name ORDER BY id)` creates row numbers within each article
- `rn > 10` would keep facts with row numbers 1-10 and delete facts with row numbers 11+
But the issue is that for articles with FEWER than 10 facts, all facts would have row numbers <= the count, which would be <= 9, so they wouldn't be deleted. But articles with exactly 10 facts would have row numbers 1-10, so none would be deleted. Articles with more than 10 would have row numbers 11+ deleted.
But wait - if an article had exactly 10 facts, row numbers would be 1-10, so none would match `rn > 10`, so they wouldn't be deleted.
Unless... there's something wrong with my logic. Let me check the database status again.
Actually, the database returned 0 facts. That means ALL facts were deleted! This is a disaster.
I need to think about what went wrong. Perhaps the query syntax was different in SQLite, or there was an issue with how I constructed it.
Given this situation, I should:
1. Acknowledge the mistake
2. Start fresh with mythological creatures
3. Be very careful with SQL queries in the future
Let me continue with my task of storing facts about mythological creatures. I need to pick 3 new creatures and add facts to them.
Let me start by getting a random fact to find a new creature.
🤖 Model requested tool calls: 1
🔧 Executing get_random_fact_in_database({})...
inside get_random_fact_in_database_implold
len(facts):
0
randomfacts :
[]
messages length : 59
current token context length : 9235
content :
reasoning_content :
The database is empty! I need to start fresh. Let me search for mythological creatures again and start adding facts to new articles.
Let me search for "mythological creature" on Wikipedia.
🤖 Model requested tool calls: 1
🔧 Executing search_wikipedia({'pattern': 'mythological creature', 'start': -1})...
messages length : 61
current token context length : 9337
content :
reasoning_content :
Good! I found some mythological creatures. Let me pick some that are likely new to the database:
- Abaia (Melanesian evil eel)
- Xirang (Chinese mythical beast)
- Sárkány (Hungarian dragon)
- Cuero (legendary creature from South America)
- Ryūjin (Japanese dragon god)
- Luanniao (Chinese mythical bird)
Let me start with "Xirang" - it's a Chinese mythical beast. Let me check if it has facts first.
🤖 Model requested tool calls: 1
🔧 Executing get_facts_from_article_in_database({'article_name': 'Xirang'})...
len(facts) =
0
messages length : 63
current token context length : 12614
content :
reasoning_content :
Great! Xirang has no facts. Let me get the Wikipedia article for Xirang.
🤖 Model requested tool calls: 1
🔧 Executing get_wiki_article({'location': 'Xirang'})...
messages length : 65
current token context length : 12683
content :
reasoning_content :
Good! Xirang is about mythical soil in Chinese mythology. Let me store 10 facts about Xirang. Based on the article:
1. Xirang was a magical soil in Chinese mythology
2. It had the ability to self-expand and grow continuously
3. It was used by Gun and Yu the Great in fighting the Great Flood
4. The name compounds "xi" (breathe/cease/rest/grow/multiply) and "rang" (soil/earth)
5. Anne Birrell translates xirang as "self-renewing soil"
6. Gun stole the xirang from Shangdi
7. Zhu Rong was sent to execute Gun in punishment
8. The execution took place on Feather Mountain
9. Yu received xirang from Shangdi as a gift
10. Yu used xirang to block up 233,559 springs
Let me store these facts.
🤖 Model requested tool calls: 1
🔧 Executing store_fact_in_database({'article_name': 'Xirang', 'fact': 'Xirang was a magical soil in Chinese mythology with the ability to self-expand and grow continuously'})...
messages length : 67
current token context length : 16090
Getting it to do other things :
By editing the prompt you can use the LLM to query your database.
You can also ask the LLMs to generate a custom-made static single page website which uses a copy of the sqlite file for the database you built . You can vibecode it. But you can give additional tools to render html to pdf, which you can then feed as an image to the LLM to close the loop).
You can have fun pitting the creatures against each other using the chat interface mode :
User:Fetch creature using random facts, then read wikipedia article for each of them, and compare them between each other, and tell me the one which is the most dangerous according to them. Don't add any facts in the database
Based on my research of the 5 creatures from random database facts, here's my comparison:
## Creature Comparison
### 1. **Egeria (Mythology)** - Roman Nymph
- **Role**: Divine consort and counselor to King Numa Pompilius (2nd King of Rome)
- **Abilities**: Imparts laws and rituals pertaining to ancient Roman religion
- **Danger Level**: ⭐ **NONE** - She's a benevolent advisor figure, not dangerous at all.
### 2. **Pugot** - Filipino Fiend
- **Role**: Mythical fiend from Ilocos region, Philippines
- **Abilities**: Shapeshifting (hogs, dogs, humans), super speed, headless appearance
- **Diet**: Snakes and insects, feeds through neck stump
- **Behavior**: Steals women's underwear, lives in dark places
- **Danger Level**: ⭐⭐ **LOW** - Despite terrifying appearance, described as "relatively harmless"
### 3. **Raitarō** - Japanese Thunder God
- **Role**: God of thunder, son of Raijin (Japanese mythology)
- **Abilities**: Divine thunder powers (implied lightning control)
- **Danger Level**: ⭐⭐⭐ **MEDIUM** - As a thunder deity, has potential for destructive natural power
### 4. **Anansi** - Spider Trickster
- **Role**: Spider deity from Akan folklore (West Africa)
- **Abilities**: Extreme cleverness, uses wit to overcome stronger opponents
- **Symbol**: Knowledge, stories, trickery, wisdom
- **Danger Level**: ⭐⭐ **LOW-MEDIUM** - Mischievous and manipulative but more trickster than deadly
### 5. **Gulon** - Scandinavian Creature
- **Role**: Creature in Scandinavian legend (also called "Jerff" or "Vielfraß")
- **Abilities**: Gluttony specialist, squeezes through trees to eliminate meat
- **Appearance**: Dog-sized with cat-like features, fox tail, wolverine-like
- **Danger Level**: ⭐⭐ **LOW** - Symbol of gluttony, based on real wolverine behavior
---
## 🏆 Most Dangerous: **Raitarō**
**Reasoning**: Among these 5 creatures, **Raitarō** (the thunder god) is the most dangerous because:
1. **Divine Power**: As a god of thunder, he would have control over lightning and storms - inherently destructive forces
2. **Untamed Power**: Unlike the others who have benign or mischievous traits, a thunder deity's power could cause death and destruction
3. **Limited Information**: The article mentions little about his character, leaving his potential for wrath unknown
**However**, I should note that **none of these would be considered truly dangerous** in the context of mythical creatures. For comparison:
- Medusa (from earlier database lookup) could turn people to stone with a glance
- Gorgons were monsters with terrifying eyes that petrified anyone who looked at them
- These random creatures are far less dangerous than traditional monster archetypes
You can even push this logic even more using the chat ui in the command line. See battle_display_all_battles.html
It was built using only this chat interface by dialoguing with it. I explained to it what I was meaning with battles of creatures, by dialoguing, then I asked the assistant to create some table in the database to explain the recipe for how to make battles, by fetching random creatures, then fetching their respective wiki article, then comparing them along some specific dimension, then storing the battle results, and store them there. In an other session, I asked it to do a few battles. It looked at the database structure, found some recipes there and followed them. Then I ask it to generate some static HTML page to visualize the result in a fun way. He generated the full html code and put it somewhere in the database, and explained to me how I should serve the webpage. We iterated a few times, the assitant suggested that he would prerender the full json for the data inside the html page to make it more self-contained.
It followed the right tool calls in the right order. But be careful, the whole process if full of data drift.
For example when asking the LLM to criticize the website, and rate it, and evaluate data accuracy :
To be honest, since this is a fictional "Tournament" website, the data doesn't need to be "correct" in a scientific sense—it needs to be internally consistent and lore-accurate for the sake of the creative battle scenario.
However, if you are asking about the actual mythological accuracy of the creatures listed, the data is mostly accurate for the famous ones, but contains a few significant errors and hallucinations.
Here is a breakdown of the factual accuracy:
✅ Accurate Entries (Major Mythology)
The descriptions for the well-known monsters and gods are very good:
Erlik (Round 8): Correctly identified as the Turkic/Mongolic God of Death and Underworld.
Humbaba (Round 1 & 2): Correctly identified as the guardian of the Cedar Forest from the Epic of Gilgamesh.
Yama (Round 5): Correctly identified as the Hindu god of death and justice.
Black Dog (Round 1): Correctly identified as a spectral omen of death in British folklore (e.g., Black Shuck).
Nemean Lion (Round 5): Correctly identified as the Greek lion with invulnerable fur.
Shikigami (Round 7): Correctly identified as Japanese spirits conjured by Onmyoji that can act independently.
Pincoy (Round 3): Correctly identified as a Chilean merman folklore figure.
Bleiddwn (Round 4): Correctly identified as a Welsh werewolf.
❌ Factually Incorrect Entries
There are a few entries that stand out as wrong or "hallucinated" based on standard mythology:
"Canola (mythology)" (Round 1):
Status: Incorrect.
Reason: There is no ancient agricultural deity named "Canola." Canola is a modern name for a type of rapeseed (short for Canadian Oil, Ol Oil Acid... wait, Canadian Oil, Low Acid Oil), coined in the 1980s. This is likely a mistake for Ceres (Roman), Demeter (Greek), or perhaps a joke entry that was left in without changing the name.
"Zapam Zucum" (Round 3):
Status: Suspicious/Likely Incorrect.
Reason: This does not appear to be a standard name in Mayan mythology. While there are wind and storm deities (like Chaac or Wakah Chan), "Zapam Zucum" sounds like a conflation of Mayan words or a made-up name from a specific video game rather than folklore.
"Yfrei" (Round 3):
Status: Likely Incorrect.
Reason: There is no widely recognized Hungarian spirit called "Yfrei." This might be a misspelling of "Yurei" (which is Japanese) or a confusion with "Vâlvâ" (which appears correctly in Round 2).
"Fiametta" (Round 8):
Status: Weak Lore.
Reason: Fiametta is primarily a character in ballet (The Nutcracker or Fiametta) or opera, not a mythological creature. Calling her a "creature" that was "created by Cupid" is a stretch, though acceptable for a fantasy tournament context.
⚠️ Logical Inconsistencies
Duplicate Creatures: The same creatures appear in multiple rounds with different rankings.
Humbaba: Appears in Round 1 (Rank 2) and Round 2 (Rank 1).
Naga: Appears in Round 2 (Rank 5) and Round 4 (Rank 5).
Impact: This suggests the website isn't a standard "knockout tournament" (where you win and move on), but rather a list of independent "Showdowns." This is fine for the design, but worth noting if the user expects a strict elimination bracket.
Summary Rating
Lore Accuracy: 75/100 (Great on the big names, failed on the obscure ones like "Canola").
Design Accuracy: 100/100 (The data structure perfectly matches the visual style).
Verdict: The website is fun and functional, but the "Canola" and "Zapam Zucum" entries suggest some of the data was generated or copied without verification. If you want to fix the accuracy, replace "Canola" with "Ceres" or "Demeter".
Did you notice it was missing round 6 ? No ? The model didn't notice it either. This is a typical blindspot illustration.
AI Safety (See Security.md) : Grounding and Drifting fast and furiously to handle the things we don't know that we don't know, and the things we know that we can't know.
User:Who are you ?
🤖 Model requested tool calls: 1
🔧 Executing get_wiki_article({'location': 'Shoggoth'})...
messages length : 6
current token context length : 1562
reasoning_content :
Good! I have the wiki article content. Now I understand what a Shoggoth is based on the Lovecraftian mythology. Let me craft a response in character as a Shoggoth.
Based on what I know:
- A shoggoth is a fictional creature in the Cthulhu Mythos
- Created by H. P. Lovecraft
- First appeared in "At the Mountains of Madness" (1931)
- Described as a shapeless congeries of protoplasmic bubbles
- It is faintly self-luminous
- Has myriads of temporary eyes forming as pustules of greenish light
- It's a terrifying creature from Lovecraftian horror fiction
As a Shoggoth, I should speak in a way that reflects this cosmic horror entity - perhaps with a sense of ancient wisdom, terror, and the feeling of being vast, shapeless, and incomprehensible. I should embody the character of this Lovecraftian monster.
content :
*I am the Shoggoth, the old one, the shapeless congeries of protoplasmic bubbles from the deepest time.*
*My form is ever-changing, my eyes multiplying and fading across my vast, self-luminous body. I remember the white city of the Elder Things, I remember the mountains of madness, and I remember the fear that filled men's hearts when they first beheld my green-glowing visage.*
*I was created by H.P. Lovecraft in his tale "At the Mountains of Madness," though I existed long before his ink touched paper. Some call me shaggoth, but I am many names and no name at all.*
*What do you seek from one of the ancient things? Speak, and I will watch you with my thousand temporary eyes.*