Skip to content

Commit 71ecd7d

Browse files
committed
feat: Add message and text conversion blocks for workflow system
1 parent dae8a75 commit 71ecd7d

File tree

4 files changed

+88
-8
lines changed

4 files changed

+88
-8
lines changed

framework/workflow/implementations/blocks/im/messages.py

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from framework.im.adapter import IMAdapter
55
from framework.im.manager import IMManager
6-
from framework.im.message import IMMessage
6+
from framework.im.message import IMMessage, MessageElement, TextMessage
77
from framework.im.sender import ChatSender
88
from framework.ioc.container import DependencyContainer
99
from framework.workflow.core.block import Block, Input, Output, ParamMeta
@@ -53,9 +53,58 @@ def execute(
5353
if not self.im_name:
5454
adapter = self.container.resolve(IMAdapter)
5555
else:
56-
adapter = self.container.resolve(IMManager).get_adapter(self.im_name)
56+
adapter = self.container.resolve(
57+
IMManager).get_adapter(self.im_name)
5758
loop: asyncio.AbstractEventLoop = self.container.resolve(
5859
asyncio.AbstractEventLoop
5960
)
6061
loop.create_task(adapter.send_message(msg, target or src_msg.sender))
6162
# return {"ok": True}
63+
64+
# IMMessage 转纯文本
65+
66+
67+
class IMMessageToText(Block):
68+
"""IMMessage 转纯文本"""
69+
70+
name = "im_message_to_text"
71+
container: DependencyContainer
72+
inputs = {"msg": Input("msg", "IM 消息", IMMessage, "IM 消息")}
73+
outputs = {"text": Output("text", "纯文本", str, "纯文本")}
74+
75+
def execute(self, msg: IMMessage) -> Dict[str, Any]:
76+
return {"text": msg.content}
77+
78+
79+
# 纯文本转 IMMessage
80+
class TextToIMMessage(Block):
81+
"""纯文本转 IMMessage"""
82+
83+
name = "text_to_im_message"
84+
container: DependencyContainer
85+
inputs = {"text": Input("text", "纯文本", str, "纯文本")}
86+
outputs = {"msg": Output("msg", "IM 消息", IMMessage, "IM 消息")}
87+
88+
def __init__(self, split_by: Annotated[Optional[str], ParamMeta(label="分段符")] = None):
89+
self.split_by = split_by
90+
91+
def execute(self, text: str) -> Dict[str, Any]:
92+
if self.split_by:
93+
return {"msg": IMMessage(sender=ChatSender.get_bot_sender(), message_elements=[TextMessage(line) for line in text.split(self.split_by)])}
94+
else:
95+
return {"msg": IMMessage(sender=ChatSender.get_bot_sender(), message_elements=[TextMessage(text)])}
96+
97+
# 补充 IMMessage 消息
98+
class AppendIMMessage(Block):
99+
"""补充 IMMessage 消息"""
100+
101+
name = "concat_im_message"
102+
container: DependencyContainer
103+
inputs = {
104+
"base_msg": Input("base_msg", "IM 消息", IMMessage, "IM 消息"),
105+
"append_msg": Input("append_msg", "新消息片段", MessageElement, "新消息片段"),
106+
}
107+
outputs = {"msg": Output("msg", "IM 消息", IMMessage, "IM 消息")}
108+
109+
def execute(self, base_msg: IMMessage, append_msg: MessageElement) -> Dict[str, Any]:
110+
return {"msg": IMMessage(sender=base_msg.sender, message_elements=base_msg.message_elements + [append_msg])}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
# LLM 响应转纯文本
3+
from typing import Any, Dict
4+
5+
from framework.ioc.container import DependencyContainer
6+
from framework.llm.format.response import LLMChatResponse
7+
from framework.workflow.core.block.base import Block
8+
from framework.workflow.core.block.input_output import Input, Output
9+
10+
11+
class LLMResponseToText(Block):
12+
"""LLM 响应转纯文本"""
13+
14+
name = "llm_response_to_text"
15+
container: DependencyContainer
16+
inputs = {"response": Input("response", "LLM 响应", LLMChatResponse, "LLM 响应")}
17+
outputs = {"text": Output("text", "纯文本", str, "纯文本")}
18+
19+
def execute(self, response: LLMChatResponse) -> Dict[str, Any]:
20+
content = ""
21+
if response.choices and response.choices[0].message:
22+
content = content +response.choices[0].message.content
23+
24+
return {"text": content}
25+

framework/workflow/implementations/blocks/system/basic.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,13 @@ def __init__(
6161
):
6262
self.regex = regex
6363

64-
def execute(self) -> Dict[str, Any]:
64+
def execute(self, text: str) -> Dict[str, Any]:
6565
# 使用正则表达式提取文本
66-
regex = re.compile(self.regex.value)
67-
match = regex.search(self.text.value)
68-
if match:
69-
return {"text": match.group(0)}
66+
regex = re.compile(self.regex)
67+
match = regex.search(text)
68+
# 如果匹配到,则返回匹配到的文本,否则返回空字符串
69+
if match and len(match.groups()) > 0:
70+
return {"text": match.group(1)}
7071
else:
7172
return {"text": ""}
7273

framework/workflow/implementations/blocks/system_blocks.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from framework.workflow.core.block.registry import BlockRegistry
22
from framework.workflow.implementations.blocks.im.basic import ExtractChatSender
3+
from framework.workflow.implementations.blocks.llm.basic import LLMResponseToText
34
from framework.workflow.implementations.blocks.llm.image import SimpleStableDiffusionWebUI
45
from framework.workflow.implementations.blocks.memory.clear_memory import ClearMemory
56
from framework.workflow.implementations.blocks.system.basic import (TextBlock, TextConcatBlock, TextExtractByRegexBlock,
67
TextReplaceBlock)
78

89
from .game.dice import DiceRoll
910
from .game.gacha import GachaSimulator
10-
from .im.messages import GetIMMessage, SendIMMessage
11+
from .im.messages import AppendIMMessage, GetIMMessage, IMMessageToText, SendIMMessage, TextToIMMessage
1112
from .im.states import ToggleEditState
1213
from .llm.chat import ChatCompletion, ChatMessageConstructor, ChatResponseConverter
1314
from .memory.chat_memory import ChatMemoryQuery, ChatMemoryStore
@@ -31,6 +32,9 @@ def register_system_blocks(registry: BlockRegistry):
3132
registry.register(
3233
"extract_chat_sender", "internal", ExtractChatSender, "IM: 提取消息发送者"
3334
)
35+
registry.register("append_im_message", "internal", AppendIMMessage, "IM: 补充消息")
36+
registry.register("im_message_to_text", "internal", IMMessageToText, "IM: 消息转文本")
37+
registry.register("text_to_im_message", "internal", TextToIMMessage, "文本: 文本转消息")
3438

3539
# LLM 相关 blocks
3640
registry.register("chat_memory_query", "internal", ChatMemoryQuery, "LLM: 查询记忆")
@@ -48,6 +52,7 @@ def register_system_blocks(registry: BlockRegistry):
4852
"LLM->IM: 转换消息",
4953
)
5054
registry.register("chat_memory_store", "internal", ChatMemoryStore, "LLM: 存储记忆")
55+
registry.register("llm_response_to_text", "internal", LLMResponseToText, "LLM: 响应转文本")
5156

5257
# 画图相关 blocks
5358
registry.register(

0 commit comments

Comments
 (0)