aardio 文档

web.rest.aiDecision

web.rest.aiDecision 是纯 aardio 的 AI 结构化决策客户端,目前实现 OpenRouter 的 POST /api/alpha/decisions 协议。

定位与安装位置

快速开始

import web.rest.aiDecision;

var client = web.rest.aiDecision({
    // 省略 key 时读取环境变量 AI_DECISION_API_KEY。
    // 也可以指定 key = "你的 OpenRouter API Key",不要分发真实密钥。
    model = "inception/mercury-decide";
});

if(!#client.config.key){
    print("请先设置环境变量 AI_DECISION_API_KEY,或在客户端配置中填写自己的 key。");
    return;
}

var questions = {
    department = ["choice", "这条工单应由哪个团队处理?", {
        ["财务"] = "付款、发票和退款问题";
        ["技术"] = "软件故障、服务中断和系统集成问题";
        ["销售"] = "价格咨询、套餐升级和购买意向";
        ["其他"] = "不属于以上类别或信息不足";
    }];
    urgent = ["noul", "这条工单是否需要立即处理?"];
    severity = ["score", "当前问题对业务造成的影响有多严重?", [
        "轻微影响,主要功能正常",
        "部分功能受影响,业务仍可继续",
        "核心业务完全中断,无法继续工作"
    ]];
};

var result,err,errCode = client.evaluate({
    state = {
        message = "生产系统从今天早上起完全无法登录,所有员工都无法开展工作,请立即修复!";
    };
    questions = questions;
});

if(!result){
    print("请求失败:",err,errCode);
    return;
}

print("实际模型:",result.model);
print("负责团队:",result.answers.department.choice);
print("需要立即处理的概率:",result.answers.urgent.noul);
print("业务影响评分(0~2):",result.answers.severity.score);
print("输入、输出用量:",result.usage.input_tokens,result.usage.output_tokens);

后面的代码片段沿用这里的 client。协议字段、类型名与程序标识符保留原样,待判断内容、问题说明、选项和输出提示均使用中文。

问题声明

questions 是按问题 ID 命名的表,每项可使用以下两种数据形式,并允许混用:

例如,同一请求中可以混用:

var questions = {
    urgent = ["noul", "这条工单是否需要立即处理?"];
    department = {
        type = "choice";
        instructions = "这条工单应由哪个团队处理?";
        criteria = {
            ["财务"] = "付款、发票和退款问题";
            ["技术"] = "软件故障、服务中断和系统集成问题";
            ["销售"] = "价格咨询、套餐升级和购买意向";
            ["其他"] = "不属于以上类别或信息不足";
        };
    };
    outage = {type="noul";instructions="当前核心业务是否完全中断?";criteria={
        ["true"] = "无法继续开展核心业务";
        ["false"] = "核心业务仍然可以继续";
    }};
};

声明只是数据,不会请求模型。 evaluate(包括其别名)调用 buildPayload 时,才将问题的纯数组 [] 转换为接口要求的对象。不要把数组简写直接传给底层 post。

仅转换 questions 的直接成员;不转换 state 中的数组、choice 选项说明或 score 等级数组。不修改调用者的声明,原生问题对象中的扩展字段会保留。数组简写必须有 2~3 项且前两项为字符串,否则 buildPayload / evaluate 返回 null,err,不会发送请求;其他协议约束由服务端检查。

noul.criteria 可省略;指定时使用字符串键 "true" 与 "false",不要改为中文键或布尔键。它们的说明可以是中文。需要结构化 instructions 或服务支持的扩展字段时,使用原生问题对象;数组简写仍要求前两项为字符串。

两种调用方式

(state, questions[, model])

var result = client.evaluate(
    "同一订单扣了两次款,请退回重复扣款。",
    {
        refund = ["noul", "客户是否要求退回款项?"];
        team = ["choice", "这条工单应由哪个团队处理?", {
            ["财务"] = "付款和退款问题";
            ["客服"] = "一般使用咨询或其他问题";
        }];
    }
);

完整请求表

var result = client.evaluate({
    state = "这笔付款是正常消费,不需要退款,只想补开发票。";
    model = "inception/mercury-decide";
    questions = {
        refund = {type="noul";instructions="客户是否要求退回款项?"};
    };
    session_id = "中文工单演示";
});

完整请求表保留 state、显式指定的 model 和其他扩展字段;省略 model 时补充客户端默认值。questions 同样支持原生对象和数组简写,发送前统一为对象形式。

配置

var client = web.rest.aiDecision({
    // key = "你的 OpenRouter API Key";
    url = "https://openrouter.ai/api/alpha/decisions";
    model = "inception/mercury-decide";
    extraHeaders = {
        ["HTTP-Referer"] = "https://example.com";
    };
});

答案读取

客户端不把决策答案转换成文本,也不按厂商重新包装,返回值保持 OpenRouter 原始结构:

也可以使用:

var answer = client.answer(result,"department");
var probability = client.noulValue(result,"urgent");

读取答案时,缺失问题或类型不符应进入错误处理/人工复核,不要当作“否”或安全放行。特别注意 aardio 中 0 是假值,判断数值是否缺失应使用 ===null,不要使用 if(!probability)。

协议兼容与模型切换

参考

Markdown 格式