# Assign To (human)：转给同事

把对话转给某位同事，或让这一步按轮流、按当前未结对话最少来挑人；没人回复时，还可以给客户发一条超时消息。

## 快速上手

1. 进入 **Automate → Workflows** 打开一个工作流。点 **+**，选 **Assign To (human)**。
2. 在 **Action** 里选 **Assign to a specific user**，再在 **Assign To** 里选那位同事。
3. 或者选 **Assign to a user in the workspace**，再在 **Assignment Logic** 里选轮流或未结对话最少。
4. 可选：打开 **Add Timeout Branch**，填上没人回复时要发给客户的消息。
5. 在顶部工具栏把 **Status** 设成 **Published**，点 **Save**，再确认 **发布**。客服请找所有者或管理员。

## 注意

- 同事不会收到通知。这一步运行时不推送任何东西，所以必须让人知道时，在它后面加一个 **Escalate**。

## 在哪里找到它

**Automate → Workflows**，打开一个工作流，在画布上点 **+**，然后在 **Add Steps** 里选 **Assign To (human)**。

## 开始之前

- **所有者**、**管理员** 和 **客服** 都可以添加这一步并保存工作流。只有 **所有者** 或 **管理员** 能发布它，而发布才会让它对真实对话生效。
- 能不能搭建和运行工作流取决于你的套餐，详见[价格](/pricing)。
- 得有人可挑。它可以挑这个工作区里的任何成员，包括你自己，所以如果只有你一个人，每个对话都会转回给你。
- 不需要连接 Inchat 以外的任何东西。这一步只改对话本身。

## 设置步骤

1. 打开工作流，在需要转给人的位置点 **+** —— 通常是在需要人接手的那条路径的末尾。
2. 选 **Assign To (human)**。
3. 在 **Action** 里，选 **Assign to a specific user** 指定某个人，或选 **Assign to a user in the workspace** 让这一步来挑。
4. 指定某个人：在 **Assign To** 里选他。让这一步挑：在 **Assignment Logic** 里选 **Assign to users round robin** 或 **Assign to the user with least open contacts**。
5. 可选，在 **Advanced Settings** 里：限制一位同事手上最多能有多少个未结对话。你也可以打开 **Add Timeout Branch**，填上负责人没有及时回复时要发出的消息。
6. 保存这一步。要发布：在编辑器顶部的工具栏把 **Status** 设成 **Published**，点 **Save**，再确认 **发布**。只改下拉框、不保存的话什么都不会生效。

## 字段

| 字段 | 含义 | 默认值 | 限制 |
| --- | --- | --- | --- |
| Action | 这一步要做什么：指定一位同事、交给 AI agent、交给一个团队、让这一步从工作区里挑人，或清空负责人。 | Assign to a specific user | 选 AI agent 和团队会保存成另一种步骤，各有自己的说明页。 |
| Assign To | 对话要转给的那位同事。 | — | 只在 **Assign to a specific user** 时出现。 |
| Assignment Logic | **Assign to users round robin** 取当前负责人之后的那位同事。当前没有负责人、或上限把他排除掉时，取第一位。**Assign to the user with least open contacts** 取手上未结对话最少的那位。 | — | 只在选工作区或团队时出现，指定某个人时不出现。 |
| Only assign to online users | 目前不起任何作用：打开它也不会跳过任何不在的同事。 | 关闭 | 谁在读在线状态，见「它不会做什么」。 |
| Only assign to users with fewer than … open contacts assigned to them | 手上已经有这么多个或更多未结对话的同事会被跳过，按你工作区里的所有渠道一起统计。 | — | 只有同时设置了 **Assignment Logic** 才会出现并保存。指定某个人时它被忽略。 |
| Add Timeout Branch | 排好一条给客户的消息，用于到了超时时间负责人还没回复客户的情况。 | 关闭；打开后默认 10 分钟 | 消息框留空就不会排任何消息。这个面板在这里只能做出一条消息 —— 见「它不会做什么」。 |

## 它如何运作

