langroid 0.23.0__py3-none-any.whl → 0.23.2__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 CHANGED
@@ -756,18 +756,18 @@ class Agent(ABC):
756
756
  @no_type_check
757
757
  async def llm_response_async(
758
758
  self,
759
- msg: Optional[str | ChatDocument] = None,
759
+ message: Optional[str | ChatDocument] = None,
760
760
  ) -> Optional[ChatDocument]:
761
761
  """
762
762
  Asynch version of `llm_response`. See there for details.
763
763
  """
764
- if msg is None or not self.llm_can_respond(msg):
764
+ if message is None or not self.llm_can_respond(message):
765
765
  return None
766
766
 
767
- if isinstance(msg, ChatDocument):
768
- prompt = msg.content
767
+ if isinstance(message, ChatDocument):
768
+ prompt = message.content
769
769
  else:
770
- prompt = msg
770
+ prompt = message
771
771
 
772
772
  output_len = self.config.llm.max_output_tokens
773
773
  if self.num_tokens(prompt) + output_len > self.llm.completion_context_length():
@@ -807,29 +807,31 @@ class Agent(ABC):
807
807
  )
808
808
  cdoc = ChatDocument.from_LLMResponse(response, displayed=True)
809
809
  # Preserve trail of tool_ids for OpenAI Assistant fn-calls
810
- cdoc.metadata.tool_ids = [] if isinstance(msg, str) else msg.metadata.tool_ids
810
+ cdoc.metadata.tool_ids = (
811
+ [] if isinstance(message, str) else message.metadata.tool_ids
812
+ )
811
813
  return cdoc
812
814
 
813
815
  @no_type_check
814
816
  def llm_response(
815
817
  self,
816
- msg: Optional[str | ChatDocument] = None,
818
+ message: Optional[str | ChatDocument] = None,
817
819
  ) -> Optional[ChatDocument]:
818
820
  """
819
821
  LLM response to a prompt.
820
822
  Args:
821
- msg (str|ChatDocument): prompt string, or ChatDocument object
823
+ message (str|ChatDocument): prompt string, or ChatDocument object
822
824
 
823
825
  Returns:
824
826
  Response from LLM, packaged as a ChatDocument
825
827
  """
826
- if msg is None or not self.llm_can_respond(msg):
828
+ if message is None or not self.llm_can_respond(message):
827
829
  return None
828
830
 
829
- if isinstance(msg, ChatDocument):
830
- prompt = msg.content
831
+ if isinstance(message, ChatDocument):
832
+ prompt = message.content
831
833
  else:
832
- prompt = msg
834
+ prompt = message
833
835
 
834
836
  with ExitStack() as stack: # for conditionally using rich spinner
835
837
  if not self.llm.get_stream():
@@ -879,7 +881,9 @@ class Agent(ABC):
879
881
  )
880
882
  cdoc = ChatDocument.from_LLMResponse(response, displayed=True)
881
883
  # Preserve trail of tool_ids for OpenAI Assistant fn-calls
882
- cdoc.metadata.tool_ids = [] if isinstance(msg, str) else msg.metadata.tool_ids
884
+ cdoc.metadata.tool_ids = (
885
+ [] if isinstance(message, str) else message.metadata.tool_ids
886
+ )
883
887
  return cdoc
884
888
 
885
889
  def has_tool_message_attempt(self, msg: str | ChatDocument | None) -> bool:
@@ -663,15 +663,15 @@ class DocChatAgent(ChatAgent):
663
663
 
664
664
  def llm_response(
665
665
  self,
666
- query: None | str | ChatDocument = None,
666
+ message: None | str | ChatDocument = None,
667
667
  ) -> Optional[ChatDocument]:
668
- if not self.llm_can_respond(query):
668
+ if not self.llm_can_respond(message):
669
669
  return None
670
670
  query_str: str | None
671
- if isinstance(query, ChatDocument):
672
- query_str = query.content
671
+ if isinstance(message, ChatDocument):
672
+ query_str = message.content
673
673
  else:
674
- query_str = query
674
+ query_str = message
675
675
  if query_str is None or query_str.startswith("!"):
676
676
  # direct query to LLM
677
677
  query_str = query_str[1:] if query_str is not None else None
@@ -714,16 +714,16 @@ class DocChatAgent(ChatAgent):
714
714
 
