2

我正在开发一个新的机器人并尝试实现人工切换。我正在使用 Directline 3.0 在 BotFramework-WebChat 客户端和我的机器人之间进行通信,该机器人托管在 Azure 机器人服务上。

我的问题是当我的机器人尝试将消息从用户发送到代理或代理到用户时,我从 Directline API 收到 401 错误。

为了进一步解释这个问题,我们只需要讨论Watching状态。在代码中,客户消息通过中间件被截获。如果状态被确定为Watching,客户消息将被路由到机器人和观察代理。

从 bot 到用户的消息发送session.send('foo')正常,但从 bot 到代理的消息发送如下:

address = conversation.agent;

// the commented codes makes the whole thing work...
// address.useAuth = true;

agentMessage = new builder.Message()
    .address(address)
    .text(message.text);

bot.send(agentMessage, (err) => {
    console.log(err);
});

useAuth除非我添加一个标志,否则它不起作用。我在 ChatConnector.js 实现中找到了这个标志,它似乎决定(正如您猜想的那样)消息在发送时是否使用授权请求。你可以在我上面的代码中看到我可以自己设置这个标志,但这是一个 hacky 解决方案,它似乎绕过了真正的应用程序逻辑。

这整个事情感觉不对,我觉得我错过了一些东西,但我无法弄清楚如何在不useAuth直接设置的情况下使这些请求工作。

这是我的移交客户端的一些相关代码。我从下面删除了一些代码,以便仅在对话处于等待状态时关注来自客户的消息。

/* this middleware is used by the bot */
public routingMiddleware(bot: builder.UniversalBot) {
    return {
        //intercepts messages from user to bot
        botbuilder: (session: builder.Session, next: Function) => {
            // Pass incoming messages to routing method
            if (session.message.type === 'message') {
                this.routeMessage(session, bot, next);
            } else {
                // allow messages of non 'message' type through
                next();
            }
        }
    }
}

private routeMessage(session: builder.Session, bot: builder.UniversalBot, next: Function) {
    this.routeCustomerMessage(session, bot, next);
}

private async routeCustomerMessage(session: builder.Session, bot:builder.UniversalBot, next: Function) {
    const message = session.message;
    let agentMessage: builder.Message;
    let address: any;

    // method will either return existing conversation or a newly created conversation if this is first time we've heard from customer
    const conversation = await this.getConversation({ customerConversationId: message.address.conversation.id }, session);

    // log the user's message to persistent storage
    await this.addToTranscript({ customerConversationId: conversation.customer.conversation.id }, message, session);

    switch (conversation.state) {
        case ConversationState.Watch:
            address = conversation.agent;

            // the commented codes makes the whole thing work...
            // address.useAuth = true;

            agentMessage = new builder.Message()
                .address(address)
                .text(message.text);

            bot.send(agentMessage, (err) => {
                console.log(err);
            });
            return next();
    }
}
4

0 回答 0