sonika-langchain-bot 0.0.6__py3-none-any.whl → 0.0.7__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.
- sonika_langchain_bot/langchain_bot_agent_bdi.py +38 -76
- sonika_langchain_bot/langchain_clasificator.py +4 -15
- sonika_langchain_bot/langchain_class.py +4 -1
- sonika_langchain_bot/langchain_models.py +14 -11
- {sonika_langchain_bot-0.0.6.dist-info → sonika_langchain_bot-0.0.7.dist-info}/METADATA +17 -4
- sonika_langchain_bot-0.0.7.dist-info/RECORD +13 -0
- sonika_langchain_bot-0.0.6.dist-info/RECORD +0 -13
- {sonika_langchain_bot-0.0.6.dist-info → sonika_langchain_bot-0.0.7.dist-info}/LICENSE +0 -0
- {sonika_langchain_bot-0.0.6.dist-info → sonika_langchain_bot-0.0.7.dist-info}/WHEEL +0 -0
- {sonika_langchain_bot-0.0.6.dist-info → sonika_langchain_bot-0.0.7.dist-info}/top_level.txt +0 -0
@@ -1,23 +1,16 @@
|
|
1
1
|
from typing import List
|
2
|
-
import tiktoken
|
3
2
|
from langchain.memory import ConversationBufferMemory
|
4
3
|
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder, SystemMessagePromptTemplate, HumanMessagePromptTemplate
|
5
4
|
from langchain.schema import AIMessage, HumanMessage
|
6
5
|
from langchain.text_splitter import CharacterTextSplitter
|
7
6
|
from langchain_community.vectorstores import FAISS
|
8
|
-
from langchain.chains import LLMChain
|
9
7
|
from sonika_langchain_bot.langchain_bdi import Belief, BotBeliefSystem
|
10
8
|
from sonika_langchain_bot.langchain_class import FileProcessorInterface, IEmbeddings, ILanguageModel, Message, ResponseModel
|
11
|
-
from langchain.tools import Tool
|
12
9
|
from langgraph.checkpoint.memory import MemorySaver
|
13
10
|
from langgraph.prebuilt import create_react_agent
|
14
11
|
from langchain_community.tools import BaseTool
|
15
|
-
import inspect
|
16
12
|
import re
|
17
13
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
14
|
class LangChainBot:
|
22
15
|
"""
|
23
16
|
Implementación principal del bot conversacional con capacidades de procesamiento de archivos,
|
@@ -27,11 +20,11 @@ class LangChainBot:
|
|
27
20
|
def __init__(self, language_model: ILanguageModel, embeddings: IEmbeddings, beliefs: List[Belief], tools: List[BaseTool]):
|
28
21
|
"""
|
29
22
|
Inicializa el bot con el modelo de lenguaje, embeddings y herramientas necesarias.
|
30
|
-
|
23
|
+
|
31
24
|
Args:
|
32
25
|
language_model (ILanguageModel): Modelo de lenguaje a utilizar
|
33
26
|
embeddings (IEmbeddings): Modelo de embeddings para procesamiento de texto
|
34
|
-
|
27
|
+
beliefs (List[Belief]): Lista de creencias iniciales
|
35
28
|
tools (List[BaseTool]): Lista de herramientas disponibles
|
36
29
|
"""
|
37
30
|
self.language_model = language_model
|
@@ -41,34 +34,11 @@ class LangChainBot:
|
|
41
34
|
self.vector_store = None
|
42
35
|
self.tools = tools
|
43
36
|
self.beliefs = beliefs
|
44
|
-
self.belief_system = BotBeliefSystem('Hal9000', '1.0.0',beliefs_init=beliefs,tools=tools
|
45
|
-
self.conversation = self.
|
46
|
-
self.agent_executor = self.
|
47
|
-
|
48
|
-
def generate_prompt_tools(self, tools: List[BaseTool]):
|
49
|
-
"""
|
50
|
-
Carga y procesa las herramientas disponibles para el bot.
|
51
|
-
|
52
|
-
Args:
|
53
|
-
tools (List[BaseTool]): Lista de herramientas a cargar
|
54
|
-
"""
|
55
|
-
text_tools = ""
|
56
|
-
for tool in tools:
|
57
|
-
tool_name = tool.name
|
58
|
-
tool_description = tool.description
|
59
|
-
text_tools += f"Tool Name: {tool_name}\nDescription: {tool_description}\n"
|
60
|
-
run_method = getattr(tool, '_run', None)
|
61
|
-
|
62
|
-
if run_method:
|
63
|
-
params = inspect.signature(run_method)
|
64
|
-
text_tools += f"Parameters: {params}\n"
|
65
|
-
else:
|
66
|
-
text_tools += "No _run method found.\n"
|
67
|
-
text_tools += "\n---\n"
|
68
|
-
|
69
|
-
return text_tools
|
37
|
+
self.belief_system = BotBeliefSystem('Hal9000', '1.0.0', beliefs_init=beliefs, tools=tools)
|
38
|
+
self.conversation = self._create_conversation_chain()
|
39
|
+
self.agent_executor = self._create_agent_executor()
|
70
40
|
|
71
|
-
def
|
41
|
+
def _create_conversation_chain(self):
|
72
42
|
"""
|
73
43
|
Crea la cadena de conversación con el prompt template y la memoria.
|
74
44
|
Ahora incluye el contexto del sistema de creencias.
|
@@ -76,71 +46,72 @@ class LangChainBot:
|
|
76
46
|
beliefs_context = self.belief_system.generate_prompt_context()
|
77
47
|
full_system_prompt = f"{beliefs_context}\n\n"
|
78
48
|
|
79
|
-
print(full_system_prompt)
|
80
|
-
|
81
49
|
prompt = ChatPromptTemplate.from_messages([
|
82
50
|
SystemMessagePromptTemplate.from_template(full_system_prompt),
|
83
51
|
MessagesPlaceholder(variable_name="history"),
|
84
52
|
HumanMessagePromptTemplate.from_template("{input}")
|
85
53
|
])
|
86
|
-
return LLMChain(llm=self.language_model.model, prompt=prompt, memory=self.memory)
|
87
54
|
|
88
|
-
|
55
|
+
# Usando RunnableSequence para reemplazar LLMChain
|
56
|
+
return prompt | self.language_model.model
|
57
|
+
|
58
|
+
def _create_agent_executor(self):
|
89
59
|
"""
|
90
60
|
Crea el ejecutor del agente con las herramientas configuradas.
|
91
|
-
|
61
|
+
|
92
62
|
Returns:
|
93
63
|
Agent: Agente configurado con las herramientas
|
94
64
|
"""
|
95
65
|
return create_react_agent(self.language_model.model, self.tools, checkpointer=self.memory_agent)
|
96
|
-
|
97
|
-
def
|
66
|
+
|
67
|
+
def _getInstruccionTool(self, bot_response):
|
98
68
|
"""
|
99
69
|
Extrae las instrucciones para herramientas del texto de respuesta del bot.
|
100
|
-
|
70
|
+
|
101
71
|
Args:
|
102
72
|
bot_response (str): Respuesta del bot a analizar
|
103
|
-
|
73
|
+
|
104
74
|
Returns:
|
105
75
|
str: Instrucción extraída o cadena vacía si no se encuentra
|
106
76
|
"""
|
107
77
|
patron = r'\*\*\*(.*?)\*\*\*'
|
108
78
|
coincidencia = re.search(patron, bot_response)
|
109
|
-
if coincidencia
|
110
|
-
return coincidencia.group(1).strip()
|
111
|
-
else:
|
112
|
-
return ''
|
79
|
+
return coincidencia.group(1).strip() if coincidencia else ''
|
113
80
|
|
114
81
|
def get_response(self, user_input: str) -> ResponseModel:
|
115
82
|
"""
|
116
83
|
Genera una respuesta para la entrada del usuario, procesando el contexto y ejecutando herramientas si es necesario.
|
117
|
-
|
84
|
+
|
118
85
|
Args:
|
119
86
|
user_input (str): Entrada del usuario
|
120
|
-
|
87
|
+
|
121
88
|
Returns:
|
122
89
|
ResponseModel: Modelo de respuesta con tokens y texto
|
123
90
|
"""
|
124
91
|
context = self._get_context(user_input)
|
125
92
|
augmented_input = f"User question: {user_input}"
|
126
|
-
if
|
93
|
+
if context:
|
127
94
|
augmented_input = f"Context from attached files:\n{context}\n\nUser question: {user_input}"
|
95
|
+
|
96
|
+
bot_response = self.conversation.invoke({"input": augmented_input, "history": self.memory.chat_memory.messages})
|
97
|
+
|
98
|
+
token_usage= bot_response.response_metadata['token_usage']
|
99
|
+
bot_response = bot_response.content
|
128
100
|
|
129
|
-
|
130
|
-
instruction_tool = self.getInstruccionTool(bot_response)
|
101
|
+
instruction_tool = self._getInstruccionTool(bot_response)
|
131
102
|
|
132
103
|
if instruction_tool:
|
133
104
|
messages = [HumanMessage(content=instruction_tool)]
|
134
105
|
thread_id = "abc123"
|
135
106
|
config = {"configurable": {"thread_id": thread_id}}
|
136
|
-
|
107
|
+
|
137
108
|
result_stream = self.agent_executor.stream(
|
138
109
|
{"messages": messages}, config
|
139
110
|
)
|
140
111
|
|
141
112
|
tool_response = ""
|
142
113
|
agent_response = ""
|
143
|
-
|
114
|
+
|
144
115
|
for response in result_stream:
|
145
116
|
if 'tools' in response:
|
146
117
|
for message in response['tools']['messages']:
|
@@ -148,23 +119,23 @@ class LangChainBot:
|
|
148
119
|
if 'agent' in response:
|
149
120
|
for message in response['agent']['messages']:
|
150
121
|
agent_response = message.content
|
151
|
-
|
122
|
+
|
152
123
|
bot_response = agent_response if agent_response else tool_response
|
153
|
-
|
154
|
-
user_tokens = self.language_model.count_tokens(augmented_input)
|
155
|
-
bot_tokens = self.language_model.count_tokens(bot_response)
|
156
124
|
|
157
|
-
|
125
|
+
user_tokens = token_usage['prompt_tokens']
|
126
|
+
bot_tokens = token_usage['completion_tokens']
|
127
|
+
|
128
|
+
self.save_messages(user_input, bot_response)
|
158
129
|
|
159
130
|
return ResponseModel(user_tokens=user_tokens, bot_tokens=bot_tokens, response=bot_response)
|
160
131
|
|
161
132
|
def _get_context(self, query: str) -> str:
|
162
133
|
"""
|
163
134
|
Obtiene el contexto relevante para una consulta del almacén de vectores.
|
164
|
-
|
135
|
+
|
165
136
|
Args:
|
166
137
|
query (str): Consulta para buscar contexto
|
167
|
-
|
138
|
+
|
168
139
|
Returns:
|
169
140
|
str: Contexto encontrado o cadena vacía
|
170
141
|
"""
|
@@ -180,7 +151,7 @@ class LangChainBot:
|
|
180
151
|
self.memory.clear()
|
181
152
|
self.vector_store = None
|
182
153
|
|
183
|
-
def load_conversation_history(self, messages:
|
154
|
+
def load_conversation_history(self, messages: List[Message]):
|
184
155
|
"""
|
185
156
|
Carga el historial de conversación previo usando la estructura de mensajes simplificada.
|
186
157
|
|
@@ -196,7 +167,7 @@ class LangChainBot:
|
|
196
167
|
def save_messages(self, user_message: str, bot_response: str):
|
197
168
|
"""
|
198
169
|
Guarda los mensajes en la memoria de conversación.
|
199
|
-
|
170
|
+
|
200
171
|
Args:
|
201
172
|
user_message (str): Mensaje del usuario
|
202
173
|
bot_response (str): Respuesta del bot
|
@@ -207,24 +178,15 @@ class LangChainBot:
|
|
207
178
|
def process_file(self, file: FileProcessorInterface):
|
208
179
|
"""
|
209
180
|
Procesa un archivo y lo añade al almacén de vectores.
|
210
|
-
|
181
|
+
|
211
182
|
Args:
|
212
183
|
file (FileProcessorInterface): Archivo a procesar
|
213
184
|
"""
|
214
185
|
document = file.getText()
|
215
186
|
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
|
216
187
|
texts = text_splitter.split_documents(document)
|
217
|
-
|
188
|
+
|
218
189
|
if self.vector_store is None:
|
219
190
|
self.vector_store = FAISS.from_texts([doc.page_content for doc in texts], self.embeddings)
|
220
191
|
else:
|
221
192
|
self.vector_store.add_texts([doc.page_content for doc in texts])
|
222
|
-
|
223
|
-
def get_total_tokens(self):
|
224
|
-
"""
|
225
|
-
Obtiene el total de tokens utilizados en la conversación.
|
226
|
-
|
227
|
-
Returns:
|
228
|
-
int: Total de tokens
|
229
|
-
"""
|
230
|
-
return self.language_model.count_tokens(self.memory.chat_memory.get_messages())
|
@@ -1,25 +1,14 @@
|
|
1
1
|
from pydantic import BaseModel
|
2
|
-
from langchain_openai import ChatOpenAI
|
3
|
-
from langchain_core.messages import HumanMessage
|
4
2
|
from typing import Dict, Any, Type
|
5
3
|
from sonika_langchain_bot.langchain_class import ILanguageModel
|
6
4
|
|
7
|
-
|
8
|
-
class OpenAIModel(ILanguageModel):
|
9
|
-
def __init__(self, api_key: str, model_name: str = "gpt-4o-mini", temperature: float = 0.7, validation_class: Type[BaseModel] = None,):
|
10
|
-
self.model = ChatOpenAI(api_key=api_key, temperature=temperature, model=model_name).with_structured_output(validation_class)
|
11
|
-
|
12
|
-
def get_response(self, prompt: str) -> str:
|
13
|
-
message = HumanMessage(content=prompt)
|
14
|
-
# Invocar el modelo con el mensaje creado
|
15
|
-
response = self.model.invoke([message])
|
16
|
-
return response
|
17
|
-
|
18
5
|
# Clase para realizar la clasificación de texto
|
19
6
|
class TextClassifier:
|
20
|
-
def __init__(self,
|
7
|
+
def __init__(self, validation_class: Type[BaseModel], llm: ILanguageModel):
|
21
8
|
self.llm =llm
|
22
9
|
self.validation_class = validation_class
|
10
|
+
#configuramos el modelo para que tenga una estructura de salida
|
11
|
+
self.llm.model = self.llm.model.with_structured_output(validation_class)
|
23
12
|
|
24
13
|
def classify(self, text: str) -> Dict[str, Any]:
|
25
14
|
# Crear el template del prompt
|
@@ -30,7 +19,7 @@ class TextClassifier:
|
|
30
19
|
|
31
20
|
Only extract the properties mentioned in the validation class.
|
32
21
|
"""
|
33
|
-
response = self.llm.
|
22
|
+
response = self.llm.invoke(prompt=prompt)
|
34
23
|
|
35
24
|
# Asegurarse de que el `response` es de la clase de validación proporcionada
|
36
25
|
if isinstance(response, self.validation_class):
|
@@ -7,6 +7,9 @@ class ResponseModel():
|
|
7
7
|
self.user_tokens = user_tokens
|
8
8
|
self.bot_tokens = bot_tokens
|
9
9
|
self.response = response
|
10
|
+
def __repr__(self):
|
11
|
+
return (f"ResponseModel(user_tokens={self.user_tokens}, "
|
12
|
+
f"bot_tokens={self.bot_tokens}, response={self.response})")
|
10
13
|
|
11
14
|
# Definir la interfaz para procesar archivos
|
12
15
|
class FileProcessorInterface(ABC):
|
@@ -16,7 +19,7 @@ class FileProcessorInterface(ABC):
|
|
16
19
|
|
17
20
|
class ILanguageModel(ABC):
|
18
21
|
@abstractmethod
|
19
|
-
def
|
22
|
+
def predict(self, prompt: str) -> str:
|
20
23
|
pass
|
21
24
|
|
22
25
|
class IEmbeddings(ABC):
|
@@ -1,6 +1,8 @@
|
|
1
1
|
from langchain_openai import ChatOpenAI
|
2
|
-
import tiktoken
|
3
2
|
from sonika_langchain_bot.langchain_class import ILanguageModel
|
3
|
+
from langchain_core.messages import HumanMessage
|
4
|
+
from typing import Type
|
5
|
+
from pydantic import BaseModel
|
4
6
|
|
5
7
|
|
6
8
|
class OpenAILanguageModel(ILanguageModel):
|
@@ -19,9 +21,8 @@ class OpenAILanguageModel(ILanguageModel):
|
|
19
21
|
temperature (float): Temperatura para la generación de respuestas
|
20
22
|
"""
|
21
23
|
self.model = ChatOpenAI(temperature=temperature, model_name=model_name, api_key=api_key)
|
22
|
-
self.tokenizer = tiktoken.encoding_for_model(model_name)
|
23
24
|
|
24
|
-
def
|
25
|
+
def predict(self, prompt: str) -> str:
|
25
26
|
"""
|
26
27
|
Genera una respuesta basada en el prompt proporcionado.
|
27
28
|
|
@@ -32,15 +33,17 @@ class OpenAILanguageModel(ILanguageModel):
|
|
32
33
|
str: Respuesta generada por el modelo
|
33
34
|
"""
|
34
35
|
return self.model.predict(prompt)
|
35
|
-
|
36
|
-
def
|
36
|
+
|
37
|
+
def invoke(self, prompt: str) -> str:
|
37
38
|
"""
|
38
|
-
|
39
|
-
|
39
|
+
Invokes the language model with a given prompt and returns the generated response.
|
40
|
+
|
40
41
|
Args:
|
41
|
-
|
42
|
-
|
42
|
+
prompt (str): The input text to be processed by the language model.
|
43
|
+
|
43
44
|
Returns:
|
44
|
-
|
45
|
+
str: The response generated by the language model based on the provided prompt.
|
45
46
|
"""
|
46
|
-
|
47
|
+
message = HumanMessage(content=prompt)
|
48
|
+
response = self.model.invoke([message])
|
49
|
+
return response
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: sonika-langchain-bot
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.7
|
4
4
|
Summary: Agente langchain con LLM
|
5
5
|
Author: Erley Blanco Carvajal
|
6
6
|
License: MIT License
|
@@ -69,7 +69,7 @@ from sonika_langchain_bot.langchain_models import OpenAILanguageModel
|
|
69
69
|
from langchain_openai import OpenAIEmbeddings
|
70
70
|
|
71
71
|
# Inicializar el modelo de lenguaje
|
72
|
-
language_model = OpenAILanguageModel(api_key, model_name='gpt-
|
72
|
+
language_model = OpenAILanguageModel(api_key, model_name='gpt-4o-mini', temperature=1)
|
73
73
|
embeddings = OpenAIEmbeddings(api_key=api_key)
|
74
74
|
|
75
75
|
# Configurar herramientas propias o de terceros
|
@@ -91,6 +91,19 @@ bot = LangChainBot(language_model, embeddings, beliefs=beliefs, tools=tools)
|
|
91
91
|
|
92
92
|
# Obtener respuesta
|
93
93
|
response = bot.get_response("Hola como te llamas?")
|
94
|
+
|
95
|
+
bot = LangChainBot(language_model, embeddings, beliefs=beliefs, tools=tools)
|
96
|
+
|
97
|
+
user_message = 'Hola como me llamo?'
|
98
|
+
|
99
|
+
#Cargas la conversacion previa con el bot
|
100
|
+
bot.load_conversation_history([Message(content="Mi nombre es Erley", is_bot=False)])
|
101
|
+
# Obtener la respuesta del bot
|
102
|
+
response_model: ResponseModel = bot.get_response(user_message)
|
103
|
+
bot_response = response_model
|
104
|
+
|
105
|
+
print(bot_response)
|
106
|
+
|
94
107
|
```
|
95
108
|
|
96
109
|
### Ejemplo de Clasificación de Texto
|
@@ -113,8 +126,8 @@ class Classification(BaseModel):
|
|
113
126
|
)
|
114
127
|
|
115
128
|
# Inicializar clasificador
|
116
|
-
model =
|
117
|
-
classifier = TextClassifier(
|
129
|
+
model = OpenAILanguageModel(api_key=api_key)
|
130
|
+
classifier = TextClassifier(llm=model, validation_class=Classification)
|
118
131
|
|
119
132
|
# Clasificar texto
|
120
133
|
result = classifier.classify("Tu texto aquí")
|
@@ -0,0 +1,13 @@
|
|
1
|
+
sonika_langchain_bot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
sonika_langchain_bot/langchain_bdi.py,sha256=aCo6d2vhn5d1xGmN3Ldpa8DStJUSLuhDPZ3y4iXILIg,7329
|
3
|
+
sonika_langchain_bot/langchain_bot_agent_bdi.py,sha256=4CjeIDOTefb7DzTq3W7Fq-jhSGpBgaR1WuDr_xNT5Ig,7721
|
4
|
+
sonika_langchain_bot/langchain_clasificator.py,sha256=GR85ZAliymBSoDa5PXB31BvJkuiokGjS2v3RLdXnzzk,1381
|
5
|
+
sonika_langchain_bot/langchain_class.py,sha256=5anB6v_wCzEoAJRb8fV9lPPS72E7-k51y_aeiip8RAw,1114
|
6
|
+
sonika_langchain_bot/langchain_files.py,sha256=SEyqnJgBc_nbCIG31eypunBbO33T5AHFOhQZcghTks4,381
|
7
|
+
sonika_langchain_bot/langchain_models.py,sha256=AglQNSFXH5cVudBmtSAQ4t51piRXmJfrCfDhGULLt0I,1761
|
8
|
+
sonika_langchain_bot/langchain_tools.py,sha256=y7wLf1DbUua3QIvz938Ek-JIMOuQhrOIptJadW8OIsU,466
|
9
|
+
sonika_langchain_bot-0.0.7.dist-info/LICENSE,sha256=O8VZ4aU_rUMAArvYTm2bshcZ991huv_tpfB5BKHH9Q8,1064
|
10
|
+
sonika_langchain_bot-0.0.7.dist-info/METADATA,sha256=zkwBwATx9_0y5BKYrYm6X4iby4vUoQjoMJiDlzAJBSs,4161
|
11
|
+
sonika_langchain_bot-0.0.7.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
|
12
|
+
sonika_langchain_bot-0.0.7.dist-info/top_level.txt,sha256=UsTTSZFEw2wrPSVh4ufu01e2m_E7O_QVYT_k4zCQaAE,21
|
13
|
+
sonika_langchain_bot-0.0.7.dist-info/RECORD,,
|
@@ -1,13 +0,0 @@
|
|
1
|
-
sonika_langchain_bot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
sonika_langchain_bot/langchain_bdi.py,sha256=aCo6d2vhn5d1xGmN3Ldpa8DStJUSLuhDPZ3y4iXILIg,7329
|
3
|
-
sonika_langchain_bot/langchain_bot_agent_bdi.py,sha256=ueN2dP8nuBO9gV81sXIEP8BrWK8b3jglpDNSOIsPa58,9005
|
4
|
-
sonika_langchain_bot/langchain_clasificator.py,sha256=_58LRwd2G8u-KKgFnp9FSZtxBg4vyVbeD5aS5ny4Hcs,1889
|
5
|
-
sonika_langchain_bot/langchain_class.py,sha256=tPc_aKbhYYv1DUwIEuaDDFpIwKOdfmMuJWOKjX6Iyco,953
|
6
|
-
sonika_langchain_bot/langchain_files.py,sha256=SEyqnJgBc_nbCIG31eypunBbO33T5AHFOhQZcghTks4,381
|
7
|
-
sonika_langchain_bot/langchain_models.py,sha256=8gC7rDxGI0JcNn-MADyLQ5rK8mgOS1iVjLsV8kCQi9k,1578
|
8
|
-
sonika_langchain_bot/langchain_tools.py,sha256=y7wLf1DbUua3QIvz938Ek-JIMOuQhrOIptJadW8OIsU,466
|
9
|
-
sonika_langchain_bot-0.0.6.dist-info/LICENSE,sha256=O8VZ4aU_rUMAArvYTm2bshcZ991huv_tpfB5BKHH9Q8,1064
|
10
|
-
sonika_langchain_bot-0.0.6.dist-info/METADATA,sha256=JlLf1ptcIP13wzAyXXh50LK1uF-LCxej9UqpLYuyRIQ,3823
|
11
|
-
sonika_langchain_bot-0.0.6.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
|
12
|
-
sonika_langchain_bot-0.0.6.dist-info/top_level.txt,sha256=UsTTSZFEw2wrPSVh4ufu01e2m_E7O_QVYT_k4zCQaAE,21
|
13
|
-
sonika_langchain_bot-0.0.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|