715
715
  async def llm_response_async(
716
716
  self,
717
- query: None | str | ChatDocument = None,
717
+ message: None | str | ChatDocument = None,
718
718
  ) -> Optional[ChatDocument]:
719
719
  apply_nest_asyncio()
720
- if not self.llm_can_respond(query):
720
+ if not self.llm_can_respond(message):
721
721
  return None
722
722
  query_str: str | None
723
- if isinstance(query, ChatDocument):
724
- query_str = query.content
723
+ if isinstance(message, ChatDocument):
724
+ query_str = message.content
725
725
  else:
726
- query_str = query
726
+ query_str = message
727
727
  if query_str is None or query_str.startswith("!"):
728
728
  # direct query to LLM
729
729
  query_str = query_str[1:] if query_str is not None else None
@@ -12,8 +12,6 @@ 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
17
15
  from langroid.exceptions import LangroidImportError
18
16
  from langroid.utils.constants import SEND_TO
19
17
 
@@ -44,7 +42,6 @@ from langroid.agent.special.sql.utils.tools import (
44
42
  GetTableSchemaTool,
45
43
  RunQueryTool,
46
44
  )
47
- from langroid.agent.task import Task, TaskConfig
48
45
  from langroid.agent.tools.orchestration import (
49
46
  DoneTool,
50
47
  ForwardTool,
@@ -100,6 +97,7 @@ class SQLChatAgentConfig(ChatAgentConfig):
100
97
  user_message: None | str = None
101
98
  cache: bool = True # cache results
102
99
  debug: bool = False
100
+ use_helper: bool = True
103
101
  is_helper: bool = False
104
102
  stream: bool = True # allow streaming where needed
105
103
  database_uri: str = "" # Database URI
@@ -168,8 +166,22 @@ class SQLChatAgent(ChatAgent):
168
166
  self._init_database()
169
167
  self._init_metadata()
170
168
  self._init_table_metadata()
171
-
172
- self._init_message_tools()
169
+ self.final_instructions = ""
170
+
171
+ # Caution - this updates the self.config.system_message!
172
+ self._init_system_message()
173
+ super().__init__(config)
174
+ self._init_tools()
175
+ if self.config.is_helper:
176
+ self.system_tool_format_instructions += self.final_instructions
177
+
178
+ if self.config.use_helper:
179
+ # helper_config.system_message is now the fully-populated sys msg of
180
+ # the main SQLAgent.
181
+ self.helper_config = self.config.copy()
182
+ self.helper_config.is_helper = True
183
+ self.helper_config.use_helper = False
184
+ self.helper_agent = SQLHelperAgent(self.helper_config)
173
185
 
174
186
  def _validate_config(self, config: "SQLChatAgentConfig") -> None:
175
187
  """Validate the configuration to ensure all necessary fields are present."""
@@ -237,21 +249,21 @@ class SQLChatAgent(ChatAgent):
237
249
  self.metadata, self.config.context_descriptions
238
250
  )
239
251
 
240
- def _init_message_tools(self) -> None:
241
- """Initialize message tools used for chatting."""
242
- if not self.config.is_helper:
243
- message = self._format_message()
244
- self.config.system_message = self.config.system_message.format(mode=message)
252
+ def _init_system_message(self) -> None:
253
+ """Initialize the system message."""
254
+ message = self._format_message()
255
+ self.config.system_message = self.config.system_message.format(mode=message)
245
256
 
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
257
+ if self.config.chat_mode:
258
+ self.config.addressing_prefix = self.config.addressing_prefix or SEND_TO
259
+ self.config.system_message += ADDRESSING_INSTRUCTION.format(
260
+ prefix=self.config.addressing_prefix
261
+ )
262
+ else:
263
+ self.config.system_message += DONE_INSTRUCTION
253
264
 
254
- super().__init__(self.config)
265
+ def _init_tools(self) -> None:
266
+ """Initialize sys msg and tools."""
255
267
  self.enable_message([RunQueryTool, ForwardTool])
256
268
  if self.config.use_schema_tools:
257
269
  self._enable_schema_tools()
@@ -292,17 +304,16 @@ class SQLChatAgent(ChatAgent):
292
304
  self.used_run_query = False
293
305
  return super().user_response(msg)
294
306
 
295
- def _answer_instruction(self, helper: bool = False) -> str:
307
+ def _clarify_answer_instruction(self) -> str:
308
+ """
309
+ Prompt to use when asking LLM to clarify intent of
310
+ an already-generated response
311
+ """
296
312
  if self.config.chat_mode:
