janito 2.15.0__py3-none-any.whl → 2.16.0__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.
@@ -0,0 +1,240 @@
1
+ """
2
+ Geolocation utilities for determining user location and optimal regions.
3
+
4
+ This module provides utilities to detect user location and determine
5
+ optimal API regions based on geographic proximity.
6
+ """
7
+
8
+ import os
9
+ import json
10
+ import subprocess
11
+ import sys
12
+ from typing import Optional, Tuple
13
+ from pathlib import Path
14
+
15
+
16
+ def _get_geoip_location() -> Optional[str]:
17
+ """Try to get location using geoip2 if available."""
18
+ try:
19
+ import geoip2.database
20
+ import geoip2.errors
21
+ import urllib.request
22
+
23
+ # Common GeoIP database locations
24
+ db_paths = [
25
+ "/usr/share/GeoIP/GeoLite2-City.mmdb",
26
+ "/var/lib/GeoIP/GeoLite2-City.mmdb",
27
+ str(Path.home() / ".local/share/GeoIP/GeoLite2-City.mmdb"),
28
+ ]
29
+
30
+ for db_path in db_paths:
31
+ if Path(db_path).exists():
32
+ reader = geoip2.database.Reader(db_path)
33
+ try:
34
+ with urllib.request.urlopen(
35
+ "https://api.ipify.org", timeout=2
36
+ ) as response:
37
+ ip = response.read().decode().strip()
38
+
39
+ response = reader.city(ip)
40
+ country_code = response.country.iso_code
41
+ reader.close()
42
+
43
+ if country_code:
44
+ return country_code.upper()
45
+ except Exception:
46
+ reader.close()
47
+ continue
48
+ except (ImportError, Exception):
49
+ pass
50
+ return None
51
+
52
+
53
+ def _get_ipinfo_location() -> Optional[str]:
54
+ """Try to get location using ipinfo.io via curl."""
55
+ try:
56
+ import subprocess
57
+
58
+ result = subprocess.run(
59
+ ["curl", "-s", "https://ipinfo.io/country"],
60
+ capture_output=True,
61
+ text=True,
62
+ timeout=3,
63
+ )
64
+ if result.returncode == 0 and result.stdout.strip():
65
+ return result.stdout.strip().upper()
66
+ except (subprocess.TimeoutExpired, FileNotFoundError, Exception):
67
+ pass
68
+ return None
69
+
70
+
71
+ def _get_locale_location() -> Optional[str]:
72
+ """Try to get location from system locale."""
73
+ try:
74
+ import locale
75
+
76
+ loc = locale.getdefaultlocale()[0]
77
+ if loc:
78
+ parts = loc.split("_")
79
+ if len(parts) > 1:
80
+ return parts[-1].upper()
81
+ except Exception:
82
+ pass
83
+ return None
84
+
85
+
86
+ def get_user_location() -> Tuple[str, str]:
87
+ """
88
+ Detect user's location using geoip lookup.
89
+
90
+ Returns:
91
+ Tuple of (country_code, region_name)
92
+
93
+ Note:
94
+ This is a best-effort detection. Falls back to environment variables
95
+ or defaults to 'US' if detection fails.
96
+ """
97
+ # Try environment variable first
98
+ user_region = os.getenv("JANITO_REGION")
99
+ if user_region:
100
+ return user_region.upper(), f"Environment: {user_region}"
101
+
102
+ # Try different detection methods
103
+ country_code = (
104
+ _get_geoip_location()
105
+ or _get_ipinfo_location()
106
+ or _get_locale_location()
107
+ or "US"
108
+ )
109
+
110
+ source = (
111
+ "GeoIP"
112
+ if _get_geoip_location()
113
+ else (
114
+ "ipinfo.io"
115
+ if _get_ipinfo_location()
116
+ else ("Locale" if _get_locale_location() else "Default")
117
+ )
118
+ )
119
+
120
+ return country_code, f"{source}: {country_code}"
121
+
122
+
123
+ def get_closest_region(country_code: str) -> str:
124
+ """
125
+ Map country code to closest major region.
126
+
127
+ Args:
128
+ country_code: ISO country code (e.g., 'US', 'DE', 'CN')
129
+
130
+ Returns:
131
+ Major region identifier (US, EU, CN, CH, ASIA)
132
+ """
133
+ country_code = country_code.upper()
134
+
135
+ # US and Americas
136
+ if country_code in ["US", "CA", "MX", "BR", "AR", "CL", "CO", "PE"]:
137
+ return "US"
138
+
139
+ # European Union and Europe
140
+ if country_code in [
141
+ "AT",
142
+ "BE",
143
+ "BG",
144
+ "HR",
145
+ "CY",
146
+ "CZ",
147
+ "DK",
148
+ "EE",
149
+ "FI",
150
+ "FR",
151
+ "DE",
152
+ "GR",
153
+ "HU",
154
+ "IE",
155
+ "IT",
156
+ "LV",
157
+ "LT",
158
+ "LU",
159
+ "MT",
160
+ "NL",
161
+ "PL",
162
+ "PT",
163
+ "RO",
164
+ "SK",
165
+ "SI",
166
+ "ES",
167
+ "SE",
168
+ "GB",
169
+ "NO",
170
+ "CH",
171
+ "IS",
172
+ "LI",
173
+ ]:
174
+ return "EU"
175
+
176
+ # China and nearby
177
+ if country_code in ["CN", "HK", "MO", "TW"]:
178
+ return "CN"
179
+
180
+ # Switzerland
181
+ if country_code == "CH":
182
+ return "CH"
183
+
184
+ # Asia Pacific
185
+ if country_code in [
186
+ "JP",
187
+ "KR",
188
+ "SG",
189
+ "MY",
190
+ "TH",
191
+ "VN",
192
+ "PH",
193
+ "ID",
194
+ "IN",
195
+ "AU",
196
+ "NZ",
197
+ "BD",
198
+ "LK",
199
+ "MM",
200
+ "KH",
201
+ "LA",
202
+ "BN",
203
+ "MV",
204
+ ]:
205
+ return "ASIA"
206
+
207
+ # Middle East
208
+ if country_code in ["AE", "SA", "QA", "KW", "OM", "BH", "IL", "TR"]:
209
+ return "ASIA"
210
+
211
+ # Africa
212
+ if country_code in ["ZA", "NG", "KE", "EG", "MA", "TN", "GH", "UG"]:
213
+ return "EU" # Route through EU for better connectivity
214
+
215
+ # Default to US for unknown regions
216
+ return "US"
217
+
218
+
219
+ def get_region_info() -> dict:
220
+ """
221
+ Get comprehensive region information for the current user.
222
+
223
+ Returns:
224
+ Dictionary with location details
225
+ """
226
+ country_code, source = get_user_location()
227
+ major_region = get_closest_region(country_code)
228
+
229
+ return {
230
+ "country_code": country_code,
231
+ "major_region": major_region,
232
+ "source": source,
233
+ "timestamp": str(__import__("datetime").datetime.now()),
234
+ }
235
+
236
+
237
+ if __name__ == "__main__":
238
+ # Test the geolocation functionality
239
+ info = get_region_info()
240
+ print(json.dumps(info, indent=2))
@@ -0,0 +1,158 @@
1
+ """
2
+ Static region definitions for LLM providers.
3
+
4
+ This module contains region mappings for major LLM providers with their
5
+ respective API endpoints and data center locations.
6
+ """
7
+
8
+ from typing import Dict, List, Optional
9
+ from dataclasses import dataclass
10
+
11
+
12
+ @dataclass
13
+ class RegionEndpoint:
14
+ """Represents a provider's endpoint in a specific region."""
15
+
16
+ region_code: str
17
+ name: str
18
+ endpoint: str
19
+ location: str # City, Country format
20
+ priority: int = 1 # Lower = higher priority
21
+
22
+
23
+ # Region definitions for major LLM providers
24
+ PROVIDER_REGIONS: Dict[str, List[RegionEndpoint]] = {
25
+ "openai": [
26
+ RegionEndpoint(
27
+ "US-WEST", "US West", "https://api.openai.com/v1", "San Francisco, US", 1
28
+ ),
29
+ ],
30
+ "anthropic": [
31
+ RegionEndpoint(
32
+ "US-WEST", "US West", "https://api.anthropic.com", "San Francisco, US", 1
33
+ ),
34
+ ],
35
+ "google": [
36
+ RegionEndpoint(
37
+ "EU-WEST",
38
+ "EU West",
39
+ "https://generativelanguage.googleapis.com/v1beta",
40
+ "Delfzijl, NL",
41
+ 1,
42
+ ),
43
+ ],
44
+ "azure-openai": [
45
+ RegionEndpoint(
46
+ "US-EAST",
47
+ "East US",
48
+ "https://{resource}.openai.azure.com",
49
+ "Virginia, US",
50
+ 1,
51
+ ),
52
+ RegionEndpoint(
53
+ "US-WEST",
54
+ "West US",
55
+ "https://{resource}.openai.azure.com",
56
+ "California, US",
57
+ 2,
58
+ ),
59
+ RegionEndpoint(
60
+ "EU-WEST",
61
+ "West Europe",
62
+ "https://{resource}.openai.azure.com",
63
+ "Netherlands, NL",
64
+ 3,
65
+ ),
66
+ RegionEndpoint(
67
+ "EU-NORTH",
68
+ "North Europe",
69
+ "https://{resource}.openai.azure.com",
70
+ "Ireland, IE",
71
+ 4,
72
+ ),
73
+ ],
74
+ "alibaba": [
75
+ RegionEndpoint(
76
+ "SG",
77
+ "Singapore",
78
+ "https://dashscope-intl.aliyuncs.com/api/v1",
79
+ "Singapore, SG",
80
+ 1,
81
+ ),
82
+ RegionEndpoint(
83
+ "CN-EAST",
84
+ "China East",
85
+ "https://dashscope.aliyuncs.com/api/v1",
86
+ "Hangzhou, CN",
87
+ 2,
88
+ ),
89
+ ],
90
+ "moonshot": [
91
+ RegionEndpoint(
92
+ "US-WEST", "US West", "https://api.moonshot.ai/v1", "San Francisco, US", 1
93
+ ),
94
+ RegionEndpoint(
95
+ "CN-EAST", "China East", "https://api.moonshot.cn/v1", "Shanghai, CN", 2
96
+ ),
97
+ RegionEndpoint(
98
+ "CN-NORTH", "China North", "https://api.moonshot.cn/v1", "Beijing, CN", 3
99
+ ),
100
+ ],
101
+ "zai": [
102
+ RegionEndpoint(
103
+ "ASIA-PACIFIC",
104
+ "Asia Pacific",
105
+ "https://api.z.ai/api/paas/v4",
106
+ "Singapore, SG",
107
+ 1,
108
+ ),
109
+ ],
110
+ }
111
+
112
+ # Geographic region mappings
113
+ REGION_MAPPINGS = {
114
+ "US": ["US-EAST", "US-WEST", "US-CENTRAL", "US-NORTH", "US-SOUTH"],
115
+ "EU": ["EU-CENTRAL", "EU-WEST", "EU-NORTH", "EU-SOUTH", "EU-EAST"],
116
+ "CN": ["CN-EAST", "CN-NORTH", "CN-SOUTH", "CN-WEST", "CN-CENTRAL"],
117
+ "CH": ["CH-NORTH", "CH-SOUTH", "CH-EAST", "CH-WEST"],
118
+ "ASIA": ["ASIA-EAST", "ASIA-PACIFIC", "ASIA-SOUTH", "ASIA-CENTRAL"],
119
+ "GLOBAL": ["GLOBAL", "WORLDWIDE"],
120
+ }
121
+
122
+
123
+ def get_provider_regions(provider: str) -> List[RegionEndpoint]:
124
+ """Get all regions for a specific provider."""
125
+ return PROVIDER_REGIONS.get(provider.lower(), [])
126
+
127
+
128
+ def get_optimal_endpoint(provider: str, user_region: str = "US") -> Optional[str]:
129
+ """
130
+ Get the optimal endpoint for a provider based on user region.
131
+
132
+ Args:
133
+ provider: The provider name (e.g., 'openai', 'anthropic')
134
+ user_region: User's geographic region (US, EU, CN, CH, ASIA)
135
+
136
+ Returns:
137
+ The optimal endpoint URL or None if provider not found
138
+ """
139
+ regions = get_provider_regions(provider)
140
+ if not regions:
141
+ return None
142
+
143
+ # Map user region to provider regions
144
+ preferred_region_codes = REGION_MAPPINGS.get(user_region.upper(), [])
145
+
146
+ # Find the highest priority region that matches
147
+ for region_code in preferred_region_codes:
148
+ for region in regions:
149
+ if region.region_code == region_code:
150
+ return region.endpoint
151
+
152
+ # Fallback to first available region
153
+ return regions[0].endpoint if regions else None
154
+
155
+
156
+ def get_all_providers() -> List[str]:
157
+ """Get list of all supported providers."""
158
+ return list(PROVIDER_REGIONS.keys())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 2.15.0
3
+ Version: 2.16.0
4
4
  Summary: A new Python package called janito.
