janito 2.19.0__py3-none-any.whl → 2.20.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.
@@ -2,8 +2,8 @@
2
2
  CLI Command: List models for the specified/current provider
3
3
  """
4
4
 
5
- from janito.cli.cli_commands.model_utils import _print_models_table
6
5
  import sys
6
+ from janito.cli.cli_commands.model_utils import _print_models_table
7
7
 
8
8
  _provider_instance = None
9
9
 
@@ -36,8 +36,6 @@ def handle_list_models(args, provider_instance):
36
36
 
37
37
  for m in models:
38
38
  table.add_row(str(m))
39
-
40
- import sys
41
39
  if sys.stdout.isatty():
42
40
  shared_console.print(table)
43
41
  else:
@@ -64,14 +64,20 @@ class OpenAIModelDriver(LLMDriver):
64
64
  if config.model:
65
65
  api_kwargs["model"] = config.model
66
66
  # Prefer max_completion_tokens if present, else fallback to max_tokens (for backward compatibility)
67
- if (
68
- hasattr(config, "max_completion_tokens")
69
- and config.max_completion_tokens is not None
70
- ):
71
- api_kwargs["max_completion_tokens"] = int(config.max_completion_tokens)
67
+ # Skip max_completion_tokens for Mistral as their API doesn't support it
68
+ is_mistral = config.base_url and "mistral.ai" in str(config.base_url)
69
+ if not is_mistral:
70
+ if (
71
+ hasattr(config, "max_completion_tokens")
72
+ and config.max_completion_tokens is not None
73
+ ):
74
+ api_kwargs["max_completion_tokens"] = int(config.max_completion_tokens)
75
+ elif hasattr(config, "max_tokens") and config.max_tokens is not None:
76
+ # For models that do not support 'max_tokens', map to 'max_completion_tokens'
77
+ api_kwargs["max_completion_tokens"] = int(config.max_tokens)
72
78
  elif hasattr(config, "max_tokens") and config.max_tokens is not None:
73
- # For models that do not support 'max_tokens', map to 'max_completion_tokens'
74
- api_kwargs["max_completion_tokens"] = int(config.max_tokens)
79
+ # For Mistral, use max_tokens directly
80
+ api_kwargs["max_tokens"] = int(config.max_tokens)
75
81
  for p in (
76
82
  "temperature",
77
83
  "top_p",
janito/i18n/it.py ADDED
@@ -0,0 +1,46 @@
1
+ # pragma: allowlist secret
2
+ translations = {
3
+ "36107ed78ab25f6fb12ad8ce13018cd1ce6735d1": "Avvio del server web...",
4
+ "70a0d194687568a47aa617fd85036ace1e69a982": "Vuoi davvero uscire? (s/n): ",
5
+ "5c9ebcbbd7632ecb328bd52958b17158afaa32c6": "F12 = Azione Rapida (segue l'azione raccomandata)",
6
+ "fe21121e2934234b68d19b2757532117d440c1e3": "Chiave API non trovata. Si prega di configurare 'api_key' nel file di configurazione.",
7
+ "c9e3759b1756eba35b381ce2b72cd659e132b01f": "Ciao, {name}!",
8
+ "ca1fee2f55baabdc2e4b0e9529c89ee024e62079": "Nessun prompt fornito nei messaggi",
9
+ "f7449d23d0c500ae2a0b31e04f92b47a4d8ae845": "max_tokens deve essere un intero, ricevuto: {resolved_max_tokens!r}",
10
+ "70a9ed8edb6da12e208431a31aa16ba54419b26f": "Risposta non valida/malformed da OpenAI (tentativo {attempt}/{max_retries}). Riprovo tra {wait_time} secondi...",
11
+ "a873085e3b06184fb5d27e842f97b06b6190976d": "Numero massimo di tentativi per risposta non valida raggiunto. Generazione errore.",
12
+ "66a34568bbe846bb1bde3619eb4d6dfa10211104": "L'API non supporta l'uso degli strumenti.",
13
+ "09b81476b75586da4116b83f8be70d77b174cec3": "Limite di richieste API OpenAI (429) (tentativo {attempt}/{max_retries}): {e}. Riprovo tra {wait_time} secondi...",
14
+ "5717a35dd2a1533fb7e15edc8c9329cb69f3410b": "Errore server API OpenAI (tentativo {attempt}/{max_retries}): {e}. Riprovo tra {wait_time} secondi...",
15
+ "02e760ba15ed863176c1290ac8a9b923963103cd": "Errore client API OpenAI {status_code}: {e}. Nessun nuovo tentativo.",
16
+ "2e52b0bbc8f16226b70e3e20f95c9245d2bcdb47": "Errore API OpenAI (tentativo {attempt}/{max_retries}): {e}. Riprovo tra {wait_time} secondi...",
17
+ "012cc970e039fdd79c452fc676202c814ffc76ae": "Numero massimo di tentativi per errore API OpenAI raggiunto. Generazione errore.",
18
+ "d0438e45667d31e0022b2497b5901cd4300f084b": "QueuedMessageHandler.handle_message si aspetta un dizionario con 'type' e 'message', ricevuto {msg_type}: {msg!r}",
19
+ "9d3460187ffa19c7c8a4020157072b1087e1bd2f": "[QueuedMessageHandler] {msg_type}: {msg}",
20
+ "3813833343430e8afa8fce33385c5e39fb24dd60": "[QueuedMessageHandler] {msg_type}: {message}",
21
+ "0be9a22226e16a40797010d23a0f581542dca40e": "[ToolExecutor] {tool_name} chiamato con argomenti: {args}",
22
+ "42c68edcb25442f518b1af77c6a2ddc07461aae0": "[ToolExecutor] Motivo chiamata: {tool_call_reason}",
23
+ "002ff598115d84595ffeee6219cb5c03d3a1d4a6": "Domanda",
24
+ "35747d13dcd91e8e8790c7f767d5ed764f541b9e": "procedi",
25
+ "33dde3a1afbc418768a69fa53168d9b0638fe1aa": "avanti",
26
+ "eee0bbba4ff92adbeb038a77df0466d660f15716": "continua",
27
+ "edee9402d198b04ac77dcf5dc9cc3dac44573782": "prossimo",
28
+ "8fdb7e2fa84f4faf0d9b92f466df424ec47a165b": "ok",
29
+ "5f8f924671cda79b5205a6bf1b776f347c4a7a07": "Opzioni di configurazione disponibili:\n",
30
+ "cef780a309cd234750764d42697882c24168ddab": "{key:15} {desc} (predefinito: {default})",
31
+ "68c2cc7f0ceaa3e499ecb4db331feb4debbbcc23": "Modello",
32
+ "c3f104d1365744b538bfde9f4adb6a6df4b80355": "Funzione",
33
+ "99a0efc6cfd85d8ff2732a6718140f822cb90472": "Stile",
34
+ "f1702b4686278becffc88baabe6f4b7a8355532c": "Messaggi",
35
+ "c38c6c1f3a2743f8626703abb302e403d20ff81c": "Token",
36
+ "a817d7eb8e0f1dab755ab5203a082e5c3c094fce": "Prompt",
37
+ "2ff255684a2277f806fcebf3fe338ed27857f350": "Completamento",
38
+ "b25928c69902557b0ef0a628490a3a1768d7b82f": "Totale",
39
+ "76e63d65c883ed50df40ac3aeef0c2d6a1c4ad60": "Azione Rapida",
40
+ "5397e0583f14f6c88de06b1ef28f460a1fb5b0ae": "Sì",
41
+ "816c52fd2bdd94a63cd0944823a6c0aa9384c103": "No",
42
+ "c47ae15370cfe1ed2781eedc1dc2547d12d9e972": "Aiuto",
43
+ "cc3dbd47e1cf9003a55d3366b3adbcd72275e525": "Nuovo Task",
44
+ "efa5a8b84e1afe65c81ecfce28c398c48f19ddc2": "Benvenuto su Janito{version_str}! Modalità chat attiva. Digita /exit per uscire.",
45
+ "b314d6e1460f86e0f21abc5aceb7935a2a0667e8": "Benvenuto su Janito{version_str} in modalità [white on magenta]VANILLA[/white on magenta]! Strumenti, prompt di sistema e temperatura sono disattivati, a meno che non siano sovrascritti.",
46
+ }
@@ -39,7 +39,17 @@ class ProviderRegistry:
39
39
  if len(info) == 4 and info[3]:
40
40
  continue # skip providers flagged as not implemented
41
41
  rows.append(info[:3])
42
- rows.sort(key=self._maintainer_sort_key)
42
+
43
+ # Group providers by openness (open-source first, then proprietary)
44
+ open_providers = {'cerebras', 'deepseek', 'alibaba', 'moonshotai', 'zai'}
45
+
46
+ def sort_key(row):
47
+ provider_name = row[0]
48
+ is_open = provider_name in open_providers
49
+ # Sort open providers alphabetically first, then proprietary alphabetically
50
+ return (not is_open, provider_name)
51
+
52
+ rows.sort(key=sort_key)
43
53
  return rows
44
54
 
45
55
  def _add_rows_to_table(self, table, rows):
@@ -8,3 +8,4 @@ import janito.providers.moonshotai.provider
8
8
  import janito.providers.alibaba.provider
9
9
  import janito.providers.zai.provider
10
10
  import janito.providers.cerebras.provider
11
+ import janito.providers.mistral.provider
@@ -0,0 +1 @@
1
+ # Codestral provider module
@@ -0,0 +1,81 @@
1
+ from janito.llm.model import LLMModelInfo
2
+
3
+ MODEL_SPECS = {
4
+ "codestral-latest": LLMModelInfo(
5
+ name="codestral-latest",
6
+ context=256000,
7
+ max_input=250000,
8
+ max_cot="N/A",
9
+ max_response=4096,
10
+ thinking_supported=False,
11
+ default_temp=0.2,
12
+ open="mistral",
13
+ driver="OpenAIModelDriver",
14
+ ),
15
+ "codestral-2405": LLMModelInfo(
16
+ name="codestral-2405",
17
+ context=256000,
18
+ max_input=250000,
19
+ max_cot="N/A",
20
+ max_response=4096,
21
+ thinking_supported=False,
22
+ default_temp=0.2,
23
+ open="mistral",
24
+ driver="OpenAIModelDriver",
25
+ ),
26
+ "mistral-small-latest": LLMModelInfo(
27
+ name="mistral-small-latest",
28
+ context=32000,
29
+ max_input=28000,
30
+ max_cot="N/A",
31
+ max_response=4096,
32
+ thinking_supported=False,
33
+ default_temp=0.7,
34
+ open="mistral",
35
+ driver="OpenAIModelDriver",
36
+ ),
37
+ "mistral-medium-latest": LLMModelInfo(
38
+ name="mistral-medium-latest",
39
+ context=32000,
40
+ max_input=28000,
41
+ max_cot="N/A",
42
+ max_response=4096,
43
+ thinking_supported=False,
44
+ default_temp=0.7,
45
+ open="mistral",
46
+ driver="OpenAIModelDriver",
47
+ ),
48
+ "mistral-large-latest": LLMModelInfo(
49
+ name="mistral-large-latest",
50
+ context=128000,
51
+ max_input=120000,
52
+ max_cot="N/A",
53
+ max_response=4096,
54
+ thinking_supported=False,
55
+ default_temp=0.7,
56
+ open="mistral",
57
+ driver="OpenAIModelDriver",
58
+ ),
59
+ "devstral-small-latest": LLMModelInfo(
60
+ name="devstral-small-latest",
61
+ context=128000,
62
+ max_input=120000,
63
+ max_cot="N/A",
64
+ max_response=4096,
65
+ thinking_supported=False,
66
+ default_temp=0.7,
67
+ open="mistral",
68
+ driver="OpenAIModelDriver",
69
+ ),
70
+ "devstral-medium-latest": LLMModelInfo(
71
+ name="devstral-medium-latest",
72
+ context=128000,
73
+ max_input=120000,
74
+ max_cot="N/A",
75
+ max_response=4096,
76
+ thinking_supported=False,
77
+ default_temp=0.7,
78
+ open="mistral",
79
+ driver="OpenAIModelDriver",
80
+ ),
81
+ }
@@ -0,0 +1,124 @@
1
+ from janito.llm.provider import LLMProvider
2
+ from janito.llm.model import LLMModelInfo
3
+ from janito.llm.auth import LLMAuthManager
4
+ from janito.llm.driver_config import LLMDriverConfig
5
+ from janito.drivers.openai.driver import OpenAIModelDriver
6
+ from janito.tools import get_local_tools_adapter
7
+ from janito.providers.registry import LLMProviderRegistry
8
+ from .model_info import MODEL_SPECS
9
+
10
+ available = OpenAIModelDriver.available
11
+ unavailable_reason = OpenAIModelDriver.unavailable_reason
12
+
13
+
14
+ class MistralProvider(LLMProvider):
15
+ name = "mistral"
16
+ NAME = "mistral"
17
+ MAINTAINER = "João Pinto <janito@ikignosis.org>"
18
+ MODEL_SPECS = MODEL_SPECS
19
+ DEFAULT_MODEL = "mistral-large-latest"
20
+
21
+ def __init__(
22
+ self, auth_manager: LLMAuthManager = None, config: LLMDriverConfig = None
23
+ ):
24
+ self._tools_adapter = get_local_tools_adapter()
25
+ self._driver = None
26
+
27
+ if not self.available:
28
+ return
29
+
30
+ self._initialize_config(auth_manager, config)
31
+ self._setup_model_config()
32
+
33
+ def _initialize_config(self, auth_manager, config):
34
+ """Initialize configuration and API key."""
35
+ self.auth_manager = auth_manager or LLMAuthManager()
36
+ self._api_key = self.auth_manager.get_credentials(type(self).NAME)
37
+ if not self._api_key:
38
+ from janito.llm.auth_utils import handle_missing_api_key
39
+
40
+ handle_missing_api_key(self.name, "MISTRAL_API_KEY")
41
+
42
+ self._driver_config = config or LLMDriverConfig(model=None)
43
+ if not self._driver_config.model:
44
+ self._driver_config.model = self.DEFAULT_MODEL
45
+ if not self._driver_config.api_key:
46
+ self._driver_config.api_key = self._api_key
47
+
48
+ # Set Mistral-specific base URL
49
+ self._driver_config.base_url = "https://api.mistral.ai/v1"
50
+
51
+ def _setup_model_config(self):
52
+ """Configure token limits based on model specifications."""
53
+ model_name = self._driver_config.model
54
+ model_spec = self.MODEL_SPECS.get(model_name)
55
+
56
+ # Reset token parameters
57
+ if hasattr(self._driver_config, "max_tokens"):
58
+ self._driver_config.max_tokens = None
59
+ if hasattr(self._driver_config, "max_completion_tokens"):
60
+ self._driver_config.max_completion_tokens = None
61
+
62
+ if model_spec:
63
+ if getattr(model_spec, "thinking_supported", False):
64
+ max_cot = getattr(model_spec, "max_cot", None)
65
+ if max_cot and max_cot != "N/A":
66
+ self._driver_config.max_tokens = int(max_cot)
67
+ else:
68
+ max_response = getattr(model_spec, "max_response", None)
69
+ if max_response and max_response != "N/A":
70
+ self._driver_config.max_tokens = int(max_response)
71
+
72
+ self.fill_missing_device_info(self._driver_config)
73
+
74
+ @property
75
+ def driver(self) -> OpenAIModelDriver:
76
+ if not self.available:
77
+ raise ImportError(f"MistralProvider unavailable: {self.unavailable_reason}")
78
+ return self._driver
79
+
80
+ @property
81
+ def available(self):
82
+ return available
83
+
84
+ @property
85
+ def unavailable_reason(self):
86
+ return unavailable_reason
87
+
88
+ def create_driver(self):
89
+ """
90
+ Creates and returns a new OpenAIModelDriver instance with input/output queues.
91
+ """
92
+ driver = OpenAIModelDriver(
93
+ tools_adapter=self._tools_adapter, provider_name=self.NAME
94
+ )
95
+ driver.config = self._driver_config
96
+ # NOTE: The caller is responsible for calling driver.start() if background processing is needed.
97
+ return driver
98
+
99
+ def create_agent(self, tools_adapter=None, agent_name: str = None, **kwargs):
100
+ from janito.llm.agent import LLMAgent
101
+
102
+ # Always create a new driver with the passed-in tools_adapter
103
+ if tools_adapter is None:
104
+ tools_adapter = get_local_tools_adapter()
105
+ # Should use new-style driver construction via queues/factory (handled elsewhere)
106
+ raise NotImplementedError(
107
+ "create_agent must be constructed via new factory using input/output queues and config."
108
+ )
109
+
110
+ @property
111
+ def model_name(self):
112
+ return self._driver_config.model
113
+
114
+ @property
115
+ def driver_config(self):
116
+ """Public, read-only access to the provider's LLMDriverConfig object."""
117
+ return self._driver_config
118
+
119
+ def execute_tool(self, tool_name: str, event_bus, *args, **kwargs):
120
+ self._tools_adapter.event_bus = event_bus
121
+ return self._tools_adapter.execute_by_name(tool_name, *args, **kwargs)
122
+
123
+
124
+ LLMProviderRegistry.register(MistralProvider.NAME, MistralProvider)
janito/report_events.py CHANGED
@@ -14,6 +14,7 @@ class ReportSubtype(Enum):
14
14
  PROGRESS = "progress"
