langroid 0.59.9__tar.gz → 0.59.11__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 (146) hide show
  1. {langroid-0.59.9 → langroid-0.59.11}/PKG-INFO +1 -1
  2. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/models.py +67 -2
  3. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/parse_json.py +25 -8
  4. {langroid-0.59.9 → langroid-0.59.11}/pyproject.toml +1 -1
  5. {langroid-0.59.9 → langroid-0.59.11}/.gitignore +0 -0
  6. {langroid-0.59.9 → langroid-0.59.11}/LICENSE +0 -0
  7. {langroid-0.59.9 → langroid-0.59.11}/README.md +0 -0
  8. {langroid-0.59.9 → langroid-0.59.11}/langroid/__init__.py +0 -0
  9. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/__init__.py +0 -0
  10. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/base.py +0 -0
  11. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/batch.py +0 -0
  12. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/callbacks/__init__.py +0 -0
  13. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/callbacks/chainlit.py +0 -0
  14. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/chat_agent.py +0 -0
  15. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/chat_document.py +0 -0
  16. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/done_sequence_parser.py +0 -0
  17. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/openai_assistant.py +0 -0
  18. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/__init__.py +0 -0
  19. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/arangodb/__init__.py +0 -0
  20. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  21. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/arangodb/system_messages.py +0 -0
  22. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/arangodb/tools.py +0 -0
  23. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/arangodb/utils.py +0 -0
  24. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/doc_chat_agent.py +0 -0
  25. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/doc_chat_task.py +0 -0
  26. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/lance_doc_chat_agent.py +0 -0
  27. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/lance_rag/__init__.py +0 -0
  28. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  29. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  30. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  31. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/lance_tools.py +0 -0
  32. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/neo4j/__init__.py +0 -0
  33. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  34. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  35. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/neo4j/system_messages.py +0 -0
  36. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/neo4j/tools.py +0 -0
  37. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  38. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/retriever_agent.py +0 -0
  39. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/sql/__init__.py +0 -0
  40. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  41. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/sql/utils/__init__.py +0 -0
  42. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  43. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  44. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/sql/utils/system_message.py +0 -0
  45. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/sql/utils/tools.py +0 -0
  46. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/special/table_chat_agent.py +0 -0
  47. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/task.py +0 -0
  48. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tool_message.py +0 -0
  49. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/__init__.py +0 -0
  50. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  51. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/exa_search_tool.py +0 -0
  52. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/file_tools.py +0 -0
  53. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/google_search_tool.py +0 -0
  54. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/mcp/__init__.py +0 -0
  55. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/mcp/decorators.py +0 -0
  56. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/mcp/fastmcp_client.py +0 -0
  57. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  58. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/orchestration.py +0 -0
  59. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/recipient_tool.py +0 -0
  60. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/retrieval_tool.py +0 -0
  61. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/rewind_tool.py +0 -0
  62. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/segment_extract_tool.py +0 -0
  63. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/task_tool.py +0 -0
  64. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/tools/tavily_search_tool.py +0 -0
  65. {langroid-0.59.9 → langroid-0.59.11}/langroid/agent/xml_tool_message.py +0 -0
  66. {langroid-0.59.9 → langroid-0.59.11}/langroid/cachedb/__init__.py +0 -0
  67. {langroid-0.59.9 → langroid-0.59.11}/langroid/cachedb/base.py +0 -0
  68. {langroid-0.59.9 → langroid-0.59.11}/langroid/cachedb/redis_cachedb.py +0 -0
  69. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/__init__.py +0 -0
  70. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/base.py +0 -0
  71. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/protoc/__init__.py +0 -0
  72. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  73. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  74. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  75. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  76. {langroid-0.59.9 → langroid-0.59.11}/langroid/embedding_models/remote_embeds.py +0 -0
  77. {langroid-0.59.9 → langroid-0.59.11}/langroid/exceptions.py +0 -0
  78. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/__init__.py +0 -0
  79. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/azure_openai.py +0 -0
  80. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/base.py +0 -0
  81. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/client_cache.py +0 -0
  82. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/config.py +0 -0
  83. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/mock_lm.py +0 -0
  84. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/model_info.py +0 -0
  85. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/openai_gpt.py +0 -0
  86. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  87. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/prompt_formatter/base.py +0 -0
  88. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  89. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  90. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/provider_params.py +0 -0
  91. {langroid-0.59.9 → langroid-0.59.11}/langroid/language_models/utils.py +0 -0
  92. {langroid-0.59.9 → langroid-0.59.11}/langroid/mcp/__init__.py +0 -0
  93. {langroid-0.59.9 → langroid-0.59.11}/langroid/mcp/server/__init__.py +0 -0
  94. {langroid-0.59.9 → langroid-0.59.11}/langroid/mytypes.py +0 -0
  95. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/__init__.py +0 -0
  96. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/agent_chats.py +0 -0
  97. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/code_parser.py +0 -0
  98. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/document_parser.py +0 -0
  99. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/file_attachment.py +0 -0
  100. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/md_parser.py +0 -0
  101. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/para_sentence_split.py +0 -0
  102. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/parser.py +0 -0
  103. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/pdf_utils.py +0 -0
  104. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/repo_loader.py +0 -0
  105. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/routing.py +0 -0
  106. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/search.py +0 -0
  107. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/spider.py +0 -0
  108. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/table_loader.py +0 -0
  109. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/url_loader.py +0 -0
  110. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/urls.py +0 -0
  111. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/utils.py +0 -0
  112. {langroid-0.59.9 → langroid-0.59.11}/langroid/parsing/web_search.py +0 -0
  113. {langroid-0.59.9 → langroid-0.59.11}/langroid/prompts/__init__.py +0 -0
  114. {langroid-0.59.9 → langroid-0.59.11}/langroid/prompts/dialog.py +0 -0
  115. {langroid-0.59.9 → langroid-0.59.11}/langroid/prompts/prompts_config.py +0 -0
  116. {langroid-0.59.9 → langroid-0.59.11}/langroid/prompts/templates.py +0 -0
  117. {langroid-0.59.9 → langroid-0.59.11}/langroid/py.typed +0 -0
  118. {langroid-0.59.9 → langroid-0.59.11}/langroid/pydantic_v1/__init__.py +0 -0
  119. {langroid-0.59.9 → langroid-0.59.11}/langroid/pydantic_v1/main.py +0 -0
  120. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/__init__.py +0 -0
  121. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/algorithms/__init__.py +0 -0
  122. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/algorithms/graph.py +0 -0
  123. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/configuration.py +0 -0
  124. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/constants.py +0 -0
  125. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/git_utils.py +0 -0
  126. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/globals.py +0 -0
  127. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/html_logger.py +0 -0
  128. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/logging.py +0 -0
  129. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/object_registry.py +0 -0
  130. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/output/__init__.py +0 -0
  131. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/output/citations.py +0 -0
  132. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/output/printing.py +0 -0
  133. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/output/status.py +0 -0
  134. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/pandas_utils.py +0 -0
  135. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/pydantic_utils.py +0 -0
  136. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/system.py +0 -0
  137. {langroid-0.59.9 → langroid-0.59.11}/langroid/utils/types.py +0 -0
  138. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/__init__.py +0 -0
  139. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/base.py +0 -0
  140. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/chromadb.py +0 -0
  141. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/lancedb.py +0 -0
  142. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/meilisearch.py +0 -0
  143. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/pineconedb.py +0 -0
  144. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/postgres.py +0 -0
  145. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/qdrantdb.py +0 -0
  146. {langroid-0.59.9 → langroid-0.59.11}/langroid/vector_store/weaviatedb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.59.9
