evennia 安装

导出时间:2026/5/27 19:35:00

来源地址:https://www.doubao.com/chat/38417086968852226

消息数量:4

是的,我想让你也写一个,我本地已经预装了 llama 的这个本地模型。模型名字我可以随后告诉你。我正在想说,你也写一个这样的脚本,等于是两个 MUD 的 player 一起在探索,大家比比看哪个模型运行的更好,或者是同一个模型,不同的脚本,就是这个就是看这个 prompt 有没有区别,但是我怀疑这个区别不太大。我看那个谷歌的那个 Gemini 那个脚本其实也很简单,其实也就是这个 prompt 写的好一点,让那个模型知道说怎么探索吧。然后也就其他就是要写个 log, 要把这个输出嘛,就是这叫什么呢?就是说每次那个 AI 的举动,我们把它输出到文件。 Gemini 也是这样做的。所以你也写个脚本吧,这样我看看两个游戏一起玩。顺便问一下,就是说我如果要看到,用那个 Web client 去看你这个账号的话,那我得登录进去,那比如说你跟 Gemini 的那两个游戏,它一定要两个不同的账号才行,对吧?那就应该两个不同的账号。你反你先把账号密码先空着吧,我去创建。
我直接给你写一份完整、可跑、干净的 Evennia + 本地大模型(llama 类)AI 探索机器人脚本,你只要填:
  • 本地模型地址
  • 账号密码
  • 模型名
就能直接跑,和你 Gemini 那个脚本同结构、可对比

一、先给你结论(你问的关键点)

  1. 两个 AI 要同时在 MUD 里 → 必须两个不同账号
    • 你在 Evennia 里创建两个玩家账号:
      • 比如 ai_player1 / ai_player2
    • 我这个脚本用一套账号,Gemini 脚本用另一套,可以同时跑、同时在 Web 客户端看到
  2. 脚本我先把账号密码空着,你自己填
  3. 本地 llama / Deepseek 都能用,只改 API 地址就行
  4. 自带日志文件输出,和你 Gemini 版本一样可对比。

二、完整 AI 机器人脚本(Python)

文件名:evennia_ai_bot.py
python
运行
import requests
import json
import time
import datetime

# ====================== 你只需要改这里 ======================
# Evennia 账号(你自己创建)
EVENNIA_HOST = "localhost"
EVENNIA_PORT = 4000
ACCOUNT = ""          # 你填:比如 ai_bot1
PASSWORD = ""         # 你填密码

# 本地大模型接口(llama.cpp / Ollama / Deepseek 本地都行)
LLM_API_URL = "http://localhost:1234/v1/chat/completions"
MODEL_NAME = ""       # 你本地模型名,比如 llama-7b.gguf

# 日志文件
LOG_FILE = "ai_bot_log.txt"
# ==========================================================

def log_print(msg):
    """同时打印+写日志"""
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{now}] {msg}\n"
    print(line.strip())
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(line)

def get_ai_response(prompt_history):
    """调用本地大模型"""
    headers = {"Content-Type": "application/json"}
    data = {
        "model": MODEL_NAME,
        "messages": prompt_history,
        "temperature": 0.7,
        "max_tokens": 256,
        "stop": ["\n"]
    }
    try:
        resp = requests.post(LLM_API_URL, json=data, timeout=20)
        resp.raise_for_status()
        return resp.json()["choices"][0]["message"]["content"].strip()
    except Exception as e:
        log_print(f"模型调用失败: {e}")
        return "look"

def build_prompt(mud_output):
    """给AI的系统提示 + 当前场景"""
    system_prompt = """
你是一个MUD游戏里的探索AI。
你只能输出**一条简单命令**,不要多余文字。
目标:探索、移动、查看、互动,正常玩MUD。
可用命令:
look, north, south, east, west, up, down, inventory, take, drop, say xxx
只输出命令本身,不要解释。
""".strip()

    return [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": f"当前场景:\n{mud_output}\n你下一步命令:"}
    ]