15
15
 
16
16
 
17
+
17
18
  class ReportAction(Enum):
18
19
  READ = "READ"
19
20
  CREATE = "CREATE"
@@ -39,17 +39,11 @@ class RunPowershellCommandTool(ToolBase):
39
39
  ReportAction.EXECUTE,
40
40
  )
41
41
  if require_confirmation:
42
- confirmed = self.ask_user_confirmation(
43
- tr(
44
- "About to run PowerShell command: {command}\nContinue?",
45
- command=command,
46
- )
42
+ self.report_warning(
43
+ tr("⚠️ Confirmation requested, but no handler (auto-confirmed)."),
44
+ ReportAction.USER_INPUT
47
45
  )
48
- if not confirmed:
49
- self.report_warning(
50
- tr("⚠️ Execution cancelled by user."), ReportAction.EXECUTE
51
- )
52
- return False
46
+ return True # Auto-confirm for now
53
47
  return True
54
48
 
55
49
  def _launch_process(self, shell_exe, command_with_encoding):
@@ -143,10 +137,7 @@ class RunPowershellCommandTool(ToolBase):
143
137
  tr("🖥️ Running PowerShell command: {command} ...\n", command=command),
144
138
  ReportAction.EXECUTE,
145
139
  )
146
- if not self._confirm_and_warn(
147
- command, require_confirmation, requires_user_input
148
- ):
149
- return tr("❌ Command execution cancelled by user.")
140
+ self._confirm_and_warn(command, require_confirmation, requires_user_input)
150
141
  from janito.platform_discovery import PlatformDiscovery
