alita-sdk 0.3.428.post2__py3-none-any.whl → 0.3.430__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.
@@ -212,41 +212,6 @@ def load_content_from_bytes(file_content: bytes, extension: str = None, loader_e
212
212
  if temp_file_path and os.path.exists(temp_file_path):
213
213
  os.remove(temp_file_path)
214
214
 
215
-
216
- def _load_content_from_bytes_with_prompt(file_content: bytes, extension: str = None, loader_extra_config: dict = None, llm = None, prompt: str = image_processing_prompt) -> str:
217
- """Internal helper that behaves like load_content_from_bytes but also propagates prompt.
218
-
219
- This keeps the public load_content_from_bytes API unchanged while allowing newer
220
- code paths to pass an explicit prompt through to the loader.
221
- """
222
- temp_file_path = None
223
- try:
224
- with tempfile.NamedTemporaryFile(mode='w+b', delete=False, suffix=extension or '') as temp_file:
225
- temp_file.write(file_content)
226
- temp_file.flush()
227
- temp_file_path = temp_file.name
228
-
229
- # Use prepare_loader so that prompt and other kwargs are handled consistently
230
- loader = prepare_loader(
231
- file_name=None,
232
- file_content=None,
233
- is_capture_image=loader_extra_config.get('extract_images') if loader_extra_config else False,
234
- page_number=loader_extra_config.get('page_number') if loader_extra_config else None,
235
- sheet_name=loader_extra_config.get('sheet_name') if loader_extra_config else None,
236
- llm=llm or (loader_extra_config.get('llm') if loader_extra_config else None),
237
- file_path=temp_file_path,
238
- excel_by_sheets=loader_extra_config.get('excel_by_sheets') if loader_extra_config else False,
239
- prompt=prompt or (loader_extra_config.get('prompt') if loader_extra_config else image_processing_prompt),
240
- )
241
-
242
- documents = loader.load()
243
- page_contents = [doc.page_content for doc in documents]
244
- return "\n".join(page_contents)
245
- finally:
246
- if temp_file_path and os.path.exists(temp_file_path):
247
- os.remove(temp_file_path)
248
-
249
-
250
215
  def process_document_by_type(content, extension_source: str, document: Document = None, llm = None, chunking_config=None) \
251
216
  -> Generator[Document, None, None]:
252
217
  """Process the content of a file based on its type using a configured loader cosidering the origin document."""
@@ -373,4 +338,4 @@ def file_extension_by_chunker(chunker_name: str) -> str | None:
373
338
  return ".xml"
374
339
  if name == "csv":
375
340
  return ".csv"
376
- return None
341
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.428.post2
3
+ Version: 0.3.430
4
4
  Summary: SDK for building langchain agents using resources from Alita
5
5
  Author-email: Artem Rozumenko <artyom.rozumenko@gmail.com>, Mikalai Biazruchka <mikalai_biazruchka@epam.com>, Roman Mitusov <roman_mitusov@epam.com>, Ivan Krakhmaliuk <lifedj27@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -36,14 +36,16 @@ alita_sdk/configurations/zephyr_essential.py,sha256=TiZedsBlfIDroflipvoqxjJeEWPo
36
36
  alita_sdk/runtime/__init__.py,sha256=4W0UF-nl3QF2bvET5lnah4o24CoTwSoKXhuN0YnwvEE,828
37
37
  alita_sdk/runtime/clients/__init__.py,sha256=BdehU5GBztN1Qi1Wul0cqlU46FxUfMnI6Vq2Zd_oq1M,296
38
38
  alita_sdk/runtime/clients/artifact.py,sha256=b7hVuGRROt6qUcT11uAZqzJqslzmlgW-Y6oGsiwNmjI,4029
39
- alita_sdk/runtime/clients/client.py,sha256=0g26eeBGJ37AIRgE8bpDwvJ0PkID_L3ceZ2rU1O0y9Y,46588
39
+ alita_sdk/runtime/clients/client.py,sha256=ElJdZHYLpuXLQadoHMcuhiHzs8HVUiiv5rZE7UU-iNg,45896
40
40
  alita_sdk/runtime/clients/datasource.py,sha256=HAZovoQN9jBg0_-lIlGBQzb4FJdczPhkHehAiVG3Wx0,1020
41
+ alita_sdk/runtime/clients/mcp_discovery.py,sha256=aFJ0wYQ8EAmXa9qLUusHZfQXkNec1wbgkqHdVeSFX-g,11697
42
+ alita_sdk/runtime/clients/mcp_manager.py,sha256=DRbqiO761l7UgOdv_keHbD2g0oZodtPHejpArXYZIoE,9050
41
43
  alita_sdk/runtime/clients/prompt.py,sha256=li1RG9eBwgNK_Qf0qUaZ8QNTmsncFrAL2pv3kbxZRZg,1447
42
44
  alita_sdk/runtime/clients/sandbox_client.py,sha256=kGOGfm3OAFmYeTM4bIuKbhRsOiOhF0M1q8takBe-sWY,16637
43
45
  alita_sdk/runtime/langchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
46
  alita_sdk/runtime/langchain/assistant.py,sha256=qKoEjbGuUnX-OZDHmSaK3plb1jON9unzEwAjxBT9DY8,16044
45
47
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
46
- alita_sdk/runtime/langchain/constants.py,sha256=I3dwexVp_Qq3MueRA2ClLgFDEhk4BkJhgR6m7V0gVPc,3404
48
+ alita_sdk/runtime/langchain/constants.py,sha256=oiEHg1h_IYUA5NE8O6nEF24hpxahi9BTvJWrkXjbVcU,3405
47
49
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
48
50
  alita_sdk/runtime/langchain/langraph_agent.py,sha256=CxDFfUTCG-i8koMR9PwOktvlcdUe5cyG4D8CQHrTH1E,51836
49
51
  alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
@@ -95,14 +97,16 @@ alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py,sha256=l3AdjSQnNv1
95
97
  alita_sdk/runtime/langchain/tools/bdd_parser/parser.py,sha256=1H1Nd_OH5Wx8A5YV1zUghBxo613yPptZ7fqNo8Eg48M,17289
96
98
  alita_sdk/runtime/llms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
99
  alita_sdk/runtime/llms/preloaded.py,sha256=3AaUbZK3d8fvxAQMjR3ftOoYa0SnkCOL1EvdvDCXIHE,11321
98
- alita_sdk/runtime/toolkits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
+ alita_sdk/runtime/models/mcp_models.py,sha256=1dlZShKR1dMhuqx9OEOdB3yoY9JumRCT0UkjS9bTZbo,2151
101
+ alita_sdk/runtime/toolkits/__init__.py,sha256=IenSyI2SrXSFuiWT7c8YO_mRFLVE_zNge61U4bpoyPw,631
99
102
  alita_sdk/runtime/toolkits/application.py,sha256=HHAKgwKOckxc7EQG-AV7rz4POOzQJKFRr7AGEjmLudE,2688
100
103
  alita_sdk/runtime/toolkits/artifact.py,sha256=YChNCX4QhVpaQG7Jk4TS-Wl0Aruc4slQ2K21zh9nNO0,3176
101
104
  alita_sdk/runtime/toolkits/configurations.py,sha256=kIDAlnryPQfbZyFxV-9SzN2-Vefzx06TX1BBdIIpN90,141
102
105
  alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
106
+ alita_sdk/runtime/toolkits/mcp.py,sha256=KLiNWiKH95r9OAmfleVFCe8MwYNawF_FANgNz_-Ta5k,25936
103
107
  alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
104
108
  alita_sdk/runtime/toolkits/subgraph.py,sha256=wwUK8JjPXkGzyVZ3tAukmvST6eGbqx_U11rpnmbrvtg,2105
105
- alita_sdk/runtime/toolkits/tools.py,sha256=vJGZtXAP-EMT6HXTeDzKd_BuH3fx3Ht_8Skp_BvI9O8,10168
109
+ alita_sdk/runtime/toolkits/tools.py,sha256=By1G9gPlp-ZgOriWJm3b77A3ukb3Cs-SZ8dpNs0JaZw,10490
106
110
  alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
107
111
  alita_sdk/runtime/tools/__init__.py,sha256=Fx7iHqkzA90-KfjdcUUzMUI_7kDarjuTsSpSzOW2pN0,568
108
112
  alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
@@ -117,7 +121,8 @@ alita_sdk/runtime/tools/indexer_tool.py,sha256=whSLPevB4WD6dhh2JDXEivDmTvbjiMV1M
117
121
  alita_sdk/runtime/tools/llm.py,sha256=iRG_wU4T01LRsjEMPZe5Uah7LiMqDc-vspwkMuQtltk,16136
118
122
  alita_sdk/runtime/tools/loop.py,sha256=uds0WhZvwMxDVFI6MZHrcmMle637cQfBNg682iLxoJA,8335
119
123
  alita_sdk/runtime/tools/loop_output.py,sha256=U4hO9PCQgWlXwOq6jdmCGbegtAxGAPXObSxZQ3z38uk,8069
120
- alita_sdk/runtime/tools/mcp_server_tool.py,sha256=MhLxZJ44LYrB_0GrojmkyqKoDRaqIHkEQAsg718ipog,4277
124
+ alita_sdk/runtime/tools/mcp_inspect_tool.py,sha256=EW81_XlXX5C4lxT-gHMehHcZhtbuG-8DQzo0NuDkCA4,10160
125
+ alita_sdk/runtime/tools/mcp_server_tool.py,sha256=y6y0j3JeUajNatpsLVJfP0JEknhlRcDRJ0PlJ3Ch8fA,6626
121
126
  alita_sdk/runtime/tools/pgvector_search.py,sha256=NN2BGAnq4SsDHIhUcFZ8d_dbEOM8QwB0UwpsWCYruXU,11692
122
127
  alita_sdk/runtime/tools/prompt.py,sha256=nJafb_e5aOM1Rr3qGFCR-SKziU9uCsiP2okIMs9PppM,741
123
128
  alita_sdk/runtime/tools/router.py,sha256=p7e0tX6YAWw2M2Nq0A_xqw1E2P-Xz1DaJvhUstfoZn4,1584
@@ -131,11 +136,11 @@ alita_sdk/runtime/utils/constants.py,sha256=Xntx1b_uxUzT4clwqHA_U6K8y5bBqf_4lSQw
131
136
  alita_sdk/runtime/utils/evaluate.py,sha256=iM1P8gzBLHTuSCe85_Ng_h30m52hFuGuhNXJ7kB1tgI,1872
132
137
  alita_sdk/runtime/utils/logging.py,sha256=svPyiW8ztDfhqHFITv5FBCj8UhLxz6hWcqGIY6wpJJE,3331
133
138
  alita_sdk/runtime/utils/save_dataframe.py,sha256=i-E1wp-t4wb17Zq3nA3xYwgSILjoXNizaQAA9opWvxY,1576
134
- alita_sdk/runtime/utils/streamlit.py,sha256=GQ69CsjfRMcGXcCrslL0Uoj24Cl07Jeji0rZxELaKTQ,104930
139
+ alita_sdk/runtime/utils/streamlit.py,sha256=yIb4YIGH8HRAXZtZlywjxI07Xdcb5eUt7rMA-elFTdc,107261
135
140
  alita_sdk/runtime/utils/toolkit_runtime.py,sha256=MU63Fpxj0b5_r1IUUc0Q3-PN9VwL7rUxp2MRR4tmYR8,5136
136
- alita_sdk/runtime/utils/toolkit_utils.py,sha256=I9QFqnaqfVgN26LUr6s3XlBlG6y0CoHURnCzG7XcwVs,5311
141
+ alita_sdk/runtime/utils/toolkit_utils.py,sha256=n11byeV6uLHAT7D8lPgIA0FE7tergbaRfbrwTWh5Twk,5447
137
142
  alita_sdk/runtime/utils/utils.py,sha256=PJK8A-JVIzY1IowOjGG8DIqsIiEFe65qDKvFcjJCKWA,1041
138
- alita_sdk/tools/__init__.py,sha256=wrcSP0AN6HukZHPXpObCKI58cY0lVpHyzbpq609CMhE,10726
143
+ alita_sdk/tools/__init__.py,sha256=DzhwEeQNk27oMTq1UWWuyYqjOBT-ypWR2XByxBN1bks,11232
139
144
  alita_sdk/tools/base_indexer_toolkit.py,sha256=hK1Q2dvNctZCw2K1-khlQrR1Q0JDQviZjqDUiqpnazg,27180
140
145
  alita_sdk/tools/code_indexer_toolkit.py,sha256=2VkOC8JfBDc25_jp-NWyMYqpaYRETIzTJFLrIYrfBpE,7814
141
146
  alita_sdk/tools/elitea_base.py,sha256=34fmVdYgd2YXifU5LFNjMQysr4OOIZ6AOZjq4GxLgSw,34417
@@ -213,7 +218,7 @@ alita_sdk/tools/chunkers/sematic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
213
218
  alita_sdk/tools/chunkers/sematic/base.py,sha256=bRHpCFbOy-KPe4HBGpegrvIhvOsd7sDRfmb06T8tSuU,349
214
219
  alita_sdk/tools/chunkers/sematic/json_chunker.py,sha256=wzlGeoS4qZOQA6Alcc0sn6zAxZSGVdwCLm0wHqmMODA,1038
215
220
  alita_sdk/tools/chunkers/sematic/markdown_chunker.py,sha256=HmAGKuIodnMcHl-kBwAb1NY0GKKwAskRFvGaW3m4HAM,3859
216
- alita_sdk/tools/chunkers/sematic/proposal_chunker.py,sha256=t8JjX9TH6yHXXaemiDK1E6000tlES2Kl8XfyezmlIoo,5116
221
+ alita_sdk/tools/chunkers/sematic/proposal_chunker.py,sha256=33RQfonQK_qyOQWx1EmWIihpKAghfMswgsHlKNdwMgA,5098
217
222
  alita_sdk/tools/chunkers/sematic/statistical_chunker.py,sha256=VDQcMC-ky72GqdWJiHMmcRmfJTTU5XglBF1IWg2Qews,13403
218
223
  alita_sdk/tools/cloud/__init__.py,sha256=ekqANTJAyuURqpjNTn6MmSn2q6qEKwENxEXBUFGkkck,512
219
224
  alita_sdk/tools/cloud/aws/__init__.py,sha256=dewHtDC0lS4ZtB0B98RX8I8CdHY54k13Tcwb7YdjXlQ,3132
@@ -238,10 +243,8 @@ alita_sdk/tools/custom_open_api/__init__.py,sha256=9aT5SPNPWcJC6jMZEM-3rUCXVULj_
238
243
  alita_sdk/tools/custom_open_api/api_wrapper.py,sha256=sDSFpvEqpSvXHGiBISdQQcUecfO3md-_F8hAi6p2dvg,4340
239
244
  alita_sdk/tools/elastic/__init__.py,sha256=iwnSRppRpzvJ1da2K3Glu8Uu41MhBDCYbguboLkEbW0,2818
240
245
  alita_sdk/tools/elastic/api_wrapper.py,sha256=pl8CqQxteJAGwyOhMcld-ZgtOTFwwbv42OITQVe8rM0,1948
241
- alita_sdk/tools/figma/__init__.py,sha256=IFYtZWbUevSVG50uM1iXnsTSHgnnxrNFKhck3hSZyAs,6753
242
- alita_sdk/tools/figma/api_wrapper.py,sha256=rYTXhsRLqqdYWvH0usF1bAw7oMZNyrat0D8hdgb02dw,78272
243
- alita_sdk/tools/figma/figma_client.py,sha256=SQwZIFMrDk09Hqp-kbjECpwTIJyHmXDkTAj51F6Su4s,2863
244
- alita_sdk/tools/figma/toon_tools.py,sha256=AWpdqHk3cKdVXPVLkjpwAG6HoaKWSySIsM1sXai4JnE,103563
246
+ alita_sdk/tools/figma/__init__.py,sha256=W6vIMMkZI2Lmpg6_CRRV3oadaIbVI-qTLmKUh6enqWs,4509
247
+ alita_sdk/tools/figma/api_wrapper.py,sha256=k5V2ufv9k3LL5dwjSVi2qIZdx6H0613mlXId3gQudMw,33788
245
248
  alita_sdk/tools/github/__init__.py,sha256=2rHu0zZyZGnLC5CkHgDIhe14N9yCyaEfrrt7ydH8478,5191
246
249
  alita_sdk/tools/github/api_wrapper.py,sha256=mX23Rro6xnRa35tpeWhKYcRCJx0cDTzIe32pZAKDYno,7986
247
250
  alita_sdk/tools/github/github_client.py,sha256=0YkpD6Zm4X46jMNN57ZIypo2YObtgxCGQokJAF-laFs,86597
@@ -305,7 +308,7 @@ alita_sdk/tools/postman/postman_analysis.py,sha256=ckc2BfKEop0xnmLPksVRE_Y94ixuq
305
308
  alita_sdk/tools/pptx/__init__.py,sha256=vVUrWnj7KWJgEk9oxGSsCAQ2SMSXrp_SFOdUHYQKcAo,3444
306
309
  alita_sdk/tools/pptx/pptx_wrapper.py,sha256=yyCYcTlIY976kJ4VfPo4dyxj4yeii9j9TWP6W8ZIpN8,29195
307
310
  alita_sdk/tools/qtest/__init__.py,sha256=Jf0xo5S_4clXR2TfCbJbB1sFgCbcFQRM-YYX2ltWBzo,4461
308
- alita_sdk/tools/qtest/api_wrapper.py,sha256=bpEgLFdwZ4HNdFTXdWz4VrOpO_A5X9zwDUWAwGohzMg,98362
311
+ alita_sdk/tools/qtest/api_wrapper.py,sha256=5YJPcEGUT_V_SdgiYBoPDJHTEDfCrDgzoXTdXuGoH4I,46652
309
312
  alita_sdk/tools/qtest/tool.py,sha256=kKzNPS4fUC76WQQttQ6kdVANViHEvKE8Kf174MQiNYU,562
310
313
  alita_sdk/tools/rally/__init__.py,sha256=2BPPXJxAOKgfmaxVFVvxndfK0JxOXDLkoRmzu2dUwOE,3512
311
314
  alita_sdk/tools/rally/api_wrapper.py,sha256=mouzU6g0KML4UNapdk0k6Q0pU3MpJuWnNo71n9PSEHM,11752
@@ -333,7 +336,7 @@ alita_sdk/tools/testrail/__init__.py,sha256=Xg4nVjULL_D8JpIXLYXppnwUfGF4-lguFwKH
333
336
  alita_sdk/tools/testrail/api_wrapper.py,sha256=tQcGlFJmftvs5ZiO4tsP19fCo4CrJeq_UEvQR1liVfE,39891
334
337
  alita_sdk/tools/utils/__init__.py,sha256=xB9OQgW65DftadrSpoAAitnEIbIXZKBOCji0NDe7FRM,3923
335
338
  alita_sdk/tools/utils/available_tools_decorator.py,sha256=IbrdfeQkswxUFgvvN7-dyLMZMyXLiwvX7kgi3phciCk,273
336
- alita_sdk/tools/utils/content_parser.py,sha256=ekfKXhla5PKq7enThawN0DV8wuRSrgZemHSp8Bj6_fI,17662
339
+ alita_sdk/tools/utils/content_parser.py,sha256=KqiZzsurLspxCLemf9eqYhgW266FgWP4r-xElcK8a38,15881
337
340
  alita_sdk/tools/vector_adapters/VectorStoreAdapter.py,sha256=-9ByRh8bVRraTcJPS7SE-2l3en6A4UkKGS9iAd9fa3w,19722
338
341
  alita_sdk/tools/vector_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
342
  alita_sdk/tools/xray/__init__.py,sha256=eOMWP8VamFbbJgt1xrGpGPqB9ByOTA0Cd3LCaETzGk4,4376
@@ -355,8 +358,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
355
358
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
356
359
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
357
360
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
358
- alita_sdk-0.3.428.post2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
359
- alita_sdk-0.3.428.post2.dist-info/METADATA,sha256=Xx_tavJYygMpCXsLvHUsjD_hGlIgo4N_Cm91hj8lxEQ,19077
360
- alita_sdk-0.3.428.post2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
361
- alita_sdk-0.3.428.post2.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
362
- alita_sdk-0.3.428.post2.dist-info/RECORD,,
361
+ alita_sdk-0.3.430.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
362
+ alita_sdk-0.3.430.dist-info/METADATA,sha256=FRH-k7SYr8J7tTXEOK09ofk2t2dWqUMpJgzjHVZjhmo,19071
363
+ alita_sdk-0.3.430.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
364
+ alita_sdk-0.3.430.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
365
+ alita_sdk-0.3.430.dist-info/RECORD,,
@@ -1,73 +0,0 @@
1
- import json
2
- from typing import Any, Dict, Optional
3
-
4
- import requests
5
- from FigmaPy import FigmaPy
6
- from langchain_core.tools import ToolException
7
-
8
-
9
- class AlitaFigmaPy(FigmaPy):
10
- """A thin wrapper over FigmaPy that exposes HTTP error details via ToolkitException.
11
-
12
- This class overrides ``api_request`` so that:
13
- - On 2xx responses it returns the parsed JSON body (same as the original).
14
- - On non-2xx responses it raises ``ToolkitException`` with status code and body
15
- instead of silently returning ``None``.
16
- """
17
-
18
- def api_request(self, endpoint: str, method: str = "get", payload: Optional[str] = None) -> Dict[str, Any]:
19
- method = method.lower()
20
-
21
- if payload is None:
22
- payload = ""
23
-
24
- if self.oauth2:
25
- header = {"Authorization": f"Bearer {self.api_token}"}
26
- else:
27
- header = {"X-Figma-Token": f"{self.api_token}"}
28
-
29
- header["Content-Type"] = "application/json"
30
-
31
- url = f"{self.api_uri}{endpoint}"
32
-
33
- try:
34
- if method == "head":
35
- response = requests.head(url, headers=header)
36
- elif method == "delete":
37
- response = requests.delete(url, headers=header)
38
- elif method == "get":
39
- response = requests.get(url, headers=header, data=payload)
40
- elif method == "options":
41
- response = requests.options(url, headers=header)
42
- elif method == "post":
43
- response = requests.post(url, headers=header, data=payload)
44
- elif method == "put":
45
- response = requests.put(url, headers=header, data=payload)
46
- else:
47
- raise ToolException(f"Unsupported HTTP method: {method}")
48
-
49
- # Happy path: 2xx -> return parsed JSON
50
- if 200 <= response.status_code < 300:
51
- try:
52
- return json.loads(response.text)
53
- except json.JSONDecodeError:
54
- # Fallback: return raw text wrapped in a dict
55
- return {"raw": response.text}
56
-
57
- # Error path: raise with as much context as we can
58
- try:
59
- data: Any = response.json()
60
- except ValueError:
61
- data = None
62
-
63
- message = response.text or f"HTTP {response.status_code} {response.reason}"
64
-
65
- # Build a detailed error string, since ToolException has no payload kwarg
66
- details = data or {"status": response.status_code, "message": message}
67
- raise ToolException(
68
- f"Figma API error {response.status_code}: {message}. Details: {details}"
69
- )
70
-
71
- except (requests.HTTPError, requests.exceptions.SSLError, requests.RequestException) as e:
72
- # Network / transport-level issues
73
- raise ToolException(f"Figma API request failed: {e}") from e