langroid 0.52.4__py3-none-any.whl → 0.52.6__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/agent/chat_agent.py +8 -1
- langroid/agent/special/doc_chat_agent.py +8 -2
- langroid/cachedb/__init__.py +0 -9
- langroid/language_models/openai_gpt.py +2 -15
- langroid/utils/configuration.py +1 -1
- {langroid-0.52.4.dist-info → langroid-0.52.6.dist-info}/METADATA +3 -6
- {langroid-0.52.4.dist-info → langroid-0.52.6.dist-info}/RECORD +9 -10
- langroid/cachedb/momento_cachedb.py +0 -108
- {langroid-0.52.4.dist-info → langroid-0.52.6.dist-info}/WHEEL +0 -0
- {langroid-0.52.4.dist-info → langroid-0.52.6.dist-info}/licenses/LICENSE +0 -0
langroid/agent/chat_agent.py
CHANGED
@@ -735,7 +735,11 @@ class ChatAgent(Agent):
|
|
735
735
|
self.llm_tools_usable.discard(t)
|
736
736
|
self.llm_functions_usable.discard(t)
|
737
737
|
|
738
|
-
|
738
|
+
self._update_tool_instructions()
|
739
|
+
|
740
|
+
def _update_tool_instructions(self) -> None:
|
741
|
+
# Set tool instructions and JSON format instructions,
|
742
|
+
# in case Tools have been enabled/disabled.
|
739
743
|
if self.config.use_tools:
|
740
744
|
self.system_tool_format_instructions = self.tool_format_rules()
|
741
745
|
self.system_tool_instructions = self.tool_instructions()
|
@@ -977,6 +981,8 @@ class ChatAgent(Agent):
|
|
977
981
|
self.llm_tools_usable.discard(t)
|
978
982
|
self.llm_functions_usable.discard(t)
|
979
983
|
|
984
|
+
self._update_tool_instructions()
|
985
|
+
|
980
986
|
def disable_message_use_except(self, message_class: Type[ToolMessage]) -> None:
|
981
987
|
"""
|
982
988
|
Disable this agent from USING ALL messages EXCEPT a message class (Tool)
|
@@ -988,6 +994,7 @@ class ChatAgent(Agent):
|
|
988
994
|
for r in to_remove:
|
989
995
|
self.llm_tools_usable.discard(r)
|
990
996
|
self.llm_functions_usable.discard(r)
|
997
|
+
self._update_tool_instructions()
|
991
998
|
|
992
999
|
def _load_output_format(self, message: ChatDocument) -> None:
|
993
1000
|
"""
|
@@ -123,6 +123,9 @@ class DocChatAgentConfig(ChatAgentConfig):
|
|
123
123
|
None # filter condition for various lexical/semantic search fns
|
124
124
|
)
|
125
125
|
conversation_mode: bool = True # accumulate message history?
|
126
|
+
# retain retrieved context? Setting to True increases token consumption, but
|
127
|
+
# helps LLM fix citation errors and improve accuracy of follow-up questions.
|
128
|
+
retain_context: bool = False
|
126
129
|
# In assistant mode, DocChatAgent receives questions from another Agent,
|
127
130
|
# and those will already be in stand-alone form, so in this mode
|
128
131
|
# there is no need to convert them to stand-alone form.
|
@@ -861,8 +864,11 @@ class DocChatAgent(ChatAgent):
|
|
861
864
|
# one for `final_prompt`, and one for the LLM response
|
862
865
|
|
863
866
|
if self.config.conversation_mode:
|
864
|
-
|
865
|
-
|
867
|
+
if self.config.retain_context:
|
868
|
+
answer_doc = super().llm_response(final_prompt)
|
869
|
+
else:
|
870
|
+
# respond with temporary context
|
871
|
+
answer_doc = super()._llm_response_temp_context(question, final_prompt)
|
866
872
|
else:
|
867
873
|
answer_doc = super().llm_response_forget(final_prompt)
|
868
874
|
|
langroid/cachedb/__init__.py
CHANGED
@@ -627,20 +627,7 @@ class OpenAIGPT(LanguageModel):
|
|
627
627
|
|
628
628
|
self.cache: CacheDB | None = None
|
629
629
|
use_cache = self.config.cache_config is not None
|
630
|
-
if settings.cache_type
|
631
|
-
from langroid.cachedb.momento_cachedb import (
|
632
|
-
MomentoCache,
|
633
|
-
MomentoCacheConfig,
|
634
|
-
)
|
635
|
-
|
636
|
-
if config.cache_config is None or not isinstance(
|
637
|
-
config.cache_config,
|
638
|
-
MomentoCacheConfig,
|
639
|
-
):
|
640
|
-
# switch to fresh momento config if needed
|
641
|
-
config.cache_config = MomentoCacheConfig()
|
642
|
-
self.cache = MomentoCache(config.cache_config)
|
643
|
-
elif "redis" in settings.cache_type and use_cache:
|
630
|
+
if "redis" in settings.cache_type and use_cache:
|
644
631
|
if config.cache_config is None or not isinstance(
|
645
632
|
config.cache_config,
|
646
633
|
RedisCacheConfig,
|
@@ -656,7 +643,7 @@ class OpenAIGPT(LanguageModel):
|
|
656
643
|
elif settings.cache_type != "none" and use_cache:
|
657
644
|
raise ValueError(
|
658
645
|
f"Invalid cache type {settings.cache_type}. "
|
659
|
-
"Valid types are
|
646
|
+
"Valid types are redis, fakeredis, none"
|
660
647
|
)
|
661
648
|
|
662
649
|
self.config._validate_litellm()
|
langroid/utils/configuration.py
CHANGED
@@ -17,7 +17,7 @@ class Settings(BaseSettings):
|
|
17
17
|
progress: bool = False # show progress spinners/bars?
|
18
18
|
stream: bool = True # stream output?
|
19
19
|
cache: bool = True # use cache?
|
20
|
-
cache_type: Literal["redis", "fakeredis", "
|
20
|
+
cache_type: Literal["redis", "fakeredis", "none"] = "redis" # cache type
|
21
21
|
chat_model: str = "" # language model name, e.g. litellm/ollama/llama2
|
22
22
|
quiet: bool = False # quiet mode (i.e. suppress all output)?
|
23
23
|
notebook: bool = False # running in a notebook?
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: langroid
|
3
|
-
Version: 0.52.
|
3
|
+
Version: 0.52.6
|
4
4
|
Summary: Harness LLMs with Multi-Agent Programming
|
5
5
|
Author-email: Prasad Chalasani <pchalasani@gmail.com>
|
6
6
|
License: MIT
|
@@ -151,8 +151,6 @@ Provides-Extra: meilisearch
|
|
151
151
|
Requires-Dist: meilisearch-python-sdk<3.0.0,>=2.2.3; extra == 'meilisearch'
|
152
152
|
Provides-Extra: metaphor
|
153
153
|
Requires-Dist: metaphor-python<0.2.0,>=0.1.23; extra == 'metaphor'
|
154
|
-
Provides-Extra: momento
|
155
|
-
Requires-Dist: momento<1.21.0,>=1.10.2; extra == 'momento'
|
156
154
|
Provides-Extra: mysql
|
157
155
|
Requires-Dist: pymysql<2.0.0,>=1.1.0; extra == 'mysql'
|
158
156
|
Provides-Extra: neo4j
|
@@ -617,9 +615,8 @@ section above)
|
|
617
615
|
providers ([local/open](https://langroid.github.io/langroid/tutorials/local-llm-setup/) or [remote/commercial](https://langroid.github.io/langroid/tutorials/non-openai-llms/)) via proxy libraries and local model servers
|
618
616
|
such as [ollama](https://github.com/ollama), [oobabooga](https://github.com/oobabooga/text-generation-webui),
|
619
617
|
[LiteLLM](https://docs.litellm.ai/docs/providers) that in effect mimic the OpenAI API. See the [supported LLMs](https://langroid.github.io/langroid/tutorials/supported-models/).
|
620
|
-
- **Caching of LLM responses:** Langroid supports [Redis](https://redis.com/try-free/)
|
621
|
-
|
622
|
-
- **Vector-stores**: [LanceDB](https://github.com/lancedb/lancedb), [Qdrant](https://qdrant.tech/), [Chroma](https://www.trychroma.com/) are currently supported.
|
618
|
+
- **Caching of LLM responses:** Langroid supports [Redis](https://redis.com/try-free/) to cache LLM responses.
|
619
|
+
- **Vector-stores**: [Qdrant](https://qdrant.tech/), [Chroma](https://www.trychroma.com/), LanceDB, Pinecone, PostgresDB (PGVector), Weaviate are currently supported.
|
623
620
|
Vector stores allow for Retrieval-Augmented-Generation (RAG).
|
624
621
|
- **Grounding and source-citation:** Access to external documents via vector-stores
|
625
622
|
allows for grounding and source-citation.
|
@@ -5,7 +5,7 @@ langroid/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
langroid/agent/__init__.py,sha256=ll0Cubd2DZ-fsCMl7e10hf9ZjFGKzphfBco396IKITY,786
|
6
6
|
langroid/agent/base.py,sha256=lWR4ivX_elTFejpknLhkO-DlAGT3aG6ojQAVkzDOqMc,80090
|
7
7
|
langroid/agent/batch.py,sha256=vi1r5i1-vN80WfqHDSwjEym_KfGsqPGUtwktmiK1nuk,20635
|
8
|
-
langroid/agent/chat_agent.py,sha256=
|
8
|
+
langroid/agent/chat_agent.py,sha256=nsFSARSANCVByL4fAl_DhyWm9gM7s_6waqNsmePXJMA,85309
|
9
9
|
langroid/agent/chat_document.py,sha256=6O20Fp4QrquykaF2jFtwNHkvcoDte1LLwVZNk9mVH9c,18057
|
10
10
|
langroid/agent/openai_assistant.py,sha256=JkAcs02bIrgPNVvUWVR06VCthc5-ulla2QMBzux_q6o,34340
|
11
11
|
langroid/agent/task.py,sha256=HB6N-Jn80HFqCf0ZYOC1v3Bn3oO7NLjShHQJJFwW0q4,90557
|
@@ -14,7 +14,7 @@ langroid/agent/xml_tool_message.py,sha256=6SshYZJKIfi4mkE-gIoSwjkEYekQ8GwcSiCv7a
|
|
14
14
|
langroid/agent/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
15
|
langroid/agent/callbacks/chainlit.py,sha256=UHB6P_J40vsVnssosqkpkOVWRf9NK4TOY0_G2g_Arsg,20900
|
16
16
|
langroid/agent/special/__init__.py,sha256=gik_Xtm_zV7U9s30Mn8UX3Gyuy4jTjQe9zjiE3HWmEo,1273
|
17
|
-
langroid/agent/special/doc_chat_agent.py,sha256
|
17
|
+
langroid/agent/special/doc_chat_agent.py,sha256=-ABgZiaIowFVqYMYlU1Nf8WfOqXOTmlMCEnafEXucPo,65564
|
18
18
|
langroid/agent/special/doc_chat_task.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
19
19
|
langroid/agent/special/lance_doc_chat_agent.py,sha256=s8xoRs0gGaFtDYFUSIRchsgDVbS5Q3C2b2mr3V1Fd-Q,10419
|
20
20
|
langroid/agent/special/lance_tools.py,sha256=qS8x4wi8mrqfbYV2ztFzrcxyhHQ0ZWOc-zkYiH7awj0,2105
|
@@ -54,9 +54,8 @@ langroid/agent/tools/retrieval_tool.py,sha256=zcAV20PP_6VzSd-UE-IJcabaBseFL_QNz5
|
|
54
54
|
langroid/agent/tools/rewind_tool.py,sha256=XAXL3BpNhCmBGYq_qi_sZfHJuIw7NY2jp4wnojJ7WRs,5606
|
55
55
|
langroid/agent/tools/segment_extract_tool.py,sha256=__srZ_VGYLVOdPrITUM8S0HpmX4q7r5FHWMDdHdEv8w,1440
|
56
56
|
langroid/agent/tools/tavily_search_tool.py,sha256=soI-j0HdgVQLf09wRQScaEK4b5RpAX9C4cwOivRFWWI,1903
|
57
|
-
langroid/cachedb/__init__.py,sha256=
|
57
|
+
langroid/cachedb/__init__.py,sha256=G2KyNnk3Qkhv7OKyxTOnpsxfDycx3NY0O_wXkJlalNY,96
|
58
58
|
langroid/cachedb/base.py,sha256=ztVjB1DtN6pLCujCWnR6xruHxwVj3XkYniRTYAKKqk0,1354
|
59
|
-
langroid/cachedb/momento_cachedb.py,sha256=YEOJ62hEcV6iIeMr5aGgRYgWQqFYaej9gEDEcY0sm7M,3172
|
60
59
|
langroid/cachedb/redis_cachedb.py,sha256=7kgnbf4b5CKsCrlL97mHWKvdvlLt8zgn7lc528jEpiE,5141
|
61
60
|
langroid/embedding_models/__init__.py,sha256=KyYxR3jDFUCfYjSuCL86qjAmrq6mXXjOT4lFNOKVj6Y,955
|
62
61
|
langroid/embedding_models/base.py,sha256=Ml7oA6PzQm0wZmIYn3fhF7dvZCi-amviWUwOeBegH3A,2562
|
@@ -73,7 +72,7 @@ langroid/language_models/base.py,sha256=pfN3t-BktKmN_4K8pwmpjC9OdcHxsytM5s5TmsJ-
|
|
73
72
|
langroid/language_models/config.py,sha256=9Q8wk5a7RQr8LGMT_0WkpjY8S4ywK06SalVRjXlfCiI,378
|
74
73
|
langroid/language_models/mock_lm.py,sha256=5BgHKDVRWFbUwDT_PFgTZXz9-k8wJSA2e3PZmyDgQ1k,4022
|
75
74
|
langroid/language_models/model_info.py,sha256=vOaTi-XFKnz-BvHUvgjnt0XfOtl21Apev3Zy7Rhckbw,14458
|
76
|
-
langroid/language_models/openai_gpt.py,sha256=
|
75
|
+
langroid/language_models/openai_gpt.py,sha256=Hw4llY9Dbox7L0sVP06q10ayoem8FOfXSfbLm3u55v4,85317
|
77
76
|
langroid/language_models/utils.py,sha256=hC5p61P_Qlrowkm5wMap1A1b5ZUCwK_XhPIzAQk1T1s,5483
|
78
77
|
langroid/language_models/prompt_formatter/__init__.py,sha256=2-5cdE24XoFDhifOLl8yiscohil1ogbP1ECkYdBlBsk,372
|
79
78
|
langroid/language_models/prompt_formatter/base.py,sha256=eDS1sgRNZVnoajwV_ZIha6cba5Dt8xjgzdRbPITwx3Q,1221
|
@@ -105,7 +104,7 @@ langroid/prompts/templates.py,sha256=VV84HVf_amOx6xdWQyIsN9i5dNfrbl8rsfFp6hyfOss
|
|
105
104
|
langroid/pydantic_v1/__init__.py,sha256=HxPGVERapVueRUORgSpj2JX_vTZxVlVbWvhpQlpjygE,283
|
106
105
|
langroid/pydantic_v1/main.py,sha256=p_k7kDY9eDrsA5dxNNqXusKLgx7mS_icGnS7fu4goqY,147
|
107
106
|
langroid/utils/__init__.py,sha256=Sruos2tB4G7Tn0vlblvYlX9PEGR0plI2uE0PJ4d_EC4,353
|
108
|
-
langroid/utils/configuration.py,sha256=
|
107
|
+
langroid/utils/configuration.py,sha256=ZkHHkEeWuS-o3_S4g0SE0wz-UK_of23NOWve1kpQiNY,4801
|
109
108
|
langroid/utils/constants.py,sha256=CK09kda9bNDEhnwClq7ZTWZOh38guJlfcZ5hKUS1Ijo,1075
|
110
109
|
langroid/utils/git_utils.py,sha256=WnflJ3R3owhlD0LNdSJakcKhExcEehE1UW5jYVQl8JY,7955
|
111
110
|
langroid/utils/globals.py,sha256=Az9dOFqR6n9CoTYSqa2kLikQWS0oCQ9DFQIQAnG-2q8,1355
|
@@ -130,7 +129,7 @@ langroid/vector_store/pineconedb.py,sha256=otxXZNaBKb9f_H75HTaU3lMHiaR2NUp5MqwLZ
|
|
130
129
|
langroid/vector_store/postgres.py,sha256=wHPtIi2qM4fhO4pMQr95pz1ZCe7dTb2hxl4VYspGZoA,16104
|
131
130
|
langroid/vector_store/qdrantdb.py,sha256=O6dSBoDZ0jzfeVBd7LLvsXu083xs2fxXtPa9gGX3JX4,18443
|
132
131
|
langroid/vector_store/weaviatedb.py,sha256=Yn8pg139gOy3zkaPfoTbMXEEBCiLiYa1MU5d_3UA1K4,11847
|
133
|
-
langroid-0.52.
|
134
|
-
langroid-0.52.
|
135
|
-
langroid-0.52.
|
136
|
-
langroid-0.52.
|
132
|
+
langroid-0.52.6.dist-info/METADATA,sha256=fOf2NTPNfbS1F9rSfa7oLtYHB66xFiN65MnRWybC9sU,63519
|
133
|
+
langroid-0.52.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
134
|
+
langroid-0.52.6.dist-info/licenses/LICENSE,sha256=EgVbvA6VSYgUlvC3RvPKehSg7MFaxWDsFuzLOsPPfJg,1065
|
135
|
+
langroid-0.52.6.dist-info/RECORD,,
|
@@ -1,108 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
import logging
|
3
|
-
import os
|
4
|
-
from datetime import timedelta
|
5
|
-
from typing import Any, Dict, List
|
6
|
-
|
7
|
-
from langroid.cachedb.base import CacheDBConfig
|
8
|
-
from langroid.exceptions import LangroidImportError
|
9
|
-
|
10
|
-
try:
|
11
|
-
import momento
|
12
|
-
from momento.responses import CacheGet
|
13
|
-
except ImportError:
|
14
|
-
raise LangroidImportError(package="momento", extra="momento")
|
15
|
-
|
16
|
-
from dotenv import load_dotenv
|
17
|
-
|
18
|
-
from langroid.cachedb.base import CacheDB
|
19
|
-
|
20
|
-
logger = logging.getLogger(__name__)
|
21
|
-
|
22
|
-
|
23
|
-
class MomentoCacheConfig(CacheDBConfig):
|
24
|
-
"""Configuration model for Momento Cache."""
|
25
|
-
|
26
|
-
ttl: int = 60 * 60 * 24 * 7 # 1 week
|
27
|
-
cachename: str = "langroid_momento_cache"
|
28
|
-
|
29
|
-
|
30
|
-
class MomentoCache(CacheDB):
|
31
|
-
"""Momento implementation of the CacheDB."""
|
32
|
-
|
33
|
-
def __init__(self, config: MomentoCacheConfig):
|
34
|
-
"""
|
35
|
-
Initialize a MomentoCache with the given config.
|
36
|
-
|
37
|
-
Args:
|
38
|
-
config (MomentoCacheConfig): The configuration to use.
|
39
|
-
"""
|
40
|
-
self.config = config
|
41
|
-
load_dotenv()
|
42
|
-
|
43
|
-
momento_token = os.getenv("MOMENTO_AUTH_TOKEN")
|
44
|
-
if momento_token is None:
|
45
|
-
raise ValueError("""MOMENTO_AUTH_TOKEN not set in .env file""")
|
46
|
-
else:
|
47
|
-
self.client = momento.CacheClient(
|
48
|
-
configuration=momento.Configurations.Laptop.v1(),
|
49
|
-
credential_provider=momento.CredentialProvider.from_environment_variable(
|
50
|
-
"MOMENTO_AUTH_TOKEN"
|
51
|
-
),
|
52
|
-
default_ttl=timedelta(seconds=self.config.ttl),
|
53
|
-
)
|
54
|
-
self.client.create_cache(self.config.cachename)
|
55
|
-
|
56
|
-
def clear(self) -> None:
|
57
|
-
"""Clear keys from current db."""
|
58
|
-
self.client.flush_cache(self.config.cachename)
|
59
|
-
|
60
|
-
def store(self, key: str, value: Any) -> None:
|
61
|
-
"""
|
62
|
-
Store a value associated with a key.
|
63
|
-
|
64
|
-
Args:
|
65
|
-
key (str): The key under which to store the value.
|
66
|
-
value (Any): The value to store.
|
67
|
-
"""
|
68
|
-
self.client.set(self.config.cachename, key, json.dumps(value))
|
69
|
-
|
70
|
-
def retrieve(self, key: str) -> Dict[str, Any] | str | None:
|
71
|
-
"""
|
72
|
-
Retrieve the value associated with a key.
|
73
|
-
|
74
|
-
Args:
|
75
|
-
key (str): The key to retrieve the value for.
|
76
|
-
|
77
|
-
Returns:
|
78
|
-
dict: The value associated with the key.
|
79
|
-
"""
|
80
|
-
value = self.client.get(self.config.cachename, key)
|
81
|
-
if isinstance(value, CacheGet.Hit):
|
82
|
-
return json.loads(value.value_string) # type: ignore
|
83
|
-
else:
|
84
|
-
return None
|
85
|
-
|
86
|
-
def delete_keys(self, keys: List[str]) -> None:
|
87
|
-
"""
|
88
|
-
Delete the keys from the cache.
|
89
|
-
|
90
|
-
Args:
|
91
|
-
keys (List[str]): The keys to delete.
|
92
|
-
"""
|
93
|
-
for key in keys:
|
94
|
-
self.client.delete(self.config.cachename, key)
|
95
|
-
|
96
|
-
def delete_keys_pattern(self, pattern: str) -> None:
|
97
|
-
"""
|
98
|
-
Delete the keys from the cache with the given pattern.
|
99
|
-
|
100
|
-
Args:
|
101
|
-
prefix (str): The pattern to match.
|
102
|
-
"""
|
103
|
-
raise NotImplementedError(
|
104
|
-
"""
|
105
|
-
MomentoCache does not support delete_keys_pattern.
|
106
|
-
Please use RedisCache instead.
|
107
|
-
"""
|
108
|
-
)
|
File without changes
|
File without changes
|