llama-stack 0.3.1__py3-none-any.whl → 0.3.2__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.
@@ -45,8 +45,13 @@ def _enhance_item_with_access_control(item: Mapping[str, Any], current_user: Use
45
45
  enhanced["owner_principal"] = current_user.principal
46
46
  enhanced["access_attributes"] = current_user.attributes
47
47
  else:
48
- enhanced["owner_principal"] = None
49
- enhanced["access_attributes"] = None
48
+ # IMPORTANT: Use empty string and null value (not None) to match public access filter
49
+ # The public access filter in _get_public_access_conditions() expects:
50
+ # - owner_principal = '' (empty string)
51
+ # - access_attributes = null (JSON null, which serializes to the string 'null')
52
+ # Setting them to None (SQL NULL) will cause rows to be filtered out on read.
53
+ enhanced["owner_principal"] = ""
54
+ enhanced["access_attributes"] = None # Pydantic/JSON will serialize this as JSON null
50
55
  return enhanced
51
56
 
52
57
 
@@ -188,8 +193,9 @@ class AuthorizedSqlStore:
188
193
  enhanced_data["owner_principal"] = current_user.principal
189
194
  enhanced_data["access_attributes"] = current_user.attributes
190
195
  else:
191
- enhanced_data["owner_principal"] = None
192
- enhanced_data["access_attributes"] = None
196
+ # IMPORTANT: Use empty string for owner_principal to match public access filter
197
+ enhanced_data["owner_principal"] = ""
198
+ enhanced_data["access_attributes"] = None # Will serialize as JSON null
193
199
 
194
200
  await self.sql_store.update(table, enhanced_data, where)
195
201
 
@@ -245,14 +251,24 @@ class AuthorizedSqlStore:
245
251
  raise ValueError(f"Unsupported database type: {self.database_type}")
246
252
 
247
253
  def _get_public_access_conditions(self) -> list[str]:
248
- """Get the SQL conditions for public access."""
249
- # Public records are records that have no owner_principal or access_attributes
254
+ """Get the SQL conditions for public access.
255
+
256
+ Public records are those with:
257
+ - owner_principal = '' (empty string)
258
+ - access_attributes is either SQL NULL or JSON null
259
+
260
+ Note: Different databases serialize None differently:
261
+ - SQLite: None → JSON null (text = 'null')
262
+ - Postgres: None → SQL NULL (IS NULL)
263
+ """
250
264
  conditions = ["owner_principal = ''"]
251
265
  if self.database_type == StorageBackendType.SQL_POSTGRES.value:
252
- # Postgres stores JSON null as 'null'
253
- conditions.append("access_attributes::text = 'null'")
266
+ # Accept both SQL NULL and JSON null for Postgres compatibility
267
+ # This handles both old rows (SQL NULL) and new rows (JSON null)
268
+ conditions.append("(access_attributes IS NULL OR access_attributes::text = 'null')")
254
269
  elif self.database_type == StorageBackendType.SQL_SQLITE.value:
255
- conditions.append("access_attributes = 'null'")
270
+ # SQLite serializes None as JSON null
271
+ conditions.append("(access_attributes IS NULL OR access_attributes = 'null')")
256
272
  else:
257
273
  raise ValueError(f"Unsupported database type: {self.database_type}")
258
274
  return conditions
@@ -0,0 +1,149 @@
1
+ # ISC License
2
+ #
3
+ # Copyright (c) 2018-2025, Andrea Giammarchi, @WebReflection
4
+ #
5
+ # Permission to use, copy, modify, and/or distribute this software for any
6
+ # purpose with or without fee is hereby granted, provided that the above
7
+ # copyright notice and this permission notice appear in all copies.
8
+ #
9
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11
+ # AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
+ # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14
+ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
+ # PERFORMANCE OF THIS SOFTWARE.
16
+
17
+ import json as _json
18
+
19
+ class _Known:
20
+ def __init__(self):
21
+ self.key = []
22
+ self.value = []
23
+
24
+ class _String:
25
+ def __init__(self, value):
26
+ self.value = value
27
+
28
+
29
+ def _array_keys(value):
30
+ keys = []
31
+ i = 0
32
+ for _ in value:
33
+ keys.append(i)
34
+ i += 1
35
+ return keys
36
+
37
+ def _object_keys(value):
38
+ keys = []
39
+ for key in value:
40
+ keys.append(key)
41
+ return keys
42
+
43
+ def _is_array(value):
44
+ return isinstance(value, (list, tuple))
45
+
46
+ def _is_object(value):
47
+ return isinstance(value, dict)
48
+
49
+ def _is_string(value):
50
+ return isinstance(value, str)
51
+
52
+ def _index(known, input, value):
53
+ input.append(value)
54
+ index = str(len(input) - 1)
55
+ known.key.append(value)
56
+ known.value.append(index)
57
+ return index
58
+
59
+ def _loop(keys, input, known, output):
60
+ for key in keys:
61
+ value = output[key]
62
+ if isinstance(value, _String):
63
+ _ref(key, input[int(value.value)], input, known, output)
64
+
65
+ return output
66
+
67
+ def _ref(key, value, input, known, output):
68
+ if _is_array(value) and value not in known:
69
+ known.append(value)
70
+ value = _loop(_array_keys(value), input, known, value)
71
+ elif _is_object(value) and value not in known:
72
+ known.append(value)
73
+ value = _loop(_object_keys(value), input, known, value)
74
+
75
+ output[key] = value
76
+
77
+ def _relate(known, input, value):
78
+ if _is_string(value) or _is_array(value) or _is_object(value):
79
+ try:
80
+ return known.value[known.key.index(value)]
81
+ except:
82
+ return _index(known, input, value)
83
+
84
+ return value
85
+
86
+ def _transform(known, input, value):
87
+ if _is_array(value):
88
+ output = []
89
+ for val in value:
90
+ output.append(_relate(known, input, val))
91
+ return output
92
+
93
+ if _is_object(value):
94
+ obj = {}
95
+ for key in value:
96
+ obj[key] = _relate(known, input, value[key])
97
+ return obj
98
+
99
+ return value
100
+
101
+ def _wrap(value):
102
+ if _is_string(value):
103
+ return _String(value)
104
+
105
+ if _is_array(value):
106
+ i = 0
107
+ for val in value:
108
+ value[i] = _wrap(val)
109
+ i += 1
110
+
111
+ elif _is_object(value):
112
+ for key in value:
113
+ value[key] = _wrap(value[key])
114
+
115
+ return value
116
+
117
+ def parse(value, *args, **kwargs):
118
+ json = _json.loads(value, *args, **kwargs)
119
+ wrapped = []
120
+ for value in json:
121
+ wrapped.append(_wrap(value))
122
+
123
+ input = []
124
+ for value in wrapped:
125
+ if isinstance(value, _String):
126
+ input.append(value.value)
127
+ else:
128
+ input.append(value)
129
+
130
+ value = input[0]
131
+
132
+ if _is_array(value):
133
+ return _loop(_array_keys(value), input, [value], value)
134
+
135
+ if _is_object(value):
136
+ return _loop(_object_keys(value), input, [value], value)
137
+
138
+ return value
139
+
140
+
141
+ def stringify(value, *args, **kwargs):
142
+ known = _Known()
143
+ input = []
144
+ output = []
145
+ i = int(_index(known, input, value))
146
+ while i < len(input):
147
+ output.append(_transform(known, input, input[i]))
148
+ i += 1
149
+ return _json.dumps(output, *args, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llama_stack
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Llama Stack
5
5
  Author-email: Meta Llama <llama-oss@meta.com>
6
6
  License: MIT
@@ -22,7 +22,7 @@ Requires-Dist: fire
22
22
  Requires-Dist: httpx
23
23
  Requires-Dist: jinja2>=3.1.6
24
24
  Requires-Dist: jsonschema
25
- Requires-Dist: llama-stack-client>=0.3.1
25
+ Requires-Dist: llama-stack-client>=0.3.2
26
26
  Requires-Dist: openai>=1.107
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: python-dotenv
@@ -44,7 +44,7 @@ Requires-Dist: sqlalchemy[asyncio]>=2.0.41
44
44
  Provides-Extra: ui
45
45
  Requires-Dist: streamlit; extra == "ui"
46
46
  Requires-Dist: pandas; extra == "ui"
47
- Requires-Dist: llama-stack-client>=0.3.1; extra == "ui"
47
+ Requires-Dist: llama-stack-client>=0.3.2; extra == "ui"
48
48
  Requires-Dist: streamlit-option-menu; extra == "ui"
49
49
  Dynamic: license-file
50
50
 
@@ -73,7 +73,7 @@ llama_stack/cli/scripts/run.py,sha256=WPCJwVN8PN-JiMafkGjyC_Ynq4wMK74jvJ1Ie9NsoS
73
73
  llama_stack/cli/stack/__init__.py,sha256=vbPrU7bJlgRRgc__HqIJ-8uH8JcUwfnrIh1noTzRbHI,240
74
74
  llama_stack/cli/stack/_list_deps.py,sha256=jQpPU0Ds1hOExb7Nx7Iao6ocKd4I1u5gC38GdRnPSAg,6120
75
75
  llama_stack/cli/stack/list_apis.py,sha256=KEzkmo0g9pftk6e4D9HktaHQkMxN_V0Oi33tLwJoUHg,1376
76
- llama_stack/cli/stack/list_deps.py,sha256=ohFqSU01ECLPGet-Su9E5oz-o8UzluzZEGaA-JZZtKM,2002
76
+ llama_stack/cli/stack/list_deps.py,sha256=gSpvvMZ2UnmfYxwyFg4AXr_q2EGmXBtU0bcwrPMtbak,2122
77
77
  llama_stack/cli/stack/list_providers.py,sha256=-NMpsZygUUWsWNZ02rFa9XtIZCBBRIYHk6fbDl6K-kc,2471
78
78
  llama_stack/cli/stack/list_stacks.py,sha256=lkrXEmm_2a-UEdc6STaQ6V09e0i73RBYBxQ_kHvuoQU,2069
79
79
  llama_stack/cli/stack/remove.py,sha256=QXDQxNKWQ9kfBd5guJn7NdiPajOS-FXr2HFZHcLX124,3923
@@ -108,7 +108,7 @@ llama_stack/core/prompts/prompts.py,sha256=bk9XjxeTnNt3CIGmKaELkEaAMZfvu7DdAUeBq
108
108
  llama_stack/core/routers/__init__.py,sha256=ue96Y4Dh1Mxu1bWMzOX7Fra2ICvykCMkhlJgPS8sa9U,3631
109
109
  llama_stack/core/routers/datasets.py,sha256=79tYXa4cSNPzG1DCWL1I8k54HSeAW5EE_r0WtlBkTh0,2361
110
110
  llama_stack/core/routers/eval_scoring.py,sha256=N6_UyX8vL672bHDVKJ_r8bQ7wpI1JbD74h0aemqLR0o,5052
111
- llama_stack/core/routers/inference.py,sha256=vIMum0MhgWjaFMx5FE8AtOl5lARvW1bu_xd2Y5LJfng,26613
111
+ llama_stack/core/routers/inference.py,sha256=EdDWgddaRtgug6buOS6PAlMf0SYNLOGNeBs49e0vGkE,28019
112
112
  llama_stack/core/routers/safety.py,sha256=xyPbwRLxMSIrifQ8qj4GeonWiJBwmlH6Pcpc5f9-PP0,3071
113
113
  llama_stack/core/routers/tool_runtime.py,sha256=Xp_eKCz73o6eDMlY4dhZl-msbh3Z8Md8kdAfECO1438,3232
114
114
  llama_stack/core/routers/vector_io.py,sha256=nriMtO_vFKFVJZrtc1Zq9-ji7XYfnJBJOiTYegCRV08,18683
@@ -189,11 +189,13 @@ llama_stack/distributions/postgres-demo/build.yaml,sha256=yqzk2U03FQNodqE8Pt-m6O
189
189
  llama_stack/distributions/postgres-demo/postgres_demo.py,sha256=mk7Y7O11OTcLEJhG-uKlHZFfHLan-ZeRGg27il6xzR0,4499
190
190
  llama_stack/distributions/postgres-demo/run.yaml,sha256=_fR-LiyF5AHVN40CdSYFmMZbSMS5Ff12i3Za1iT2fvk,3147
191
191
  llama_stack/distributions/starter/__init__.py,sha256=AFrrFYu2i1-FTXdQBm_ppWezaJ9XcYF4riMM7IGrMpM,262
192
- llama_stack/distributions/starter/build.yaml,sha256=iH_Gh2Tgqn7yAJqgC8XNdtDi9m70G4JtZSAas_Z6-Os,1958
192
+ llama_stack/distributions/starter/build.yaml,sha256=ZQNreBELdxQz4O7wakQEIrHHuJTVAAkuUr2ltNTWMlc,1976
193
+ llama_stack/distributions/starter/run-with-postgres-store.yaml,sha256=hQlCq-C1zmNHa4P5SsQ-a0KXg9nzwKocJ_iBOQIHOnw,8436
193
194
  llama_stack/distributions/starter/run.yaml,sha256=EemWztgVBmhASbEsLHYnJyFXgMUv3f9I5VuDuYP4ttE,8089
194
- llama_stack/distributions/starter/starter.py,sha256=4ye8vAJ5pQ6rRDgfeOAG77baCH1hbhWhl16d3VUkZqc,12561
195
+ llama_stack/distributions/starter/starter.py,sha256=KIA5VrCb49eAyRoTp7U1czQaEfppfiLjBsEs6Ov8B4U,12476
195
196
  llama_stack/distributions/starter-gpu/__init__.py,sha256=bM7m807R3alATbnP9E0pD0WOtmLjL9W4spwAJPT14yg,266
196
- llama_stack/distributions/starter-gpu/build.yaml,sha256=X12qZHOvswUJVIpzeGPJ3VLxKzupFD0m_rYe56TXUIU,1963
197
+ llama_stack/distributions/starter-gpu/build.yaml,sha256=cK3CGtTIENHyNWpOHIoAQGAC9L7c-b3ad5ey1FDwpWQ,1981
198
+ llama_stack/distributions/starter-gpu/run-with-postgres-store.yaml,sha256=__VAhkf8VHt2Etx0m6bI41jZfCR4-XJE2FUxV_VORWs,8581
197
199
  llama_stack/distributions/starter-gpu/run.yaml,sha256=G4Z9bZm9SY8tReJN29ERzbNAQDBY4DhW6A4tfip_Mbk,8242
198
200
  llama_stack/distributions/starter-gpu/starter_gpu.py,sha256=N6JFtsnRGljrS-eOX_4CYty3N6S_slZ_dTpxuoOi0Es,808
199
201
  llama_stack/distributions/watsonx/__init__.py,sha256=8gljVPamf_cPWZd5Sg6asT1xmQnRb7J_fO12l17vGPs,262
@@ -553,12 +555,12 @@ llama_stack/providers/utils/datasetio/url_utils.py,sha256=Jhxw-bRs5PbkG-pCSRKqoK
553
555
  llama_stack/providers/utils/files/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
554
556
  llama_stack/providers/utils/files/form_data.py,sha256=oLDS9gsOWpUnqX51qczjNGTfHJBrZ0SFZbEHFtsfqCs,2291
555
557
  llama_stack/providers/utils/inference/__init__.py,sha256=Ocwqyn7ytwdt1vMFXsPBoa5D6uhA1fIljF-HiIsVvKw,1089
556
- llama_stack/providers/utils/inference/embedding_mixin.py,sha256=XIPnosihUzXll9ZEJdqYRAL5PCp_flVdxR4NwtxIIqM,3421
557
- llama_stack/providers/utils/inference/inference_store.py,sha256=BiGnwy85RLYIUW905IY55zPLj8hUvBRatH56rz4bnx0,9397
558
+ llama_stack/providers/utils/inference/embedding_mixin.py,sha256=Ur9A0VJB0BEDh00Er8Ua-Mc08Sa69YAQW_cCcAdxB88,3336
559
+ llama_stack/providers/utils/inference/inference_store.py,sha256=ur6sBcabh6mxTcsghEBHpn2Vm0lOYqjjGzuz50uR21M,9827
558
560
  llama_stack/providers/utils/inference/litellm_openai_mixin.py,sha256=tcRCccOd4fR61TIQjFGb-B6Qybu5q-pklK5fo87Ji3I,13094
559
561
  llama_stack/providers/utils/inference/model_registry.py,sha256=XatzxKD90h1lK2NVbLjsg_uBUSWD7gTA5xeK8QVlQr8,8308
560
562
  llama_stack/providers/utils/inference/openai_compat.py,sha256=kTjea5GUmaD8UfA6UgoPD8wvmWNBnAwuWLkmNUwy-as,49768
561
- llama_stack/providers/utils/inference/openai_mixin.py,sha256=ixm0EAZj-tUbxhQVWgYaE8sFmcfz8J9MCgLwdFkdpCk,19738
563
+ llama_stack/providers/utils/inference/openai_mixin.py,sha256=CQWqTRTm3CZqRtcoEdZ-a1tgh5PW8y5t2Ik7VNaiByo,19850
562
564
  llama_stack/providers/utils/inference/prompt_adapter.py,sha256=fSP6G79BSyO32UHUY19x7kdypNXPIZP_nOX6DW7oAQA,17890
563
565
  llama_stack/providers/utils/kvstore/__init__.py,sha256=GUuUhxrSBkRqNRORwBvoiBJfg6YDgg1cAaH4G35iY4Y,244
564
566
  llama_stack/providers/utils/kvstore/api.py,sha256=v89kXHvy4vBoK9xIjyJDJuNOS0RTWTV4U8W8VX3YxYs,707
@@ -578,14 +580,14 @@ llama_stack/providers/utils/memory/file_utils.py,sha256=1Lz7FTR4eV1OYPgD3oABRCho
578
580
  llama_stack/providers/utils/memory/openai_vector_store_mixin.py,sha256=XbmaUW7srqYbx1UZGn8h0NjCe3o9j_afeG-sdrYYaME,53335
579
581
  llama_stack/providers/utils/memory/vector_store.py,sha256=bAnoHLa68Z9Zsaufpovkwb5wlAvoyXVHRG33gvTcjls,12023
580
582
  llama_stack/providers/utils/responses/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
581
- llama_stack/providers/utils/responses/responses_store.py,sha256=xFs78KLUCgt3gfW1GNkjfeYX2dekWj_BgbsNUgW7gxg,13491
583
+ llama_stack/providers/utils/responses/responses_store.py,sha256=r1SxlhSvT4XeZm-2zqI4A17LISjI9yzWxEewAlUyEJw,10734
582
584
  llama_stack/providers/utils/scoring/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
583
585
  llama_stack/providers/utils/scoring/aggregation_utils.py,sha256=vNtkQbyEg71tWLCwibOHJyNGHqk5GBNB6uSMnlDaqJs,2775
584
586
  llama_stack/providers/utils/scoring/base_scoring_fn.py,sha256=q4KZZxU1TVBKO21bTcO5bnXu2LuzjjYzQZ492i_DfhA,4153
585
587
  llama_stack/providers/utils/scoring/basic_scoring_utils.py,sha256=JmGA65N55raHR7rmcdWdTQPaZy4X7I69KFDvfN6716A,714
586
588
  llama_stack/providers/utils/sqlstore/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
587
589
  llama_stack/providers/utils/sqlstore/api.py,sha256=qhhfUWQ1erK9Bo5ocoFOuHgRAlOwi_8uh2wuvrqBbX8,3738
588
- llama_stack/providers/utils/sqlstore/authorized_sqlstore.py,sha256=SvirpRdkw1oEOiPg6PoeyIMa7cjy6AL9RajgFTW771A,13132
590
+ llama_stack/providers/utils/sqlstore/authorized_sqlstore.py,sha256=GJ8T-wg_tkc2tITC6ne0X0Kfqc0pHbs9dDcHNMbkueE,14143
589
591
  llama_stack/providers/utils/sqlstore/sqlalchemy_sqlstore.py,sha256=v7c8Uze8ucCUn_C1v8-Fg2_7MsuYA3Ic0E8W4degfts,12098
590
592
  llama_stack/providers/utils/sqlstore/sqlstore.py,sha256=o9o4kSSYgQQ1g1zfuPNYb1_f6x_knhniHG6xwG-VgNQ,2360
591
593
  llama_stack/providers/utils/telemetry/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
@@ -614,9 +616,10 @@ llama_stack/strong_typing/slots.py,sha256=F0HLO4NBIWvaMz173l0dJX7KNmi1yvkfRvCw2a
614
616
  llama_stack/strong_typing/topological.py,sha256=I2YyhYW62PBM2wpfn6mbeCRxKGl_oa5tx4tke_YJg3k,2791
615
617
  llama_stack/testing/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
616
618
  llama_stack/testing/api_recorder.py,sha256=jt5Fq8HOPTA4rDzwIWWdBQJjxtivhbqoghFql3D--A0,38423
617
- llama_stack-0.3.1.dist-info/licenses/LICENSE,sha256=42g1gBn9gHYdBt5e6e1aFYhnc-JT9trU9qBD84oUAlY,1087
618
- llama_stack-0.3.1.dist-info/METADATA,sha256=3rJJ0TbOAZK0m4jIkyBCQEkL3NWVmXEFGRjGpyxrLVc,15124
619
- llama_stack-0.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
620
- llama_stack-0.3.1.dist-info/entry_points.txt,sha256=E5xoyAM9064aW_y96eSSwZCNT_ANctrvrhLMJnMQlw0,141
621
- llama_stack-0.3.1.dist-info/top_level.txt,sha256=2-nbQ1CAn4_w76YD_O6N6ofvjmk4DX5NFaBuApSx5N0,12
622
- llama_stack-0.3.1.dist-info/RECORD,,
619
+ llama_stack/ui/node_modules/flatted/python/flatted.py,sha256=UYburBDqkySaTfSpntPCUJRxiBGcplusJM7ECX8FEgA,3860
620
+ llama_stack-0.3.2.dist-info/licenses/LICENSE,sha256=42g1gBn9gHYdBt5e6e1aFYhnc-JT9trU9qBD84oUAlY,1087
621
+ llama_stack-0.3.2.dist-info/METADATA,sha256=LFLFZTDHA2F8GchS95FrwclHERxd0Hws-PILWn3F8B4,15124
622
+ llama_stack-0.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
623
+ llama_stack-0.3.2.dist-info/entry_points.txt,sha256=E5xoyAM9064aW_y96eSSwZCNT_ANctrvrhLMJnMQlw0,141
624
+ llama_stack-0.3.2.dist-info/top_level.txt,sha256=2-nbQ1CAn4_w76YD_O6N6ofvjmk4DX5NFaBuApSx5N0,12
625
+ llama_stack-0.3.2.dist-info/RECORD,,