forked from CopilotKit/CopilotKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlangchain.py
More file actions
165 lines (141 loc) · 4.77 KB
/
Copy pathlangchain.py
File metadata and controls
165 lines (141 loc) · 4.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
"""
LangChain specific utilities for CopilotKit
"""
import uuid
import json
from typing import List, Optional, Any, Union, Dict, Callable
from langchain_core.messages import (
HumanMessage,
SystemMessage,
BaseMessage,
AIMessage,
ToolMessage
)
from langchain_core.runnables import RunnableConfig
from langchain_core.callbacks.manager import adispatch_custom_event
from .types import Message, IntermediateStateConfig
def copilotkit_messages_to_langchain(
use_function_call: bool = False
) -> Callable[[List[Message]], List[BaseMessage]]:
"""
Convert CopilotKit messages to LangChain messages
"""
def _copilotkit_messages_to_langchain(messages: List[Message]) -> List[BaseMessage]:
result = []
for message in messages:
if "content" in message:
if message["role"] == "user":
result.append(HumanMessage(content=message["content"], id=message["id"]))
elif message["role"] == "system":
result.append(SystemMessage(content=message["content"], id=message["id"]))
elif message["role"] == "assistant":
result.append(AIMessage(content=message["content"], id=message["id"]))
elif "arguments" in message:
tool_call = {
"name": message["name"],
"args": message["arguments"],
"id": message["id"],
}
additional_kwargs = {
'function_call':{
'name': message["name"],
'arguments': json.dumps(message["arguments"]),
}
}
if not use_function_call:
ai_message = AIMessage(
id=message["id"],
content="",
tool_calls=[tool_call]
)
else:
ai_message = AIMessage(
id=message["id"],
content="",
additional_kwargs=additional_kwargs
)
result.append(ai_message)
elif "actionExecutionId" in message:
result.append(ToolMessage(
id=message["id"],
content=message["result"],
name=message["actionName"],
tool_call_id=message["actionExecutionId"]
))
return result
return _copilotkit_messages_to_langchain
def copilotkit_customize_config(
base_config: Optional[RunnableConfig] = None,
*,
emit_tool_calls: Optional[Union[bool, str, List[str]]] = None,
emit_messages: Optional[bool] = None,
emit_all: Optional[bool] = None,
emit_intermediate_state: Optional[List[IntermediateStateConfig]] = None
) -> RunnableConfig:
"""
Configure for LangChain for use in CopilotKit
"""
metadata = base_config.get("metadata", {}) if base_config else {}
if emit_all is True:
metadata["copilotkit:emit-tool-calls"] = True
metadata["copilotkit:emit-messages"] = True
else:
if emit_tool_calls is not None:
metadata["copilotkit:emit-tool-calls"] = emit_tool_calls
if emit_messages is not None:
metadata["copilotkit:emit-messages"] = emit_messages
if emit_intermediate_state:
metadata["copilotkit:emit-intermediate-state"] = emit_intermediate_state
base_config = base_config or {}
return {
**base_config,
"metadata": metadata
}
async def copilotkit_exit(config: RunnableConfig):
"""
Exit CopilotKit
"""
await adispatch_custom_event(
"copilotkit_exit",
{},
config=config,
)
return True
async def copilotkit_emit_state(config: RunnableConfig, state: Any):
"""
Emit CopilotKit state
"""
await adispatch_custom_event(
"copilotkit_manually_emit_intermediate_state",
state,
config=config,
)
return True
async def copilotkit_emit_message(config: RunnableConfig, message: str):
"""
Emit CopilotKit message
"""
await adispatch_custom_event(
"copilotkit_manually_emit_message",
{
"message": message,
"message_id": str(uuid.uuid4()),
"role": "assistant"
},
config=config,
)
return True
async def copilotkit_emit_tool_call(config: RunnableConfig, *, name: str, args: Dict[str, Any]):
"""
Emit CopilotKit tool call
"""
await adispatch_custom_event(
"copilotkit_manually_emit_tool_call",
{
"name": name,
"args": args,
"id": str(uuid.uuid4())
},
config=config,
)
return True