151
142
 
152
143
  pd = PlatformDiscovery()
janito/tools/tool_base.py CHANGED
@@ -112,3 +112,5 @@ class ToolBase:
112
112
 
113
113
  def run(self, *args, **kwargs):
114
114
  raise NotImplementedError("Subclasses must implement the run method.")
115
+
116
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 2.19.0
3
+ Version: 2.20.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
@@ -16,8 +16,8 @@ janito/perf_singleton.py,sha256=g1h0Sdf4ydzegeEpJlMhQt4H0GQZ2hryXrdYOTL-b30,113
16
16
  janito/performance_collector.py,sha256=RYu4av16Trj3RljJZ8-2Gbn1KlGdJUosrcVFYtwviNI,6285
17
17
  janito/platform_discovery.py,sha256=JN3kC7hkxdvuj-AyrJTlbbDJjtNHke3fdlZDqGi_uz0,4621
18
18
  janito/provider_config.py,sha256=acn2FEgWsEIyi2AxZiuCLoP2rXDd-nXcP5VB4CZHaeE,3189
19
- janito/provider_registry.py,sha256=l0jJZ74KIebOSYXPiy7uqH8d48pckR_WTyAO4iQF98o,6571
20
- janito/report_events.py,sha256=q4OR_jTZNfcqaQF_fzTjgqo6_VlUIxSGWfhpT4nJWcw,938
19
+ janito/provider_registry.py,sha256=Qh2ujKjaa5HZmr7YOHxUy983jSDaCD-AXaZFBVC85XY,7001
20
+ janito/report_events.py,sha256=m72U9TQfbQfKcCDT8O4nYhVI6IFfQQG1ZXQa3Vhq0y4,940
21
21
  janito/shell.bak.zip,sha256=hznHbmgfkAkjuQDJ3w73XPQh05yrtUZQxLmtGbanbYU,22
