langroid 0.52.0__tar.gz → 0.52.2__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 (137) hide show
  1. {langroid-0.52.0 → langroid-0.52.2}/PKG-INFO +1 -1
  2. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/model_info.py +30 -0
  3. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/file_attachment.py +108 -18
  4. {langroid-0.52.0 → langroid-0.52.2}/pyproject.toml +1 -1
  5. {langroid-0.52.0 → langroid-0.52.2}/.gitignore +0 -0
  6. {langroid-0.52.0 → langroid-0.52.2}/LICENSE +0 -0
  7. {langroid-0.52.0 → langroid-0.52.2}/README.md +0 -0
  8. {langroid-0.52.0 → langroid-0.52.2}/langroid/__init__.py +0 -0
  9. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/__init__.py +0 -0
  10. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/base.py +0 -0
  11. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/batch.py +0 -0
  12. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/callbacks/__init__.py +0 -0
  13. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/callbacks/chainlit.py +0 -0
  14. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/chat_agent.py +0 -0
  15. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/chat_document.py +0 -0
  16. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/openai_assistant.py +0 -0
  17. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/__init__.py +0 -0
  18. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/arangodb/__init__.py +0 -0
  19. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  20. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/arangodb/system_messages.py +0 -0
  21. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/arangodb/tools.py +0 -0
  22. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/arangodb/utils.py +0 -0
  23. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/doc_chat_agent.py +0 -0
  24. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/doc_chat_task.py +0 -0
  25. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  26. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/lance_rag/__init__.py +0 -0
  27. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  28. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  29. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  30. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/lance_tools.py +0 -0
  31. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/neo4j/__init__.py +0 -0
  32. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  33. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  34. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/neo4j/system_messages.py +0 -0
  35. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/neo4j/tools.py +0 -0
  36. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  37. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/retriever_agent.py +0 -0
  38. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/sql/__init__.py +0 -0
  39. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  40. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/sql/utils/__init__.py +0 -0
  41. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  42. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  43. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/sql/utils/system_message.py +0 -0
  44. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/sql/utils/tools.py +0 -0
  45. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/special/table_chat_agent.py +0 -0
  46. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/task.py +0 -0
  47. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tool_message.py +0 -0
  48. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/__init__.py +0 -0
  49. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  50. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/exa_search_tool.py +0 -0
  51. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/file_tools.py +0 -0
  52. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/google_search_tool.py +0 -0
  53. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  54. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/orchestration.py +0 -0
  55. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/recipient_tool.py +0 -0
  56. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/retrieval_tool.py +0 -0
  57. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/rewind_tool.py +0 -0
  58. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/segment_extract_tool.py +0 -0
  59. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/tools/tavily_search_tool.py +0 -0
  60. {langroid-0.52.0 → langroid-0.52.2}/langroid/agent/xml_tool_message.py +0 -0
  61. {langroid-0.52.0 → langroid-0.52.2}/langroid/cachedb/__init__.py +0 -0
  62. {langroid-0.52.0 → langroid-0.52.2}/langroid/cachedb/base.py +0 -0
  63. {langroid-0.52.0 → langroid-0.52.2}/langroid/cachedb/momento_cachedb.py +0 -0
  64. {langroid-0.52.0 → langroid-0.52.2}/langroid/cachedb/redis_cachedb.py +0 -0
  65. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/__init__.py +0 -0
  66. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/base.py +0 -0
  67. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/models.py +0 -0
  68. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/protoc/__init__.py +0 -0
  69. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  70. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  71. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  72. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  73. {langroid-0.52.0 → langroid-0.52.2}/langroid/embedding_models/remote_embeds.py +0 -0
  74. {langroid-0.52.0 → langroid-0.52.2}/langroid/exceptions.py +0 -0
  75. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/__init__.py +0 -0
  76. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/azure_openai.py +0 -0
  77. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/base.py +0 -0
  78. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/config.py +0 -0
  79. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/mock_lm.py +0 -0
  80. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/openai_gpt.py +0 -0
  81. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  82. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/prompt_formatter/base.py +0 -0
  83. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  84. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  85. {langroid-0.52.0 → langroid-0.52.2}/langroid/language_models/utils.py +0 -0
  86. {langroid-0.52.0 → langroid-0.52.2}/langroid/mytypes.py +0 -0
  87. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/__init__.py +0 -0
  88. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/agent_chats.py +0 -0
  89. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/code_parser.py +0 -0
  90. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/document_parser.py +0 -0
  91. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/md_parser.py +0 -0
  92. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/para_sentence_split.py +0 -0
  93. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/parse_json.py +0 -0
  94. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/parser.py +0 -0
  95. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/pdf_utils.py +0 -0
  96. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/repo_loader.py +0 -0
  97. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/routing.py +0 -0
  98. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/search.py +0 -0
  99. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/spider.py +0 -0
  100. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/table_loader.py +0 -0
  101. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/url_loader.py +0 -0
  102. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/urls.py +0 -0
  103. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/utils.py +0 -0
  104. {langroid-0.52.0 → langroid-0.52.2}/langroid/parsing/web_search.py +0 -0
  105. {langroid-0.52.0 → langroid-0.52.2}/langroid/prompts/__init__.py +0 -0
  106. {langroid-0.52.0 → langroid-0.52.2}/langroid/prompts/dialog.py +0 -0
  107. {langroid-0.52.0 → langroid-0.52.2}/langroid/prompts/prompts_config.py +0 -0
  108. {langroid-0.52.0 → langroid-0.52.2}/langroid/prompts/templates.py +0 -0
  109. {langroid-0.52.0 → langroid-0.52.2}/langroid/py.typed +0 -0
  110. {langroid-0.52.0 → langroid-0.52.2}/langroid/pydantic_v1/__init__.py +0 -0
  111. {langroid-0.52.0 → langroid-0.52.2}/langroid/pydantic_v1/main.py +0 -0
  112. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/__init__.py +0 -0
  113. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/algorithms/__init__.py +0 -0
  114. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/algorithms/graph.py +0 -0
  115. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/configuration.py +0 -0
  116. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/constants.py +0 -0
  117. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/git_utils.py +0 -0
  118. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/globals.py +0 -0
  119. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/logging.py +0 -0
  120. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/object_registry.py +0 -0
  121. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/output/__init__.py +0 -0
  122. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/output/citations.py +0 -0
  123. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/output/printing.py +0 -0
  124. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/output/status.py +0 -0
  125. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/pandas_utils.py +0 -0
  126. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/pydantic_utils.py +0 -0
  127. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/system.py +0 -0
  128. {langroid-0.52.0 → langroid-0.52.2}/langroid/utils/types.py +0 -0
  129. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/__init__.py +0 -0
  130. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/base.py +0 -0
  131. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/chromadb.py +0 -0
  132. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/lancedb.py +0 -0
  133. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/meilisearch.py +0 -0
  134. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/pineconedb.py +0 -0
  135. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/postgres.py +0 -0
  136. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/qdrantdb.py +0 -0
  137. {langroid-0.52.0 → langroid-0.52.2}/langroid/vector_store/weaviatedb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.52.0