5
5
  Author-email: João Pinto <janito@ikignosis.org>
6
6
  Project-URL: Homepage, https://github.com/ikignosis/janito
@@ -9,7 +9,7 @@ janito/dir_walk_utils.py,sha256=ON9EyVH7Aaik8WtCH5z8DQis9ycdoNVkjNvU16HH498,1193
9
9
  janito/driver_events.py,sha256=51ab7KW_W6fVZVeO0ez-HJFY4NbTI327ZlEmEsEkxQc,3405
10
10
  janito/exceptions.py,sha256=l4AepRdWwAuLp5fUygrBBgO9rpwgfV6JvY1afOdq2pw,913
11
11
  janito/formatting.py,sha256=SMvOmL6bst3KGcI7OLa5D4DE127fQYuHZS3oY8OPsn8,2031
12
- janito/formatting_token.py,sha256=9Pz0svhV0pyNuGRXSmVkGDaQC8N-koTkf50AJR_gtSo,2217
12
+ janito/formatting_token.py,sha256=UefBF8Nn3BU8bJNQRrJWB3i3zXEwkRRZMPGuAOJaDYI,2440
13
13
  janito/gitignore_utils.py,sha256=P3iF9fMWAomqULq2xsoqHtI9uNIFSPcagljrxZshmLw,4110
