Dalle3 绘图

使用 HTTP 模块绘制图片

Dalle3 绘图 - 图1Dalle3 绘图 - 图2

OpenAI Dalle3 接口

先来看下官方接口的参数和响应值:

Body

  1. {
  2. "model": "dall-e-3",
  3. "prompt": "A cute baby sea otter",
  4. "n": 1,
  5. "size": "1024x1024"
  6. }

Response

  1. {
  2. "created": 1589478378,
  3. "data": [
  4. {
  5. "url": "https://..."
  6. },
  7. {
  8. "url": "https://..."
  9. }
  10. ]
  11. }

编排思路

  1. 通过 AI 来优化图片绘制的提示词(这步省略了,自己找提示词即可)
  2. 通过 【HTTP 请求】模块 调用 Dalle3 接口,获取图片的 URL。
  3. 通过 【文本加工】模块 来构建 Markdown 的图片格式。
  4. 通过 【指定回复】模块 来直接输出图片链接。

1. 构建 HTTP 模块

请求参数直接复制 Dalle3 接口的即可,并求改 prompt 为变量。需要增加一个 Headers.Authorization

Body:

  1. {
  2. "model": "dall-e-3",
  3. "prompt": "{{prompt}}",
  4. "n": 1,
  5. "size": "1024x1024"
  6. }

Headers:

Authorization: Bearer sk-xxx

Response:

响应值需要根据 Dalle3 接口的返回值进行获取,我们只绘制了1张图片,所以只需要取第一张图片的 URL 即可。给 HTTP 模块增加一个自定义输出 data[0].url

2. 文本加工 - 构建图片链接

Markdown 语法中 ![图片描述](图片链接) 表示插入图片,图片链接由【HTTP 请求】模块输出。

因此可以增加一个输入来接收 【HTTP 请求】模块 的图片链接输出,并在 【文本加工】模块 - 文本 中通过变量来引用图片链接,从而得到一个完整的 Markdown 图片格式。

3. 指定回复

指定回复可以直接输出传入的内容到客户端,因此可以直接输出加工好的 Markdown 图片格式即可。

编排代码