3
+ Version: 0.52.2
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -31,6 +31,8 @@ class OpenAIChatModel(ModelName):
31
31
  O1 = "o1"
32
32
  O1_MINI = "o1-mini"
33
33
  O3_MINI = "o3-mini"
34
+ O3 = "o3"
35
+ O4_MINI = "o4-mini"
34
36
  GPT4_1 = "gpt-4.1"
35
37
  GPT4_1_MINI = "gpt-4.1-mini"
36
38
  GPT4_1_NANO = "gpt-4.1-nano"
@@ -226,6 +228,20 @@ MODEL_INFO: Dict[str, ModelInfo] = {
226
228
  has_tools=False,
227
229
  description="O1 Reasoning LM",
228
230
  ),
231
+ OpenAIChatModel.O3.value: ModelInfo(
232
+ name=OpenAIChatModel.O3.value,
233
+ provider=ModelProvider.OPENAI,
234
+ context_length=200_000,
235
+ max_output_tokens=100_000,
236
+ input_cost_per_million=10.0,
237
+ output_cost_per_million=40.0,
238
+ allows_streaming=True,
239
+ allows_system_message=False,
240
+ unsupported_params=["temperature"],
241
+ rename_params={"max_tokens": "max_completion_tokens"},
242
+ has_tools=False,
243
+ description="O1 Reasoning LM",
244
+ ),
229
245
  OpenAIChatModel.O1_MINI.value: ModelInfo(
230
246
  name=OpenAIChatModel.O1_MINI.value,
231
247
  provider=ModelProvider.OPENAI,
@@ -254,6 +270,20 @@ MODEL_INFO: Dict[str, ModelInfo] = {
254
270
  has_tools=False,
255
271
  description="O3 Mini Reasoning LM",
256
272
  ),
273
+ OpenAIChatModel.O4_MINI.value: ModelInfo(
274
+ name=OpenAIChatModel.O4_MINI.value,
275
+ provider=ModelProvider.OPENAI,
276
+ context_length=200_000,
277
+ max_output_tokens=100_000,
278
+ input_cost_per_million=1.10,
279
+ output_cost_per_million=4.40,
280
+ allows_streaming=False,
281
+ allows_system_message=False,
282
+ unsupported_params=["temperature", "stream"],
283
+ rename_params={"max_tokens": "max_completion_tokens"},
284
+ has_tools=False,
285
+ description="O3 Mini Reasoning LM",
286
+ ),
257
287
  # Anthropic Models
258
288
  AnthropicModel.CLAUDE_3_5_SONNET.value: ModelInfo(
259
289
  name=AnthropicModel.CLAUDE_3_5_SONNET.value,
@@ -3,6 +3,7 @@ import mimetypes
3
3
  import uuid
4
4
  from pathlib import Path
5
5
  from typing import Any, BinaryIO, Dict, Optional, Union
6
+ from urllib.parse import urlparse
6
7
 
7
8
  from langroid.pydantic_v1 import BaseModel
8
9
 
@@ -13,6 +14,8 @@ class FileAttachment(BaseModel):
13
14
  content: bytes
14
15
  filename: Optional[str] = None
15
16
  mime_type: str = "application/octet-stream"
17
+ url: str | None = None
18
+ detail: str | None = None
16
19
 
17
20
  def __init__(self, **data: Any) -> None:
18
21
  """Initialize with sensible defaults for filename if not provided."""
@@ -23,7 +26,11 @@ class FileAttachment(BaseModel):
23
26
  super().__init__(**data)
24
27
 
25
28
  @classmethod
26
- def from_path(cls, file_path: Union[str, Path]) -> "FileAttachment":
29
+ def _from_path(
30
+ cls,
31
+ file_path: Union[str, Path],
32
+ detail: Optional[str] = None,
33
+ ) -> "FileAttachment":
27
34
  """Create a FileAttachment from a file path.
28
35
 
29
36
  Args:
@@ -40,7 +47,74 @@ class FileAttachment(BaseModel):
40
47
  if mime_type is None:
41
48
  mime_type = "application/octet-stream"
42
49
 
43
- return cls(content=content, filename=path.name, mime_type=mime_type)
50
+ return cls(
51
+ content=content,
52
+ filename=path.name,
53
+ mime_type=mime_type,
54
+ detail=detail,
55
+ )
56
+
57
+ @classmethod
58
+ def _from_url(
59
+ cls,
60
+ url: str,
61
+ content: Optional[bytes] = None,
62
+ filename: Optional[str] = None,
63
+ mime_type: Optional[str] = None,
64
+ detail: Optional[str] = None,
65
+ ) -> "FileAttachment":
66
+ """Create a FileAttachment from a URL.
67
+
68
+ Args:
69
+ url: URL to the file
70
+ content: Optional raw bytes content (if already fetched)
71
+ filename: Optional name to use for the file
72
+ mime_type: MIME type of the content, guessed from filename or url
73
+
74
+ Returns:
75
+ FileAttachment instance
76
+ """
77
+ if filename is None and url:
78
+ # Extract filename from URL if possible
79
+
80
+ parsed_url = urlparse(url)
81
+ path = parsed_url.path
82
+ filename = path.split("/")[-1] if path else None
83
+
84
+ if mime_type is None and filename:
85
+ mime_type, _ = mimetypes.guess_type(filename)
86
+
87
+ return cls(
88
+ content=content or b"", # Empty bytes if no content provided
89
+ filename=filename,
90
+ mime_type=mime_type or "application/octet-stream",
91
+ url=url,
92
+ detail=detail,
93
+ )
94
+
95
+ @classmethod
96
+ def from_path(
97
+ cls,
98
+ path: Union[str, Path],
99
+ detail: str | None = None,
100
+ ) -> "FileAttachment":
101
+ """Create a FileAttachment from either a local file path or a URL.
102
+
103
+ Args:
104
+ path_or_url: Path to the file or URL to fetch
105
+
106
+ Returns:
107
+ FileAttachment instance
108
+ """
109
+ # Convert to string if Path object
110
+ path_str = str(path)
111
+
112
+ # Check if it's a URL
113
+ if path_str.startswith(("http://", "https://", "ftp://")):
114
+ return cls._from_url(url=path_str, detail=detail)
115
+ else:
116
+ # Assume it's a local file path
117
+ return cls._from_path(path_str, detail=detail)
44
118
 
45
119
  @classmethod
46
120
  def from_bytes(
@@ -137,21 +211,37 @@ class FileAttachment(BaseModel):
137
211
  """
138
212
  if "gemini" in model.lower():
139
213
  return dict(type="image_url", image_url=dict(url=self.to_data_uri()))
140
- elif "claude" in model.lower():
214
+ else:
141
215
  # optimistically try this: some API proxies like litellm
142
216
  # support this, and others may not.
143
- return dict(
144
- type="file",
145
- file=dict(
146
- file_data=self.to_data_uri(),
147
- ),
148
- )
149
- else:
150
- # fallback: assume file upload is similar to OpenAI API
151
- return dict(
152
- type="file",
153
- file=dict(
154
- filename=self.filename,
155
- file_data=self.to_data_uri(),
156
- ),
157
- )
217
+ # For OpenAI models, handle images differently than other files
218
+ # For OpenAI models, handle images differently than other files
219
+ if self.mime_type and self.mime_type.startswith("image/"):
220
+ image_url_dict = {}
221
+
222
+ # If we have a URL and it's a full http/https URL, use it directly
223
+ if self.url and (
224
+ self.url.startswith("http://") or self.url.startswith("https://")
225
+ ):
226
+ image_url_dict["url"] = self.url
227
+ # Otherwise use base64 data URI
228
+ else:
229
+ image_url_dict["url"] = self.to_data_uri()
230
+
231
+ # Add detail parameter if specified
232
+ if self.detail:
233
+ image_url_dict["detail"] = self.detail
234
+
235
+ return dict(
236
+ type="image_url",
237
+ image_url=image_url_dict,
238
+ )
239
+ else:
240
+ # For non-image files
241
+ return dict(
242
+ type="file",
243
+ file=dict(
244
+ filename=self.filename,
245
+ file_data=self.to_data_uri(),
246
+ ),
247
+ )
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.52.0"
3
+ version = "0.52.2"
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