sarvamai 0.1.8rc2__py3-none-any.whl → 0.1.8rc4__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.
sarvamai/__init__.py CHANGED
@@ -154,6 +154,7 @@ from .speech_to_text_translate_streaming import (
154
154
  SpeechToTextTranslateStreamingModel,
155
155
  SpeechToTextTranslateStreamingVadSignals,
156
156
  )
157
+ from .text_to_speech_streaming import TextToSpeechStreamingModel
157
158
  from .version import __version__
158
159
 
159
160
  __all__ = [
@@ -273,6 +274,7 @@ __all__ = [
273
274
  "TextToSpeechResponse",
274
275
  "TextToSpeechResponseParams",
275
276
  "TextToSpeechSpeaker",
277
+ "TextToSpeechStreamingModel",
276
278
  "TimestampsModel",
277
279
  "TimestampsModelParams",
278
280
  "TooManyRequestsError",
@@ -17,10 +17,10 @@ class BaseClientWrapper:
17
17
 
18
18
  def get_headers(self) -> typing.Dict[str, str]:
19
19
  headers: typing.Dict[str, str] = {
20
- "User-Agent": "sarvamai/0.1.8rc2",
20
+ "User-Agent": "sarvamai/0.1.8rc4",
21
21
  "X-Fern-Language": "Python",
22
22
  "X-Fern-SDK-Name": "sarvamai",
23
- "X-Fern-SDK-Version": "0.1.8rc2",
23
+ "X-Fern-SDK-Version": "0.1.8rc4",
24
24
  }
25
25
  headers["api-subscription-key"] = self.api_subscription_key
26
26
  return headers
@@ -2,3 +2,6 @@
2
2
 
3
3
  # isort: skip_file
4
4
 
5
+ from .types import TextToSpeechStreamingModel
6
+
7
+ __all__ = ["TextToSpeechStreamingModel"]
@@ -3,6 +3,7 @@
3
3
  import typing
4
4
  from contextlib import asynccontextmanager, contextmanager
5
5
 
6
+ import httpx
6
7
  import websockets
7
8
  import websockets.sync.client as websockets_sync_client
8
9
  from ..core.api_error import ApiError
@@ -10,6 +11,7 @@ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
10
11
  from ..core.request_options import RequestOptions
11
12
  from .raw_client import AsyncRawTextToSpeechStreamingClient, RawTextToSpeechStreamingClient
12
13
  from .socket_client import AsyncTextToSpeechStreamingSocketClient, TextToSpeechStreamingSocketClient
14
+ from .types.text_to_speech_streaming_model import TextToSpeechStreamingModel
13
15
 
14
16
 
15
17
  class TextToSpeechStreamingClient:
@@ -31,6 +33,7 @@ class TextToSpeechStreamingClient:
31
33
  def connect(
32
34
  self,
33
35
  *,
36
+ model: typing.Optional[TextToSpeechStreamingModel] = None,
34
37
  api_subscription_key: typing.Optional[str] = None,
35
38
  request_options: typing.Optional[RequestOptions] = None,
36
39
  ) -> typing.Iterator[TextToSpeechStreamingSocketClient]:
@@ -40,6 +43,9 @@ class TextToSpeechStreamingClient:
40
43
 
41
44
  Parameters
42
45
  ----------
46
+ model : typing.Optional[TextToSpeechStreamingModel]
47
+ Text to speech model to use
48
+
43
49
  api_subscription_key : typing.Optional[str]
44
50
  API subscription key for authentication
45
51
 
@@ -51,6 +57,10 @@ class TextToSpeechStreamingClient:
51
57
  TextToSpeechStreamingSocketClient
52
58
  """
53
59
  ws_url = self._raw_client._client_wrapper.get_environment().production + "/text-to-speech/ws"
60
+ query_params = httpx.QueryParams()
61
+ if model is not None:
62
+ query_params = query_params.add("model", model)
63
+ ws_url = ws_url + f"?{query_params}"
54
64
  headers = self._raw_client._client_wrapper.get_headers()
55
65
  if api_subscription_key is not None:
56
66
  headers["Api-Subscription-Key"] = str(api_subscription_key)
@@ -93,6 +103,7 @@ class AsyncTextToSpeechStreamingClient:
93
103
  async def connect(
94
104
  self,
95
105
  *,
106
+ model: typing.Optional[TextToSpeechStreamingModel] = None,
96
107
  api_subscription_key: typing.Optional[str] = None,
97
108
  request_options: typing.Optional[RequestOptions] = None,
98
109
  ) -> typing.AsyncIterator[AsyncTextToSpeechStreamingSocketClient]:
@@ -102,6 +113,9 @@ class AsyncTextToSpeechStreamingClient:
102
113
 
103
114
  Parameters
104
115
  ----------
116
+ model : typing.Optional[TextToSpeechStreamingModel]
117
+ Text to speech model to use
118
+
105
119
  api_subscription_key : typing.Optional[str]
106
120
  API subscription key for authentication
107
121
 
@@ -113,6 +127,10 @@ class AsyncTextToSpeechStreamingClient:
113
127
  AsyncTextToSpeechStreamingSocketClient
114
128
  """
115
129
  ws_url = self._raw_client._client_wrapper.get_environment().production + "/text-to-speech/ws"
130
+ query_params = httpx.QueryParams()
131
+ if model is not None:
132
+ query_params = query_params.add("model", model)
133
+ ws_url = ws_url + f"?{query_params}"
116
134
  headers = self._raw_client._client_wrapper.get_headers()
117
135
  if api_subscription_key is not None:
118
136
  headers["Api-Subscription-Key"] = str(api_subscription_key)
@@ -3,12 +3,14 @@
3
3
  import typing
4
4
  from contextlib import asynccontextmanager, contextmanager
5
5
 
6
+ import httpx
6
7
  import websockets
7
8
  import websockets.sync.client as websockets_sync_client
8
9
  from ..core.api_error import ApiError
9
10
  from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
10
11
  from ..core.request_options import RequestOptions
11
12
  from .socket_client import AsyncTextToSpeechStreamingSocketClient, TextToSpeechStreamingSocketClient
13
+ from .types.text_to_speech_streaming_model import TextToSpeechStreamingModel
12
14
 
13
15
 
14
16
  class RawTextToSpeechStreamingClient:
@@ -19,6 +21,7 @@ class RawTextToSpeechStreamingClient:
19
21
  def connect(
20
22
  self,
21
23
  *,
24
+ model: typing.Optional[TextToSpeechStreamingModel] = None,
22
25
  api_subscription_key: typing.Optional[str] = None,
23
26
  request_options: typing.Optional[RequestOptions] = None,
24
27
  ) -> typing.Iterator[TextToSpeechStreamingSocketClient]:
@@ -28,6 +31,9 @@ class RawTextToSpeechStreamingClient:
28
31
 
29
32
  Parameters
30
33
  ----------
34
+ model : typing.Optional[TextToSpeechStreamingModel]
35
+ Text to speech model to use
36
+
31
37
  api_subscription_key : typing.Optional[str]
32
38
  API subscription key for authentication
33
39
 
@@ -39,6 +45,10 @@ class RawTextToSpeechStreamingClient:
39
45
  TextToSpeechStreamingSocketClient
40
46
  """
41
47
  ws_url = self._client_wrapper.get_environment().production + "/text-to-speech/ws"
48
+ query_params = httpx.QueryParams()
49
+ if model is not None:
50
+ query_params = query_params.add("model", model)
51
+ ws_url = ws_url + f"?{query_params}"
42
52
  headers = self._client_wrapper.get_headers()
43
53
  if api_subscription_key is not None:
44
54
  headers["Api-Subscription-Key"] = str(api_subscription_key)
@@ -70,6 +80,7 @@ class AsyncRawTextToSpeechStreamingClient:
70
80
  async def connect(
71
81
  self,
72
82
  *,
83
+ model: typing.Optional[TextToSpeechStreamingModel] = None,
73
84
  api_subscription_key: typing.Optional[str] = None,
74
85
  request_options: typing.Optional[RequestOptions] = None,
75
86
  ) -> typing.AsyncIterator[AsyncTextToSpeechStreamingSocketClient]:
@@ -79,6 +90,9 @@ class AsyncRawTextToSpeechStreamingClient:
79
90
 
80
91
  Parameters
81
92
  ----------
93
+ model : typing.Optional[TextToSpeechStreamingModel]
94
+ Text to speech model to use
95
+
82
96
  api_subscription_key : typing.Optional[str]
83
97
  API subscription key for authentication
84
98
 
@@ -90,6 +104,10 @@ class AsyncRawTextToSpeechStreamingClient:
90
104
  AsyncTextToSpeechStreamingSocketClient
91
105
  """
92
106
  ws_url = self._client_wrapper.get_environment().production + "/text-to-speech/ws"
107
+ query_params = httpx.QueryParams()
108
+ if model is not None:
109
+ query_params = query_params.add("model", model)
110
+ ws_url = ws_url + f"?{query_params}"
93
111
  headers = self._client_wrapper.get_headers()
94
112
  if api_subscription_key is not None:
95
113
  headers["Api-Subscription-Key"] = str(api_subscription_key)
@@ -11,8 +11,10 @@ from ..types.audio_output import AudioOutput
11
11
  from ..types.close_connection import CloseConnection
12
12
  from ..types.error_response import ErrorResponse
13
13
  from ..types.initialize_connection import InitializeConnection
14
+ from ..types.initialize_connection_data import InitializeConnectionData
14
15
  from ..types.ping_signal import PingSignal
15
16
  from ..types.send_text import SendText
17
+ from ..types.send_text_data import SendTextData
16
18
 
17
19
  TextToSpeechStreamingSocketClientResponse = typing.Union[AudioOutput, ErrorResponse]
18
20
 
@@ -24,6 +26,7 @@ class AsyncTextToSpeechStreamingSocketClient(EventEmitterMixin):
24
26
 
25
27
  async def __aiter__(self):
26
28
  async for message in self._websocket:
29
+ message = json.loads(message) if isinstance(message, str) else message
27
30
  yield parse_obj_as(TextToSpeechStreamingSocketClientResponse, message) # type: ignore
28
31
 
29
32
  async def start_listening(self):
@@ -39,6 +42,11 @@ class AsyncTextToSpeechStreamingSocketClient(EventEmitterMixin):
39
42
  self._emit(EventType.OPEN, None)
40
43
  try:
41
44
  async for raw_message in self._websocket:
45
+ raw_message = (
46
+ json.loads(raw_message)
47
+ if isinstance(raw_message, str)
48
+ else raw_message
49
+ )
42
50
  parsed = parse_obj_as(TextToSpeechStreamingSocketClientResponse, raw_message) # type: ignore
43
51
  self._emit(EventType.MESSAGE, parsed)
44
52
  except websockets.WebSocketException as exc:
@@ -46,32 +54,47 @@ class AsyncTextToSpeechStreamingSocketClient(EventEmitterMixin):
46
54
  finally:
47
55
  self._emit(EventType.CLOSE, None)
48
56
 
49
- async def send_initialize_connection(self, message: InitializeConnection) -> None:
57
+ async def initialize_connection(
58
+ self,
59
+ target_language_code: str,
60
+ speaker: str,
61
+ ) -> None:
50
62
  """
51
- Send a message to the websocket connection.
52
- The message will be sent as a InitializeConnection.
63
+ Initialize the TTS connection with configuration parameters.
64
+
65
+ :param target_language_code: Target language code (e.g., 'hi-IN')
66
+ :param speaker: Voice speaker name (e.g., 'meera', 'arvind')
53
67
  """
68
+ data = InitializeConnectionData(
69
+ target_language_code=target_language_code,
70
+ speaker=speaker,
71
+ )
72
+ message = InitializeConnection(data=data)
54
73
  await self._send_model(message)
55
74
 
56
- async def send_send_text(self, message: SendText) -> None:
75
+ async def convert(self, text: str) -> None:
57
76
  """
58
- Send a message to the websocket connection.
59
- The message will be sent as a SendText.
77
+ Send text to be converted to speech.
78
+
79
+ :param text: Text to be synthesized (1-2500 characters)
60
80
  """
81
+ data = SendTextData(text=text)
82
+ message = SendText(data=data)
61
83
  await self._send_model(message)
62
84
 
63
- async def send_close_connection(self, message: CloseConnection) -> None:
85
+ async def flush(self) -> None:
64
86
  """
65
- Send a message to the websocket connection.
66
- The message will be sent as a CloseConnection.
87
+ Signal to flush the buffer and finalize audio output.
88
+ This indicates the end of text input.
67
89
  """
90
+ message = CloseConnection()
68
91
  await self._send_model(message)
69
92
 
70
- async def send_ping_signal(self, message: PingSignal) -> None:
93
+ async def ping(self) -> None:
71
94
  """
72
- Send a message to the websocket connection.
73
- The message will be sent as a PingSignal.
95
+ Send ping signal to keep the WebSocket connection alive.
74
96
  """
97
+ message = PingSignal()
75
98
  await self._send_model(message)
76
99
 
77
100
  async def recv(self) -> TextToSpeechStreamingSocketClientResponse:
@@ -79,6 +102,7 @@ class AsyncTextToSpeechStreamingSocketClient(EventEmitterMixin):
79
102
  Receive a message from the websocket connection.
80
103
  """
81
104
  data = await self._websocket.recv()
105
+ data = json.loads(data) if isinstance(data, str) else data
82
106
  return parse_obj_as(TextToSpeechStreamingSocketClientResponse, data) # type: ignore
83
107
 
84
108
  async def _send(self, data: typing.Any) -> None:
@@ -103,6 +127,7 @@ class TextToSpeechStreamingSocketClient(EventEmitterMixin):
103
127
 
104
128
  def __iter__(self):
105
129
  for message in self._websocket:
130
+ message = json.loads(message) if isinstance(message, str) else message
106
131
  yield parse_obj_as(TextToSpeechStreamingSocketClientResponse, message) # type: ignore
107
132
 
108
133
  def start_listening(self):
@@ -118,6 +143,11 @@ class TextToSpeechStreamingSocketClient(EventEmitterMixin):
118
143
  self._emit(EventType.OPEN, None)
119
144
  try:
120
145
  for raw_message in self._websocket:
146
+ raw_message = (
147
+ json.loads(raw_message)
148
+ if isinstance(raw_message, str)
149
+ else raw_message
150
+ )
121
151
  parsed = parse_obj_as(TextToSpeechStreamingSocketClientResponse, raw_message) # type: ignore
122
152
  self._emit(EventType.MESSAGE, parsed)
123
153
  except websockets.WebSocketException as exc:
@@ -125,32 +155,47 @@ class TextToSpeechStreamingSocketClient(EventEmitterMixin):
125
155
  finally:
126
156
  self._emit(EventType.CLOSE, None)
127
157
 
128
- def send_initialize_connection(self, message: InitializeConnection) -> None:
158
+ def initialize_connection(
159
+ self,
160
+ target_language_code: str,
161
+ speaker: str,
162
+ ) -> None:
129
163
  """
130
- Send a message to the websocket connection.
131
- The message will be sent as a InitializeConnection.
164
+ Initialize the TTS connection with configuration parameters.
165
+
166
+ :param target_language_code: Target language code (e.g., 'hi-IN')
167
+ :param speaker: Voice speaker name (e.g., 'meera', 'arvind')
132
168
  """
169
+ data = InitializeConnectionData(
170
+ target_language_code=target_language_code,
171
+ speaker=speaker,
172
+ )
173
+ message = InitializeConnection(data=data)
133
174
  self._send_model(message)
134
175
 
135
- def send_send_text(self, message: SendText) -> None:
176
+ def convert(self, text: str) -> None:
136
177
  """
137
- Send a message to the websocket connection.
138
- The message will be sent as a SendText.
178
+ Send text to be converted to speech.
179
+
180
+ :param text: Text to be synthesized (1-2500 characters)
139
181
  """
182
+ data = SendTextData(text=text)
183
+ message = SendText(data=data)
140
184
  self._send_model(message)
141
185
 
142
- def send_close_connection(self, message: CloseConnection) -> None:
186
+ def flush(self) -> None:
143
187
  """
144
- Send a message to the websocket connection.
145
- The message will be sent as a CloseConnection.
188
+ Signal to flush the buffer and finalize audio output.
189
+ This indicates the end of text input.
146
190
  """
191
+ message = CloseConnection()
147
192
  self._send_model(message)
148
193
 
149
- def send_ping_signal(self, message: PingSignal) -> None:
194
+ def ping(self) -> None:
150
195
  """
151
- Send a message to the websocket connection.
152
- The message will be sent as a PingSignal.
196
+ Send ping signal to keep the WebSocket connection alive.
153
197
  """
198
+ message = PingSignal()
154
199
  self._send_model(message)
155
200
 
156
201
  def recv(self) -> TextToSpeechStreamingSocketClientResponse:
@@ -158,6 +203,7 @@ class TextToSpeechStreamingSocketClient(EventEmitterMixin):
158
203
  Receive a message from the websocket connection.
159
204
  """
160
205
  data = self._websocket.recv()
206
+ data = json.loads(data) if isinstance(data, str) else data
161
207
  return parse_obj_as(TextToSpeechStreamingSocketClientResponse, data) # type: ignore
162
208
 
163
209
  def _send(self, data: typing.Any) -> None:
@@ -0,0 +1,7 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ # isort: skip_file
4
+
5
+ from .text_to_speech_streaming_model import TextToSpeechStreamingModel
6
+
7
+ __all__ = ["TextToSpeechStreamingModel"]
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ TextToSpeechStreamingModel = typing.Union[typing.Literal["bulbul:v1", "bulbul:v2"], typing.Any]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sarvamai
3
- Version: 0.1.8rc2
3
+ Version: 0.1.8rc4
4
4
  Summary:
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -1,11 +1,11 @@
1
- sarvamai/__init__.py,sha256=KdtGxjTLQm70CA6R5oRn2nSa25m-BA-i9yxOEkxc4Z4,8854
1
+ sarvamai/__init__.py,sha256=j9fFu7SIJXzjAmYb9Majr2Ir-ojDhH2dHjxsUVOxgc4,8953
2
2
  sarvamai/chat/__init__.py,sha256=_VhToAyIt_5axN6CLJwtxg3-CO7THa_23pbUzqhXJa4,85
3
3
  sarvamai/chat/client.py,sha256=xOSj83Gr6Q7eY2qUeATiuXYQqBqWqSCQlIEopK5fKus,11022
4
4
  sarvamai/chat/raw_client.py,sha256=A2kRuZcVWlJhyYCD7YKgqNkZEp3cYa1731KhRkhirU0,17885
5
5
  sarvamai/client.py,sha256=aI1sw5LVGMjgukgZLDlUmA17ecK1yGsQxH-W_JiCrco,7177
6
6
  sarvamai/core/__init__.py,sha256=YE2CtXeASe1RAbaI39twKWYKCuT4tW5is9HWHhJjR_g,1653
7
7
  sarvamai/core/api_error.py,sha256=44vPoTyWN59gonCIZMdzw7M1uspygiLnr3GNFOoVL2Q,614
8
- sarvamai/core/client_wrapper.py,sha256=7BUZjGSkb8ozDqUvpd8uChdou-3QW-0QclTxUktLcf0,2080
8
+ sarvamai/core/client_wrapper.py,sha256=n37XVBNUAT0tusKUk_VaNpSUmSysyGgwv6sSK9hXikI,2080
9
9
  sarvamai/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
10
10
  sarvamai/core/events.py,sha256=j7VWXgMpOsjCXdzY22wIhI7Q-v5InZ4WchRzA88x_Sk,856
11
11
  sarvamai/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
@@ -97,10 +97,12 @@ sarvamai/text/raw_client.py,sha256=lQ7bV9aVqxjwEUHMPEZ4x0_Xs036_yFArMK9rnYT4ZI,4
97
97
  sarvamai/text_to_speech/__init__.py,sha256=_VhToAyIt_5axN6CLJwtxg3-CO7THa_23pbUzqhXJa4,85
98
98
  sarvamai/text_to_speech/client.py,sha256=aVvwdGTfgVUekALLpdyxKNsGUZQ2Ee2OZBLx6WP6g_E,8842
99
99
  sarvamai/text_to_speech/raw_client.py,sha256=3Zu6HN_FOY683Vm-EN-OL7YAbLsftjJlFm5OyRGNtYc,14780
100
- sarvamai/text_to_speech_streaming/__init__.py,sha256=_VhToAyIt_5axN6CLJwtxg3-CO7THa_23pbUzqhXJa4,85
101
- sarvamai/text_to_speech_streaming/client.py,sha256=7nxuvqTsn6uLditXNyUUcPMhIZUF_4Mnxzy1J5rNFTg,5379
102
- sarvamai/text_to_speech_streaming/raw_client.py,sha256=7qcOPJIAK6YvPjsNSPl8IvD0abnwxYTWjS4XuQ6Ejh0,4560
103
- sarvamai/text_to_speech_streaming/socket_client.py,sha256=fKGmayvIj3qnmnuDlz_QrPDN14CvrtgkGVh0k27yI68,6313
100
+ sarvamai/text_to_speech_streaming/__init__.py,sha256=AyHwl9te1mTfiz6IkMU20quN-0RP5njbchknXCz-oK8,173
101
+ sarvamai/text_to_speech_streaming/client.py,sha256=sEC5mVNALldkZri3gHVxHcJCI9TmVwF1vPTL8vfatbY,6161
102
+ sarvamai/text_to_speech_streaming/raw_client.py,sha256=DXsU8Rq27yZGINkRmyeyqPWLlSAGsR1RTJWJH81FlTI,5342
103
+ sarvamai/text_to_speech_streaming/socket_client.py,sha256=rvlRi2wmyUzWdh2jBqrveD6Ck9dXA-IiCAf0ehZIREE,7799
104
+ sarvamai/text_to_speech_streaming/types/__init__.py,sha256=DUsvIGTtST5N1v3Hnodq5aNKfPcTBlod28DSypc8NzA,198
105
+ sarvamai/text_to_speech_streaming/types/text_to_speech_streaming_model.py,sha256=1uOMrJIaAxi_XzwCYmnG5XA-il66cq9uC4ZuiI7HCHo,176
104
106
  sarvamai/types/__init__.py,sha256=oCDY6p7Hfd26vLAvluWMrP-qpUd-BJdlVE-KipWXqR8,6332
105
107
  sarvamai/types/audio_data.py,sha256=rgOukLkLNJ_HBBVE2g5dfEL2CWjRoGiMvCtpq0qTB1Y,829
106
108
  sarvamai/types/audio_message.py,sha256=sB4EgkWkWJzipYXobkmM9AYZTTZtCpg_ySKssUeznUE,560
@@ -173,6 +175,6 @@ sarvamai/types/transliterate_mode.py,sha256=1jSEMlGcoLkWuk12TgoOpSgwifa4rThGKZ1h
173
175
  sarvamai/types/transliterate_source_language.py,sha256=bSY9wJszF0sg-Cgg6F-YcWC8ly1mIlj9rqa15-jBtx8,283
174
176
  sarvamai/types/transliteration_response.py,sha256=yt-lzTbDeJ_ZL4I8kQa6oESxA9ebeJJY7LfFHpdEsmM,815
175
177
  sarvamai/version.py,sha256=Qkp3Ee9YH-O9RTix90e0i7iNrFAGN-QDt2AFwGA4n8k,75
176
- sarvamai-0.1.8rc2.dist-info/METADATA,sha256=lLS6-N5YD6qZYnmvnFHh3phGMtEYQCnzruTPTo2vcLY,26760
177
- sarvamai-0.1.8rc2.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
178
- sarvamai-0.1.8rc2.dist-info/RECORD,,
178
+ sarvamai-0.1.8rc4.dist-info/METADATA,sha256=oq7Tpq7QybN8DkNwZe1pYJfxt1cuHCetcQxvCb1CO48,26760
179
+ sarvamai-0.1.8rc4.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
180
+ sarvamai-0.1.8rc4.dist-info/RECORD,,