langroid 0.22.6__py3-none-any.whl → 0.23.0__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 +14 -4
- langroid/agent/special/sql/sql_chat_agent.py +192 -27
- langroid/agent/task.py +15 -5
- langroid/agent/tools/orchestration.py +8 -6
- langroid/language_models/openai_gpt.py +6 -0
- {langroid-0.22.6.dist-info → langroid-0.23.0.dist-info}/METADATA +1 -1
- {langroid-0.22.6.dist-info → langroid-0.23.0.dist-info}/RECORD +10 -10
- pyproject.toml +1 -1
- {langroid-0.22.6.dist-info → langroid-0.23.0.dist-info}/LICENSE +0 -0
- {langroid-0.22.6.dist-info → langroid-0.23.0.dist-info}/WHEEL +0 -0
langroid/agent/base.py
CHANGED
@@ -942,11 +942,20 @@ class Agent(ABC):
|
|
942
942
|
Get ToolMessages recognized in msg, handle-able by this agent.
|
943
943
|
NOTE: as a side-effect, this will update msg.tool_messages
|
944
944
|
when msg is a ChatDocument and msg contains tool messages.
|
945
|
+
The intent here is that update=True should be set ONLY within agent_response()
|
946
|
+
or agent_response_async() methods. In other words, we want to persist the
|
947
|
+
msg.tool_messages only AFTER the agent has had a chance to handle the tools.
|
945
948
|
|
946
|
-
|
947
|
-
|
948
|
-
|
949
|
-
|
949
|
+
Args:
|
950
|
+
msg (str|ChatDocument): the message to extract tools from.
|
951
|
+
all_tools (bool):
|
952
|
+
- if True, return all tools,
|
953
|
+
i.e. any recognized tool in self.llm_tools_known,
|
954
|
+
whether it is handled by this agent or not;
|
955
|
+
- otherwise, return only the tools handled by this agent.
|
956
|
+
|
957
|
+
Returns:
|
958
|
+
List[ToolMessage]: list of ToolMessage objects
|
950
959
|
"""
|
951
960
|
|
952
961
|
if msg is None:
|
@@ -983,6 +992,7 @@ class Agent(ABC):
|
|
983
992
|
|
984
993
|
tools = self.get_formatted_tool_messages(msg.content)
|
985
994
|
msg.all_tool_messages = tools
|
995
|
+
# filter for actually handle-able tools, and recipient is this agent
|
986
996
|
my_tools = [t for t in tools if self._tool_recipient_match(t)]
|
987
997
|
msg.tool_messages = my_tools
|
988
998
|
|
@@ -12,6 +12,8 @@ from typing import Any, Dict, List, Optional, Sequence, Union
|
|
12
12
|
|
13
13
|
from rich.console import Console
|
14
14
|
|
15
|
+
from langroid import Entity
|
16
|
+
from langroid.agent.tools import DonePassTool
|
15
17
|
from langroid.exceptions import LangroidImportError
|
16
18
|
from langroid.utils.constants import SEND_TO
|
17
19
|
|
@@ -42,7 +44,12 @@ from langroid.agent.special.sql.utils.tools import (
|
|
42
44
|
GetTableSchemaTool,
|
43
45
|
RunQueryTool,
|
44
46
|
)
|
45
|
-
from langroid.agent.
|
47
|
+
from langroid.agent.task import Task, TaskConfig
|
48
|
+
from langroid.agent.tools.orchestration import (
|
49
|
+
DoneTool,
|
50
|
+
ForwardTool,
|
51
|
+
PassTool,
|
52
|
+
)
|
46
53
|
from langroid.vector_store.base import VectorStoreConfig
|
47
54
|
|
48
55
|
logger = logging.getLogger(__name__)
|
@@ -93,6 +100,7 @@ class SQLChatAgentConfig(ChatAgentConfig):
|
|
93
100
|
user_message: None | str = None
|
94
101
|
cache: bool = True # cache results
|
95
102
|
debug: bool = False
|
103
|
+
is_helper: bool = False
|
96
104
|
stream: bool = True # allow streaming where needed
|
97
105
|
database_uri: str = "" # Database URI
|
98
106
|
database_session: None | Session = None # Database session
|
@@ -160,6 +168,7 @@ class SQLChatAgent(ChatAgent):
|
|
160
168
|
self._init_database()
|
161
169
|
self._init_metadata()
|
162
170
|
self._init_table_metadata()
|
171
|
+
|
163
172
|
self._init_message_tools()
|
164
173
|
|
165
174
|
def _validate_config(self, config: "SQLChatAgentConfig") -> None:
|
@@ -230,16 +239,17 @@ class SQLChatAgent(ChatAgent):
|
|
230
239
|
|
231
240
|
def _init_message_tools(self) -> None:
|
232
241
|
"""Initialize message tools used for chatting."""
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
242
|
+
if not self.config.is_helper:
|
243
|
+
message = self._format_message()
|
244
|
+
self.config.system_message = self.config.system_message.format(mode=message)
|
245
|
+
|
246
|
+
if self.config.chat_mode:
|
247
|
+
self.config.addressing_prefix = self.config.addressing_prefix or SEND_TO
|
248
|
+
self.config.system_message += ADDRESSING_INSTRUCTION.format(
|
249
|
+
prefix=self.config.addressing_prefix
|
250
|
+
)
|
251
|
+
else:
|
252
|
+
self.config.system_message += DONE_INSTRUCTION
|
243
253
|
|
244
254
|
super().__init__(self.config)
|
245
255
|
self.enable_message([RunQueryTool, ForwardTool])
|
@@ -282,19 +292,24 @@ class SQLChatAgent(ChatAgent):
|
|
282
292
|
self.used_run_query = False
|
283
293
|
return super().user_response(msg)
|
284
294
|
|
285
|
-
def
|
286
|
-
self
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
295
|
+
def _answer_instruction(self, helper: bool = False) -> str:
|
296
|
+
if self.config.chat_mode:
|
297
|
+
return f"""
|
298
|
+
you must use the `{ForwardTool.name()}` with the `agent`
|
299
|
+
parameter set to "User"
|
300
|
+
"""
|
301
|
+
elif helper:
|
302
|
+
return f"""
|
303
|
+
you must use the `{DonePassTool.name()}` to pass the answer intact,
|
304
|
+
REMEMBER to set the `request` parameter to "{DonePassTool.name()}"
|
305
|
+
"""
|
306
|
+
else:
|
307
|
+
return f"""
|
308
|
+
you must use the `{DoneTool.name()}` with the `content`
|
309
|
+
set to the answer or result
|
310
|
+
"""
|
297
311
|
|
312
|
+
def _clarifying_message(self) -> str:
|
298
313
|
tools_instruction = f"""
|
299
314
|
For example you may want to use the TOOL
|
300
315
|
`{RunQueryTool.name()}` to further explore the database contents
|
@@ -309,8 +324,8 @@ class SQLChatAgent(ChatAgent):
|
|
309
324
|
Since you did not explicitly address the User, it is not clear
|
310
325
|
whether:
|
311
326
|
- you intend this to be the final response to the
|
312
|
-
user's query/request, in which case
|
313
|
-
|
327
|
+
user's query/request, in which case
|
328
|
+
{self._answer_instruction()}
|
314
329
|
- OR, you FORGOT to use an Appropriate TOOL,
|
315
330
|
in which case you should use the available tools to
|
316
331
|
make progress on the user's query/request.
|
@@ -320,13 +335,27 @@ class SQLChatAgent(ChatAgent):
|
|
320
335
|
return f"""
|
321
336
|
The intent of your response is not clear:
|
322
337
|
- if you intended this to be the FINAL answer to the user's query,
|
323
|
-
|
324
|
-
with the `content` set to the answer or result.
|
338
|
+
{self._answer_instruction()}
|
325
339
|
- otherwise, use one of the available tools to make progress
|
326
340
|
to arrive at the final answer.
|
327
341
|
{tools_instruction}
|
328
342
|
"""
|
329
343
|
|
344
|
+
def handle_message_fallback(
|
345
|
+
self, msg: str | ChatDocument
|
346
|
+
) -> str | ForwardTool | ChatDocument | None:
|
347
|
+
"""
|
348
|
+
Handle the scenario where current msg is not a tool.
|
349
|
+
Special handling is only needed if the message was from the LLM
|
350
|
+
(as indicated by self.llm_responded).
|
351
|
+
"""
|
352
|
+
if not self.llm_responded:
|
353
|
+
return None
|
354
|
+
if self.interactive:
|
355
|
+
return ForwardTool(agent="User")
|
356
|
+
|
357
|
+
return self._clarifying_message()
|
358
|
+
|
330
359
|
def retry_query(self, e: Exception, query: str) -> str:
|
331
360
|
"""
|
332
361
|
Generate an error message for a failed SQL query and return it.
|
@@ -490,3 +519,139 @@ class SQLChatAgent(ChatAgent):
|
|
490
519
|
for col in columns:
|
491
520
|
result += f"\n{col} => {descriptions['columns'][col]}" # type: ignore
|
492
521
|
return result
|
522
|
+
|
523
|
+
|
524
|
+
class SQLHelperAgent(SQLChatAgent):
|
525
|
+
|
526
|
+
final_instructions: str = ""
|
527
|
+
|
528
|
+
def llm_response(
|
529
|
+
self, message: Optional[str | ChatDocument] = None
|
530
|
+
) -> Optional[ChatDocument]:
|
531
|
+
if message is None:
|
532
|
+
return None
|
533
|
+
message_str = message if isinstance(message, str) else message.content
|
534
|
+
instruc_msg = f"""
|
535
|
+
Below is the MESSAGE from the SQL Agent.
|
536
|
+
Remember you instructions on how to respond based on your understanding
|
537
|
+
of the INTENT of this message:
|
538
|
+
{self.final_instructions}
|
539
|
+
|
540
|
+
=== AGENT MESSAGE =========
|
541
|
+
{message_str}
|
542
|
+
=== END OF AGENT MESSAGE ===
|
543
|
+
"""
|
544
|
+
return super().llm_response(instruc_msg)
|
545
|
+
|
546
|
+
def handle_message_fallback(
|
547
|
+
self, msg: str | ChatDocument
|
548
|
+
) -> str | ForwardTool | ChatDocument | None:
|
549
|
+
# Helper is disabled from handling any tools, so we always come here.
|
550
|
+
if isinstance(msg, str) or msg.metadata.sender != Entity.LLM:
|
551
|
+
return None
|
552
|
+
# force it to populate msg.tool_messages,
|
553
|
+
# since helper is disabling from handling tools.
|
554
|
+
# We use all_tools to have it return all tools recognized
|
555
|
+
# in the msg and _known_ to the helper (i.e. enabled with use=F, handle=F)
|
556
|
+
# and populate msg.tool_messages with these.
|
557
|
+
tools = self.try_get_tool_messages(msg, all_tools=True)
|
558
|
+
msg.tool_messages = tools
|
559
|
+
if any(isinstance(tool, DonePassTool) for tool in tools):
|
560
|
+
return msg
|
561
|
+
elif any(isinstance(tool, PassTool) for tool in tools):
|
562
|
+
# PassTool is just a dummy tool to indicate
|
563
|
+
# that the helper wasn't able to figure out intent,
|
564
|
+
# so send the basic clarifying msg, so main agent retries
|
565
|
+
return self._clarifying_message()
|
566
|
+
elif len(tools) > 0 or DonePassTool.name() in msg.content:
|
567
|
+
# either there are some sql tools, or there was an attempt to use
|
568
|
+
# DonePassTool, so send a proper DonePassTool
|
569
|
+
return DonePassTool().response(self, msg)
|
570
|
+
else:
|
571
|
+
return self._clarifying_message()
|
572
|
+
|
573
|
+
|
574
|
+
def make_sql_chat_task(
|
575
|
+
config: SQLChatAgentConfig,
|
576
|
+
interactive: bool = True,
|
577
|
+
use_helper: bool = False,
|
578
|
+
) -> Task:
|
579
|
+
|
580
|
+
task_config = TaskConfig()
|
581
|
+
|
582
|
+
if interactive:
|
583
|
+
config.chat_mode = True
|
584
|
+
config.addressing_prefix = SEND_TO
|
585
|
+
task_config.addressing_prefix = SEND_TO
|
586
|
+
|
587
|
+
sql_agent = SQLChatAgent(config)
|
588
|
+
sql_task = Task(
|
589
|
+
sql_agent,
|
590
|
+
interactive=False,
|
591
|
+
config=task_config,
|
592
|
+
only_user_quits_root=interactive,
|
593
|
+
)
|
594
|
+
|
595
|
+
if use_helper:
|
596
|
+
setattr(sql_agent, "handle_message_fallback", lambda msg: None)
|
597
|
+
helper_config = config.copy()
|
598
|
+
helper_config.name = "Helper"
|
599
|
+
helper_config.is_helper = True
|
600
|
+
helper_config.system_message = f"""
|
601
|
+
You role is to help INTERPRET the INTENT of an AI agent in a conversation.
|
602
|
+
Given this Agent's message, you must generate the appropriate TOOL
|
603
|
+
based on your understanding of the agent's INTENT. Below are the instructions
|
604
|
+
that were given to this Agent.
|
605
|
+
===== AGENT INSTRUCTIONS =====
|
606
|
+
{sql_agent.config.system_message}
|
607
|
+
===== END OF AGENT INSTRUCTIONS =====
|
608
|
+
"""
|
609
|
+
|
610
|
+
helper_agent = SQLHelperAgent(helper_config)
|
611
|
+
|
612
|
+
helper_agent.disable_message_use(DoneTool)
|
613
|
+
|
614
|
+
# disable handling of all tools, including orchestration tools,
|
615
|
+
# so they are passed to parent task to be handled
|
616
|
+
|
617
|
+
helper_agent.disable_message_handling()
|
618
|
+
|
619
|
+
helper_agent.enable_message([PassTool, DonePassTool], use=True, handle=False)
|
620
|
+
|
621
|
+
helper_agent.final_instructions = f"""
|
622
|
+
You must take note especially of the TOOLs that are
|
623
|
+
available to the agent. Your reasoning process should be as follows:
|
624
|
+
|
625
|
+
- If the Agent's message appears to be an ANSWER to the original query,
|
626
|
+
{sql_agent._answer_instruction(helper=True)}.
|
627
|
+
CAUTION - You must be absolutely sure that the Agent's message is
|
628
|
+
an ACTUAL ANSWER to the user's query, and not a failed attempt to use
|
629
|
+
a TOOL without JSON, e.g. something like "run_query" or "done_tool"
|
630
|
+
without any actual JSON formatting.
|
631
|
+
|
632
|
+
- Else, if you think the Agent intended to use some type of SQL
|
633
|
+
query tool to READ or UPDATE the table(s),
|
634
|
+
AND it is clear WHICH TOOL is intended as well as the
|
635
|
+
TOOL PARAMETERS, then you must generate the JSON-Formatted
|
636
|
+
TOOL with the parameters set based on your understanding.
|
637
|
+
Note that the `{RunQueryTool.name()}` is not ONLY for querying the tables,
|
638
|
+
but also for UPDATING the tables.
|
639
|
+
|
640
|
+
- Else, use the `{PassTool.name()}` to pass the message unchanged.
|
641
|
+
CAUTION - ONLY use `{PassTool.name()}` if you think the Agent's response
|
642
|
+
is NEITHER an ANSWER, nor an intended SQL QUERY.
|
643
|
+
"""
|
644
|
+
|
645
|
+
helper_agent.system_tool_format_instructions += helper_agent.final_instructions
|
646
|
+
|
647
|
+
# ensure helper-task always resets history - improves latency, cost, accuracy
|
648
|
+
helper_task_config = TaskConfig(restart_as_subtask=True)
|
649
|
+
helper_task = Task(
|
650
|
+
helper_agent,
|
651
|
+
interactive=False,
|
652
|
+
done_if_response=[Entity.AGENT],
|
653
|
+
config=helper_task_config,
|
654
|
+
)
|
655
|
+
sql_task.add_sub_task((helper_task, helper_task_config))
|
656
|
+
|
657
|
+
return sql_task
|
langroid/agent/task.py
CHANGED
@@ -78,7 +78,7 @@ class TaskConfig(BaseModel):
|
|
78
78
|
inf_loop_cycle_len (int): max exact-loop cycle length: 0 => no inf loop test
|
79
79
|
inf_loop_dominance_factor (float): dominance factor for exact-loop detection
|
80
80
|
inf_loop_wait_factor (int): wait this * cycle_len msgs before loop-check
|
81
|
-
|
81
|
+
restart_as_subtask (bool): whether to restart *every* run of this task
|
82
82
|
when run as a subtask.
|
83
83
|
addressing_prefix (str): "@"-like prefix an agent can use to address other
|
84
84
|
agents, or entities of the agent. E.g., if this is "@", the addressing
|
@@ -1468,6 +1468,9 @@ class Task:
|
|
1468
1468
|
max_cost=self.max_cost,
|
1469
1469
|
max_tokens=self.max_tokens,
|
1470
1470
|
)
|
1471
|
+
# update result.tool_messages if any
|
1472
|
+
if isinstance(result, ChatDocument):
|
1473
|
+
self.agent.try_get_tool_messages(result)
|
1471
1474
|
if result is not None:
|
1472
1475
|
content, id2result, oai_tool_id = self.agent.process_tool_results(
|
1473
1476
|
result.content,
|
@@ -1496,6 +1499,9 @@ class Task:
|
|
1496
1499
|
else:
|
1497
1500
|
response_fn = self._entity_responder_async_map[cast(Entity, e)]
|
1498
1501
|
result = await response_fn(self.pending_message)
|
1502
|
+
# update result.tool_messages if any
|
1503
|
+
if isinstance(result, ChatDocument):
|
1504
|
+
self.agent.try_get_tool_messages(result)
|
1499
1505
|
|
1500
1506
|
result_chat_doc = self.agent.to_ChatDocument(
|
1501
1507
|
result,
|
@@ -1532,7 +1538,7 @@ class Task:
|
|
1532
1538
|
oai_tool_id2result = result_msg.oai_tool_id2result if result_msg else None
|
1533
1539
|
fun_call = result_msg.function_call if result_msg else None
|
1534
1540
|
tool_messages = result_msg.tool_messages if result_msg else []
|
1535
|
-
# if there is
|
1541
|
+
# if there is a DoneTool or AgentDoneTool among these,
|
1536
1542
|
# we extract content and tools from here, and ignore all others
|
1537
1543
|
for t in tool_messages:
|
1538
1544
|
if isinstance(t, FinalResultTool):
|
@@ -1621,9 +1627,13 @@ class Task:
|
|
1621
1627
|
isinstance(result, ChatDocument)
|
1622
1628
|
and (
|
1623
1629
|
(DONE in result.content and allow_done_string)
|
1624
|
-
or
|
1625
|
-
|
1626
|
-
|
1630
|
+
or (
|
1631
|
+
any(
|
1632
|
+
isinstance(t, (DoneTool, AgentDoneTool, FinalResultTool))
|
1633
|
+
for t in result.tool_messages
|
1634
|
+
# this condition ensures agent had chance to handle tools
|
1635
|
+
)
|
1636
|
+
and responder == Entity.AGENT
|
1627
1637
|
)
|
1628
1638
|
)
|
1629
1639
|
)
|
@@ -154,12 +154,14 @@ class PassTool(ToolMessage):
|
|
154
154
|
`forward_tool(self, tool: PassTool, chat_doc: ChatDocument) -> ChatDocument:`
|
155
155
|
"""
|
156
156
|
# if PassTool is in chat_doc, pass its parent, else pass chat_doc itself
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
if any(isinstance(t, type(self)) for t in tools)
|
161
|
-
|
162
|
-
|
157
|
+
doc = chat_doc
|
158
|
+
while True:
|
159
|
+
tools = agent.get_tool_messages(doc)
|
160
|
+
if not any(isinstance(t, type(self)) for t in tools):
|
161
|
+
break
|
162
|
+
if doc.parent is None:
|
163
|
+
break
|
164
|
+
doc = doc.parent
|
163
165
|
assert doc is not None, "PassTool: parent of chat_doc must not be None"
|
164
166
|
new_doc = ChatDocument.deepcopy(doc)
|
165
167
|
new_doc.metadata.sender = Entity.AGENT
|
@@ -67,6 +67,7 @@ else:
|
|
67
67
|
OLLAMA_BASE_URL = "http://localhost:11434/v1"
|
68
68
|
|
69
69
|
GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/v1beta/"
|
70
|
+
GLHF_BASE_URL = "https://glhf.chat/api/openai/v1"
|
70
71
|
OLLAMA_API_KEY = "ollama"
|
71
72
|
DUMMY_API_KEY = "xxx"
|
72
73
|
|
@@ -513,6 +514,7 @@ class OpenAIGPT(LanguageModel):
|
|
513
514
|
self.is_groq = self.config.chat_model.startswith("groq/")
|
514
515
|
self.is_cerebras = self.config.chat_model.startswith("cerebras/")
|
515
516
|
self.is_gemini = self.config.chat_model.startswith("gemini/")
|
517
|
+
self.is_glhf = self.config.chat_model.startswith("glhf/")
|
516
518
|
|
517
519
|
if self.is_groq:
|
518
520
|
self.config.chat_model = self.config.chat_model.replace("groq/", "")
|
@@ -538,6 +540,10 @@ class OpenAIGPT(LanguageModel):
|
|
538
540
|
self.config.chat_model = self.config.chat_model.replace("gemini/", "")
|
539
541
|
self.api_key = os.getenv("GEMINI_API_KEY", DUMMY_API_KEY)
|
540
542
|
self.api_base = GEMINI_BASE_URL
|
543
|
+
elif self.is_glhf:
|
544
|
+
self.config.chat_model = self.config.chat_model.replace("glhf/", "")
|
545
|
+
self.api_key = os.getenv("GLHF_API_KEY", DUMMY_API_KEY)
|
546
|
+
self.api_base = GLHF_BASE_URL
|
541
547
|
|
542
548
|
self.client = OpenAI(
|
543
549
|
api_key=self.api_key,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
langroid/__init__.py,sha256=z_fCOLQJPOw3LLRPBlFB5-2HyCjpPgQa4m4iY5Fvb8Y,1800
|
2
2
|
langroid/agent/__init__.py,sha256=ll0Cubd2DZ-fsCMl7e10hf9ZjFGKzphfBco396IKITY,786
|
3
|
-
langroid/agent/base.py,sha256
|
3
|
+
langroid/agent/base.py,sha256=IskAT20eV9FInAcryTpt8v60fMClSWPAm3h8IhCzxYM,67829
|
4
4
|
langroid/agent/batch.py,sha256=QZdlt1563hx4l3AXrCaGovE-PNG93M3DsvQAbDzdiS8,13705
|
5
5
|
langroid/agent/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
6
|
langroid/agent/callbacks/chainlit.py,sha256=JJXI3UGTyTDg2FFath4rqY1GyUo_0pbVBt8CZpvdtn4,23289
|
@@ -30,7 +30,7 @@ langroid/agent/special/neo4j/tools.py,sha256=Vw3HvtDfG2c4_bUHgt4_ZbJq48lpIQstbjj
|
|
30
30
|
langroid/agent/special/relevance_extractor_agent.py,sha256=zIx8GUdVo1aGW6ASla0NPQjYYIpmriK_TYMijqAx3F8,4796
|
31
31
|
langroid/agent/special/retriever_agent.py,sha256=lvMvf-u9rSosg4YASuFdUbGLgkzLPknXAbJZfZ1LZCc,1868
|
32
32
|
langroid/agent/special/sql/__init__.py,sha256=mWfmm1QpXCezpFOS2eI57M0L_Ok3q5_ukG8tXBnBrEA,319
|
33
|
-
langroid/agent/special/sql/sql_chat_agent.py,sha256=
|
33
|
+
langroid/agent/special/sql/sql_chat_agent.py,sha256=hvaaiHTuiRYvTbr2f7bTMMhJR_wnxo-KwxD6K-_jwlw,24420
|
34
34
|
langroid/agent/special/sql/utils/__init__.py,sha256=JFif6CRTrN-bc91uuAI4K9fe2ndIWSNMVxJ0WA68--M,446
|
35
35
|
langroid/agent/special/sql/utils/description_extractors.py,sha256=cX8TIpmTPXZXQTMpIi3OUFwFsPywxFFdurpx717Kq0I,6529
|
36
36
|
langroid/agent/special/sql/utils/populate_metadata.py,sha256=1J22UsyEPKzwK0XlJZtYn9r6kYc0FXIr8-lZrndYlhc,3131
|
@@ -38,14 +38,14 @@ langroid/agent/special/sql/utils/system_message.py,sha256=qKLHkvQWRQodTtPLPxr1GS
|
|
38
38
|
langroid/agent/special/sql/utils/tools.py,sha256=ovCePzq5cmbqw0vsVPBzxdZpUcSUIfTiDSMGXustZW8,1749
|
39
39
|
langroid/agent/special/table_chat_agent.py,sha256=d9v2wsblaRx7oMnKhLV7uO_ujvk9gh59pSGvBXyeyNc,9659
|
40
40
|
langroid/agent/structured_message.py,sha256=y7pud1EgRNeTFZlJmBkLmwME3yQJ_IYik-Xds9kdZbY,282
|
41
|
-
langroid/agent/task.py,sha256=
|
41
|
+
langroid/agent/task.py,sha256=D7mGWdZ8H71AG2ZPLK6RIiG29Kegn_3lTEBfsBU0I_8,87397
|
42
42
|
langroid/agent/tool_message.py,sha256=bjBSk1N1IgqqYGmOy6O97zPFMSaUdEK7r8ZjOaJwoeE,11335
|
43
43
|
langroid/agent/tools/__init__.py,sha256=IMgCte-_ZIvCkozGQmvMqxIw7_nKLKzD78ccJL1bnQU,804
|
44
44
|
langroid/agent/tools/duckduckgo_search_tool.py,sha256=NhsCaGZkdv28nja7yveAhSK_w6l_Ftym8agbrdzqgfo,1935
|
45
45
|
langroid/agent/tools/file_tools.py,sha256=GjPB5YDILucYapElnvvoYpGJuZQ25ecLs2REv7edPEo,7292
|
46
46
|
langroid/agent/tools/google_search_tool.py,sha256=y7b-3FtgXf0lfF4AYxrZ3K5pH2dhidvibUOAGBE--WI,1456
|
47
47
|
langroid/agent/tools/metaphor_search_tool.py,sha256=qj4gt453cLEX3EGW7nVzVu6X7LCdrwjSlcNY0qJW104,2489
|
48
|
-
langroid/agent/tools/orchestration.py,sha256=
|
48
|
+
langroid/agent/tools/orchestration.py,sha256=jBQOfSuN218i6jF1Ege8O-CpFqe7-7_4WAw_J_E5xQY,10984
|
49
49
|
langroid/agent/tools/recipient_tool.py,sha256=dr0yTxgNEIoxUYxH6TtaExC4G_8WdJ0xGohIa4dFLhY,9808
|
50
50
|
langroid/agent/tools/retrieval_tool.py,sha256=zcAV20PP_6VzSd-UE-IJcabaBseFL_QNz59Bnig8-lE,946
|
51
51
|
langroid/agent/tools/rewind_tool.py,sha256=XAXL3BpNhCmBGYq_qi_sZfHJuIw7NY2jp4wnojJ7WRs,5606
|
@@ -75,7 +75,7 @@ langroid/language_models/azure_openai.py,sha256=G4le3j4YLHV7IwgB2C37hO3MKijZ1Kjy
|
|
75
75
|
langroid/language_models/base.py,sha256=xMFg8syIHiA7ABRNWPXeFM1vGeY_1EN84ki8C3dycfw,22722
|
76
76
|
langroid/language_models/config.py,sha256=9Q8wk5a7RQr8LGMT_0WkpjY8S4ywK06SalVRjXlfCiI,378
|
77
77
|
langroid/language_models/mock_lm.py,sha256=HuiAvjHiCfffYF5xjFJUq945HVTW0QPbeUUctOnNCzQ,3868
|
78
|
-
langroid/language_models/openai_gpt.py,sha256=
|
78
|
+
langroid/language_models/openai_gpt.py,sha256=DwyRaJRwuY5fRqS0tT3iOk2zg6j3UpjD-iw7TUlxTEk,69934
|
79
79
|
langroid/language_models/prompt_formatter/__init__.py,sha256=2-5cdE24XoFDhifOLl8yiscohil1ogbP1ECkYdBlBsk,372
|
80
80
|
langroid/language_models/prompt_formatter/base.py,sha256=eDS1sgRNZVnoajwV_ZIha6cba5Dt8xjgzdRbPITwx3Q,1221
|
81
81
|
langroid/language_models/prompt_formatter/hf_formatter.py,sha256=PVJppmjRvD-2DF-XNC6mE05vTZ9wbu37SmXwZBQhad0,5055
|
@@ -142,8 +142,8 @@ langroid/vector_store/meilisearch.py,sha256=6frB7GFWeWmeKzRfLZIvzRjllniZ1cYj3Hmh
|
|
142
142
|
langroid/vector_store/momento.py,sha256=qR-zBF1RKVHQZPZQYW_7g-XpTwr46p8HJuYPCkfJbM4,10534
|
143
143
|
langroid/vector_store/qdrant_cloud.py,sha256=3im4Mip0QXLkR6wiqVsjV1QvhSElfxdFSuDKddBDQ-4,188
|
144
144
|
langroid/vector_store/qdrantdb.py,sha256=v88lqFkepADvlN6lByUj9I4NEKa9X9lWH16uTPPbYrE,17457
|
145
|
-
pyproject.toml,sha256=
|
146
|
-
langroid-0.
|
147
|
-
langroid-0.
|
148
|
-
langroid-0.
|
149
|
-
langroid-0.
|
145
|
+
pyproject.toml,sha256=qQRC-UQALod7pWWcEuUQT2voUzducHlJGDwxZql7lxo,7488
|
146
|
+
langroid-0.23.0.dist-info/LICENSE,sha256=EgVbvA6VSYgUlvC3RvPKehSg7MFaxWDsFuzLOsPPfJg,1065
|
147
|
+
langroid-0.23.0.dist-info/METADATA,sha256=qhnW-4likbyAKTUP7f6cq00qF1IBsZ5dQiHsfO6v8pc,57107
|
148
|
+
langroid-0.23.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
149
|
+
langroid-0.23.0.dist-info/RECORD,,
|
pyproject.toml
CHANGED
File without changes
|
File without changes
|