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 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
- If all_tools is True:
947
- - return all tools, i.e. any tool in self.llm_tools_known,
948
- whether it is handled by this agent or not;
949
- - otherwise, return only the tools handled by this agent.
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.tools.orchestration import DoneTool, ForwardTool
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
- message = self._format_message()
234
- self.config.system_message = self.config.system_message.format(mode=message)
235
-
236
- if self.config.chat_mode:
237
- self.config.addressing_prefix = self.config.addressing_prefix or SEND_TO
238
- self.config.system_message += ADDRESSING_INSTRUCTION.format(
239
- prefix=self.config.addressing_prefix
240
- )
241
- else:
242
- self.config.system_message += DONE_INSTRUCTION
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 handle_message_fallback(
286
- self, msg: str | ChatDocument
287
- ) -> str | ForwardTool | None:
288
- """
289
- Handle the scenario where current msg is not a tool.
290
- Special handling is only needed if the message was from the LLM
291
- (as indicated by self.llm_responded).
292
- """
293
- if not self.llm_responded:
294
- return None
295
- if self.interactive:
296
- return ForwardTool(agent="User")
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 you must use the
313
- `{ForwardTool.name()}` to indicate this.
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
- then use the `{DoneTool.name()}` to indicate so,
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
- restart_subtask_run (bool): whether to restart *every* run of this task
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 an DoneTool or AgentDoneTool among these,
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 any(
1625
- isinstance(t, (DoneTool, AgentDoneTool, FinalResultTool))
1626
- for t in result.tool_messages
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
- tools = agent.get_tool_messages(chat_doc)
158
- doc = (
159
- chat_doc.parent
160
- if any(isinstance(t, type(self)) for t in tools)
161
- else chat_doc
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
  Metadata-Version: 2.1
2
2
  Name: langroid
3
- Version: 0.22.6
3
+ Version: 0.23.0
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  License: MIT
6
6
  Author: Prasad Chalasani
@@ -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=-lMv0XHO7ya1P6IW_xb439Mx8WhFEPgt1AmcMe200ds,67268
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=bh7UCFltngrQxsjH5PKM7JECjA6tMnntKOlUcjEmnT8,18011
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=BdLNWFQqA9X-9ZtUIC2NwmRrPAX7GB0mAC0aXDzK0Uk,86877
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=EDv1EMVGYqX82x3bCRbTn9gFNs66oosiUM8WTSZkUJg,10909
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=CVRwYvIT8lt02GqI0G5_sTQXLcQbiwwNXpU8_qsw6q8,69584
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=iOYeCZhSZb6evu9r2X8g7nY_Q0m9PqX1Q-upDqifwek,7488
146
- langroid-0.22.6.dist-info/LICENSE,sha256=EgVbvA6VSYgUlvC3RvPKehSg7MFaxWDsFuzLOsPPfJg,1065
147
- langroid-0.22.6.dist-info/METADATA,sha256=k9lDoCXrj1a8oEaphDoEeVfqf-2b2MkgNaY71axEE4w,57107
148
- langroid-0.22.6.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
149
- langroid-0.22.6.dist-info/RECORD,,
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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "langroid"
3
- version = "0.22.6"
3
+ version = "0.23.0"
4
4
  description = "Harness LLMs with Multi-Agent Programming"
5
5
  authors = ["Prasad Chalasani <pchalasani@gmail.com>"]
6
6
  readme = "README.md"