langroid 0.41.2__tar.gz → 0.41.3__tar.gz

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.
Files changed (135) hide show
  1. {langroid-0.41.2 → langroid-0.41.3}/PKG-INFO +1 -1
  2. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/base.py +1 -2
  3. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/chat_agent.py +3 -0
  4. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/base.py +30 -1
  5. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/openai_gpt.py +12 -55
  6. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/types.py +20 -0
  7. {langroid-0.41.2 → langroid-0.41.3}/pyproject.toml +1 -1
  8. {langroid-0.41.2 → langroid-0.41.3}/.gitignore +0 -0
  9. {langroid-0.41.2 → langroid-0.41.3}/LICENSE +0 -0
  10. {langroid-0.41.2 → langroid-0.41.3}/README.md +0 -0
  11. {langroid-0.41.2 → langroid-0.41.3}/langroid/__init__.py +0 -0
  12. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/__init__.py +0 -0
  13. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/batch.py +0 -0
  14. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/callbacks/__init__.py +0 -0
  15. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/callbacks/chainlit.py +0 -0
  16. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/chat_document.py +0 -0
  17. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/openai_assistant.py +0 -0
  18. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/__init__.py +0 -0
  19. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/arangodb/__init__.py +0 -0
  20. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  21. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/arangodb/system_messages.py +0 -0
  22. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/arangodb/tools.py +0 -0
  23. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/arangodb/utils.py +0 -0
  24. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/doc_chat_agent.py +0 -0
  25. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  26. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/lance_rag/__init__.py +0 -0
  27. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  28. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  29. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  30. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/lance_tools.py +0 -0
  31. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/neo4j/__init__.py +0 -0
  32. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  33. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  34. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/neo4j/system_messages.py +0 -0
  35. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/neo4j/tools.py +0 -0
  36. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  37. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/retriever_agent.py +0 -0
  38. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/sql/__init__.py +0 -0
  39. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  40. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/sql/utils/__init__.py +0 -0
  41. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  42. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  43. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/sql/utils/system_message.py +0 -0
  44. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/sql/utils/tools.py +0 -0
  45. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/special/table_chat_agent.py +0 -0
  46. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/task.py +0 -0
  47. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tool_message.py +0 -0
  48. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/__init__.py +0 -0
  49. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  50. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/exa_search_tool.py +0 -0
  51. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/file_tools.py +0 -0
  52. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/google_search_tool.py +0 -0
  53. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  54. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/orchestration.py +0 -0
  55. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/recipient_tool.py +0 -0
  56. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/retrieval_tool.py +0 -0
  57. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/rewind_tool.py +0 -0
  58. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/segment_extract_tool.py +0 -0
  59. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/tools/tavily_search_tool.py +0 -0
  60. {langroid-0.41.2 → langroid-0.41.3}/langroid/agent/xml_tool_message.py +0 -0
  61. {langroid-0.41.2 → langroid-0.41.3}/langroid/cachedb/__init__.py +0 -0
  62. {langroid-0.41.2 → langroid-0.41.3}/langroid/cachedb/base.py +0 -0
  63. {langroid-0.41.2 → langroid-0.41.3}/langroid/cachedb/momento_cachedb.py +0 -0
  64. {langroid-0.41.2 → langroid-0.41.3}/langroid/cachedb/redis_cachedb.py +0 -0
  65. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/__init__.py +0 -0
  66. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/base.py +0 -0
  67. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/models.py +0 -0
  68. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/protoc/__init__.py +0 -0
  69. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  70. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  71. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  72. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  73. {langroid-0.41.2 → langroid-0.41.3}/langroid/embedding_models/remote_embeds.py +0 -0
  74. {langroid-0.41.2 → langroid-0.41.3}/langroid/exceptions.py +0 -0
  75. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/__init__.py +0 -0
  76. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/azure_openai.py +0 -0
  77. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/config.py +0 -0
  78. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/mock_lm.py +0 -0
  79. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/model_info.py +0 -0
  80. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  81. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/prompt_formatter/base.py +0 -0
  82. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  83. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  84. {langroid-0.41.2 → langroid-0.41.3}/langroid/language_models/utils.py +0 -0
  85. {langroid-0.41.2 → langroid-0.41.3}/langroid/mytypes.py +0 -0
  86. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/__init__.py +0 -0
  87. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/agent_chats.py +0 -0
  88. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/code_parser.py +0 -0
  89. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/document_parser.py +0 -0
  90. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/para_sentence_split.py +0 -0
  91. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/parse_json.py +0 -0
  92. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/parser.py +0 -0
  93. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/pdf_utils.py +0 -0
  94. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/repo_loader.py +0 -0
  95. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/routing.py +0 -0
  96. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/search.py +0 -0
  97. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/spider.py +0 -0
  98. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/table_loader.py +0 -0
  99. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/url_loader.py +0 -0
  100. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/urls.py +0 -0
  101. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/utils.py +0 -0
  102. {langroid-0.41.2 → langroid-0.41.3}/langroid/parsing/web_search.py +0 -0
  103. {langroid-0.41.2 → langroid-0.41.3}/langroid/prompts/__init__.py +0 -0
  104. {langroid-0.41.2 → langroid-0.41.3}/langroid/prompts/dialog.py +0 -0
  105. {langroid-0.41.2 → langroid-0.41.3}/langroid/prompts/prompts_config.py +0 -0
  106. {langroid-0.41.2 → langroid-0.41.3}/langroid/prompts/templates.py +0 -0
  107. {langroid-0.41.2 → langroid-0.41.3}/langroid/py.typed +0 -0
  108. {langroid-0.41.2 → langroid-0.41.3}/langroid/pydantic_v1/__init__.py +0 -0
  109. {langroid-0.41.2 → langroid-0.41.3}/langroid/pydantic_v1/main.py +0 -0
  110. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/__init__.py +0 -0
  111. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/algorithms/__init__.py +0 -0
  112. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/algorithms/graph.py +0 -0
  113. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/configuration.py +0 -0
  114. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/constants.py +0 -0
  115. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/git_utils.py +0 -0
  116. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/globals.py +0 -0
  117. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/logging.py +0 -0
  118. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/object_registry.py +0 -0
  119. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/output/__init__.py +0 -0
  120. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/output/citations.py +0 -0
  121. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/output/printing.py +0 -0
  122. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/output/status.py +0 -0
  123. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/pandas_utils.py +0 -0
  124. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/pydantic_utils.py +0 -0
  125. {langroid-0.41.2 → langroid-0.41.3}/langroid/utils/system.py +0 -0
  126. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/__init__.py +0 -0
  127. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/base.py +0 -0
  128. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/chromadb.py +0 -0
  129. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/lancedb.py +0 -0
  130. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/meilisearch.py +0 -0
  131. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/momento.py +0 -0
  132. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/pineconedb.py +0 -0
  133. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/postgres.py +0 -0
  134. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/qdrantdb.py +0 -0
  135. {langroid-0.41.2 → langroid-0.41.3}/langroid/vector_store/weaviatedb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.41.2
