rasa-pro 3.12.34__py3-none-any.whl → 3.12.36__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 rasa-pro might be problematic. Click here for more details.

rasa/constants.py CHANGED
@@ -27,6 +27,7 @@ ENV_LOG_LEVEL_LIBRARIES = "LOG_LEVEL_LIBRARIES"
27
27
  ENV_LOG_LEVEL_MATPLOTLIB = "LOG_LEVEL_MATPLOTLIB"
28
28
  ENV_LOG_LEVEL_RABBITMQ = "LOG_LEVEL_RABBITMQ"
29
29
  ENV_LOG_LEVEL_KAFKA = "LOG_LEVEL_KAFKA"
30
+ ENV_LOG_LEVEL_PYMONGO = "LOG_LEVEL_PYMONGO"
30
31
 
31
32
  DEFAULT_SANIC_WORKERS = 1
32
33
  ENV_SANIC_WORKERS = "SANIC_WORKERS"
@@ -153,6 +153,8 @@ class VoiceOutputChannel(OutputChannel):
153
153
  async def send_start_marker(self, recipient_id: str) -> None:
154
154
  """Send a marker message before the first audio chunk."""
155
155
  # Default implementation uses the generic marker message
156
+ call_state.is_bot_speaking = True # type: ignore[attr-defined]
157
+ VoiceInputChannel._cancel_silence_timeout_watcher()
156
158
  await self.send_marker_message(recipient_id)
157
159
 
158
160
  async def send_intermediate_marker(self, recipient_id: str) -> None:
@@ -343,6 +343,10 @@ def reset_scoped_slots(
343
343
  flow_persistable_slots = current_flow.persisted_slots
344
344
 
345
345
  for step in current_flow.steps_with_calls_resolved:
346
+ # take persisted slots from called flows into consideration
347
+ # before resetting slots
348
+ if isinstance(step, CallFlowStep) and step.called_flow_reference:
349
+ flow_persistable_slots.extend(step.called_flow_reference.persisted_slots)
346
350
  if isinstance(step, CollectInformationFlowStep):
347
351
  # reset all slots scoped to the flow
348
352
  slot_name = step.collect
@@ -354,7 +358,22 @@ def reset_scoped_slots(
354
358
  # slots set by the set slots step should be reset after the flow ends
355
359
  # unless they are also used in a collect step where `reset_after_flow_ends`
356
360
  # is set to `False` or set in the `persisted_slots` list.
357
- resettable_set_slots = [
361
+ resettable_set_slots = _get_resettable_set_slots(
362
+ current_flow, not_resettable_slot_names, flow_persistable_slots
363
+ )
364
+ for name in resettable_set_slots:
365
+ _reset_slot(name, tracker)
366
+
367
+ return events
368
+
369
+
370
+ def _get_resettable_set_slots(
371
+ current_flow: Flow,
372
+ not_resettable_slot_names: set[Text],
373
+ flow_persistable_slots: List[Text],
374
+ ) -> List[Text]:
375
+ """Get list of slot names from SetSlotsFlowStep that should be reset."""
376
+ return [
358
377
  slot["key"]
359
378
  for step in current_flow.steps_with_calls_resolved
360
379
  if isinstance(step, SetSlotsFlowStep)
@@ -363,11 +382,6 @@ def reset_scoped_slots(
363
382
  and slot["key"] not in flow_persistable_slots
364
383
  ]
365
384
 
366
- for name in resettable_set_slots:
367
- _reset_slot(name, tracker)
368
-
369
- return events
370
-
371
385
 
372
386
  def advance_flows(
373
387
  tracker: DialogueStateTracker, available_actions: List[str], flows: FlowsList
@@ -72,9 +72,10 @@ class LLMJudgeConfig(BaseModel):
72
72
 
73
73
  llm_config = resolve_model_client_config(llm_config)
74
74
  llm_config, llm_extra_parameters = cls.extract_attributes(llm_config)
75
- llm_config = combine_custom_and_default_config(
76
- llm_config, cls.get_default_llm_config()
77
- )
75
+ if not llm_config:
76
+ llm_config = combine_custom_and_default_config(
77
+ llm_config, cls.get_default_llm_config()
78
+ )
78
79
  embeddings_config = resolve_model_client_config(embeddings)
79
80
  embeddings_config, embeddings_extra_parameters = cls.extract_attributes(
80
81
  embeddings_config
rasa/shared/core/slots.py CHANGED
@@ -323,8 +323,8 @@ class FloatSlot(Slot):
323
323
  mappings: List[Dict[Text, Any]],
324
324
  initial_value: Optional[float] = None,
325
325
  value_reset_delay: Optional[int] = None,
326
- max_value: float = 1.0,
327
- min_value: float = 0.0,
326
+ max_value: Optional[float] = None,
327
+ min_value: Optional[float] = None,
328
328
  influence_conversation: bool = True,
329
329
  is_builtin: bool = False,
330
330
  shared_for_coexistence: bool = False,
@@ -348,32 +348,24 @@ class FloatSlot(Slot):
348
348
  filled_by=filled_by,
349
349
  validation=validation,
350
350
  )
351
+ self.validate_min_max_range(min_value, max_value)
352
+
351
353
  self.max_value = max_value
352
354
  self.min_value = min_value
353
355
 
354
- if min_value >= max_value:
355
- raise InvalidSlotConfigError(
356
- "Float slot ('{}') created with an invalid range "
357
- "using min ({}) and max ({}) values. Make sure "
358
- "min is smaller than max."
359
- "".format(self.name, self.min_value, self.max_value)
360
- )
361
-
362
- if initial_value is not None and not (min_value <= initial_value <= max_value):
363
- rasa.shared.utils.io.raise_warning(
364
- f"Float slot ('{self.name}') created with an initial value "
365
- f"{self.value}. This value is outside of the configured min "
366
- f"({self.min_value}) and max ({self.max_value}) values."
367
- )
368
-
369
356
  def _as_feature(self) -> List[float]:
357
+ # set default min and max values used in prior releases
358
+ # to prevent regressions for existing models
359
+ min_value = self.min_value or 0.0
360
+ max_value = self.max_value or 1.0
361
+
370
362
  try:
371
- capped_value = max(self.min_value, min(self.max_value, float(self.value)))
372
- if abs(self.max_value - self.min_value) > 0:
373
- covered_range = abs(self.max_value - self.min_value)
363
+ capped_value = max(min_value, min(max_value, float(self.value)))
364
+ if abs(max_value - min_value) > 0:
365
+ covered_range = abs(max_value - min_value)
374
366
  else:
375
367
  covered_range = 1
376
- return [1.0, (capped_value - self.min_value) / covered_range]
368
+ return [1.0, (capped_value - min_value) / covered_range]
377
369
  except (TypeError, ValueError):
378
370
  return [0.0, 0.0]
379
371
 
@@ -392,13 +384,52 @@ class FloatSlot(Slot):
392
384
  return value
393
385
 
394
386
  def is_valid_value(self, value: Any) -> bool:
395
- """Checks if the slot contains the value."""
396
- # check that coerced type is float
397
- return value is None or isinstance(self.coerce_value(value), float)
387
+ """Checks if the slot value is valid."""
388
+ if value is None:
389
+ return True
390
+
391
+ if not isinstance(self.coerce_value(value), float):
392
+ return False
393
+
394
+ if (
395
+ self.min_value is not None
396
+ and self.max_value is not None
397
+ and not (self.min_value <= value <= self.max_value)
398
+ ):
399
+ return False
400
+
401
+ return True
398
402
 
399
403
  def _feature_dimensionality(self) -> int:
400
404
  return len(self.as_feature())
401
405
 
406
+ def validate_min_max_range(
407
+ self, min_value: Optional[float], max_value: Optional[float]
408
+ ) -> None:
409
+ """Validates the min-max range for the slot.
410
+
411
+ Raises:
412
+ InvalidSlotConfigError, if the min-max range is invalid.
413
+ """
414
+ if min_value is not None and max_value is not None and min_value >= max_value:
415
+ raise InvalidSlotConfigError(
416
+ f"Float slot ('{self.name}') created with an invalid range "
417
+ f"using min ({min_value}) and max ({max_value}) values. Make sure "
418
+ f"min is smaller than max."
419
+ )
420
+
421
+ if (
422
+ self.initial_value is not None
423
+ and min_value is not None
424
+ and max_value is not None
425
+ and not (min_value <= self.initial_value <= max_value)
426
+ ):
427
+ raise InvalidSlotConfigError(
428
+ f"Float slot ('{self.name}') created with an initial value "
429
+ f"{self.initial_value}. This value is outside of the configured min "
430
+ f"({min_value}) and max ({max_value}) values."
431
+ )
432
+
402
433
 
403
434
  class BooleanSlot(Slot):
404
435
  """A slot storing a truth value."""
rasa/utils/common.py CHANGED
@@ -35,6 +35,7 @@ from rasa.constants import (
35
35
  ENV_LOG_LEVEL_KAFKA,
36
36
  ENV_LOG_LEVEL_LIBRARIES,
37
37
  ENV_LOG_LEVEL_MATPLOTLIB,
38
+ ENV_LOG_LEVEL_PYMONGO,
38
39
  ENV_LOG_LEVEL_RABBITMQ,
39
40
  )
40
41
  from rasa.shared.constants import DEFAULT_LOG_LEVEL, ENV_LOG_LEVEL, TCP_PROTOCOL
@@ -247,6 +248,7 @@ def configure_library_logging() -> None:
247
248
  update_rabbitmq_log_level(library_log_level)
248
249
  update_presidio_log_level(library_log_level)
249
250
  update_faker_log_level(library_log_level)
251
+ update_pymongo_log_level(library_log_level)
250
252
 
251
253
 
252
254
  def update_apscheduler_log_level() -> None:
@@ -394,6 +396,13 @@ def update_faker_log_level(library_log_level: Text) -> None:
394
396
  logging.getLogger("faker").propagate = False
395
397
 
396
398
 
399
+ def update_pymongo_log_level(library_log_level: str) -> None:
400
+ """Set the log level of pymongo."""
401
+ log_level = os.environ.get(ENV_LOG_LEVEL_PYMONGO, library_log_level)
402
+ logging.getLogger("pymongo").setLevel(log_level)
403
+ logging.getLogger("pymongo").propagate = False
404
+
405
+
397
406
  def sort_list_of_dicts_by_first_key(dicts: List[Dict]) -> List[Dict]:
398
407
  """Sorts a list of dictionaries by their first key."""
399
408
  return sorted(dicts, key=lambda d: next(iter(d.keys())))
rasa/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  # this file will automatically be changed,
2
2
  # do not add anything but the version number here!
3
- __version__ = "3.12.34"
3
+ __version__ = "3.12.36"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rasa-pro
3
- Version: 3.12.34
3
+ Version: 3.12.36
4
4
  Summary: State-of-the-art open-core Conversational AI framework for Enterprises that natively leverages generative AI for effortless assistant development.
5
5
  Keywords: nlp,machine-learning,machine-learning-library,bot,bots,botkit,rasa conversational-agents,conversational-ai,chatbot,chatbot-framework,bot-framework
6
6
  Author: Rasa Technologies GmbH
@@ -60,8 +60,8 @@ Requires-Dist: jsonpatch (>=1.33,<2.0)
60
60
  Requires-Dist: jsonpickle (>=3.3.0,<3.4)
61
61
  Requires-Dist: jsonschema (>=4.22)
62
62
  Requires-Dist: keras (==2.14.0)
63
- Requires-Dist: langchain (>=0.2.17,<0.3.0)
64
- Requires-Dist: langchain-community (>=0.2.19,<0.3.0)
63
+ Requires-Dist: langchain (>=0.3.27,<0.4.0)
64
+ Requires-Dist: langchain-community (>=0.3.29,<0.4.0)
65
65
  Requires-Dist: langcodes (>=3.5.0,<4.0.0)
66
66
  Requires-Dist: litellm (>=1.69.0,<1.70.0)
67
67
  Requires-Dist: matplotlib (>=3.7,<3.8)
@@ -138,7 +138,7 @@ Requires-Dist: tensorflow_hub (>=0.13.0,<0.14.0)
138
138
  Requires-Dist: terminaltables (>=3.1.10,<3.2.0)
139
139
  Requires-Dist: tiktoken (>=0.7.0,<0.8.0)
140
140
  Requires-Dist: tqdm (>=4.66.2,<5.0.0)
141
- Requires-Dist: transformers (>=4.36.2,<4.37.0) ; extra == "transformers" or extra == "full"
141
+ Requires-Dist: transformers (>=4.38.2,<4.39.0) ; extra == "transformers" or extra == "full"
142
142
  Requires-Dist: twilio (>=8.4,<8.5)
143
143
  Requires-Dist: types-protobuf (==4.25.0.20240417)
144
144
  Requires-Dist: typing-extensions (>=4.7.1,<5.0.0)
@@ -89,7 +89,7 @@ rasa/cli/train.py,sha256=fMt-HyLB7hmYa8LqdvukMMXRqP_DrE9R_oYoW2l6AVE,9348
89
89
  rasa/cli/utils.py,sha256=kNm5aWB7w4plHgdKVT2MkhtNXuTAJ3qgqfgC8ORXNl8,16850
90
90
  rasa/cli/visualize.py,sha256=YmRAATAfxHpgE8_PknGyM-oIujwICNzVftTzz6iLNNc,1256
91
91
  rasa/cli/x.py,sha256=C7dLtYXAkD-uj7hNj7Pz5YbOupp2yRcMjQbsEVqXUJ8,6825
92
- rasa/constants.py,sha256=5OMUcJ_gjn8qglY37DeUS4g5xe2VZAiLIv8IKwIGWJ0,1364
92
+ rasa/constants.py,sha256=2a_0Cn-xiJIyZ7ze2N2N59X3CmE8MHVib6B_zIGv_OI,1408
93
93
  rasa/core/__init__.py,sha256=wTSmsFlgK0Ylvuyq20q9APwpT5xyVJYZfzhs4rrkciM,456
94
94
  rasa/core/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
95
  rasa/core/actions/action.py,sha256=gsxIFNgSKeNV2yBaqwR4_K5-cvWCKapcFTeSFo0qA2c,42667
@@ -291,7 +291,7 @@ rasa/core/channels/voice_stream/tts/tts_cache.py,sha256=K4S2d8zWX2h2ylYALp7IdqFS
291
291
  rasa/core/channels/voice_stream/tts/tts_engine.py,sha256=JMCWGHxT8QiqKoBeI6F4RX_-Q9EEqG3vUtkgOUnlt-w,1812
292
292
  rasa/core/channels/voice_stream/twilio_media_streams.py,sha256=cM09rwGpbyFD9lCfmWBjHE1XS-F4ufpSbvwJACHpVmI,9094
293
293
  rasa/core/channels/voice_stream/util.py,sha256=d0Tl0tGAnVj3SgGovsUMHx-QL44nrPI29OTYKYleH0U,1987
294
- rasa/core/channels/voice_stream/voice_channel.py,sha256=Eid_leQr2hHyE9EVTD19iQrO2cuYtPkeXI97jFDQWfk,19914
294
+ rasa/core/channels/voice_stream/voice_channel.py,sha256=sR23RYw2czPoDzM__2WfnDqHPIVkVoWesuz7OVqKylI,20046
295
295
  rasa/core/channels/webexteams.py,sha256=z_o_jnc6B7hsHpd6XorImFkF43wB4yx_kiTPKAjPSuo,4805
296
296
  rasa/core/concurrent_lock_store.py,sha256=ycd-aeJJWXIokMRimCdQFHdwuMfl512hZSUHE8oSd2c,7722
297
297
  rasa/core/constants.py,sha256=dEokmEf6XkOFA_xpuwjqwNtlZv-a5Tz5dLMRc7Vu4CU,4070
@@ -333,7 +333,7 @@ rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2,sha256
333
333
  rasa/core/policies/flow_policy.py,sha256=597G62hrLF_CAMCvu-TPRldFnjMP2XEIkhcIaPWcQAc,7489
334
334
  rasa/core/policies/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
335
335
  rasa/core/policies/flows/flow_exceptions.py,sha256=_FQuN-cerQDM1pivce9bz4zylh5UYkljvYS1gjDukHI,1527
336
- rasa/core/policies/flows/flow_executor.py,sha256=sT7ZFrm_CKVKBv5SO0M_QE984ZFw8t6trm8dMxCXbv8,25649
336
+ rasa/core/policies/flows/flow_executor.py,sha256=Nz6-udTmOZLphm-b4736r2x5dH49OURF2TA5pxCUCdE,26258
337
337
  rasa/core/policies/flows/flow_step_result.py,sha256=agjPrD6lahGSe2ViO5peBeoMdI9ngVGRSgtytgxmJmg,1360
338
338
  rasa/core/policies/intentless_policy.py,sha256=zxqlhawgqIjLCGkCzw1iOqq1iPCb8dPZFcJ-mTVrQjY,36511
339
339
  rasa/core/policies/intentless_prompt_template.jinja2,sha256=KhIL3cruMmkxhrs5oVbqgSvK6ZiN_6TQ_jXrgtEB-ZY,677
@@ -468,7 +468,7 @@ rasa/e2e_test/aggregate_test_stats_calculator.py,sha256=Ys2Zfc8OOPNN2KHtfKqRdyrW
468
468
  rasa/e2e_test/assertions.py,sha256=yATtyCRQpuBeQF-2Vhd5IYf4rQAeKlo72HAX0x9gS4M,46928
469
469
  rasa/e2e_test/assertions_schema.yml,sha256=NJ-3uuK2lHKKGn4GV3XsnNSvRRQFJznzknUSIBQZMws,3250
470
470
  rasa/e2e_test/constants.py,sha256=iQVJm2kFYj9Ex1SKSZEg2evEbg73bKQpn3Jzj1pRNQs,1496
471
- rasa/e2e_test/e2e_config.py,sha256=i3D2MfoFahSq1SVNRTyJfpSjHhD4OczSvfjqunhc5h4,9399
471
+ rasa/e2e_test/e2e_config.py,sha256=3SC2bN1XJH6xKbHpOXh-Rp1FeQPdqddEsAYGeD4iN1U,9438
472
472
  rasa/e2e_test/e2e_config_schema.yml,sha256=zQectcNvmNChdPMqO4O-CufqAF90AMBbP-Dmghaig_Q,837
473
473
  rasa/e2e_test/e2e_test_case.py,sha256=3fKan0GJOMKm-FKHjQaY9AVhI4ortQYuEsPh9GHwbio,20817
474
474
  rasa/e2e_test/e2e_test_converter.py,sha256=bcSg-hWKPGvZBip6PKPvYAcgvSUCU5uXmC9D7UTmJYY,12570
@@ -661,7 +661,7 @@ rasa/shared/core/generator.py,sha256=UAuBPu5UjUhL9djVK-PvrWZcNhRACOEgnRsTleV7eeY
661
661
  rasa/shared/core/policies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
662
662
  rasa/shared/core/policies/utils.py,sha256=rWE_-48Ovc__V7wOKCJ-2lTerVRtN3iRHV4ZvuU2b2g,3070
663
663
  rasa/shared/core/slot_mappings.py,sha256=afWxJsnAdHPzIxpHBBG1NbK4JBBWSsua3_xq87PKEZA,26663
664
- rasa/shared/core/slots.py,sha256=KOGC5dqW7yLIZZrNqoMBrqqEmaJMNbKB_0yW7d__1yM,29211
664
+ rasa/shared/core/slots.py,sha256=jxSc9L12p7wtm3wg07AO-bdxHbhR0B-lGyRhB4Lu0sE,30083
665
665
  rasa/shared/core/trackers.py,sha256=fgSBpaoVm98dQjFhfJGxaDiQN7Gg94AnT_Rk4z_UEms,45271
666
666
  rasa/shared/core/training_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
667
667
  rasa/shared/core/training_data/loading.py,sha256=RCx1uTI9iDejFI_sWg3qPzhjln7-hu78f3EDAT6K0No,2894
@@ -789,7 +789,7 @@ rasa/tracing/metric_instrument_provider.py,sha256=9J9a-a4lmBe20PuTHa_HwKX7O8kEAQ
789
789
  rasa/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
790
790
  rasa/utils/beta.py,sha256=h2xwGagMh2SnpMuqhkEAEjL7C_CyU6b1te7sbtF-lm4,3240
791
791
  rasa/utils/cli.py,sha256=L-DT4nPdVBWfc2m1COHrziLitVWJxazSreb6JLbTho4,865
792
- rasa/utils/common.py,sha256=quwvvQEvSNTs3YoezDEIsfWu42EihhvXCiesBA8g-K4,20925
792
+ rasa/utils/common.py,sha256=n7SkgvhBVPFmtS4FS7osH9R0dzTgrlzt_4wsohY5rWg,21281
793
793
  rasa/utils/converter.py,sha256=H4LHpoAK7MXMmvNZG_uSn0gbccCJvHtsA2-6Zya4u6M,1656
794
794
  rasa/utils/endpoints.py,sha256=htalZ5AXvXxNlVeTUgk3LJ-OKzt-dr5GTgRQTyC-0-0,10073
795
795
  rasa/utils/io.py,sha256=LIAdQQqUPA-V_mdpgeQzPDzA4rmsdZLyVKc8j_0Z70Y,7161
@@ -822,9 +822,9 @@ rasa/utils/train_utils.py,sha256=ClJx-6x3-h3Vt6mskacgkcCUJTMXjFPe3zAcy_DfmaU,212
822
822
  rasa/utils/url_tools.py,sha256=dZ1HGkVdWTJB7zYEdwoDIrEuyX9HE5WsxKKFVsXBLE0,1218
823
823
  rasa/utils/yaml.py,sha256=KjbZq5C94ZP7Jdsw8bYYF7HASI6K4-C_kdHfrnPLpSI,2000
824
824
  rasa/validator.py,sha256=524VlFTYK0B3iXYveVD6BDC3K0j1QfpzJ9O-TAWczmc,83166
825
- rasa/version.py,sha256=GrWXjBKaO-TkXMloPNG2sYWuTESfhlG2mLeWnhrhfJQ,118
826
- rasa_pro-3.12.34.dist-info/METADATA,sha256=PK9eyKZyZMpIISus8gptS1zf-Uwgc6Vv1QLjGTrdzYQ,10609
827
- rasa_pro-3.12.34.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
828
- rasa_pro-3.12.34.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
829
- rasa_pro-3.12.34.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
830
- rasa_pro-3.12.34.dist-info/RECORD,,
825
+ rasa/version.py,sha256=tmr_ddRnrU9GsEzLGKuphT2WjAOP2pKCv0ms_Ux3Jrw,118
826
+ rasa_pro-3.12.36.dist-info/METADATA,sha256=lKKWusnjMVx2_68FqtSPvsn2AxcMMeb7bi4XxIv5fUY,10609
827
+ rasa_pro-3.12.36.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
828
+ rasa_pro-3.12.36.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
829
+ rasa_pro-3.12.36.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
830
+ rasa_pro-3.12.36.dist-info/RECORD,,