297
313
  return f"""
298
314
  you must use the `{ForwardTool.name()}` with the `agent`
299
315
  parameter set to "User"
300
316
  """
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
317
  else:
307
318
  return f"""
308
319
  you must use the `{DoneTool.name()}` with the `content`
@@ -319,30 +330,17 @@ class SQLChatAgent(ChatAgent):
319
330
  OR you may want to use one of the schema tools to
320
331
  explore the database schema
321
332
  """
322
- if self.config.chat_mode:
323
- return f"""
324
- Since you did not explicitly address the User, it is not clear
325
- whether:
326
- - you intend this to be the final response to the
327
- user's query/request, in which case
328
- {self._answer_instruction()}
329
- - OR, you FORGOT to use an Appropriate TOOL,
330
- in which case you should use the available tools to
331
- make progress on the user's query/request.
332
- {tools_instruction}
333
- """
334
-
335
333
  return f"""
336
334
  The intent of your response is not clear:
337
335
  - if you intended this to be the FINAL answer to the user's query,
338
- {self._answer_instruction()}
336
+ {self._clarify_answer_instruction()}
339
337
  - otherwise, use one of the available tools to make progress
340
338
  to arrive at the final answer.
341
339
  {tools_instruction}
342
340
  """
343
341
 
344
342
  def handle_message_fallback(
345
- self, msg: str | ChatDocument
343
+ self, message: str | ChatDocument
346
344
  ) -> str | ForwardTool | ChatDocument | None:
347
345
  """
348
346
  Handle the scenario where current msg is not a tool.
@@ -352,9 +350,22 @@ class SQLChatAgent(ChatAgent):
352
350
  if not self.llm_responded:
353
351
  return None
354
352
  if self.interactive:
353
+ # self.interactive will be set to True by the Task,
354
+ # when chat_mode=True, so in this case
355
+ # we send any Non-tool msg to the user
355
356
  return ForwardTool(agent="User")
356
-
357
- return self._clarifying_message()
357
+ # Agent intent not clear => use the helper agent to
358
+ # do what this agent should have done, e.g. generate tool, etc.
359
+ # This is likelier to succeed since this agent has no "baggage" of
360
+ # prior conversation, other than the system msg, and special
361
+ # "Intent-interpretation" instructions.
362
+ response = self.helper_agent.llm_response(message)
363
+ tools = self.try_get_tool_messages(response)
364
+ if tools:
365
+ return response
366
+ else:
367
+ # fall back on the clarification message
368
+ return self._clarifying_message()
358
369
 
359
370
  def retry_query(self, e: Exception, query: str) -> str:
360
371
  """
@@ -402,6 +413,24 @@ class SQLChatAgent(ChatAgent):
402
413
  ]
403
414
  )
404
415
 
416
+ def _tool_result_llm_answer_prompt(self) -> str:
417
+ """
418
+ Prompt to use at end of tool result,
419
+ to guide LLM, for the case where it wants to answer the user's query
420
+ """
421
+ if self.config.chat_mode:
422
+ assert self.config.addressing_prefix != ""
423
+ return """
424
+ You must EXPLICITLY address the User with
425
+ the addressing prefix according to your instructions,
426
+ to convey your answer to the User.
427
+ """
428
+ else:
429
+ return f"""
430
+ you must use the `{DoneTool.name()}` with the `content`
431
+ set to the answer or result
432
+ """
433
+
405
434
  def run_query(self, msg: RunQueryTool) -> str:
