部署¶
策略只有在链上运行,才能创造价值。Almanak 将策略智能体部署到 Safe 多签钱包,并限定其权限范围,让智能体自主执行策略的同时,资金始终由你掌控。部署工作区涵盖智能体的完整生命周期:部署新的智能体、监控运行中的智能体,以及管理其状态。
部署是 Almanak 工作流的第三个阶段。在构建阶段准备好的策略,会在这里开始链上执行。
部署概览¶
仪表盘¶
部署仪表盘列出你的所有智能体及其当前状态。每一行显示:
- 名称:智能体的显示名称。
- 策略:智能体正在运行的策略。
- 链:目标区块链。
- 状态:当前执行状态。
- 24 小时盈亏:过去 24 小时的盈亏。
页面顶部汇总所有活跃部署的钱包总价值。
智能体状态¶
| 状态 | 含义 |
|---|---|
| 部署中 | 正在链上设置钱包和权限 |
| 初始化中 | 智能体正在启动并加载配置 |
| 运行中 | 智能体正在执行策略 |
| 已暂停 | 执行暂时中止,可以恢复 |
| 已停止 | 智能体已被手动停止 |
| 已终止 | 智能体已被永久关闭 |
| 已关闭 | 策略仓位已平仓并完成处理 |
| 已归档 | 智能体记录作为历史保留,但不再运行 |
智能体详情¶
点击智能体即可打开详情视图,其中包含多个标签页。
表现¶
表现标签页显示运行中智能体的实时指标:当前钱包价值、24 小时盈亏、部署以来的总回报、未平仓仓位和代币余额。图表展示价值随时间的变化。
日志¶
实时执行日志展示智能体在每个执行周期中的操作。你可以按日志级别筛选,也可以按关键词搜索。日志是排查智能体行为问题的主要工具。
交易¶
这里按时间顺序列出智能体通过 Safe 钱包执行的链上交易。每笔交易都附有对应链的区块浏览器链接,例如 Etherscan、Arbiscan、Basescan 等。
部署流程¶
操作步骤¶
部署新的智能体时,向导会引导你完成以下步骤:
- 从策略库中选择策略,可以选择策略产物或 GitHub 策略。
- 在目标链上选择或创建 Safe 钱包。
- 配置策略参数,例如入场阈值、风险限额和仓位规模。
- 授予 Zodiac 权限,限定智能体的链上访问范围。
- 检查完整配置。
- 点击部署,启动智能体。
钱包准备¶
平台帮助你部署和配置 Safe 钱包,以供智能体执行策略。在新的链上部署时,部署流程会准备以下步骤,并由你批准执行:
- 使用 CREATE2 计算预期的钱包地址。
- 在链上部署 Safe 合约。
- 配置钱包,将你设为所有者,并将智能体设为已授权模块。
每位用户在每条链上拥有一个 Safe 钱包。同一条链上的多个智能体共享该钱包,但各自拥有独立的权限范围。钱包所有权和批准权限始终由你保留。
Zodiac 权限¶
智能体不会获得钱包的全部访问权限。平台使用 Zodiac Roles,精确定义智能体可以调用哪些智能合约和函数。权限根据策略配置及其交互的协议生成。例如,部署用于管理 Aave 仓位的智能体只能调用与 Aave 相关的合约,不能调用任意地址。
为策略做好部署准备¶
如果你的策略是在本地通过 Almanak Code、你自己的 IDE 或其他工具构建的,请按照以下步骤进行准备,以便将其部署到 Almanak 托管环境。
仓库结构¶
你的策略必须存放在 GitHub 仓库中,并采用以下结构:
my-strategy/
├── pyproject.toml # Required: dependencies and run config
├── config.json # Required: strategy & funding configuration
├── strategy.py # Required: strategy entry point
└── dashboard/
└── ui.py # Optional: custom Streamlit dashboard
config.json¶
config.json 声明策略的目标链,以及策略开始运行前需要注入的代币。平台会在部署时读取该文件,展示注资要求、验证 Safe 钱包是否已正确注资,并引导你完成部署流程。
字段定义:
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
chain |
string | 是,或填写 chains |
单链策略的目标链,例如 "arbitrum"。 |
chains |
string[] | 是,或填写 chain |
多链策略的目标链。与 chain 同时设置时,以 chains 为准。 |
trade_size_usd |
number | 否 | 在部署界面中显示的单笔交易规模提示。 |
protocols |
string[] | 否 | 策略交互的协议,仅用于展示。 |
token_funding |
TokenFunding[] | 是 | 部署时策略所需的代币,详见下文。 |
支持的链标识符¶
请在 chain 和 chains 字段中使用以下标识符,拼写必须完全一致:
| 标识符 | 链 | Chain ID |
|---|---|---|
ethereum |
Ethereum | 1 |
optimism |
Optimism | 10 |
bnb |
BNB Smart Chain | 56 |
gnosis |
Gnosis | 100 |
polygon |
Polygon | 137 |
sonic |
Sonic | 146 |
worldchain |
World Chain | 480 |
mantle |
Mantle | 5000 |
base |
Base | 8453 |
arbitrum |
Arbitrum | 42161 |
avalanche |
Avalanche | 43114 |
ink |
Ink | 57073 |
linea |
Linea | 59144 |
berachain |
Berachain | 80094 |
scroll |
Scroll | 534352 |
ethereum-sepolia |
Ethereum Sepolia | 11155111 |
arbitrum-sepolia |
Arbitrum Sepolia | 421614 |
token_funding¶
这是一个结构化列表,用于明确声明策略首次执行前必须注入 Safe 钱包的代币。每个条目都是一个对象:
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
symbol |
string | 是 | 代币符号,例如 "WETH"。 |
address |
string | 是 | 以 0x 开头的 ERC-20 地址。 |
chain |
string | 否 | 默认为策略所使用的链。 |
amount |
string | 是 | 非负的十进制数字字符串。 |
amount_type |
"token" | "usd" | "percentage" |
是 | 指定如何解读 amount。 |
amount_type 决定 amount 的含义:
token:以代币本身的单位计量。"1.0"WETH 表示 1 ether。usd:以 USD 价值计量。"5000"表示注资时价值 $5,000 的该代币。percentage:由策略代码自身读取的运行时提示,例如“将现有余额的 50% 分配给该代币”。部署界面不会将percentage条目视为注资要求,也不会在部署时提示你为这些条目注资。凡是必须在策略首次执行前注入的资金,都应使用token或usd。
示例:
{
"chain": "arbitrum",
"trade_size_usd": 1000,
"protocols": ["uniswap_v3"],
"token_funding": [
{
"symbol": "WETH",
"address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"amount": "1.0",
"amount_type": "token"
},
{
"symbol": "USDC",
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"amount": "5000",
"amount_type": "usd"
}
]
}
必须填写 token_funding
缺少有效 token_funding 字段的策略无法部署。缺少任一必填字段,或 amount_type 不是 token、usd、percentage 之一的条目,会被直接忽略,不会另行提示。
pyproject.toml¶
SDK v3 仓库
本节规则适用于 SDK v2 策略。依赖解析结果为 almanak 3.x 的仓库会被识别为 SDK v3,其策略由 strategy.py 和 config.yaml 编写而成,详见 SDK 代际。
pyproject.toml 必须将 Almanak SDK 列为依赖,并包含 [tool.almanak.run] 配置节。以下是一个最小示例:
[project]
name = "my-strategy"
version = "0.1.0"
dependencies = ["almanak>=2.10.0"]
[tool.almanak.run]
interval = 60
[tool.almanak.run] 配置参考:
| 键 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
interval |
integer | 是 | 执行间隔,单位为秒,取值范围为 5 至 3600。 |
验证规则
[project.dependencies]中必须包含almanak,并指定版本约束,例如almanak>=2.10.0。interval必须是 5 到 3600 之间的整数。- 出于安全考虑,不允许在
[tool.uv.sources]中使用 Git 源。
SDK 版本解析¶
部署时使用的 Almanak SDK 版本,由策略仓库的依赖解析结果决定。
Almanak 会从仓库 pyproject.toml 的 [project.dependencies] 中读取 almanak 条目,以检测 SDK 版本。部署时,平台根据仓库的依赖文件构建策略环境;如果仓库中有锁文件,也会使用该文件。如果仓库允许的 SDK 版本范围较宽,界面显示的版本可能与部署时最终解析出的版本不同。
明确约束 SDK 版本
请在 pyproject.toml 中使用清晰的 SDK 版本约束,并在 SDK 升级后重新部署前,检查依赖变更。almanak>=2.4.0 这类较宽的约束可能允许安装包含 API 变更的较新 SDK 版本。
安全升级
升级 SDK 时,请先验证策略代码仍与目标版本提供的 API 匹配,再重新部署。
推送到 GitHub¶
- 在 GitHub 上创建仓库,可以是公开仓库或私有仓库。
- 推送策略代码。
- 确保默认分支的根目录包含有效的
pyproject.toml和strategy.py。
在 Almanak 中连接 GitHub¶
- 前往构建工作区中的策略库。
- 点击连接 GitHub,并授权 Almanak 访问你的仓库。
- 你的策略仓库将出现在策略库中。平台会自动验证仓库结构,并显示检测到的 SDK 版本。
部署¶
- 从策略库中选择你的 GitHub 策略。
- 选择要部署的分支、标签或提交。
- 按照下文的部署流程操作:选择钱包、配置参数、授予权限,然后部署。
平台会克隆你的代码,构建 Docker 镜像,并启动智能体。整个过程通常需要 30 至 90 秒。
GitHub 部署(V2)¶
概览¶
V2 部署流程直接连接 GitHub 仓库。选择已关联 GitHub 的策略,选择分支或标签,为智能体命名,选择钱包,然后部署。平台负责构建、验证和容器化。
活跃部署限制¶
同一策略在任何时刻只能有一个活跃部署。如果你尝试部署一个已有智能体在运行的策略,平台会阻止此次部署,并显示当前运行中的智能体。部署新版本前,请先停止或终止当前部署。