3
+ Version: 0.41.3
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -147,8 +147,7 @@ class Agent(ABC):
147
147
  self.llm_tools_usable: Set[str] = set()
148
148
  self.llm_tools_known: Set[str] = set() # all known tools, handled/used or not
149
149
  # Indicates which tool-names are allowed to be inferred when
150
- # the LLM "forgets" to include the request field in its
151
- # tool-call.
150
+ # the LLM "forgets" to include the request field in its tool-call.
152
151
  self.enabled_requests_for_inference: Optional[Set[str]] = (
153
152
  None # If None, we allow all
154
153
  )
@@ -37,6 +37,7 @@ from langroid.utils.configuration import settings
37
37
  from langroid.utils.object_registry import ObjectRegistry
38
38
  from langroid.utils.output import status
39
39
  from langroid.utils.pydantic_utils import PydanticWrapper, get_pydantic_wrapper
40
+ from langroid.utils.types import is_callable
40
41
 
41
42
  console = Console()
42
43
 
@@ -613,6 +614,8 @@ class ChatAgent(Agent):
613
614
  return AgentDoneTool(
614
615
  content=msg.content, tools=msg.tool_messages
615
616
  )
617
+ elif is_callable(no_tool_option):
618
+ return no_tool_option(msg)
616
619
  # Otherwise just return `no_tool_option` as is:
617
620
  # This can be any string, such as a specific nudge/reminder to the LLM,
618
621
  # or even something like ResultTool etc.