22
22
  janito/utils.py,sha256=eXSsMgM69YyzahgCNrJQLcEbB8ssLI1MQqaa20ONxbE,376
23
23
  janito/agent/setup_agent.py,sha256=HQU_h1P8VXiOVURjQ4SwvO-R3rujs6xUcPvrNniRDok,11618
@@ -74,7 +74,7 @@ janito/cli/chat_mode/shell/session/history.py,sha256=tYav6GgjAZkvWhlI_rfG6OArNqW
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
76
  janito/cli/cli_commands/list_drivers.py,sha256=r2ENykUcvf_9XYp6LHd3RvLXGXyVUA6oe_Pr0dyv92I,5124
77
- janito/cli/cli_commands/list_models.py,sha256=DAXH9CT3Q4krJ_NlrXseCGsc4WECYeJSGX6z0ks8_uA,1661
77
+ janito/cli/cli_commands/list_models.py,sha256=7Cyjfwht77nm6_h1DRY2A-Nkkm1Kiy0e339EYglVqEI,1619
78
78
  janito/cli/cli_commands/list_profiles.py,sha256=9-HV2EbtP2AdubbMoakjbu7Oq4Ss9UDyO7Eb6CC52wI,2681
79
79
  janito/cli/cli_commands/list_providers.py,sha256=3ywm1Ohv7yVqV1E9hB-3Jz8BwzhyCScKxffq6iDI4nA,391