14
14
  janito/mkdocs.yml,sha256=hceV1mnCuj5Eo42jJQHSAhqHC4emiMExgnISiiwqSow,925
15
15
  janito/perf_singleton.py,sha256=g1h0Sdf4ydzegeEpJlMhQt4H0GQZ2hryXrdYOTL-b30,113
@@ -28,7 +28,7 @@ janito/cli/__init__.py,sha256=xaPDOrWphBbCR63Xpcx_yfpXSJIlCaaICc4j2qpWqrM,194
28
28
  janito/cli/config.py,sha256=HkZ14701HzIqrvaNyDcDhGlVHfpX_uHlLp2rHmhRm_k,872
29
29
  janito/cli/console.py,sha256=gJolqzWL7jEPLxeuH-CwBDRFpXt976KdZOEAB2tdBDs,64
30
30
  janito/cli/main.py,sha256=s5odou0txf8pzTf1ADk2yV7T5m8B6cejJ81e7iu776U,312
31
- janito/cli/main_cli.py,sha256=figOoRlmegu6fyl-bmDbnYY5EQIcOEdJ6h2K6Qe1E7Q,14273
31
+ janito/cli/main_cli.py,sha256=21XPZ5Kp4ye2kEzkhcBtWe60Pe7XYAtzlZOf5RHNDuU,15280
32
32
  janito/cli/prompt_core.py,sha256=F68J4Xl6jZMYFN4oBBYZFj15Jp-HTYoLub4bw2XpNRU,11648