@@ -19,7 +19,7 @@ from typing import (
19
19
 
20
20
  from langroid.cachedb.base import CacheDBConfig
21
21
  from langroid.cachedb.redis_cachedb import RedisCacheConfig
22
- from langroid.language_models.model_info import get_model_info
22
+ from langroid.language_models.model_info import ModelInfo, get_model_info
23
23
  from langroid.parsing.agent_chats import parse_message
24
24
  from langroid.parsing.parse_json import parse_imperfect_json, top_level_json_field
25
25
  from langroid.prompts.dialog import collate_chat_history
@@ -425,6 +425,7 @@ class LanguageModel(ABC):
425
425
 
426
426
  def __init__(self, config: LLMConfig = LLMConfig()):
427
427
  self.config = config
428
+ self.chat_model_orig = config.chat_model
428
429
 
429
430
  @staticmethod
430
431
  def create(config: Optional[LLMConfig]) -> Optional["LanguageModel"]:
@@ -595,6 +596,34 @@ class LanguageModel(ABC):
595
596
  def __call__(self, prompt: str, max_tokens: int) -> LLMResponse:
596
597
  return self.generate(prompt, max_tokens)
597
598
 
599
+ def info(self) -> ModelInfo:
600
+ """Info of relevant chat model"""
601
+ model = (
602
+ self.config.completion_model
603
+ if self.config.use_completion_for_chat
604
+ else self.config.chat_model
605
+ )
606
+ orig_model = (
607
+ self.config.completion_model
608
+ if self.config.use_completion_for_chat
609
+ else self.chat_model_orig
610
+ )
611
+ return get_model_info(orig_model, model)
612
+
613
+ def completion_info(self) -> ModelInfo:
614
+ """Info of relevant completion model"""
615
+ model = (
616
+ self.config.chat_model
617
+ if self.config.use_chat_for_completion
618
+ else self.config.completion_model
619
+ )
620
+ orig_model = (
621
+ self.chat_model_orig
622
+ if self.config.use_chat_for_completion
623
+ else self.config.completion_model
624
+ )
625
+ return get_model_info(orig_model, model)
626
+
598
627
  def chat_context_length(self) -> int:
599
628
  return self.config.chat_context_length
600
629
 
@@ -50,7 +50,6 @@ from langroid.language_models.model_info import (
50
50
  DeepSeekModel,
51
51
  GeminiModel,
52
52
  OpenAI_API_ParamInfo,
53
- get_model_info,
54
53
  )
55
54
  from langroid.language_models.model_info import (
56
55
  OpenAIChatModel as OpenAIChatModel,
@@ -233,6 +232,7 @@ class OpenAIGPTConfig(LLMConfig):
233
232
  params: OpenAICallParams | None = None
234
233
  # these can be any model name that is served at an OpenAI-compatible API end point
235
234
  chat_model: str = default_openai_chat_model
235
+ chat_model_orig: str = default_openai_chat_model
236
236
  completion_model: str = default_openai_completion_model
237
237
  run_on_first_use: Callable[[], None] = noop
238
238
  parallel_tool_calls: Optional[bool] = None
@@ -372,7 +372,8 @@ class OpenAIGPT(LanguageModel):
372
372
  super().__init__(config)
373
373
  self.config: OpenAIGPTConfig = config
374
374
  # save original model name such as `provider/model` before
375
- # we strip out the `provider`
375
+ # we strip out the `provider` - we retain the original in
376
+ # case some params are specific to a provider.
376
377
  self.chat_model_orig = self.config.chat_model
377
378
 
378
379
  # Run the first time the model is used
@@ -467,11 +468,7 @@ class OpenAIGPT(LanguageModel):
467
468
  # these features (with JSON schema restricted to a limited set of models)
468
469
  self.supports_strict_tools = self.api_base is None
469
470
  self.supports_json_schema = (
470
- self.api_base is None
471
- and get_model_info( # look for family/provider-specific then generic
472
- self.chat_model_orig, # e.g. "gemini/gemini-2.0-flash"
473
- self.config.chat_model, # e.g. "gemini-2.0-flash"
474
- ).has_structured_output
471
+ self.api_base is None and self.info().has_structured_output
475
472
  )
476
473
 
477
474
  if settings.chat_model != "":
@@ -621,13 +618,7 @@ class OpenAIGPT(LanguageModel):
621
618
  return self.config.chat_model in openai_chat_models
622
619
 
623
620
  def supports_functions_or_tools(self) -> bool:
624
- return (
625
- self.is_openai_chat_model()
626
- and get_model_info(
627
- self.chat_model_orig,
628
- self.config.chat_model,
629
- ).has_tools
630
- )
621
+ return self.is_openai_chat_model() and self.info().has_tools
631
622
 
632
623
  def is_openai_completion_model(self) -> bool:
633
624
  openai_completion_models = [e.value for e in OpenAICompletionModel]
@@ -650,11 +641,7 @@ class OpenAIGPT(LanguageModel):
650
641
  """
651
642
  List of params that are not supported by the current model
652
643
  """
653
- model_info = get_model_info(
654
- self.chat_model_orig,
655
- self.config.chat_model,
656
- )
657
- unsupported = set(model_info.unsupported_params)
644
+ unsupported = set(self.info().unsupported_params)
658
645
  for param, model_list in OpenAI_API_ParamInfo().params.items():
659
646
  if (
660
647
  self.config.chat_model not in model_list
@@ -668,44 +655,21 @@ class OpenAIGPT(LanguageModel):
668
655
  Map of param name -> new name for specific models.
669
656
  Currently main troublemaker is o1* series.
670
657
  """
671
- return get_model_info(
672
- self.chat_model_orig,
673
- self.config.chat_model,
674
- ).rename_params
658
+ return self.info().rename_params
675
659
 
676
660
  def chat_context_length(self) -> int:
677
661
  """
678
662
  Context-length for chat-completion models/endpoints
679
663
  Get it from the dict, otherwise fail-over to general method
680
664
  """
681
- model = (
682
- self.config.completion_model
683
- if self.config.use_completion_for_chat
684
- else self.config.chat_model
685
- )
686
- orig_model = (
687
- self.config.completion_model
688
- if self.config.use_completion_for_chat
689
- else self.chat_model_orig
690
- )
691
- return get_model_info(orig_model, model).context_length
665
+ return self.info().context_length
692
666
 
693
667
  def completion_context_length(self) -> int:
694
668
  """
695
669
  Context-length for completion models/endpoints
696
670
  Get it from the dict, otherwise fail-over to general method
697
671
  """
698
- model = (
699
- self.config.chat_model
700
- if self.config.use_chat_for_completion
701
- else self.config.completion_model
702
- )
703
- orig_model = (
704
- self.chat_model_orig
705
- if self.config.use_chat_for_completion
706
- else self.config.completion_model
707
- )
708
- return get_model_info(orig_model, model).context_length
672
+ return self.completion_info().context_length
709
673
 
710
674
  def chat_cost(self) -> Tuple[float, float]:
711
675
  """
@@ -713,7 +677,7 @@ class OpenAIGPT(LanguageModel):
713
677
  models/endpoints.
714
678
  Get it from the dict, otherwise fail-over to general method
715
679
  """
716
- info = get_model_info(self.config.chat_model)
680
+ info = self.info()
717
681
  return (info.input_cost_per_million / 1000, info.output_cost_per_million / 1000)
718
682
 
719
683
  def set_stream(self, stream: bool) -> bool:
@@ -731,10 +695,7 @@ class OpenAIGPT(LanguageModel):
731
695
  return (
732
696
  self.config.stream
733
697
  and settings.stream
734
- and get_model_info(
735
- self.chat_model_orig,
736
- self.config.chat_model,
737
- ).allows_streaming
698
+ and self.info().allows_streaming
738
699
  and not settings.quiet
739
700
  )
740
701
 
@@ -1744,11 +1705,7 @@ class OpenAIGPT(LanguageModel):
1744
1705
  args: Dict[str, Any] = dict(
1745
1706
  model=chat_model,
1746
1707
  messages=[
1747
- m.api_dict(
1748
- has_system_role=get_model_info(
1749
- self.config.chat_model
1750
- ).allows_system_message
1751
- )
1708
+ m.api_dict(has_system_role=self.info().allows_system_message)
1752
1709
  for m in (llm_messages)
1753
1710
  ],
1754
1711
  max_tokens=max_tokens,
@@ -1,5 +1,6 @@
1
1
  import json
2
2
  import logging
3
+ from inspect import signature
3
4
  from typing import Any, Optional, Type, TypeVar, Union, get_args, get_origin
4
5
 
5
6
  from langroid.pydantic_v1 import BaseModel
@@ -91,3 +92,22 @@ def from_string(
91
92
  return s
92
93
  else:
93
94
  return None
95
+
96
+
97
+ def is_callable(obj: Any, k: int = 1) -> bool:
98
+ """Check if object is callable and accepts exactly k args.
99
+
100
+ Args:
101
+ obj: Object to check
102
+
103
+ Returns:
104
+ bool: True if object is callable with k args, False otherwise
105
+ """
106
+ if not callable(obj):
107
+ return False
108
+ try:
109
+ sig = signature(obj)
110
+ params = list(sig.parameters.values())
111
+ return len(params) == k
112
+ except ValueError:
113
+ return False
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.41.2"
3
+ version = "0.41.3"
4
4
  authors = [
5
5
  {name = "Prasad Chalasani", email = "pchalasani@gmail.com"},
6
6
  ]
File without changes
File without changes
File without changes
File without changes
File without changes