406
435
  """
407
436
  Handle a RunQueryTool message by executing a SQL query and returning the result.
@@ -446,8 +475,7 @@ class SQLChatAgent(ChatAgent):
446
475
  ================
447
476
 
448
477
  If you are READY to ANSWER the ORIGINAL QUERY:
449
- use the `{DoneTool.name()}` tool to send the result to the user,
450
- with the `content` set to the answer or result
478
+ {self._tool_result_llm_answer_prompt()}
451
479
  OTHERWISE:
452
480
  continue using one of your available TOOLs:
453
481
  {self._available_tool_names()}
@@ -523,107 +551,57 @@ class SQLChatAgent(ChatAgent):
523
551
 
524
552
  class SQLHelperAgent(SQLChatAgent):
525
553
 
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 =====
554
+ def _clarifying_message(self) -> str:
555
+ tools_instruction = f"""
556
+ For example the Agent may have forgotten to use the TOOL
557
+ `{RunQueryTool.name()}` to further explore the database contents
608
558
  """
559
+ if self.config.use_schema_tools:
560
+ tools_instruction += """
561
+ OR the agent may have forgotten to use one of the schema tools to
562
+ explore the database schema
563
+ """
609
564
 
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
565
+ return f"""
566
+ The intent of the Agent's response is not clear:
567
+ - if you think the Agent intended this as ANSWER to the
568
+ user's query,
569
+ {self._clarify_answer_instruction()}
570
+ - otherwise, the Agent may have forgotten to
571
+ use one of the available tools to make progress
572
+ to arrive at the final answer.
573
+ {tools_instruction}
574
+ """
616
575
 
617
- helper_agent.disable_message_handling()
576
+ def _init_system_message(self) -> None:
577
+ """Set up helper sys msg"""
578
+
579
+ # Note that self.config.system_message is already set to the
580
+ # parent SQLAgent's system_message
581
+ self.config.system_message = f"""
582
+ You role is to help INTERPRET the INTENT of an
583
+ AI agent in a conversation. This Agent was supposed to generate
584
+ a TOOL/Function-call but forgot to do so, and this is where
585
+ you can help, by trying to generate the appropriate TOOL
586
+ based on your best guess of the Agent's INTENT.
587
+
588
+ Below are the instructions that were given to this Agent:
589
+ ===== AGENT INSTRUCTIONS =====
590
+ {self.config.system_message}
591
+ ===== END OF AGENT INSTRUCTIONS =====
592
+ """
618
593
 
619
- helper_agent.enable_message([PassTool, DonePassTool], use=True, handle=False)
594
+ # note that the initial msg in chat history will contain:
595
+ # - system message
596
+ # - tool instructions
597
+ # so the final_instructions will be at the end of this initial msg
620
598
 
621
- helper_agent.final_instructions = f"""
599
+ self.final_instructions = f"""
622
600
  You must take note especially of the TOOLs that are
623
- available to the agent. Your reasoning process should be as follows:
601
+ available to the Agent. Your reasoning process should be as follows:
624
602
 
625
603
  - If the Agent's message appears to be an ANSWER to the original query,
626
- {sql_agent._answer_instruction(helper=True)}.
604
+ {self._clarify_answer_instruction()}.
627
605
  CAUTION - You must be absolutely sure that the Agent's message is
628
606
  an ACTUAL ANSWER to the user's query, and not a failed attempt to use
629
607
  a TOOL without JSON, e.g. something like "run_query" or "done_tool"
@@ -642,16 +620,21 @@ def make_sql_chat_task(
642
620
  is NEITHER an ANSWER, nor an intended SQL QUERY.
643
621
  """
644
622
 
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
623
+ def llm_response(
624
+ self, message: Optional[str | ChatDocument] = None
625
+ ) -> Optional[ChatDocument]:
626
+ if message is None:
627
+ return None
628
+ message_str = message if isinstance(message, str) else message.content
629
+ instruc_msg = f"""
630
+ Below is the MESSAGE from the SQL Agent.
631
+ Remember your instructions on how to respond based on your understanding
632
+ of the INTENT of this message:
633
+ {self.final_instructions}
634
+
635
+ === AGENT MESSAGE =========
636
+ {message_str}
637
+ === END OF AGENT MESSAGE ===
638
+ """
639
+ # user response_forget to avoid accumulating the chat history
640
+ return super().llm_response_forget(instruc_msg)
@@ -171,7 +171,8 @@ class ToolMessage(ABC, BaseModel):
171
171
 
172
172
  Args:
173
173
  tool: instructions for Langroid-native tool use? (e.g. for non-OpenAI LLM)
174
- (or else it would be for OpenAI Function calls)
174
+ (or else it would be for OpenAI Function calls).
175
+ Ignored in the default implementation, but can be used in subclasses.
175
176
  Returns:
176
177
  str: instructions on how to use the message
177
178
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langroid
3
- Version: 0.23.0
3
+ Version: 0.23.2
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  License: MIT
6
6
  Author: Prasad Chalasani
@@ -249,6 +249,8 @@ teacher_task.run()
249
249
  <summary> <b>Click to expand</b></summary>
250
250
 
251
251
  - **Nov 2024:**
