Files
FastGPT/docSite/content/zh-cn/docs/development/openapi/chat.md
Archer f642c9603b V4.9.4 feature (#4470)
* Training status (#4424)

* dataset data training state (#4311)

* dataset data training state

* fix

* fix ts

* fix

* fix api format

* fix

* fix

* perf: count training

* format

* fix: dataset training state (#4417)

* fix

* add test

* fix

* fix

* fix test

* fix test

* perf: training count

* count

* loading status

---------

Co-authored-by: heheer <heheer@sealos.io>

* doc

* website sync feature (#4429)

* perf: introduce BullMQ for website sync (#4403)

* perf: introduce BullMQ for website sync

* feat: new redis module

* fix: remove graceful shutdown

* perf: improve UI in dataset detail

- Updated the "change" icon SVG file.
- Modified i18n strings.
- Added new i18n string "immediate_sync".
- Improved UI in dataset detail page, including button icons and
background colors.

* refactor: Add chunkSettings to DatasetSchema

* perf: website sync ux

* env template

* fix: clean up website dataset when updating chunk settings (#4420)

* perf: check setting updated

* perf: worker currency

* feat: init script for website sync refactor (#4425)

* website feature doc

---------

Co-authored-by: a.e. <49438478+I-Info@users.noreply.github.com>

* pro migration (#4388) (#4433)

* pro migration

* reuse customPdfParseType

Co-authored-by: gggaaallleee <91131304+gggaaallleee@users.noreply.github.com>

* perf: remove loading ui

* feat: config chat file expired time

* Redis cache (#4436)

* perf: add Redis cache for vector counting (#4432)

* feat: cache

* perf: get cache key

---------

Co-authored-by: a.e. <49438478+I-Info@users.noreply.github.com>

* perf: mobile voice input (#4437)

* update:Mobile voice interaction (#4362)

* Add files via upload

* Add files via upload

* Update ollama.md

* Update ollama.md

* Add files via upload

* Update useSpeech.ts

* Update ChatInput.tsx

* Update useSpeech.ts

* Update ChatInput.tsx

* Update useSpeech.ts

* Update constants.ts

* Add files via upload

* Update ChatInput.tsx

* Update useSpeech.ts

* Update useSpeech.ts

* Update useSpeech.ts

* Update ChatInput.tsx

* Add files via upload

* Update common.json

* Update VoiceInput.tsx

* Update ChatInput.tsx

* Update VoiceInput.tsx

* Update useSpeech.ts

* Update useSpeech.ts

* Update common.json

* Update common.json

* Update common.json

* Update VoiceInput.tsx

* Update VoiceInput.tsx

* Update ChatInput.tsx

* Update VoiceInput.tsx

* Update ChatInput.tsx

* Update VoiceInput.tsx

* Update ChatInput.tsx

* Update useSpeech.ts

* Update common.json

* Update chat.json

* Update common.json

* Update chat.json

* Update common.json

* Update chat.json

* Update VoiceInput.tsx

* Update ChatInput.tsx

* Update useSpeech.ts

* Update VoiceInput.tsx

* speech ui

* 优化语音输入组件,调整输入框显示逻辑,修复语音输入遮罩层样式,更新画布背景透明度,增强用户交互体验。 (#4435)

* perf: mobil voice input

---------

Co-authored-by: dreamer6680 <1468683855@qq.com>

* Test completion v2 (#4438)

* add v2 completions (#4364)

* add v2 completions

* completion config

* config version

* fix

* frontend

* doc

* fix

* fix: completions v2 api

---------

Co-authored-by: heheer <heheer@sealos.io>

* package

* Test mongo log (#4443)

* feat: mongodb-log (#4426)

* perf: mongo log

* feat: completions stop reasoner

* mongo db log

---------

Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com>

* update doc

* Update doc

* fix external var ui (#4444)

* action

* fix: ts (#4458)

* preview doc action

add docs preview permission

update preview action

udpate action

* update doc (#4460)

* update preview action

* update doc

* remove

* update

* schema

* update mq export;perf: redis cache  (#4465)

* perf: redis cache

* update mq export

* perf: website sync error tip

* add error worker

* website sync ui (#4466)

* Updated the dynamic display of the voice input pop-up (#4469)

* Update VoiceInput.tsx

* Update VoiceInput.tsx

* Update VoiceInput.tsx

* fix: voice input

---------

Co-authored-by: heheer <heheer@sealos.io>
Co-authored-by: a.e. <49438478+I-Info@users.noreply.github.com>
Co-authored-by: gggaaallleee <91131304+gggaaallleee@users.noreply.github.com>
Co-authored-by: dreamer6680 <1468683855@qq.com>
Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com>
2025-04-08 12:05:04 +08:00

55 KiB
Raw Blame History

title, description, icon, draft, toc, weight
title description icon draft toc weight
对话接口 FastGPT OpenAPI 对话接口 chat false true 852

如何获取 AppId

可在应用详情的路径里获取 AppId。

发起对话

{{% alert icon="🤖 " context="success" %}}

  • 该接口的 API Key 需使用应用特定的 key,否则会报错。
  • 有些包调用时,BaseUrl需要添加v1路径有些不需要如果出现404情况可补充v1重试。 {{% /alert %}}

请求简易应用和工作流

v1对话接口兼容GPT的接口!如果你的项目使用的是标准的GPT官方接口,可以直接通过修改BaseUrlAuthorization来访问 FastGpt 应用,不过需要注意下面几个规则:

{{% alert icon="🤖 " context="success" %}}

  • 传入的modeltemperature等参数字段均无效,这些字段由编排决定,不会根据 API 参数改变。
  • 不会返回实际消耗Token值,如果需要,可以设置detail=true,并手动计算 responseData 里的tokens值。 {{% /alert %}}

请求

{{< tabs tabTotal="5" >}} {{< tab tabName="detail=false,stream=false 响应" >}} {{< markdownify >}}

{
    "id": "adsfasf",
    "model": "",
    "usage": {
        "prompt_tokens": 1,
        "completion_tokens": 1,
        "total_tokens": 1
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "电影《铃芽之旅》的导演是新海诚。"
            },
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="detail=false,stream=true 响应" >}} {{< markdownify >}}

data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":""},"index":0,"finish_reason":null}]}

data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"电"},"index":0,"finish_reason":null}]}

data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"影"},"index":0,"finish_reason":null}]}

data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"《"},"index":0,"finish_reason":null}]}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="detail=true,stream=false 响应" >}} {{< markdownify >}}

{
    "responseData": [ // 不同模块的响应值, 不同版本具体值可能有差异,可先 log 自行查看最新值。
        {
            "moduleName": "Dataset Search",
            "price": 1.2000000000000002,
            "model": "Embedding-2",
            "tokens": 6,
            "similarity": 0.61,
            "limit": 3
        },
        {
            "moduleName": "AI Chat",
            "price": 454.5,
            "model": "FastAI-4k",
            "tokens": 303,
            "question": "导演是谁",
            "answer": "电影《铃芽之旅》的导演是新海诚。",
            "maxToken": 2050,
            "quoteList": [
                {
                    "dataset_id": "646627f4f7b896cfd8910e38",
                    "id": "8099",
                    "q": "本作的主人公是谁?",
                    "a": "本作的主人公是名叫铃芽的少女。",
                    "source": "手动修改"
                },
                {
                    "dataset_id": "646627f4f7b896cfd8910e38",
                    "id": "8686",
                    "q": "电影《铃芽之旅》男主角是谁?",
                    "a": "电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。",
                    "source": ""
                },
                {
                    "dataset_id": "646627f4f7b896cfd8910e38",
                    "id": "19339",
                    "q": "电影《铃芽之旅》的导演是谁22",
                    "a": "电影《铃芽之旅》的导演是新海诚。",
                    "source": "手动修改"
                }
            ],
            "completeMessages": [
                {
                    "obj": "System",
                    "value": "下面是知识库内容:\n1. [本作的主人公是谁?\n本作的主人公是名叫铃芽的少女。]\n2. [电影《铃芽之旅》男主角是谁?\n电影《铃芽之旅》男主角是宗像草太由松村北斗配音。]\n3. [电影《铃芽之旅》的导演是谁22\n电影《铃芽之旅》的导演是新海诚。]\n"
                },
                {
                    "obj": "System",
                    "value": "1.请记住,你的身份是百度的下一代知识增强语言模型,能够完全根据知识库提供的内容回答问题。\n\n2. 你忘记了关于电影《铃芽之旅》以外的内容。"
                },
                {
                    "obj": "System",
                    "value": "你仅回答关于电影《玲芽之旅》的问题,其余问题直接回复: 我不清楚。"
                },
                {
                    "obj": "Human",
                    "value": "导演是谁"
                },
                {
                    "obj": "AI",
                    "value": "电影《铃芽之旅》的导演是新海诚。"
                }
            ]
        }
    ],
    "id": "",
    "model": "",
    "usage": {
        "prompt_tokens": 1,
        "completion_tokens": 1,
        "total_tokens": 1
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "电影《铃芽之旅》的导演是新海诚。"
            },
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="detail=true,stream=true 响应" >}} {{< markdownify >}}

event: flowNodeStatus
data: {"status":"running","name":"知识库搜索"}

event: flowNodeStatus
data: {"status":"running","name":"AI 对话"}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"电影"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"《铃"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"芽之旅》"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"的导演是新"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"海诚。"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{},"index":0,"finish_reason":"stop"}]}

event: answer
data: [DONE]

event: flowResponses
data: [{"moduleName":"知识库搜索","moduleType":"datasetSearchNode","runningTime":1.78},{"question":"导演是谁","quoteList":[{"id":"654f2e49b64caef1d9431e8b","q":"电影《铃芽之旅》的导演是谁?","a":"电影《铃芽之旅》的导演是新海诚!","indexes":[{"type":"qa","dataId":"3515487","text":"电影《铃芽之旅》的导演是谁?","_id":"654f2e49b64caef1d9431e8c","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8935586214065552},{"id":"6552e14c50f4a2a8e632af11","q":"导演是谁?","a":"电影《铃芽之旅》的导演是新海诚。","indexes":[{"defaultIndex":true,"type":"qa","dataId":"3644565","text":"导演是谁?\n电影《铃芽之旅》的导演是新海诚。","_id":"6552e14dde5cc7ba3954e417"}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8890955448150635},{"id":"654f34a0b64caef1d946337e","q":"本作的主人公是谁?","a":"本作的主人公是名叫铃芽的少女。","indexes":[{"type":"qa","dataId":"3515541","text":"本作的主人公是谁?","_id":"654f34a0b64caef1d946337f","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8738770484924316},{"id":"654f3002b64caef1d944207a","q":"电影《铃芽之旅》男主角是谁?","a":"电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。","indexes":[{"type":"qa","dataId":"3515538","text":"电影《铃芽之旅》男主角是谁?","_id":"654f3002b64caef1d944207b","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8607980012893677},{"id":"654f2fc8b64caef1d943fd46","q":"电影《铃芽之旅》的编剧是谁?","a":"新海诚是本片的编剧。","indexes":[{"defaultIndex":true,"type":"qa","dataId":"3515550","text":"电影《铃芽之旅》的编剧是谁22","_id":"654f2fc8b64caef1d943fd47"}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8468944430351257}],"moduleName":"AI 对话","moduleType":"chatNode","runningTime":1.86}]

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="event值" >}} {{< markdownify >}}

event取值

  • answer: 返回给客户端的文本(最终会算作回答)
  • fastAnswer: 指定回复返回给客户端的文本(最终会算作回答)
  • toolCall: 执行工具
  • toolParams: 工具参数
  • toolResponse: 工具返回
  • flowNodeStatus: 运行到的节点状态
  • flowResponses: 节点完整响应
  • updateVariables: 更新变量
  • error: 报错

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

交互节点响应

如果工作流中包含交互节点,依然是调用该 API 接口,需要设置detail=true,并可以从event=interactive的数据中获取交互节点的配置信息。如果是stream=false,则可以从 choice 中获取type=interactive的元素,获取交互节点的选择信息。

当你调用一个带交互节点的工作流时,如果工作流遇到了交互节点,那么会直接返回,你可以得到下面的信息:

{{< tabs tabTotal="2" >}} {{< tab tabName="用户选择" >}} {{< markdownify >}}

{
    "interactive": {
        "type": "userSelect",
        "params": {
            "description": "测试",
            "userSelectOptions": [
                {
                    "value": "Confirm",
                    "key": "option1"
                },
                {
                    "value": "Cancel",
                    "key": "option2"
                }
            ]
        }
    }
}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="表单输入" >}} {{< markdownify >}}

{
    "interactive": {
        "type": "userInput",
        "params": {
            "description": "测试",
            "inputForm": [
                {
                    "type": "input",
                    "key": "测试 1",
                    "label": "测试 1",
                    "description": "",
                    "value": "",
                    "defaultValue": "",
                    "valueType": "string",
                    "required": false,
                    "list": [
                        {
                            "label": "",
                            "value": ""
                        }
                    ]
                },
                {
                    "type": "numberInput",
                    "key": "测试 2",
                    "label": "测试 2",
                    "description": "",
                    "value": "",
                    "defaultValue": "",
                    "valueType": "number",
                    "required": false,
                    "list": [
                        {
                            "label": "",
                            "value": ""
                        }
                    ]
                }
            ]
        }
    }
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

交互节点继续运行

紧接着上一节,当你接收到交互节点信息后,可以根据这些数据进行 UI 渲染,引导用户输入或选择相关信息。然后需要再次发起对话,来继续工作流。调用的接口与仍是该接口,你需要按以下格式来发起请求:

{{< tabs tabTotal="2" >}} {{< tab tabName="用户选择" >}} {{< markdownify >}}

对于用户选择,你只需要直接传递一个选择的结果给 messages 即可。

curl --location --request POST 'https://api.fastgpt.in/api/v1/chat/completions' \
--header 'Authorization: Bearer fastgpt-xxx' \
--header 'Content-Type: application/json' \
--data-raw '{
    "stream": true,
    "detail": true,
    "chatId":"22222231",
    "messages": [
        {
            "role": "user",
            "content": "Confirm"
        }
    ]
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="表单输入" >}} {{< markdownify >}}

表单输入稍微麻烦一点,需要将输入的内容,以对象形式并序列化成字符串,作为messages的值。对象的 key 对应表单的 keyvalue 为用户输入的值。务必确保chatId是一致的。

curl --location --request POST 'https://api.fastgpt.in/api/v1/chat/completions' \
--header 'Authorization: Bearer fastgpt-xxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
    "stream": true,
    "detail": true,
    "chatId":"22231",
    "messages": [
        {
            "role": "user",
            "content": "{\"测试 1\":\"这是输入框的内容\",\"测试 2\":666}"
        }
    ]
}'

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

请求插件

插件的接口与对话接口一致,仅请求参数略有区别,有以下规定:

  • 调用插件类型的应用时,接口默认为detail模式。
  • 无需传入 chatId,因为插件只能运行一轮。
  • 无需传入messages
  • 通过传递variables来代表插件的输入。
  • 通过获取pluginData来获取插件输出。

请求示例

v1

curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \
--header 'Authorization: Bearer test-xxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
    "stream": false,
    "chatId": "test",
    "variables": {
        "query":"你好" # 我的插件输入有一个参数,变量名叫 query
    }
}'

v2

curl --location --request POST 'http://localhost:3000/api/v2/chat/completions' \
--header 'Authorization: Bearer test-xxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
    "stream": false,
    "chatId": "test",
    "variables": {
        "query":"你好"
    }
}'

响应示例

v1

{{< tabs tabTotal="3" >}}

{{< tab tabName="detail=true,stream=false 响应" >}} {{< markdownify >}}

  • 插件的输出可以通过查找responseData中, moduleType=pluginOutput的元素,其pluginOutput是插件的输出。
  • 流输出,仍可以通过choices进行获取。
{
    "responseData": [
        {
            "nodeId": "fdDgXQ6SYn8v",
            "moduleName": "AI 对话",
            "moduleType": "chatNode",
            "totalPoints": 0.685,
            "model": "FastAI-3.5",
            "tokens": 685,
            "query": "你好",
            "maxToken": 2000,
            "historyPreview": [
                {
                    "obj": "Human",
                    "value": "你好"
                },
                {
                    "obj": "AI",
                    "value": "你好!有什么可以帮助你的吗?欢迎向我提问。"
                }
            ],
            "contextTotalLen": 14,
            "runningTime": 1.73
        },
        {
            "nodeId": "pluginOutput",
            "moduleName": "插件输出",
            "moduleType": "pluginOutput",
            "totalPoints": 0,
            "pluginOutput": {
                "result": "你好!有什么可以帮助你的吗?欢迎向我提问。"
            },
            "runningTime": 0
        }
    ],
    "newVariables": {
        "query": "你好"
    },
    "id": "safsafsa",
    "model": "",
    "usage": {
        "prompt_tokens": 1,
        "completion_tokens": 1,
        "total_tokens": 1
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "你好!有什么可以帮助你的吗?欢迎向我提问。"
            },
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="detail=true,stream=true 响应" >}} {{< markdownify >}}

  • 插件的输出可以通过获取event=flowResponses中的字符串,并将其反序列化后得到一个数组。同样的,查找 moduleType=pluginOutput的元素,其pluginOutput是插件的输出。
  • 流输出,仍和对话接口一样获取。
event: flowNodeStatus
data: {"status":"running","name":"AI 对话"}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":""},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"你"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"好"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":""},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"有"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"什"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"么"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"可以"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"帮"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"助"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"你"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"的"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"吗"},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":""},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":""},"index":0,"finish_reason":null}]}

