ws-bom-robot-app 0.0.86__py3-none-any.whl → 0.0.87__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.
@@ -1,102 +1,102 @@
1
- import asyncio, logging, aiohttp
2
- from ws_bom_robot_app.llm.vector_store.integration.base import IntegrationStrategy
3
- from langchain_core.documents import Document
4
- from ws_bom_robot_app.llm.vector_store.loader.base import Loader
5
- from typing import List, Union, Optional
6
- from pydantic import BaseModel, Field, AliasChoices
7
- import json
8
- import os
9
-
10
- class ThronParams(BaseModel):
11
- """
12
- ThronParams is a model that defines the parameters required for Thron integration.
13
-
14
- Attributes:
15
- app_id (str): The application ID for Thron.
16
- client_id (str): The client ID for Thron.
17
- client_secret (str): The client secret for Thron.
18
- """
19
- organization_name: str = Field(validation_alias=AliasChoices("organizationName","organization_name"))
20
- attribute_fields: Optional[List[str]] = Field(default=None, validation_alias=AliasChoices("attributeFields","attribute_fields"))
21
- client_id: str = Field(validation_alias=AliasChoices("clientId","client_id"))
22
- client_secret: str = Field(validation_alias=AliasChoices("clientSecret","client_secret"))
23
-
24
- class Thron(IntegrationStrategy):
25
- def __init__(self, knowledgebase_path: str, data: dict[str, Union[str,int,list]]):
26
- super().__init__(knowledgebase_path, data)
27
- self.__data = ThronParams.model_validate(self.data)
28
-
29
- def working_subdirectory(self) -> str:
30
- return 'thron'
31
-
32
- async def run(self) -> None:
33
- _data = await self.__get_data()
34
- transformed_data = self.__transform_data(_data)
35
- json_file_path = os.path.join(self.working_directory, 'thron_data.json')
36
- with open(json_file_path, 'w', encoding='utf-8') as f:
37
- json.dump(transformed_data, f, indent=2, ensure_ascii=False)
38
-
39
- async def load(self) -> list[Document]:
40
- await self.run()
41
- await asyncio.sleep(1)
42
- return await Loader(self.working_directory).load()
43
-
44
- async def __get_auth_token(self) -> str:
45
- try:
46
- async with aiohttp.ClientSession() as session:
47
- auth_data = {
48
- "grant_type": "client_credentials",
49
- "client_id": self.__data.client_id,
50
- "client_secret": self.__data.client_secret
51
- }
52
- headers = {
53
- "accept": "application/json",
54
- "Content-Type": "application/x-www-form-urlencoded"
55
- }
56
- async with session.post(f"https://{self.__data.organization_name}.thron.com/api/v1/authentication/oauth2/token", data=auth_data, headers=headers) as response:
57
- result = await response.json()
58
- return result.get("access_token", "")
59
- except Exception as e:
60
- logging.error(f"Error fetching Thron auth token: {e}")
61
- return None
62
-
63
- async def __get_data(self) -> dict:
64
- try:
65
- token = await self.__get_auth_token()
66
- if not token:
67
- logging.error("Failed to obtain Thron authentication token.")
68
- return {}
69
- attribute_fields = ",".join(self.__data.attribute_fields) if self.__data.attribute_fields else ""
70
- async with aiohttp.ClientSession() as session:
71
- headers = {
72
- "accept": "application/json",
73
- "Authorization": f"Bearer {token}"
74
- }
75
- async with session.get(f"https://{self.__data.organization_name}.thron.com/api/v1/product-data/products?attributeFields=product_id,{attribute_fields}", headers=headers) as response:
76
- result = await response.json()
77
- return result.get("items", {})
78
- except Exception as e:
79
- logging.error(f"Error fetching Thron product data: {e}")
80
- return {}
81
- return []
82
-
83
-
84
-
85
- def __transform_data(self, data: dict) -> dict:
86
- _data = []
87
- for item in data:
88
- if item.get("hierarchyLevel") == "MASTER":
89
- # Iterate through variants to find the product_id
90
- for item_variant in data:
91
- if item_variant.get("hierarchyLevel") == "VARIANT":
92
- for attr in item.get("attributes", []):
93
- if attr.get("code") == "product_id" and attr.get("identifier") == item_variant.get("variation").get("master").split(":")[-1]:
94
- # Initialize variants list if it doesn't exist
95
- if "variants" not in item:
96
- item["variants"] = []
97
- item["variants"].append(item_variant)
98
- _data.append(item)
99
- break
100
- elif item.get("hierarchyLevel") == "SIMPLE":
101
- _data.append(item)
102
- return _data
1
+ import asyncio, logging, aiohttp
2
+ from ws_bom_robot_app.llm.vector_store.integration.base import IntegrationStrategy
3
+ from langchain_core.documents import Document
4
+ from ws_bom_robot_app.llm.vector_store.loader.base import Loader
5
+ from typing import List, Union, Optional
6
+ from pydantic import BaseModel, Field, AliasChoices
7
+ import json
8
+ import os
9
+
10
+ class ThronParams(BaseModel):
11
+ """
12
+ ThronParams is a model that defines the parameters required for Thron integration.
13
+
14
+ Attributes:
15
+ app_id (str): The application ID for Thron.
16
+ client_id (str): The client ID for Thron.
17
+ client_secret (str): The client secret for Thron.
18
+ """
19
+ organization_name: str = Field(validation_alias=AliasChoices("organizationName","organization_name"))
20
+ attribute_fields: Optional[List[str]] = Field(default=None, validation_alias=AliasChoices("attributeFields","attribute_fields"))
21
+ client_id: str = Field(validation_alias=AliasChoices("clientId","client_id"))
22
+ client_secret: str = Field(validation_alias=AliasChoices("clientSecret","client_secret"))
23
+
24
+ class Thron(IntegrationStrategy):
25
+ def __init__(self, knowledgebase_path: str, data: dict[str, Union[str,int,list]]):
26
+ super().__init__(knowledgebase_path, data)
27
+ self.__data = ThronParams.model_validate(self.data)
28
+
29
+ def working_subdirectory(self) -> str:
30
+ return 'thron'
31
+
32
+ async def run(self) -> None:
33
+ _data = await self.__get_data()
34
+ transformed_data = self.__transform_data(_data)
35
+ json_file_path = os.path.join(self.working_directory, 'thron_data.json')
36
+ with open(json_file_path, 'w', encoding='utf-8') as f:
37
+ json.dump(transformed_data, f, indent=2, ensure_ascii=False)
38
+
39
+ async def load(self) -> list[Document]:
40
+ await self.run()
41
+ await asyncio.sleep(1)
42
+ return await Loader(self.working_directory).load()
43
+
44
+ async def __get_auth_token(self) -> str:
45
+ try:
46
+ async with aiohttp.ClientSession() as session:
47
+ auth_data = {
48
+ "grant_type": "client_credentials",
49
+ "client_id": self.__data.client_id,
50
+ "client_secret": self.__data.client_secret
51
+ }
52
+ headers = {
53
+ "accept": "application/json",
54
+ "Content-Type": "application/x-www-form-urlencoded"
55
+ }
56
+ async with session.post(f"https://{self.__data.organization_name}.thron.com/api/v1/authentication/oauth2/token", data=auth_data, headers=headers) as response:
57
+ result = await response.json()
58
+ return result.get("access_token", "")
59
+ except Exception as e:
60
+ logging.error(f"Error fetching Thron auth token: {e}")
61
+ return None
62
+
63
+ async def __get_data(self) -> dict:
64
+ try:
65
+ token = await self.__get_auth_token()
66
+ if not token:
67
+ logging.error("Failed to obtain Thron authentication token.")
68
+ return {}
69
+ attribute_fields = ",".join(self.__data.attribute_fields) if self.__data.attribute_fields else ""
70
+ async with aiohttp.ClientSession() as session:
71
+ headers = {
72
+ "accept": "application/json",
73
+ "Authorization": f"Bearer {token}"
74
+ }
75
+ async with session.get(f"https://{self.__data.organization_name}.thron.com/api/v1/product-data/products?attributeFields=product_id,{attribute_fields}", headers=headers) as response:
76
+ result = await response.json()
77
+ return result.get("items", {})
78
+ except Exception as e:
79
+ logging.error(f"Error fetching Thron product data: {e}")
80
+ return {}
81
+ return []
82
+
83
+
84
+
85
+ def __transform_data(self, data: dict) -> dict:
86
+ _data = []
87
+ for item in data:
88
+ if item.get("hierarchyLevel") == "MASTER":
89
+ # Iterate through variants to find the product_id
90
+ for item_variant in data:
91
+ if item_variant.get("hierarchyLevel") == "VARIANT":
92
+ for attr in item.get("attributes", []):
93
+ if attr.get("code") == "product_id" and attr.get("identifier") == item_variant.get("variation").get("master").split(":")[-1]:
94
+ # Initialize variants list if it doesn't exist
95
+ if "variants" not in item:
96
+ item["variants"] = []
97
+ item["variants"].append(item_variant)
98
+ _data.append(item)
99
+ break
100
+ elif item.get("hierarchyLevel") == "SIMPLE":
101
+ _data.append(item)
102
+ return _data
@@ -1,25 +1,25 @@
1
- import json
2
- from typing import Optional
3
- from langchain_core.documents import Document
4
- from langchain_community.document_loaders.base import BaseLoader
5
-
6
- class JsonLoader(BaseLoader):
7
- def __init__(self, file_path: str, meta_fields:Optional[list[str]] = [],encoding: Optional[str] = "utf-8"):
8
- self.file_path = file_path
9
- self.meta_fields = meta_fields
10
- self.encoding = encoding
11
-
12
- def load(self) -> list[Document]:
13
- with open(self.file_path, "r", encoding=self.encoding) as file:
14
- data = json.load(file)
15
- _list = data if isinstance(data, list) else [data]
16
- return [
17
- Document(
18
- page_content=json.dumps(item),
19
- metadata={
20
- "source": self.file_path,
21
- **{field: item.get(field) for field in self.meta_fields if item.get(field)}
22
- }
23
- )
24
- for item in _list
25
- ]
1
+ import json
2
+ from typing import Optional
3
+ from langchain_core.documents import Document
4
+ from langchain_community.document_loaders.base import BaseLoader
5
+
6
+ class JsonLoader(BaseLoader):
7
+ def __init__(self, file_path: str, meta_fields:Optional[list[str]] = [],encoding: Optional[str] = "utf-8"):
8
+ self.file_path = file_path
9
+ self.meta_fields = meta_fields
10
+ self.encoding = encoding
11
+
12
+ def load(self) -> list[Document]:
13
+ with open(self.file_path, "r", encoding=self.encoding) as file:
14
+ data = json.load(file)
15
+ _list = data if isinstance(data, list) else [data]
16
+ return [
17
+ Document(
18
+ page_content=json.dumps(item),
19
+ metadata={
20
+ "source": self.file_path,
21
+ **{field: item.get(field) for field in self.meta_fields if item.get(field)}
22
+ }
23
+ )
24
+ for item in _list
25
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ws_bom_robot_app
3
- Version: 0.0.86
3
+ Version: 0.0.87
4
4
  Summary: A FastAPI application serving ws bom/robot/llm platform ai.
5
5
  Home-page: https://github.com/websolutespa/bom
6
6
  Author: Websolute Spa
@@ -8,40 +8,40 @@ ws_bom_robot_app/task_manager.py,sha256=N2NzinjaxsRaLu78sREG9MCanMzygtKUU_yXo-aw
8
8
  ws_bom_robot_app/util.py,sha256=t1VS6JQNOZe6aenBmjPLxJ_A3ncm7WqTZE8_gR85sQo,5022
9
9
  ws_bom_robot_app/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  ws_bom_robot_app/llm/agent_context.py,sha256=uatHJ8wcRly6h0S762BgfzDMpmcwCHwNzwo37aWjeE0,1305
11
- ws_bom_robot_app/llm/agent_description.py,sha256=yK4aVU3RNk1oP4bEneV3QPAi-208JwWk4R6qHlzqYIg,4656
12
- ws_bom_robot_app/llm/agent_handler.py,sha256=TnpfChHLWVQ-gCEHNQPW3UXiuS8AmiP8JYwRz9pqbCg,7203
13
- ws_bom_robot_app/llm/agent_lcel.py,sha256=tVa1JJOuL1CG0tXS5AwOB4gli0E2rGqSBD5oEehHvOY,2480
11
+ ws_bom_robot_app/llm/agent_description.py,sha256=5IP0qFSJvaE3zjGS7f0W1DuiegP0RHXRMBoDC5pCofA,4779
12
+ ws_bom_robot_app/llm/agent_handler.py,sha256=Y9_ESGV06p77u__gaYn_kqysmQyFYCtwddPPXHDsj-M,7753
13
+ ws_bom_robot_app/llm/agent_lcel.py,sha256=QRgGkdVXCwDXWjJj8R8qaYeLqUfpaYjtRnl3GrZCwVM,2530
14
14
  ws_bom_robot_app/llm/api.py,sha256=jMoiKiD5HNxGu6gTb5_qZ5UU8d2uJ7UVrdLseDStI6o,7634
15
- ws_bom_robot_app/llm/defaut_prompt.py,sha256=LlCd_nSMkMmHESfiiiQYfnJyB6Pp-LSs4CEKdYW4vFk,1106
15
+ ws_bom_robot_app/llm/defaut_prompt.py,sha256=D9dn8yPveu0bVwGM1wQWLYftmBs5O76o0R_caLLll8w,1121
16
16
  ws_bom_robot_app/llm/evaluator.py,sha256=tUyPX1oGZEjSiO4JixwNlgv6BI9cUHSmcAsTCpBnIn4,13322
17
- ws_bom_robot_app/llm/main.py,sha256=U_zUcL51VazXUyEicWFoNGkqwV-55s3tn52BlVPINes,5670
18
- ws_bom_robot_app/llm/nebuly_handler.py,sha256=Z4_GS-N4vQYPLnlXlwhJrwpUvf2uG53diYSOcteXGTc,7978
17
+ ws_bom_robot_app/llm/main.py,sha256=GZ6Bkb3rNl4xf2ZXGkl9bhZrIRsvi40vUIRDJ-WwRAc,5828
18
+ ws_bom_robot_app/llm/nebuly_handler.py,sha256=wFO2UG849kv5hmjM5EoOp0Jsloy-BtQjrRh4pVosnfU,8163
19
19
  ws_bom_robot_app/llm/feedbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- ws_bom_robot_app/llm/feedbacks/feedback_manager.py,sha256=WcKgzlOb8VFG7yqHoIOO_R6LAzdzE4YIRFCVOGBSgfM,2856
20
+ ws_bom_robot_app/llm/feedbacks/feedback_manager.py,sha256=vNcZLG9IKhurAk7hjBqyFgQTjnh3Cd4GnxeYsX7ZdiA,2922
21
21
  ws_bom_robot_app/llm/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  ws_bom_robot_app/llm/models/api.py,sha256=bahqx9rdP6jM9Kk9VGkqT-bhASJeuAzO_5Ir6tBxDIU,12212
23
23
  ws_bom_robot_app/llm/models/base.py,sha256=1TqxuTK3rjJEALn7lvgoen_1ba3R2brAgGx6EDTtDZo,152
24
- ws_bom_robot_app/llm/models/feedback.py,sha256=zh1jLqPRLzNlxInkCMoiJbfSu0-tiOEYHM7FhC46PkM,1692
24
+ ws_bom_robot_app/llm/models/feedback.py,sha256=pYNQGxNOBgeAAfdJLI95l7ePLBI5tVdsgnyjp5oMOQU,1722
25
25
  ws_bom_robot_app/llm/models/kb.py,sha256=oVSw6_dmNxikAHrPqcfxDXz9M0ezLIYuxpgvzfs_Now,9514
26
26
  ws_bom_robot_app/llm/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  ws_bom_robot_app/llm/providers/llm_manager.py,sha256=5XqQNRx0My-bXptCzOlsMTnjLTx3bcX9HRT3_l5IQ_A,16699
28
28
  ws_bom_robot_app/llm/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- ws_bom_robot_app/llm/tools/tool_builder.py,sha256=QTRG1c-EnH4APP10IyfZxEkqK9KitUsutXUvDRKeAhU,3224
30
- ws_bom_robot_app/llm/tools/tool_manager.py,sha256=1IgRXxdB7DU3gbIlfT_aMUWZyWuanFTAFwu3VaYKxfE,14990
31
- ws_bom_robot_app/llm/tools/utils.py,sha256=tdmOAk8l4HVzw67z3brA9yX-1WLu91paU-WmXHyz4Bg,1883
29
+ ws_bom_robot_app/llm/tools/tool_builder.py,sha256=CtZwJ94aj0YGA3yVWkyCUxNE7WgU2zWjhl_tEfEskxw,3432
30
+ ws_bom_robot_app/llm/tools/tool_manager.py,sha256=avoFERE0v9MFQ3pUBMug8eGYIXbIYl7NqkP1kjNee7s,15439
31
+ ws_bom_robot_app/llm/tools/utils.py,sha256=Ba7ScFZPVJ3ke8KLO8ik1wyR2f_zC99Bikqx0OGnKoI,1924
32
32
  ws_bom_robot_app/llm/tools/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  ws_bom_robot_app/llm/tools/models/main.py,sha256=1hICqHs-KS2heenkH7b2eH0N2GrPaaNGBrn64cl_A40,827
34
34
  ws_bom_robot_app/llm/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- ws_bom_robot_app/llm/utils/agent.py,sha256=_CY5Dji3UeAIi2iuU7ttz4fml1q8aCFgVWOv970x8Fw,1411
35
+ ws_bom_robot_app/llm/utils/agent.py,sha256=uFuSfYMfGIE2WCKGNSKL-T2SDFn-tUKvbAYbGTPIw6g,1445
36
36
  ws_bom_robot_app/llm/utils/chunker.py,sha256=zVXjRMloc3KbNEqiDcycYzy4N0Ey1g8XYeq6ftyvkyg,857
37
37
  ws_bom_robot_app/llm/utils/cleanup.py,sha256=ARLZTX4mLbkLCEnMdIWYDYEAPOjzfy1laLGkYnxZe30,3063
38
- ws_bom_robot_app/llm/utils/cms.py,sha256=XhrLQyHQ2JUOInDCCf_uvR4Jiud0YvH2FwwiiuCnnsg,6352
39
- ws_bom_robot_app/llm/utils/download.py,sha256=CrPWoCwYY6TjpDR8uHI0Do-w7WQ0PtjMcbUaRoEDUbg,7110
40
- ws_bom_robot_app/llm/utils/print.py,sha256=IsPYEWRJqu-dqlJA3F9OnnIS4rOq_EYX1Ljp3BvDnww,774
38
+ ws_bom_robot_app/llm/utils/cms.py,sha256=5TBDDlTsE4O8_bGvlqFOkkK13WFEoOvYRp_FOEXUuKY,6466
39
+ ws_bom_robot_app/llm/utils/download.py,sha256=rvc88E63UGHnFVlJJeMb05Z2FcBYIITqKnIE3ldEu6I,7293
40
+ ws_bom_robot_app/llm/utils/print.py,sha256=HK3zhZOd4cEyXZ8QcudLtTIfqqtMOERce_yTofS8NXo,803
41
41
  ws_bom_robot_app/llm/utils/secrets.py,sha256=-HtqLIDVIJrpvGC5YhPAVyLsq8P4ChVM5g3GOfdwqVk,878
42
42
  ws_bom_robot_app/llm/utils/webhooks.py,sha256=LAAZqyN6VhV13wu4X-X85TwdDgAV2rNvIwQFIIc0FJM,2114
43
43
  ws_bom_robot_app/llm/vector_store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- ws_bom_robot_app/llm/vector_store/generator.py,sha256=9_xdtCKJhmt1OP0GXDjvFERXMP7ozLZT92KuYEBDgC0,6314
44
+ ws_bom_robot_app/llm/vector_store/generator.py,sha256=W_hi_UOPaSjnEuazhUFIrMAwTvz64Du8_gpiVAxFlVc,6451
45
45
  ws_bom_robot_app/llm/vector_store/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  ws_bom_robot_app/llm/vector_store/db/base.py,sha256=iQBY-1O8uJ1_dRzmCDmhWAMBYtpims0u5RelQMvOVLo,8310
47
47
  ws_bom_robot_app/llm/vector_store/db/chroma.py,sha256=2riMQvwe2T99X_NtO9yO9lpZ0zj2Nb06l9Hb1lWJ00E,4509
@@ -61,15 +61,15 @@ ws_bom_robot_app/llm/vector_store/integration/manager.py,sha256=S5z8LK_RcsCmWvLi
61
61
  ws_bom_robot_app/llm/vector_store/integration/s3.py,sha256=_SAuPfyK7lIz7Jq1LiBavkF1lre5yqe6DGlMYnxMa4o,3317
62
62
  ws_bom_robot_app/llm/vector_store/integration/sftp.py,sha256=g6f-FKkEktx7nJahb7RKyQ4pM9wGik0_xXMDfWup-1c,2845
63
63
  ws_bom_robot_app/llm/vector_store/integration/sharepoint.py,sha256=DhBcAwgr1u-dQ_8TxeLPu7kzr_EDogCRQeBrIULtWfo,4898
64
- ws_bom_robot_app/llm/vector_store/integration/shopify.py,sha256=htYo3sVbJiO5gvuMZ8mzMa-irRqIGlN7Jxg0VkJMtYU,5388
64
+ ws_bom_robot_app/llm/vector_store/integration/shopify.py,sha256=pJzd1yBo_NWSAls88wl8FSBWXPzE-N-tOT4oxiZft2A,5531
65
65
  ws_bom_robot_app/llm/vector_store/integration/sitemap.py,sha256=FJy2wQDvML_1fR4g_6y1pck6IKQWCJ_FmBF0I4ygVzE,5160
66
66
  ws_bom_robot_app/llm/vector_store/integration/slack.py,sha256=hiE1kkg7868mbP2wVWQLmC1fK2jIE1lT7f8hVN0NqeY,2636
67
- ws_bom_robot_app/llm/vector_store/integration/thron.py,sha256=PylagYLzhSY_wMu_hR4PzAwSm4Jp6zi2aymuF0XN4Hw,4271
67
+ ws_bom_robot_app/llm/vector_store/integration/thron.py,sha256=WmVi6obKVtJeGxDcKP0rJqT0n1uZdbJfsw-FhaYXF6Y,4373
68
68
  ws_bom_robot_app/llm/vector_store/loader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  ws_bom_robot_app/llm/vector_store/loader/base.py,sha256=GjUS2oaz0LHOSal5pipBkomZtrYUNcKPSd8bzhUU5Dc,6889
70
70
  ws_bom_robot_app/llm/vector_store/loader/docling.py,sha256=IOv1A0HSIWiHWQFzI4fdApfxrKgXOqwmC3mPXlKplqQ,4012
71
- ws_bom_robot_app/llm/vector_store/loader/json_loader.py,sha256=qo9ejRZyKv_k6jnGgXnu1W5uqsMMtgqK_uvPpZQ0p74,833
72
- ws_bom_robot_app-0.0.86.dist-info/METADATA,sha256=SbiF6TLzZjAfbRdKRh9_A2yBLsHQsOLIUFpVHE0nMV0,9985
73
- ws_bom_robot_app-0.0.86.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
74
- ws_bom_robot_app-0.0.86.dist-info/top_level.txt,sha256=Yl0akyHVbynsBX_N7wx3H3ZTkcMLjYyLJs5zBMDAKcM,17
75
- ws_bom_robot_app-0.0.86.dist-info/RECORD,,
71
+ ws_bom_robot_app/llm/vector_store/loader/json_loader.py,sha256=LDppW0ZATo4_1hh-KlsAM3TLawBvwBxva_a7k5Oz1sc,858
72
+ ws_bom_robot_app-0.0.87.dist-info/METADATA,sha256=3pNNKhvD9yn8STxW00dHyEGUgedYB_bSKzK7ioNkmZ0,9985
73
+ ws_bom_robot_app-0.0.87.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
74
+ ws_bom_robot_app-0.0.87.dist-info/top_level.txt,sha256=Yl0akyHVbynsBX_N7wx3H3ZTkcMLjYyLJs5zBMDAKcM,17
75
+ ws_bom_robot_app-0.0.87.dist-info/RECORD,,