You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现机器人对话转接到Skype for Business人工及跨租户注册?

可行性分析与实现方案

首先明确回答:这个需求完全可行,你之前看到的文档暗示的冲突,大概率是针对早期单租户场景的限制,只要结合正确的多租户配置和Skype for Business集成方案,就能同时实现对话转接和跨租户通信。

一、对话转接至Skype for Business人工客服的实现逻辑

当机器人无法识别或解决用户问题时,我们可以通过Skype for Business的UCWA(Unified Communications Web API)来实现转接,核心步骤如下:

  • 触发转接判定:机器人先通过意图识别(比如自定义关键词匹配、NLU模型判断)确定无法处理用户请求,触发转接流程。
  • 创建跨会话通信:调用UCWA的startConversation接口,直接创建用户与目标Skype个人/群组的对话,同时将用户的历史对话上下文(比如问题描述、交互记录)同步到新会话中,让客服能快速了解背景。
  • 双向消息同步:机器人需要监听Skype客服的回复消息,将其同步回用户与机器人的对话;同时用户后续的消息也会转发到Skype客服端,确保客服能直接在Skype中完成回复,无需切换工具。
  • 权限配置:机器人需要在Azure AD中申请SkypeForBusiness.Chat.Send和SkypeForBusiness.Chat.ReadWrite的应用权限,并且获得租户管理员的同意。

二、多租户注册与跨租户通信配置

要让机器人在客户的Skype for Business租户中注册,并实现与我方租户的通信,需要完成以下关键配置:

  • 多租户应用注册:在Azure AD中注册机器人应用时,选择**"Accounts in any organizational directory"**(支持任何组织目录中的账户),开启多租户支持。
  • 跨租户访问授权:客户租户的管理员需要对机器人应用进行授权,通过Azure AD的管理员同意流程,允许应用访问其Skype for Business资源。同时,我方租户也需要配置跨租户访问策略,允许来自客户租户的机器人应用访问我方的Skype用户/群组。
  • 身份令牌管理:机器人在不同租户中运行时,需要获取对应租户的身份令牌(比如通过OAuth 2.0的客户端凭证流程),确保跨租户调用API时的身份合法性。

三、关键实现资料与代码示例

核心API参考

  • UCWA API:这是Skype for Business的核心Web API,重点关注会话创建、消息转发、上下文同步的接口,比如/me/conversations(创建会话)、/conversations/{id}/messages(发送/接收消息)。
  • Microsoft Graph API(Skype for Business兼容):虽然微软现在主推Teams,但Graph API中部分/communications端点仍支持Skype for Business操作,比如创建聊天会话、转发消息等。

简化的转接逻辑伪代码

import requests
import time

def transfer_to_skype_support(user_id, user_context, customer_tenant_id):
    # 1. 获取客户租户的UCWA访问令牌
    ucwa_token = get_ucwa_auth_token(customer_tenant_id)
    # 2. 目标客服的Skype URI(我方租户账户)
    support_uri = "sip:support@our-tenant.com"
    # 3. 通过lyncdiscover自动获取UCWA端点
    discover_url = f"https://lyncdiscover.{customer_tenant_id.split('.')[0]}.com"
    discover_response = requests.get(discover_url)
    ucwa_base_url = discover_response.json()["_links"]["user"]["href"]
    # 4. 创建包含用户上下文的Skype会话
    create_convo_url = f"{ucwa_base_url}/me/conversations"
    payload = {
        "participants": [{"uri": support_uri}],
        "subject": f"用户求助: {user_context['user_question']}",
        "message": f"用户历史对话:\n{user_context['history']}"
    }
    response = requests.post(create_convo_url, json=payload, headers={"Authorization": f"Bearer {ucwa_token}"})
    conversation_id = response.json()["id"]
    # 5. 通知用户转接成功
    send_bot_message(user_id, "已为您转接人工客服,请等待回复...")
    # 6. 监听客服回复并同步给用户
    listen_skype_messages(conversation_id, user_id, ucwa_token, ucwa_base_url)

def listen_skype_messages(conversation_id, user_id, token, base_url):
    # 轮询监听Skype会话消息
    while True:
        messages_url = f"{base_url}/conversations/{conversation_id}/messages"
        response = requests.get(messages_url, headers={"Authorization": f"Bearer {token}"})
        new_messages = response.json().get("messages", [])
        for msg in new_messages:
            if "support@our-tenant.com" in msg["sender"]:
                send_bot_message(user_id, msg["text"])
        time.sleep(5)

注意事项

  • 不同Skype for Business环境(本地部署 vs 在线)的UCWA端点可能不同,通过lyncdiscover服务自动发现是最稳妥的方式。
  • 跨租户通信时,需要确保双方租户的Azure AD跨租户访问策略没有限制应用的双向访问。
  • 若遇到权限问题,检查应用权限是否为应用权限(而非委托权限),并确认管理员已完成同意流程。

内容的提问来源于stack exchange,提问作者James Hancock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:41:37