janito 2.8.0__py3-none-any.whl → 2.9.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.
- janito/cli/chat_mode/session.py +24 -6
- janito/cli/chat_mode/shell/commands/_priv_status.py +13 -0
- janito/cli/cli_commands/list_config.py +31 -0
- janito/cli/cli_commands/list_profiles.py +79 -0
- janito/cli/cli_commands/show_config.py +4 -11
- janito/cli/core/getters.py +14 -1
- janito/cli/main_cli.py +51 -2
- janito/config.py +1 -0
- janito/config_manager.py +11 -2
- janito/drivers/openai/driver.py +3 -2
- janito/llm/provider.py +1 -1
- janito/providers/azure_openai/provider.py +2 -2
- janito/providers/deepseek/provider.py +1 -1
- janito/providers/google/provider.py +1 -1
- janito/providers/groq/model_info.py +0 -1
- janito/providers/moonshotai/provider.py +1 -1
- janito/providers/openai/provider.py +1 -1
- {janito-2.8.0.dist-info → janito-2.9.0.dist-info}/METADATA +8 -8
- {janito-2.8.0.dist-info → janito-2.9.0.dist-info}/RECORD +23 -20
- {janito-2.8.0.dist-info → janito-2.9.0.dist-info}/WHEEL +0 -0
- {janito-2.8.0.dist-info → janito-2.9.0.dist-info}/entry_points.txt +0 -0
- {janito-2.8.0.dist-info → janito-2.9.0.dist-info}/licenses/LICENSE +0 -0
- {janito-2.8.0.dist-info → janito-2.9.0.dist-info}/top_level.txt +0 -0
janito/cli/chat_mode/session.py
CHANGED
@@ -72,11 +72,13 @@ class ChatSession:
|
|
72
72
|
self.provider_instance = provider_instance
|
73
73
|
self.llm_driver_config = llm_driver_config
|
74
74
|
|
75
|
-
profile, role, profile_system_prompt, no_tools_mode =
|
75
|
+
profile, role, profile_system_prompt, no_tools_mode = (
|
76
|
+
self._select_profile_and_role(args, role)
|
77
|
+
)
|
76
78
|
# Propagate no_tools_mode flag to downstream components via args
|
77
|
-
if args is not None and not hasattr(args,
|
79
|
+
if args is not None and not hasattr(args, "no_tools_mode"):
|
78
80
|
try:
|
79
|
-
setattr(args,
|
81
|
+
setattr(args, "no_tools_mode", no_tools_mode)
|
80
82
|
except Exception:
|
81
83
|
pass
|
82
84
|
conversation_history = self._create_conversation_history()
|
@@ -126,7 +128,9 @@ class ChatSession:
|
|
126
128
|
profile = "Developer with Python Tools"
|
127
129
|
else:
|
128
130
|
profile = (
|
129
|
-
"Developer with Python Tools"
|
131
|
+
"Developer with Python Tools"
|
132
|
+
if result == "Developer"
|
133
|
+
else result
|
130
134
|
)
|
131
135
|
except ImportError:
|
132
136
|
profile = "Raw Model Session (no tools, no context)"
|
@@ -200,13 +204,27 @@ class ChatSession:
|
|
200
204
|
cwd_display = "~" + cwd[len(home) :]
|
201
205
|
else:
|
202
206
|
cwd_display = cwd
|
203
|
-
|
207
|
+
from janito.cli.chat_mode.shell.commands._priv_status import (
|
208
|
+
get_privilege_status_message,
|
209
|
+
)
|
210
|
+
|
211
|
+
priv_status = get_privilege_status_message()
|
212
|
+
self.console.print(
|
213
|
+
f"[green]Working Dir:[/green] {cwd_display} | {priv_status}"
|
214
|
+
)
|
204
215
|
|
205
216
|
from janito.cli.chat_mode.shell.commands._priv_check import (
|
206
217
|
user_has_any_privileges,
|
207
218
|
)
|
208
219
|
|
209
|
-
|
220
|
+
perms = __import__(
|
221
|
+
"janito.tools.permissions", fromlist=["get_global_allowed_permissions"]
|
222
|
+
).get_global_allowed_permissions()
|
223
|
+
if perms.execute:
|
224
|
+
self.console.print(
|
225
|
+
"[bold red]Commands/Code execution is enabled - Be cautious[/bold red]"
|
226
|
+
)
|
227
|
+
if not (perms.read or perms.write or perms.execute):
|
210
228
|
self.console.print(
|
211
229
|
"[yellow]Note: You currently have no privileges enabled. If you need to interact with files or the system, enable permissions using /read on, /write on, or /execute on.[/yellow]"
|
212
230
|
)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
from janito.tools.permissions import get_global_allowed_permissions
|
2
|
+
|
3
|
+
|
4
|
+
def get_privilege_status_message():
|
5
|
+
perms = get_global_allowed_permissions()
|
6
|
+
if perms.read and perms.write:
|
7
|
+
return "[cyan]Read-Write tools enabled[/cyan]"
|
8
|
+
elif perms.read:
|
9
|
+
return "[cyan]Read-Only tools enabled[/cyan]"
|
10
|
+
elif perms.write:
|
11
|
+
return "[cyan]Write-Only tools enabled[/cyan]"
|
12
|
+
else:
|
13
|
+
return "[yellow]No tool permissions enabled[/yellow]"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
from rich.console import Console
|
2
|
+
from pathlib import Path
|
3
|
+
import os
|
4
|
+
|
5
|
+
|
6
|
+
def handle_list_config(args=None):
|
7
|
+
console = Console()
|
8
|
+
home = Path.home()
|
9
|
+
default_config = home / ".janito" / "config.json"
|
10
|
+
custom_dir = home / ".janito" / "configs"
|
11
|
+
console.print("[bold green]Janito configuration files:[/bold green]")
|
12
|
+
if default_config.exists():
|
13
|
+
console.print(f"[bold yellow]Default config:[/bold yellow] {default_config}")
|
14
|
+
else:
|
15
|
+
console.print(
|
16
|
+
f"[bold yellow]Default config:[/bold yellow] {default_config} [red](not found)"
|
17
|
+
)
|
18
|
+
if custom_dir.exists() and custom_dir.is_dir():
|
19
|
+
files = sorted(
|
20
|
+
f for f in custom_dir.iterdir() if f.is_file() and f.suffix == ".json"
|
21
|
+
)
|
22
|
+
if files:
|
23
|
+
console.print("[bold yellow]Custom configs:[/bold yellow]")
|
24
|
+
for f in files:
|
25
|
+
console.print(f" - {f}")
|
26
|
+
else:
|
27
|
+
console.print("[bold yellow]Custom configs:[/bold yellow] (none found)")
|
28
|
+
else:
|
29
|
+
console.print(
|
30
|
+
f"[bold yellow]Custom configs:[/bold yellow] {custom_dir} [red](directory not found)"
|
31
|
+
)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
"""
|
2
|
+
CLI Command: List available system prompt profiles (default and user-specific)
|
3
|
+
"""
|
4
|
+
|
5
|
+
from pathlib import Path
|
6
|
+
import importlib.resources as resources
|
7
|
+
from rich.console import Console
|
8
|
+
from rich.table import Table
|
9
|
+
|
10
|
+
|
11
|
+
_PREFIX = "system_prompt_template_"
|
12
|
+
_SUFFIX = ".txt.j2"
|
13
|
+
|
14
|
+
|
15
|
+
def _extract_profile_name(filename: str) -> str:
|
16
|
+
"""Return the human-readable profile name from template file name."""
|
17
|
+
# Remove prefix & suffix and convert underscores back to spaces
|
18
|
+
if filename.startswith(_PREFIX):
|
19
|
+
filename = filename[len(_PREFIX) :]
|
20
|
+
if filename.endswith(_SUFFIX):
|
21
|
+
filename = filename[: -len(_SUFFIX)]
|
22
|
+
return filename.replace("_", " ")
|
23
|
+
|
24
|
+
|
25
|
+
def _gather_default_profiles():
|
26
|
+
"""Return list of built-in profile names bundled with janito."""
|
27
|
+
profiles = []
|
28
|
+
try:
|
29
|
+
package_files = resources.files("janito.agent.templates.profiles")
|
30
|
+
for path in package_files.iterdir():
|
31
|
+
name = path.name
|
32
|
+
if name.startswith(_PREFIX) and name.endswith(_SUFFIX):
|
33
|
+
profiles.append(_extract_profile_name(name))
|
34
|
+
except Exception:
|
35
|
+
# If for some reason the resources are not available fall back to empty list
|
36
|
+
pass
|
37
|
+
return sorted(profiles, key=str.lower)
|
38
|
+
|
39
|
+
|
40
|
+
def _gather_user_profiles():
|
41
|
+
"""Return list of user-defined profile names from ~/.janito/profiles directory."""
|
42
|
+
user_dir = Path.home() / ".janito" / "profiles"
|
43
|
+
profiles = []
|
44
|
+
if user_dir.exists() and user_dir.is_dir():
|
45
|
+
for path in user_dir.iterdir():
|
46
|
+
if (
|
47
|
+
path.is_file()
|
48
|
+
and path.name.startswith(_PREFIX)
|
49
|
+
and path.name.endswith(_SUFFIX)
|
50
|
+
):
|
51
|
+
profiles.append(_extract_profile_name(path.name))
|
52
|
+
return sorted(profiles, key=str.lower)
|
53
|
+
|
54
|
+
|
55
|
+
def _print_profiles_table(default_profiles, user_profiles):
|
56
|
+
console = Console()
|
57
|
+
table = Table(title="Available System Prompt Profiles", box=None, show_lines=False)
|
58
|
+
table.add_column("Profile Name", style="cyan", no_wrap=False)
|
59
|
+
table.add_column("Source", style="magenta", no_wrap=True)
|
60
|
+
|
61
|
+
for p in default_profiles:
|
62
|
+
table.add_row(p, "default")
|
63
|
+
for p in user_profiles:
|
64
|
+
table.add_row(p, "user")
|
65
|
+
|
66
|
+
console.print(table)
|
67
|
+
|
68
|
+
|
69
|
+
def handle_list_profiles(args=None):
|
70
|
+
"""Entry point for the --list-profiles CLI flag."""
|
71
|
+
default_profiles = _gather_default_profiles()
|
72
|
+
user_profiles = _gather_user_profiles()
|
73
|
+
|
74
|
+
if not default_profiles and not user_profiles:
|
75
|
+
print("No profiles found.")
|
76
|
+
return
|
77
|
+
|
78
|
+
_print_profiles_table(default_profiles, user_profiles)
|
79
|
+
return
|
@@ -34,21 +34,14 @@ def handle_show_config(args):
|
|
34
34
|
provider_names = ProviderRegistry()._get_provider_names()
|
35
35
|
except Exception:
|
36
36
|
pass
|
37
|
+
from janito.provider_config import get_config_path
|
38
|
+
|
39
|
+
config_path = get_config_path()
|
37
40
|
console.print("[bold green]Current configuration:[/bold green]")
|
41
|
+
console.print(f"[bold yellow]Config file:[/bold yellow] {config_path}")
|
38
42
|
console.print(f"[bold yellow]Current provider:[/bold yellow] {provider!r}\n")
|
39
43
|
if model is not None:
|
40
44
|
console.print(f"[bold yellow]Global model:[/bold yellow] {model!r}\n")
|
41
|
-
if provider_names:
|
42
|
-
console.print("[bold cyan]Provider specific default models:[/bold cyan]")
|
43
|
-
for pname in provider_names:
|
44
|
-
eff_model = resolve_effective_model(pname)
|
45
|
-
prov_cfg = config.get_provider_config(pname)
|
46
|
-
prov_model = prov_cfg.get("model") if prov_cfg else None
|
47
|
-
extra = f" (override)" if prov_model else ""
|
48
|
-
sel = "[default]" if pname == provider else ""
|
49
|
-
console.print(
|
50
|
-
f" [bold]{pname}[/bold]{' '+sel if sel else ''}: model = [magenta]{eff_model}[/magenta]{extra}"
|
51
|
-
)
|
52
45
|
|
53
46
|
# Show disabled tools
|
54
47
|
from janito.tools.disabled_tools import load_disabled_tools_from_config
|
janito/cli/core/getters.py
CHANGED
@@ -6,10 +6,18 @@ from janito.cli.cli_commands.list_providers import handle_list_providers
|
|
6
6
|
from janito.cli.cli_commands.list_models import handle_list_models
|
7
7
|
from janito.cli.cli_commands.list_tools import handle_list_tools
|
8
8
|
from janito.cli.cli_commands.show_config import handle_show_config
|
9
|
+
from janito.cli.cli_commands.list_config import handle_list_config
|
9
10
|
from functools import partial
|
10
11
|
from janito.provider_registry import ProviderRegistry
|
11
12
|
|
12
|
-
GETTER_KEYS = [
|
13
|
+
GETTER_KEYS = [
|
14
|
+
"show_config",
|
15
|
+
"list_providers",
|
16
|
+
"list_profiles",
|
17
|
+
"list_models",
|
18
|
+
"list_tools",
|
19
|
+
"list_config",
|
20
|
+
]
|
13
21
|
|
14
22
|
|
15
23
|
def handle_getter(args, config_mgr=None):
|
@@ -24,11 +32,16 @@ def handle_getter(args, config_mgr=None):
|
|
24
32
|
)
|
25
33
|
sys.exit(1)
|
26
34
|
provider_instance = ProviderRegistry().get_instance(provider)
|
35
|
+
# Lazy import to avoid overhead unless needed
|
36
|
+
from janito.cli.cli_commands.list_profiles import handle_list_profiles
|
37
|
+
|
27
38
|
GETTER_DISPATCH = {
|
28
39
|
"list_providers": partial(handle_list_providers, args),
|
29
40
|
"list_models": partial(handle_list_models, args, provider_instance),
|
30
41
|
"list_tools": partial(handle_list_tools, args),
|
42
|
+
"list_profiles": partial(handle_list_profiles, args),
|
31
43
|
"show_config": partial(handle_show_config, args),
|
44
|
+
"list_config": partial(handle_list_config, args),
|
32
45
|
}
|
33
46
|
for arg in GETTER_KEYS:
|
34
47
|
if getattr(args, arg, False) and arg in GETTER_DISPATCH:
|
janito/cli/main_cli.py
CHANGED
@@ -98,6 +98,14 @@ definition = [
|
|
98
98
|
(["--version"], {"action": "version", "version": None}),
|
99
99
|
(["--list-tools"], {"action": "store_true", "help": "List all registered tools"}),
|
100
100
|
(["--show-config"], {"action": "store_true", "help": "Show the current config"}),
|
101
|
+
(
|
102
|
+
["--list-config"],
|
103
|
+
{"action": "store_true", "help": "List all configuration files"},
|
104
|
+
),
|
105
|
+
(
|
106
|
+
["--list-profiles"],
|
107
|
+
{"action": "store_true", "help": "List available system prompt profiles"},
|
108
|
+
),
|
101
109
|
(
|
102
110
|
["--list-providers"],
|
103
111
|
{"action": "store_true", "help": "List supported LLM providers"},
|
@@ -159,6 +167,13 @@ definition = [
|
|
159
167
|
"help": "Print debug info on event subscribe/submit methods",
|
160
168
|
},
|
161
169
|
),
|
170
|
+
(
|
171
|
+
["-c", "--config"],
|
172
|
+
{
|
173
|
+
"metavar": "NAME",
|
174
|
+
"help": "Use custom configuration file ~/.janito/configs/NAME.json instead of default config.json",
|
175
|
+
},
|
176
|
+
),
|
162
177
|
]
|
163
178
|
|
164
179
|
MODIFIER_KEYS = [
|
@@ -177,7 +192,14 @@ MODIFIER_KEYS = [
|
|
177
192
|
"write",
|
178
193
|
]
|
179
194
|
SETTER_KEYS = ["set", "set_provider", "set_api_key", "unset"]
|
180
|
-
GETTER_KEYS = [
|
195
|
+
GETTER_KEYS = [
|
196
|
+
"show_config",
|
197
|
+
"list_providers",
|
198
|
+
"list_profiles",
|
199
|
+
"list_models",
|
200
|
+
"list_tools",
|
201
|
+
"list_config",
|
202
|
+
]
|
181
203
|
|
182
204
|
|
183
205
|
class RunMode(enum.Enum):
|
@@ -198,6 +220,29 @@ class JanitoCLI:
|
|
198
220
|
self._define_args()
|
199
221
|
self.args = self.parser.parse_args()
|
200
222
|
self._set_all_arg_defaults()
|
223
|
+
# Support custom config file via -c/--config
|
224
|
+
if getattr(self.args, "config", None):
|
225
|
+
from janito import config as global_config
|
226
|
+
from janito.config_manager import ConfigManager
|
227
|
+
import sys
|
228
|
+
import importlib
|
229
|
+
|
230
|
+
config_name = self.args.config
|
231
|
+
# Re-initialize the global config singleton
|
232
|
+
new_config = ConfigManager(config_name=config_name)
|
233
|
+
# Ensure the config path is updated when the singleton already existed
|
234
|
+
from pathlib import Path
|
235
|
+
|
236
|
+
new_config.config_path = (
|
237
|
+
Path.home() / ".janito" / "configs" / f"{config_name}.json"
|
238
|
+
)
|
239
|
+
# Reload config from the selected file
|
240
|
+
new_config._load_file_config()
|
241
|
+
# Patch the global singleton reference
|
242
|
+
import janito.config as config_module
|
243
|
+
|
244
|
+
config_module.config = new_config
|
245
|
+
sys.modules["janito.config"].config = new_config
|
201
246
|
# Support reading prompt from stdin if no user_prompt is given
|
202
247
|
import sys
|
203
248
|
|
@@ -271,7 +316,11 @@ class JanitoCLI:
|
|
271
316
|
return
|
272
317
|
# Special handling: provider is not required for list_providers, list_tools, show_config
|
273
318
|
if run_mode == RunMode.GET and (
|
274
|
-
self.args.list_providers
|
319
|
+
self.args.list_providers
|
320
|
+
or self.args.list_tools
|
321
|
+
or self.args.list_profiles
|
322
|
+
or self.args.show_config
|
323
|
+
or self.args.list_config
|
275
324
|
):
|
276
325
|
self._maybe_print_verbose_provider_model()
|
277
326
|
handle_getter(self.args)
|
janito/config.py
CHANGED
@@ -2,4 +2,5 @@
|
|
2
2
|
from janito.config_manager import ConfigManager
|
3
3
|
|
4
4
|
# Only one global instance! Used by CLI, provider_config, others:
|
5
|
+
# If you want to use a custom config, re-initialize this singleton with config_name or config_path before use.
|
5
6
|
config = ConfigManager(config_path=None)
|
janito/config_manager.py
CHANGED
@@ -20,13 +20,22 @@ class ConfigManager:
|
|
20
20
|
cls._instance = super(ConfigManager, cls).__new__(cls)
|
21
21
|
return cls._instance
|
22
22
|
|
23
|
-
def __init__(
|
23
|
+
def __init__(
|
24
|
+
self, config_path=None, defaults=None, runtime_overrides=None, config_name=None
|
25
|
+
):
|
24
26
|
# Lazy single-init
|
25
27
|
if hasattr(self, "_initialized") and self._initialized:
|
26
28
|
return
|
27
29
|
self._initialized = True
|
28
30
|
|
29
|
-
|
31
|
+
if config_name:
|
32
|
+
self.config_path = (
|
33
|
+
Path.home() / ".janito" / "configs" / f"{config_name}.json"
|
34
|
+
)
|
35
|
+
else:
|
36
|
+
self.config_path = Path(
|
37
|
+
config_path or Path.home() / ".janito" / "config.json"
|
38
|
+
)
|
30
39
|
self.defaults = dict(defaults) if defaults else {}
|
31
40
|
self.file_config = {}
|
32
41
|
self.runtime_overrides = dict(runtime_overrides) if runtime_overrides else {}
|
janito/drivers/openai/driver.py
CHANGED
@@ -74,8 +74,9 @@ class OpenAIModelDriver(LLMDriver):
|
|
74
74
|
api_kwargs[p] = v
|
75
75
|
api_kwargs["messages"] = conversation
|
76
76
|
api_kwargs["stream"] = False
|
77
|
-
if
|
78
|
-
|
77
|
+
# Always return the prepared kwargs, even if no tools are registered. The
|
78
|
+
# OpenAI Python SDK expects a **mapping** – passing *None* will raise
|
79
|
+
# ``TypeError: argument after ** must be a mapping, not NoneType``.
|
79
80
|
return api_kwargs
|
80
81
|
|
81
82
|
def _call_api(self, driver_input: DriverInput):
|
janito/llm/provider.py
CHANGED
@@ -17,7 +17,7 @@ class LLMProvider(ABC):
|
|
17
17
|
Abstract base class for Large Language Model (LLM) providers.
|
18
18
|
|
19
19
|
Provider Usage and Driver Communication Flow:
|
20
|
-
1. Provider class is selected (e.g., OpenAIProvider
|
20
|
+
1. Provider class is selected (e.g., OpenAIProvider).
|
21
21
|
2. An instance of the provider is created. This instance is bound to a specific configuration (LLMDriverConfig) containing model, credentials, etc.
|
22
22
|
3. All drivers created by that provider instance are associated with the bound config.
|
23
23
|
4. To communicate with an LLM, call create_driver() on the provider instance, which yields a driver configured for the attached config. Every driver created via this method inherits the provider's configuration.
|
@@ -11,13 +11,13 @@ from janito.drivers.azure_openai.driver import AzureOpenAIModelDriver
|
|
11
11
|
|
12
12
|
available = AzureOpenAIModelDriver.available
|
13
13
|
unavailable_reason = AzureOpenAIModelDriver.unavailable_reason
|
14
|
-
maintainer = "João Pinto <
|
14
|
+
maintainer = "João Pinto <janito@ikignosis.org>"
|
15
15
|
|
16
16
|
|
17
17
|
class AzureOpenAIProvider(LLMProvider):
|
18
18
|
name = "azure_openai"
|
19
19
|
NAME = "azure_openai"
|
20
|
-
MAINTAINER = "João Pinto <
|
20
|
+
MAINTAINER = "João Pinto <janito@ikignosis.org>"
|
21
21
|
MODEL_SPECS = MODEL_SPECS
|
22
22
|
DEFAULT_MODEL = "azure_openai_deployment"
|
23
23
|
|
@@ -15,7 +15,7 @@ unavailable_reason = OpenAIModelDriver.unavailable_reason
|
|
15
15
|
class DeepSeekProvider(LLMProvider):
|
16
16
|
name = "deepseek"
|
17
17
|
NAME = "deepseek"
|
18
|
-
MAINTAINER = "João Pinto <
|
18
|
+
MAINTAINER = "João Pinto <janito@ikignosis.org>"
|
19
19
|
MODEL_SPECS = MODEL_SPECS
|
20
20
|
DEFAULT_MODEL = "deepseek-chat" # Options: deepseek-chat, deepseek-reasoner
|
21
21
|
|
@@ -17,7 +17,7 @@ except ImportError:
|
|
17
17
|
class GoogleProvider(LLMProvider):
|
18
18
|
name = "google"
|
19
19
|
NAME = "google"
|
20
|
-
MAINTAINER = "João Pinto <
|
20
|
+
MAINTAINER = "João Pinto <janito@ikignosis.org>"
|
21
21
|
MODEL_SPECS = MODEL_SPECS
|
22
22
|
DEFAULT_MODEL = "gemini-2.5-flash" # Default Gemini model
|
23
23
|
|
@@ -10,7 +10,7 @@ from .model_info import MOONSHOTAI_MODEL_SPECS
|
|
10
10
|
class MoonshotAIProvider(LLMProvider):
|
11
11
|
name = "moonshotai"
|
12
12
|
NAME = "moonshotai"
|
13
|
-
MAINTAINER = "João Pinto <
|
13
|
+
MAINTAINER = "João Pinto <janito@ikignosis.org>"
|
14
14
|
MODEL_SPECS = MOONSHOTAI_MODEL_SPECS
|
15
15
|
DEFAULT_MODEL = "kimi-k2-0711-preview"
|
16
16
|
|
@@ -15,7 +15,7 @@ unavailable_reason = OpenAIModelDriver.unavailable_reason
|
|
15
15
|
class OpenAIProvider(LLMProvider):
|
16
16
|
name = "openai"
|
17
17
|
NAME = "openai"
|
18
|
-
MAINTAINER = "João Pinto <
|
18
|
+
MAINTAINER = "João Pinto <janito@ikignosis.org>"
|
19
19
|
MODEL_SPECS = MODEL_SPECS
|
20
20
|
DEFAULT_MODEL = "gpt-4.1" # Options: gpt-4.1, gpt-4o, o3-mini, o4-mini,
|
21
21
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: janito
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.9.0
|
4
4
|
Summary: A new Python package called janito.
|
5
|
-
Author-email: João Pinto <
|
6
|
-
Project-URL: Homepage, https://github.com/
|
5
|
+
Author-email: João Pinto <janito@ikignosis.org>
|
6
|
+
Project-URL: Homepage, https://github.com/ikignosis/janito
|
7
7
|
Requires-Python: >=3.7
|
8
8
|
Description-Content-Type: text/markdown
|
9
9
|
License-File: LICENSE
|
@@ -30,7 +30,7 @@ Requires-Dist: questionary>=2.0.1; extra == "dev"
|
|
30
30
|
Requires-Dist: setuptools_scm>=8.0; extra == "dev"
|
31
31
|
Dynamic: license-file
|
32
32
|
|
33
|
-
# Janito
|
33
|
+
# Janito, control you context
|
34
34
|
|
35
35
|
[](https://badge.fury.io/py/janito)
|
36
36
|
|
@@ -39,7 +39,7 @@ Janito is a command-line interface (CLI) tool for managing and interacting with
|
|
39
39
|
## Features
|
40
40
|
|
41
41
|
- 🔑 Manage API keys and provider configurations
|
42
|
-
- 🤖 Interact with multiple LLM providers (OpenAI, Google Gemini,
|
42
|
+
- 🤖 Interact with multiple LLM providers (OpenAI, Google Gemini, DeepSeek, and more)
|
43
43
|
- 🛠️ List and use a variety of registered tools
|
44
44
|
- 📝 Submit prompts and receive responses directly from the CLI
|
45
45
|
- 📋 List available models for each provider
|
@@ -61,7 +61,7 @@ Janito is a command-line interface (CLI) tool for managing and interacting with
|
|
61
61
|
Janito is a Python package. Since this is a development version, you can install it directly from GitHub:
|
62
62
|
|
63
63
|
```bash
|
64
|
-
pip install git+
|
64
|
+
pip install git+git@github.com:ikignosis/janito.git
|
65
65
|
```
|
66
66
|
|
67
67
|
### First launch and quick setup
|
@@ -307,7 +307,7 @@ For more information, see the documentation in the `docs/` directory or run `jan
|
|
307
307
|
|
308
308
|
## 📖 Detailed Documentation
|
309
309
|
|
310
|
-
Full and up-to-date documentation is available at: https://
|
310
|
+
Full and up-to-date documentation is available at: https://ikignosis.github.io/janito/
|
311
311
|
|
312
312
|
---
|
313
313
|
|
@@ -388,7 +388,7 @@ janito -p deepseek --list-models
|
|
388
388
|
## Ask Me Anything
|
389
389
|
|
390
390
|
<div align="center">
|
391
|
-
<a href="
|
391
|
+
<a href="git@github.com:ikignosis/janito.git" title="Ask Me Anything">
|
392
392
|
<img width="250" src="docs/imgs/ama.png" alt="Ask Me Anything">
|
393
393
|
</a>
|
394
394
|
</div
|
@@ -1,8 +1,8 @@
|
|
1
1
|
janito/__init__.py,sha256=a0pFui3A_AfWJiUfg93yE-Vf4868bqG3y9yg2fkTIuY,244
|
2
2
|
janito/__main__.py,sha256=lPQ8kAyYfyeS1KopmJ8EVY5g1YswlIqCS615mM_B_rM,70
|
3
3
|
janito/_version.py,sha256=PtAVr2K9fOS5sv6aXzmcb7UaR5NLGMFOofL7Ndjh75o,2344
|
4
|
-
janito/config.py,sha256=
|
5
|
-
janito/config_manager.py,sha256=
|
4
|
+
janito/config.py,sha256=DXuC74NEywKvpTkOSrrxJGvHdL_tvXEf27pkedV3XZA,313
|
5
|
+
janito/config_manager.py,sha256=KoA_jmJzCv33jzXGSab0x6JyWL0cExoqnltES9oT-JU,5433
|
6
6
|
janito/conversation_history.py,sha256=GqqEJElTVONzOMRe-9g25WCMcDi0PF7DOnqGWLTrY_8,897
|
7
7
|
janito/dir_walk_utils.py,sha256=ON9EyVH7Aaik8WtCH5z8DQis9ycdoNVkjNvU16HH498,1193
|
8
8
|
janito/driver_events.py,sha256=51ab7KW_W6fVZVeO0ez-HJFY4NbTI327ZlEmEsEkxQc,3405
|
@@ -26,7 +26,7 @@ janito/cli/__init__.py,sha256=xaPDOrWphBbCR63Xpcx_yfpXSJIlCaaICc4j2qpWqrM,194
|
|
26
26
|
janito/cli/config.py,sha256=HkZ14701HzIqrvaNyDcDhGlVHfpX_uHlLp2rHmhRm_k,872
|
27
27
|
janito/cli/console.py,sha256=gJolqzWL7jEPLxeuH-CwBDRFpXt976KdZOEAB2tdBDs,64
|
28
28
|
janito/cli/main.py,sha256=s5odou0txf8pzTf1ADk2yV7T5m8B6cejJ81e7iu776U,312
|
29
|
-
janito/cli/main_cli.py,sha256=
|
29
|
+
janito/cli/main_cli.py,sha256=Z6eruiCAQh7Lp451XkYC-Rnq9q1zLkmyyd5ZC2KaOik,14181
|
30
30
|
janito/cli/prompt_core.py,sha256=F68J4Xl6jZMYFN4oBBYZFj15Jp-HTYoLub4bw2XpNRU,11648
|
31
31
|
janito/cli/prompt_handler.py,sha256=SnPTlL64noeAMGlI08VBDD5IDD8jlVMIYA4-fS8zVLg,215
|
32
32
|
janito/cli/prompt_setup.py,sha256=1s5yccFaWMgDkUjkvnTYGEWJAFPJ6hIiqwbrLfzWxMI,2038
|
@@ -37,7 +37,7 @@ janito/cli/chat_mode/bindings.py,sha256=odjc5_-YW1t2FRhBUNRNoBMoQIg5sMz3ktV7xG0A
|
|
37
37
|
janito/cli/chat_mode/chat_entry.py,sha256=RFdPd23jsA2DMHRacpjAdwI_1dFBaWrtnwyQEgb2fHA,475
|
38
38
|
janito/cli/chat_mode/prompt_style.py,sha256=vsqQ9xxmrYjj1pWuVe9CayQf39fo2EIXrkKPkflSVn4,805
|
39
39
|
janito/cli/chat_mode/script_runner.py,sha256=NzWHXNcf-jZZb096iFJJL2pi3kVb1beLSHHzqE5Sv2g,6500
|
40
|
-
janito/cli/chat_mode/session.py,sha256=
|
40
|
+
janito/cli/chat_mode/session.py,sha256=cqc4Ug3yGA8rR6vFRe5v6U4recqD0tzqgwcf2ASaPgs,12891
|
41
41
|
janito/cli/chat_mode/session_profile_select.py,sha256=CJ2g3VbPGWfBNrNkYYX57oIJZJ-hIZBNGB-zcdjC9vk,5379
|
42
42
|
janito/cli/chat_mode/toolbar.py,sha256=bJ9jPaTInp2gB3yjSVJp8mpNEFiOslzNhVaiqpXJhKc,3025
|
43
43
|
janito/cli/chat_mode/shell/autocomplete.py,sha256=lE68MaVaodbA2VfUM0_YLqQVLBJAE_BJsd5cMtwuD-g,793
|
@@ -46,6 +46,7 @@ janito/cli/chat_mode/shell/input_history.py,sha256=9620dKYSpXfGhdd2msbuqnkNW3Drv
|
|
46
46
|
janito/cli/chat_mode/shell/session.bak.zip,sha256=m1GyO3Wy4G4D9sVgRO6ZDyC0VjclsmnEJsiQoer4LzI,5789
|
47
47
|
janito/cli/chat_mode/shell/commands/__init__.py,sha256=Ux4h86ewY9yR9xjaK6Zt2vOws3uCjMBmnMhOHLWS1BE,2302
|
48
48
|
janito/cli/chat_mode/shell/commands/_priv_check.py,sha256=OBPRMZlFlLSJSfbXrLqRCqD3ISKqR0QNzBJpa7g30Ro,206
|
49
|
+
janito/cli/chat_mode/shell/commands/_priv_status.py,sha256=WgCEK38Hllz3Bz4TgVgODdmo0BDaBey5t0uMyA3125k,478
|
49
50
|
janito/cli/chat_mode/shell/commands/bang.py,sha256=qVCUM8ZnGE1J3yG1hjYYw7upY4PR6bhNNYfJa-NfnI4,1860
|
50
51
|
janito/cli/chat_mode/shell/commands/base.py,sha256=I6-SVOcRd7q4PpoutLdrbhbqeUpJic2oyPhOSMgMihA,288
|
51
52
|
janito/cli/chat_mode/shell/commands/clear.py,sha256=wYEHGYcAohUoCJlbEhiXKfDbJvuzAVK4e9uirskIllw,422
|
@@ -69,17 +70,19 @@ janito/cli/chat_mode/shell/commands/write.py,sha256=bpvJzHY7wlpgsB-cpslzfQQl7h6n
|
|
69
70
|
janito/cli/chat_mode/shell/session/__init__.py,sha256=uTYE_QpZFEn7v9QE5o1LdulpCWa9vmk0OsefbBGWg_c,37
|
70
71
|
janito/cli/chat_mode/shell/session/history.py,sha256=tYav6GgjAZkvWhlI_rfG6OArNqW6Wn2DTv39Hb20QYc,1262
|
71
72
|
janito/cli/chat_mode/shell/session/manager.py,sha256=MwD9reHsRaly0CyRB-S1JJ0wPKz2g8Xdj2VvlU35Hgc,1001
|
73
|
+
janito/cli/cli_commands/list_config.py,sha256=oiQEGaGPjwjG-PrOcakpNMbbqISTsBEs7rkGH3ceQsI,1179
|
72
74
|
janito/cli/cli_commands/list_models.py,sha256=_rqHz89GsNLcH0GGkFqPue7ah4ZbN9YHm0lEP30Aa-A,1111
|
75
|
+
janito/cli/cli_commands/list_profiles.py,sha256=9-HV2EbtP2AdubbMoakjbu7Oq4Ss9UDyO7Eb6CC52wI,2681
|
73
76
|
janito/cli/cli_commands/list_providers.py,sha256=v8OQ8ULnuzNuvgkeKqGXGj69eOiavAlPGhzfR0zavhg,185
|
74
77
|
janito/cli/cli_commands/list_tools.py,sha256=JFRdlhPeA3BzhJ2PkjIt3u137IJoNc-vYSjUuPlaOXw,3593
|
75
78
|
janito/cli/cli_commands/model_selection.py,sha256=ANWtwC5glZkGMdaNtARDbEG3QmuBUcDLVxzzC5jeBNo,1643
|
76
79
|
janito/cli/cli_commands/model_utils.py,sha256=U0j2FTpcIBc4eAc40MXz5tyAK3m8lkakpOS2l2bGh4A,2868
|
77
80
|
janito/cli/cli_commands/set_api_key.py,sha256=iPtWPhS5VeyIlwVX43TGg7OYUwXCcGzugvwoa3KB8A8,605
|
78
|
-
janito/cli/cli_commands/show_config.py,sha256=
|
81
|
+
janito/cli/cli_commands/show_config.py,sha256=eYMcuvU-d7mvvuctbQacZFERqcKHEnxaRRjasyj-_lE,2004
|
79
82
|
janito/cli/cli_commands/show_system_prompt.py,sha256=9ZJGW7lIGJ9LX2JZiWVEm4AbaD0qEQO7LF89jPgk52I,5232
|
80
83
|
janito/cli/core/__init__.py,sha256=YH95fhgY9yBX8RgqX9dSrEkl4exjV0T4rbmJ6xUpG-Y,196
|
81
84
|
janito/cli/core/event_logger.py,sha256=1X6lR0Ax7AgF8HlPWFoY5Ystuu7Bh4ooTo78vXzeGB0,2008
|
82
|
-
janito/cli/core/getters.py,sha256=
|
85
|
+
janito/cli/core/getters.py,sha256=AO34OBhh3f1Sx2mWVYQIvH-4fcmXG7b2471XdKNZdYs,1856
|
83
86
|
janito/cli/core/runner.py,sha256=C7eePvhzIYHgsP95WGwltIhM_T4Kzyo14M7n12RevPQ,7693
|
84
87
|
janito/cli/core/setters.py,sha256=PD3aT1y1q8XWQVtRNfrU0dtlW4JGdn6BMJyP7FCQWhc,4623
|
85
88
|
janito/cli/core/unsetters.py,sha256=FEw9gCt0vRvoCt0kRSNfVB2tzi_TqppJIx2nHPP59-k,2012
|
@@ -90,7 +93,7 @@ janito/drivers/driver_registry.py,sha256=sbij7R71JJqJVeMfmaU-FKsEuZVO8oEn6Qp8020
|
|
90
93
|
janito/drivers/openai_responses.bak.zip,sha256=E43eDCHGa2tCtdjzj_pMnWDdnsOZzj8BJTR5tJp8wcM,13352
|
91
94
|
janito/drivers/azure_openai/driver.py,sha256=rxeyCElyc4XVCTl2q-tI78Oy0q5lwtQUnwBqw7vft5g,3593
|
92
95
|
janito/drivers/openai/README.md,sha256=bgPdaYX0pyotCoJ9t3cJbYM-teQ_YM1DAFEKLCMP32Q,666
|
93
|
-
janito/drivers/openai/driver.py,sha256=
|
96
|
+
janito/drivers/openai/driver.py,sha256=gNFmJqFl3mlbir-Qh0S0nZjD2sG4UTUpj92wPdcC5Kc,18439
|
94
97
|
janito/event_bus/__init__.py,sha256=VG6GOhKMBh0O_92D-zW8a3YitJPKDajGgPiFezTXlNE,77
|
95
98
|
janito/event_bus/bus.py,sha256=LokZbAdwcWhWOyKSp7H3Ism57x4EZhxlRPjl3NE4UKU,2847
|
96
99
|
janito/event_bus/event.py,sha256=MtgcBPD7cvCuubiLIyo-BWcsNSO-941HLk6bScHTJtQ,427
|
@@ -109,29 +112,29 @@ janito/llm/driver_config_builder.py,sha256=BvWGx7vaBR5NyvPY1XNAP3lAgo1uf-T25CSsI
|
|
109
112
|
janito/llm/driver_input.py,sha256=Zq7IO4KdQPUraeIo6XoOaRy1IdQAyYY15RQw4JU30uA,389
|
110
113
|
janito/llm/message_parts.py,sha256=QY_0kDjaxdoErDgKPRPv1dNkkYJuXIBmHWNLiOEKAH4,1365
|
111
114
|
janito/llm/model.py,sha256=42hjcffZDTuzjAJoVhDcDqwIXm6rUmmi5UwTOYopf5w,1131
|
112
|
-
janito/llm/provider.py,sha256=
|
115
|
+
janito/llm/provider.py,sha256=3FbhQPrWBSEoIdIi-5DWIh0DD_CM570EFf1NcuGyGko,7961
|
113
116
|
janito/providers/__init__.py,sha256=S6AvFABVrFOfFFj_sqNnQcbgS6IVdiRWzBg-rhnhjOY,366
|
114
117
|
janito/providers/dashscope.bak.zip,sha256=BwXxRmZreEivvRtmqbr5BR62IFVlNjAf4y6DrF2BVJo,5998
|
115
118
|
janito/providers/registry.py,sha256=Ygwv9eVrTXOKhv0EKxSWQXO5WMHvajWE2Q_Lc3p7dKo,730
|
116
119
|
janito/providers/anthropic/model_info.py,sha256=m6pBh0Ia8_xC1KZ7ke_4HeHIFw7nWjnYVItnRpkCSWc,1206
|
117
120
|
janito/providers/anthropic/provider.py,sha256=nTsZw0IwAZbgixBNXuD7EYXdI6uYQh7wsTGxE-3R-yE,2850
|
118
121
|
janito/providers/azure_openai/model_info.py,sha256=TMSqEpQROIIYUGAyulYJ5xGhj7CbLoaKL_JXeLbXaG0,689
|
119
|
-
janito/providers/azure_openai/provider.py,sha256=
|
122
|
+
janito/providers/azure_openai/provider.py,sha256=CL9CE2cpkJYjvoZAK9TmpSbS-OOlmDbCiSyjw1NF9Ic,5228
|
120
123
|
janito/providers/deepseek/__init__.py,sha256=4sISEpq4bJO29vxFK9cfnO-SRUmKoD7oSdeCvz0hVno,36
|
121
124
|
janito/providers/deepseek/model_info.py,sha256=tAlFRtWiyNF_MKZ1gy5_-VNlvqoIwAinv6bAv9dNFsc,465
|
122
|
-
janito/providers/deepseek/provider.py,sha256=
|
125
|
+
janito/providers/deepseek/provider.py,sha256=ATDyYJJJl-KkOTlhgZ6EEGMKCvj0LTu4GwB_GtUeXN0,3922
|
123
126
|
janito/providers/google/__init__.py,sha256=hE3OGJvLEhvNLhIK_XmCGIdrIj8MKlyGgdOLJ4mdess,38
|
124
127
|
janito/providers/google/model_info.py,sha256=AakTmzvWm1GPvFzGAq6-PeE_Dpq7BmAAqmh3L8N5KKo,1126
|
125
|
-
janito/providers/google/provider.py,sha256=
|
128
|
+
janito/providers/google/provider.py,sha256=2sJzqmkjttGOXB38W2SYhiRIPCHesdajZUKdX4O_yhk,3424
|
126
129
|
janito/providers/groq/__init__.py,sha256=O0vi5p13DGcDEM3SUQmYB5_g7-UcqT-d0OrrPIsaeD4,36
|
127
|
-
janito/providers/groq/model_info.py,sha256=
|
130
|
+
janito/providers/groq/model_info.py,sha256=QBgI4-keoW63sgX8MDhnFN9FHz3F3Oo3gE7XXNkamoM,1612
|
128
131
|
janito/providers/groq/provider.py,sha256=8xUMY_ytSauT5RX3yovS2sDtHX1rkqNwHAEClTaJ7Ls,2697
|
129
132
|
janito/providers/moonshotai/__init__.py,sha256=nThTAtynq4O2Iidm95daKOCKXi5APRJYtRK2Wr3SDpM,31
|
130
133
|
janito/providers/moonshotai/model_info.py,sha256=p5_q73Z5YnFbh9-_pXuHrug2DW-7G5Y_9U52dhsS11Q,396
|
131
|
-
janito/providers/moonshotai/provider.py,sha256=
|
134
|
+
janito/providers/moonshotai/provider.py,sha256=iY7qYXbJesd7cMQx89kuUFAhII0x2oSwc56JlSOF56A,3643
|
132
135
|
janito/providers/openai/__init__.py,sha256=f0m16-sIqScjL9Mp4A0CQBZx6H3PTEy0cnE08jeaB5U,38
|
133
136
|
janito/providers/openai/model_info.py,sha256=cz08O26Ychm-aP3T8guJRqpR96Im9Cwtgl2iMgM7tJs,3384
|
134
|
-
janito/providers/openai/provider.py,sha256=
|
137
|
+
janito/providers/openai/provider.py,sha256=aX8F17YRyzkZFAqUONFIP4lRVe9VlEoIneSW_gPBGdY,4809
|
135
138
|
janito/providers/openai/schema_generator.py,sha256=hTqeLcPTR8jeKn5DUUpo7b-EZ-V-g1WwXiX7MbHnFzE,2234
|
136
139
|
janito/tools/DOCSTRING_STANDARD.txt,sha256=VLPwNgjxRVD_xZSSVvUZ4H-4bBwM-VKh_RyfzYQsYSs,1735
|
137
140
|
janito/tools/README.md,sha256=5HkLpF5k4PENJER7SlDPRXj0yo9mpHvAHW4uuzhq4ak,115
|
@@ -194,9 +197,9 @@ janito/tools/adapters/local/validate_file_syntax/ps1_validator.py,sha256=TeIkPt0
|
|
194
197
|
janito/tools/adapters/local/validate_file_syntax/python_validator.py,sha256=BfCO_K18qy92m-2ZVvHsbEU5e11OPo1pO9Vz4G4616E,130
|
195
198
|
janito/tools/adapters/local/validate_file_syntax/xml_validator.py,sha256=AijlsP_PgNuC8ZbGsC5vOTt3Jur76otQzkd_7qR0QFY,284
|
196
199
|
janito/tools/adapters/local/validate_file_syntax/yaml_validator.py,sha256=TgyI0HRL6ug_gBcWEm5TGJJuA4E34ZXcIzMpAbv3oJs,155
|
197
|
-
janito-2.
|
198
|
-
janito-2.
|
199
|
-
janito-2.
|
200
|
-
janito-2.
|
201
|
-
janito-2.
|
202
|
-
janito-2.
|
200
|
+
janito-2.9.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
|
201
|
+
janito-2.9.0.dist-info/METADATA,sha256=u1ZcMKG_dSEnYOZNHJ1FpjBq6KrN2Jwhg0E58Sqh8MQ,16364
|
202
|
+
janito-2.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
203
|
+
janito-2.9.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
|
204
|
+
janito-2.9.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
|
205
|
+
janito-2.9.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|