80
80
  janito/cli/cli_commands/list_providers_region.py,sha256=qrMj_gtgEMty8UH0P_O5SgWCVJ9ZKxGUp_GdsE4_EH4,2548
@@ -100,7 +100,7 @@ janito/drivers/openai_responses.bak.zip,sha256=E43eDCHGa2tCtdjzj_pMnWDdnsOZzj8BJ
100
100
  janito/drivers/azure_openai/driver.py,sha256=L2rQOl1d0BHaDChHLtZszAeuWNoyYIgwuYuahE1qJps,4152
101
101
  janito/drivers/cerebras/__init__.py,sha256=yGkKANI4xKT_2j6x1-RBJhmaRzEGyt1DFaBSLt7EtYU,25
102
102
  janito/drivers/openai/README.md,sha256=bgPdaYX0pyotCoJ9t3cJbYM-teQ_YM1DAFEKLCMP32Q,666
103
- janito/drivers/openai/driver.py,sha256=ITwonFiux8pVIlCuD9jy1og3sGc-rHH2_LQFRHZvBRc,19152
103
+ janito/drivers/openai/driver.py,sha256=NbR_1Btr7QpJjNzJ3CxJa1-Kfw17lImZFU9fyKDLSRo,19567
104
104
  janito/drivers/zai/__init__.py,sha256=rleES3ZJEslJ8M02TdTPyxHKXxA4-e2fDJa6yjuzY8s,22
