langroid 0.52.1__tar.gz → 0.52.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 (137) hide show
  1. {langroid-0.52.1 → langroid-0.52.3}/PKG-INFO +1 -1
  2. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/file_attachment.py +101 -12
  3. {langroid-0.52.1 → langroid-0.52.3}/pyproject.toml +1 -1
  4. {langroid-0.52.1 → langroid-0.52.3}/.gitignore +0 -0
  5. {langroid-0.52.1 → langroid-0.52.3}/LICENSE +0 -0
  6. {langroid-0.52.1 → langroid-0.52.3}/README.md +0 -0
  7. {langroid-0.52.1 → langroid-0.52.3}/langroid/__init__.py +0 -0
  8. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/__init__.py +0 -0
  9. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/base.py +0 -0
  10. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/batch.py +0 -0
  11. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/callbacks/__init__.py +0 -0
  12. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/callbacks/chainlit.py +0 -0
  13. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/chat_agent.py +0 -0
  14. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/chat_document.py +0 -0
  15. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/openai_assistant.py +0 -0
  16. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/__init__.py +0 -0
  17. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/arangodb/__init__.py +0 -0
  18. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  19. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/arangodb/system_messages.py +0 -0
  20. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/arangodb/tools.py +0 -0
  21. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/arangodb/utils.py +0 -0
  22. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/doc_chat_agent.py +0 -0
  23. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/doc_chat_task.py +0 -0
  24. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  25. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/lance_rag/__init__.py +0 -0
  26. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  27. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  28. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  29. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/lance_tools.py +0 -0
  30. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/neo4j/__init__.py +0 -0
  31. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  32. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  33. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/neo4j/system_messages.py +0 -0
  34. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/neo4j/tools.py +0 -0
  35. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  36. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/retriever_agent.py +0 -0
  37. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/sql/__init__.py +0 -0
  38. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  39. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/sql/utils/__init__.py +0 -0
  40. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  41. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  42. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/sql/utils/system_message.py +0 -0
  43. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/sql/utils/tools.py +0 -0
  44. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/special/table_chat_agent.py +0 -0
  45. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/task.py +0 -0
  46. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tool_message.py +0 -0
  47. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/__init__.py +0 -0
  48. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  49. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/exa_search_tool.py +0 -0
  50. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/file_tools.py +0 -0
  51. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/google_search_tool.py +0 -0
  52. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  53. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/orchestration.py +0 -0
  54. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/recipient_tool.py +0 -0
  55. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/retrieval_tool.py +0 -0
  56. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/rewind_tool.py +0 -0
  57. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/segment_extract_tool.py +0 -0
  58. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/tools/tavily_search_tool.py +0 -0
  59. {langroid-0.52.1 → langroid-0.52.3}/langroid/agent/xml_tool_message.py +0 -0
  60. {langroid-0.52.1 → langroid-0.52.3}/langroid/cachedb/__init__.py +0 -0
  61. {langroid-0.52.1 → langroid-0.52.3}/langroid/cachedb/base.py +0 -0
  62. {langroid-0.52.1 → langroid-0.52.3}/langroid/cachedb/momento_cachedb.py +0 -0
  63. {langroid-0.52.1 → langroid-0.52.3}/langroid/cachedb/redis_cachedb.py +0 -0
  64. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/__init__.py +0 -0
  65. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/base.py +0 -0
  66. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/models.py +0 -0
  67. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/protoc/__init__.py +0 -0
  68. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  69. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  70. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  71. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  72. {langroid-0.52.1 → langroid-0.52.3}/langroid/embedding_models/remote_embeds.py +0 -0
  73. {langroid-0.52.1 → langroid-0.52.3}/langroid/exceptions.py +0 -0
  74. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/__init__.py +0 -0
  75. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/azure_openai.py +0 -0
  76. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/base.py +0 -0
  77. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/config.py +0 -0
  78. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/mock_lm.py +0 -0
  79. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/model_info.py +0 -0
  80. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/openai_gpt.py +0 -0
  81. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  82. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/prompt_formatter/base.py +0 -0
  83. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  84. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  85. {langroid-0.52.1 → langroid-0.52.3}/langroid/language_models/utils.py +0 -0
  86. {langroid-0.52.1 → langroid-0.52.3}/langroid/mytypes.py +0 -0
  87. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/__init__.py +0 -0
  88. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/agent_chats.py +0 -0
  89. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/code_parser.py +0 -0
  90. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/document_parser.py +0 -0
  91. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/md_parser.py +0 -0
  92. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/para_sentence_split.py +0 -0
  93. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/parse_json.py +0 -0
  94. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/parser.py +0 -0
  95. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/pdf_utils.py +0 -0
  96. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/repo_loader.py +0 -0
  97. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/routing.py +0 -0
  98. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/search.py +0 -0
  99. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/spider.py +0 -0
  100. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/table_loader.py +0 -0
  101. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/url_loader.py +0 -0
  102. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/urls.py +0 -0
  103. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/utils.py +0 -0
  104. {langroid-0.52.1 → langroid-0.52.3}/langroid/parsing/web_search.py +0 -0
  105. {langroid-0.52.1 → langroid-0.52.3}/langroid/prompts/__init__.py +0 -0
  106. {langroid-0.52.1 → langroid-0.52.3}/langroid/prompts/dialog.py +0 -0
  107. {langroid-0.52.1 → langroid-0.52.3}/langroid/prompts/prompts_config.py +0 -0
  108. {langroid-0.52.1 → langroid-0.52.3}/langroid/prompts/templates.py +0 -0
  109. {langroid-0.52.1 → langroid-0.52.3}/langroid/py.typed +0 -0
  110. {langroid-0.52.1 → langroid-0.52.3}/langroid/pydantic_v1/__init__.py +0 -0
  111. {langroid-0.52.1 → langroid-0.52.3}/langroid/pydantic_v1/main.py +0 -0
  112. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/__init__.py +0 -0
  113. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/algorithms/__init__.py +0 -0
  114. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/algorithms/graph.py +0 -0
  115. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/configuration.py +0 -0
  116. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/constants.py +0 -0
  117. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/git_utils.py +0 -0
  118. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/globals.py +0 -0
  119. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/logging.py +0 -0
  120. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/object_registry.py +0 -0
  121. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/output/__init__.py +0 -0
  122. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/output/citations.py +0 -0
  123. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/output/printing.py +0 -0
  124. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/output/status.py +0 -0
  125. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/pandas_utils.py +0 -0
  126. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/pydantic_utils.py +0 -0
  127. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/system.py +0 -0
  128. {langroid-0.52.1 → langroid-0.52.3}/langroid/utils/types.py +0 -0
  129. {langroid-0.52.1 → langroid-0.52.3}/langroid/vector_store/__init__.py +0 -0
  130. {langroid-0.52.1 → langroid-0.52.3}/langroid/vector_store/base.py +0 -0
  131. {langroid-0.52.1 → langroid-0.52.3}/langroid/vector_store/chromadb.py +0 -0
  132. {langroid-0.52.1 → langroid-0.52.3}/langroid/vector_store/lancedb.py +0 -0
  133. {langroid-0.52.1 → langroid-0.52.3}/langroid/vector_store/meilisearch.py +0 -0
  134. {langroid-0.52.1 → langroid-0.52.3}/langroid/vector_store/pineconedb.py +0 -0
  135. {langroid-0.52.1 → langroid-0.52.3}/langroid/vector_store/postgres.py +0 -0
  136. {langroid-0.52.1 → langroid-0.52.3}/langroid/vector_store/qdrantdb.py +0 -0
  137. {langroid-0.52.1 → langroid-0.52.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.52.1
3
+ Version: 0.52.3
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -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(
@@ -135,19 +209,34 @@ class FileAttachment(BaseModel):
135
209
  Returns:
136
210
  Dictionary with file data
137
211
  """
138
- if "gemini" in model.lower():
139
- return dict(type="image_url", image_url=dict(url=self.to_data_uri()))
140
- elif "claude" in model.lower():
141
- # optimistically try this: some API proxies like litellm
142
- # support this, and others may not.
212
+ if (
213
+ self.mime_type
214
+ and self.mime_type.startswith("image/")
215
+ or "gemini" in model.lower()
216
+ ):
217
+ # for gemini models, we use `image_url` for both pdf-files and images
218
+
219
+ image_url_dict = {}
220
+
221
+ # If we have a URL and it's a full http/https URL, use it directly
222
+ if self.url and (
223
+ self.url.startswith("http://") or self.url.startswith("https://")
224
+ ):
225
+ image_url_dict["url"] = self.url
226
+ # Otherwise use base64 data URI
227
+ else:
228
+ image_url_dict["url"] = self.to_data_uri()
229
+
230
+ # Add detail parameter if specified
231
+ if self.detail:
232
+ image_url_dict["detail"] = self.detail
233
+
143
234
  return dict(
144
- type="file",
145
- file=dict(
146
- file_data=self.to_data_uri(),
147
- ),
235
+ type="image_url",
236
+ image_url=image_url_dict,
148
237
  )
149
238
  else:
150
- # fallback: assume file upload is similar to OpenAI API
239
+ # For non-image files
151
240
  return dict(
152
241
  type="file",
153
242
  file=dict(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.52.1"
3
+ version = "0.52.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