sonika-langchain-bot 0.0.18__py3-none-any.whl → 0.0.19__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.

Potentially problematic release.


This version of sonika-langchain-bot might be problematic. Click here for more details.

@@ -2,16 +2,30 @@ from pydantic import BaseModel
2
2
  from typing import Dict, Any, Type
3
3
  from sonika_langchain_bot.langchain_class import ILanguageModel
4
4
 
5
- # Clase para realizar la clasificación de texto
5
+ class ClassificationResponse(BaseModel):
6
+ """Respuesta de clasificación con tokens utilizados"""
7
+ input_tokens: int
8
+ output_tokens: int
9
+ result: Dict[str, Any]
10
+
6
11
  class TextClassifier:
7
12
  def __init__(self, validation_class: Type[BaseModel], llm: ILanguageModel):
8
- self.llm =llm
13
+ self.llm = llm
9
14
  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)
15
+ # Guardamos ambas versiones del modelo
16
+ self.original_model = self.llm.model # Sin structured output
17
+ self.structured_model = self.llm.model.with_structured_output(validation_class)
12
18
 
13
- def classify(self, text: str) -> Dict[str, Any]:
14
- # Crear el template del prompt
19
+ def classify(self, text: str) -> ClassificationResponse:
20
+ """
21
+ Clasifica el texto según la clase de validación.
22
+
23
+ Args:
24
+ text: Texto a clasificar
25
+
26
+ Returns:
27
+ ClassificationResponse: Objeto con result, input_tokens y output_tokens
28
+ """
15
29
  prompt = f"""
16
30
  Classify the following text based on the properties defined in the validation class.
17
31
 
@@ -19,12 +33,34 @@ class TextClassifier:
19
33
 
20
34
  Only extract the properties mentioned in the validation class.
21
35
  """
22
- response = self.llm.invoke(prompt=prompt)
23
36
 
24
- # Asegurarse de que el `response` es de la clase de validación proporcionada
37
+ # Primero invocamos el modelo ORIGINAL para obtener metadata de tokens
38
+ raw_response = self.original_model.invoke(prompt)
39
+
40
+ # Extraer información de tokens del AIMessage original
41
+ input_tokens = 0
42
+ output_tokens = 0
43
+
44
+ if hasattr(raw_response, 'response_metadata'):
45
+ token_usage = raw_response.response_metadata.get('token_usage', {})
46
+ input_tokens = token_usage.get('prompt_tokens', 0)
47
+ output_tokens = token_usage.get('completion_tokens', 0)
48
+
49
+ # Ahora invocamos con structured output para obtener el objeto parseado
50
+ response = self.structured_model.invoke(prompt)
51
+
52
+ # Validar que el response es de la clase correcta
25
53
  if isinstance(response, self.validation_class):
26
- # Crear el resultado dinámicamente basado en los atributos de la clase de validación
27
- result = {field: getattr(response, field) for field in self.validation_class.__fields__.keys()}
28
- return result
54
+ # Crear el resultado dinámicamente basado en los atributos
55
+ result_data = {
56
+ field: getattr(response, field)
57
+ for field in self.validation_class.__fields__.keys()
58
+ }
59
+
60
+ return ClassificationResponse(
61
+ input_tokens=input_tokens,
62
+ output_tokens=output_tokens,
63
+ result=result_data
64
+ )
29
65
  else:
30
- raise ValueError(f"The response is not of type '{self.validation_class.__name__}'")
66
+ raise ValueError(f"The response is not of type '{self.validation_class.__name__}'")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sonika-langchain-bot
3
- Version: 0.0.18
3
+ Version: 0.0.19
4
4
  Summary: Agente langchain con LLM
5
5
  Author: Erley Blanco Carvajal
6
6
  License: MIT License
@@ -3,13 +3,13 @@ sonika_langchain_bot/document_processor.py,sha256=RuHT22Zt-psoe4adFWKwBJ0gi638fq
3
3
  sonika_langchain_bot/langchain_bdi.py,sha256=ithc55azP5XSPb8AGRUrDGYnVI6I4IqpqElLNat4BAQ,7024
4
4
  sonika_langchain_bot/langchain_bot_agent.py,sha256=wdQrIVUxmkU-VmGfrdIcnDJPdKmRQXgeKYf_50By5cE,24359
5
5
  sonika_langchain_bot/langchain_bot_agent_bdi.py,sha256=Ev0hhRQYe6kyGAHiFDhFsfu6QnTwUFaA9oB8DfNV7u4,8613
6
- sonika_langchain_bot/langchain_clasificator.py,sha256=GR85ZAliymBSoDa5PXB31BvJkuiokGjS2v3RLdXnzzk,1381
6
+ sonika_langchain_bot/langchain_clasificator.py,sha256=h0-H_1bqgA04rF2ZHh5zOg2PinqTuLQMcSK7AGK4uw8,2583
7
7
  sonika_langchain_bot/langchain_class.py,sha256=5anB6v_wCzEoAJRb8fV9lPPS72E7-k51y_aeiip8RAw,1114
8
8
  sonika_langchain_bot/langchain_files.py,sha256=SEyqnJgBc_nbCIG31eypunBbO33T5AHFOhQZcghTks4,381
9
9
  sonika_langchain_bot/langchain_models.py,sha256=vqSSZ48tNofrTMLv1QugDdyey2MuIeSdlLSD37AnzkI,2235
10
10
  sonika_langchain_bot/langchain_tools.py,sha256=y7wLf1DbUua3QIvz938Ek-JIMOuQhrOIptJadW8OIsU,466
11
- sonika_langchain_bot-0.0.18.dist-info/licenses/LICENSE,sha256=O8VZ4aU_rUMAArvYTm2bshcZ991huv_tpfB5BKHH9Q8,1064
12
- sonika_langchain_bot-0.0.18.dist-info/METADATA,sha256=mfLJal88ZamfkvOouwQZ01VwVz9784vb5ynFOr5Ust0,6508
13
- sonika_langchain_bot-0.0.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
14
- sonika_langchain_bot-0.0.18.dist-info/top_level.txt,sha256=UsTTSZFEw2wrPSVh4ufu01e2m_E7O_QVYT_k4zCQaAE,21
15
- sonika_langchain_bot-0.0.18.dist-info/RECORD,,
11
+ sonika_langchain_bot-0.0.19.dist-info/licenses/LICENSE,sha256=O8VZ4aU_rUMAArvYTm2bshcZ991huv_tpfB5BKHH9Q8,1064
12
+ sonika_langchain_bot-0.0.19.dist-info/METADATA,sha256=hjo1qMMAqU1CCsc1BbbURDV3sOTQYVdEraEVCiDRXoc,6508
13
+ sonika_langchain_bot-0.0.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
14
+ sonika_langchain_bot-0.0.19.dist-info/top_level.txt,sha256=UsTTSZFEw2wrPSVh4ufu01e2m_E7O_QVYT_k4zCQaAE,21
15
+ sonika_langchain_bot-0.0.19.dist-info/RECORD,,