105
105
  janito/drivers/zai/driver.py,sha256=uOR7VFEMjd7Dw_zSFO1SN5SgBCIG8b4CEzRMIUXBgUQ,18859
106
106
  janito/event_bus/__init__.py,sha256=VG6GOhKMBh0O_92D-zW8a3YitJPKDajGgPiFezTXlNE,77
@@ -109,6 +109,7 @@ janito/event_bus/event.py,sha256=MtgcBPD7cvCuubiLIyo-BWcsNSO-941HLk6bScHTJtQ,427
109
109
  janito/event_bus/handler.py,sha256=RhBtT1E48VEM2-k8u3HYsESw7VX5qAgiB8ZTJeKXhHc,1322
110
110
  janito/event_bus/queue_bus.py,sha256=l4phun3pxXxi8ZlIq8ChYaiYDVO1PZeXoOzyi3vyu20,1558
111
111
  janito/i18n/__init__.py,sha256=6zCIu6pSQpoMJvIRK9oOD3pkzbNeJik3lFDXse0X6ag,994
112
+ janito/i18n/it.py,sha256=jpWyCrwoZXxHaLEbmYL2B1ouOa854ecdCfpXq4mqroc,4052
112
113
  janito/i18n/messages.py,sha256=fBuwOTFoygyHPkYphm6Y0r1iE8497Z4iryVAmPhMEkg,1851