编排配置

  1. {
  2. "nodes": [
  3. {
  4. "nodeId": "userGuide",
  5. "name": "系统配置",
  6. "intro": "可以配置应用的系统参数",
  7. "avatar": "/imgs/workflow/userGuide.png",
  8. "flowNodeType": "userGuide",
  9. "position": {
  10. "x": 531.2422736065552,
  11. "y": -486.7611729549753
  12. },
  13. "inputs": [
  14. {
  15. "key": "welcomeText",
  16. "renderTypeList": [
  17. "hidden"
  18. ],
  19. "valueType": "string",
  20. "label": "core.app.Welcome Text",
  21. "value": ""
  22. },
  23. {
  24. "key": "variables",
  25. "renderTypeList": [
  26. "hidden"
  27. ],
  28. "valueType": "any",
  29. "label": "core.app.Chat Variable",
  30. "value": []
  31. },
  32. {
  33. "key": "questionGuide",
  34. "valueType": "boolean",
  35. "renderTypeList": [
  36. "hidden"
  37. ],
  38. "label": "core.app.Question Guide",
  39. "value": false
  40. },
  41. {
  42. "key": "tts",
  43. "renderTypeList": [
  44. "hidden"
  45. ],
  46. "valueType": "any",
  47. "label": "",
  48. "value": {
  49. "type": "web"
  50. }
  51. },
  52. {
  53. "key": "whisper",
  54. "renderTypeList": [
  55. "hidden"
  56. ],
  57. "valueType": "any",
  58. "label": "",
  59. "value": {
  60. "open": false,
  61. "autoSend": false,
  62. "autoTTSResponse": false
  63. }
  64. },
  65. {
  66. "key": "scheduleTrigger",
  67. "renderTypeList": [
  68. "hidden"
  69. ],
  70. "valueType": "any",
  71. "label": "",
  72. "value": null
  73. }
  74. ],
  75. "outputs": []
  76. },
  77. {
  78. "nodeId": "448745",
  79. "name": "流程开始",
  80. "intro": "",
  81. "avatar": "/imgs/workflow/userChatInput.svg",
  82. "flowNodeType": "workflowStart",
  83. "position": {
  84. "x": 532.1275542407774,
  85. "y": 46.03775600322817
  86. },
  87. "inputs": [
  88. {
  89. "key": "userChatInput",
  90. "renderTypeList": [
  91. "reference",
  92. "textarea"
  93. ],
  94. "valueType": "string",
  95. "label": "用户问题",
  96. "required": true,
  97. "toolDescription": "用户问题"
  98. }
  99. ],
  100. "outputs": [
  101. {
  102. "id": "userChatInput",
  103. "key": "userChatInput",
  104. "label": "core.module.input.label.user question",
  105. "valueType": "string",
  106. "type": "static"
  107. }
  108. ]
  109. },
  110. {
  111. "nodeId": "tMyUnRL5jIrC",
  112. "name": "HTTP 请求",
  113. "intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)",
  114. "avatar": "/imgs/workflow/http.png",
  115. "flowNodeType": "httpRequest468",
  116. "showStatus": true,
  117. "position": {
  118. "x": 921.2377506442713,
  119. "y": -483.94114977914256
  120. },
  121. "inputs": [
  122. {
  123. "key": "system_addInputParam",
  124. "renderTypeList": [
  125. "addInputParam"
  126. ],
  127. "valueType": "dynamic",
  128. "label": "",
  129. "required": false,
  130. "description": "core.module.input.description.HTTP Dynamic Input",
  131. "editField": {
  132. "key": true,
  133. "valueType": true
  134. }
  135. },
  136. {
  137. "key": "prompt",
  138. "valueType": "string",
  139. "label": "prompt",
  140. "renderTypeList": [
  141. "reference"
  142. ],
  143. "description": "",
  144. "canEdit": true,
  145. "editField": {
  146. "key": true,
  147. "valueType": true
  148. },
  149. "value": [
  150. "448745",
  151. "userChatInput"
  152. ]
  153. },
  154. {
  155. "key": "system_httpMethod",
  156. "renderTypeList": [
  157. "custom"
  158. ],
  159. "valueType": "string",
  160. "label": "",
  161. "value": "POST",
  162. "required": true
  163. },
  164. {
  165. "key": "system_httpReqUrl",
  166. "renderTypeList": [
  167. "hidden"
  168. ],
  169. "valueType": "string",
  170. "label": "",
  171. "description": "core.module.input.description.Http Request Url",
  172. "placeholder": "https://api.ai.com/getInventory",
  173. "required": false,
  174. "value": "https://api.openai.com/v1/images/generations"
  175. },
  176. {
  177. "key": "system_httpHeader",
  178. "renderTypeList": [
  179. "custom"
  180. ],
  181. "valueType": "any",
  182. "value": [
  183. {
  184. "key": "Authorization",
  185. "type": "string",
  186. "value": "Bearer sk-zsfBsxEU3ApSFGYxF4CdB97e9556412588421823371b9f7b"
  187. }
  188. ],
  189. "label": "",
  190. "description": "core.module.input.description.Http Request Header",
  191. "placeholder": "core.module.input.description.Http Request Header",
  192. "required": false
  193. },
  194. {
  195. "key": "system_httpParams",
  196. "renderTypeList": [
  197. "hidden"
  198. ],
  199. "valueType": "any",
  200. "value": [],
  201. "label": "",
  202. "required": false
  203. },
  204. {
  205. "key": "system_httpJsonBody",
  206. "renderTypeList": [
  207. "hidden"
  208. ],
  209. "valueType": "any",
  210. "value": "{\n \"model\": \"dall-e-3\",\n \"prompt\": \"{{prompt}}\",\n \"n\": 1,\n \"size\": \"1024x1024\"\n}",
  211. "label": "",
  212. "required": false
  213. }
  214. ],
  215. "outputs": [
  216. {
  217. "id": "system_addOutputParam",
  218. "key": "system_addOutputParam",
  219. "type": "dynamic",
  220. "valueType": "dynamic",
  221. "label": "",
  222. "editField": {
  223. "key": true,
  224. "valueType": true
  225. }
  226. },
  227. {
  228. "id": "httpRawResponse",
  229. "key": "httpRawResponse",
  230. "label": "原始响应",
  231. "description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
  232. "valueType": "any",
  233. "type": "static"
  234. },
  235. {
  236. "id": "DeKGGioBwaMf",
  237. "type": "dynamic",
  238. "key": "data[0].url",
  239. "valueType": "string",
  240. "label": "data[0].url"
  241. }
  242. ]
  243. },
  244. {
  245. "nodeId": "CO3POL8svbbi",
  246. "name": "文本加工",
  247. "intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。",
  248. "avatar": "/imgs/workflow/textEditor.svg",
  249. "flowNodeType": "pluginModule",
  250. "showStatus": false,
  251. "position": {
  252. "x": 1417.5940290051137,
  253. "y": -478.81889618104356
  254. },
  255. "inputs": [
  256. {
  257. "key": "system_addInputParam",
  258. "valueType": "dynamic",
  259. "label": "动态外部数据",
  260. "renderTypeList": [
  261. "addInputParam"
  262. ],
  263. "required": false,
  264. "description": "",
  265. "canEdit": false,
  266. "value": "",
  267. "editField": {
  268. "key": true
  269. },
  270. "dynamicParamDefaultValue": {
  271. "inputType": "reference",
  272. "valueType": "string",
  273. "required": true
  274. }
  275. },
  276. {
  277. "key": "url",
  278. "valueType": "string",
  279. "label": "url",
  280. "renderTypeList": [
  281. "reference"
  282. ],
  283. "required": true,
  284. "description": "",
  285. "canEdit": true,
  286. "editField": {
  287. "key": true
  288. },
  289. "value": [
  290. "tMyUnRL5jIrC",
  291. "DeKGGioBwaMf"
  292. ]
  293. },
  294. {
  295. "key": "文本",
  296. "valueType": "string",
  297. "label": "文本",
  298. "renderTypeList": [
  299. "textarea"
  300. ],
  301. "required": true,
  302. "description": "",
  303. "canEdit": false,
  304. "value": "![]({{url}})",
  305. "editField": {
  306. "key": true
  307. },
  308. "maxLength": "",
  309. "dynamicParamDefaultValue": {
  310. "inputType": "reference",
  311. "valueType": "string",
  312. "required": true
  313. }
  314. }
  315. ],
  316. "outputs": [
  317. {
  318. "id": "text",
  319. "type": "static",
  320. "key": "text",
  321. "valueType": "string",
  322. "label": "text",
  323. "description": ""
  324. }
  325. ],
  326. "pluginId": "community-textEditor"
  327. },
  328. {
  329. "nodeId": "7mapnCgHfKW6",
  330. "name": "指定回复",
  331. "intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
  332. "avatar": "/imgs/workflow/reply.png",
  333. "flowNodeType": "answerNode",
  334. "position": {
  335. "x": 1922.5628399315042,
  336. "y": -471.67391598231796
  337. },
  338. "inputs": [
  339. {
  340. "key": "text",
  341. "renderTypeList": [
  342. "textarea",
  343. "reference"
  344. ],
  345. "valueType": "string",
  346. "label": "core.module.input.label.Response content",
  347. "description": "core.module.input.description.Response content",
  348. "placeholder": "core.module.input.description.Response content",
  349. "selectedTypeIndex": 1,
  350. "value": [
  351. "CO3POL8svbbi",
  352. "text"
  353. ]
  354. }
  355. ],
  356. "outputs": []
  357. }
  358. ],
  359. "edges": [
  360. {
  361. "source": "448745",
  362. "target": "tMyUnRL5jIrC",
  363. "sourceHandle": "448745-source-right",
  364. "targetHandle": "tMyUnRL5jIrC-target-left"
  365. },
  366. {
  367. "source": "tMyUnRL5jIrC",
  368. "target": "CO3POL8svbbi",
  369. "sourceHandle": "tMyUnRL5jIrC-source-right",
  370. "targetHandle": "CO3POL8svbbi-target-left"
  371. },
  372. {
  373. "source": "CO3POL8svbbi",
  374. "target": "7mapnCgHfKW6",
  375. "sourceHandle": "CO3POL8svbbi-source-right",
  376. "targetHandle": "7mapnCgHfKW6-target-left"
  377. }
  378. ]
  379. }