I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.
In the previous episode of this thing, our team of Earthlings, having ventured through a rift into another dimension, encountered a half-buried building in an obsidian desert. Now, they enter it. The following audio is an episode-long account of what happened.
That’s it for today narrative-wise. By the way, this is the portrait that the app generated for Zha’thik.
As I was thinking what else I could do with character memories, which are used by the large language models to roleplay the characters better, I ended up implementing a system to generate any character’s worldview, his or her personal philosophies, influenced by their bio and their experiences. That means that when the user wants to deepen the roleplaying of any of the characters at an arbitrary point of the journey, their worldview can be generated, and it will reflect the journey up to that point. Some characters could start naive, only for their worldview to change after nasty experiences. And of course, the generation of self-reflections receives all the memories as input, including any possible worldview texts.
This is the worldview generated for the brilliant scholar Elara Thorn, based on her bio and experiences up to this point:
Elara Thorn views the world as a place full of untapped knowledge waiting to be discovered, even if it means venturing into dangerous and morally ambiguous territory. Her philosophical beliefs are rooted in the idea that the pursuit of truth and understanding justifies the risks and sacrifices made along the way. She believes that knowledge is power and that those who possess it have an obligation to use it for the greater good, even if it means pushing the boundaries of conventional morality. However, her worldview is not without its challenges and doubts. As she delves deeper into the mysteries of the multiverse, Elara is faced with the harsh realities of the consequences of her actions. She begins to question whether her obsession with knowledge has blind her to the cost of her pursuit, and whether the sacrifices she’s made have been worth it. Elara’s moral standing is complex and evolving. While she believes in the importance of doing what is right and protecting those who cannot protect themselves, she also recognizes the necessity of making difficult choices in the face of unimaginable danger. She struggles with the weight of her own humanity, constantly grappling with the question of whether her actions are truly justified or if she has become a monster in pursuit of her own desires. Despite the doubts and challenges that confront her, Elara remains steadfast in her belief that the pursuit of knowledge is worth the risks and sacrifices, and that she has a duty to use her brilliance to make a difference in the world, even if it means navigating the treacherous waters of the unknown.
My Writers’ Room has come up with an intriguing concept for the next episode. I can’t wait to play it out.
I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.
We abandoned our heroes as they were about to approach an interdimensional rift, hoping to rescue a certain missing teenager.
Her comes a problem: although I had reworked the entire app to include an overarching Story Universe concept so that other worlds could be added, that doesn’t change the fact that the world on the other side of the rift isn’t connected to Earth, but to the Story Universe. I’m not sure how often this is going to happen in a story, so instead of programming the action of adding a new world, with its regions and areas, into the story universe, I just added that hierarchy manually in the JSON file that houses the map. As I use the app more, I’ll see if adding new worlds happens so often that it warrants programming it into the interface. What I did program was the simple notion of teleporting to another area from any area or location, as that could be useful from a storytelling perspective. A simple select to choose the area, then a button to teleport the player and his or her followers there.
The team dares to venture through an interdimensional rift, into somewhere else.
That’s all narrative-wise for today. Still twenty minutes of audio.
Being honest here, I wasn’t sure what the team might find inside the ruins. I wished I had implemented that Writers’ Room idea of mine, to rely on a little swarm of AI agents focused on aspects of storytelling so I could ask them questions about the story, and for them to elaborate on it. So I did, I programmed the Writers’ Room.
I have created a small team of AI agents. The user’s request first lands on the showrunner agent, that considers if he/she/it can handle it. If not, the showrunner delegates the task to more specialized agents, namely the story editor, the character development agent, the world-building agent, the continuity manager, the researcher, the theme agent, the plot development agent, and the pacing agent. The code provides each agent with data from other corners of the app; for example, the continuity agent receives the list of facts that one can introduce into the Story Hub to keep track of what’s going on, while the plot development agent receives all the goals, plot twists, and scenarios that have been generated in the Story Hub. It all works surprisingly well. Fun times!
As of yesterday, I’m unemployed. I was enjoying some vacation time from the Saturdays I had worked, as well as days they owed me from last year, but I had also taken almost the entirety of November as vacation time. Unfortunately, the guy whose medical leave I was covering has returned to work (technically he will return on Monday, but administratively he’s back). That means that my contract has ended, and I’ll have to call HR and ensure that my scheduled vacation time will show up as extra money in my last paycheck.
Worse yet, I have returned to the dreadful wasteland of not knowing when I’ll get recalled to work. I may get woken up at eight in the morning any given day (even on a Saturday), and told to show up at the office a couple of hours later. And it’s a really bad time for me to return to work, because next month, the project to replace every goddamn computer in the hospital complex starts, and my boss had already informed me that he intended to involve me.
In case you haven’t been following my posts, I’ve dealt with stress-induced medical issues, including arrhythmia, as well as an episode that sent me to the ER and got me diagnosed with a complex migraine, likely a hemiplegic migraine, although I suspect it may have been a small stroke: the issues with my vision, the main symptom for which they diagnosed me with a migraine, ended up being related to a detached vitreous gel that a couple of weeks later developed into a torn retina; I had to hurry to the ER and get patched up with a laser (and my vision has ended up permanently fucked up from that episode).
Honestly, I don’t think I’m suited for full-time work. I can work tirelessly at my own stuff, and do so, sometimes even at night until I can’t think anymore, but working at an office, surrounded by human beings, is far too much for an autistic nutcase like me. Likely, though, any other job that would pay similarly would be far worse for me; I already tried to work in the private sector, more often than not for free, and I was a prime candidate to be let go or not hired because someone in charge considered me weird. Even had a direct boss argue with his superior that I was doing great technical work, only for that superior to let me go because I wouldn’t “fit in.”
Anyway, I’m busy with my programming project, but I also want to get my mind off this sudden change, so I’ll likely spend the whole afternoon in the beautiful city of Donostia, walking around or sitting at some outside table to read manga.
Being an adult sucks so much. Don’t ever do it, kids.
I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.
Three or four days ago, the RunPod templates that render voices stopped working. At least one of them is operative again, so that’s great. In the meantime, it was off-putting enough for me to use the system with silent characters that I took advantage of the break to improve fundamental parts of the app. I’ve forgotten most of what I’ve worked on, but the point is that I’m back, so here’s more voiced narrative.
I implemented a Travel action that is only accessible when one moves from an area (such as a city) to another. The ongoing adventure in this eldritch setting had led us away from Providence toward some interdimensional rifts in the wilderness, to where a missing girl could have traveled or have been brought.
After rendering those voice lines, I realized that the travel audio should be produced in the player’s voice, not the narrator’s. Oops. Anyway, fixed for the next time.
Such long voice lines require about forty seconds in total to render. I thought that they were perfect candidates for parallelism, which Python isn’t particularly fond of, but after implementing it, turns out that the RunPod server that handles voice generation isn’t fond of multiprocessing either, so I had to revert all that programming.
My player character had some observations to make about his new surroundings.
The team gathers in the wilderness, an unusual setting for scholars and police detectives.
I usually discover new features to implement as I’m playing, whenever I realize I’d love for some functionality to be present. At times, as I was chatting, I wanted for the AI to give me a “push,” to move the narrative just a few sentences forward based on the ongoing dialogue and what it knows about the characters. So I implemented a button that injects a narrative beat. That part at 2:55 in the previous audio is an example of it.
I also had to redesign the interface of the chat page. Those buttons are showing spinners because the server is processing a speech part for that form. The first button sends the speech written above. The second button produces ambient narration, and the third a narrative beat. The part below allows the user to introduce an event; sometimes I just want to state that the characters are doing something without having to trigger a dialogue response from other characters. The event gets voiced, and injected into the transcription so the rest of the characters can react to it.
Before we continue with the narrative, which will involve the results of an Investigate action, I wanted to showcase some character portraits that the app has generated these past few days for other test stories.
It’s so strange to have gotten used to this level of quality coming from artificial intelligence. My reaction to seeing those pictures generated for a newly created character was, “Oh, that looks good. Moving on.”
Anyway, here’s the result of the Investigate action:
I considered for a while if I should create a Track action, but that isn’t different enough from an investigation, as far as I’m concerned. One of the great things of this LLM-led system is that I had no idea what was going to happen, and now it’s “canon” that Elara Thorn has found a rift, and also discovered an artifact that could guide them to rifts on either side of them.
Forgive my player character for his inability to say “vicinity” correctly. He’s way over his head.
I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.
As I mentioned recently, I realized that I hadn’t taken into account that all stories that would play out through this app wouldn’t take place in the same “world,” which at some point it had come to mean mechanically a single planet. Rather obvious in retrospect. So I had to program in the overarching notion of a Story Universe. Along the way, I realized I would need to tinker with plenty of other parts of the app that I dreaded touching, mainly the chat system and the classes that interact with the large language models (the AI). Those were the first ones I programmed in, so they were a mess. Thanks to the vulture library, that finds unused code in a project, I’ve removed every single remnant of the initial implementation, and now the chat system is very sturdy.
I intended to write an app focused on offering the user (mainly me) the choice to experience stories through it, but I was spending plenty of time programming code to interact with the AI and parse out its responses. I figured that there should be some industry-standard libraries out there to save me the trouble, and indeed there are two: pydantic and instructor. Pydantic lets you create “response models” without having to write JSON files; it handles all the parsing by itself, programmed by far more intelligent people. Instructor wraps the OpenAI API and offers compelling functionalities on top of it, such as retries, validators, streaming, etc. Check out its website.
Anyway, it has taken me days to return the app to a usable state, but now it’s far more robust, bolstered by about 400 tests, and the changes will allow me to introduce new actions, pages, etc. far faster.
Anyway, let’s get back to my first serious playthrough, focused on exploring the edges of the system to figure out what stuff I should program in.
My protagonist meets with his two allies, his partner and Elizabeth’s distraught father, in the rainy streets of Providence.
A few days ago I programmed in a new type of action, named Gather Supplies. As I mentioned in the past, every kind of action that could come up in a story, and that wouldn’t get resolved through a dialogue, I intend to program it in. Here is the narrative and the outcome of the team’s efforts to gather supplies for this endeavor.
As with any other action, the AI is prompted to enter the player and their followers’ personalities and general resourcefulness into the equation when coming up with the resolution.
Both teams gather at night in the outskirts of Providence, ready for a trip into the unknown. Elara has brought an acquaintance of hers, a middle-aged professor named Thaddeus Armitage.
Are those fused fingers I spy? Quite eldritch, I’d say.
Next up, adding a new area to the map and traveling to it, which will involve an audible narrative.
Tomorrow I start a vacation period that could last until early December, but the whole thing may end up getting cut short. These are the circumstances: I’m covering for a nutcase who goes on medical leaves constantly. I’ve been covering his latest leave for close to a year. In my country, if you extend your leave for more than a year, you’ll get transferred to Social Services, where you’ll be forced to do interviews with them and have some administrative issues. People usually want to avoid that, so I expect this person whom I have to refer to as my coworker to return a day before his leave reaches a whole year. That’s October 31st.
If the guy returns, my contract will end. I’ll get paid for the unspent vacation time (because I already scheduled it; wouldn’t have gotten paid for them otherwise), but that means that I’ll be unemployed, and I may get called into work right that day as part of a new contract. Best case scenario for me is if this coworker keeps working throughout November.
I really need time off in general, but even more so because I haven’t been doing well physically. As I posted some time ago, during a period of sustained stress for months, I suffered what a neurologist referred to as a “complex migraine,” likely a hemiplegic migraine: I was experiencing flashes of darkness in my right eye, and during the attack, I lost sensitivity in the right half of my body. I’m quite sure that I also caught a “burnt smell” at the time. The young doctor diagnosed me with a migraine because I had a history of migraines (that had ended since I started taking beta-blockers for my heart issues), and because of the visual aura. I’m quite sure he also said something to the effect of, “You’re too young to have strokes.” I should also be too young to have arrhythmia, or any of the other shit I’ve ended up burdened with, but here I am.
However, the visual aura never went away entirely, and a couple of weeks ago or so it developed into a torn retina. That got treated, leaving me, however, with permanent “floaters.” But it made me think that what I suffered at work wasn’t a migraine, but a stroke. I feel like I haven’t recovered fully from that episode, that I’m clumsier, more forgetful, and “off” in general since. I don’t know if you can spot brain damage in an MRI or if they just assume the kind of brain damage given the symptoms, but in any case, I have a visit scheduled for November 6th, that I hope will end up either confirming brain damage or giving me good news.
I must add that I have very little confidence in the medical profession, or at least as it stands now. I deal with many nurses and doctors on a regular basis. More often than not, the nurses are the chatty, dumb, “tactile” type, and the doctors are very often egocentric and have something of a god complex. I am vaccine-injured thanks to Moderna, and have visited three cardiologists for it. The first one, annoyed, denied that the covid vaccines caused any heart issues. The second, close to retirement, seemed ashamed of the whole thing, and admitted that the covid vaccines indeed were causing heart damage; he told me that he had treated lots of young women who had ended up in his office because they had acquired Postural Orthostatic Tachycardia Syndrome (POTS) after covid or the vaccines. This doctor, however, behaved as if admitting that the vaccines caused any issue was a huge taboo. A third cardiologist said that indeed the vaccines were associated with heart damage, but that there weren’t enough studies to prove that they caused the problem or if they just triggered a predisposition toward having that problem. “What came first, the chicken or the egg?”. Hey, remember when you jabbed millions upon millions of people with an experimental treatment without having enough studies to prove their effects?
I’m my spare time, I’m working on my Flask/Python app neural-narrative, that allows the user to chat with characters controlled by large language models, and do some other narrative stuff. I’m very pumped to work on it, aching to return home and keep programming.
Recently I decided to add the overarching notion of Story Universes to the hierarchy of places of a story, and that led me to tinker with other stuff. I have yet to finish returning the app to normal, in a significant part because I added a new type to ensure that strings that should have content indeed had it. In retrospect, that was a mistake, because it would have been enough with validating the content of the string at times and throwing a ValueError if the validation failed, so I’ll have to get busy reverting those changes.
Good news is that I’ve racked up about 400 pytest tests to ensure the proper behavior of those parts of the code. All the tests are written by versions of OpenAI’s Orion preview model, which are wonderful for routine work that is very useful but annoying to write. Of course, preparing a part of the code so that it can be testable necessarily forces you to ensure its code quality (using dependency injection, adhering to the Single Responsibility Principle, etc.). However, I also have a God Class lingering around, one that handles everything related to the file system, that I’ll need to chop up and test soon.
OpenAI recently released an initial version of a “swarm of agents” framework, that will allow you to easily set up chains of responsibility and action with an arbitrary number of AI agents. That has gotten me thinking about setting up a writers’ room page in my app in which you could speak in natural language, and different AI agents specialized in writing, analyzing lore, considering character development, etc. would work on whatever aspect of the ongoing story you want to touch. It could work pretty much like a real writers’ room, but without the nasty ego and other human aspects.
I’ll try to visit new places during this vacation time, although I’m limited by my lack of a car, poor stamina, IBS, etc. Thankfully I have plenty of money. I’m also aching to get lost in a good game, and I have eyed that new JRPG by the Persona dudes, Metaphor: ReFantazio, quite lustfully. I’m constantly reading similar stories (although usually with an isekai bent), and most Western games are falling one after the other to the ESG and DEI rot, so you can’t rely on those. However, I don’t know if I can justify to myself playing games when I’m constantly juggling creative projects.
I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.
At the end of the previous part, my player character, a police detective, convinced an arrogant scholar and a mysterious young student to cooperate on messing with interdimensional rifts to find a missing teen.
The young student mentioned that they would gather supplies. That sounded like an action that my player character and his companions should be able to perform. A section of my app already allowed the user to perform Investigate and Research, so I created a whole new action for gathering supplies.
I relied on OpenAI’s Orion preview model to refactor the whole process of creating a new action type to the utmost, so now it will be very easy to add new ones.
More importantly, I pictured what could be in the horizon for this little test story. Will they walk through a rift into another dimension? How the hell would that work mechanically? My app tracks the combination of places where any character is located. The hierarchy goes world > region > area > location. Characters can be present in areas (some space the size of a town) or in locations (the size of a building or complex of related buildings). But what if the characters step from Providence into another dimension? Is that still set in the world of this story, that originally was intended to refer to a planet? Could that other dimension be squeezed mechanically into being in an alternate 1920s Earth?
Clearly I was missing something, so I thought about it until I came with the notion that the hierarchy of places should be contained inside a new notion, not exactly a place, called Story Universe. This new dimension would belong to the overarching story universe, but not be connected to the same world. This is very important, because dialogues, actions, and such get fed the hierarchy of places and their descriptions as information.
This new Story Universe for my ongoing story encapsulates the notion that rifts to other dimensions can open by themselves or be torn open, and that the beings of many dimensions have to deal with that nonsense.
I ended up having to rewrite the code for every part that involves creating places, because they had to take into account that they all stemmed from, however remotely, a particular Story Universe. I made a new page to handle the generation of places.
These changes allowed me to create the following hierarchy of deranged places for a story or a myriad of them:
Story Universe: The Whims of Divinity
In the universe of ‘The Whims of Divinity’, the gods reign supreme, wielding the power to bestow extraordinary abilities upon the creatures they deem worthy. This universe operates on the fundamental principle of divine intervention, where the gods’ actions and decisions shape the course of events. The unique aspect of this universe lies in the unpredictable nature of the gods’ choices, as they grant powers based on their ever-changing whims. The creation myth speaks of the gods molding the universe from the very fabric of their desires, breathing life into beings and worlds through their divine will. The structure of reality consists of multiple realms, each governed by a different god, with the mortal realm at the center. The gods observe the mortal realm, seeking individuals or creatures that capture their interest, granting them powers that can range from elemental control to reality-bending abilities. The themes explored within this universe revolve around the struggle between free will and predestination, the nature of power and responsibility, and the capriciousness of divine favor. The whims of the gods create a world where heroes can rise from the most unlikely of places, where villains may be driven by the very powers they possess, and where the balance of the universe hangs on the unpredictable decisions of the divine. Stories within this universe delve into the lives of those blessed or cursed by divine intervention, exploring how these powers shape their destinies and the world around them. The possibilities for conflict, exploration, and discovery are endless, as characters navigate a reality where the gods’ whims can change everything in an instant.
World: Memmedom
Memeddom is a world governed by the eccentric, deranged god of memes. The geography of Memeddom is a patchwork of vibrant, chaotic landscapes, ranging from the glittering Meme Mountains to the vast Echo Chambers, where endless loops of soundbites resonate. The flora and fauna have evolved to mimic popular memes, with creatures like the Doge Deer and plants like the LOLlius flowers. The god’s preoccupation with creating and sharing memes has led to a culture obsessed with viral content and fleeting fame. The dominant language, MemeSpeak, consists of a mixture of images, emojis, and abbreviated text. The economy is based on the currency of ‘Likes,’ where citizens earn and spend Likes on goods and services. Resources in Memeddom are memes themselves, with rare and viral memes being the most valuable. The world is ruled by an Influencer Monarchy, where the most popular and influential meme creators hold power. Political tensions arise between different meme factions, each vying for control over the ‘MemeStream,’ the main source of meme distribution. The dominant religion is the ‘Church of the Viral,’ which worships the god of memes and seeks to spread his influence across the world. The society is divided into classes based on online popularity, with the most liked individuals forming the elite ‘Trending’ class. The inhabitants of Memeddom are a mix of humans, talking animals, and emoji-like creatures, all constantly bombarded by the god’s memes. While some embrace the chaos, others long for a world free from the tyranny of viral content.
Region: Doomerscape
Doomerscape is a vast, desolate region marked by its bleak, grayscale landscape and perpetual overcast skies. The climate is chilly and damp, with a constant drizzling rain that casts a gloomy pallor over the land. The most notorious geographical feature is the Sea of Sorrows, a massive, stagnant body of water that is said to be made from the tears of the Doomer god himself.
The inhabitants of Doomerscape are a melancholic bunch, known as the Doomered. They are a mix of humans, animals, and creatures that have been transformed by the pervasive Doomer energy that permeates the region. The Doomered are characterized by their pessimistic outlook on life, their love of black coffee, and their tendency to wax philosophical about the futility of existence. They live in small, scattered communities, preferring to keep to themselves and avoid the temptations of fleeting meme fame.
The architecture of Doomerscape is stark and minimalist, with buildings made of dark, rough-hewn stone and adorned with mournful sculptures of weeping figures. The most iconic structure is the Tower of Lament, a towering spire that houses the governing body of the region, the Council of Despair. This council is made up of the most world-weary and cynical of the Doomered, who rule with a laissez-faire approach, believing that all attempts at control are ultimately futile.
The economy of Doomerscape is based on the mining of rare, black crystals known as Sorrow Stones. These stones are highly sought after for their ability to absorb and store negative emotions, making them valuable to the Doomered for their emotional catharsis. The Sorrow Stones are traded with neighboring regions, who use them in various applications, from powering melancholic machinery to creating mood-altering elixirs.
Despite its dreary reputation, Doomerscape is not without its defenders. The Doomered are known for their fierce, if somewhat apathetic, fighting style, which involves a lot of sighing and eye-rolling as they battle. They are led by the Knights of the Woeful Countenance, a group of warriors who have mastered the art of combat while maintaining an air of resigned indifference.
The spiritual beliefs of the Doomered center around the worship of the Doomer god, a deity of despair and ennui. They believe that by embracing the futility of existence, they can achieve a state of enlightenment known as ‘Peak Doomer.’ This belief system is reflected in the region’s cultural aesthetics, which emphasize the beauty of sadness and the nobility of giving into one’s darker emotions. The Doomered have a complex social hierarchy based on one’s level of existential angst, with those who have achieved Peak Doomer status being the most revered.
Area: Mournville
Mournville is a small, gloomy town located in a shallow valley, surrounded by rolling hills of pale gray grass and withered trees. The landscape is dotted with spent matchsticks and cigarette butts, remnants of the town’s primary industry and pastime.
The soil in Mournville is rich in a rare mineral called Ashenite, which is used to fertilize the tobacco fields that dominate the countryside. The tobacco grown here is of a unique variety known as Melancholia, prized for its smooth, rich flavor and the way it seems to enhance the melancholic mood of the smoker.
The town is inhabited by a mix of humans and a peculiar species of crow that has evolved to thrive in the smoky environment. These crows, known as Sombriels, are revered by the townspeople for their mournful caws and their tendency to steal lit cigarettes from unsuspecting smokers.
Mournville is governed by a council of the town’s oldest and most resigned residents, who meet in the town’s central square to sigh heavily and bemoan the state of the world. They maintain a policy of strict isolationism, believing that the town’s unique atmosphere should be preserved from the corrupting influence of outsiders.
The town’s main cultural event is the annual Festival of Regrets, where the townspeople gather to share their deepest regrets and to smoke an extra-strong blend of Melancholia tobacco. The festival culminates in a procession to the nearby Ashen Hills, where the townspeople release a flock of Sombriels carrying lit cigarettes in their beaks, symbolizing the release of their regrets into the sky.
Location: Despondency Park
Despondency Park is a bleak expanse of withered grass and gnarled trees, cast in the perpetual gloom of a sunless sky. The park is dotted with stark yellow street lights that cast an eerie glow over the few remaining benches where the town’s most resigned citizens gather to smoke and bemoan the pointlessness of life.
The air is thick with the acrid smell of cigarette smoke and the mournful caws of the Sombriels, the peculiar species of crow that inhabit the town. These birds are drawn to the park by the abundance of discarded cigarette butts and the melancholic energy that permeates the area.
The park is a place of deep despair and hopelessness, where the only solace comes from the shared misery of others. It is not uncommon to see groups of citizens huddled together on the benches, their faces etched with the lines of a thousand regrets, as they take long drags from their cigarettes and stare out into the gloom.
Despite its gloomy atmosphere, Despondency Park is a popular spot for those seeking a moment of respite from the world. The park is home to a rare species of flower known as the Melancholy Bloom, which is said to thrive in the park’s unique atmosphere. The flowers are prized for their delicate beauty and the way they seem to absorb the sorrow of those who sit among them.
The park is also a popular spot for the town’s annual Festival of Regrets, where the townspeople gather to share their deepest regrets and to smoke an extra-strong blend of Melancholia tobacco. The festival culminates in a procession to the nearby Ashen Hills, where the townspeople release a flock of Sombriels carrying lit cigarettes in their beaks, symbolizing the release of their regrets into the sky.
Now that the creation of any kind of place, including the overarching Story Universe, has been programmed in, I’ll need to search for every piece of code that references worlds, then make sure to involve the associated Story Universe as well. That will take a while. But it will be very interesting to see how this new hierarchy influences the dialogues and actions performed in the app.
EDIT: the Deep Dive pair at Google NotebookLM had plenty of interesting things to say about this post. Good job sticking the landing, guys.
I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.
My player character, a detective from Providence’s police department, delved into the kind of ancient tome one shouldn’t even glance at.
The detective feared that Elizabeth may already be lost permanently.
If the missing girl’s whereabouts could be gleaned, I required the help of the one brilliant scholar I had spent most of this playthrough inconveniencing.
That’s all for today storywise.
A section of my app allows the user to generate plot blueprints, scenarios, dilemmas, and goals, to find inspiration. I’ve added the choice to generate plot twists. Apart from that, there was plenty of code to refactor (which is a programming term referring to the arduous task of reworking the code so that the fewest number of instructions in a section of the codebase get repeated, now and in the future, to fight against entropy). That will allow me to add new “concepts” like scenarios, dilemmas, etc. significantly faster in the future.
I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.
Early next morning, my player character, a world-weary detective, decided to bother some folks at the local university.
I wrote “we still don’t need how” instead of “we still don’t know how.” Just pointing that out because I hate making mistakes.
The detective goes back to report to the missing girl’s impatient father.
I pictured two weary men rummaging through bookcases of ancient, cursed books at the old library, while rain pelted the windows. Rain? There’s no weather in this app. Well, there is now.
Only areas have weather. Locations, which are inside areas, are aware of the weather in their containing area, but can’t be changed from there. All the prompts to the large language model that were aware of the time of the day are now also aware of the weather, and that includes dialogues. We’ll see how much the awareness of weather affects the scenes. I just hope the AI is intelligent enough to realize that it doesn’t rain inside a building.
Anyway, my player character, accompanied by an increasingly unstable father, headed to the old library.
There they met the apparently ancient librarian.
You may have noticed that the narration parts of the dialogue now actually sound like narration parts, instead of being spoken by the character. It took me a while to figure out how to do that, and it involved splitting the original text, generating voice lines for each part, and then concatenating them. But it sounds much better now.
I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.
The previous entry ended with my player character and his partner arresting Elara Thorn, the suspicious scholar.
Well, I’m stumped. The following conversation happened immediately after.
As I tried to figure out what to do, I kept the facts of the story in my head, but why would I need to do that? Am I not programming a page that could handle such stuff? So I programmed it in.
The user has to introduce those facts manually; I can’t think of any reliable way for the large language model to determine them instead. In any case, now that I keep a file of known facts, they are used when prompting the AI for concepts, interesting situations, interesting dilemmas, and goals.
Anyway, my player character and his partner have to inform the missing teenager’s father that the main culprit is going to walk free for now.
No choice but to release the charming miss Thorn from custody.
You must be logged in to post a comment.