113
114
  janito/i18n/pt.py,sha256=NlTgpDSftUfFG7FGbs7TK54vQlJVMyaZDHGcWjelwMc,4168
114
115
  janito/llm/README.md,sha256=6GRqCu_a9va5HCB1YqNqbshyWKFyAGlnXugrjom-xj8,1213
@@ -123,7 +124,7 @@ janito/llm/driver_input.py,sha256=Zq7IO4KdQPUraeIo6XoOaRy1IdQAyYY15RQw4JU30uA,38
123
124
  janito/llm/message_parts.py,sha256=QY_0kDjaxdoErDgKPRPv1dNkkYJuXIBmHWNLiOEKAH4,1365
124
125
  janito/llm/model.py,sha256=EioBkdgn8hJ0iQaKN-0KbXlsrk3YKmwR9IbvoEbdVTE,1159
125
126
  janito/llm/provider.py,sha256=3FbhQPrWBSEoIdIi-5DWIh0DD_CM570EFf1NcuGyGko,7961
126
- janito/providers/__init__.py,sha256=wlb8-dfnWRsZclFTT5cbwYqSWFpppChrAxZEgpdBgng,450
127
+ janito/providers/__init__.py,sha256=HWgChDOEWKjXavZXwMlKKtdghiy7pxs4KUx3HfhyyUM,492
127
128
  janito/providers/dashscope.bak.zip,sha256=BwXxRmZreEivvRtmqbr5BR62IFVlNjAf4y6DrF2BVJo,5998
128
129
  janito/providers/registry.py,sha256=Ygwv9eVrTXOKhv0EKxSWQXO5WMHvajWE2Q_Lc3p7dKo,730
129
130
  janito/providers/alibaba/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -142,6 +143,9 @@ janito/providers/deepseek/provider.py,sha256=eU-wwVqJog_oJ8VyQyohm6OMHlvrddSszqT
142
143
  janito/providers/google/__init__.py,sha256=hE3OGJvLEhvNLhIK_XmCGIdrIj8MKlyGgdOLJ4mdess,38
143
144
  janito/providers/google/model_info.py,sha256=AakTmzvWm1GPvFzGAq6-PeE_Dpq7BmAAqmh3L8N5KKo,1126
144
145
  janito/providers/google/provider.py,sha256=NQVG5kovHOc2SDgWjVIwYGMqshvMUAqRAk9iMntQ52k,3606
146
+ janito/providers/mistral/__init__.py,sha256=L8X53_KdP8xjmwdxwPmcDHY5iiVZm2xKE4xixsjibHk,27
147
+ janito/providers/mistral/model_info.py,sha256=1Zlac_Bss3wuMELROXTVDfeSeWaI1quhhi0ISEE9NQU,2266
148
+ janito/providers/mistral/provider.py,sha256=v7zIl2EZajLF8zVyLhqhmaCzeXhyanK1X9wuX-bcCgc,4773
145
149
  janito/providers/moonshotai/__init__.py,sha256=nThTAtynq4O2Iidm95daKOCKXi5APRJYtRK2Wr3SDpM,31
146
150
  janito/providers/moonshotai/model_info.py,sha256=MpPAB3tZVvZ8V7tZsiJpk5SReHjVcnwwbp63aUebx9Y,718
147
151
  janito/providers/moonshotai/provider.py,sha256=Lynw2cAF0IA9QPIRN4oY6Yr0cEwyVggpaQQrmkcgHuE,3874
@@ -166,7 +170,7 @@ janito/tools/outline_file.bak.zip,sha256=EeI2cBXCwTdWVgJDNiroxKeYlkjwo6NLKeXz3J-
166
170
  janito/tools/path_security.py,sha256=40b0hV0X3449Dht93A04Q3c9AYSsBQsBFy2BjzM83lA,8214
167
171
  janito/tools/permissions.py,sha256=_viTVXyetZC01HjI2s5c3klIJ8-RkWB1ShdOaV__loY,1508
