waldiez 0.1.13__py3-none-any.whl → 0.1.14__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 waldiez might be problematic. Click here for more details.

waldiez/_version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """Version information for Waldiez."""
2
2
 
3
- __version__ = "0.1.13"
3
+ __version__ = "0.1.14"
waldiez/cli.py CHANGED
@@ -25,6 +25,7 @@ app = typer.Typer(
25
25
  context_settings={
26
26
  "help_option_names": ["-h", "--help"],
27
27
  "allow_extra_args": True,
28
+ "ignore_unknown_options": True,
28
29
  },
29
30
  add_completion=False,
30
31
  no_args_is_help=True,
@@ -12,9 +12,10 @@ def check_conflicts() -> None: # pragma: no cover
12
12
  try:
13
13
  version("autogen-agentchat")
14
14
  print(
15
- "Conflict detected: 'autogen-agentchat' is installed, which conflicts with 'ag2'.\n"
15
+ "Conflict detected: 'autogen-agentchat' is installed, "
16
+ "which conflicts with 'ag2' / 'pyautogen'.\n"
16
17
  "Please uninstall 'autogen-agentchat': pip uninstall -y autogen-agentchat \n"
17
- "And install 'ag2' (or 'waldiez') again: pip install --force ag2"
18
+ "And install 'pyautogen' (or 'waldiez') again: pip install --force pyautogen waldiez"
18
19
  )
19
20
  sys.exit(1)
20
21
  except PackageNotFoundError:
@@ -148,8 +148,8 @@ class WaldiezGroupManagerSpeakers(WaldiezBase):
148
148
  default_factory=dict,
149
149
  title="Allowed or disallowed transitions",
150
150
  description=(
151
- "A mapping (agent.id => List[agent.ids])",
152
- "with the allowed or disallowed transitions.",
151
+ "A mapping (agent.id => List[agent.ids])"
152
+ "with the allowed or disallowed transitions."
153
153
  ),
154
154
  alias="allowedOrDisallowedTransitions",
155
155
  ),
