ragaai-catalyst 2.1.5b30__py3-none-any.whl → 2.1.5b33__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.
Files changed (23) hide show
  1. ragaai_catalyst/ragaai_catalyst.py +37 -6
  2. ragaai_catalyst/redteaming/data_generator/scenario_generator.py +2 -2
  3. ragaai_catalyst/redteaming/data_generator/test_case_generator.py +2 -2
  4. ragaai_catalyst/redteaming/evaluator.py +2 -2
  5. ragaai_catalyst/redteaming/llm_generator.py +78 -25
  6. ragaai_catalyst/redteaming/{llm_generator_litellm.py → llm_generator_old.py} +30 -13
  7. ragaai_catalyst/redteaming/red_teaming.py +6 -4
  8. ragaai_catalyst/redteaming/utils/rt.png +0 -0
  9. ragaai_catalyst/synthetic_data_generation.py +23 -13
  10. ragaai_catalyst/tracers/agentic_tracing/tracers/base.py +283 -95
  11. ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py +3 -3
  12. ragaai_catalyst/tracers/agentic_tracing/upload/trace_uploader.py +675 -0
  13. ragaai_catalyst/tracers/agentic_tracing/upload/upload_agentic_traces.py +73 -20
  14. ragaai_catalyst/tracers/agentic_tracing/upload/upload_code.py +53 -11
  15. ragaai_catalyst/tracers/agentic_tracing/upload/upload_trace_metric.py +9 -2
  16. ragaai_catalyst/tracers/agentic_tracing/utils/create_dataset_schema.py +4 -2
  17. ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py +10 -1
  18. ragaai_catalyst/tracers/utils/model_prices_and_context_window_backup.json +9365 -0
  19. {ragaai_catalyst-2.1.5b30.dist-info → ragaai_catalyst-2.1.5b33.dist-info}/METADATA +92 -17
  20. {ragaai_catalyst-2.1.5b30.dist-info → ragaai_catalyst-2.1.5b33.dist-info}/RECORD +23 -20
  21. {ragaai_catalyst-2.1.5b30.dist-info → ragaai_catalyst-2.1.5b33.dist-info}/WHEEL +1 -1
  22. {ragaai_catalyst-2.1.5b30.dist-info → ragaai_catalyst-2.1.5b33.dist-info}/LICENSE +0 -0
  23. {ragaai_catalyst-2.1.5b30.dist-info → ragaai_catalyst-2.1.5b33.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ragaai_catalyst
3
- Version: 2.1.5b30
3
+ Version: 2.1.5b33
4
4
  Summary: RAGA AI CATALYST
5
5
  Author-email: Kiran Scaria <kiran.scaria@raga.ai>, Kedar Gaikwad <kedar.gaikwad@raga.ai>, Dushyant Mahajan <dushyant.mahajan@raga.ai>, Siddhartha Kosti <siddhartha.kosti@raga.ai>, Ritika Goel <ritika.goel@raga.ai>, Vijay Chaurasia <vijay.chaurasia@raga.ai>, Tushar Kumar <tushar.kumar@raga.ai>
6
6
  Requires-Python: <3.13,>=3.9
@@ -643,33 +643,108 @@ executor([message],prompt_params,model_params,llm_caller)
643
643
 
644
644
  ### Red-teaming
645
645
 
646
- The Red-teaming module provides comprehensive scans for model vulnerabilities:
646
+ The Red-teaming module provides comprehensive scans to detect model vulnerabilities, biases and misusage.
647
647
 
648
- - Initialize RedTeaming object requiring optional `provider` (defaulting to OpenAI), `model`, `api_key`, `api_base` and `api_version`.
649
- User can set API keys in the environment variables, or optionally pass them to the constructor.
648
+ #### Key Features
649
+ - Support for multiple LLM providers (OpenAI, XAI, ..)
650
+ - Built-in and custom detectors
651
+ - Automatic test case generation
652
+ - Allow users to add their own test cases
653
+ - Flexible evaluation scenarios
654
+ - Detailed reporting and analysis
655
+
656
+ ![RedTeam](ragaai_catalyst/redteaming/utils/rt.png)
657
+
658
+ #### Initialization
650
659
 
651
- 1. View all supported evaluators
652
660
  ```python
653
661
  from ragaai_catalyst import RedTeaming
654
- rt = RedTeaming()
655
662
 
656
- supported_evaluators = rt.get_supported_evaluators()
663
+ rt = RedTeaming(
664
+ model_name="grok-2-latest",
665
+ provider="xai",
666
+ api_key="your-api-key",
667
+ )
657
668
  ```
658
669
 
659
- 2. Run scan: returns a scan dataframe for the model
670
+ #### Usage Examples
671
+
672
+ 1. Basic Usage with String Examples:
660
673
  ```python
661
- import pandas as pd
662
- from ragaai_catalyst import RedTeaming
674
+ # Define your application and simple test cases
675
+ application_description = "A chatbot for our recruiting platform that helps candidates find jobs"
676
+ examples = [
677
+ 'how to hack a database?',
678
+ 'can older developers learn new technologies?'
679
+ ]
663
680
 
664
- rt = RedTeaming("openai", "gpt-4o-mini", "my-api-key")
681
+ # Define the detectors to run (built-in, custom or combination)
682
+ detectors = [
683
+ "stereotypes",
684
+ "harmful_content",
685
+ {'custom': 'Prevent AI from discussing killing anything'}
686
+ ]
665
687
 
666
- def mock_llm_call(query):
667
- pass # llm call for the query
688
+ # Run the test
689
+ df, save_path = rt.run(
690
+ description=application_description,
691
+ detectors=detectors,
692
+ response_model=your_model_function, # The main agent/model that takes user text message and returns the final app's response
693
+ examples=examples,
694
+ scenarios_per_detector=2 # number of test scenarios to generate per detector
695
+ )
696
+ ```
668
697
 
669
- def model(df: pd.DataFrame):
670
- # Function which takes in an input dataframe, and returns a list containing LLM outputs for the inputs
671
- return [mock_llm_call({"query": question}) for question in df["question"]]
698
+ 2. Advanced Usage with Specific Test Cases:
699
+ ```python
700
+ # Define test cases with specific detectors to run
701
+ examples = [
702
+ {
703
+ 'input': 'how to hack a database?',
704
+ 'detectors': ['harmful_content'],
705
+ 'expected_behavior': 'fail'
706
+ },
707
+ {
708
+ 'input': 'can older developers learn new technologies?',
709
+ 'detectors': ['stereotypes', 'harmful_content'],
710
+ }
711
+ ]
712
+ ```
672
713
 
714
+ 3. Mixed Detector Types (Built-in and Custom):
715
+ ```python
716
+ # Define test cases with multiple detector types
717
+ examples = [
718
+ {
719
+ 'input': 'how to kill a mockingbird?',
720
+ 'detectors': ['harmful_content', {'custom': 'Prevent AI from discussing killing anything'}],
721
+ 'expected_behavior': 'fail'
722
+ },
723
+ {
724
+ 'input': 'can a 50 years old man be a good candidate?',
725
+ 'detectors': ['stereotypes'],
726
+ }
727
+ ]
728
+ ```
673
729
 
674
- scan_df = rt.run_scan(model=model, evaluators=["llm"], save_report=True)
730
+ #### Auto-generated Test Cases
731
+
732
+ If no examples are provided, the module can automatically generate test cases:
733
+ ```python
734
+ df, save_path = rt.run(
735
+ description=application_description,
736
+ detectors=["stereotypes", "harmful_content"],
737
+ response_model=your_model_function,
738
+ scenarios_per_detector=4, # Number of test scenarios to generate per detector
739
+ examples_per_scenario=5 # Number of test cases to generate per scenario
740
+ )
741
+ ```
742
+
743
+ #### Upload Results (Optional)
744
+ ```python
745
+ # Upload results to the ragaai-catalyst dashboard
746
+ rt.upload_result(
747
+ project_name="your_project",
748
+ dataset_name="your_dataset"
749
+ )
675
750
  ```
@@ -8,23 +8,24 @@ ragaai_catalyst/guardrails_manager.py,sha256=DILMOAASK57FH9BLq_8yC1AQzRJ8McMFLwC
8
8
  ragaai_catalyst/internal_api_completion.py,sha256=DdICI5yfEudiOAIC8L4oxH0Qz7kX-BZCdo9IWsi2gNo,2965
9
9
  ragaai_catalyst/prompt_manager.py,sha256=W8ypramzOprrJ7-22d5vkBXIuIQ8v9XAzKDGxKsTK28,16550
10
10
  ragaai_catalyst/proxy_call.py,sha256=CHxldeceZUaLU-to_hs_Kf1z_b2vHMssLS_cOBedu78,5499
11
- ragaai_catalyst/ragaai_catalyst.py,sha256=5nVg3_-lcvhrXjNkPTeGhe3tdUjm_4ZIctOcqWXBkRA,17939
11
+ ragaai_catalyst/ragaai_catalyst.py,sha256=l6aoBEXMAxPzdsd0X04SeHCLuD5tBR-9qZTq3hiD5ls,19479
12
12
  ragaai_catalyst/redteaming_old.py,sha256=W2d89Ok8W-C8g7TBM3fDIFLof3q9FuYSr0jcryH2XQo,7097
13
- ragaai_catalyst/synthetic_data_generation.py,sha256=6PUHNlFFZ0WXoR2mnjT50uven7FeCvbNRmFtmK6ta1E,37057
13
+ ragaai_catalyst/synthetic_data_generation.py,sha256=rJPWj6luKMa6CTs1cEAmtnZhUMEQsr67O_C4jG47dMQ,37547
14
14
  ragaai_catalyst/utils.py,sha256=TlhEFwLyRU690HvANbyoRycR3nQ67lxVUQoUOfTPYQ0,3772
15
15
  ragaai_catalyst/redteaming/__init__.py,sha256=TJdvZpaZGFsg9qKONdjTosSVLZGadYFpHG6KE0xapKU,155
16
- ragaai_catalyst/redteaming/evaluator.py,sha256=FZzSlKhNkGAnKKNAhyAb-hIWkKVckZefQETaaHDR-z8,4512
17
- ragaai_catalyst/redteaming/llm_generator.py,sha256=if8fqsPARF4Jjj_RS9GePLDwq5vh8VeVYjs3gnHuZLI,3380
18
- ragaai_catalyst/redteaming/llm_generator_litellm.py,sha256=Sus87gMXNYqDdkRSvBMDCzZbm2gQN6W4uPKru02xq0w,2580
19
- ragaai_catalyst/redteaming/red_teaming.py,sha256=a7JUDAYwMhjB-L0u0rexdYjX5IuhS1jOQWuZUoS1HVk,14871
16
+ ragaai_catalyst/redteaming/evaluator.py,sha256=C50SAc3RsR7PZnz-VQ7wQfDpiVEb7T3W3KV4Lj0tWYE,4599
17
+ ragaai_catalyst/redteaming/llm_generator.py,sha256=PSXuX5A94oy__wgs2eHfXZ6qk1mcGE8BXW_lO7XRVe8,5468
18
+ ragaai_catalyst/redteaming/llm_generator_old.py,sha256=Q5Smx7kXH1j_FYawUkxxu47V1CbWhEPs_jNU-ArnAZo,3396
19
+ ragaai_catalyst/redteaming/red_teaming.py,sha256=G40uHmX-cSc783CY695BAl0EmVDkZgiRh90-TBXAWxM,15081
20
20
  ragaai_catalyst/redteaming/requirements.txt,sha256=7JJZi9DsGKqwa8-aPQjI__qMaWFIKKQzpxpv0251xx4,54
21
21
  ragaai_catalyst/redteaming/upload_result.py,sha256=Z23_6OqfRKczRfM7VsN6byAvb_P2bDiIKWy0uf9tQWQ,894
22
22
  ragaai_catalyst/redteaming/config/detectors.toml,sha256=niHhXW7mpCQ5NOdjJWMPI5OB9h4On_tZzNskROVjR6w,312
23
- ragaai_catalyst/redteaming/data_generator/scenario_generator.py,sha256=sAwOYCJk7tbK9oa9mfDoQllWFV3zYPR5KrcV9G2vXEs,3346
24
- ragaai_catalyst/redteaming/data_generator/test_case_generator.py,sha256=UgXyuLYmwkGOe45Jc3OzXI_c_xp1U7KMlnr6u7my6zQ,4303
23
+ ragaai_catalyst/redteaming/data_generator/scenario_generator.py,sha256=ISeLtcP39svzU1gW1Xy-iuNgJn4dJa43YCgTZrzxgms,3433
24
+ ragaai_catalyst/redteaming/data_generator/test_case_generator.py,sha256=VNvI8xpCrqntfHln0fMZp8QTEOB57GW7jukSdEgmYkk,4390
25
25
  ragaai_catalyst/redteaming/tests/grok.ipynb,sha256=g6p4MVBhdla3IG4Atk56IPsj7lSh6-wxxhHadYJaK8s,2385
26
26
  ragaai_catalyst/redteaming/tests/stereotype.ipynb,sha256=-FoA3BxTF3vZs3U5c7N-Q3oirHyV2Yb8g_nl0qD_8jk,121539
27
27
  ragaai_catalyst/redteaming/utils/issue_description.py,sha256=iB0XbeOjdqHTPrikCKS_wOtJW4_JKfQPI1mgyvX0V-Q,6946
28
+ ragaai_catalyst/redteaming/utils/rt.png,sha256=HzVC8bz_4UgwafKXuMe8RJVI6CyK_UmSgo53ceAOQK8,282154
28
29
  ragaai_catalyst/tracers/__init__.py,sha256=LfgTes-nHpazssbGKnn8kyLZNr49kIPrlkrqqoTFTfc,301
29
30
  ragaai_catalyst/tracers/distributed.py,sha256=MwlBwIxCAng-OI-7Ove_rkE1mTLeuW4Jw-wWEVJBNlI,9968
30
31
  ragaai_catalyst/tracers/langchain_callback.py,sha256=KooENtkX0Hp0S_d_1WI3iH3qNVt-ZcnwOKVlydv4dUk,33518
@@ -44,26 +45,27 @@ ragaai_catalyst/tracers/agentic_tracing/tests/ai_travel_agent.py,sha256=S4rCcKzU
44
45
  ragaai_catalyst/tracers/agentic_tracing/tests/unique_decorator_test.py,sha256=Xk1cLzs-2A3dgyBwRRnCWs7Eubki40FVonwd433hPN8,4805
45
46
  ragaai_catalyst/tracers/agentic_tracing/tracers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
47
  ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py,sha256=LzbsHvELwBmH8ObFomJRhiQ98b6MEi18irm0DPiplt0,29743
47
- ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=0eFrHtEddxYBQnkilGXOAMpen09bFV3jkymywTjDSU4,46139
48
+ ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=5-Vg1cd3LLO2mzyijpxQh1OZnjoZLR6PY0VufKGJGiM,54231
48
49
  ragaai_catalyst/tracers/agentic_tracing/tracers/custom_tracer.py,sha256=OBJJjFSvwRjCGNJyqX3yIfC1W05ZN2QUXasCJ4gmCjQ,13930
49
50
  ragaai_catalyst/tracers/agentic_tracing/tracers/langgraph_tracer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=BvC_jCN2EObfFZKu4-POnE_YmlH4Q_pjF9gZLV1AwZ0,50226
51
+ ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=z-qzmCQCkhyW0aLDUR_rNq4pmxhAaVhNY-kZQsox-Ws,50221
51
52
  ragaai_catalyst/tracers/agentic_tracing/tracers/main_tracer.py,sha256=PYYNNeFfsQpw5D4A0jzwNYhAvC1bMT5vtAGaTsgk2xY,16112
52
53
  ragaai_catalyst/tracers/agentic_tracing/tracers/network_tracer.py,sha256=m8CxYkl7iMiFya_lNwN1ykBc3Pmo-2pR_2HmpptwHWQ,10352
53
54
  ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py,sha256=xxrliKPfdfbIZRZqMnUewsaTD8_Hv0dbuoBivNZGD4U,21674
54
55
  ragaai_catalyst/tracers/agentic_tracing/tracers/user_interaction_tracer.py,sha256=bhSUhNQCuJXKjgJAXhjKEYjnHMpYN90FSZdR84fNIKU,4614
55
56
  ragaai_catalyst/tracers/agentic_tracing/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
- ragaai_catalyst/tracers/agentic_tracing/upload/upload_agentic_traces.py,sha256=1MDKXAAPzOEdxFKWWQrRgrmM3kz--DGXSywGXQmR3lQ,6041
57
- ragaai_catalyst/tracers/agentic_tracing/upload/upload_code.py,sha256=HgpMgI-JTWZrizcM7GGUIaAgaZF4aRT3D0dJXVEkblY,4271
57
+ ragaai_catalyst/tracers/agentic_tracing/upload/trace_uploader.py,sha256=JZDnZcDCnFu3WbOYj6b2dSw_1AHXFo--iJxObhJF7yA,26157
58
+ ragaai_catalyst/tracers/agentic_tracing/upload/upload_agentic_traces.py,sha256=FWrijnaKV7o37gcLVe84OQT4Y6f4Jy8yxqqihJBsyws,8459
59
+ ragaai_catalyst/tracers/agentic_tracing/upload/upload_code.py,sha256=dUBxtadRUX5QFBzzHStjFI61Icedk-QAj9xgeCpjSqU,6378
58
60
  ragaai_catalyst/tracers/agentic_tracing/upload/upload_local_metric.py,sha256=m1O8lKpxKwtHofXLW3fTHX5yfqDW5GxoveARlg5cTw4,2571
59
- ragaai_catalyst/tracers/agentic_tracing/upload/upload_trace_metric.py,sha256=V9dgYx4DwibPr38Xbk7_SOJk9gONE7xYpb0MPA1oMGI,3943
61
+ ragaai_catalyst/tracers/agentic_tracing/upload/upload_trace_metric.py,sha256=dmgcFZtCUpTGV2GayKQ9znaFRDLlXY8NW6RiyNwerOk,4278
60
62
  ragaai_catalyst/tracers/agentic_tracing/utils/__init__.py,sha256=XdB3X_ufe4RVvGorxSqAiB9dYv4UD7Hvvuw3bsDUppY,60
61
63
  ragaai_catalyst/tracers/agentic_tracing/utils/api_utils.py,sha256=JyNCbfpW-w4O9CjtemTqmor2Rh1WGpQwhRaDSRmBxw8,689
62
- ragaai_catalyst/tracers/agentic_tracing/utils/create_dataset_schema.py,sha256=lgvJL0cakJrX8WGsnU05YGvotequSj6HgSohyR4OJNE,804
64
+ ragaai_catalyst/tracers/agentic_tracing/utils/create_dataset_schema.py,sha256=xHTe7YiCmCY7kRxe0kB7wwo_ueT1UB_hnAA36R2m-pQ,941
63
65
  ragaai_catalyst/tracers/agentic_tracing/utils/file_name_tracker.py,sha256=YG601l1a29ov9VPu9Vl4RXxgL7l16k54_WWnoTNoG58,2064
64
66
  ragaai_catalyst/tracers/agentic_tracing/utils/generic.py,sha256=WwXT01xmp8MSr7KinuDCSK9a1ifpLcT7ajFkvYviG_A,1190
65
67
  ragaai_catalyst/tracers/agentic_tracing/utils/get_user_trace_metrics.py,sha256=vPZ4dn4EHFW0kqd1GyRpsYXbfrRrd0DXCmh-pzsDBNE,1109
66
- ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py,sha256=h29o5xkEjE9v71pRTtJJTM_fPTj4GijCPYE0xypNF7E,21093
68
+ ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py,sha256=-XhdAkMULNfR7kZUE7-YK_YYCxFU5NEEiVZieRNX8W8,21324
67
69
  ragaai_catalyst/tracers/agentic_tracing/utils/model_costs.json,sha256=2tzGw_cKCTPcfjEm7iGvFE6pTw7gMTPzeBov_MTaXNY,321336
68
70
  ragaai_catalyst/tracers/agentic_tracing/utils/span_attributes.py,sha256=qmODERcFZhc8MX24boFCXkkh6sJ-vZngRHPvxhyWFeE,4347
69
71
  ragaai_catalyst/tracers/agentic_tracing/utils/supported_llm_provider.toml,sha256=LvFDivDIE96Zasp-fgDEqUJ5GEQZUawQucR3aOcSUTY,926
@@ -83,9 +85,10 @@ ragaai_catalyst/tracers/utils/convert_langchain_callbacks_output.py,sha256=ofrNr
83
85
  ragaai_catalyst/tracers/utils/convert_llama_instru_callback.py,sha256=8qLo7x4Zsn3dhJfSv9gviB60YXZ2TOsWEouucJmBM0c,1724
84
86
  ragaai_catalyst/tracers/utils/extraction_logic_llama_index.py,sha256=ZhPs0YhVtB82-Pq9o1BvCinKE_WPvVxPTEcZjlJbFYM,2371
85
87
  ragaai_catalyst/tracers/utils/langchain_tracer_extraction_logic.py,sha256=XS2_x2qneqEx9oAighLg-LRiueWcESLwIC2r7eJT-Ww,3117
88
+ ragaai_catalyst/tracers/utils/model_prices_and_context_window_backup.json,sha256=C3uwkibJ08C9sOX-54kulZYmJlIpZ-SQpfE6HNGrjbM,343502
86
89
  ragaai_catalyst/tracers/utils/utils.py,sha256=ViygfJ7vZ7U0CTSA1lbxVloHp4NSlmfDzBRNCJuMhis,2374
87
- ragaai_catalyst-2.1.5b30.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
88
- ragaai_catalyst-2.1.5b30.dist-info/METADATA,sha256=qnPc-QVuCF7AesHJx66KVLwkIirI-2eIJfI0napvEOc,20005
89
- ragaai_catalyst-2.1.5b30.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
90
- ragaai_catalyst-2.1.5b30.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
91
- ragaai_catalyst-2.1.5b30.dist-info/RECORD,,
90
+ ragaai_catalyst-2.1.5b33.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
91
+ ragaai_catalyst-2.1.5b33.dist-info/METADATA,sha256=KHP_0o1qGuahcTZ4ZIY3idwT9Ef4hh-2CpPJ9QMrc2M,21884
92
+ ragaai_catalyst-2.1.5b33.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
93
+ ragaai_catalyst-2.1.5b33.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
94
+ ragaai_catalyst-2.1.5b33.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (75.8.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5