168
172
  janito/tools/permissions_parse.py,sha256=LHadt0bWglm9Q2BbbVVbKePg4oa7QLeRQ-ChQZsE_dI,384
169
- janito/tools/tool_base.py,sha256=TSrXDknqIqOtY3xzuvtsxZ3qwbvmGzUruBiqVzzICfc,3689
173
+ janito/tools/tool_base.py,sha256=6meJZwbsqDIerh84T_C6K9G706wqoSkoR1vnrRk6mvo,3693
170
174
  janito/tools/tool_events.py,sha256=czRtC2TYakAySBZvfHS_Q6_NY_7_krxzAzAL1ggRFWA,1527
171
175
  janito/tools/tool_run_exception.py,sha256=43yWgTaGBGEtRteo6FvTrane6fEVGo9FU1uOdjMRWJE,525
172
176
  janito/tools/tool_use_tracker.py,sha256=IaEmA22D6RuL1xMUCScOMGv0crLPwEJVGmj49cydIaM,2662
@@ -194,7 +198,7 @@ janito/tools/adapters/local/remove_directory.py,sha256=g1wkHcWNgtv3mfuZ4GfvqtKU3
194
198
  janito/tools/adapters/local/remove_file.py,sha256=cSs7EIhEqblnLmwjUKrUq2M8axyT2oTXJqZs5waOAFw,2090
195
199
  janito/tools/adapters/local/replace_text_in_file.py,sha256=zFGWORuaw50ZlEFf3q_s7K25Tt0QXu8yOXDeodY6kcE,10791
196
200
  janito/tools/adapters/local/run_bash_command.py,sha256=iiOz2oBiPcyYG6ySOIS8zOuQ9XpYv6DiUwGiPKciADw,7623
197
- janito/tools/adapters/local/run_powershell_command.py,sha256=wTfIvWo5F3nVuDiNNHv2YzTlra5vQQMz2XYqreFiBVc,9260
201
+ janito/tools/adapters/local/run_powershell_command.py,sha256=p9SNZ2D4CMgbwtCIQ3jwlWWNYXMOPzosdQnkToT8QKI,8961
198
202
  janito/tools/adapters/local/view_file.py,sha256=-6Li0SegDUcUdH9jAulunQZj-Bm4A2MhSVbmtBFXtXQ,7137
199
203
  janito/tools/adapters/local/get_file_outline/__init__.py,sha256=OKV_BHnoD9h-vkcVoW6AHmsuDjjauHPCKNK0nVFl4sU,37
200
204
  janito/tools/adapters/local/get_file_outline/core.py,sha256=L_fS39v5ufLc9BK02tWMiH0nWQcXPAmbmwBNv1s_IhU,4373
@@ -218,9 +222,9 @@ janito/tools/adapters/local/validate_file_syntax/ps1_validator.py,sha256=TeIkPt0
218
222
  janito/tools/adapters/local/validate_file_syntax/python_validator.py,sha256=BfCO_K18qy92m-2ZVvHsbEU5e11OPo1pO9Vz4G4616E,130
219
223
  janito/tools/adapters/local/validate_file_syntax/xml_validator.py,sha256=AijlsP_PgNuC8ZbGsC5vOTt3Jur76otQzkd_7qR0QFY,284
220
224
  janito/tools/adapters/local/validate_file_syntax/yaml_validator.py,sha256=TgyI0HRL6ug_gBcWEm5TGJJuA4E34ZXcIzMpAbv3oJs,155
221
- janito-2.19.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
222
- janito-2.19.0.dist-info/METADATA,sha256=KgBACQLGdnw7inirQR1Snxe86lMSNnUdhXDkUpJN-U0,16365
223
- janito-2.19.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
224
- janito-2.19.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
225
- janito-2.19.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
226
- janito-2.19.0.dist-info/RECORD,,
225
+ janito-2.20.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
226
+ janito-2.20.0.dist-info/METADATA,sha256=3d4nPJxG75tqvVS4wrbuZ18mG9m9f0BCYwLoqLscdU4,16365
227
+ janito-2.20.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
228
+ janito-2.20.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
229
+ janito-2.20.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
230
+ janito-2.20.0.dist-info/RECORD,,