3
+ Version: 0.59.11
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -463,12 +463,12 @@ class LlamaCppServerEmbeddings(EmbeddingModel):
463
463
  response = requests.post(self.embedding_url, json=data)
464
464
 
465
465
  if response.status_code == 200:
466
- embeddings = response.json()["embedding"]
466
+ embeddings = self._extract_embedding(response.json())
467
467
  if not (
468
468
  isinstance(embeddings, list) and isinstance(embeddings[0], (int, float))
469
469
  ):
470
470
  raise ValueError(
471
- """Embedding endpoint has not returned the correct format.
471
+ """Embedding endpoint has not returned the correct format.
472
472
  Is the URL correct?
473
473
  """
474
474
  )
@@ -480,6 +480,71 @@ class LlamaCppServerEmbeddings(EmbeddingModel):
480
480
  "Failed to connect to embedding provider",
481
481
  )
482
482
 
483
+ def _extract_embedding(
484
+ self, response_json: dict[str, Any] | list[Any]
485
+ ) -> List[int | float]:
486
+ """
487
+ Extract embedding vector from llama.cpp response.
488
+
489
+ Handles multiple response formats:
490
+ 1. Native /embedding: {"embedding": [floats]}
491
+ 2. Array format: [{"embedding": [floats]}]
492
+ 3. Double-nested: [{"embedding": [[floats]]}]
493
+ 4. OpenAI /v1/embeddings: {"data": [{"embedding": [floats]}]}
494
+ 5. Nested in dict: {"embedding": [[floats]]}
495
+
496
+ Args:
497
+ response_json: The JSON response from llama.cpp server
498
+
499
+ Returns:
500
+ List of floats representing the embedding vector
501
+
502
+ Raises:
503
+ ValueError: If response format is not recognized
504
+ """
505
+ import json
506
+
507
+ # Try native format first: {"embedding": [floats]}
508
+ if isinstance(response_json, dict) and "embedding" in response_json:
509
+ embeddings = response_json["embedding"]
510
+ # Check if it's [floats]
511
+ if isinstance(embeddings, list) and len(embeddings) > 0:
512
+ if isinstance(embeddings[0], (int, float)):
513
+ return embeddings
514
+ # Might be nested: {"embedding": [[floats]]}
515
+ if isinstance(embeddings[0], list) and len(embeddings[0]) > 0:
516
+ if isinstance(embeddings[0][0], (int, float)):
517
+ return embeddings[0]
518
+
519
+ # Try OpenAI format: {"data": [{"embedding": [floats]}]}
520
+ if isinstance(response_json, dict) and "data" in response_json:
521
+ data = response_json["data"]
522
+ if isinstance(data, list) and len(data) > 0:
523
+ if isinstance(data[0], dict) and "embedding" in data[0]:
524
+ embeddings = data[0]["embedding"]
525
+ if isinstance(embeddings, list) and len(embeddings) > 0:
526
+ if isinstance(embeddings[0], (int, float)):
527
+ return embeddings
528
+
529
+ # Try array format: [{"embedding": [floats]}] or [{"embedding": [[floats]]}]
530
+ if isinstance(response_json, list) and len(response_json) > 0:
531
+ first_item = response_json[0]
532
+ if isinstance(first_item, dict) and "embedding" in first_item:
533
+ embeddings = first_item["embedding"]
534
+ # Check if it's [floats]
535
+ if isinstance(embeddings, list) and len(embeddings) > 0:
536
+ if isinstance(embeddings[0], (int, float)):
537
+ return embeddings
538
+ # Check if it's [[floats]]
539
+ if isinstance(embeddings[0], list) and len(embeddings[0]) > 0:
540
+ if isinstance(embeddings[0][0], (int, float)):
541
+ return embeddings[0]
542
+
543
+ raise ValueError(
544
+ f"Unsupported embedding response format from {self.embedding_url}. "
545
+ f"Response: {json.dumps(response_json)[:500]}"
546
+ )
547
+
483
548
  def embedding_fn(self) -> Callable[[List[str]], Embeddings]:
484
549
  return EmbeddingFunctionCallable(self, self.config.batch_size)
485
550
 
@@ -135,15 +135,32 @@ def top_level_json_field(s: str, f: str) -> Any:
135
135
  Returns:
136
136
  str: The value of the field f in the top-level JSON object, if any.
137
137
  Otherwise, return an empty string.
138
- """
139
138
 
140
- jsons = extract_top_level_json(s)
141
- if len(jsons) == 0:
142
- return ""
143
- for j in jsons:
144
- json_data = json.loads(j)
145
- if f in json_data:
146
- return json_data[f]
139
+ Note:
140
+ This function is designed to never crash. If any exception occurs during
141
+ JSON parsing or field extraction, it gracefully returns an empty string.
142
+ """
143
+ try:
144
+ jsons = extract_top_level_json(s)
145
+ if len(jsons) == 0:
146
+ return ""
147
+ for j in jsons:
148
+ try:
149
+ json_data = json.loads(j)
150
+ if isinstance(json_data, dict):
151
+ if f in json_data:
152
+ return json_data[f]
153
+ elif isinstance(json_data, list):
154
+ # Some responses wrap candidate JSON objects in a list; scan them.
155
+ for item in json_data:
156
+ if isinstance(item, dict) and f in item:
157
+ return item[f]
158
+ except (json.JSONDecodeError, TypeError, KeyError):
159
+ # If this specific JSON fails to parse, continue to next candidate
160
+ continue
161
+ except Exception:
162
+ # Catch any unexpected errors to ensure we never crash
163
+ pass
147
164
 
148
165
  return ""
149
166
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.59.9"
3
+ version = "0.59.11"
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