@@ -14,7 +14,7 @@ class WaldiezBase(BaseModel):
14
14
  """
15
15
 
16
16
  model_config = ConfigDict(
17
- extra="forbid",
17
+ extra="ignore",
18
18
  # treat `skillId` as `skill_id`
19
19
  alias_generator=to_camel,
20
20
  # allow passing either `skill_id` or `skillId`
@@ -42,15 +42,27 @@ class WaldiezFlowData(WaldiezBase):
42
42
  # (they for graph connections, positions, etc.)
43
43
  nodes: Annotated[
44
44
  List[Dict[str, Any]],
45
- Field(default_factory=list),
45
+ Field(
46
+ default_factory=list,
47
+ title="Nodes",
48
+ description="The nodes of the flow",
49
+ ),
46
50
  ]
47
51
  edges: Annotated[
48
52
  List[Dict[str, Any]],
49
- Field(default_factory=list),
53
+ Field(
54
+ default_factory=list,
55
+ title="Edges",
56
+ description="The edges of the flow",
57
+ ),
50
58
  ]
51
59
  viewport: Annotated[
52
60
  Dict[str, Any],
53
- Field(default_factory=dict),
61
+ Field(
62
+ default_factory=dict,
63
+ title="Viewport",
64
+ description="The viewport of the flow",
65
+ ),
54
66
  ]
55
67
  # these are the ones we use.
56
68
  agents: Annotated[
@@ -74,13 +74,70 @@ class WaldiezModelData(WaldiezBase):
74
74
  alias="baseUrl",
75
75
  ),
76
76
  ]
77
- api_key: Annotated[Optional[str], Field(None, alias="apiKey")]
78
- api_type: Annotated[WaldiezModelAPIType, Field("other", alias="apiType")]
79
- api_version: Annotated[Optional[str], Field(None, alias="apiVersion")]
80
- temperature: Annotated[Optional[float], Field(None, alias="temperature")]
81
- top_p: Annotated[Optional[float], Field(None, alias="topP")]
82
- max_tokens: Annotated[Optional[int], Field(None, alias="maxTokens")]
77
+ api_key: Annotated[
78
+ Optional[str],
79
+ Field(
80
+ None,
81
+ alias="apiKey",
82
+ title="API Key",
83
+ description="The api key to use with the model",
84
+ ),
85
+ ]
86
+ api_type: Annotated[
87
+ WaldiezModelAPIType,
88
+ Field(
89
+ "other",
90
+ alias="apiType",
91
+ title="API Type",
92
+ description="The api type of the model",
93
+ ),
94
+ ]
95
+ api_version: Annotated[
96
+ Optional[str],
97
+ Field(
98
+ None,
99
+ alias="apiVersion",
100
+ title="API Version",
101
+ description="The api version of the model",
102
+ ),
103
+ ]
104
+ temperature: Annotated[
105
+ Optional[float],
106
+ Field(
107
+ None,
108
+ alias="temperature",
109
+ title="Temperature",
110
+ description="The temperature of the model",
111
+ ),
112
+ ]
113
+ top_p: Annotated[
114
+ Optional[float],
115
+ Field(
116
+ None,
117
+ alias="topP",
118
+ title="Top P",
119
+ description="The top p of the model",
120
+ ),
121
+ ]
122
+ max_tokens: Annotated[
123
+ Optional[int],
124
+ Field(
125
+ None,
126
+ alias="maxTokens",
127
+ title="Max Tokens",
128
+ description="The max tokens of the model",
129
+ ),
130
+ ]
83
131
  default_headers: Annotated[
84
- Dict[str, str], Field(alias="defaultHeaders", default_factory=dict)
132
+ Dict[str, str],
133
+ Field(
134
+ alias="defaultHeaders",
135
+ default_factory=dict,
136
+ title="Default Headers",
137
+ description="The default headers of the model",
138
+ ),
139
+ ]
140
+ price: Annotated[
141
+ Optional[WaldiezModelPrice],
142
+ Field(None, title="Price", description="The price of the model"),
85
143
  ]
86
- price: Annotated[Optional[WaldiezModelPrice], Field(None)]
waldiez/models/waldiez.py CHANGED
@@ -211,16 +211,17 @@ class Waldiez:
211
211
  lambda requirement: not (
212
212
  requirement.startswith("pyautogen")
213
213
  or requirement.startswith("ag2")
214
+ or requirement.startswith("autogen")
214
215
  ),
215
216
  self.flow.requirements,
216
217
  )
217
218
  requirements = set(requirements_list)
218
219
  if self.has_rag_agents:
219
- requirements.add(f"ag2[retrievechat]=={autogen_version}")
220
+ requirements.add(f"pyautogen[retrievechat]=={autogen_version}")
220
221
  else:
221
- requirements.add(f"ag2=={autogen_version}")
222
+ requirements.add(f"pyautogen=={autogen_version}")
222
223
  if self.has_multimodal_agents:
223
- requirements.add(f"ag2[lmm]=={autogen_version}")
224
+ requirements.add(f"pyautogen[lmm]=={autogen_version}")
224
225
  # ref: https://github.com/ag2ai/ag2/blob/main/setup.py
225
226
  models_with_additional_requirements = [
226
227
  "together",
@@ -234,7 +235,7 @@ class Waldiez:
234
235
  for model in self.models:
235
236
  if model.data.api_type in models_with_additional_requirements:
236
237
  requirements.add(
237
- f"ag2[{model.data.api_type}]==" f"{autogen_version}"
238
+ f"pyautogen[{model.data.api_type}]==" f"{autogen_version}"
238
239
  )
239
240
  return list(requirements)
240
241
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: waldiez
3
- Version: 0.1.13
3
+ Version: 0.1.14
4
4
  Summary: waldiez
5
5
  Project-URL: homepage, https://waldiez.github.io/waldiez/
6
6
  Project-URL: repository, https://github.com/waldiez/waldiez.git
@@ -16,26 +16,26 @@ Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Requires-Python: <3.13,>=3.10
19
- Requires-Dist: ag2==0.4.1
20
19
  Requires-Dist: jupytext
20
+ Requires-Dist: pyautogen==0.5.0
21
21
  Requires-Dist: typer<0.13,>=0.9
22
22
  Provides-Extra: ag2-extras
23
- Requires-Dist: ag2[anthropic]==0.4.1; extra == 'ag2-extras'
24
- Requires-Dist: ag2[bedrock]==0.4.1; extra == 'ag2-extras'
25
- Requires-Dist: ag2[captainagent]==0.4.1; extra == 'ag2-extras'
26
- Requires-Dist: ag2[gemini]==0.4.1; extra == 'ag2-extras'
27
- Requires-Dist: ag2[groq]==0.4.1; extra == 'ag2-extras'
28
- Requires-Dist: ag2[lmm]==0.4.1; extra == 'ag2-extras'
29
- Requires-Dist: ag2[mistral]==0.4.1; extra == 'ag2-extras'
30
- Requires-Dist: ag2[retrievechat-mongodb]==0.4.1; extra == 'ag2-extras'
31
- Requires-Dist: ag2[retrievechat-pgvector]==0.4.1; extra == 'ag2-extras'
32
- Requires-Dist: ag2[retrievechat-qdrant]==0.4.1; extra == 'ag2-extras'
33
- Requires-Dist: ag2[retrievechat]==0.4.1; extra == 'ag2-extras'
34
- Requires-Dist: ag2[together]==0.4.1; extra == 'ag2-extras'
35
- Requires-Dist: ag2[websurfer]==0.4.1; extra == 'ag2-extras'
36
23
  Requires-Dist: fastembed==0.4.2; extra == 'ag2-extras'
37
24
  Requires-Dist: pgvector>=0.3.6; extra == 'ag2-extras'
38
25
  Requires-Dist: psycopg[binary]>=3.2.3; extra == 'ag2-extras'
26
+ Requires-Dist: pyautogen[anthropic]==0.5.0; extra == 'ag2-extras'
27
+ Requires-Dist: pyautogen[bedrock]==0.5.0; extra == 'ag2-extras'
28
+ Requires-Dist: pyautogen[captainagent]==0.5.0; extra == 'ag2-extras'
29
+ Requires-Dist: pyautogen[gemini]==0.5.0; extra == 'ag2-extras'
30
+ Requires-Dist: pyautogen[groq]==0.5.0; extra == 'ag2-extras'
31
+ Requires-Dist: pyautogen[lmm]==0.5.0; extra == 'ag2-extras'
32
+ Requires-Dist: pyautogen[mistral]==0.5.0; extra == 'ag2-extras'
33
+ Requires-Dist: pyautogen[retrievechat-mongodb]==0.5.0; extra == 'ag2-extras'
34
+ Requires-Dist: pyautogen[retrievechat-pgvector]==0.5.0; extra == 'ag2-extras'
35
+ Requires-Dist: pyautogen[retrievechat-qdrant]==0.5.0; extra == 'ag2-extras'
36
+ Requires-Dist: pyautogen[retrievechat]==0.5.0; extra == 'ag2-extras'
37
+ Requires-Dist: pyautogen[together]==0.5.0; extra == 'ag2-extras'
38
+ Requires-Dist: pyautogen[websurfer]==0.5.0; extra == 'ag2-extras'
39
39
  Requires-Dist: pymongo==4.10.1; extra == 'ag2-extras'
40
40
  Requires-Dist: qdrant-client==1.12.1; extra == 'ag2-extras'
41
41
  Provides-Extra: dev
@@ -49,7 +49,7 @@ Requires-Dist: pre-commit==4.0.1; extra == 'dev'
49
49
  Requires-Dist: pydocstyle==6.3.0; extra == 'dev'
50
50
  Requires-Dist: pylint==3.3.2; extra == 'dev'
51
51
  Requires-Dist: python-dotenv==1.0.1; extra == 'dev'
52
- Requires-Dist: ruff==0.8.1; extra == 'dev'
52
+ Requires-Dist: ruff==0.8.2; extra == 'dev'
53
53
  Requires-Dist: types-pyyaml==6.0.12.20240917; extra == 'dev'
54
54
  Requires-Dist: yamllint==1.35.1; extra == 'dev'
55
55
  Provides-Extra: docs
@@ -123,7 +123,7 @@ $CONTAINER_COMMAND run \
123
123
  --rm \
124
124
  -v /path/to/a/flow.waldiez:/flow.waldiez \
125
125
  -v /path/to/an/output:/output \
126
- waldiez/waldiez --export /flow.waldiez --output /output/flow[.py|.ipynb]
126
+ waldiez/waldiez convert --file /flow.waldiez --output /output/flow[.py|.ipynb] [--force]
127
127
 
128
128
  # with selinux and/or podman, you might get permission (or file not found) errors, so you can try:
129
129
  $CONTAINER_COMMAND run \
@@ -132,7 +132,7 @@ $CONTAINER_COMMAND run \
132
132
  -v /path/to/an/output:/output \
133
133
  --userns=keep-id \
134
134
  --security-opt label=disable \
135
- waldiez/waldiez convert --file /flow.waldiez --output /output/flow[.py|.ipynb]
135
+ waldiez/waldiez convert --file /flow.waldiez --output /output/flow[.py|.ipynb] [--force]
136
136
  ```
137
137
 
138
138
  ```shell
@@ -144,6 +144,13 @@ $CONTAINER_COMMAND run \
144
144
  waldiez/waldiez run --file /flow.waldiez --output /output/output[.py]
145
145
  ```
146
146
 
147
+ ### UI
148
+
149
+ For creating-only (no exporting or running) waldiez flows, you can use the playground at <https://waldiez.github.io>.
150
+ The repo for the js library is [here](https://github.com/waldiez/react).
151
+ We are currently working on waldiez-studio to provide a visual interface for creating and running Waldiez flows (you can find more [here](https://github.com/waldiez/studio)).
152
+ Until then, you can use our [Jupyter](https://github.com/waldiez/jupyter) or the [VSCode](https://github.com/waldiez/vscode) extension to create and run Waldiez flows.
153
+
147
154
  ### As a library
148
155
 
149
156
  #### Export a flow
@@ -244,7 +251,7 @@ with WaldiezIOStream.set_default(io_stream):
244
251
 
245
252
  ## Known Conflicts
246
253
 
247
- - **autogen-agentchat**: This package conflicts with `ag2`. Ensure that `autogen-agentchat` is uninstalled before installing `waldiez`. If you have already installed `autogen-agentchat`, you can uninstall it with the following command:
254
+ - **autogen-agentchat**: This package conflicts with `ag2` / `pyautogen`. Ensure that `autogen-agentchat` is uninstalled before installing `waldiez`. If you have already installed `autogen-agentchat`, you can uninstall it with the following command:
248
255
 
249
256
  ```shell
250
257
  pip uninstall autogen-agentchat -y
@@ -253,7 +260,7 @@ with WaldiezIOStream.set_default(io_stream):
253
260
  If already installed waldiez you might need to reinstall it after uninstalling `autogen-agentchat`:
254
261
 
255
262
  ```shell
256
- pip install --force --no-cache waldiez
263
+ pip install --force --no-cache waldiez pyautogen
257
264
  ```
258
265
 
259
266
  ## License
@@ -1,8 +1,8 @@
1
1
  waldiez/__init__.py,sha256=ASGmxP3JcASIv89_tMYhYxvW0FlHK1jM0Nfb1hMN-z0,722
2
2
  waldiez/__main__.py,sha256=mUQWu4CF03Jbbscvcfb_9EFTnIMliJJJmAuWf0sRRZU,110
3
- waldiez/_version.py,sha256=N8g2SvYhwFeB_7w5OlUWgVZ5b8OUXI3arJvloUBkg9U,63
4
- waldiez/cli.py,sha256=6BefTHXqib-L_FTdYOAaUkv4DLYYpjBePdlCn2BEYi0,6307
5
- waldiez/conflict_checker.py,sha256=T5FA7hsxpuW0Byb4YyZQ3-uVxzNnoTQV199YRBKjvmE,707
3
+ waldiez/_version.py,sha256=GH_14gJJkcToI_wPH-frZ3GujMLUSIN6iAMKLTY-6xA,63
4
+ waldiez/cli.py,sha256=Ayp6Xu2HSBBFIouYh8cArjOjgXv5kbtZd_PYewcDklU,6347
5
+ waldiez/conflict_checker.py,sha256=HWDth7kF31DKdJ3VzUpx2Zz8Q4UUTnbCwWon8BYJC0E,756
6
6
  waldiez/exporter.py,sha256=iKe-l_Me8NRWsXHIdBcrOrnLT9XIyp4iYi4HLuuj2jA,9342
7
7
  waldiez/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  waldiez/runner.py,sha256=v4A4NHdSnh96TQ5Vx1vs8UrTsshc2oAwDZrEHmq4RkU,11537
@@ -41,7 +41,7 @@ waldiez/exporting/utils/object_string.py,sha256=2kdIu4in3iUV92a2KbLWwp9POhvY-fzF
41
41
  waldiez/exporting/utils/path_check.py,sha256=aO49sbk6hUHEr65UjNNUSKO5WCGnQitiT733W-kGVtI,1062
42
42
  waldiez/io/__init__.py,sha256=-w6ywIjG8ByxGtpSeRt1bjhnP4CZzpHf8WRWckjs4ng,5172
43
43
  waldiez/models/__init__.py,sha256=IMq8vzuAgmv92kHSSuZQLF38vVd31ojgOHonuHqWYj0,2888
44
- waldiez/models/waldiez.py,sha256=gNZYlXVW3ONHl9snwtRruFOCa0mX23ffUOiF104ctRQ,9351
44
+ waldiez/models/waldiez.py,sha256=yI38WEXPJa-FmRF6Try-MabWoPCeqlxq8VUt0sD-fJg,9428
45
45
  waldiez/models/agents/__init__.py,sha256=3ZyVYBHMFzZjRMIdPrBF6HLg82LPAlEubL6utL6KhfU,1856
46
46
  waldiez/models/agents/agents.py,sha256=zIqihnoBjzaQLL_P6FcVoHddcusRNYsWPIFLZD091bE,3641
47
47
  waldiez/models/agents/agent/__init__.py,sha256=inA0zV3dnwmcQlcObH_FLaZSURjFG31E_XUampJAnJU,746
@@ -58,7 +58,7 @@ waldiez/models/agents/assistant/assistant_data.py,sha256=VGdF1IZBBqBvZwe6BP2s4Li
58
58
  waldiez/models/agents/group_manager/__init__.py,sha256=To97X5vdRTcTSylWUH2hlgkNH2pdn4TRUJqvLiU5-Bk,592
59
59
  waldiez/models/agents/group_manager/group_manager.py,sha256=0Bg3rEGL414M8gIMlgg6q3et7RFgGheHbvHUcONc-qw,2687
60
60
  waldiez/models/agents/group_manager/group_manager_data.py,sha256=NHA_uRC3KxqquhW4sEoNVhT8XWpXD1W_8EYaRjzJuG8,2785
61
- waldiez/models/agents/group_manager/speakers.py,sha256=tlz15MO2veK_v895MsIa2zeOzEGamkdLg3W5Ctn8nV8,6648
61
+ waldiez/models/agents/group_manager/speakers.py,sha256=OXYEEexGeQUf9hllixJTCE3atp2-_hMmdSsEW5XCg8g,6646
62
62
  waldiez/models/agents/rag_user/__init__.py,sha256=_Ge6ekCPHGuDuebbP3unUKbWrjeN8Hx3ST68_DapE7w,678
63
63
  waldiez/models/agents/rag_user/rag_user.py,sha256=l4a_IzlNPtNb-GTx22r15XIVmHxvhuM5KbXjkUwS8JU,1558
64
64
  waldiez/models/agents/rag_user/rag_user_data.py,sha256=4WjG8UcQ8ltLAxvZgsZUUlaEqHrX3KewrVIH7UJeUYo,870
@@ -74,19 +74,19 @@ waldiez/models/chat/chat_message.py,sha256=OtA65nNm4J0N3G5EHz7ga9dKsKqzClyhsVNm7
74
74
  waldiez/models/chat/chat_nested.py,sha256=OFeytlQ1Rgt6hx9_-xe47PdNnmgztokxldEDPJuGKsc,4685
75
75
  waldiez/models/chat/chat_summary.py,sha256=fiF0X6nk5dLoZFfwKBHoytk2ArhvIpVHETyCIH7uKd4,2823
76
76
  waldiez/models/common/__init__.py,sha256=1WhzhGYYUWMuHgxjiT1UralMClutO3_5BhFtnkhp8Yk,686
77
- waldiez/models/common/base.py,sha256=aEZhUEy46HeivemX851bVcwAAovxgXNq_rtkvkniBIk,1687
77
+ waldiez/models/common/base.py,sha256=Aef91uGtbDfpUBGpY0m49L0tBHSaX23xvHDekIq-3H0,1687
78
78
  waldiez/models/common/method_utils.py,sha256=K7dNyvqHwvwuULLgn1_uK72Bfnm9d0CYHP3rYW5IgjM,5502
79
79
  waldiez/models/flow/__init__.py,sha256=oy_G58xDkZk_LZEvqmr-0MJrpYy1JRf-U-F5-bI1944,162
80
80
  waldiez/models/flow/flow.py,sha256=Zxcl0Z9qty4DDRLSCaMSPOBcUZrd6pcWcuCFf_vDGPE,9372
81
- waldiez/models/flow/flow_data.py,sha256=7dLMa0RHQSN7y8xnIqZviS9EKelCkk22ZYliNDO7qMM,2391
81
+ waldiez/models/flow/flow_data.py,sha256=m-RYaqlWjVpjyUzX9iAtXn1GOH0pFGKd2QD3e_e7yrk,2694
82
82
  waldiez/models/model/__init__.py,sha256=32Xox2Qw1jsf7ZCcoi0vMgZ5yxulLmtBrRRxq3FBAks,246
83
83
  waldiez/models/model/model.py,sha256=aG-9YAyLDYPqF-GWRTfuI7hP1Z7tfWWfj7Dhy1Y2GSc,4997
84
- waldiez/models/model/model_data.py,sha256=pDPKUbltaXWjCuDArgwTOEHw_igfk_DkxzFzdn6zo14,2599
84
+ waldiez/models/model/model_data.py,sha256=VLPb60rJeZEgVZCjjkQGiwTrKz7OddVLrXCrEuteMcc,3679
85
85
  waldiez/models/skill/__init__.py,sha256=rU88bajKOGMYoHFcE8MP0jW9H0MswbQmvz5wxS35BYE,169
86
86
  waldiez/models/skill/skill.py,sha256=fhsAI413an2_d4DBIkf7dzEuWk6rGs2t4sl97a4dj20,3473
87
87
  waldiez/models/skill/skill_data.py,sha256=RTWn8Od6w7g-nRIpsS29sqZ8sPm5dCPiK7-qXmU-KD4,815
88
- waldiez-0.1.13.dist-info/METADATA,sha256=opCfL797TnrS7AqpTvdz_YreuVRhKte5sA03NIzCrOg,9353
89
- waldiez-0.1.13.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
90
- waldiez-0.1.13.dist-info/entry_points.txt,sha256=9MQ8Y1rD19CU7UwjNPwoyTRpQsPs2QimjrtwTD0bD6k,44
91
- waldiez-0.1.13.dist-info/licenses/LICENSE,sha256=VQEHM6WMQLRu1qaGl3GWsoOknDwro-69eGo4NLIJPIM,1064
92
- waldiez-0.1.13.dist-info/RECORD,,
88
+ waldiez-0.1.14.dist-info/METADATA,sha256=_2D_zK5D9Ud4Qct2F56jSiAnuK7zi6ZqAFHLKyBGU3M,10036
89
+ waldiez-0.1.14.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
90
+ waldiez-0.1.14.dist-info/entry_points.txt,sha256=9MQ8Y1rD19CU7UwjNPwoyTRpQsPs2QimjrtwTD0bD6k,44
91
+ waldiez-0.1.14.dist-info/licenses/LICENSE,sha256=VQEHM6WMQLRu1qaGl3GWsoOknDwro-69eGo4NLIJPIM,1064
92
+ waldiez-0.1.14.dist-info/RECORD,,