eino icon indicating copy to clipboard operation
eino copied to clipboard

从JSON动态生成工作流的实现

Open jundaychan opened this issue 9 months ago • 15 comments

可以做一个类似于langflow或者bisheng/dify这样的工具,可以根据json还原一个动态的工作流,这样到了话比较容易打通flowgram.ai,实现类似于coze的效果,或者有更好思路吗?

jundaychan avatar Mar 23 '25 05:03 jundaychan

这个功能目前正在探索中

meguminnnnnnnnn avatar Mar 24 '25 02:03 meguminnnnnnnnn

该功能目前正在探索中

有计划开发实现吗,我们能贡献什么?

jundaychan avatar Mar 24 '25 09:03 jundaychan

目前我们在尝试自定义一套DSL、以及从DSL中构建Graph/Workflow的能力。

从某个通用DSL中构建Chain/Graph/Workflow我觉得是比较有意义的,短期内我们应该也没有精力做这一部分。

meguminnnnnnnnn avatar Mar 24 '25 09:03 meguminnnnnnnnn

目前我们在尝试自定义一套DSL、以及从DSL中构建Graph/Workflow的能力。

从某个通用DSL中构建Chain/Graph/Workflow我觉得是比较有意义的,短期内我们应该也没有精力做这一部分。

我也有这样的需求,正常尝试使用 Dify 的 DSL 定义

zhixiongdu027 avatar Apr 11 '25 02:04 zhixiongdu027

目前我们在尝试自定义一套DSL、以及从DSL中构建Graph/Workflow的能力。 从某个通用DSL中构建Chain/Graph/Workflow我觉得是比较有意义的,短期内我们应该也没有精力做这一部分。

我也有这样的需求,正常尝试使用 Dify 的 DSL 定义

你们正在尝试吗,可以一起联合开发的

jundaychan avatar Apr 11 '25 12:04 jundaychan

如果是人员精力不够,可以一起来做这个事情,刚好对这部分也有这方面需求

tinkermend avatar Apr 15 '25 03:04 tinkermend

@tinkermend 可以的,有需要我们可以开放个群聊

目前在飞书群里有个祝好大佬做了个示例: func CreateEngine(cfg *parser.Config) (*Engine, error) { var err error e := &Engine{} e.ctx = context.Background() e.mcps = make(map[string]types.IMcpServer) e.tools = make(map[string][]*schema.ToolInfo) e.models = make(map[string]model.ChatModel) e.g = compose.NewGraphmap[string]any, *schema.Message

for _, mcpCfg := range cfg.McpServers {
	fmt.Println("mcpCfg: ", mcpCfg.Name)
	switch mcpCfg.Type {
	case "SSEServer":
		server, err := components.CreateMcpSSEServer(&mcpCfg)
		if err != nil {
			return nil, err
		}
		e.mcps[mcpCfg.Name] = server
	}
}

for _, nodeCfg := range cfg.Nodes {
	fmt.Println("CreateEngine: ", nodeCfg.Name)
	switch nodeCfg.Type {
	case "ChatTemplate":
		err := e.CreateChatTemplateNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "McpTemplate":
		err := e.CreateMcpTemplateNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "ChatModel":
		err := e.CreateChatModelNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "McpToolNode":
		err := e.CreateMcpToolNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "OllamaChatModel":
		err := e.CreateOllamaChatModelNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "QwenChatModel":
		err := e.CreateQwenChatModelNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	}
}

for _, edgeCfg := range cfg.Edges {
	fmt.Printf("CreateEdge: %s -> %s\n", edgeCfg.Src, edgeCfg.Dst)
	err = e.BindTools(edgeCfg.Src, edgeCfg.Dst)
	if err != nil {
		return nil, err
	}
	err = e.g.AddEdge(edgeCfg.Src, edgeCfg.Dst)
	if err != nil {
		return nil, err
	}
}

e.r, err = e.g.Compile(e.ctx, compose.WithMaxRunSteps(10))
if err != nil {
	return nil, err
}

return e, nil

}

jundaychan avatar Apr 18 '25 07:04 jundaychan

@tinkermend 可以的,有需要我们可以开放个群聊