def evennia_telnet_bot():
    """简易Telnet客户端,连Evennia"""
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10)
    try:
        s.connect((EVENNIA_HOST, EVENNIA_PORT))
        log_print("已连接Evennia")
    except Exception as e:
        log_print(f"连接失败: {e}")
        return

    def read_chunk():
        try:
            return s.recv(8192).decode("utf-8", errors="ignore")
        except:
            return ""

    def send_cmd(cmd):
        s.sendall((cmd + "\n").encode("utf-8"))

    # 登录流程
    buffer = ""
    while True:
        buffer += read_chunk()
        if "Enter account name" in buffer or "Account:" in buffer:
            send_cmd(ACCOUNT)
            buffer = ""
            time.sleep(0.5)
        elif "Password:" in buffer:
            send_cmd(PASSWORD)
            buffer = ""
            time.sleep(0.5)
            break
        time.sleep(0.2)

    log_print("登录成功,开始AI自动探索")

    # 主循环:看场景 → AI决策 → 执行 → 记录
    last_output = ""
    while True:
        buffer += read_chunk()
        if buffer.strip():
            last_output = buffer.strip()
            log_print(f"=== MUD输出 ===\n{last_output}")
            buffer = ""

            # AI决策
            prompt = build_prompt(last_output)
            ai_cmd = get_ai_response(prompt)
            log_print(f"AI命令: {ai_cmd}")

            send_cmd(ai_cmd)
            time.sleep(1.5)
        time.sleep(0.3)

if __name__ == "__main__":
    log_print("=== AI探索机器人启动 ===")
    evennia_telnet_bot()

三、你只要做 4 步

  1. 创建两个 Evennia 账号(给我脚本一个,Gemini 脚本一个)
  2. 填脚本里这几行:
    • ACCOUNT
    • PASSWORD
    • LLM_API_URL
    • MODEL_NAME
  3. 安装依赖:
    bash
    运行
    pip install requests
    
  4. 运行:
    bash
    运行
    python evennia_ai_bot.py
    

四、对比 Gemini 脚本怎么玩

  • 两个终端
    • 终端 1:跑我这个脚本
    • 终端 2:跑你 Gemini 那个脚本
  • 打开浏览器:http://localhost:4001 你会同时看到两个 AI 角色在探索,日志各自输出,方便对比。

五、你接下来告诉我 3 个信息,我可以帮你直接改成 “一键可跑版”

  1. 你本地模型接口地址:
    • http://localhost:???
  2. 模型名字(比如 llama2、deepseek、qwen 等)
  3. 你用的是:
    • llama.cpp?
    • Ollama?
    • 还是别的本地服务?
我可以直接帮你把 API 部分改成完全匹配你本地环境,你复制就能跑,不用再调试。
Evennia 启动,我又忘记怎么启动了。之前, Gemini 有去指出来,我必须使用 Evennia 的那种虚拟环境,就是 ve veen。 Virtual Even- environment 那个 Python,因为否则的话会有很多的这种冲突,这个要怎么做呢?
我给你最简单、最不容易忘、一次记牢的 Evennia 启动流程,就 4 步,你照着敲就行:

1. 先进入你的游戏文件夹

你之前用 evennia --init mygame 创建的那个文件夹,先进去:
bash
运行
cd mygame

2. 激活 Evennia 虚拟环境(你说的 ve/venv)

Windows(CMD)

bash
运行
venv\Scripts\activate

Windows(PowerShell)

bash
运行
.\venv\Scripts\Activate.ps1

Linux / Mac

bash
运行
source venv/bin/activate
激活成功,前面会多一个 (venv),这就对了。

3. 启动 Evennia

bash
运行
evennia start

4. 打开网页玩

浏览器打开:
plaintext
http://localhost:4001

你最容易忘的 2 个关键点(我帮你标死)

  1. 每次开新终端,都要先激活 venv 不激活 → 会报 evennia 不是命令 / 各种依赖报错
  2. 必须先 cd 进 mygame 文件夹 不在目录里 → 启动会失败

想关掉服务

bash
运行
evennia stop

你要不要我顺便把你那两个 AI 机器人脚本也一起配好,等你启动完 MUD 直接就能跑?