- 对话会把那位同事显示成它的负责人，在收件箱里按 **负责人** 筛选时也能找到它。
- 写之前，它会先确认这位同事还是这个工作区的成员。工作流里写的人已经离开时，这一步会失败，而不是把对话交给一个再也打不开它的人。
- **Assign to a specific user** 只取你指定的那个人。如果他不在工作区成员名单上，这一步谁都不挑。
- **Assign to users round robin** 把可挑的同事排成一个固定顺序，取现在持有这个对话的人之后的那一位，排到最后再从第一位重新开始。
- 还没有负责人时取第一位。当前负责人因为上限或离职而不在可挑范围里时，也取第一位。
- **Assign to the user with least open contacts** 统计每位同事在这个工作区手上有多少个未结对话，取最少的那位。两位同事数量相同时，每次选中的都是同一位。
- 这个数量把你工作区里的所有渠道、所有团队合在一起算。
- **Unassign** 清空负责人，别的都不改。状态、标签和对话本身都保持原样。
- 这个对话确实会从原负责人自己的列表里消失，因为它退回了未分配状态。这正是这个操作的用意。
- **Timeout Branch** 不会让工作流停下等待。超时消息会被存起来留到以后，工作流直接往下一步走。
- Inchat 大约每分钟检查一次：负责人在接手这个对话之后，有没有给客户发过东西。发过的话，这条超时消息就作废，什么都不发。
- 内部备注不算回复。只有客户能收到的消息，才会让这条超时消息不再发出。

## 它在什么时候会失败

- 没人可用：设置了 **Assignment Logic**，而每位同事手上的未结对话都已经到了你设的上限时，这一步失败，对话保持原来的负责人。这一步在运行记录里的那一行写着 **no teammate available to assign**。
- 指定的同事已经离开工作区：这一步失败，理由是 **that assignee is no longer a member of this workspace**。对话同样保持原来的负责人，而不是换成一个联系不上的人。
- 转交失败不会让工作流停下。只有这一步记为失败，工作流继续往下走，所以排在它后面的消息、标签或结束对话照样会发生，尽管没有新的人接手这个对话。
- 所以本来没有负责人的对话还是没有负责人，轮流本来要从某位同事手上挪走的对话还在那位同事手上。
- 理由在工作流的 **Activity** 标签里：在 **Execution log** 下选中那次运行，失败的那一步自己带着一行说明。
- 如果既没选同事也没设 **Assignment Logic**，保存会在这些之前就被拒绝 —— **Pick a teammate or a distribution rule for Assign To.**

## 它不会做什么

- **Only assign to online users** 对这一步没有任何作用。这个开关要筛的那份名单把每个工作区成员都标成可用，所以谁都不会被跳过。同事在不在线，只有 **Settings → Conversations** 里收件箱自己的自动分配会读，这一步不读。
- 这一步不检查渠道权限。和自动分配不同，它可以把对话交给一位渠道名单里没有这个渠道的同事，而他打不开这个对话。
- 它不会通知负责人。这一步运行时不推送任何东西，产品里也没有「有对话分给你了」这种通知。
- 之后的消息能不能到负责人那里，取决于这个对话 —— 取决于它是否在等人处理，然后取决于他的通知设置、在线状态和有没有静音这个对话。必须让人知道的时候用 **Escalate**：它会让 AI 停止回复，并提醒一个真人。
- 它不给客户发任何东西。除非后面的步骤或超时消息给客户发了内容，否则客户完全看不到任何变化。
- 它不会暂停 AI agent。被工作流转交过的对话，AI 照样可能在上面回复。要停下来得用 **Escalate** 或 **Pause AI / Unassign**。
- 在 **Configure step** 面板里，超时分支只能发一条消息。那个框做出来的是一个 **Send a Message**，开关打开而框留空时什么都不会排进队列。
- 由 **Build with AI** 写出来的工作流可以在超时分支里放别的步骤 —— 转交、打标签 —— 而它们确实会跑。但面板只显示这条分支第一步的文字，在那个框里打字会把整条分支换成一条消息。要改这种步骤就换个地方改，否则分支的其余部分会丢。
- 轮流只记得现在是谁持有这个对话。它不为工作区维护一张共用的轮值表，所以两个全新的未分配对话都会给到同一位第一顺位的同事。

## 最佳做法

- 把转交放在说明「为什么归他」的标签或内部备注之后。落进队列却没有上下文的对话，是会被人读两遍的对话。
- 在 AI 没有回复的那条路径上，先转交，再放 **Escalate**。AI Reply 这一步在自己拒答时已经会提醒对话的持有人；**Escalate** 多出来的是暂停 AI。放在转交之后，它和那条提醒都会指向你刚刚交出去的那个人。
- **Escalate** 和这一步回答的是两个问题 —— *现在来看这个* 和 *这个归你*。需要人介入的路径大多两个都要，先转交，这样提醒才有人可以指向。
- 大多数新对话还没人接手时，用「未结对话最少」而不是轮流：轮流会把它们全给同一个人。
- 超时消息要写成客户读了有用的话。为等待致歉，比一句冲着自己团队去的催促更好，因为收到它的人是客户。

