dwani 0.1.6__py3-none-any.whl → 0.1.7__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.
dwani/asr.py CHANGED
@@ -1,10 +1,44 @@
1
1
  from .exceptions import DhwaniAPIError
2
2
  import requests
3
+
4
+ # Allowed languages (case-sensitive for display, but we'll handle case-insensitively)
5
+ ALLOWED_LANGUAGES = [
6
+ "Assamese",
7
+ "Bengali",
8
+ "Gujarati",
9
+ "Hindi",
10
+ "Kannada",
11
+ "Malayalam",
12
+ "Marathi",
13
+ "Odia",
14
+ "Punjabi",
15
+ "Tamil",
16
+ "Telugu"
17
+ ]
18
+
19
+ def validate_language(language):
20
+ """Validate that the provided language is in the allowed list (case-insensitive)."""
21
+ # Create a case-insensitive mapping of allowed languages
22
+ language_map = {lang.lower(): lang for lang in ALLOWED_LANGUAGES}
23
+ # Check if the lowercase version of the input language is in the map
24
+ if language.lower() not in language_map:
25
+ raise ValueError(
26
+ f"Unsupported language: {language}. Supported languages: {ALLOWED_LANGUAGES}"
27
+ )
28
+ # Return the original case from ALLOWED_LANGUAGES for consistency
29
+ return language_map[language.lower()]
30
+
3
31
  def asr_transcribe(client, file_path, language):
32
+ # Validate the language input (case-insensitive)
33
+ validated_language = validate_language(language)
34
+
35
+ # Convert language to lowercase for the API request
36
+ api_language = validated_language.lower()
37
+
4
38
  with open(file_path, "rb") as f:
5
39
  files = {"file": f}
6
40
  resp = requests.post(
7
- f"{client.api_base}/v1/transcribe/?language={language}",
41
+ f"{client.api_base}/v1/transcribe/?language={api_language}",
8
42
  headers=client._headers(),
9
43
  files=files
10
44
  )
@@ -16,5 +50,4 @@ class ASR:
16
50
  @staticmethod
17
51
  def transcribe(*args, **kwargs):
18
52
  from . import _get_client
19
- return _get_client().transcribe(*args, **kwargs)
20
-
53
+ return _get_client().transcribe(*args, **kwargs)
dwani/chat.py CHANGED
@@ -1,12 +1,50 @@
1
1
  from .exceptions import DhwaniAPIError
2
2
  import requests
3
3
 
4
+ # Language options mapping
5
+ language_options = [
6
+ ("English", "eng_Latn"),
7
+ ("Kannada", "kan_Knda"),
8
+ ("Hindi", "hin_Deva"),
9
+ ("Assamese", "asm_Beng"),
10
+ ("Bengali","ben_Beng"),
11
+ ("Gujarati","guj_Gujr"),
12
+ ("Malayalam","mal_Mlym"),
13
+ ("Marathi","mar_Deva"),
14
+ ("Odia","ory_Orya"),
15
+ ("Punjabi","pan_Guru"),
16
+ ("Tamil","tam_Taml"),
17
+ ("Telugu","tel_Telu")
18
+ ]
19
+
20
+ # Create a dictionary for language name to code mapping
21
+ lang_name_to_code = {name.lower(): code for name, code in language_options}
22
+ lang_code_to_code = {code: code for _, code in language_options}
23
+
24
+ def normalize_language(lang):
25
+ """Convert language input (name or code) to language code."""
26
+ lang = lang.strip()
27
+ # Check if input is a language name (case-insensitive)
28
+ lang_lower = lang.lower()
29
+ if lang_lower in lang_name_to_code:
30
+ return lang_name_to_code[lang_lower]
31
+ # Check if input is a language code
32
+ if lang in lang_code_to_code:
33
+ return lang_code_to_code[lang]
34
+ # Raise error if language is not supported
35
+ supported_langs = list(lang_name_to_code.keys()) + list(lang_code_to_code.keys())
36
+ raise ValueError(f"Unsupported language: {lang}. Supported languages: {supported_langs}")
37
+
4
38
  def chat_create(client, prompt, src_lang, tgt_lang, **kwargs):
