跳到主要内容

API 服务

简介

通过 HTTP 请求触发流程的执行,并可携带参数。

调用方式

批处理

请求

POST /share/api/v1/graphx/flow/run

请求参数

名称类型是否必需描述
flow_idstring流程 ID
messagesarray会话消息
paramsobject安插在流程节点里的参数

响应

名称类型描述
dataarray流程执行后的所有结果

示例

curl -X POST \
http://localhost:8080/share/api/v1/graphx/flow/run \
-H 'Content-Type: application/json' \
-d '{
"flow_id": "CE84E6E9-5E2D-5457-99B4-9835F274D8AC",
"params": {},
"messages": [{"role": "user", "content": "张三,90"}]
}'

响应示例

{"data": ["{\"name\": \"张三\",  \"age\": 90,  \"company\": \"\"}"]}

流处理

流处理与批处理使用同样的 API,不同的是客户端需要采用 SSE (Server-Sent Events)方式接收数据。并且在流程中的智能体节点有开启流输出配置。

示例

import { fetchEventSource } from "@microsoft/fetch-event-source";
const body = {
flow_id: "a796bfbd-e94b-4a55-84f5-fce69ee35157",
messages: _.concat(JSON.parse(history), [{ role: "user", content: prompt }]),
params: {},
};
await fetchEventSource("http://localhost:8080/share/api/v1/graphx/flow/run", {
method: "POST",
body: JSON.stringify(body),
openWhenHidden: true,
headers: {
"Content-Type": "application/json",
},
onmessage: (event: any) => {
// 将解析后的数据添加到流中
// 删除前导 data: 标记
let msg = event.data.replaceAll("data: ", "");
// 替换第一个空格
msg = msg.replace(/^\s/, "");
if (msg.startsWith("@__Result__: ")) {
// do data
const result = JSON.parse(msg.replace("@__Result__: ", ""));
console.log(result);
} else {
observer.next(event.data);
}
},
onerror: (err: any) => {
// 连接错误处理
observer.error(new Error(err));
throw err;
},
onclose: () => {
// 连接已关闭
observer.complete();
},
});
提示

与批处理不同,流输出的最后一行是 @__Result__: + datadata 与批处理返回的 data 一致。 通过处理 @__Result__: 标记获取流程返回的数据。

data 内容

{"data": ["{\"name\": \"张三\",  \"age\": 90,  \"company\": \"\"}"]}

视觉模型消息格式

OpenAI 兼容

messages = [{
"role":"user",
"content": [
{
"type": "text", "text": "describe the weather in this image"},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_data}"},
},
]
}]

Ollama 当前只支持图片Base64编码,尚不支持URL模式,了解最新Ollama OpenAI兼容

如果使用 MaaS 请参考对应官方文档。

因而,NGraphX 在消息校验时发现URL是HTTP(S)开头则忽略,否则根据文件类型,自动进行编码处理,比如PDF先转PNG再进行Base64编码,此情况下文件存储于默认位置,如果不是则需要通过插件扩展自定义返回Python文件对象。