diff --git a/docs/2.x/Coding/Coding-Overview.html b/docs/2.x/Coding/Coding-Overview.html
index 7399ed938d..b39a27bfc4 100644
--- a/docs/2.x/Coding/Coding-Overview.html
+++ b/docs/2.x/Coding/Coding-Overview.html
@@ -170,6 +170,7 @@ make your game, also if you never coded before.
This adds an LLMClient that allows Evennia to send prompts to a LLM server (Large Language Model, along the lines of ChatGPT). Example uses a local OSS LLM install. Included is an NPC you can chat with using a new talk command. The NPC will respond using the AI responses from the LLM server. All calls are asynchronous, so if the LLM is slow, Evennia is not affected.
There are many LLM servers, but they can be pretty technical to install and set up. This contrib was tested with text-generation-webui which has a lot of features, and is also easy to install. Here are the install instructions in brief, see their home page for more details.
Unzip the files in a folder somewhere on your hard drive (you don’t have to put it next to your evennia stuff if you don’t want to).
+
In a terminal/console, cd into the folder and execute the source file in whatever way it’s done for your OS (like sourcestart_linux.sh for Linux, or .\start_windows for Windows). This is an installer that will fetch and install everything in a conda virtual environment. When asked, make sure to select your GPU (NVIDIA/AMD etc) if you have one, otherwise use CPU.
+
Once all is loaded, Ctrl-C (or Cmd-C) the server and open the file webui.py (it’s one of the top files in the archive you unzipped). Find a text string CMD_FLAGS='' and change this to CMD_FLAGS='--api'. Then save and close. This makes the server activate its api automatically.
+
Now just run that server starting script again. This is what you’ll use to start the LLM server henceforth.
+
Once the server is running, open your browser on http://127.0.0.1:7860 to see the running Text generation web ui running. If you turned on the API, you’ll find it’s now active on port 5000. This should not collide with default Evennia ports unless you changed something.
+
At this point you have the server and API, but it’s not actually running any Large-Language-Model (LLM) yet. In the web ui, go to the models tab and enter a github-style path in the DownloadcustommodelorLoRA field. To test so things work, enter facebook/opt-125m and download. This is a relatively small model (125 million parameters) so should be possible to run on most machines using only CPU. Update the models in the drop-down on the left and select it, then load it with the Transformers loader. It should load pretty quickly. If you want to load this every time, you can select the Autoloadthemodel checkbox; otherwise you’ll need to select and load the model every time you start the LLM server.
+
To experiment, you can find thousands of other open-source text-generation LLM models on huggingface.co/models. Be ware to not download a too huge model; your machine may not be able to load it! If you try large models, don’t set the Autoloadthemodel checkbox, in case the model crashes your server on startup.
+
+
For troubleshooting, you can look at the terminal output of the text-generation-webui server; it will show you the requests you do to it and also list any errors.
To be able to talk to NPCs, import and add the evennia.contrib.rpg.llm.llm_npc.CmdLLMTalk command to your Character cmdset in mygame/commands/default_commands.py (see the basic tutorials if you are unsure.
+
The default LLM api config should work with the text-generation-webui LLM server running its API on port 5000. You can also customize it via settings (if a setting is not added, the default below is used:
+
# path to the LLM server
+ LLM_HOST="http://127.0.0.1:5000"
+ LLM_PATH="/api/v1/generate"
+
+ # if you wanted to authenticated to some external service, you could
+ # add an Authenticate header here with a token
+ LLM_HEADERS={"Content-Type":"application/json"}
+
+ # this key will be inserted in the request, with your user-input
+ LLM_PROMPT_KEYNAME="prompt"
+
+ # defaults are set up for text-generation-webui. I have no idea what most of
+ # these do ^_^; you'll need to read a book on LLMs, or at least dive
+ # into a bunch of online tutorials.
+ LLM_REQUEST_BODY={
+ "max_new_tokens":250,# set how many tokens are part of a response
+ "preset":"None",
+ "do_sample":True,
+ "temperature":0.7,
+ "top_p":0.1,
+ "typical_p":1,
+ "epsilon_cutoff":0,# In units of 1e-4
+ "eta_cutoff":0,# In units of 1e-4
+ "tfs":1,
+ "top_a":0,
+ "repetition_penalty":1.18,
+ "repetition_penalty_range":0,
+ "top_k":40,
+ "min_length":0,
+ "no_repeat_ngram_size":0,
+ "num_beams":1,
+ "penalty_alpha":0,
+ "length_penalty":1,
+ "early_stopping":False,
+ "mirostat_mode":0,
+ "mirostat_tau":5,
+ "mirostat_eta":0.1,
+ "seed":-1,
+ "add_bos_token":True,
+ "truncation_length":2048,
+ "ban_eos_token":False,
+ "skip_special_tokens":True,
+ "stopping_strings":[],
+ }
+
+
+
Don’t forget to reload Evennia if you make any changes.
With the LLM server running and the new talk command added, create a new LLM-connected NPC and talk to it in-game.
+
> create/drop girl:evennia.contrib.rpg.llm.LLMNPC
+> talk girl Hello!
+girl ponders ...
+girl says, Hello! How are you?
+
+
+
The NPC will show a ‘thinking’ message if the server responds slower than 2 seconds (by default).
+
Most likely, your first response will not be this nice and short, but will be quite nonsensical, looking like an email. This is because the example model we loaded is not optimized for conversations. But at least you know it works!
As an example, I tested this on my very beefy work laptop. It has 32GB or RAM, but no gpu. so i ran the example (small 128m parameter) model on cpu. it takes about 3-4 seconds to generate a (frankly very bad) response. so keep that in mind.
+
On huggingface you can find listings of the ‘best performing’ language models right now. This changes all the time. The leading models require 100+ GB RAM. And while it’s possible to run on a CPU, ideally you should have a large graphics card (GPU) with a lot of VRAM too.
+
So most likely you’ll have to settle on something smaller. Experimenting with different models and also tweaking the prompt is needed.
+
Also be aware that many open-source models are intended for AI research and licensed for non-commercial use only. So be careful if you want to use this in a commercial game. No doubt there will be a lot of changes in this area over the coming years.
You could in principle use this to call out to an external API, like OpenAI (chat-GPT) or Google. Most such cloud-hosted services are commercial (costs money). But since they have the hardware to run bigger models (or their own, proprietary models), they may give better and faster results.
+
Calling an external API is not tested, so report any findings. Since the Evennia Server (not the Portal) is doing the calling, you are recommended to put a proxy between you and the internet if you call out like this.
This is a simple Character class, with a few extra properties:
+
response_template="{name} says: {response}"
+ thinking_timeout=2# how long to wait until showing thinking
+
+ # random 'thinking echoes' to return while we wait, if the AI is slow
+ thinking_messages=[
+ "{name} thinks about what you said ...",
+ "{name} ponders your words ...",
+ "{name} ponders ...",
+ ]
+
+
+
The character has a new method at_talked_to which does the connection to the LLM server and responds. This is called by the new talk command. Note that all these calls are asynchronous, meaning a slow response will not block Evennia.
+
+
This document page is generated from evennia/contrib/rpg/llm/README.md. Changes to this
+file will be overwritten, so edit that file rather than this one.
@@ -694,6 +696,12 @@ is merely the most obvious use for this, but the bar is highly customizable
and can be used for any sort of appropriate data besides player health.
This adds an LLMClient that allows Evennia to send prompts to a LLM server (Large Language Model, along the lines of ChatGPT). Example uses a local OSS LLM install. Included is an NPC you can chat with using a new talk command. The NPC will respond using the AI responses from the LLM server. All calls are asynchronous, so if the LLM is slow, Evennia is not affected.
Source code for evennia.contrib.rpg.llm.llm_client
+"""
+LLM (Large Language Model) client, for communicating with an LLM backend. This can be used
+for generating texts for AI npcs, or for fine-tuning the LLM on a given prompt.
+
+Note that running a LLM locally requires a lot of power, and ideally a powerful GPU. Testing
+this with CPU mode on a beefy laptop, still takes some 4s just on a very small model.
+
+The server defaults to output suitable for a local server
+https://github.com/oobabooga/text-generation-webui, but could be used for other LLM servers too.
+
+See the LLM instructions on that page for how to set up the server. You'll also need
+a model file - there are thousands to try out on https://huggingface.co/models (you want Text
+Generation models specifically).
+
+# Optional Evennia settings (if not given, these defaults are used)
+
+DEFAULT_LLM_HOST = "http://localhost:5000"
+DEFAULT_LLM_PATH = "/api/v1/generate"
+DEFAULT_LLM_HEADERS = {"Content-Type": "application/json"}
+DEFAULT_LLM_PROMPT_KEYNAME = "prompt"
+DEFAULT_LLM_REQUEST_BODY = {...} # see below, this controls how to prompt the LLM server.
+
+"""
+
+importjson
+
+fromdjango.confimportsettings
+fromevenniaimportlogger
+fromtwisted.internetimportdefer,protocol,reactor
+fromtwisted.internet.deferimportinlineCallbacks
+fromtwisted.web.clientimportAgent,HTTPConnectionPool,_HTTP11ClientFactory
+fromtwisted.web.http_headersimportHeaders
+fromtwisted.web.iwebimportIBodyProducer
+fromzope.interfaceimportimplementer
+
+DEFAULT_LLM_HOST="http://127.0.0.1:5000"
+DEFAULT_LLM_PATH="/api/v1/generate"
+DEFAULT_LLM_HEADERS={"Content-Type":"application/json"}
+DEFAULT_LLM_PROMPT_KEYNAME="prompt"
+DEFAULT_LLM_REQUEST_BODY={
+ "max_new_tokens":250,
+ # Generation params. If 'preset' is set to different than 'None', the values
+ # in presets/preset-name.yaml are used instead of the individual numbers.
+ "preset":"None",
+ "do_sample":True,
+ "temperature":0.7,
+ "top_p":0.1,
+ "typical_p":1,
+ "epsilon_cutoff":0,# In units of 1e-4
+ "eta_cutoff":0,# In units of 1e-4
+ "tfs":1,
+ "top_a":0,
+ "repetition_penalty":1.18,
+ "repetition_penalty_range":0,
+ "top_k":40,
+ "min_length":0,
+ "no_repeat_ngram_size":0,
+ "num_beams":1,
+ "penalty_alpha":0,
+ "length_penalty":1,
+ "early_stopping":False,
+ "mirostat_mode":0,
+ "mirostat_tau":5,
+ "mirostat_eta":0.1,
+ "seed":-1,
+ "add_bos_token":True,
+ "truncation_length":2048,
+ "ban_eos_token":False,
+ "skip_special_tokens":True,
+ "stopping_strings":[],
+}
+
+
+
[docs]@implementer(IBodyProducer)
+classStringProducer:
+"""
+ Used for feeding a request body to the HTTP client.
+ """
+
+
[docs]@inlineCallbacks
+ defget_response(self,prompt):
+"""
+ Get a response from the LLM server for the given npc.
+
+ Args:
+ prompt (str): The prompt to send to the LLM server.
+
+ Returns:
+ str: The generated text response. Will return an empty string
+ if there is an issue with the server, in which case the
+ the caller is expected to handle this gracefully.
+
+ """
+ status_code,response=yieldself._get_response_from_llm_server(prompt)
+ ifstatus_code==200:
+ returnjson.loads(response)["results"][0]["text"]
+ else:
+ logger.log_err(f"LLM API error (status {status_code}): {response}")
+ return""
+
+ def_get_response_from_llm_server(self,prompt):
+"""Call and wait for response from LLM server"""
+
+ agent=Agent(reactor,pool=self._conn_pool)
+
+ request_body=self.request_body.copy()
+ request_body[self.prompt_keyname]=prompt
+
+ d=agent.request(
+ b"POST",
+ bytes(self.hostname+self.pathname,"utf-8"),
+ headers=Headers(self.headers),
+ bodyProducer=StringProducer(json.dumps(request_body)),
+ )
+
+ d.addCallbacks(self._handle_llm_response_body,self._handle_llm_error)
+ returnd
+
+ def_handle_llm_response_body(self,response):
+"""Get the response body from the response"""
+ d=defer.Deferred()
+ response.deliverBody(SimpleResponseReceiver(response.code,d))
+ returnd
+
+ def_handle_llm_error(self,failure):
+ failure.trap(Exception)
+ return(500,failure.getErrorMessage())
+"""
+Basic class for NPC that makes use of an LLM (Large Language Model) to generate replies.
+
+It comes with a `talk` command; use `talk npc <something>` to talk to the NPC. The NPC will
+respond using the LLM response.
+
+Makes use of the LLMClient for communicating with the server. The NPC will also
+echo a 'thinking...' message if the LLM server takes too long to respond.
+
+
+"""
+
+fromrandomimportchoice
+
+fromevenniaimportCommand,DefaultCharacter
+fromevennia.utils.utilsimportmake_iter
+fromtwisted.internetimportreactor,task
+fromtwisted.internet.deferimportinlineCallbacks
+
+from.llm_clientimportLLMClient
+
+
+
[docs]classLLMNPC(DefaultCharacter):
+"""An NPC that uses the LLM server to generate its responses. If the server is slow, it will
+ echo a thinking message to the character while it waits for a response."""
+
+ response_template="{name} says: {response}"
+ thinking_timeout=2# seconds
+ thinking_messages=[
+ "{name} thinks about what you said ...",
+ "{name} ponders your words ...",
+ "{name} ponders ...",
+ ]
+
+ @property
+ defllm_client(self):
+ ifnothasattr(self,"_llm_client"):
+ self._llm_client=LLMClient()
+ returnself._llm_client
+
+
[docs]@inlineCallbacks
+ defat_talked_to(self,speech,character):
+"""Called when this NPC is talked to by a character."""
+
+ def_respond(response):
+"""Async handling of the server response"""
+
+ ifthinking_deferandnotthinking_defer.called:
+ # abort the thinking message if we were fast enough
+ thinking_defer.cancel()
+
+ character.msg(
+ self.response_template.format(
+ name=self.get_display_name(character),response=response
+ )
+ )
+
+ def_echo_thinking_message():
+"""Echo a random thinking message to the character"""
+ thinking_messages=make_iter(self.db.thinking_messagesorself.thinking_messages)
+ character.msg(choice(thinking_messages).format(name=self.get_display_name(character)))
+
+ # if response takes too long, note that the NPC is thinking.
+ thinking_defer=task.deferLater(reactor,self.thinking_timeout,_echo_thinking_message)
+
+ # get the response from the LLM server
+ yieldself.llm_client.get_response(speech).addCallback(_respond)
+
+
+
[docs]classCmdLLMTalk(Command):
+"""
+ Talk to an NPC
+
+ Usage:
+ talk npc <something>
+ talk npc with spaces in name = <something>
+
+ """
+
+ key="talk"
+
+
[docs]classEvenniaGameIndexClient:""" This client class is used for gathering and sending game details to the Evennia Game Index. Since EGI is in the early goings, this isn't
@@ -119,8 +118,8 @@
[docs]def__init__(self,on_bad_request=None):"""
- :param on_bad_request: Optional callable to trigger when a bad request
- was sent. This is almost always going to be due to bad config.
+ on_bad_request (callable, optional): Callable to trigger when a bad request was sent.
+
"""self.report_host=_EGI_HOSTself.report_path=_EGI_REPORT_PATH
@@ -236,7 +235,7 @@
[docs]@implementer(IBodyProducer)
-classStringProducer(object):
+classStringProducer:""" Used for feeding a request body to the tx HTTP client. """
diff --git a/docs/2.x/_modules/evennia/server/game_index_client/service.html b/docs/2.x/_modules/evennia/server/game_index_client/service.html
index 4dd1fccb47..dc4f789096 100644
--- a/docs/2.x/_modules/evennia/server/game_index_client/service.html
+++ b/docs/2.x/_modules/evennia/server/game_index_client/service.html
@@ -140,7 +140,7 @@
Stop the service so we're not wasting resources. """logger.log_infomsg(
- "Shutting down Evennia Game Index client service due to ""invalid configuration."
+ "Shutting down Evennia Game Index client service due to invalid configuration.")self.stopService()
diff --git a/docs/2.x/_sources/Coding/Changelog.md.txt b/docs/2.x/_sources/Coding/Changelog.md.txt
index 709cf196aa..b1c176ba06 100644
--- a/docs/2.x/_sources/Coding/Changelog.md.txt
+++ b/docs/2.x/_sources/Coding/Changelog.md.txt
@@ -1,5 +1,10 @@
# Changelog
+## Evennia main branch
+
+- Contrib: Large-language-model (LLM) AI integration; allows NPCs to talk using
+ responses from a neural network server.
+
## Evennia 2.1.0
July 14, 2023
diff --git a/docs/2.x/_sources/Contribs/Contrib-Llm.md.txt b/docs/2.x/_sources/Contribs/Contrib-Llm.md.txt
new file mode 100644
index 0000000000..3dedd401eb
--- /dev/null
+++ b/docs/2.x/_sources/Contribs/Contrib-Llm.md.txt
@@ -0,0 +1,133 @@
+# Large Language Model ("Chat-bot AI") integration
+
+Contribution by Griatch 2023
+
+This adds an LLMClient that allows Evennia to send prompts to a LLM server (Large Language Model, along the lines of ChatGPT). Example uses a local OSS LLM install. Included is an NPC you can chat with using a new `talk` command. The NPC will respond using the AI responses from the LLM server. All calls are asynchronous, so if the LLM is slow, Evennia is not affected.
+
+## Installation
+
+You need two components for this contrib - Evennia, and an LLM webserver that operates and provides an API to an LLM AI model.
+
+### LLM Server
+
+There are many LLM servers, but they can be pretty technical to install and set up. This contrib was tested with [text-generation-webui](https://github.com/oobabooga/text-generation-webui) which has a lot of features, and is also easy to install. Here are the install instructions in brief, see their home page for more details.
+
+1. [Go to the Installation section](https://github.com/oobabooga/text-generation-webui#installation) and grab the 'one-click installer' for your OS.
+2. Unzip the files in a folder somewhere on your hard drive (you don't have to put it next to your evennia stuff if you don't want to).
+3. In a terminal/console, `cd` into the folder and execute the source file in whatever way it's done for your OS (like `source start_linux.sh` for Linux, or `.\start_windows` for Windows). This is an installer that will fetch and install everything in a conda virtual environment. When asked, make sure to select your GPU (NVIDIA/AMD etc) if you have one, otherwise use CPU.
+4. Once all is loaded, Ctrl-C (or Cmd-C) the server and open the file `webui.py` (it's one of the top files in the archive you unzipped). Find a text string `CMD_FLAGS = ''` and change this to `CMD_FLAGS = '--api'`. Then save and close. This makes the server activate its api automatically.
+4. Now just run that server starting script again. This is what you'll use to start the LLM server henceforth.
+5. Once the server is running, open your browser on http://127.0.0.1:7860 to see the running Text generation web ui running. If you turned on the API, you'll find it's now active on port 5000. This should not collide with default Evennia ports unless you changed something.
+6. At this point you have the server and API, but it's not actually running any Large-Language-Model (LLM) yet. In the web ui, go to the `models` tab and enter a github-style path in the `Download custom model or LoRA` field. To test so things work, enter `facebook/opt-125m` and download. This is a relatively small model (125 million parameters) so should be possible to run on most machines using only CPU. Update the models in the drop-down on the left and select it, then load it with the `Transformers` loader. It should load pretty quickly. If you want to load this every time, you can select the `Autoload the model` checkbox; otherwise you'll need to select and load the model every time you start the LLM server.
+7. To experiment, you can find thousands of other open-source text-generation LLM models on [huggingface.co/models](https://huggingface.co/models?pipeline_tag=text-generation&sort=trending). Be ware to not download a too huge model; your machine may not be able to load it! If you try large models, _don't_ set the `Autoload the model` checkbox, in case the model crashes your server on startup.
+
+For troubleshooting, you can look at the terminal output of the `text-generation-webui` server; it will show you the requests you do to it and also list any errors.
+
+### Evennia config
+
+To be able to talk to NPCs, import and add the `evennia.contrib.rpg.llm.llm_npc.CmdLLMTalk` command to your Character cmdset in `mygame/commands/default_commands.py` (see the basic tutorials if you are unsure.
+
+The default LLM api config should work with the text-generation-webui LLM server running its API on port 5000. You can also customize it via settings (if a setting is not added, the default below is used:
+
+```python
+ # path to the LLM server
+ LLM_HOST = "http://127.0.0.1:5000"
+ LLM_PATH = "/api/v1/generate"
+
+ # if you wanted to authenticated to some external service, you could
+ # add an Authenticate header here with a token
+ LLM_HEADERS = {"Content-Type": "application/json"}
+
+ # this key will be inserted in the request, with your user-input
+ LLM_PROMPT_KEYNAME = "prompt"
+
+ # defaults are set up for text-generation-webui. I have no idea what most of
+ # these do ^_^; you'll need to read a book on LLMs, or at least dive
+ # into a bunch of online tutorials.
+ LLM_REQUEST_BODY = {
+ "max_new_tokens": 250, # set how many tokens are part of a response
+ "preset": "None",
+ "do_sample": True,
+ "temperature": 0.7,
+ "top_p": 0.1,
+ "typical_p": 1,
+ "epsilon_cutoff": 0, # In units of 1e-4
+ "eta_cutoff": 0, # In units of 1e-4
+ "tfs": 1,
+ "top_a": 0,
+ "repetition_penalty": 1.18,
+ "repetition_penalty_range": 0,
+ "top_k": 40,
+ "min_length": 0,
+ "no_repeat_ngram_size": 0,
+ "num_beams": 1,
+ "penalty_alpha": 0,
+ "length_penalty": 1,
+ "early_stopping": False,
+ "mirostat_mode": 0,
+ "mirostat_tau": 5,
+ "mirostat_eta": 0.1,
+ "seed": -1,
+ "add_bos_token": True,
+ "truncation_length": 2048,
+ "ban_eos_token": False,
+ "skip_special_tokens": True,
+ "stopping_strings": [],
+ }
+```
+Don't forget to reload Evennia if you make any changes.
+
+
+## Usage
+
+With the LLM server running and the new `talk` command added, create a new LLM-connected NPC and talk to it in-game.
+
+ > create/drop girl:evennia.contrib.rpg.llm.LLMNPC
+ > talk girl Hello!
+ girl ponders ...
+ girl says, Hello! How are you?
+
+The NPC will show a 'thinking' message if the server responds slower than 2 seconds (by default).
+
+Most likely, your first response will *not* be this nice and short, but will be quite nonsensical, looking like an email. This is because the example model we loaded is not optimized for conversations. But at least you know it works!
+
+## A note on running LLMs locally
+
+Running an LLM locally can be _very_ demanding.
+
+As an example, I tested this on my very beefy work laptop. It has 32GB or RAM, but no gpu. so i ran the example (small 128m parameter) model on cpu. it takes about 3-4 seconds to generate a (frankly very bad) response. so keep that in mind.
+
+On huggingface you can find listings of the 'best performing' language models right now. This changes all the time. The leading models require 100+ GB RAM. And while it's possible to run on a CPU, ideally you should have a large graphics card (GPU) with a lot of VRAM too.
+
+So most likely you'll have to settle on something smaller. Experimenting with different models and also tweaking the prompt is needed.
+
+Also be aware that many open-source models are intended for AI research and licensed for non-commercial use only. So be careful if you want to use this in a commercial game. No doubt there will be a lot of changes in this area over the coming years.
+
+### Why not use an AI cloud service?
+
+You could in principle use this to call out to an external API, like OpenAI (chat-GPT) or Google. Most such cloud-hosted services are commercial (costs money). But since they have the hardware to run bigger models (or their own, proprietary models), they may give better and faster results.
+
+Calling an external API is not tested, so report any findings. Since the Evennia Server (not the Portal) is doing the calling, you are recommended to put a proxy between you and the internet if you call out like this.
+
+## The LLMNPC class
+
+This is a simple Character class, with a few extra properties:
+
+```python
+ response_template = "{name} says: {response}"
+ thinking_timeout = 2 # how long to wait until showing thinking
+
+ # random 'thinking echoes' to return while we wait, if the AI is slow
+ thinking_messages = [
+ "{name} thinks about what you said ...",
+ "{name} ponders your words ...",
+ "{name} ponders ...",
+ ]
+```
+
+The character has a new method `at_talked_to` which does the connection to the LLM server and responds. This is called by the new `talk` command. Note that all these calls are asynchronous, meaning a slow response will not block Evennia.
+
+----
+
+This document page is generated from `evennia/contrib/rpg/llm/README.md`. Changes to this
+file will be overwritten, so edit that file rather than this one.
diff --git a/docs/2.x/_sources/Contribs/Contribs-Overview.md.txt b/docs/2.x/_sources/Contribs/Contribs-Overview.md.txt
index b51058abb6..e405417de5 100644
--- a/docs/2.x/_sources/Contribs/Contribs-Overview.md.txt
+++ b/docs/2.x/_sources/Contribs/Contribs-Overview.md.txt
@@ -7,7 +7,7 @@ in the [Community Contribs & Snippets][forum] forum.
_Contribs_ are optional code snippets and systems contributed by
the Evennia community. They vary in size and complexity and
may be more specific about game types and styles than 'core' Evennia.
-This page is auto-generated and summarizes all **48** contribs currently included
+This page is auto-generated and summarizes all **49** contribs currently included
with the Evennia distribution.
All contrib categories are imported from `evennia.contrib`, such as
@@ -34,11 +34,11 @@ If you want to add a contrib, see [the contrib guidelines](./Contribs-Guidelines
| [components](#components) | [containers](#containers) | [cooldowns](#cooldowns) | [crafting](#crafting) | [custom_gametime](#custom_gametime) |
| [dice](#dice) | [email_login](#email_login) | [evadventure](#evadventure) | [evscaperoom](#evscaperoom) | [extended_room](#extended_room) |
| [fieldfill](#fieldfill) | [gendersub](#gendersub) | [git_integration](#git_integration) | [godotwebsocket](#godotwebsocket) | [health_bar](#health_bar) |
-| [ingame_map_display](#ingame_map_display) | [ingame_python](#ingame_python) | [mail](#mail) | [mapbuilder](#mapbuilder) | [menu_login](#menu_login) |
-| [mirror](#mirror) | [multidescer](#multidescer) | [mux_comms_cmds](#mux_comms_cmds) | [name_generator](#name_generator) | [puzzles](#puzzles) |
-| [random_string_generator](#random_string_generator) | [red_button](#red_button) | [rpsystem](#rpsystem) | [simpledoor](#simpledoor) | [slow_exit](#slow_exit) |
-| [talking_npc](#talking_npc) | [traits](#traits) | [tree_select](#tree_select) | [turnbattle](#turnbattle) | [tutorial_world](#tutorial_world) |
-| [unixcommand](#unixcommand) | [wilderness](#wilderness) | [xyzgrid](#xyzgrid) |
+| [ingame_map_display](#ingame_map_display) | [ingame_python](#ingame_python) | [llm](#llm) | [mail](#mail) | [mapbuilder](#mapbuilder) |
+| [menu_login](#menu_login) | [mirror](#mirror) | [multidescer](#multidescer) | [mux_comms_cmds](#mux_comms_cmds) | [name_generator](#name_generator) |
+| [puzzles](#puzzles) | [random_string_generator](#random_string_generator) | [red_button](#red_button) | [rpsystem](#rpsystem) | [simpledoor](#simpledoor) |
+| [slow_exit](#slow_exit) | [talking_npc](#talking_npc) | [traits](#traits) | [tree_select](#tree_select) | [turnbattle](#turnbattle) |
+| [tutorial_world](#tutorial_world) | [unixcommand](#unixcommand) | [wilderness](#wilderness) | [xyzgrid](#xyzgrid) |
@@ -552,6 +552,7 @@ Contrib-Buffs.md
Contrib-Character-Creator.md
Contrib-Dice.md
Contrib-Health-Bar.md
+Contrib-Llm.md
Contrib-RPSystem.md
Contrib-Traits.md
```
@@ -604,6 +605,16 @@ and can be used for any sort of appropriate data besides player health.
+### `llm`
+
+_Contribution by Griatch 2023_
+
+This adds an LLMClient that allows Evennia to send prompts to a LLM server (Large Language Model, along the lines of ChatGPT). Example uses a local OSS LLM install. Included is an NPC you can chat with using a new `talk` command. The NPC will respond using the AI responses from the LLM server. All calls are asynchronous, so if the LLM is slow, Evennia is not affected.
+
+[Read the documentation](./Contrib-Llm.md) - [Browse the Code](evennia.contrib.rpg.llm)
+
+
+
### `rpsystem`
_Contribution by Griatch, 2015_
diff --git a/docs/2.x/_sources/api/evennia.contrib.rpg.llm.llm_client.md.txt b/docs/2.x/_sources/api/evennia.contrib.rpg.llm.llm_client.md.txt
new file mode 100644
index 0000000000..a94e462ec8
--- /dev/null
+++ b/docs/2.x/_sources/api/evennia.contrib.rpg.llm.llm_client.md.txt
@@ -0,0 +1,10 @@
+```{eval-rst}
+evennia.contrib.rpg.llm.llm\_client
+==========================================
+
+.. automodule:: evennia.contrib.rpg.llm.llm_client
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+```
\ No newline at end of file
diff --git a/docs/2.x/_sources/api/evennia.contrib.rpg.llm.llm_npc.md.txt b/docs/2.x/_sources/api/evennia.contrib.rpg.llm.llm_npc.md.txt
new file mode 100644
index 0000000000..49f444412e
--- /dev/null
+++ b/docs/2.x/_sources/api/evennia.contrib.rpg.llm.llm_npc.md.txt
@@ -0,0 +1,10 @@
+```{eval-rst}
+evennia.contrib.rpg.llm.llm\_npc
+=======================================
+
+.. automodule:: evennia.contrib.rpg.llm.llm_npc
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+```
\ No newline at end of file
diff --git a/docs/2.x/_sources/api/evennia.contrib.rpg.llm.md.txt b/docs/2.x/_sources/api/evennia.contrib.rpg.llm.md.txt
new file mode 100644
index 0000000000..40684a1332
--- /dev/null
+++ b/docs/2.x/_sources/api/evennia.contrib.rpg.llm.md.txt
@@ -0,0 +1,19 @@
+```{eval-rst}
+evennia.contrib.rpg.llm
+===============================
+
+.. automodule:: evennia.contrib.rpg.llm
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+
+
+.. toctree::
+ :maxdepth: 6
+
+ evennia.contrib.rpg.llm.llm_client
+ evennia.contrib.rpg.llm.llm_npc
+ evennia.contrib.rpg.llm.tests
+
+```
\ No newline at end of file
diff --git a/docs/2.x/_sources/api/evennia.contrib.rpg.llm.tests.md.txt b/docs/2.x/_sources/api/evennia.contrib.rpg.llm.tests.md.txt
new file mode 100644
index 0000000000..bd94a2b1b4
--- /dev/null
+++ b/docs/2.x/_sources/api/evennia.contrib.rpg.llm.tests.md.txt
@@ -0,0 +1,10 @@
+```{eval-rst}
+evennia.contrib.rpg.llm.tests
+====================================
+
+.. automodule:: evennia.contrib.rpg.llm.tests
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+```
\ No newline at end of file
diff --git a/docs/2.x/_sources/api/evennia.contrib.rpg.md.txt b/docs/2.x/_sources/api/evennia.contrib.rpg.md.txt
index 36cee3f150..7f9a622be2 100644
--- a/docs/2.x/_sources/api/evennia.contrib.rpg.md.txt
+++ b/docs/2.x/_sources/api/evennia.contrib.rpg.md.txt
@@ -15,6 +15,7 @@ evennia.contrib.rpg
evennia.contrib.rpg.character_creator
evennia.contrib.rpg.dice
evennia.contrib.rpg.health_bar
+ evennia.contrib.rpg.llm
evennia.contrib.rpg.rpsystem
evennia.contrib.rpg.traits
diff --git a/docs/2.x/api/evennia-api.html b/docs/2.x/api/evennia-api.html
index 4d0748c578..7f43e72a8b 100644
--- a/docs/2.x/api/evennia-api.html
+++ b/docs/2.x/api/evennia-api.html
@@ -401,6 +401,15 @@
diff --git a/docs/2.x/api/evennia.commands.default.account.html b/docs/2.x/api/evennia.commands.default.account.html
index af4cefee04..cc34d4484b 100644
--- a/docs/2.x/api/evennia.commands.default.account.html
+++ b/docs/2.x/api/evennia.commands.default.account.html
@@ -141,7 +141,7 @@ method. Otherwise all text will be returned to all connected sessions.
-search_index_entry = {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' remit pemit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
+search_index_entry = {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' pemit remit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
diff --git a/docs/2.x/api/evennia.commands.default.batchprocess.html b/docs/2.x/api/evennia.commands.default.batchprocess.html
index a5c8291f19..8f0552b75e 100644
--- a/docs/2.x/api/evennia.commands.default.batchprocess.html
+++ b/docs/2.x/api/evennia.commands.default.batchprocess.html
@@ -146,7 +146,7 @@ skipping, reloading etc.
-search_index_entry = {'aliases': 'batchcmd batchcommand', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcmd batchcommand', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶
+search_index_entry = {'aliases': 'batchcommand batchcmd', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcommand batchcmd', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶
diff --git a/docs/2.x/api/evennia.commands.default.building.html b/docs/2.x/api/evennia.commands.default.building.html
index 193cba9f6b..602410c5a2 100644
--- a/docs/2.x/api/evennia.commands.default.building.html
+++ b/docs/2.x/api/evennia.commands.default.building.html
@@ -1353,7 +1353,7 @@ server settings.
-search_index_entry = {'aliases': '@update @swap @parent @typeclasses @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update swap parent typeclasses type', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
+search_index_entry = {'aliases': '@typeclasses @parent @update @type @swap', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses parent update type swap', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
diff --git a/docs/2.x/api/evennia.commands.default.comms.html b/docs/2.x/api/evennia.commands.default.comms.html
index bc71ab84a5..5de183adbf 100644
--- a/docs/2.x/api/evennia.commands.default.comms.html
+++ b/docs/2.x/api/evennia.commands.default.comms.html
@@ -264,7 +264,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
@@ -942,7 +942,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -962,7 +962,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
-search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
@@ -276,7 +276,7 @@ for everyone to use, you need build privileges and the alias command.
@@ -308,7 +308,7 @@ for everyone to use, you need build privileges and the alias command.
-search_index_entry = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'no_prefix': ' nickname nicks', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶
+search_index_entry = {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'no_prefix': ' nicks nickname', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶
@@ -606,7 +606,7 @@ placing it in their inventory.
@@ -637,7 +637,7 @@ placing it in their inventory.
-search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
@@ -717,7 +717,7 @@ automatically begin with your name.
-search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
+search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
diff --git a/docs/2.x/api/evennia.commands.default.system.html b/docs/2.x/api/evennia.commands.default.system.html
index 4f4b66b558..dc97c889a1 100644
--- a/docs/2.x/api/evennia.commands.default.system.html
+++ b/docs/2.x/api/evennia.commands.default.system.html
@@ -691,7 +691,7 @@ See |luhttps://ww
@@ -737,7 +737,7 @@ to all the variables defined therein.
-search_index_entry = {'aliases': '@delays @task', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks delays task', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
+search_index_entry = {'aliases': '@task @delays', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks task delays', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
diff --git a/docs/2.x/api/evennia.commands.default.tests.html b/docs/2.x/api/evennia.commands.default.tests.html
index ba1e7b85d6..6a3e589928 100644
--- a/docs/2.x/api/evennia.commands.default.tests.html
+++ b/docs/2.x/api/evennia.commands.default.tests.html
@@ -963,7 +963,7 @@ main test suite started with
Test the batch processor.
-red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpc8m02qsa/e3120d3be991a85cb5ac5d5d820ec0278dcb565a/evennia/contrib/tutorials/red_button/red_button.py'>¶
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmphljmiw22/53cadb797d6d30e623e5175fcacaca6b90a4e1e6/evennia/contrib/tutorials/red_button/red_button.py'>¶
@@ -165,7 +165,7 @@ there is no object yet before the account has logged in)
-search_index_entry = {'aliases': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co conn', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
+search_index_entry = {'aliases': 'co con conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' co con conn', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
-search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'no_prefix': ' cre cr', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
+search_index_entry = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'no_prefix': ' cr cre', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
@@ -349,7 +349,7 @@ for simplicity. It shows a pane of info.
@@ -375,7 +375,7 @@ for simplicity. It shows a pane of info.
-search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
+search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html b/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
index 1ebdc0d0c7..333b817b61 100644
--- a/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
+++ b/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
@@ -147,7 +147,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
@@ -177,7 +177,7 @@ there is no object yet before the account has logged in)
-search_index_entry = {'aliases': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co conn', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
+search_index_entry = {'aliases': 'co con conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' co con conn', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
@@ -199,7 +199,7 @@ there is no object yet before the account has logged in)
@@ -369,7 +369,7 @@ for simplicity. It shows a pane of info.
-search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
+search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
index 39cafafb25..42ebd9cc55 100644
--- a/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -219,7 +219,7 @@ the operation will be general or on the room.
-search_index_entry = {'aliases': 'abort chicken out quit q', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort chicken out quit q', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
+search_index_entry = {'aliases': 'q chicken out abort quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q chicken out abort quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
-search_index_entry = {'aliases': 'l ls', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
+search_index_entry = {'aliases': 'ls l', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
-search_index_entry = {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
+search_index_entry = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
@@ -498,7 +498,7 @@ looks and what actions is available.
-search_index_entry = {'aliases': 'examine e ex unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine e ex unfocus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
+search_index_entry = {'aliases': 'examine unfocus e ex', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine unfocus e ex', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
-search_index_entry = {'aliases': 'inventory give i inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory give i inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
+search_index_entry = {'aliases': 'give i inventory inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give i inventory inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.barter.barter.html b/docs/2.x/api/evennia.contrib.game_systems.barter.barter.html
index ebcc660be2..6b461fdbfa 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.barter.barter.html
@@ -753,7 +753,7 @@ try to influence the other part in the deal.
@@ -779,7 +779,7 @@ try to influence the other part in the deal.
-search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
+search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index eadd9e7ce4..740aeb1135 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -680,7 +680,7 @@ if there are still any actions you can take.
@@ -706,7 +706,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index 8386735c09..7ecb81b00c 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -575,7 +575,7 @@ if there are still any actions you can take.
@@ -595,7 +595,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index 5cdde30129..a9cb8ec2ad 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -698,7 +698,7 @@ if there are still any actions you can take.
@@ -718,7 +718,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 65ef8b98b2..40f957d777 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -477,7 +477,7 @@ if there are still any actions you can take.
@@ -497,7 +497,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index 464c87420b..3fb13400d7 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -937,7 +937,7 @@ if there are still any actions you can take.
@@ -957,7 +957,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
-search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html b/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
index f92fe04007..652a2fef7e 100644
--- a/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
+++ b/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
@@ -430,7 +430,7 @@ there is no room above/below you, your movement will fail.
@@ -453,7 +453,7 @@ to all the variables defined therein.
-search_index_entry = {'aliases': 'dive fly', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' dive fly', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}¶
+search_index_entry = {'aliases': 'fly dive', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' fly dive', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.html b/docs/2.x/api/evennia.contrib.html
index 0ba2460df8..b6aaea8905 100644
--- a/docs/2.x/api/evennia.contrib.html
+++ b/docs/2.x/api/evennia.contrib.html
@@ -372,6 +372,15 @@ useful but are deemed too game-specific to go into the core library.
diff --git a/docs/2.x/api/evennia.contrib.rpg.dice.dice.html b/docs/2.x/api/evennia.contrib.rpg.dice.dice.html
index f83eaba61b..5008628379 100644
--- a/docs/2.x/api/evennia.contrib.rpg.dice.dice.html
+++ b/docs/2.x/api/evennia.contrib.rpg.dice.dice.html
@@ -334,7 +334,7 @@ everyone but the person rolling.
@@ -360,7 +360,7 @@ everyone but the person rolling.
-search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
+search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
LLM (Large Language Model) client, for communicating with an LLM backend. This can be used
+for generating texts for AI npcs, or for fine-tuning the LLM on a given prompt.
+
Note that running a LLM locally requires a lot of power, and ideally a powerful GPU. Testing
+this with CPU mode on a beefy laptop, still takes some 4s just on a very small model.
See the LLM instructions on that page for how to set up the server. You’ll also need
+a model file - there are thousands to try out on https://huggingface.co/models (you want Text
+Generation models specifically).
+
+
Optional Evennia settings (if not given, these defaults are used)¶
+
DEFAULT_LLM_HOST = “http://localhost:5000”
+DEFAULT_LLM_PATH = “/api/v1/generate”
+DEFAULT_LLM_HEADERS = {“Content-Type”: “application/json”}
+DEFAULT_LLM_PROMPT_KEYNAME = “prompt”
+DEFAULT_LLM_REQUEST_BODY = {…} # see below, this controls how to prompt the LLM server.
Use this method to translate to a higher-level message. Usually, some
+callback will be made upon the receipt of each complete protocol
+message.
+
+
@param data: a string of indeterminate length. Please keep in mind
that you will probably need to buffer some data, as partial
+(or multiple) protocol messages may be received! I recommend
+that unit tests for protocols call through to this method with
+differing chunk sizes, down to one byte at a time.
+
+
+
+
+
+
+connectionLost(reason=<twisted.python.failure.Failure twisted.internet.error.ConnectionDone: Connection was closed cleanly.>)[source]¶
+
Called when the connection is shut down.
+
Clear any circular references here, and any external references
+to this Protocol. The connection has been closed.
Basic class for NPC that makes use of an LLM (Large Language Model) to generate replies.
+
It comes with a talk command; use talk npc <something> to talk to the NPC. The NPC will
+respond using the LLM response.
+
Makes use of the LLMClient for communicating with the server. The NPC will also
+echo a ‘thinking…’ message if the LLM server takes too long to respond.
An NPC that uses the LLM server to generate its responses. If the server is slow, it will
+echo a thinking message to the character while it waits for a response.
Once the cmdhandler has identified this as the command we
+want, this function is run. If many of your commands have a
+similar syntax (for example ‘cmd arg1 = arg2’) you should
+simply define this once and just let other commands of the
+same form inherit from this. See the docstring of this module
+for which object properties are available to use (notably
+self.args).
This is the actual executing part of the command. It is
+called directly after self.parse(). See the docstring of this
+module for which object properties are available (beyond those
+set in self.parse())
-search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
-search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
-search_index_entry = {'aliases': 'unwield unwear', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwield unwear', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
+search_index_entry = {'aliases': 'unwear unwield', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwear unwield', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
index b3f64e710c..afcea63e79 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -161,7 +161,7 @@ such as when closing the lid and un-blinding a character.
-search_index_entry = {'aliases': 'feel get examine l ex listen', 'category': 'general', 'key': 'look', 'no_prefix': ' feel get examine l ex listen', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶
+search_index_entry = {'aliases': 'get examine listen l feel ex', 'category': 'general', 'key': 'look', 'no_prefix': ' get examine listen l feel ex', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
index c8d7f0e476..4bffa917bf 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -564,7 +564,7 @@ shift green root up/down
@@ -813,7 +813,7 @@ parry - forgoes your attack but will make you harder to hit on next
-search_index_entry = {'aliases': 'parry stab fight hit pierce defend thrust chop bash kill slash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' parry stab fight hit pierce defend thrust chop bash kill slash', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
+search_index_entry = {'aliases': 'parry kill hit pierce slash stab fight chop defend bash thrust', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' parry kill hit pierce slash stab fight chop defend bash thrust', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index 7a45814279..2796d127f2 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -256,7 +256,7 @@ code except for adding in the details.
@@ -271,7 +271,7 @@ code except for adding in the details.
-search_index_entry = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
+search_index_entry = {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
@@ -1004,7 +1004,7 @@ random chance of eventually finding a light source.
-search_index_entry = {'aliases': 'feel feel around fiddle search l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel feel around fiddle search l', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
+search_index_entry = {'aliases': 'fiddle feel around l feel search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' fiddle feel around l feel search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
diff --git a/docs/2.x/api/evennia.html b/docs/2.x/api/evennia.html
index a2d43a8234..c22831b670 100644
--- a/docs/2.x/api/evennia.html
+++ b/docs/2.x/api/evennia.html
@@ -511,6 +511,15 @@ with ‘q’, remove the break line and restart server when finished.
diff --git a/docs/2.x/api/evennia.server.game_index_client.client.html b/docs/2.x/api/evennia.server.game_index_client.client.html
index 5b4bd3819e..2d5bf49c65 100644
--- a/docs/2.x/api/evennia.server.game_index_client.client.html
+++ b/docs/2.x/api/evennia.server.game_index_client.client.html
@@ -121,12 +121,7 @@ incredibly configurable as far as to what is being sent.
-search_index_entry = {'aliases': 'no n __nomatch_command a y yes abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' no n __nomatch_command a y yes abort', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
+search_index_entry = {'aliases': 'y n abort no yes a __nomatch_command', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' y n abort no yes a __nomatch_command', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/2.x/api/evennia.utils.evmore.html b/docs/2.x/api/evennia.utils.evmore.html
index 112c60be44..28fa9ed251 100644
--- a/docs/2.x/api/evennia.utils.evmore.html
+++ b/docs/2.x/api/evennia.utils.evmore.html
@@ -145,7 +145,7 @@ the caller.msg() construct every time the page is updated.
@@ -171,7 +171,7 @@ the caller.msg() construct every time the page is updated.
-search_index_entry = {'aliases': 'previous next quit top n abort t a end q e p', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' previous next quit top n abort t a end q e p', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 'next abort n p top quit a previous t q e end', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' next abort n p top quit a previous t q e end', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