目前在飞书群里有个祝好大佬做了个示例: func CreateEngine(cfg *parser.Config) (*Engine, error) { var err error e := &Engine{} e.ctx = context.Background() e.mcps = make(map[string]types.IMcpServer) e.tools = make(map[string][]*schema.ToolInfo) e.models = make(map[string]model.ChatModel) e.g = compose.NewGraphmap[string]any, *schema.Message

for _, mcpCfg := range cfg.McpServers {
	fmt.Println("mcpCfg: ", mcpCfg.Name)
	switch mcpCfg.Type {
	case "SSEServer":
		server, err := components.CreateMcpSSEServer(&mcpCfg)
		if err != nil {
			return nil, err
		}
		e.mcps[mcpCfg.Name] = server
	}
}

for _, nodeCfg := range cfg.Nodes {
	fmt.Println("CreateEngine: ", nodeCfg.Name)
	switch nodeCfg.Type {
	case "ChatTemplate":
		err := e.CreateChatTemplateNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "McpTemplate":
		err := e.CreateMcpTemplateNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "ChatModel":
		err := e.CreateChatModelNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "McpToolNode":
		err := e.CreateMcpToolNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "OllamaChatModel":
		err := e.CreateOllamaChatModelNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	case "QwenChatModel":
		err := e.CreateQwenChatModelNode(&nodeCfg)
		if err != nil {
			return nil, err
		}
	}
}

for _, edgeCfg := range cfg.Edges {
	fmt.Printf("CreateEdge: %s -> %s\n", edgeCfg.Src, edgeCfg.Dst)
	err = e.BindTools(edgeCfg.Src, edgeCfg.Dst)
	if err != nil {
		return nil, err
	}
	err = e.g.AddEdge(edgeCfg.Src, edgeCfg.Dst)
	if err != nil {
		return nil, err
	}
}

e.r, err = e.g.Compile(e.ctx, compose.WithMaxRunSteps(10))
if err != nil {
	return nil, err
}

return e, nil

}

[[Node]] type = "ChatTemplate" name = "prompt" server = "Amap" system_message = "你是一名导游。" history=true

#[[Node]] #type = "OllamaChatModel" #name = "chatmodel-tool" #base_url = "http://localhost:11434/" #model = "qwq"

[[Node]] type = "McpToolNode" name = "amap_tools" server = "Amap"

[[Node]] type = "OllamaChatModel" name = "ollama-llm" base_url = "http://localhost:11434/" model = "qwq"

[[Node]] type = "QwenChatModel" name = "chatmodel-tool" base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1" api_key = "" model = "qwen2.5-vl-32b-instruct"

[[Edge]] src = "start" dst = "prompt"

[[Edge]] src = "prompt" dst = "chatmodel-tool"

[[Edge]] src = "chatmodel-tool" dst = "amap_tools"

[[Edge]] src = "amap_tools" dst = "ollama-llm"

#[[Edge]] #src = "chatmodel-tool" #dst = "end"

[[Edge]] src = "ollama-llm" dst = "end"

[[McpServer]] type = "SSEServer" name = "Amap" server_url="https://mcp.amap.com/sse?key="

jundaychan avatar Apr 18 '25 07:04 jundaychan

https://gitee.com/ByteDance/flowgram.ai 你们不是一家的吗

fykyx521 avatar May 12 '25 04:05 fykyx521

这个是 ts 的可视化搭建。 eino 是 golang 的全码开发

meguminnnnnnnnn avatar May 12 '25 04:05 meguminnnnnnnnn

我们也有这个需求,目前是我自己简单写的demo,用 Eino的调试器生成的 scheme.json 去动态生成graph,但是变量赋值这块还没有想到怎么实现好

FamousMai avatar May 24 '25 01:05 FamousMai

我们也有这个需求,目前是我自己简单写的demo,用 Eino的调试器生成的 scheme.json 去动态生成graph,但是变量赋值这块还没有想到怎么实现好

调试器会生成sceme 呀,可以的

jundaychan avatar May 24 '25 01:05 jundaychan

我们也有这个需求,目前是我自己简单写的demo,用 Eino的调试器生成的 scheme.json 去动态生成graph,但是变量赋值这块还没有想到怎么实现好

调试器会生成sceme 呀,可以的

会啊,还能生成对应代码啊

FamousMai avatar May 24 '25 01:05 FamousMai

coze开源了,这部分有了吧

zhushaodong-tal avatar Oct 14 '25 08:10 zhushaodong-tal

嘿,有关于实现这个功能的交流群吗

aonoa avatar Oct 30 '25 12:10 aonoa