Suggestions with comments

Continuation from the suggestions guide

This guide continues the suggestions guide. Read it first.

AI 工具包可以指示 AI 在对文档所做的每个修改中包含理由。这允许你向用户展示为什么要做出某项修改,而不仅仅是修改了什么

查看GitHub 上的源码

启用有理有据的修改

要启用有理有据的修改,请在服务器端调用 toolDefinitions() 时传入 operationMeta 选项。你提供的字符串将成为工具 schema 中 meta 字段的描述,AI 会以此了解应提供何种类型的理由说明。

// api/route.ts
const agent = new ToolLoopAgent({
  model,
  instructions: '...',
  tools: toolDefinitions({
    operationMeta: '对为什么该修改能提升文本的简要说明',
  }),
})

以工具提示显示理由

当选中某个建议时,你可以使用 Floating UI 库将理由显示为工具提示。

安装 Floating UI

npm install @floating-ui/dom

renderDecorations 中访问理由

理由可以通过 suggestion.metadata?.operationMeta 获取。使用 isSelected 选项仅在建议被选中时显示工具提示。

import { computePosition, flip, offset, shift } from '@floating-ui/dom'

const result = toolkit.executeTool({
  toolName,
  input,
  reviewOptions: {
    mode: 'preview',
    displayOptions: {
      renderDecorations(options) {
        const decorations = [...options.defaultRenderDecorations()]

        // Add Accept and Reject buttons (same as the suggestions guide)
        // ...

        // 选中且存在理由时显示工具提示
        const justification = options.suggestion.metadata?.operationMeta
        if (options.isSelected && justification) {
          decorations.push(
            Decoration.widget(options.range.to, () => {
              const container = document.createElement('span')
              container.style.position = 'relative'

              const tooltip = document.createElement('div')
              tooltip.textContent = justification as string
              tooltip.style.cssText =
                'position:absolute;background:white;color:#1f2937;padding:8px 12px;border-radius:8px;border:1px solid #e5e7eb;font-size:13px;max-width:400px;width:max-content;z-index:50;pointer-events:none;box-shadow:0 4px 12px rgba(0,0,0,0.08),0 1px 3px rgba(0,0,0,0.06);'
              container.appendChild(tooltip)

              requestAnimationFrame(() => {
                computePosition(container, tooltip, {
                  placement: 'top',
                  middleware: [offset(8), flip(), shift({ padding: 8 })],
                }).then(({ x, y }) => {
                  tooltip.style.left = `${x}px`
                  tooltip.style.top = `${y}px`
                })
              })

              return container
            }),
          )
        }

        return decorations
      },
    },
  },
})

最终效果

经过以上修改,AI 生成的建议就会包含浮动工具提示,解释每处修改背后的理由:

查看GitHub 上的源码