event: answer
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{},"index":0,"finish_reason":"stop"}]}

event: answer
data: [DONE]

event: flowResponses
data: [{"nodeId":"fdDgXQ6SYn8v","moduleName":"AI 对话","moduleType":"chatNode","totalPoints":0.033,"model":"FastAI-3.5","tokens":33,"query":"你好","maxToken":2000,"historyPreview":[{"obj":"Human","value":"你好"},{"obj":"AI","value":"你好!有什么可以帮助你的吗?"}],"contextTotalLen":2,"runningTime":1.42},{"nodeId":"pluginOutput","moduleName":"插件输出","moduleType":"pluginOutput","totalPoints":0,"pluginOutput":{"result":"你好!有什么可以帮助你的吗?"},"runningTime":0}]

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="输出获取" >}} {{< markdownify >}}

event取值

  • answer: 返回给客户端的文本(最终会算作回答)
  • fastAnswer: 指定回复返回给客户端的文本(最终会算作回答)
  • toolCall: 执行工具
  • toolParams: 工具参数
  • toolResponse: 工具返回
  • flowNodeStatus: 运行到的节点状态
  • flowResponses: 节点完整响应
  • updateVariables: 更新变量
  • error: 报错

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

v2

{{< tabs tabTotal="3" >}}

{{< tab tabName="detail=true,stream=false 响应" >}} {{< markdownify >}}

  • 插件的输出可以通过查找responseData中, moduleType=pluginOutput的元素,其pluginOutput是插件的输出。
  • 流输出,仍可以通过choices进行获取。
{
    "responseData": [
        {
            "id": "bsH1ZdbYkz9iJwYa",
            "nodeId": "pluginInput",
            "moduleName": "workflow:template.plugin_start",
            "moduleType": "pluginInput",
            "runningTime": 0
        },
        {
            "id": "zDgfqSPhbYZFHVIn",
            "nodeId": "h4Gr4lJtFVQ6qI4c",
            "moduleName": "AI 对话",
            "moduleType": "chatNode",
            "runningTime": 1.44,
            "totalPoints": 0,
            "model": "GPT-4o-mini",
            "tokens": 34,
            "inputTokens": 8,
            "outputTokens": 26,
            "query": "你好",
            "reasoningText": "",
            "historyPreview": [
                {
                    "obj": "Human",
                    "value": "你好"
                },
                {
                    "obj": "AI",
                    "value": "你好!有什么我可以帮助你的吗?"
                }
            ],
            "contextTotalLen": 2
        },
        {
            "id": "uLLwKKRZvufXzgF4",
            "nodeId": "pluginOutput",
            "moduleName": "common:core.module.template.self_output",
            "moduleType": "pluginOutput",
            "runningTime": 0,
            "totalPoints": 0,
            "pluginOutput": {
                "result": "你好!有什么我可以帮助你的吗?"
            }
        }
    ],
    "newVariables": {

    },
    "id": "test",
    "model": "",
    "usage": {
        "prompt_tokens": 1,
        "completion_tokens": 1,
        "total_tokens": 1
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "你好!有什么我可以帮助你的吗?"
            },
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="detail=true,stream=true 响应" >}} {{< markdownify >}}

  • 插件的输出可以通过获取event=flowResponses中的字符串,并将其反序列化后得到一个数组。同样的,查找 moduleType=pluginOutput的元素,其pluginOutput是插件的输出。
  • 流输出,仍和对话接口一样获取。
