langroid 0.33.6__py3-none-any.whl → 0.33.8__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.
Files changed (129) hide show
  1. langroid/__init__.py +106 -0
  2. langroid/agent/__init__.py +41 -0
  3. langroid/agent/base.py +1983 -0
  4. langroid/agent/batch.py +398 -0
  5. langroid/agent/callbacks/__init__.py +0 -0
  6. langroid/agent/callbacks/chainlit.py +598 -0
  7. langroid/agent/chat_agent.py +1899 -0
  8. langroid/agent/chat_document.py +454 -0
  9. langroid/agent/openai_assistant.py +882 -0
  10. langroid/agent/special/__init__.py +59 -0
  11. langroid/agent/special/arangodb/__init__.py +0 -0
  12. langroid/agent/special/arangodb/arangodb_agent.py +656 -0
  13. langroid/agent/special/arangodb/system_messages.py +186 -0
  14. langroid/agent/special/arangodb/tools.py +107 -0
  15. langroid/agent/special/arangodb/utils.py +36 -0
  16. langroid/agent/special/doc_chat_agent.py +1466 -0
  17. langroid/agent/special/lance_doc_chat_agent.py +262 -0
  18. langroid/agent/special/lance_rag/__init__.py +9 -0
  19. langroid/agent/special/lance_rag/critic_agent.py +198 -0
  20. langroid/agent/special/lance_rag/lance_rag_task.py +82 -0
  21. langroid/agent/special/lance_rag/query_planner_agent.py +260 -0
  22. langroid/agent/special/lance_tools.py +61 -0
  23. langroid/agent/special/neo4j/__init__.py +0 -0
  24. langroid/agent/special/neo4j/csv_kg_chat.py +174 -0
  25. langroid/agent/special/neo4j/neo4j_chat_agent.py +433 -0
  26. langroid/agent/special/neo4j/system_messages.py +120 -0
  27. langroid/agent/special/neo4j/tools.py +32 -0
  28. langroid/agent/special/relevance_extractor_agent.py +127 -0
  29. langroid/agent/special/retriever_agent.py +56 -0
  30. langroid/agent/special/sql/__init__.py +17 -0
  31. langroid/agent/special/sql/sql_chat_agent.py +654 -0
  32. langroid/agent/special/sql/utils/__init__.py +21 -0
  33. langroid/agent/special/sql/utils/description_extractors.py +190 -0
  34. langroid/agent/special/sql/utils/populate_metadata.py +85 -0
  35. langroid/agent/special/sql/utils/system_message.py +35 -0
  36. langroid/agent/special/sql/utils/tools.py +64 -0
  37. langroid/agent/special/table_chat_agent.py +263 -0
  38. langroid/agent/task.py +2099 -0
  39. langroid/agent/tool_message.py +393 -0
  40. langroid/agent/tools/__init__.py +38 -0
  41. langroid/agent/tools/duckduckgo_search_tool.py +50 -0
  42. langroid/agent/tools/file_tools.py +234 -0
  43. langroid/agent/tools/google_search_tool.py +39 -0
  44. langroid/agent/tools/metaphor_search_tool.py +68 -0
  45. langroid/agent/tools/orchestration.py +303 -0
  46. langroid/agent/tools/recipient_tool.py +235 -0
  47. langroid/agent/tools/retrieval_tool.py +32 -0
  48. langroid/agent/tools/rewind_tool.py +137 -0
  49. langroid/agent/tools/segment_extract_tool.py +41 -0
  50. langroid/agent/xml_tool_message.py +382 -0
  51. langroid/cachedb/__init__.py +17 -0
  52. langroid/cachedb/base.py +58 -0
  53. langroid/cachedb/momento_cachedb.py +108 -0
  54. langroid/cachedb/redis_cachedb.py +153 -0
  55. langroid/embedding_models/__init__.py +39 -0
  56. langroid/embedding_models/base.py +74 -0
  57. langroid/embedding_models/models.py +461 -0
  58. langroid/embedding_models/protoc/__init__.py +0 -0
  59. langroid/embedding_models/protoc/embeddings.proto +19 -0
  60. langroid/embedding_models/protoc/embeddings_pb2.py +33 -0
  61. langroid/embedding_models/protoc/embeddings_pb2.pyi +50 -0
  62. langroid/embedding_models/protoc/embeddings_pb2_grpc.py +79 -0
  63. langroid/embedding_models/remote_embeds.py +153 -0
  64. langroid/exceptions.py +71 -0
  65. langroid/language_models/__init__.py +53 -0
  66. langroid/language_models/azure_openai.py +153 -0
  67. langroid/language_models/base.py +678 -0
  68. langroid/language_models/config.py +18 -0
  69. langroid/language_models/mock_lm.py +124 -0
  70. langroid/language_models/openai_gpt.py +1964 -0
  71. langroid/language_models/prompt_formatter/__init__.py +16 -0
  72. langroid/language_models/prompt_formatter/base.py +40 -0
  73. langroid/language_models/prompt_formatter/hf_formatter.py +132 -0
  74. langroid/language_models/prompt_formatter/llama2_formatter.py +75 -0
  75. langroid/language_models/utils.py +151 -0
  76. langroid/mytypes.py +84 -0
  77. langroid/parsing/__init__.py +52 -0
  78. langroid/parsing/agent_chats.py +38 -0
  79. langroid/parsing/code_parser.py +121 -0
  80. langroid/parsing/document_parser.py +718 -0
  81. langroid/parsing/para_sentence_split.py +62 -0
  82. langroid/parsing/parse_json.py +155 -0
  83. langroid/parsing/parser.py +313 -0
  84. langroid/parsing/repo_loader.py +790 -0
  85. langroid/parsing/routing.py +36 -0
  86. langroid/parsing/search.py +275 -0
  87. langroid/parsing/spider.py +102 -0
  88. langroid/parsing/table_loader.py +94 -0
  89. langroid/parsing/url_loader.py +115 -0
  90. langroid/parsing/urls.py +273 -0
  91. langroid/parsing/utils.py +373 -0
  92. langroid/parsing/web_search.py +156 -0
  93. langroid/prompts/__init__.py +9 -0
  94. langroid/prompts/dialog.py +17 -0
  95. langroid/prompts/prompts_config.py +5 -0
  96. langroid/prompts/templates.py +141 -0
  97. langroid/pydantic_v1/__init__.py +10 -0
  98. langroid/pydantic_v1/main.py +4 -0
  99. langroid/utils/__init__.py +19 -0
  100. langroid/utils/algorithms/__init__.py +3 -0
  101. langroid/utils/algorithms/graph.py +103 -0
  102. langroid/utils/configuration.py +98 -0
  103. langroid/utils/constants.py +30 -0
  104. langroid/utils/git_utils.py +252 -0
  105. langroid/utils/globals.py +49 -0
  106. langroid/utils/logging.py +135 -0
  107. langroid/utils/object_registry.py +66 -0
  108. langroid/utils/output/__init__.py +20 -0
  109. langroid/utils/output/citations.py +41 -0
  110. langroid/utils/output/printing.py +99 -0
  111. langroid/utils/output/status.py +40 -0
  112. langroid/utils/pandas_utils.py +30 -0
  113. langroid/utils/pydantic_utils.py +602 -0
  114. langroid/utils/system.py +286 -0
  115. langroid/utils/types.py +93 -0
  116. langroid/vector_store/__init__.py +50 -0
  117. langroid/vector_store/base.py +359 -0
  118. langroid/vector_store/chromadb.py +214 -0
  119. langroid/vector_store/lancedb.py +406 -0
  120. langroid/vector_store/meilisearch.py +299 -0
  121. langroid/vector_store/momento.py +278 -0
  122. langroid/vector_store/qdrantdb.py +468 -0
  123. {langroid-0.33.6.dist-info → langroid-0.33.8.dist-info}/METADATA +95 -94
  124. langroid-0.33.8.dist-info/RECORD +127 -0
  125. {langroid-0.33.6.dist-info → langroid-0.33.8.dist-info}/WHEEL +1 -1
  126. langroid-0.33.6.dist-info/RECORD +0 -7
  127. langroid-0.33.6.dist-info/entry_points.txt +0 -4
  128. pyproject.toml +0 -356
  129. {langroid-0.33.6.dist-info → langroid-0.33.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,153 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ from contextlib import AbstractContextManager, contextmanager
5
+ from typing import Any, Dict, List, TypeVar
6
+
7
+ import fakeredis
8
+ import redis
9
+ from dotenv import load_dotenv
10
+
11
+ from langroid.cachedb.base import CacheDB, CacheDBConfig
12
+
13
+ T = TypeVar("T", bound="RedisCache")
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class RedisCacheConfig(CacheDBConfig):
18
+ """Configuration model for RedisCache."""
19
+
20
+ fake: bool = False
21
+
22
+
23
+ class RedisCache(CacheDB):
24
+ """Redis implementation of the CacheDB."""
25
+
26
+ _warned_password: bool = False
27
+
28
+ def __init__(self, config: RedisCacheConfig):
29
+ """
30
+ Initialize a RedisCache with the given config.
31
+
32
+ Args:
33
+ config (RedisCacheConfig): The configuration to use.
34
+ """
35
+ self.config = config
36
+ load_dotenv()
37
+
38
+ if self.config.fake:
39
+ self.pool = fakeredis.FakeStrictRedis() # type: ignore
40
+ else:
41
+ redis_password = os.getenv("REDIS_PASSWORD")
42
+ redis_host = os.getenv("REDIS_HOST")
43
+ redis_port = os.getenv("REDIS_PORT")
44
+ if None in [redis_password, redis_host, redis_port]:
45
+ if not RedisCache._warned_password:
46
+ logger.warning(
47
+ """REDIS_PASSWORD, REDIS_HOST, REDIS_PORT not set in .env file,
48
+ using fake redis client"""
49
+ )
50
+ RedisCache._warned_password = True
51
+ self.pool = fakeredis.FakeStrictRedis() # type: ignore
52
+ else:
53
+ self.pool = redis.ConnectionPool( # type: ignore
54
+ host=redis_host,
55
+ port=redis_port,
56
+ password=redis_password,
57
+ max_connections=500,
58
+ socket_timeout=5,
59
+ socket_keepalive=True,
60
+ retry_on_timeout=True,
61
+ health_check_interval=30,
62
+ )
63
+
64
+ @contextmanager # type: ignore
65
+ def redis_client(self) -> AbstractContextManager[T]: # type: ignore
66
+ """Cleanly open and close a redis client, avoids max clients exceeded error"""
67
+ if isinstance(self.pool, fakeredis.FakeStrictRedis):
68
+ yield self.pool
69
+ else:
70
+ client: T = redis.Redis(connection_pool=self.pool)
71
+ try:
72
+ yield client
73
+ finally:
74
+ client.close()
75
+
76
+ def close_all_connections(self) -> None:
77
+ with self.redis_client() as client: # type: ignore
78
+ clients = client.client_list()
79
+ for c in clients:
80
+ client.client_kill(c["addr"])
81
+
82
+ def clear(self) -> None:
83
+ """Clear keys from current db."""
84
+ with self.redis_client() as client: # type: ignore
85
+ client.flushdb()
86
+
87
+ def clear_all(self) -> None:
88
+ """Clear all keys from all dbs."""
89
+ with self.redis_client() as client: # type: ignore
90
+ client.flushall()
91
+
92
+ def store(self, key: str, value: Any) -> None:
93
+ """
94
+ Store a value associated with a key.
95
+
96
+ Args:
97
+ key (str): The key under which to store the value.
98
+ value (Any): The value to store.
99
+ """
100
+ with self.redis_client() as client: # type: ignore
101
+ try:
102
+ client.set(key, json.dumps(value))
103
+ except redis.exceptions.ConnectionError:
104
+ logger.warning("Redis connection error, not storing key/value")
105
+ return None
106
+
107
+ def retrieve(self, key: str) -> Dict[str, Any] | str | None:
108
+ """
109
+ Retrieve the value associated with a key.
110
+
111
+ Args:
112
+ key (str): The key to retrieve the value for.
113
+
114
+ Returns:
115
+ dict|str|None: The value associated with the key.
116
+ """
117
+ with self.redis_client() as client: # type: ignore
118
+ try:
119
+ value = client.get(key)
120
+ except redis.exceptions.ConnectionError:
121
+ logger.warning("Redis connection error, returning None")
122
+ return None
123
+ return json.loads(value) if value else None
124
+
125
+ def delete_keys(self, keys: List[str]) -> None:
126
+ """
127
+ Delete the keys from the cache.
128
+
129
+ Args:
130
+ keys (List[str]): The keys to delete.
131
+ """
132
+ with self.redis_client() as client: # type: ignore
133
+ try:
134
+ client.delete(*keys)
135
+ except redis.exceptions.ConnectionError:
136
+ logger.warning("Redis connection error, not deleting keys")
137
+ return None
138
+
139
+ def delete_keys_pattern(self, pattern: str) -> None:
140
+ """
141
+ Delete the keys matching the pattern from the cache.
142
+
143
+ Args:
144
+ prefix (str): The pattern to match.
145
+ """
146
+ with self.redis_client() as client: # type: ignore
147
+ try:
148
+ keys = client.keys(pattern)
149
+ if len(keys) > 0:
150
+ client.delete(*keys)
151
+ except redis.exceptions.ConnectionError:
152
+ logger.warning("Redis connection error, not deleting keys")
153
+ return None
@@ -0,0 +1,39 @@
1
+ from . import base
2
+ from . import models
3
+ from . import remote_embeds
4
+
5
+ from .base import (
6
+ EmbeddingModel,
7
+ EmbeddingModelsConfig,
8
+ )
9
+ from .models import (
10
+ OpenAIEmbeddings,
11
+ OpenAIEmbeddingsConfig,
12
+ SentenceTransformerEmbeddings,
13
+ SentenceTransformerEmbeddingsConfig,
14
+ LlamaCppServerEmbeddings,
15
+ LlamaCppServerEmbeddingsConfig,
16
+ embedding_model,
17
+ )
18
+ from .remote_embeds import (
19
+ RemoteEmbeddingsConfig,
20
+ RemoteEmbeddings,
21
+ )
22
+
23
+
24
+ __all__ = [
25
+ "base",
26
+ "models",
27
+ "remote_embeds",
28
+ "EmbeddingModel",
29
+ "EmbeddingModelsConfig",
30
+ "OpenAIEmbeddings",
31
+ "OpenAIEmbeddingsConfig",
32
+ "SentenceTransformerEmbeddings",
33
+ "SentenceTransformerEmbeddingsConfig",
34
+ "LlamaCppServerEmbeddings",
35
+ "LlamaCppServerEmbeddingsConfig",
36
+ "embedding_model",
37
+ "RemoteEmbeddingsConfig",
38
+ "RemoteEmbeddings",
39
+ ]
@@ -0,0 +1,74 @@
1
+ import logging
2
+ from abc import ABC, abstractmethod
3
+
4
+ import numpy as np
5
+
6
+ from langroid.mytypes import EmbeddingFunction
7
+ from langroid.pydantic_v1 import BaseSettings
8
+
9
+ logging.getLogger("openai").setLevel(logging.ERROR)
10
+
11
+
12
+ class EmbeddingModelsConfig(BaseSettings):
13
+ model_type: str = "openai"
14
+ dims: int = 0
15
+ context_length: int = 512
16
+ batch_size: int = 512
17
+
18
+
19
+ class EmbeddingModel(ABC):
20
+ """
21
+ Abstract base class for an embedding model.
22
+ """
23
+
24
+ @classmethod
25
+ def create(cls, config: EmbeddingModelsConfig) -> "EmbeddingModel":
26
+ from langroid.embedding_models.models import (
27
+ AzureOpenAIEmbeddings,
28
+ AzureOpenAIEmbeddingsConfig,
29
+ FastEmbedEmbeddings,
30
+ FastEmbedEmbeddingsConfig,
31
+ LlamaCppServerEmbeddings,
32
+ LlamaCppServerEmbeddingsConfig,
33
+ OpenAIEmbeddings,
34
+ OpenAIEmbeddingsConfig,
35
+ SentenceTransformerEmbeddings,
36
+ SentenceTransformerEmbeddingsConfig,
37
+ )
38
+ from langroid.embedding_models.remote_embeds import (
39
+ RemoteEmbeddings,
40
+ RemoteEmbeddingsConfig,
41
+ )
42
+
43
+ if isinstance(config, RemoteEmbeddingsConfig):
44
+ return RemoteEmbeddings(config)
45
+ elif isinstance(config, OpenAIEmbeddingsConfig):
46
+ return OpenAIEmbeddings(config)
47
+ elif isinstance(config, AzureOpenAIEmbeddingsConfig):
48
+ return AzureOpenAIEmbeddings(config)
49
+ elif isinstance(config, SentenceTransformerEmbeddingsConfig):
50
+ return SentenceTransformerEmbeddings(config)
51
+ elif isinstance(config, FastEmbedEmbeddingsConfig):
52
+ return FastEmbedEmbeddings(config)
53
+ elif isinstance(config, LlamaCppServerEmbeddingsConfig):
54
+ return LlamaCppServerEmbeddings(config)
55
+ else:
56
+ raise ValueError(f"Unknown embedding config: {config.__repr_name__}")
57
+
58
+ @abstractmethod
59
+ def embedding_fn(self) -> EmbeddingFunction:
60
+ pass
61
+
62
+ @property
63
+ @abstractmethod
64
+ def embedding_dims(self) -> int:
65
+ pass
66
+
67
+ def similarity(self, text1: str, text2: str) -> float:
68
+ """Compute cosine similarity between two texts."""
69
+ [emb1, emb2] = self.embedding_fn()([text1, text2])
70
+ return float(
71
+ np.array(emb1)
72
+ @ np.array(emb2)
73
+ / (np.linalg.norm(emb1) * np.linalg.norm(emb2))
74
+ )