39
+ # Normalize source and target languages
40
+ src_lang_code = normalize_language(src_lang)
41
+ tgt_lang_code = normalize_language(tgt_lang)
42
+
5
43
  url = f"{client.api_base}/v1/indic_chat"
6
44
  payload = {
7
45
  "prompt": prompt,
8
- "src_lang": src_lang,
9
- "tgt_lang": tgt_lang
46
+ "src_lang": src_lang_code,
47
+ "tgt_lang": tgt_lang_code
10
48
  }
11
49
  payload.update(kwargs)
12
50
  resp = requests.post(
@@ -22,4 +60,4 @@ class Chat:
22
60
  @staticmethod
23
61
  def create(prompt, src_lang, tgt_lang, **kwargs):
24
62
  from . import _get_client
25
- return _get_client().chat(prompt, src_lang, tgt_lang, **kwargs)
63
+ return _get_client().chat(prompt, src_lang, tgt_lang, **kwargs)
dwani/docs.py CHANGED
@@ -1,13 +1,49 @@
1
1
  import requests
2
2
  from .exceptions import DhwaniAPIError
3
3
 
4
+ # Language options mapping
5
+ language_options = [
6
+ ("English", "eng_Latn"),
7
+ ("Kannada", "kan_Knda"),
8
+ ("Hindi", "hin_Deva"),
9
+ ("Assamese", "asm_Beng"),
10
+ ("Bengali", "ben_Beng"),
11
+ ("Gujarati", "guj_Gujr"),
12
+ ("Malayalam", "mal_Mlym"),
13
+ ("Marathi", "mar_Deva"),
14
+ ("Odia", "ory_Orya"),
15
+ ("Punjabi", "pan_Guru"),
16
+ ("Tamil", "tam_Taml"),
17
+ ("Telugu", "tel_Telu")
18
+ ]
19
+
20
+ # Create dictionaries for language name to code and code to code mapping
21
+ lang_name_to_code = {name.lower(): code for name, code in language_options}
22
+ lang_code_to_code = {code: code for _, code in language_options}
23
+
24
+ def normalize_language(lang):
25
+ """Convert language input (name or code) to language code."""
26
+ lang = lang.strip()
27
+ # Check if input is a language name (case-insensitive)
28
+ lang_lower = lang.lower()
29
+ if lang_lower in lang_name_to_code:
30
+ return lang_name_to_code[lang_lower]
31
+ # Check if input is a language code
32
+ if lang in lang_code_to_code:
33
+ return lang_code_to_code[lang]
34
+ # Raise error if language is not supported
35
+ supported_langs = list(lang_name_to_code.keys()) + list(lang_code_to_code.keys())
36
+ raise ValueError(f"Unsupported language: {lang}. Supported languages: {supported_langs}")
37
+
4
38
  def document_ocr(client, file_path, language=None):
5
39
  """OCR a document (image/PDF) and return extracted text."""
40
+ data = {}
41
+ if language:
42
+ # Normalize the language input
43
+ data["language"] = normalize_language(language)
44
+
6
45
  with open(file_path, "rb") as f:
7
46
  files = {"file": f}
8
- data = {}
9
- if language:
10
- data["language"] = language
11
47
  resp = requests.post(
12
48
  f"{client.api_base}/v1/document/ocr",
13
49
  headers=client._headers(),
@@ -20,14 +56,18 @@ def document_ocr(client, file_path, language=None):
20
56
 
21
57
  def document_summarize(client, file_path, page_number=1, src_lang="eng_Latn", tgt_lang="kan_Knda"):
22
58
  """Summarize a PDF document with language and page number options."""
59
+ # Normalize source and target languages
60
+ src_lang_code = normalize_language(src_lang)
61
+ tgt_lang_code = normalize_language(tgt_lang)
62
+
23
63
  url = f"{client.api_base}/v1/indic-summarize-pdf"
24
64
  headers = client._headers()
25
65
  with open(file_path, "rb") as f:
26
66
  files = {"file": (file_path, f, "application/pdf")}
27
67
  data = {
28
68
  "page_number": str(page_number),
29
- "src_lang": src_lang,
30
- "tgt_lang": tgt_lang
69
+ "src_lang": src_lang_code,
70
+ "tgt_lang": tgt_lang_code
31
71
  }
32
72
  resp = requests.post(
33
73
  url,
@@ -39,18 +79,20 @@ def document_summarize(client, file_path, page_number=1, src_lang="eng_Latn", tg
39
79
  raise DhwaniAPIError(resp)
40
80
  return resp.json()
41
81
 
42
-
43
82
  def extract(client, file_path, page_number, src_lang, tgt_lang):
44
83
  """
45
84
  Extract and translate text from a document (image/PDF) using query parameters.
46
85
  """
86
+ # Normalize source and target languages
87
+ src_lang_code = normalize_language(src_lang)
88
+ tgt_lang_code = normalize_language(tgt_lang)
89
+
47
90
  # Build the URL with query parameters
48
91
  url = (
49
92
  f"{client.api_base}/v1/indic-extract-text/"
50
- f"?page_number={page_number}&src_lang={src_lang}&tgt_lang={tgt_lang}"
93
+ f"?page_number={page_number}&src_lang={src_lang_code}&tgt_lang={tgt_lang_code}"
51
94
  )
52
95
  headers = client._headers()
53
- # 'requests' handles multipart/form-data automatically
54
96
  with open(file_path, "rb") as f:
55
97
  files = {"file": (file_path, f, "application/pdf")}
56
98
  resp = requests.post(
@@ -71,6 +113,10 @@ def doc_query(
71
113
  tgt_lang="kan_Knda"
72
114
  ):
73
115
  """Query a document with a custom prompt and language options."""
116
+ # Normalize source and target languages
117
+ src_lang_code = normalize_language(src_lang)
118
+ tgt_lang_code = normalize_language(tgt_lang)
119
+
74
120
  url = f"{client.api_base}/v1/indic-custom-prompt-pdf"
75
121
  headers = client._headers()
76
122
  with open(file_path, "rb") as f:
@@ -78,8 +124,8 @@ def doc_query(
78
124
  data = {
79
125
  "page_number": str(page_number),
80
126
  "prompt": prompt,
81
- "source_language": src_lang,
82
- "target_language": tgt_lang
127
+ "source_language": src_lang_code,
128
+ "target_language": tgt_lang_code
83
129
  }
84
130
  resp = requests.post(
85
131
  url,
@@ -91,7 +137,6 @@ def doc_query(
91
137
  raise DhwaniAPIError(resp)
92
138
  return resp.json()
93
139
 
94
-
95
140
  def doc_query_kannada(
96
141
  client,
97
142
  file_path,
@@ -101,18 +146,20 @@ def doc_query_kannada(
101
146
  language=None
102
147
  ):
103
148
  """Summarize a document (image/PDF/text) with custom prompt and language."""
149
+ # Normalize source language and optional language parameter
150
+ src_lang_code = normalize_language(src_lang)
151
+ data = {
152
+ "page_number": str(page_number),
153
+ "prompt": prompt,
154
+ "src_lang": src_lang_code,
155
+ }
156
+ if language:
157
+ data["language"] = normalize_language(language)
158
+
104
159
  url = f"{client.api_base}/v1/indic-custom-prompt-kannada-pdf"
105
160
  headers = client._headers()
106
- # 'requests' will handle multipart/form-data automatically
107
161
  with open(file_path, "rb") as f:
108
162
  files = {"file": (file_path, f, "application/pdf")}
109
- data = {
110
- "page_number": str(page_number),
111
- "prompt": prompt,
112
- "src_lang": src_lang,
113
- }
114
- if language:
115
- data["language"] = language
116
163
  resp = requests.post(
117
164
  url,
118
165
  headers=headers,
@@ -123,8 +170,6 @@ def doc_query_kannada(
123
170
  raise DhwaniAPIError(resp)
124
171
  return resp.json()
125
172
 
126
-
127
-
128
173
  class Documents:
129
174
  @staticmethod
130
175
  def ocr(file_path, language=None):
@@ -135,14 +180,17 @@ class Documents:
135
180
  def summarize(*args, **kwargs):
136
181
  from . import _get_client
137
182
  return _get_client().document_summarize(*args, **kwargs)
183
+
138
184
  @staticmethod
139
185
  def run_extract(*args, **kwargs):
140
186
  from . import _get_client
141
187
  return _get_client().extract(*args, **kwargs)
188
+
142
189
  @staticmethod
143
190
  def run_doc_query(*args, **kwargs):
144
191
  from . import _get_client
145
192
  return _get_client().doc_query(*args, **kwargs)
193
+
146
194
  @staticmethod
147
195
  def run_doc_query_kannada(*args, **kwargs):
148
196
  from . import _get_client
dwani/translate.py CHANGED
@@ -1,12 +1,50 @@
1
1
  from .exceptions import DhwaniAPIError
2
2
  import requests
3
3
 
4
+ # Language options mapping
5
+ language_options = [
6
+ ("English", "eng_Latn"),
7
+ ("Kannada", "kan_Knda"),
8
+ ("Hindi", "hin_Deva"),
9
+ ("Assamese", "asm_Beng"),
10
+ ("Bengali", "ben_Beng"),
11
+ ("Gujarati", "guj_Gujr"),
12
+ ("Malayalam", "mal_Mlym"),
13
+ ("Marathi", "mar_Deva"),
14
+ ("Odia", "ory_Orya"),
15
+ ("Punjabi", "pan_Guru"),
16
+ ("Tamil", "tam_Taml"),
17
+ ("Telugu", "tel_Telu")
18
+ ]
19
+
20
+ # Create dictionaries for language name to code and code to code mapping
21
+ lang_name_to_code = {name.lower(): code for name, code in language_options}
22
+ lang_code_to_code = {code: code for _, code in language_options}
23
+
24
+ def normalize_language(lang):
25
+ """Convert language input (name or code) to language code."""
26
+ lang = lang.strip()
27
+ # Check if input is a language name (case-insensitive)
28
+ lang_lower = lang.lower()
29
+ if lang_lower in lang_name_to_code:
30
+ return lang_name_to_code[lang_lower]
31
+ # Check if input is a language code
32
+ if lang in lang_code_to_code:
33
+ return lang_code_to_code[lang]
34
+ # Raise error if language is not supported
35
+ supported_langs = list(lang_name_to_code.keys()) + list(lang_code_to_code.keys())
36
+ raise ValueError(f"Unsupported language: {lang}. Supported languages: {supported_langs}")
37
+
4
38
  def run_translate(client, sentences, src_lang, tgt_lang, **kwargs):
39
+ # Normalize source and target languages
40
+ src_lang_code = normalize_language(src_lang)
41
+ tgt_lang_code = normalize_language(tgt_lang)
42
+
5
43
  url = f"{client.api_base}/v1/translate"
6
44
  payload = {
7
45
  "sentences": sentences,
8
- "src_lang": src_lang,
9
- "tgt_lang": tgt_lang
46
+ "src_lang": src_lang_code,
47
+ "tgt_lang": tgt_lang_code
10
48
  }
11
49
  payload.update(kwargs)
12
50
  resp = requests.post(
@@ -22,5 +60,4 @@ class Translate:
22
60
  @staticmethod
23
61
  def run_translate(sentences, src_lang, tgt_lang, **kwargs):
24
62
  from . import _get_client
25
- return _get_client().translate(sentences, src_lang, tgt_lang, **kwargs)
26
-
63
+ return _get_client().translate(sentences, src_lang, tgt_lang, **kwargs)
dwani/vision.py CHANGED
@@ -1,15 +1,53 @@
1
1
  from .exceptions import DhwaniAPIError
2
2
  import requests
3
+
4
+ # Language options mapping
5
+ language_options = [
6
+ ("English", "eng_Latn"),
7
+ ("Kannada", "kan_Knda"),
8
+ ("Hindi", "hin_Deva"),
9
+ ("Assamese", "asm_Beng"),
10
+ ("Bengali", "ben_Beng"),
11
+ ("Gujarati", "guj_Gujr"),
12
+ ("Malayalam", "mal_Mlym"),
13
+ ("Marathi", "mar_Deva"),
14
+ ("Odia", "ory_Orya"),
15
+ ("Punjabi", "pan_Guru"),
16
+ ("Tamil", "tam_Taml"),
17
+ ("Telugu", "tel_Telu")
18
+ ]
19
+
20
+ # Create dictionaries for language name to code and code to code mapping
21
+ lang_name_to_code = {name.lower(): code for name, code in language_options}
22
+ lang_code_to_code = {code: code for _, code in language_options}
23
+
24
+ def normalize_language(lang):
25
+ """Convert language input (name or code) to language code."""
26
+ lang = lang.strip()
27
+ # Check if input is a language name (case-insensitive)
28
+ lang_lower = lang.lower()
29
+ if lang_lower in lang_name_to_code:
30
+ return lang_name_to_code[lang_lower]
31
+ # Check if input is a language code
32
+ if lang in lang_code_to_code:
33
+ return lang_code_to_code[lang]
34
+ # Raise error if language is not supported
35
+ supported_langs = list(lang_name_to_code.keys()) + list(lang_code_to_code.keys())
36
+ raise ValueError(f"Unsupported language: {lang}. Supported languages: {supported_langs}")
37
+
3
38
  def vision_caption(client, file_path, query="describe the image", src_lang="eng_Latn", tgt_lang="kan_Knda"):
39
+ # Normalize source and target languages
40
+ src_lang_code = normalize_language(src_lang)
41
+ tgt_lang_code = normalize_language(tgt_lang)
42
+
4
43
  # Build the endpoint using the client's api_base
5
44
  url = (
6
45
  f"{client.api_base}/v1/indic_visual_query"
7
- f"?src_lang={src_lang}&tgt_lang={tgt_lang}"
46
+ f"?src_lang={src_lang_code}&tgt_lang={tgt_lang_code}"
8
47
  )
9
48
  headers = {
10
49
  **client._headers(),
11
50
  "accept": "application/json"
12
- # Note: 'Content-Type' will be set automatically by requests when using 'files'
13
51
  }
14
52
  with open(file_path, "rb") as f:
15
53
  files = {"file": (file_path, f, "image/png")}
@@ -28,4 +66,4 @@ class Vision:
28
66
  @staticmethod
29
67
  def caption(*args, **kwargs):
30
68
  from . import _get_client
31
- return _get_client().caption(*args, **kwargs)
69
+ return _get_client().caption(*args, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dwani
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: Multimodal API for Indian languages (Chat, Vision, TTS, ASR, Translate, Docs)
5
5
  Author-email: sachin <python@dwani.ai>
6
6
  License: MIT License
@@ -42,6 +42,9 @@ Dynamic: license-file
42
42
  pip install dwani
43
43
  ```
44
44
 
45
+ ### Languages supported
46
+ - Assamese, Bengali, Gujarati, Hindi, Kannada, Malayalam, Marathi, Odia, Punjabi, Tamil, Telugu
47
+
45
48
  ### Setup the credentials
46
49
  ```python
47
50
  import dwani
@@ -0,0 +1,14 @@
1
+ dwani/__init__.py,sha256=ldO5OND7DvJlbxaQ0R57Cc73jJTnCSslDDt4I4r-Op8,1895
2
+ dwani/asr.py,sha256=3LYrLOaMhc5eXKFSoi63C8KAvwZI2NcuO25pwTfSVe0,1692
3
+ dwani/audio.py,sha256=Q9vw4uBxGy1vQzmiZjZGrY8hkAEQNkGhjz5OcnpFEQQ,888
4
+ dwani/chat.py,sha256=dQCl8lLQczwnAsvYlTZowd471ktRVZcW3w8gZ5Wpzms,2097
5
+ dwani/client.py,sha256=OrnwqxBQMfEZ1iQEleFigNujiZve3ox53yv5aSmB3iQ,2849
6
+ dwani/docs.py,sha256=EO41opJwfDFsNmH6nQl-HOsyWravCnj1f5ZDgxSZECI,6323
7
+ dwani/exceptions.py,sha256=qEN5ukqlnN7v-kHNEnISWFMpPMt6uTft9mPsTXJ4LVA,227
8
+ dwani/translate.py,sha256=IJiKrYIfwdJKc_PjlZKVRAwzpQDst_2MF_B_huxid_E,2185
9
+ dwani/vision.py,sha256=wN7WkMRVmLrZnBJxnam7vihTXWGlWJ4JqXgyrp-tbrg,2330
10
+ dwani-0.1.7.dist-info/licenses/LICENSE,sha256=IAD8tbwWZbPWHXgYjabHoMv0aaUzZUYzYiEbfhTCisY,1070
11
+ dwani-0.1.7.dist-info/METADATA,sha256=ggOY4wss1nwN6PzhB0BZG5332emrP6C76qwjaK2mzSs,4810
12
+ dwani-0.1.7.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
13
+ dwani-0.1.7.dist-info/top_level.txt,sha256=AM5EhkyuO_EXQFR9JIxEV6tAYMCCyc-a1dLifpCGBUk,6
14
+ dwani-0.1.7.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.0)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,14 +0,0 @@
1
- dwani/__init__.py,sha256=ldO5OND7DvJlbxaQ0R57Cc73jJTnCSslDDt4I4r-Op8,1895
2
- dwani/asr.py,sha256=Y5Mbv1KsvhfXNZacMZycUHPn79NRQC-XPH0j9SYPUSY,590
3
- dwani/audio.py,sha256=Q9vw4uBxGy1vQzmiZjZGrY8hkAEQNkGhjz5OcnpFEQQ,888
4
- dwani/chat.py,sha256=WFuEShNd4nd6KUbIZTkm3eyPGoP33GepOLJax86nNn8,720
5
- dwani/client.py,sha256=OrnwqxBQMfEZ1iQEleFigNujiZve3ox53yv5aSmB3iQ,2849
6
- dwani/docs.py,sha256=s7lgw9tfA0IlItAMlwnPuuxMEmS1ls9ygEIgjuUKlcg,4550
7
- dwani/exceptions.py,sha256=qEN5ukqlnN7v-kHNEnISWFMpPMt6uTft9mPsTXJ4LVA,227
8
- dwani/translate.py,sha256=SH8daC0MLudM3GX3ezoWufNmh1u1Ym4LELiUlWHeyeM,791
9
- dwani/vision.py,sha256=JtMSS0hI-8gxtLugVP10__enZsPPy8jheMyWXvrGrdw,1015
10
- dwani-0.1.6.dist-info/licenses/LICENSE,sha256=IAD8tbwWZbPWHXgYjabHoMv0aaUzZUYzYiEbfhTCisY,1070
11
- dwani-0.1.6.dist-info/METADATA,sha256=A3XIToek1Gj1y4rX8Ipd7-6fEa2kShIjUVl6ZD38j4o,4685
12
- dwani-0.1.6.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
13
- dwani-0.1.6.dist-info/top_level.txt,sha256=AM5EhkyuO_EXQFR9JIxEV6tAYMCCyc-a1dLifpCGBUk,6
14
- dwani-0.1.6.dist-info/RECORD,,