33
33
  janito/cli/prompt_handler.py,sha256=SnPTlL64noeAMGlI08VBDD5IDD8jlVMIYA4-fS8zVLg,215
34
34
  janito/cli/prompt_setup.py,sha256=1s5yccFaWMgDkUjkvnTYGEWJAFPJ6hIiqwbrLfzWxMI,2038
@@ -39,7 +39,7 @@ janito/cli/chat_mode/bindings.py,sha256=odjc5_-YW1t2FRhBUNRNoBMoQIg5sMz3ktV7xG0A
39
39
  janito/cli/chat_mode/chat_entry.py,sha256=RFdPd23jsA2DMHRacpjAdwI_1dFBaWrtnwyQEgb2fHA,475
40
40
  janito/cli/chat_mode/prompt_style.py,sha256=vsqQ9xxmrYjj1pWuVe9CayQf39fo2EIXrkKPkflSVn4,805
41
41
  janito/cli/chat_mode/script_runner.py,sha256=wOwEn4bgmjqHqjTqtfyaSOnRPsGf4ZVW-YAWhEeqxXU,6507
42
- janito/cli/chat_mode/session.py,sha256=o-Eh3oGAMpSdOj38xTubVi8_z3Pz3HUfGd-ZyeDlejw,13262
42
+ janito/cli/chat_mode/session.py,sha256=Dlb64LUeER8QEsWGYX0D664tcQjEn8Nx855dmk7vj4M,14903
43
43
  janito/cli/chat_mode/session_profile_select.py,sha256=CJ2g3VbPGWfBNrNkYYX57oIJZJ-hIZBNGB-zcdjC9vk,5379
