langroid 0.33.10__py3-none-any.whl → 0.33.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- langroid/agent/base.py +5 -0
- langroid/agent/callbacks/chainlit.py +5 -4
- langroid/agent/chat_agent.py +12 -8
- langroid/agent/task.py +9 -2
- langroid/language_models/__init__.py +2 -0
- langroid/language_models/base.py +8 -0
- langroid/language_models/openai_gpt.py +17 -10
- {langroid-0.33.10.dist-info → langroid-0.33.12.dist-info}/METADATA +1 -1
- {langroid-0.33.10.dist-info → langroid-0.33.12.dist-info}/RECORD +11 -11
- {langroid-0.33.10.dist-info → langroid-0.33.12.dist-info}/WHEEL +0 -0
- {langroid-0.33.10.dist-info → langroid-0.33.12.dist-info}/licenses/LICENSE +0 -0
langroid/agent/base.py
CHANGED
@@ -1039,6 +1039,11 @@ class Agent(ABC):
|
|
1039
1039
|
"""
|
1040
1040
|
if msg is None:
|
1041
1041
|
return False
|
1042
|
+
if isinstance(msg, ChatDocument):
|
1043
|
+
if len(msg.tool_messages) > 0:
|
1044
|
+
return True
|
1045
|
+
if msg.metadata.sender != Entity.LLM:
|
1046
|
+
return False
|
1042
1047
|
try:
|
1043
1048
|
tools = self.get_tool_messages(msg)
|
1044
1049
|
return len(tools) > 0
|
@@ -20,6 +20,7 @@ from chainlit.logger import logger
|
|
20
20
|
|
21
21
|
import langroid as lr
|
22
22
|
import langroid.language_models as lm
|
23
|
+
from langroid.language_models import StreamEventType
|
23
24
|
from langroid.utils.configuration import settings
|
24
25
|
from langroid.utils.constants import NO_ANSWER
|
25
26
|
|
@@ -276,7 +277,7 @@ class ChainlitAgentCallbacks:
|
|
276
277
|
def get_last_step(self) -> Optional[cl.Step]:
|
277
278
|
return self.last_step
|
278
279
|
|
279
|
-
def start_llm_stream(self) -> Callable[[str], None]:
|
280
|
+
def start_llm_stream(self) -> Callable[[str, StreamEventType], None]:
|
280
281
|
"""Returns a streaming fn that can be passed to the LLM class"""
|
281
282
|
self.stream = cl.Message(
|
282
283
|
content="",
|
@@ -295,14 +296,14 @@ class ChainlitAgentCallbacks:
|
|
295
296
|
"""
|
296
297
|
)
|
297
298
|
|
298
|
-
def stream_token(t: str) -> None:
|
299
|
+
def stream_token(t: str, e: StreamEventType) -> None:
|
299
300
|
if self.stream is None:
|
300
301
|
raise ValueError("Stream not initialized")
|
301
302
|
run_sync(self.stream.stream_token(t))
|
302
303
|
|
303
304
|
return stream_token
|
304
305
|
|
305
|
-
async def start_llm_stream_async(self) -> Callable[[str], None]:
|
306
|
+
async def start_llm_stream_async(self) -> Callable[[str, StreamEventType], None]:
|
306
307
|
"""Returns a streaming fn that can be passed to the LLM class"""
|
307
308
|
self.stream = cl.Message(
|
308
309
|
content="",
|
@@ -321,7 +322,7 @@ class ChainlitAgentCallbacks:
|
|
321
322
|
"""
|
322
323
|
)
|
323
324
|
|
324
|
-
async def stream_token(t: str) -> None:
|
325
|
+
async def stream_token(t: str, e: StreamEventType) -> None:
|
325
326
|
if self.stream is None:
|
326
327
|
raise ValueError("Stream not initialized")
|
327
328
|
await self.stream.stream_token(t)
|
langroid/agent/chat_agent.py
CHANGED
@@ -1063,18 +1063,20 @@ class ChatAgent(Agent):
|
|
1063
1063
|
|
1064
1064
|
return tools
|
1065
1065
|
|
1066
|
-
def _get_any_tool_message(self, optional: bool = True) -> type[ToolMessage]:
|
1066
|
+
def _get_any_tool_message(self, optional: bool = True) -> type[ToolMessage] | None:
|
1067
1067
|
"""
|
1068
1068
|
Returns a `ToolMessage` which wraps all enabled tools, excluding those
|
1069
1069
|
where strict recovery is disabled. Used in strict recovery.
|
1070
1070
|
"""
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1071
|
+
possible_tools = tuple(
|
1072
|
+
self.llm_tools_map[t]
|
1073
|
+
for t in self.llm_tools_usable
|
1074
|
+
if t not in self.disable_strict_tools_set
|
1075
|
+
)
|
1076
|
+
if len(possible_tools) == 0:
|
1077
|
+
return None
|
1078
|
+
any_tool_type = Union.__getitem__(possible_tools) # type ignore
|
1079
|
+
|
1078
1080
|
maybe_optional_type = Optional[any_tool_type] if optional else any_tool_type
|
1079
1081
|
|
1080
1082
|
class AnyTool(ToolMessage):
|
@@ -1225,6 +1227,8 @@ class ChatAgent(Agent):
|
|
1225
1227
|
and self.config.strict_recovery
|
1226
1228
|
):
|
1227
1229
|
AnyTool = self._get_any_tool_message()
|
1230
|
+
if AnyTool is None:
|
1231
|
+
return None
|
1228
1232
|
self.set_output_format(
|
1229
1233
|
AnyTool,
|
1230
1234
|
force_tools=True,
|
langroid/agent/task.py
CHANGED
@@ -1429,8 +1429,15 @@ class Task:
|
|
1429
1429
|
else:
|
1430
1430
|
response_fn = self._entity_responder_map[cast(Entity, e)]
|
1431
1431
|
result = response_fn(self.pending_message)
|
1432
|
-
# update result.tool_messages if any
|
1433
|
-
if
|
1432
|
+
# update result.tool_messages if any.
|
1433
|
+
# Do this only if sender is LLM, since this could be
|
1434
|
+
# a tool-call result from the Agent responder, which may
|
1435
|
+
# contain strings that look like tools, and we don't want to
|
1436
|
+
# trigger strict tool recovery due to that.
|
1437
|
+
if (
|
1438
|
+
isinstance(result, ChatDocument)
|
1439
|
+
and result.metadata.sender == Entity.LLM
|
1440
|
+
):
|
1434
1441
|
self.agent.try_get_tool_messages(result)
|
1435
1442
|
|
1436
1443
|
result_chat_doc = self.agent.to_ChatDocument(
|
@@ -6,6 +6,7 @@ from . import azure_openai
|
|
6
6
|
from . import prompt_formatter
|
7
7
|
|
8
8
|
from .base import (
|
9
|
+
StreamEventType,
|
9
10
|
LLMConfig,
|
10
11
|
LLMMessage,
|
11
12
|
LLMFunctionCall,
|
@@ -33,6 +34,7 @@ __all__ = [
|
|
33
34
|
"openai_gpt",
|
34
35
|
"azure_openai",
|
35
36
|
"prompt_formatter",
|
37
|
+
"StreamEventType",
|
36
38
|
"LLMConfig",
|
37
39
|
"LLMMessage",
|
38
40
|
"LLMFunctionCall",
|
langroid/language_models/base.py
CHANGED
@@ -42,6 +42,14 @@ ToolChoiceTypes = Literal["none", "auto", "required"]
|
|
42
42
|
ToolTypes = Literal["function"]
|
43
43
|
|
44
44
|
|
45
|
+
class StreamEventType(Enum):
|
46
|
+
TEXT = 1
|
47
|
+
FUNC_NAME = 2
|
48
|
+
FUNC_ARGS = 3
|
49
|
+
TOOL_NAME = 4
|
50
|
+
TOOL_ARGS = 5
|
51
|
+
|
52
|
+
|
45
53
|
class LLMConfig(BaseSettings):
|
46
54
|
"""
|
47
55
|
Common configuration for all language models.
|
@@ -43,6 +43,7 @@ from langroid.language_models.base import (
|
|
43
43
|
OpenAIToolCall,
|
44
44
|
OpenAIToolSpec,
|
45
45
|
Role,
|
46
|
+
StreamEventType,
|
46
47
|
ToolChoiceTypes,
|
47
48
|
)
|
48
49
|
from langroid.language_models.config import HFPromptFormatterConfig
|
@@ -875,19 +876,19 @@ class OpenAIGPT(LanguageModel):
|
|
875
876
|
completion += event_text
|
876
877
|
sys.stdout.write(Colors().GREEN + event_text)
|
877
878
|
sys.stdout.flush()
|
878
|
-
self.config.streamer(event_text)
|
879
|
+
self.config.streamer(event_text, StreamEventType.TEXT)
|
879
880
|
if event_fn_name:
|
880
881
|
function_name = event_fn_name
|
881
882
|
has_function = True
|
882
883
|
sys.stdout.write(Colors().GREEN + "FUNC: " + event_fn_name + ": ")
|
883
884
|
sys.stdout.flush()
|
884
|
-
self.config.streamer(event_fn_name)
|
885
|
+
self.config.streamer(event_fn_name, StreamEventType.FUNC_NAME)
|
885
886
|
|
886
887
|
if event_args:
|
887
888
|
function_args += event_args
|
888
889
|
sys.stdout.write(Colors().GREEN + event_args)
|
889
890
|
sys.stdout.flush()
|
890
|
-
self.config.streamer(event_args)
|
891
|
+
self.config.streamer(event_args, StreamEventType.FUNC_ARGS)
|
891
892
|
|
892
893
|
if event_tool_deltas is not None:
|
893
894
|
# print out streaming tool calls, if not async
|
@@ -898,12 +899,12 @@ class OpenAIGPT(LanguageModel):
|
|
898
899
|
Colors().GREEN + "OAI-TOOL: " + tool_fn_name + ": "
|
899
900
|
)
|
900
901
|
sys.stdout.flush()
|
901
|
-
self.config.streamer(tool_fn_name)
|
902
|
+
self.config.streamer(tool_fn_name, StreamEventType.TOOL_NAME)
|
902
903
|
if td["function"]["arguments"] != "":
|
903
904
|
tool_fn_args = td["function"]["arguments"]
|
904
905
|
sys.stdout.write(Colors().GREEN + tool_fn_args)
|
905
906
|
sys.stdout.flush()
|
906
|
-
self.config.streamer(tool_fn_args)
|
907
|
+
self.config.streamer(tool_fn_args, StreamEventType.TOOL_ARGS)
|
907
908
|
|
908
909
|
# show this delta in the stream
|
909
910
|
if finish_reason in [
|
@@ -968,21 +969,23 @@ class OpenAIGPT(LanguageModel):
|
|
968
969
|
if not silent:
|
969
970
|
sys.stdout.write(Colors().GREEN + event_text)
|
970
971
|
sys.stdout.flush()
|
971
|
-
await self.config.streamer_async(event_text)
|
972
|
+
await self.config.streamer_async(event_text, StreamEventType.TEXT)
|
972
973
|
if event_fn_name:
|
973
974
|
function_name = event_fn_name
|
974
975
|
has_function = True
|
975
976
|
if not silent:
|
976
977
|
sys.stdout.write(Colors().GREEN + "FUNC: " + event_fn_name + ": ")
|
977
978
|
sys.stdout.flush()
|
978
|
-
await self.config.streamer_async(
|
979
|
+
await self.config.streamer_async(
|
980
|
+
event_fn_name, StreamEventType.FUNC_NAME
|
981
|
+
)
|
979
982
|
|
980
983
|
if event_args:
|
981
984
|
function_args += event_args
|
982
985
|
if not silent:
|
983
986
|
sys.stdout.write(Colors().GREEN + event_args)
|
984
987
|
sys.stdout.flush()
|
985
|
-
await self.config.streamer_async(event_args)
|
988
|
+
await self.config.streamer_async(event_args, StreamEventType.FUNC_ARGS)
|
986
989
|
|
987
990
|
if event_tool_deltas is not None and not silent:
|
988
991
|
# print out streaming tool calls, if not async
|
@@ -993,12 +996,16 @@ class OpenAIGPT(LanguageModel):
|
|
993
996
|
Colors().GREEN + "OAI-TOOL: " + tool_fn_name + ": "
|
994
997
|
)
|
995
998
|
sys.stdout.flush()
|
996
|
-
await self.config.streamer_async(
|
999
|
+
await self.config.streamer_async(
|
1000
|
+
tool_fn_name, StreamEventType.TOOL_NAME
|
1001
|
+
)
|
997
1002
|
if td["function"]["arguments"] != "":
|
998
1003
|
tool_fn_args = td["function"]["arguments"]
|
999
1004
|
sys.stdout.write(Colors().GREEN + tool_fn_args)
|
1000
1005
|
sys.stdout.flush()
|
1001
|
-
await self.config.streamer_async(
|
1006
|
+
await self.config.streamer_async(
|
1007
|
+
tool_fn_args, StreamEventType.TOOL_ARGS
|
1008
|
+
)
|
1002
1009
|
|
1003
1010
|
# show this delta in the stream
|
1004
1011
|
if choices[0].get("finish_reason", "") in [
|
@@ -3,16 +3,16 @@ langroid/exceptions.py,sha256=gp6ku4ZLdXXCUQIwUNVFojJNGTzGnkevi2PLvG7HOhc,2555
|
|
3
3
|
langroid/mytypes.py,sha256=ptAFxEAtiwmIfUnGisNotTe8wT9LKBf22lOfPgZoQIY,2368
|
4
4
|
langroid/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
langroid/agent/__init__.py,sha256=ll0Cubd2DZ-fsCMl7e10hf9ZjFGKzphfBco396IKITY,786
|
6
|
-
langroid/agent/base.py,sha256
|
6
|
+
langroid/agent/base.py,sha256=oThlrYygKDu1-bKjAfygldJ511gMKT8Z0qCrD52DdDM,77834
|
7
7
|
langroid/agent/batch.py,sha256=qK3ph6VNj_1sOhfXCZY4r6gh035DglDKU751p8BU0tY,14665
|
8
|
-
langroid/agent/chat_agent.py,sha256=
|
8
|
+
langroid/agent/chat_agent.py,sha256=cxamUgqQkr6_W3mqCPz3L7rJnXIkD4hemR7X7uhlBvI,82095
|
9
9
|
langroid/agent/chat_document.py,sha256=xPUMGzR83rn4iAEXIw2jy5LQ6YJ6Y0TiZ78XRQeDnJQ,17778
|
10
10
|
langroid/agent/openai_assistant.py,sha256=JkAcs02bIrgPNVvUWVR06VCthc5-ulla2QMBzux_q6o,34340
|
11
|
-
langroid/agent/task.py,sha256=
|
11
|
+
langroid/agent/task.py,sha256=XrXUbSoiFasvpIsZPn_cBpdWaTCKljJPRimtLMrSZrs,90347
|
12
12
|
langroid/agent/tool_message.py,sha256=BhjP-_TfQ2tgxuY4Yo_JHLOwwt0mJ4BwjPnREvEY4vk,14744
|
13
13
|
langroid/agent/xml_tool_message.py,sha256=6SshYZJKIfi4mkE-gIoSwjkEYekQ8GwcSiCv7a5uO9E,15054
|
14
14
|
langroid/agent/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
-
langroid/agent/callbacks/chainlit.py,sha256=
|
15
|
+
langroid/agent/callbacks/chainlit.py,sha256=RH8qUXaZE5o2WQz3WJQ1SdFtASGlxWCA6_HYz_3meDQ,20822
|
16
16
|
langroid/agent/special/__init__.py,sha256=gik_Xtm_zV7U9s30Mn8UX3Gyuy4jTjQe9zjiE3HWmEo,1273
|
17
17
|
langroid/agent/special/doc_chat_agent.py,sha256=zw2MvdCWRPH93d73PKh27KFiQ8sUCFPxAfLDdkxvdZQ,59301
|
18
18
|
langroid/agent/special/lance_doc_chat_agent.py,sha256=s8xoRs0gGaFtDYFUSIRchsgDVbS5Q3C2b2mr3V1Fd-Q,10419
|
@@ -64,12 +64,12 @@ langroid/embedding_models/protoc/embeddings.proto,sha256=_O-SgFpTaylQeOTgSpxhEJ7
|
|
64
64
|
langroid/embedding_models/protoc/embeddings_pb2.py,sha256=4Q57PhOunv-uZNJrxYrWBXAI0ZtfnVZXFRhRj5JuRSg,1662
|
65
65
|
langroid/embedding_models/protoc/embeddings_pb2.pyi,sha256=UkNy7BrNsmQm0vLb3NtGXy8jVtz-kPWwwFsX-QbQBhQ,1475
|
66
66
|
langroid/embedding_models/protoc/embeddings_pb2_grpc.py,sha256=9dYQqkW3JPyBpSEjeGXTNpSqAkC-6FPtBHyteVob2Y8,2452
|
67
|
-
langroid/language_models/__init__.py,sha256=
|
67
|
+
langroid/language_models/__init__.py,sha256=ps8nhRavCu2-Bv7IQ5hrzody6lzKjHkivJsblDZZIQ8,1020
|
68
68
|
langroid/language_models/azure_openai.py,sha256=zNQzzsERxNestq-hFfQZbvTzK43G2vjRWnTV3ktm1DQ,5845
|
69
|
-
langroid/language_models/base.py,sha256=
|
69
|
+
langroid/language_models/base.py,sha256=MbxfR-10KbhoN0BBkPKqQdEcE7iiPhcFI1zuWvAkvG0,23902
|
70
70
|
langroid/language_models/config.py,sha256=9Q8wk5a7RQr8LGMT_0WkpjY8S4ywK06SalVRjXlfCiI,378
|
71
71
|
langroid/language_models/mock_lm.py,sha256=5BgHKDVRWFbUwDT_PFgTZXz9-k8wJSA2e3PZmyDgQ1k,4022
|
72
|
-
langroid/language_models/openai_gpt.py,sha256=
|
72
|
+
langroid/language_models/openai_gpt.py,sha256=FhpoE75LqWX4BvOo3fgJUPt-QFQDu6eJAuEAv_mTgnc,77352
|
73
73
|
langroid/language_models/utils.py,sha256=L4_CbihDMTGcsg0TOG1Yd5JFEto46--h7CX_14m89sQ,5016
|
74
74
|
langroid/language_models/prompt_formatter/__init__.py,sha256=2-5cdE24XoFDhifOLl8yiscohil1ogbP1ECkYdBlBsk,372
|
75
75
|
langroid/language_models/prompt_formatter/base.py,sha256=eDS1sgRNZVnoajwV_ZIha6cba5Dt8xjgzdRbPITwx3Q,1221
|
@@ -121,7 +121,7 @@ langroid/vector_store/lancedb.py,sha256=b3_vWkTjG8mweZ7ZNlUD-NjmQP_rLBZfyKWcxt2v
|
|
121
121
|
langroid/vector_store/meilisearch.py,sha256=6frB7GFWeWmeKzRfLZIvzRjllniZ1cYj3HmhHQICXLs,11663
|
122
122
|
langroid/vector_store/momento.py,sha256=UNHGT6jXuQtqY9f6MdqGU14bVnS0zHgIJUa30ULpUJo,10474
|
123
123
|
langroid/vector_store/qdrantdb.py,sha256=HRLCt-FG8y4718omwpFaQZnWeYxPj0XCwS4tjokI1sU,18116
|
124
|
-
langroid-0.33.
|
125
|
-
langroid-0.33.
|
126
|
-
langroid-0.33.
|
127
|
-
langroid-0.33.
|
124
|
+
langroid-0.33.12.dist-info/METADATA,sha256=tUh6elP7kcHfPS2dUXBE-gZ6vLoBfFzYsmg7nr2oCrg,59016
|
125
|
+
langroid-0.33.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
126
|
+
langroid-0.33.12.dist-info/licenses/LICENSE,sha256=EgVbvA6VSYgUlvC3RvPKehSg7MFaxWDsFuzLOsPPfJg,1065
|
127
|
+
langroid-0.33.12.dist-info/RECORD,,
|
File without changes
|
File without changes
|