I’m very glad I found this thread!
This is very close to what I’ve been working on for the past ten months, actually.
My engine is called TALYXR_, and I have a working demo (not publicly released) that I think is doing really well with both input interpretation and freeform NPC conversations.
I’ve just posted an introduction to TALYXR_ here, with some basic details about how it works.
The story, world, characters, locations, objects, actions, puzzles, etc. have all been pre-authored, including the responses to supported game actions.
Early on, I found that letting a language model handle the output of something “simple” like LOOK AROUND wasn’t giving me what I needed. It’s either too detailed, too minimal or focused on the wrong things. Parser games require a very specific type of feedback. Current models just aren’t reliable. So I just wrote those myself. It’s better, more fun and creatively satisfying too.
Generated text is used for freeform NPC dialogue, since I can’t pre-author every possible conversation, and for responding to attempts the game doesn’t support.
The basic flow is:
- The regular (deterministic) parser handles commands it recognises.
- Otherwise, a language model interprets the input and translates it into a command the parser can process.
- If the intended action is supported, the engine handles it according to the game’s rules, using authored responses.
- If the action isn’t supported, a generated response acknowledges the attempt and explains why it doesn’t work, without changing the world state.
Obviously, I am massively oversimplifying the principle, because it’s not that easy. Getting it to work consistently is considerably less simple.
Player Freedom
Player freedom is one of the hardest pieces of the puzzle. Even once you can distinguish supported actions from unsupported ones, you still have the main design question: where do you draw the line?
Take a library, which is an actual location in my game. You might have dozens of bookshelves, each holding dozens of books. A language model could generate incidental book titles only when the player examines a particular shelf. That would introduce another use for generated content, beyond dialogue and failed attempts. But it also opens up a whole set of questions.
It would be weird if the player could not take out any of those books. So, you allow it. And if the player can hold a book, they’ll probably want to read it. Do you then provide actual passages, or just a brief description?
Is the player able to rip out a page? Is that page then a seperate object? Is the player able to rip out 50 pages? Can I burn a them? Can I stand on a chair? Can I put the chair on the table and stand on the chair that is on the table? Can I stack chairs? How many?
I’m pretty sure you get the gist of it.
So, I’m trying to support as many reasonable actions as I can, although I have to draw the line somewhere before this becomes a physics simulator. 
NPC interactions
Conversations are really cool and can sometimes feel real.
To get there, I’ve written extensive biographies and character descriptions, including what each NPC knows. The aim is to let you talk freely while keeping their responses consistent with those characters.
Keeping them from inventing facts is definitely one of the hardest parts. Language models really love to talk and come up with juicy details that you never asked for, which makes for a very lively interaction, but with a high risk of saying something that isn’t true within the story.
But language models are also notoriously bad at following many rules at once. The more rules you give it, the worse it’s going to perform. A big part of my approach is limiting the information the model receives to what the character should actually know, rather than giving it the whole story and asking it to keep secrets. That still leaves the problem of invented details, especially when players ask things I haven’t anticipated.
I still need to figure this out properly. In my current demo, I don’t have NPCs in the present. There are only flashbacks, which obviously are memories. If the player says or does something that is really weird or obviously not what happened, the flashback just distorts and rewinds to the last output by the NPC.
Apart from that, the NPCs have a “story backbone” which they follow. You can ask questions that are not relevant but are in character. The NPCs will respond to this question, but then they will pull the conversation back to the story backbone that I intended.
In flashbacks, that works really well. In the present, however, you cannot rewind. So if the player acts completely out of character, the NPC actually needs to deal with that.
I haven’t worked this out properly yet. My inclination is to let those actions have consequences, even if they take the player away from the intended path. If you scare away an important NPC, for example, that might close off part of the story. Could you repair the relationship? Find another way forward? Or would it lead to an earlier ending?
I want those consequences to make sense within the story. How much of that I can support, and which alternative outcomes I would need to author, is still something I need to work out.
The unreleased demo
Anyway, the demo needs more work before public testing, but I can already show examples from it. Is there a particular interaction or conversation you’d like to see?
Also I’d be interested to hear what would make this approach convincing to people/you.