44
44
  janito/cli/chat_mode/toolbar.py,sha256=bJ9jPaTInp2gB3yjSVJp8mpNEFiOslzNhVaiqpXJhKc,3025
45
45
  janito/cli/chat_mode/shell/autocomplete.py,sha256=lE68MaVaodbA2VfUM0_YLqQVLBJAE_BJsd5cMtwuD-g,793
@@ -73,10 +73,11 @@ janito/cli/chat_mode/shell/session/__init__.py,sha256=uTYE_QpZFEn7v9QE5o1LdulpCW
73
73
  janito/cli/chat_mode/shell/session/history.py,sha256=tYav6GgjAZkvWhlI_rfG6OArNqW6Wn2DTv39Hb20QYc,1262
74
74
  janito/cli/chat_mode/shell/session/manager.py,sha256=MwD9reHsRaly0CyRB-S1JJ0wPKz2g8Xdj2VvlU35Hgc,1001
75
75
  janito/cli/cli_commands/list_config.py,sha256=oiQEGaGPjwjG-PrOcakpNMbbqISTsBEs7rkGH3ceQsI,1179
76
- janito/cli/cli_commands/list_drivers.py,sha256=u7o0xk4V5iScC4iPM_a5rFIiRqHtCNZse4ilszAZ1B0,4715
76
+ janito/cli/cli_commands/list_drivers.py,sha256=8WhcVL4igdkyyeaxScsYZwqvDgfM_ZSaJgZ1BokjZUk,5056
77
77
  janito/cli/cli_commands/list_models.py,sha256=_rqHz89GsNLcH0GGkFqPue7ah4ZbN9YHm0lEP30Aa-A,1111
78
78
  janito/cli/cli_commands/list_profiles.py,sha256=9-HV2EbtP2AdubbMoakjbu7Oq4Ss9UDyO7Eb6CC52wI,2681
79
79
  janito/cli/cli_commands/list_providers.py,sha256=v8OQ8ULnuzNuvgkeKqGXGj69eOiavAlPGhzfR0zavhg,185
80
+ janito/cli/cli_commands/list_providers_region.py,sha256=qrMj_gtgEMty8UH0P_O5SgWCVJ9ZKxGUp_GdsE4_EH4,2548
80
81
  janito/cli/cli_commands/list_tools.py,sha256=JFRdlhPeA3BzhJ2PkjIt3u137IJoNc-vYSjUuPlaOXw,3593
81
82
  janito/cli/cli_commands/model_selection.py,sha256=ANWtwC5glZkGMdaNtARDbEG3QmuBUcDLVxzzC5jeBNo,1643
82
83
  janito/cli/cli_commands/model_utils.py,sha256=U0j2FTpcIBc4eAc40MXz5tyAK3m8lkakpOS2l2bGh4A,2868
@@ -85,21 +86,21 @@ janito/cli/cli_commands/show_config.py,sha256=eYMcuvU-d7mvvuctbQacZFERqcKHEnxaRR
85
86
  janito/cli/cli_commands/show_system_prompt.py,sha256=9ZJGW7lIGJ9LX2JZiWVEm4AbaD0qEQO7LF89jPgk52I,5232
86
87
  janito/cli/core/__init__.py,sha256=YH95fhgY9yBX8RgqX9dSrEkl4exjV0T4rbmJ6xUpG-Y,196
87
88
  janito/cli/core/event_logger.py,sha256=1X6lR0Ax7AgF8HlPWFoY5Ystuu7Bh4ooTo78vXzeGB0,2008
88
- janito/cli/core/getters.py,sha256=glUtg8K_q0vMAaLG91J9JRq5f26nJLGbDVghSNx9s28,2050
89
+ janito/cli/core/getters.py,sha256=qk1wO9f77gKOJB2dsqDMv2DgcKT3KE1VPL8-pxv7yys,2335
89
90
  janito/cli/core/model_guesser.py,sha256=jzkkiQ-J2buT2Omh6jYZHa8-zCJxqKQBL08Z58pe1_o,1741
90
91
  janito/cli/core/runner.py,sha256=3vP92XEUzzHeOWbMHg82iISsXVUAM7y8YKWGNSIMyA8,8337