252
+ - **[0.23.0](https://langroid.github.io/langroid/tutorials/local-llm-setup/#local-llms-hosted-on-glhfchat)**:
253
+ support for LLMs (e.g. `Qwen2.5-Coder-32b-Instruct`) hosted on glhf.chat
252
254
  - **[0.22.0](https://langroid.github.io/langroid/notes/large-tool-results/)**:
253
255
  Optional parameters to truncate large tool results.
254
256
  - **[0.21.0](https://langroid.github.io/langroid/notes/gemini/)** Direct support for Gemini models via OpenAI client instead of using LiteLLM.
@@ -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=IskAT20eV9FInAcryTpt8v60fMClSWPAm3h8IhCzxYM,67829
3
+ langroid/agent/base.py,sha256=bYfVh_F-lYDecMpL_7SXzBetAZriT7ZfQE4vXHwI0xI,67945
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
@@ -15,7 +15,7 @@ langroid/agent/special/arangodb/arangodb_agent.py,sha256=12Y54c84c9qXV-YXRBcI5Ha
15
15
  langroid/agent/special/arangodb/system_messages.py,sha256=udwfLleTdyz_DuxHuoiv2wHEZoAPBPbwdF_ivjIfP5c,6867
16
16
  langroid/agent/special/arangodb/tools.py,sha256=Mixl9WS0r0Crd4nrw2YAB0eY33fTsKISul1053eyeio,3590
17
17
  langroid/agent/special/arangodb/utils.py,sha256=LIevtkayIdVVXyj3jlbKH2WgdZTtH5-JLgbXOHC7uxs,1420
18
- langroid/agent/special/doc_chat_agent.py,sha256=xIqBOyLax_jMU0UevxqXf_aQUrRkW6MQUKpKnKvaqkQ,59281
18
+ langroid/agent/special/doc_chat_agent.py,sha256=zw2MvdCWRPH93d73PKh27KFiQ8sUCFPxAfLDdkxvdZQ,59301
19
19
  langroid/agent/special/lance_doc_chat_agent.py,sha256=s8xoRs0gGaFtDYFUSIRchsgDVbS5Q3C2b2mr3V1Fd-Q,10419
20
20
  langroid/agent/special/lance_rag/__init__.py,sha256=QTbs0IVE2ZgDg8JJy1zN97rUUg4uEPH7SLGctFNumk4,174
21
21
  langroid/agent/special/lance_rag/critic_agent.py,sha256=OtFuHthKQLkdVkvuZ2m0GNq1qOYLqHkm1pfLRFnSg5c,9548
@@ -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=hvaaiHTuiRYvTbr2f7bTMMhJR_wnxo-KwxD6K-_jwlw,24420
33
+ langroid/agent/special/sql/sql_chat_agent.py,sha256=EsoF5_kheqhpiJw2wZs_6sgPfD0Or1YvfR5v2h6z74E,24094
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
@@ -39,7 +39,7 @@ langroid/agent/special/sql/utils/tools.py,sha256=ovCePzq5cmbqw0vsVPBzxdZpUcSUIfT
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
41
  langroid/agent/task.py,sha256=D7mGWdZ8H71AG2ZPLK6RIiG29Kegn_3lTEBfsBU0I_8,87397
42
- langroid/agent/tool_message.py,sha256=bjBSk1N1IgqqYGmOy6O97zPFMSaUdEK7r8ZjOaJwoeE,11335
42
+ langroid/agent/tool_message.py,sha256=noPvn2PxFY_xJvJXJzv-n5RVgy3CjH-Y_FZ5jEik5pQ,11422
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
@@ -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=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,,
145
+ pyproject.toml,sha256=L8FRAfEnw4iobtDdufbCBvb4JoxH-oSYMhRcePfzii0,7488
146
+ langroid-0.23.2.dist-info/LICENSE,sha256=EgVbvA6VSYgUlvC3RvPKehSg7MFaxWDsFuzLOsPPfJg,1065
147
+ langroid-0.23.2.dist-info/METADATA,sha256=U_J275x-bp2csL8EL6xK41m1r3q_aLDywDTBeutWtk0,57300
148
+ langroid-0.23.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
149
+ langroid-0.23.2.dist-info/RECORD,,
pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "langroid"
3
- version = "0.23.0"
3
+ version = "0.23.2"
4
4
  description = "Harness LLMs with Multi-Agent Programming"
5
5
  authors = ["Prasad Chalasani <pchalasani@gmail.com>"]
6
6
  readme = "README.md"