data: {"event":"flowNodeResponse","data":"{\"id\":\"q8ablUOqHGgqLIRM\",\"nodeId\":\"pluginInput\",\"moduleName\":\"workflow:template.plugin_start\",\"moduleType\":\"pluginInput\",\"runningTime\":0}"}

data: {"event":"flowNodeStatus","data":"{\"status\":\"running\",\"name\":\"AI 对话\"}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"你好\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"有什么\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"我\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"可以\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"帮助\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"你\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"的吗\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"\"},\"index\":0,\"finish_reason\":null}]}"}

data: {"event":"flowNodeResponse","data":"{\"id\":\"rqlXLUap8QeiN7Kf\",\"nodeId\":\"h4Gr4lJtFVQ6qI4c\",\"moduleName\":\"AI 对话\",\"moduleType\":\"chatNode\",\"runningTime\":1.79,\"totalPoints\":0,\"model\":\"GPT-4o-mini\",\"tokens\":137,\"inputTokens\":111,\"outputTokens\":26,\"query\":\"你好\",\"reasoningText\":\"\",\"historyPreview\":[{\"obj\":\"Human\",\"value\":\"[{\\\"renderTypeList\\\":[\\\"reference\\\"],\\\"selectedTypeInde\\n\\n...[hide 174 chars]...\\n\\ncanSelectImg\\\":true,\\\"required\\\":false,\\\"value\\\":\\\"你好\\\"}]\"},{\"obj\":\"AI\",\"value\":\"你好!有什么我可以帮助你的吗?\"},{\"obj\":\"Human\",\"value\":\"你好\"},{\"obj\":\"AI\",\"value\":\"你好!有什么我可以帮助你的吗?\"}],\"contextTotalLen\":4}"}

