💻 本地开发指南
本指南涵盖在开发环境中设置和使用 Eliza 的步骤。
先决条件
在开始之前,请确保您已具备:
# 必需
Node.js 23+
pnpm
Git
# 可选但推荐
VS Code
Docker(用于数据库开发)
CUDA Toolkit(用于 GPU 加速)
初始设置
1. 仓库设置
# 克隆仓库
git clone https://github.com/elizaos/eliza.git
cd eliza
# 安装依赖
pnpm install
# 安装可选依赖
pnpm install --include=optional sharp
2. 环境配置
创建您的开发环境文件:
cp .env.example .env
配置基本的开发变量:
# 本地开发的最低要求
OPENAI_API_KEY=sk-* # 可选,用于 OpenAI 功能
X_SERVER_URL= # 本地推理时留空
XAI_API_KEY= # 本地推理时留空
XAI_MODEL=meta-llama/Llama-3.1-7b-instruct # 本地模型
3. 本地模型设置
用于无 API 依赖的本地推理:
# 为 NVIDIA GPU 安装 CUDA 支持
npx --no node-llama-cpp source download --gpu cuda
# 系统将在首次运行时自动从 Hugging Face 下载模型
开发工作流程
运行开发服务器
# 使用默认角色启动
pnpm run dev
# 使用特定角色启动
pnpm run dev --characters="characters/my-character.json"
# 使用多个角色启动
pnpm run dev --characters="characters/char1.json,characters/char2.json"
开发命令
pnpm run build # 构建项目
pnpm run clean # 清理构建产物
pnpm run dev # 启动开发服务器
pnpm run test # 运行测试
pnpm run test:watch # 监视模式下运行测试
pnpm run lint # 代码检查
直接客户端聊天界面
# 打开终端并使用特定角色启动
pnpm run dev --characters="characters/my-character.json"
# 打开第二个终端并启动客户端
pnpm start:client
查找消息:
➜ Local: http://localhost:5173/
点击该链接或在浏览器窗口中打开该位置。完成后,您应该会看到聊天界面与系统连接,并可以开始与您的角色互动。
数据库开发
SQLite(推荐用于开发)
import { SqliteDatabaseAdapter } from "@elizaos/core/adapters";
import Database from "better-sqlite3";
const db = new SqliteDatabaseAdapter(new Database("./dev.db"));
内 存数据库(用于测试)
import { SqlJsDatabaseAdapter } from "@elizaos/core/adapters";
const db = new SqlJsDatabaseAdapter(new Database(":memory:"));
模式管理
# 创建新迁移
pnpm run migration:create
# 运行迁移
pnpm run migration:up
# 回滚迁移
pnpm run migration:down
测试
运行测试
# 运行所有测试
pnpm test
# 运行特定测试文件
pnpm test tests/specific.test.ts
# 运行带覆盖率的测试
pnpm test:coverage
# 运行特定数据库的测试
pnpm test:sqlite
pnpm test:sqljs
编写测试
import { runAiTest } from "@elizaos/core/test_resources";
describe("Feature Test", () => {
beforeEach(async () => {
// 设置测试环境
});
it("should perform expected behavior", async () => {
const result = await runAiTest({
messages: [
{
user: "user1",
content: { text: "test message" },
},
],
expected: "expected response",
});
expect(result.success).toBe(true);
});
});