为什么固定动作列表合适
角色的下一步是有界决策:攻击、喝药、逃跑、谈判、嘲讽。它不生成文本,所以游戏循环拿到的就是一个可以 switch 的字符串。
写成 if-else 意味着每个状态变量都要有人猜一个阈值。每个动作都有概率,可以让你看到这次选择有多果断——这对动画、难度调优,以及发现角色“犹豫”的状态都有用。
问题形状
tsimport { choice } from '@system-one-ai/core';
export const actionQuestion = {
next: choice('What should this character do next?', {
attack: 'Close distance and attack the nearest enemy',
potion: 'Drink a healing potion before acting',
flee: 'Retreat toward the nearest exit',
truce: 'Attempt to negotiate a pause',
taunt: 'Provoke the enemies to draw them out',
}),
};
把角色真实拥有的状态发过去:血量、敌人数量与最近距离、背包、地形,以及附近是否有同伴。
示意代码,未经过实际运行测试。阈值只是占位。
tsexport async function nextAction(client, state: {
healthPct: number; enemies: number; nearestEnemyM: number;
potions: number; allyNearby: boolean; terrain: string;
}) {
const result = await client.evaluate({ state, questions: actionQuestion });
const pick = result.answers.next.choice;
const confidence = result.answers.next.confidence;
// 占位:模型不确定时交给脚本化行为
return confidence >= 0.5 ? pick : 'hold_position';
}
哪些必须留在代码里
- 动作列表本身。 选项是游戏设计,不是模型输出。
- 硬约束。 冷却、沉默时不能喝药,以及规则引擎已经保证的东西,应该在调用之前就短路掉。
- 兜底行为。 置信度低时,脚本化行为通常比掷硬币更好。
延迟与费用
本站示例展示的是示例数据,不是实时运行;如果要每帧调用,请先在自己的游戏里测延迟。典型的用法是一个回合一次决策,而不是一帧一次。
每 4KB 算一块,不足 4KB 也按一块。费用 = 块数 × 问题数 × 模型单价。一段角色状态通常一块就够。
新账号注册即送 100 积分,积分不会过期。详见 定价。
在线试用角色示例(需登录),用示例数据看同一组问题。