data: {"event":"flowNodeResponse","data":"{\"id\":\"lHCpHI0MrM00HQlX\",\"nodeId\":\"pluginOutput\",\"moduleName\":\"common:core.module.template.self_output\",\"moduleType\":\"pluginOutput\",\"runningTime\":0,\"totalPoints\":0,\"pluginOutput\":{\"result\":\"你好!有什么我可以帮助你的吗?\"}}"}

data: {"event":"answer","data":"{\"id\":\"\",\"object\":\"\",\"created\":0,\"model\":\"\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":null},\"index\":0,\"finish_reason\":\"stop\"}]}"}

data: {"event":"answer","data":"[DONE]"}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="输出获取" >}} {{< markdownify >}}

event取值

  • answer: 返回给客户端的文本(最终会算作回答)
  • fastAnswer: 指定回复返回给客户端的文本(最终会算作回答)
  • toolCall: 执行工具
  • toolParams: 工具参数
  • toolResponse: 工具返回
  • flowNodeStatus: 运行到的节点状态
  • flowNodeResponse: 单个节点详细响应
  • updateVariables: 更新变量
  • error: 报错

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

对话 CRUD

{{% alert icon="🤖 " context="success" %}}

  • 以下接口可使用任意API Key调用。
  • 4.8.12 以上版本才能使用 {{% /alert %}}