91
92
  janito/cli/core/setters.py,sha256=PD3aT1y1q8XWQVtRNfrU0dtlW4JGdn6BMJyP7FCQWhc,4623
92
93
  janito/cli/core/unsetters.py,sha256=FEw9gCt0vRvoCt0kRSNfVB2tzi_TqppJIx2nHPP59-k,2012
93
94
  janito/cli/single_shot_mode/__init__.py,sha256=Ct99pKe9tINzVW6oedZJfzfZQKWpXz-weSSCn0hrwHY,115
94
- janito/cli/single_shot_mode/handler.py,sha256=U70X7c9MHbmj1vQlTI-Ao2JvRprpLbPh9wL5gAMbEhs,3790
95
+ janito/cli/single_shot_mode/handler.py,sha256=uZ3iYy6TJqdujAB6B0GEb_mrWUz_JMXckzt5n7FGzgk,5405
95
96
  janito/docs/GETTING_STARTED.md,sha256=EbXV7B3XxjSy1E0XQJFOVITVbTmZBVB7pjth2Mb4_rg,2835
96
97
  janito/drivers/dashscope.bak.zip,sha256=9Pv4Xyciju8jO1lEMFVgYXexoZkxmDO3Ig6vw3ODfL8,4936
97
98
  janito/drivers/openai_responses.bak.zip,sha256=E43eDCHGa2tCtdjzj_pMnWDdnsOZzj8BJTR5tJp8wcM,13352
98
- janito/drivers/azure_openai/driver.py,sha256=rec2D4DDuMjdnbGNIsrnB0oiwuxL_zBykJeUGa-PffI,4074
99
+ janito/drivers/azure_openai/driver.py,sha256=L2rQOl1d0BHaDChHLtZszAeuWNoyYIgwuYuahE1qJps,4152
99
100
  janito/drivers/openai/README.md,sha256=bgPdaYX0pyotCoJ9t3cJbYM-teQ_YM1DAFEKLCMP32Q,666
100
- janito/drivers/openai/driver.py,sha256=O0AAp-aF3TKQLp_FSsRWm_QDG_mKliLlpDjf09fWzl4,19061
101
+ janito/drivers/openai/driver.py,sha256=ITwonFiux8pVIlCuD9jy1og3sGc-rHH2_LQFRHZvBRc,19152
101
102
  janito/drivers/zai/__init__.py,sha256=rleES3ZJEslJ8M02TdTPyxHKXxA4-e2fDJa6yjuzY8s,22
102
- janito/drivers/zai/driver.py,sha256=YqdOBMltsjWq8nFttW61wSVpppS-YQh_F-nhVdIvZ_o,19245
103
+ janito/drivers/zai/driver.py,sha256=uOR7VFEMjd7Dw_zSFO1SN5SgBCIG8b4CEzRMIUXBgUQ,18859
103
104
  janito/event_bus/__init__.py,sha256=VG6GOhKMBh0O_92D-zW8a3YitJPKDajGgPiFezTXlNE,77
104
105
  janito/event_bus/bus.py,sha256=LokZbAdwcWhWOyKSp7H3Ism57x4EZhxlRPjl3NE4UKU,2847
105
106
  janito/event_bus/event.py,sha256=MtgcBPD7cvCuubiLIyo-BWcsNSO-941HLk6bScHTJtQ,427
@@ -112,6 +113,7 @@ janito/llm/README.md,sha256=6GRqCu_a9va5HCB1YqNqbshyWKFyAGlnXugrjom-xj8,1213
112
113
  janito/llm/__init__.py,sha256=dpyVH51qVRCw-PDyAFLAxq0zd4jl5MDcuV6Cri0D-dQ,134
113
114
  janito/llm/agent.py,sha256=JE59p1YSnB-KnCI8kHIcqcxTY30MlMVZ_RzzDM4KiD4,20735
114
115
  janito/llm/auth.py,sha256=8Dl_orUEPhn2X6XjkO2Nr-j1HFT2YDxk1qJl9hSFI88,2286
116
+ janito/llm/auth_utils.py,sha256=7GH7bIScKhVWJW6ugcDrJLcYRamj5dl_l8N1rrvR4Ws,663
115
117
  janito/llm/driver.py,sha256=stiicPe_MXTuWW4q6MSwK7PCj8UZcA_30pGACu6xYUQ,10039
