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.
- langroid/__init__.py +106 -0
- langroid/agent/__init__.py +41 -0
- langroid/agent/base.py +1983 -0
- langroid/agent/batch.py +398 -0
- langroid/agent/callbacks/__init__.py +0 -0
- langroid/agent/callbacks/chainlit.py +598 -0
- langroid/agent/chat_agent.py +1899 -0
- langroid/agent/chat_document.py +454 -0
- langroid/agent/openai_assistant.py +882 -0
- langroid/agent/special/__init__.py +59 -0
- langroid/agent/special/arangodb/__init__.py +0 -0
- langroid/agent/special/arangodb/arangodb_agent.py +656 -0
- langroid/agent/special/arangodb/system_messages.py +186 -0
- langroid/agent/special/arangodb/tools.py +107 -0
- langroid/agent/special/arangodb/utils.py +36 -0
- langroid/agent/special/doc_chat_agent.py +1466 -0
- langroid/agent/special/lance_doc_chat_agent.py +262 -0
- langroid/agent/special/lance_rag/__init__.py +9 -0
- langroid/agent/special/lance_rag/critic_agent.py +198 -0
- langroid/agent/special/lance_rag/lance_rag_task.py +82 -0
- langroid/agent/special/lance_rag/query_planner_agent.py +260 -0
- langroid/agent/special/lance_tools.py +61 -0
- langroid/agent/special/neo4j/__init__.py +0 -0
- langroid/agent/special/neo4j/csv_kg_chat.py +174 -0
- langroid/agent/special/neo4j/neo4j_chat_agent.py +433 -0
- langroid/agent/special/neo4j/system_messages.py +120 -0
- langroid/agent/special/neo4j/tools.py +32 -0
- langroid/agent/special/relevance_extractor_agent.py +127 -0
- langroid/agent/special/retriever_agent.py +56 -0
- langroid/agent/special/sql/__init__.py +17 -0
- langroid/agent/special/sql/sql_chat_agent.py +654 -0
- langroid/agent/special/sql/utils/__init__.py +21 -0
- langroid/agent/special/sql/utils/description_extractors.py +190 -0
- langroid/agent/special/sql/utils/populate_metadata.py +85 -0
- langroid/agent/special/sql/utils/system_message.py +35 -0
- langroid/agent/special/sql/utils/tools.py +64 -0
- langroid/agent/special/table_chat_agent.py +263 -0
- langroid/agent/task.py +2099 -0
- langroid/agent/tool_message.py +393 -0
- langroid/agent/tools/__init__.py +38 -0
- langroid/agent/tools/duckduckgo_search_tool.py +50 -0
- langroid/agent/tools/file_tools.py +234 -0
- langroid/agent/tools/google_search_tool.py +39 -0
- langroid/agent/tools/metaphor_search_tool.py +68 -0
- langroid/agent/tools/orchestration.py +303 -0
- langroid/agent/tools/recipient_tool.py +235 -0
- langroid/agent/tools/retrieval_tool.py +32 -0
- langroid/agent/tools/rewind_tool.py +137 -0
- langroid/agent/tools/segment_extract_tool.py +41 -0
- langroid/agent/xml_tool_message.py +382 -0
- langroid/cachedb/__init__.py +17 -0
- langroid/cachedb/base.py +58 -0
- langroid/cachedb/momento_cachedb.py +108 -0
- langroid/cachedb/redis_cachedb.py +153 -0
- langroid/embedding_models/__init__.py +39 -0
- langroid/embedding_models/base.py +74 -0
- langroid/embedding_models/models.py +461 -0
- langroid/embedding_models/protoc/__init__.py +0 -0
- langroid/embedding_models/protoc/embeddings.proto +19 -0
- langroid/embedding_models/protoc/embeddings_pb2.py +33 -0
- langroid/embedding_models/protoc/embeddings_pb2.pyi +50 -0
- langroid/embedding_models/protoc/embeddings_pb2_grpc.py +79 -0
- langroid/embedding_models/remote_embeds.py +153 -0
- langroid/exceptions.py +71 -0
- langroid/language_models/__init__.py +53 -0
- langroid/language_models/azure_openai.py +153 -0
- langroid/language_models/base.py +678 -0
- langroid/language_models/config.py +18 -0
- langroid/language_models/mock_lm.py +124 -0
- langroid/language_models/openai_gpt.py +1964 -0
- langroid/language_models/prompt_formatter/__init__.py +16 -0
- langroid/language_models/prompt_formatter/base.py +40 -0
- langroid/language_models/prompt_formatter/hf_formatter.py +132 -0
- langroid/language_models/prompt_formatter/llama2_formatter.py +75 -0
- langroid/language_models/utils.py +151 -0
- langroid/mytypes.py +84 -0
- langroid/parsing/__init__.py +52 -0
- langroid/parsing/agent_chats.py +38 -0
- langroid/parsing/code_parser.py +121 -0
- langroid/parsing/document_parser.py +718 -0
- langroid/parsing/para_sentence_split.py +62 -0
- langroid/parsing/parse_json.py +155 -0
- langroid/parsing/parser.py +313 -0
- langroid/parsing/repo_loader.py +790 -0
- langroid/parsing/routing.py +36 -0
- langroid/parsing/search.py +275 -0
- langroid/parsing/spider.py +102 -0
- langroid/parsing/table_loader.py +94 -0
- langroid/parsing/url_loader.py +115 -0
- langroid/parsing/urls.py +273 -0
- langroid/parsing/utils.py +373 -0
- langroid/parsing/web_search.py +156 -0
- langroid/prompts/__init__.py +9 -0
- langroid/prompts/dialog.py +17 -0
- langroid/prompts/prompts_config.py +5 -0
- langroid/prompts/templates.py +141 -0
- langroid/pydantic_v1/__init__.py +10 -0
- langroid/pydantic_v1/main.py +4 -0
- langroid/utils/__init__.py +19 -0
- langroid/utils/algorithms/__init__.py +3 -0
- langroid/utils/algorithms/graph.py +103 -0
- langroid/utils/configuration.py +98 -0
- langroid/utils/constants.py +30 -0
- langroid/utils/git_utils.py +252 -0
- langroid/utils/globals.py +49 -0
- langroid/utils/logging.py +135 -0
- langroid/utils/object_registry.py +66 -0
- langroid/utils/output/__init__.py +20 -0
- langroid/utils/output/citations.py +41 -0
- langroid/utils/output/printing.py +99 -0
- langroid/utils/output/status.py +40 -0
- langroid/utils/pandas_utils.py +30 -0
- langroid/utils/pydantic_utils.py +602 -0
- langroid/utils/system.py +286 -0
- langroid/utils/types.py +93 -0
- langroid/vector_store/__init__.py +50 -0
- langroid/vector_store/base.py +359 -0
- langroid/vector_store/chromadb.py +214 -0
- langroid/vector_store/lancedb.py +406 -0
- langroid/vector_store/meilisearch.py +299 -0
- langroid/vector_store/momento.py +278 -0
- langroid/vector_store/qdrantdb.py +468 -0
- {langroid-0.33.6.dist-info → langroid-0.33.8.dist-info}/METADATA +95 -94
- langroid-0.33.8.dist-info/RECORD +127 -0
- {langroid-0.33.6.dist-info → langroid-0.33.8.dist-info}/WHEEL +1 -1
- langroid-0.33.6.dist-info/RECORD +0 -7
- langroid-0.33.6.dist-info/entry_points.txt +0 -4
- pyproject.toml +0 -356
- {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
|
+
)
|