sarvamai 0.1.5a0__py3-none-any.whl → 0.1.5a1__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.
@@ -111,6 +111,7 @@ class RawChatClient:
111
111
  """
112
112
  _response = self._client_wrapper.httpx_client.request(
113
113
  "v1/chat/completions",
114
+ base_url=self._client_wrapper.get_environment().base,
114
115
  method="POST",
115
116
  json={
116
117
  "messages": convert_and_respect_annotation_metadata(
@@ -291,6 +292,7 @@ class AsyncRawChatClient:
291
292
  """
292
293
  _response = await self._client_wrapper.httpx_client.request(
293
294
  "v1/chat/completions",
295
+ base_url=self._client_wrapper.get_environment().base,
294
296
  method="POST",
295
297
  json={
296
298
  "messages": convert_and_respect_annotation_metadata(
sarvamai/client.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
- import typing
4
3
  from .environment import SarvamAIEnvironment
4
+ import typing
5
5
  import os
6
6
  import httpx
7
7
  from .core.api_error import ApiError
@@ -23,9 +23,6 @@ class SarvamAI:
23
23
 
24
24
  Parameters
25
25
  ----------
26
- base_url : typing.Optional[str]
27
- The base url to use for requests from the client.
28
-
29
26
  environment : SarvamAIEnvironment
30
27
  The environment to use for requests from the client. from .environment import SarvamAIEnvironment
31
28
 
@@ -57,7 +54,6 @@ class SarvamAI:
57
54
  def __init__(
58
55
  self,
59
56
  *,
60
- base_url: typing.Optional[str] = None,
61
57
  environment: SarvamAIEnvironment = SarvamAIEnvironment.PRODUCTION,
62
58
  api_subscription_key: typing.Optional[str] = os.getenv("SARVAM_API_KEY"),
63
59
  timeout: typing.Optional[float] = None,
@@ -72,7 +68,7 @@ class SarvamAI:
72
68
  body="The client must be instantiated be either passing in api_subscription_key or setting SARVAM_API_KEY"
73
69
  )
74
70
  self._client_wrapper = SyncClientWrapper(
75
- base_url=_get_base_url(base_url=base_url, environment=environment),
71
+ environment=environment,
76
72
  api_subscription_key=api_subscription_key,
77
73
  httpx_client=httpx_client
78
74
  if httpx_client is not None
@@ -93,9 +89,6 @@ class AsyncSarvamAI:
93
89
 
94
90
  Parameters
95
91
  ----------
96
- base_url : typing.Optional[str]
97
- The base url to use for requests from the client.
98
-
99
92
  environment : SarvamAIEnvironment
100
93
  The environment to use for requests from the client. from .environment import SarvamAIEnvironment
101
94
 
@@ -127,7 +120,6 @@ class AsyncSarvamAI:
127
120
  def __init__(
128
121
  self,
129
122
  *,
130
- base_url: typing.Optional[str] = None,
131
123
  environment: SarvamAIEnvironment = SarvamAIEnvironment.PRODUCTION,
132
124
  api_subscription_key: typing.Optional[str] = os.getenv("SARVAM_API_KEY"),
133
125
  timeout: typing.Optional[float] = None,
@@ -142,7 +134,7 @@ class AsyncSarvamAI:
142
134
  body="The client must be instantiated be either passing in api_subscription_key or setting SARVAM_API_KEY"
143
135
  )
144
136
  self._client_wrapper = AsyncClientWrapper(
145
- base_url=_get_base_url(base_url=base_url, environment=environment),
137
+ environment=environment,
146
138
  api_subscription_key=api_subscription_key,
147
139
  httpx_client=httpx_client
148
140
  if httpx_client is not None
@@ -155,12 +147,3 @@ class AsyncSarvamAI:
155
147
  self.speech_to_text = AsyncSpeechToTextClient(client_wrapper=self._client_wrapper)
156
148
  self.text_to_speech = AsyncTextToSpeechClient(client_wrapper=self._client_wrapper)
157
149
  self.chat = AsyncChatClient(client_wrapper=self._client_wrapper)
158
-
159
-
160
- def _get_base_url(*, base_url: typing.Optional[str] = None, environment: SarvamAIEnvironment) -> str:
161
- if base_url is not None:
162
- return base_url
163
- elif environment is not None:
164
- return environment.value
165
- else:
166
- raise Exception("Please pass in either base_url or environment to construct the client")
sarvamai/core/__init__.py CHANGED
@@ -3,6 +3,7 @@
3
3
  from .api_error import ApiError
4
4
  from .client_wrapper import AsyncClientWrapper, BaseClientWrapper, SyncClientWrapper
5
5
  from .datetime_utils import serialize_datetime
6
+ from .events import EventEmitterMixin, EventType
6
7
  from .file import File, convert_file_dict_to_httpx_tuples, with_content_type
7
8
  from .http_client import AsyncHttpClient, HttpClient
8
9
  from .http_response import AsyncHttpResponse, HttpResponse
@@ -27,6 +28,8 @@ __all__ = [
27
28
  "AsyncHttpClient",
28
29
  "AsyncHttpResponse",
29
30
  "BaseClientWrapper",
31
+ "EventEmitterMixin",
32
+ "EventType",
30
33
  "FieldMetadata",
31
34
  "File",
32
35
  "HttpClient",
@@ -1,5 +1,6 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
+ from ..environment import SarvamAIEnvironment
3
4
  import typing
4
5
  import httpx
5
6
  from .http_client import HttpClient
@@ -7,23 +8,25 @@ from .http_client import AsyncHttpClient
7
8
 
8
9
 
9
10
  class BaseClientWrapper:
10
- def __init__(self, *, api_subscription_key: str, base_url: str, timeout: typing.Optional[float] = None):
11
+ def __init__(
12
+ self, *, api_subscription_key: str, environment: SarvamAIEnvironment, timeout: typing.Optional[float] = None
13
+ ):
11
14
  self.api_subscription_key = api_subscription_key
12
- self._base_url = base_url
15
+ self._environment = environment
13
16
  self._timeout = timeout
14
17
 
15
18
  def get_headers(self) -> typing.Dict[str, str]:
16
19
  headers: typing.Dict[str, str] = {
17
- "User-Agent": "sarvamai/0.1.5a0",
20
+ "User-Agent": "sarvamai/0.1.5a1",
18
21
  "X-Fern-Language": "Python",
19
22
  "X-Fern-SDK-Name": "sarvamai",
20
- "X-Fern-SDK-Version": "0.1.5a0",
23
+ "X-Fern-SDK-Version": "0.1.5a1",
21
24
  }
22
25
  headers["api-subscription-key"] = self.api_subscription_key
23
26
  return headers
24
27
 
25
- def get_base_url(self) -> str:
26
- return self._base_url
28
+ def get_environment(self) -> SarvamAIEnvironment:
29
+ return self._environment
27
30
 
28
31
  def get_timeout(self) -> typing.Optional[float]:
29
32
  return self._timeout
@@ -34,16 +37,13 @@ class SyncClientWrapper(BaseClientWrapper):
34
37
  self,
35
38
  *,
36
39
  api_subscription_key: str,
37
- base_url: str,
40
+ environment: SarvamAIEnvironment,
38
41
  timeout: typing.Optional[float] = None,
39
42
  httpx_client: httpx.Client,
40
43
  ):
41
- super().__init__(api_subscription_key=api_subscription_key, base_url=base_url, timeout=timeout)
44
+ super().__init__(api_subscription_key=api_subscription_key, environment=environment, timeout=timeout)
42
45
  self.httpx_client = HttpClient(
43
- httpx_client=httpx_client,
44
- base_headers=self.get_headers,
45
- base_timeout=self.get_timeout,
46
- base_url=self.get_base_url,
46
+ httpx_client=httpx_client, base_headers=self.get_headers, base_timeout=self.get_timeout
47
47
  )
48
48
 
49
49
 
@@ -52,14 +52,11 @@ class AsyncClientWrapper(BaseClientWrapper):
52
52
  self,
53
53
  *,
54
54
  api_subscription_key: str,
55
- base_url: str,
55
+ environment: SarvamAIEnvironment,
56
56
  timeout: typing.Optional[float] = None,
57
57
  httpx_client: httpx.AsyncClient,
58
58
  ):
59
- super().__init__(api_subscription_key=api_subscription_key, base_url=base_url, timeout=timeout)
59
+ super().__init__(api_subscription_key=api_subscription_key, environment=environment, timeout=timeout)
60
60
  self.httpx_client = AsyncHttpClient(
61
- httpx_client=httpx_client,
62
- base_headers=self.get_headers,
63
- base_timeout=self.get_timeout,
64
- base_url=self.get_base_url,
61
+ httpx_client=httpx_client, base_headers=self.get_headers, base_timeout=self.get_timeout
65
62
  )
@@ -0,0 +1,30 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from enum import Enum
5
+
6
+
7
+ class EventType(str, Enum):
8
+ OPEN = "open"
9
+ MESSAGE = "message"
10
+ ERROR = "error"
11
+ CLOSE = "close"
12
+
13
+
14
+ class EventEmitterMixin:
15
+ """
16
+ Simple mixin for registering and emitting events.
17
+ """
18
+
19
+ def __init__(self) -> None:
20
+ self._callbacks: typing.Dict[EventType, typing.List[typing.Callable]] = {}
21
+
22
+ def on(self, event_name: EventType, callback: typing.Callable[[typing.Any], None]) -> None:
23
+ if event_name not in self._callbacks:
24
+ self._callbacks[event_name] = []
25
+ self._callbacks[event_name].append(callback)
26
+
27
+ def _emit(self, event_name: EventType, data: typing.Any) -> None:
28
+ if event_name in self._callbacks:
29
+ for cb in self._callbacks[event_name]:
30
+ cb(data)
sarvamai/environment.py CHANGED
@@ -1,7 +1,14 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
- import enum
3
+ from __future__ import annotations
4
4
 
5
5
 
6
- class SarvamAIEnvironment(enum.Enum):
7
- PRODUCTION = "https://api.sarvam.ai"
6
+ class SarvamAIEnvironment:
7
+ PRODUCTION: SarvamAIEnvironment
8
+
9
+ def __init__(self, *, base: str, production: str):
10
+ self.base = base
11
+ self.production = production
12
+
13
+
14
+ SarvamAIEnvironment.PRODUCTION = SarvamAIEnvironment(base="https://api.sarvam.ai", production="wss://api.sarvam.ai")
@@ -80,6 +80,7 @@ class RawSpeechToTextClient:
80
80
  """
81
81
  _response = self._client_wrapper.httpx_client.request(
82
82
  "speech-to-text",
83
+ base_url=self._client_wrapper.get_environment().base,
83
84
  method="POST",
84
85
  data={
85
86
  "model": model,
@@ -210,6 +211,7 @@ class RawSpeechToTextClient:
210
211
  """
211
212
  _response = self._client_wrapper.httpx_client.request(
212
213
  "speech-to-text-translate",
214
+ base_url=self._client_wrapper.get_environment().base,
213
215
  method="POST",
214
216
  data={
215
217
  "prompt": prompt,
@@ -350,6 +352,7 @@ class AsyncRawSpeechToTextClient:
350
352
  """
351
353
  _response = await self._client_wrapper.httpx_client.request(
352
354
  "speech-to-text",
355
+ base_url=self._client_wrapper.get_environment().base,
353
356
  method="POST",
354
357
  data={
355
358
  "model": model,
@@ -480,6 +483,7 @@ class AsyncRawSpeechToTextClient:
480
483
  """
481
484
  _response = await self._client_wrapper.httpx_client.request(
482
485
  "speech-to-text-translate",
486
+ base_url=self._client_wrapper.get_environment().base,
483
487
  method="POST",
484
488
  data={
485
489
  "prompt": prompt,
@@ -145,6 +145,7 @@ class RawTextClient:
145
145
  """
146
146
  _response = self._client_wrapper.httpx_client.request(
147
147
  "translate",
148
+ base_url=self._client_wrapper.get_environment().base,
148
149
  method="POST",
149
150
  json={
150
151
  "input": input,
@@ -249,6 +250,7 @@ class RawTextClient:
249
250
  """
250
251
  _response = self._client_wrapper.httpx_client.request(
251
252
  "text-lid",
253
+ base_url=self._client_wrapper.get_environment().base,
252
254
  method="POST",
253
255
  json={
254
256
  "input": input,
@@ -422,6 +424,7 @@ class RawTextClient:
422
424
  """
423
425
  _response = self._client_wrapper.httpx_client.request(
424
426
  "transliterate",
427
+ base_url=self._client_wrapper.get_environment().base,
425
428
  method="POST",
426
429
  json={
427
430
  "input": input,
@@ -616,6 +619,7 @@ class AsyncRawTextClient:
616
619
  """
617
620
  _response = await self._client_wrapper.httpx_client.request(
618
621
  "translate",
622
+ base_url=self._client_wrapper.get_environment().base,
619
623
  method="POST",
620
624
  json={
621
625
  "input": input,
@@ -720,6 +724,7 @@ class AsyncRawTextClient:
720
724
  """
721
725
  _response = await self._client_wrapper.httpx_client.request(
722
726
  "text-lid",
727
+ base_url=self._client_wrapper.get_environment().base,
723
728
  method="POST",
724
729
  json={
725
730
  "input": input,
@@ -893,6 +898,7 @@ class AsyncRawTextClient:
893
898
  """
894
899
  _response = await self._client_wrapper.httpx_client.request(
895
900
  "transliterate",
901
+ base_url=self._client_wrapper.get_environment().base,
896
902
  method="POST",
897
903
  json={
898
904
  "input": input,
@@ -97,6 +97,7 @@ class RawTextToSpeechClient:
97
97
  """
98
98
  _response = self._client_wrapper.httpx_client.request(
99
99
  "text-to-speech",
100
+ base_url=self._client_wrapper.get_environment().base,
100
101
  method="POST",
101
102
  json={
102
103
  "text": text,
@@ -254,6 +255,7 @@ class AsyncRawTextToSpeechClient:
254
255
  """
255
256
  _response = await self._client_wrapper.httpx_client.request(
256
257
  "text-to-speech",
258
+ base_url=self._client_wrapper.get_environment().base,
257
259
  method="POST",
258
260
  json={
259
261
  "text": text,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sarvamai
3
- Version: 0.1.5a0
3
+ Version: 0.1.5a1
4
4
  Summary:
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -1,12 +1,13 @@
1
1
  sarvamai/__init__.py,sha256=j0eB2isvuZ1spRjp6coCb2mtTv45O636aYSoK79eddQ,5071
2
2
  sarvamai/chat/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
3
3
  sarvamai/chat/client.py,sha256=4ADAA7HC-aoD-fO3ZLd0iodBOzBc_Xyib4E-7NbDkik,11791
4
- sarvamai/chat/raw_client.py,sha256=G7LVq-I0qZ6xsjoG_dJe2lAR_jAVU368eOn1MscYKbI,17825
5
- sarvamai/client.py,sha256=NrpjDx6AusBR2AfUWUrFSfteIlYkUhv5ahjdlCBNPeM,6936
6
- sarvamai/core/__init__.py,sha256=JZDozMOUlhvOLnOO6kGBxye5Ctfg_KDOjeUTSUoMmV8,1542
4
+ sarvamai/chat/raw_client.py,sha256=GMvPA408o9eNJa-34apLRUpa53j8wkqR1dTj2vaIxFg,17957
5
+ sarvamai/client.py,sha256=g9hNkKQeENNu7LoXXYZIjNJI_klN0ajb9kyRNHzeg4U,6235
6
+ sarvamai/core/__init__.py,sha256=BCnS6NhY518p_t-WmBsa3qzwS-pmg3f8Thea-VnMaao,1633
7
7
  sarvamai/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
8
- sarvamai/core/client_wrapper.py,sha256=EbW-_PB6M6SvRkHTxRiBdKcfjiVWejX_afBkAB2cTqg,2074
8
+ sarvamai/core/client_wrapper.py,sha256=j1HRTQZXiKW0Td4aplwANc5Z357tVVTJbmmZfR0OMvs,2101
9
9
  sarvamai/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
10
+ sarvamai/core/events.py,sha256=j7VWXgMpOsjCXdzY22wIhI7Q-v5InZ4WchRzA88x_Sk,856
10
11
  sarvamai/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
11
12
  sarvamai/core/http_client.py,sha256=cKs2w0ybDBk1wHQf-fTALm_MmvaMe3cZKcYJxqmCxkE,19539
12
13
  sarvamai/core/http_response.py,sha256=Argerx6pFZdCpe637AT3EejZw5zlMGgsshZq6rb7krQ,1005
@@ -16,7 +17,7 @@ sarvamai/core/query_encoder.py,sha256=ekulqNd0j8TgD7ox-Qbz7liqX8-KP9blvT9DsRCenY
16
17
  sarvamai/core/remove_none_from_dict.py,sha256=EU9SGgYidWq7SexuJbNs4-PZ-5Bl3Vppd864mS6vQZw,342
17
18
  sarvamai/core/request_options.py,sha256=h0QUNCFVdCW_7GclVySCAY2w4NhtXVBUCmHgmzaxpcg,1681
18
19
  sarvamai/core/serialization.py,sha256=ECL3bvv_0i7U4uvPidZCNel--MUbA0iq0aGcNKi3kws,9818
19
- sarvamai/environment.py,sha256=86s94KkJUHmMqmGiehN2SiNYxHoBFgIxCHH41T_BZNs,158
20
+ sarvamai/environment.py,sha256=hdwTU767BqRgSMLiAOocY_Vpw8V2N_hAy3yhoK8VFS0,402
20
21
  sarvamai/errors/__init__.py,sha256=Rjcid1bNnxJ95F5ACvzU2L5aYJNuJh4OpRG1JSyj8G0,575
21
22
  sarvamai/errors/bad_request_error.py,sha256=_EbO8mWqN9kFZPvIap8qa1lL_EWkRcsZe1HKV9GDWJY,264
22
23
  sarvamai/errors/forbidden_error.py,sha256=QO1kKlhClAPES6zsEK7g9pglWnxn3KWaOCAawWOg6Aw,263
@@ -49,13 +50,13 @@ sarvamai/requests/translation_response.py,sha256=zEL7LhnLIxwAz89NOkjkSDdnR1LaUa8
49
50
  sarvamai/requests/transliteration_response.py,sha256=9ZYsJ-9MSjyRWatEbpsI69Hx86JVACCZCU3BEvN77M4,451
50
51
  sarvamai/speech_to_text/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
51
52
  sarvamai/speech_to_text/client.py,sha256=FnZnTi0XDOnVcD4pxcXmb5brVpU6kOmIM9-CwYyuaWM,11482
52
- sarvamai/speech_to_text/raw_client.py,sha256=k9J82zyF1oCHqkE_sGZUuxABPs1q6rVdLX3J-yByixE,23674
53
+ sarvamai/speech_to_text/raw_client.py,sha256=Y047f5kF0yGfHOpoCtrN3O7nNhh7QQWzZn-_c322gXU,23938
53
54
  sarvamai/text/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
54
55
  sarvamai/text/client.py,sha256=0D15RtAD5EvSFSLdzCZEBPQ5K4nGJv2jf0BI1Mlr2mg,28668
55
- sarvamai/text/raw_client.py,sha256=LQT2yNlNxP7NVw7bKZ6vkUy1tkDs1-IXaf7sjFY5UkI,44227
56
+ sarvamai/text/raw_client.py,sha256=pj00d9dcZLc6w_W_FaFCLDizBitbPamAY1Sma0ySFgc,44623
56
57
  sarvamai/text_to_speech/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
57
58
  sarvamai/text_to_speech/client.py,sha256=1T_P7dpVmZBzUNPbKFGBDPXRwpDV-5zY6KcEOQoLrs8,9215
58
- sarvamai/text_to_speech/raw_client.py,sha256=VIgGQ8WKQOY9RTAEfboWeCe1zZM1l8wZ3jOUAnYrxxg,14312
59
+ sarvamai/text_to_speech/raw_client.py,sha256=8vpIMUBJ1GxIf1SKZdLWFKQ305XXpTFqX3ohCzOclA0,14444
59
60
  sarvamai/types/__init__.py,sha256=K3_vaMlZnhW4W0tO5jUHZegxHpg_7wOyB1iDcnjJ2lo,4022
60
61
  sarvamai/types/chat_completion_request_assistant_message.py,sha256=EUkQKNCaBvrL2PIOIN9Q4GXIV7uJ6C86k-BreA-83uE,660
61
62
  sarvamai/types/chat_completion_request_message.py,sha256=4M8Rkc1kNHfORTNDFrc8wbq8eR37kq5nrsd-wNvL4kw,1673
@@ -101,6 +102,6 @@ sarvamai/types/translatiterate_target_language.py,sha256=S8yfYS-BtEvSdQw3sBbQckb
101
102
  sarvamai/types/transliterate_source_language.py,sha256=6BVDfik4WSY40DiQPFH32SYjXJBMzrJCouxOJNd4f9A,283
102
103
  sarvamai/types/transliteration_response.py,sha256=RZcsRP73Si24t4LF8MZCw_qZyVbX3gvMz88O41oMk8s,851
103
104
  sarvamai/version.py,sha256=Qkp3Ee9YH-O9RTix90e0i7iNrFAGN-QDt2AFwGA4n8k,75
104
- sarvamai-0.1.5a0.dist-info/METADATA,sha256=j2wI-jSnp0cuLckrfhhnSkdQbM939oEuCIeWqbUsZrw,4792
105
- sarvamai-0.1.5a0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
106
- sarvamai-0.1.5a0.dist-info/RECORD,,
105
+ sarvamai-0.1.5a1.dist-info/METADATA,sha256=pLMlW-BprjGituUPdhqATkpPg94jeUXS7BKgH3VqgOI,4792
106
+ sarvamai-0.1.5a1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
107
+ sarvamai-0.1.5a1.dist-info/RECORD,,