116
118
  janito/llm/driver_config.py,sha256=OW0ae49EfgKDqaThuDjZBiaN78voNzwiZ6szERMqJos,1406
117
119
  janito/llm/driver_config_builder.py,sha256=BvWGx7vaBR5NyvPY1XNAP3lAgo1uf-T25CSsIo2kkCU,1401
@@ -124,28 +126,32 @@ janito/providers/dashscope.bak.zip,sha256=BwXxRmZreEivvRtmqbr5BR62IFVlNjAf4y6DrF
124
126
  janito/providers/registry.py,sha256=Ygwv9eVrTXOKhv0EKxSWQXO5WMHvajWE2Q_Lc3p7dKo,730
125
127
  janito/providers/alibaba/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
128
  janito/providers/alibaba/model_info.py,sha256=evAW2CZUX9qgRAzDhZTp47ZNj4G1T7W66gkV60Nfan8,1264
127
- janito/providers/alibaba/provider.py,sha256=JOkR0pKCpuG1z5KQ35TaEw6Egfp7g1gU7XiT8aeZp-0,4304
129
+ janito/providers/alibaba/provider.py,sha256=wB8wJEro4ao7osLJyZqd6jpuiTpfbpVTeGEmgZsnWDM,4220
128
130
  janito/providers/anthropic/model_info.py,sha256=m6pBh0Ia8_xC1KZ7ke_4HeHIFw7nWjnYVItnRpkCSWc,1206
129
- janito/providers/anthropic/provider.py,sha256=JS74pDs7gSpwvG0jY-MDO5rljO0JJOffSjaL1LK1YlE,3165
131
+ janito/providers/anthropic/provider.py,sha256=aGynBxCFc7oTyvGNDUkbutJCKurC_9J4AkReC2LTPYo,3023
130
132
  janito/providers/azure_openai/model_info.py,sha256=TMSqEpQROIIYUGAyulYJ5xGhj7CbLoaKL_JXeLbXaG0,689
131
- janito/providers/azure_openai/provider.py,sha256=lWqHI1JG5c2wl24qFVZwdIW3lBjDwrxAHwskjOGCeWQ,5546
133
+ janito/providers/azure_openai/provider.py,sha256=3pUYcdHrIcK1N1Pmw96tJvFo4lVse2wfZhGS9D2N3dw,5404
132
134
  janito/providers/deepseek/__init__.py,sha256=4sISEpq4bJO29vxFK9cfnO-SRUmKoD7oSdeCvz0hVno,36
133
135
  janito/providers/deepseek/model_info.py,sha256=tAlFRtWiyNF_MKZ1gy5_-VNlvqoIwAinv6bAv9dNFsc,465
134
- janito/providers/deepseek/provider.py,sha256=I78wI27Kon4pyTZuO5knhvYejfE1xZysnr36fv_EolQ,4260
136
+ janito/providers/deepseek/provider.py,sha256=eU-wwVqJog_oJ8VyQyohm6OMHlvrddSszqTfT9Aoc-U,4106
135
137
  janito/providers/google/__init__.py,sha256=hE3OGJvLEhvNLhIK_XmCGIdrIj8MKlyGgdOLJ4mdess,38
136
138
  janito/providers/google/model_info.py,sha256=AakTmzvWm1GPvFzGAq6-PeE_Dpq7BmAAqmh3L8N5KKo,1126
137
- janito/providers/google/provider.py,sha256=4oEaaqFUlGKIw4yTd_0tVWdpAx3QDEIP6cRwmVKDp-I,3760
139
+ janito/providers/google/provider.py,sha256=NQVG5kovHOc2SDgWjVIwYGMqshvMUAqRAk9iMntQ52k,3606
138
140
  janito/providers/moonshotai/__init__.py,sha256=nThTAtynq4O2Iidm95daKOCKXi5APRJYtRK2Wr3SDpM,31
139
141
  janito/providers/moonshotai/model_info.py,sha256=MpPAB3tZVvZ8V7tZsiJpk5SReHjVcnwwbp63aUebx9Y,718
140
- janito/providers/moonshotai/provider.py,sha256=e3tU6QSPwaquPqSzO4f1HTe3_4eOFB092CSzmoFU8QQ,3984
142
+ janito/providers/moonshotai/provider.py,sha256=Lynw2cAF0IA9QPIRN4oY6Yr0cEwyVggpaQQrmkcgHuE,3874
141
143
  janito/providers/openai/__init__.py,sha256=f0m16-sIqScjL9Mp4A0CQBZx6H3PTEy0cnE08jeaB5U,38