## 使用场景

- AI 回复之后客户要求找人：按未结对话最少转给工作区，配一条两分钟的超时消息。然后接 **Escalate**，这样 AI 停下来，提醒也会指向现在持有这个对话的人。
- 收到转账凭证：把交易推进到下一阶段，然后把对话转给专门核对转账的那位同事。
- 非营业时间里，**Date & Time** 把流程引向一个模板；营业时间内，它按轮流转给名单上的下一位同事。
- 到了高价值的交易阶段：转给指定的客户负责人，而不是走轮流。

## 常见问题与排查

### 对话转给人之后，联系人是不是就离开这个工作流了？

不是。转交只是记下谁负责这个对话，工作流会继续走到下一步 —— 排在后面的等待、提问或消息照样会发生。如果流程应该到这里停住，就在转交后面加一个 **End** 步骤。

### 这一步显示失败了。对话去哪儿了？

哪儿都没去。它保持转交之前的负责人，工作流的其余部分也照样执行了。打开工作流的 **Activity** 标签，在 **Execution log** 下选中那次运行，失败那一步的那行会给出理由。

### 为什么轮流总是选中同一位同事？

轮流是从现在持有这个对话的人往后数的，而新对话没有人持有。于是每个未分配的对话都从同一位第一顺位的同事开始。**Assign to the user with least open contacts** 能把新队列分得更均匀。

### 我打开了 Only assign to online users，它还是会转给不在的人。

这就是这一步目前的行为：它把每个工作区成员都当成可用。读在线状态的是 **Settings → Conversations** 里的自动分配。

### 工作流把对话转给同事时，他会收到通知吗？

转交这件事本身不会。那一刻不推送任何东西，产品里也没有「有对话分给你了」这种通知。这个对话确实会出现在收件箱里他的 **负责人** 筛选下。之后的消息会不会推给他，是这个对话的属性。AI 自己回复的时候本来就不该发提醒，而他的通知设置、在线状态和静音也都还起作用。不要指望它 —— 必须让人知道的时候，在转交后面放 **Escalate**，这样提醒才有一个负责人可以指向。

### 超时分支能把对话转给别人吗？

从面板里不能：那个框只会发你打进去的那一条消息，而且只在负责人还没有回复客户时发。由 **Build with AI** 写出来的工作流可以在超时分支里放一次转交，而它确实会跑。不要在这一步后面再放一个 Assign 步骤指望它在超时时运行：工作流不会等待，所以它几秒后就会跑。

## 相关文章

- [Assign To (team)](https://inchat.inseller.my/help/workflows/assign-to-team)
- [Assign To (AI)](https://inchat.inseller.my/help/workflows/assign-to-ai-agent)
- [Escalate：转交给人工](https://inchat.inseller.my/help/zh/workflows/escalate)
- [Pause AI / Unassign](https://inchat.inseller.my/help/workflows/pause-ai-unassign)
- [Create a Task](https://inchat.inseller.my/help/workflows/create-a-task)
- [Workflows: how a flow runs](https://inchat.inseller.my/help/workflows/workflows-overview)

---

Source files: `src/lib/workflows/engine-record-actions.ts`, `src/lib/orchestrator/handle-inbound.ts`, `src/lib/orchestrator/from-event.ts`, `src/lib/workflows/assign-routing.ts`, `src/lib/workflows/pending.ts`, `src/lib/workflows/form-payload.ts`, `src/lib/workflows/engine.ts`, `src/lib/access/permissions.ts`, `src/components/workflows/WorkflowStepConfigDrawer.tsx`, `src/components/workflows/WorkflowHistory.tsx`, `src/app/(app)/workflows/WorkflowToolsPanel.tsx`, `src/lib/conversations/auto-assign.ts`, `src/lib/push/notify.ts`, `src/lib/workflows/workflow-input-schema.ts`, `src/lib/i18n/messages/inbox-list.ts`, `src/components/workflows/WorkflowCanvasEditor.tsx`
