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

Node.js中sendConversationHistory部署报BadSyntax问题求助

Why does sendConversationHistory() work in Bot Emulator v4 but throw "bad activities" error after deployment?

Let’s break down why you’re seeing this discrepancy between local testing and production deployment, and how to fix it:

The Core Issue: Strictness of Activity Validation

Bot Emulator is built to be developer-friendly and often tolerates non-standard or extra fields in Activity objects. However, the Direct Line service (which your frontend uses to communicate with the deployed bot) enforces strict validation against the official Bot Framework Activity schema. Any unrecognized fields or invalid structure will trigger a BadSyntax (400) error.

Looking at your Activity structure, there are several key problems:

  • Non-standard fields: localTimezone, callerId, label, valueType, listenFor are not part of the official Activity schema. Direct Line rejects activities carrying these unexpected fields.
  • Invalid Conversation object: The conversation property includes a message field (which doesn’t belong here) and uses context.activity.from.id as the id—this should be the conversation ID (context.activity.conversation.id), not the user’s ID.

Step-by-Step Fixes

1. Trim Down to Valid Activity Fields

Only include fields defined in the official Activity schema for message activities. Here’s a corrected version of your conversation history:

const conversationHistory = [
  {
    type: 'message',
    text: 'User message',
    from: context.activity.from,
    recipient: context.activity.recipient,
    conversation: { id: context.activity.conversation.id }, // Use actual conversation ID
    serviceUrl: context.activity.serviceUrl,
    channelId: context.activity.channelId
  },
  {
    type: 'message',
    text: 'Bot message!',
    from: context.activity.recipient,
    recipient: context.activity.from,
    conversation: { id: context.activity.conversation.id }, // Match conversation ID
    serviceUrl: context.activity.serviceUrl,
    channelId: context.activity.channelId
  }
];

2. Verify Dependency Consistency

Ensure the versions of @microsoft/botbuilder, @azure/ms-rest-js, and other related packages are identical between your local environment and the deployed Azure app. Version mismatches can lead to unexpected serialization differences (e.g., extra fields being included in the JSON payload sent to Direct Line).

3. Validate Payload Serialization

In your deployed code, add a log to print the stringified version of the activities array before calling sendConversationHistory(). Compare this JSON to what’s generated locally—look for any unexpected fields or structure differences that might be introduced by the deployment environment (e.g., different Node.js versions handling object serialization differently).

4. Check Direct Line Compatibility

If you’re using Direct Line v3.0, confirm your Bot Framework SDK version is compatible. Newer SDK features might generate payloads that aren’t supported by older Direct Line versions (though this is less likely if your local emulator works).

Why This Works in the Emulator

The Bot Emulator prioritizes developer experience over strict schema enforcement. It ignores unrecognized fields and allows minor structural inconsistencies to let you test core functionality. The Direct Line service, however, must adhere to strict standards to ensure interoperability across all channels and clients.

内容的提问来源于stack exchange,提问作者Smit Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:32:43