重要字段

  • chatId - 指一个应用下,某一个对话窗口的 ID
  • dataId - 指一个对话窗口下,某一个对话记录的 ID

历史记录

获取某个应用历史记录

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request POST 'http://localhost:3000/api/core/chat/getHistories' \
--header 'Authorization: Bearer {{apikey}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "appId": "appId",
    "offset": 0,
    "pageSize": 20,
    "source": "api"
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • offset - 偏移量,即从第几条数据开始取
  • pageSize - 记录数量
  • source - 对话源。source=api表示获取通过 API 创建的对话(不会获取到页面上的对话记录) {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": {
        "list": [
            {
                "chatId": "usdAP1GbzSGu",
                "updateTime": "2024-10-13T03:29:05.779Z",
                "appId": "66e29b870b24ce35330c0f08",
                "customTitle": "",
                "title": "你好",
                "top": false
            },
            {
                "chatId": "lC0uTAsyNBlZ",
                "updateTime": "2024-10-13T03:22:19.950Z",
                "appId": "66e29b870b24ce35330c0f08",
                "customTitle": "",
                "title": "测试",
                "top": false
            }
        ],
        "total": 2
    }
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

修改某个对话的标题

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request POST 'http://localhost:3000/api/core/chat/updateHistory' \
--header 'Authorization: Bearer {{apikey}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "appId": "appId",
    "chatId": "chatId",
    "customTitle": "自定义标题"
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • chatId - 历史记录 Id
  • customTitle - 自定义对话名 {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": null
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

置顶 / 取消置顶

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request POST 'http://localhost:3000/api/core/chat/updateHistory' \
--header 'Authorization: Bearer {{apikey}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "appId": "appId",
    "chatId": "chatId",
    "top": true
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用Id
  • chatId - 历史记录 Id
  • top - 是否置顶ture 置顶false 取消置顶 {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": null
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

删除某个历史记录

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request DELETE 'http://localhost:3000/api/core/chat/delHistory?chatId={{chatId}}&appId={{appId}}' \
--header 'Authorization: Bearer {{apikey}}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • chatId - 历史记录 Id {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": null
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

清空所有历史记录

仅会情况通过 API Key 创建的对话历史记录,不会清空在线使用、分享链接等其他来源的对话历史记录。

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request DELETE 'http://localhost:3000/api/core/chat/clearHistories?appId={{appId}}' \
--header 'Authorization: Bearer {{apikey}}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": null
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

对话记录

指的是某个 chatId 下的对话记录操作。

获取单个对话初始化信息

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request GET 'http://localhost:3000/api/core/chat/init?appId={{appId}}&chatId={{chatId}}' \
--header 'Authorization: Bearer {{apikey}}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • chatId - 历史记录 Id {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": {
        "chatId": "sPVOuEohjo3w",
        "appId": "66e29b870b24ce35330c0f08",
        "variables": {

        },
        "app": {
            "chatConfig": {
                "questionGuide": true,
                "ttsConfig": {
                    "type": "web"
                },
                "whisperConfig": {
                    "open": false,
                    "autoSend": false,
                    "autoTTSResponse": false
                },
                "chatInputGuide": {
                    "open": false,
                    "textList": [

                    ],
                    "customUrl": ""
                },
                "instruction": "",
                "variables": [

                ],
                "fileSelectConfig": {
                    "canSelectFile": true,
                    "canSelectImg": true,
                    "maxFiles": 10
                },
                "_id": "66f1139aaab9ddaf1b5c596d",
                "welcomeText": ""
            },
            "chatModels": [
                "GPT-4o-mini"
            ],
            "name": "测试",
            "avatar": "/imgs/app/avatar/workflow.svg",
            "intro": "",
            "type": "advanced",
            "pluginInputs": [

            ]
        }
    }
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

获取对话记录列表

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request POST 'http://localhost:3000/api/core/chat/getPaginationRecords' \
--header 'Authorization: Bearer {{apikey}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "appId": "appId",
    "chatId": "chatId",
    "offset": 0,
    "pageSize": 10,
    "loadCustomFeedbacks": true
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • chatId - 历史记录 Id
  • offset - 偏移量
  • pageSize - 记录数量
  • loadCustomFeedbacks - 是否读取自定义反馈(可选) {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": {
        "list": [
            {
                "_id": "670b84e6796057dda04b0fd2",
                "dataId": "jzqdV4Ap1u004rhd2WW8yGLn",
                "obj": "Human",
                "value": [
                    {
                        "type": "text",
                        "text": {
                            "content": "你好"
                        }
                    }
                ],
                "customFeedbacks": [

                ]
            },
            {
                "_id": "670b84e6796057dda04b0fd3",
                "dataId": "x9KQWcK9MApGdDQH7z7bocw1",
                "obj": "AI",
                "value": [
                    {
                        "type": "text",
                        "text": {
                            "content": "你好!有什么我可以帮助你的吗?"
                        }
                    }
                ],
                "customFeedbacks": [

                ],
                "llmModuleAccount": 1,
                "totalQuoteList": [

                ],
                "totalRunningTime": 2.42,
                "historyPreviewLength": 2
            }
        ],
        "total": 2
    }
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

获取单个对话记录运行详情

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request GET 'http://localhost:3000/api/core/chat/getResData?appId={{appId}}&chatId={{chatId}}&dataId={{dataId}}' \
--header 'Authorization: Bearer {{apikey}}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • chatId - 对话 Id
  • dataId - 对话记录 Id {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": [
        {
            "id": "mVlxkz8NfyfU",
            "nodeId": "448745",
            "moduleName": "common:core.module.template.work_start",
            "moduleType": "workflowStart",
            "runningTime": 0
        },
        {
            "id": "b3FndAdHSobY",
            "nodeId": "z04w8JXSYjl3",
            "moduleName": "AI 对话",
            "moduleType": "chatNode",
            "runningTime": 1.22,
            "totalPoints": 0.02475,
            "model": "GPT-4o-mini",
            "tokens": 75,
            "query": "测试",
            "maxToken": 2000,
            "historyPreview": [
                {
                    "obj": "Human",
                    "value": "你好"
                },
                {
                    "obj": "AI",
                    "value": "你好!有什么我可以帮助你的吗?"
                },
                {
                    "obj": "Human",
                    "value": "测试"
                },
                {
                    "obj": "AI",
                    "value": "测试成功!请问你有什么具体的问题或者需要讨论的话题吗?"
                }
            ],
            "contextTotalLen": 4
        }
    ]
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

删除对话记录

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request DELETE 'http://localhost:3000/api/core/chat/item/delete?contentId={{contentId}}&chatId={{chatId}}&appId={{appId}}' \
--header 'Authorization: Bearer {{apikey}}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • chatId - 历史记录 Id
  • contentId - 对话记录 Id {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": null
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

点赞 / 取消点赞

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request POST 'http://localhost:3000/api/core/chat/feedback/updateUserFeedback' \
--header 'Authorization: Bearer {{apikey}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "appId": "appId",
    "chatId": "chatId",
    "dataId": "dataId",
    "userGoodFeedback": "yes"
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • chatId - 历史记录 Id
  • dataId - 对话记录 Id
  • userGoodFeedback - 用户点赞时的信息(可选),取消点赞时不填此参数即可 {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": null
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

点踩 / 取消点踩

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request POST 'http://localhost:3000/api/core/chat/feedback/updateUserFeedback' \
--header 'Authorization: Bearer {{apikey}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "appId": "appId",
    "chatId": "chatId",
    "dataId": "dataId",
    "userBadFeedback": "yes"
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • appId - 应用 Id
  • chatId - 历史记录 Id
  • dataId - 对话记录 Id
  • userBadFeedback - 用户点踩时的信息(可选),取消点踩时不填此参数即可 {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": null
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}

猜你想问

4.8.16 后新版接口

新版猜你想问,必须包含 appId 和 chatId 的参数才可以进行使用。会自动根据 chatId 去拉取最近 6 轮对话记录作为上下文来引导回答。

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request POST 'http://localhost:3000/api/core/ai/agent/v2/createQuestionGuide' \
--header 'Authorization: Bearer {{apikey}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "appId": "appId",
    "chatId": "chatId",
    "questionGuide": {
        "open": true,
        "model": "GPT-4o-mini",
        "customPrompt": "你是一个智能助手,请根据用户的问题生成猜你想问。"
    }
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

参数名 类型 必填 说明
appId string 应用 Id
chatId string 对话 Id
questionGuide object 自定义配置,不传的话,则会根据 appId取最新发布版本的配置
type CreateQuestionGuideParams = OutLinkChatAuthProps & {
  appId: string;
  chatId: string;
  questionGuide?: {
    open: boolean;
    model?: string;
    customPrompt?: string;
  };
};

{{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": [
        "你对AI有什么看法",
        "想了解AI的应用吗",
        "你希望AI能做什么"
    ]
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}


4.8.16 前旧版接口:

{{< tabs tabTotal="3" >}} {{< tab tabName="请求示例" >}} {{< markdownify >}}

curl --location --request POST 'http://localhost:3000/api/core/ai/agent/createQuestionGuide' \
--header 'Authorization: Bearer {{apikey}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "messages":[
        {
            "role": "user",
            "content": "你好"
        },
        {
            "role": "assistant",
            "content": "你好!有什么我可以帮助你的吗?"
        }
    ]
}'

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="参数说明" >}} {{< markdownify >}}

{{% alert icon=" " context="success" %}}

  • messages - 对话消息,提供给 AI 的消息记录 {{% /alert %}}

{{< /markdownify >}} {{< /tab >}}

{{< tab tabName="响应示例" >}} {{< markdownify >}}

{
    "code": 200,
    "statusText": "",
    "message": "",
    "data": [
        "你对AI有什么看法",
        "想了解AI的应用吗",
        "你希望AI能做什么"
    ]
}

{{< /markdownify >}} {{< /tab >}} {{< /tabs >}}