142
144
  janito/providers/openai/model_info.py,sha256=cz08O26Ychm-aP3T8guJRqpR96Im9Cwtgl2iMgM7tJs,3384
143
- janito/providers/openai/provider.py,sha256=U9Bp9g2KQ58J6-B5vDgsXM05xASsgaWQOofewC7hiXs,5145
145
+ janito/providers/openai/provider.py,sha256=nEYTj-NF9BLc-uQ25QpxaFBLVtJ0GEGFgc22SlTTLJA,4727
144
146
  janito/providers/openai/schema_generator.py,sha256=hTqeLcPTR8jeKn5DUUpo7b-EZ-V-g1WwXiX7MbHnFzE,2234
145
147
  janito/providers/zai/__init__.py,sha256=qtIr9_QBFaXG8xB6cRDGhS7se6ir11CWseI9azLMRBo,24
146
148
  janito/providers/zai/model_info.py,sha256=ldwD8enpxXv1G-YsDw4YJn31YsVueQ4vj5HgoYvnPxo,1183
147
- janito/providers/zai/provider.py,sha256=x_W4sTagE_MWOT8e_-M_wJ5Uq8wFKQRVRQfBT_vTUsQ,5413
149
+ janito/providers/zai/provider.py,sha256=aKqDTdcwWk-FT70wTbTrTzlWx2NwRWkLoB64upiliU8,5066
148
150
  janito/providers/zai/schema_generator.py,sha256=0kuxbrWfNKGO9fzxFStqOpTT09ldyI6vYxeDxFN4ku8,4091
151
+ janito/regions/__init__.py,sha256=DVUiWPXGKX73tj3PJcLJXdQTwhiYWlcWPNpPcNNeYhk,484
152
+ janito/regions/cli.py,sha256=dFiHj1XxqhegqK1kFz-08QpYgiYniEi_ZQiDqjyUaJs,3612
153
+ janito/regions/geo_utils.py,sha256=nLJ2x0tx1xMNI0_cMEiji-X8denynsaPYmXR9gGg8uk,5908
154
+ janito/regions/provider_regions.py,sha256=QJdbsdgjg-WcTRqPLGtm3pHJAm2o0-Y9MgE_vNzENEk,4619
149
155
  janito/tools/DOCSTRING_STANDARD.txt,sha256=VLPwNgjxRVD_xZSSVvUZ4H-4bBwM-VKh_RyfzYQsYSs,1735
150
156
  janito/tools/README.md,sha256=5HkLpF5k4PENJER7SlDPRXj0yo9mpHvAHW4uuzhq4ak,115
151
157
  janito/tools/__init__.py,sha256=W1B39PztC2UF7PS2WyLH6el32MFOETMlN1-LurOROCg,1171
@@ -207,9 +213,9 @@ janito/tools/adapters/local/validate_file_syntax/ps1_validator.py,sha256=TeIkPt0
207
213
  janito/tools/adapters/local/validate_file_syntax/python_validator.py,sha256=BfCO_K18qy92m-2ZVvHsbEU5e11OPo1pO9Vz4G4616E,130
208
214
  janito/tools/adapters/local/validate_file_syntax/xml_validator.py,sha256=AijlsP_PgNuC8ZbGsC5vOTt3Jur76otQzkd_7qR0QFY,284
209
215
  janito/tools/adapters/local/validate_file_syntax/yaml_validator.py,sha256=TgyI0HRL6ug_gBcWEm5TGJJuA4E34ZXcIzMpAbv3oJs,155
210
- janito-2.15.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
211
- janito-2.15.0.dist-info/METADATA,sha256=oTUyBgKHJx3XuGb160vrBQIph_KJ75KFs1m7YyR2Yf8,16365
212
- janito-2.15.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
213
- janito-2.15.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
214
- janito-2.15.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
215
- janito-2.15.0.dist-info/RECORD,,
216
+ janito-2.16.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
217
+ janito-2.16.0.dist-info/METADATA,sha256=R3XPF2v8VmjybUFGs6ReYnItEfJk5kblKsSOjY7LvEo,16365
218
+ janito-2.16.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
219
+ janito-2.16.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
220
+ janito-2.16.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
221
+ janito-2.16.0.dist-info/RECORD,,