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.
Here’s the next episode of the eldritch show. Last time, the sadistic alien Zha’thik prepared an unfathomable feast in a non-euclidean hall. Our jaded detective decided to take the first bite, only to realize that the morphing mass had turned into the corpse of Emilia, his long-lost teenage love. Now he’s bound to face his personal horror.
Well, that was poignant. I shed tears while “playing” through it, I shed tears while editing it. That’s good.
At the final part of that scene, I needed a fight “beat,” but I didn’t have anything programmed that would provide such a thing specifically. In addition, this fight would take part in the middle of a conversation. What to do, then? Create a new Confrontation action like the Investigate, Research, and Gather Supplies ones, which are meant to be isolated, and then stitch together two dialogues? It didn’t feel right. Besides, in that case, I would need to write the summary of the full conversation to include the physical confrontation with the eldritch horror. So instead, I came up with the notion of a Confrontation Round: the account, taking about ten seconds, of a confrontation of whatever kind, given the provided context. The prompt is focused on that very subject with no distractions, as seen below:
You are to generate a detailed narrative describing a brief segment (approximately ten seconds) of a confrontation within a rich, immersive world. Use the provided information about the player, the other characters, and the place involved. Your narrative should be engaging, realistic, and reflect the abilities and circumstances of the participants suggested by the user-provided context.
Instructions: 1. Viability and Realism Assessment: Carefully consider the feasibility and dynamics of the confrontation based on: - The information about the characters, including their skills, abilities, health, equipment, and emotional state. - The characteristics of the opponents, including their skills, abilities, equipment, motivations, and weaknesses. - The characteristics of the location, including terrain, obstacles, and any environmental factors. - The time of day and how it might affect the confrontation (e.g., visibility, shadows, crowd presence). - The context for the confrontation provided by the user, including any prior events leading up to this moment. - Potential advantages or disadvantages, such as surprise, preparation, or environmental hazards.
2. Narrative of the Confrontation: - Write a vivid, dynamic narrative that depicts approximately ten seconds of the confrontation, focusing on the immediate actions and reactions of the characters involved. - Include specific actions taken by the characters on either side of the confrontation. - Describe the use of skills, abilities, equipment, tactics, and any maneuvers. - Illustrate the interactions between the characters, including attacks, defenses, dodges, or spells. - Convey the emotions, thoughts, and physical sensations experienced by the characters. - Ensure the depiction is consistent with the world's lore, the characters' personal histories, and their abilities. - Determine the immediate results of this segment of the confrontation based on your assessment. - Be specific about any successes or failures of actions taken, including hits landed, misses, blocks, or counterattacks. - Describe any injuries sustained, advantages gained, positions changed, or other consequences. - Reflect any costs incurred, such as stamina lost, equipment damage, or exposure to danger. - The confrontation doesn't need to end in this segment, unless you can clearly determine that the confrontation should conclude now.
3. Tone and Style: - Write in the third person, present tense, maintaining an engaging and immersive narrative style. - Use rich, descriptive language to bring the scene to life, focusing on action and immediacy. - Ensure consistency with the established world setting and the characters' personalities.
Example Format: "With a fierce battle cry, [Player Name] charges forward, swinging their sword toward [Opponent Name]..."
Your Task: Using the above instructions and information, craft a compelling narrative that captures this intense moment of confrontation, reflecting both the actions and immediate consequences, while advancing the story in a meaningful way. Important: do not repeat verbatim previous confrontation rounds: there should always be a progress in the confrontation.
If the segment at the end of the previous audio was anything to go by, it worked perfectly. To be honest, I was dreading creating a Confrontation action, because I thought it would be the Next Big Part of the app, but turns out that at this point of the AI revolution, LLMs are intelligent enough to “get it.”
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.
The last part ended with our team of heroes begrudgingly agreeing to partake in the trials of a shadowy, shady alien from the dimension they had ventured into.
For this part, I decided to implement a Grow Event button in the chat interface. Basically, the user writes the guideline for what they would like to happen at that point of the dialogue. Then, a dedicated prompt sent to a large language model will cause the AI to expand the suggested event into a literary form. There are two or three examples of that in the audio you may have listened to. Great for when you don’t want to bother behaving as both the narrator and the player character.
I’ve already played through most of the scene that will be featured in the next part. Man, it was emotionally taxing.
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!
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.
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.
You must be logged in to post a comment.