jarvis-ai-assistant 0.1.104__py3-none-any.whl → 0.1.105__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.

Potentially problematic release.


This version of jarvis-ai-assistant might be problematic. Click here for more details.

Files changed (62) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/agent.py +124 -67
  3. jarvis/jarvis_code_agent/code_agent.py +133 -22
  4. jarvis/jarvis_code_agent/patch.py +4 -7
  5. jarvis/jarvis_code_agent/relevant_files.py +163 -72
  6. jarvis/jarvis_codebase/main.py +36 -15
  7. jarvis/jarvis_lsp/base.py +143 -0
  8. jarvis/jarvis_lsp/cpp.py +134 -0
  9. jarvis/jarvis_lsp/go.py +140 -0
  10. jarvis/jarvis_lsp/python.py +135 -0
  11. jarvis/jarvis_lsp/registry.py +234 -0
  12. jarvis/jarvis_lsp/rust.py +142 -0
  13. jarvis/jarvis_platform/__init__.py +3 -0
  14. jarvis/{models → jarvis_platform}/ai8.py +1 -1
  15. jarvis/{models → jarvis_platform}/kimi.py +1 -1
  16. jarvis/{models → jarvis_platform}/ollama.py +1 -1
  17. jarvis/{models → jarvis_platform}/openai.py +1 -1
  18. jarvis/{models → jarvis_platform}/oyi.py +1 -1
  19. jarvis/{models → jarvis_platform}/registry.py +11 -11
  20. jarvis/{jarvis_platform → jarvis_platform_manager}/main.py +1 -1
  21. jarvis/jarvis_rag/main.py +6 -6
  22. jarvis/jarvis_smart_shell/main.py +3 -3
  23. jarvis/jarvis_tools/__init__.py +0 -0
  24. jarvis/{tools → jarvis_tools}/ask_user.py +1 -1
  25. jarvis/{tools → jarvis_tools}/code_review.py +34 -8
  26. jarvis/jarvis_tools/create_code_agent.py +115 -0
  27. jarvis/{tools → jarvis_tools}/create_sub_agent.py +1 -1
  28. jarvis/jarvis_tools/deep_thinking.py +160 -0
  29. jarvis/jarvis_tools/deep_thinking_agent.py +146 -0
  30. jarvis/{tools → jarvis_tools}/git_commiter.py +2 -2
  31. jarvis/jarvis_tools/lsp_find_definition.py +134 -0
  32. jarvis/jarvis_tools/lsp_find_references.py +111 -0
  33. jarvis/jarvis_tools/lsp_get_diagnostics.py +121 -0
  34. jarvis/jarvis_tools/lsp_get_document_symbols.py +87 -0
  35. jarvis/jarvis_tools/lsp_prepare_rename.py +130 -0
  36. jarvis/jarvis_tools/lsp_validate_edit.py +141 -0
  37. jarvis/{tools → jarvis_tools}/methodology.py +6 -1
  38. jarvis/{tools → jarvis_tools}/registry.py +6 -5
  39. jarvis/{tools → jarvis_tools}/search.py +2 -2
  40. jarvis/utils.py +68 -25
  41. {jarvis_ai_assistant-0.1.104.dist-info → jarvis_ai_assistant-0.1.105.dist-info}/METADATA +21 -10
  42. jarvis_ai_assistant-0.1.105.dist-info/RECORD +62 -0
  43. {jarvis_ai_assistant-0.1.104.dist-info → jarvis_ai_assistant-0.1.105.dist-info}/entry_points.txt +4 -4
  44. jarvis/models/__init__.py +0 -3
  45. jarvis/tools/create_code_test_agent.py +0 -115
  46. jarvis/tools/create_ctags_agent.py +0 -164
  47. jarvis/tools/find_in_codebase.py +0 -78
  48. jarvis_ai_assistant-0.1.104.dist-info/RECORD +0 -50
  49. /jarvis/{models → jarvis_platform}/base.py +0 -0
  50. /jarvis/{tools → jarvis_platform_manager}/__init__.py +0 -0
  51. /jarvis/{tools → jarvis_tools}/ask_codebase.py +0 -0
  52. /jarvis/{tools → jarvis_tools}/base.py +0 -0
  53. /jarvis/{tools → jarvis_tools}/chdir.py +0 -0
  54. /jarvis/{tools → jarvis_tools}/execute_shell.py +0 -0
  55. /jarvis/{tools → jarvis_tools}/file_operation.py +0 -0
  56. /jarvis/{tools → jarvis_tools}/rag.py +0 -0
  57. /jarvis/{tools → jarvis_tools}/read_code.py +0 -0
  58. /jarvis/{tools → jarvis_tools}/read_webpage.py +0 -0
  59. /jarvis/{tools → jarvis_tools}/select_code_files.py +0 -0
  60. {jarvis_ai_assistant-0.1.104.dist-info → jarvis_ai_assistant-0.1.105.dist-info}/LICENSE +0 -0
  61. {jarvis_ai_assistant-0.1.104.dist-info → jarvis_ai_assistant-0.1.105.dist-info}/WHEEL +0 -0
  62. {jarvis_ai_assistant-0.1.104.dist-info → jarvis_ai_assistant-0.1.105.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,130 @@
1
+ import os
2
+ from typing import Dict, Any
3
+ from jarvis.jarvis_lsp.registry import LSPRegistry
4
+
5
+ class LSPPrepareRenameTool:
6
+ """Tool for checking if a symbol can be renamed using LSP."""
7
+
8
+ name = "lsp_prepare_rename"
9
+ description = "Check if a symbol can be safely renamed and show all locations that would be affected"
10
+ parameters = {
11
+ "file_path": "Path to the file containing the symbol",
12
+ "line": "Line number (0-based) of the symbol",
13
+ "character": "Character position in the line",
14
+ "language": f"Programming language of the file ({', '.join(LSPRegistry.get_global_lsp_registry().get_supported_languages())})"
15
+ }
16
+
17
+ @staticmethod
18
+ def check() -> bool:
19
+ """Check if any LSP server is available."""
20
+ registry = LSPRegistry.get_global_lsp_registry()
21
+ return len(registry.get_supported_languages()) > 0
22
+
23
+ def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
24
+ """Execute the tool."""
25
+ file_path = args.get("file_path", "")
26
+ line = args.get("line", None)
27
+ character = args.get("character", None)
28
+ language = args.get("language", "")
29
+
30
+ # Validate inputs
31
+ if not all([file_path, line is not None, character is not None, language]):
32
+ return {
33
+ "success": False,
34
+ "stderr": "All parameters (file_path, line, character, language) must be provided",
35
+ "stdout": ""
36
+ }
37
+
38
+ try:
39
+ line = int(line)
40
+ character = int(character)
41
+ except ValueError:
42
+ return {
43
+ "success": False,
44
+ "stderr": "Line and character must be integers",
45
+ "stdout": ""
46
+ }
47
+
48
+ if not os.path.exists(file_path):
49
+ return {
50
+ "success": False,
51
+ "stderr": f"File not found: {file_path}",
52
+ "stdout": ""
53
+ }
54
+
55
+ # Get LSP instance
56
+ registry = LSPRegistry.get_global_lsp_registry()
57
+ lsp = registry.create_lsp(language)
58
+
59
+ if not lsp:
60
+ return {
61
+ "success": False,
62
+ "stderr": f"No LSP support for language: {language}",
63
+ "stdout": ""
64
+ }
65
+
66
+ try:
67
+ # Initialize LSP
68
+ if not lsp.initialize(os.path.dirname(os.path.abspath(file_path))):
69
+ return {
70
+ "success": False,
71
+ "stderr": "LSP initialization failed",
72
+ "stdout": ""
73
+ }
74
+
75
+ # Get symbol at position
76
+ symbol = LSPRegistry.get_text_at_position(file_path, line, character)
77
+ if not symbol:
78
+ return {
79
+ "success": False,
80
+ "stderr": f"No symbol found at position {line}:{character}",
81
+ "stdout": ""
82
+ }
83
+
84
+ # Check if rename is possible
85
+ rename_info = lsp.prepare_rename(file_path, (line, character))
86
+ if not rename_info:
87
+ return {
88
+ "success": True,
89
+ "stdout": f"Symbol '{symbol}' cannot be renamed. It might be:\n" +
90
+ "- A built-in or library symbol\n" +
91
+ "- A read-only symbol\n" +
92
+ "- Not a valid identifier",
93
+ "stderr": ""
94
+ }
95
+
96
+ # Get all references to show affected locations
97
+ refs = lsp.find_references(file_path, (line, character))
98
+
99
+ # Format output
100
+ output = [
101
+ f"Symbol '{symbol}' can be renamed.",
102
+ f"\nRenaming will affect the following locations:"
103
+ ]
104
+
105
+ for ref in refs:
106
+ ref_line = ref["range"]["start"]["line"]
107
+ ref_char = ref["range"]["start"]["character"]
108
+ context = LSPRegistry.get_line_at_position(ref["uri"], ref_line).strip()
109
+ output.extend([
110
+ f"\nFile: {ref['uri']}",
111
+ f"Line {ref_line + 1}, Col {ref_char + 1}: {context}"
112
+ ])
113
+
114
+ output.append("\nNote: Make sure to review all locations before performing the rename.")
115
+
116
+ return {
117
+ "success": True,
118
+ "stdout": "\n".join(output),
119
+ "stderr": ""
120
+ }
121
+
122
+ except Exception as e:
123
+ return {
124
+ "success": False,
125
+ "stderr": f"Error checking rename possibility: {str(e)}",
126
+ "stdout": ""
127
+ }
128
+ finally:
129
+ if lsp:
130
+ lsp.shutdown()
@@ -0,0 +1,141 @@
1
+ import os
2
+ from typing import Dict, Any
3
+ from jarvis.jarvis_lsp.registry import LSPRegistry
4
+
5
+ class LSPValidateEditTool:
6
+ """Tool for validating code edits using LSP."""
7
+
8
+ name = "lsp_validate_edit"
9
+ description = "Validate if a proposed code edit is syntactically correct"
10
+ parameters = {
11
+ "file_path": "Path to the file to edit",
12
+ "start_line": "Starting line number (0-based) of the edit",
13
+ "start_character": "Starting character position in the start line",
14
+ "end_line": "Ending line number (0-based) of the edit",
15
+ "end_character": "Ending character position in the end line",
16
+ "new_text": "New text to insert",
17
+ "language": f"Programming language of the file ({', '.join(LSPRegistry.get_global_lsp_registry().get_supported_languages())})"
18
+ }
19
+
20
+ @staticmethod
21
+ def check() -> bool:
22
+ """Check if any LSP server is available."""
23
+ registry = LSPRegistry.get_global_lsp_registry()
24
+ return len(registry.get_supported_languages()) > 0
25
+
26
+ def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
27
+ """Execute the tool."""
28
+ file_path = args.get("file_path", "")
29
+ start_line = args.get("start_line", None)
30
+ start_character = args.get("start_character", None)
31
+ end_line = args.get("end_line", None)
32
+ end_character = args.get("end_character", None)
33
+ new_text = args.get("new_text", "")
34
+ language = args.get("language", "")
35
+
36
+ # Validate inputs
37
+ if not all([file_path, start_line is not None, start_character is not None,
38
+ end_line is not None, end_character is not None, language]):
39
+ return {
40
+ "success": False,
41
+ "stderr": "All parameters except new_text must be provided",
42
+ "stdout": ""
43
+ }
44
+
45
+ try:
46
+ start_line = int(start_line)
47
+ start_character = int(start_character)
48
+ end_line = int(end_line)
49
+ end_character = int(end_character)
50
+ except ValueError:
51
+ return {
52
+ "success": False,
53
+ "stderr": "Line and character positions must be integers",
54
+ "stdout": ""
55
+ }
56
+
57
+ if not os.path.exists(file_path):
58
+ return {
59
+ "success": False,
60
+ "stderr": f"File not found: {file_path}",
61
+ "stdout": ""
62
+ }
63
+
64
+ # Get LSP instance
65
+ registry = LSPRegistry.get_global_lsp_registry()
66
+ lsp = registry.create_lsp(language)
67
+
68
+ if not lsp:
69
+ return {
70
+ "success": False,
71
+ "stderr": f"No LSP support for language: {language}",
72
+ "stdout": ""
73
+ }
74
+
75
+ try:
76
+ # Initialize LSP
77
+ if not lsp.initialize(os.path.dirname(os.path.abspath(file_path))):
78
+ return {
79
+ "success": False,
80
+ "stderr": "LSP initialization failed",
81
+ "stdout": ""
82
+ }
83
+
84
+ # Prepare edit operation
85
+ edit = {
86
+ "range": {
87
+ "start": {"line": start_line, "character": start_character},
88
+ "end": {"line": end_line, "character": end_character}
89
+ },
90
+ "newText": new_text
91
+ }
92
+
93
+ # Show the edit preview
94
+ output = ["Edit Preview:"]
95
+
96
+ # Show original code
97
+ try:
98
+ with open(file_path, 'r') as f:
99
+ lines = f.readlines()
100
+ context_start = max(0, start_line - 2)
101
+ context_end = min(len(lines), end_line + 3)
102
+
103
+ output.append("\nOriginal code:")
104
+ for i in range(context_start, context_end):
105
+ prefix = ">" if start_line <= i <= end_line else " "
106
+ output.append(f"{prefix} {i+1:4d} | {lines[i].rstrip()}")
107
+ except Exception:
108
+ pass
109
+
110
+ # Show new text
111
+ output.extend([
112
+ "\nNew text to insert:",
113
+ new_text,
114
+ "\nEdit range:",
115
+ f"From line {start_line + 1}, character {start_character}",
116
+ f"To line {end_line + 1}, character {end_character}"
117
+ ])
118
+
119
+ # Validate edit
120
+ is_valid = lsp.validate_edit(file_path, edit)
121
+
122
+ if is_valid:
123
+ output.append("\nValidation Result: The edit is syntactically correct ✓")
124
+ else:
125
+ output.append("\nValidation Result: The edit would introduce syntax errors ✗")
126
+
127
+ return {
128
+ "success": True,
129
+ "stdout": "\n".join(output),
130
+ "stderr": ""
131
+ }
132
+
133
+ except Exception as e:
134
+ return {
135
+ "success": False,
136
+ "stderr": f"Error validating edit: {str(e)}",
137
+ "stdout": ""
138
+ }
139
+ finally:
140
+ if lsp:
141
+ lsp.shutdown()
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import yaml
3
3
  from typing import Dict, Optional, Any
4
- from jarvis.utils import OutputType, PrettyOutput
4
+ from jarvis.utils import OutputType, PrettyOutput, is_use_methodology
5
5
 
6
6
 
7
7
  class MethodologyTool:
@@ -29,6 +29,11 @@ class MethodologyTool:
29
29
  },
30
30
  "required": ["operation", "problem_type"]
31
31
  }
32
+
33
+ @staticmethod
34
+ def check()->bool:
35
+ """Check if the methodology is enabled"""
36
+ return is_use_methodology()
32
37
 
33
38
  def __init__(self):
34
39
  """Initialize the experience management tool"""
@@ -3,12 +3,12 @@ from pathlib import Path
3
3
  import sys
4
4
  from typing import Any, Callable, Dict, List, Optional
5
5
 
6
- from jarvis.models.registry import PlatformRegistry
7
- from jarvis.tools.base import Tool
6
+ from jarvis.jarvis_platform.registry import PlatformRegistry
7
+ from jarvis.jarvis_tools.base import Tool
8
8
  from jarvis.utils import OutputType, PrettyOutput, get_max_context_length
9
9
 
10
10
 
11
- tool_call_help = """Tool Usage Format:
11
+ tool_call_help = """## Tool Usage Format
12
12
 
13
13
  <TOOL_CALL>
14
14
  name: tool_name
@@ -49,7 +49,7 @@ class ToolRegistry:
49
49
  """Load tools"""
50
50
  tools = self.get_all_tools()
51
51
  if tools:
52
- tools_prompt = "Available tools:\n"
52
+ tools_prompt = "## Available tools:\n"
53
53
  for tool in tools:
54
54
  tools_prompt += f"- Name: {tool['name']}\n"
55
55
  tools_prompt += f" Description: {tool['description']}\n"
@@ -136,7 +136,8 @@ class ToolRegistry:
136
136
  if (isinstance(item, type) and
137
137
  hasattr(item, 'name') and
138
138
  hasattr(item, 'description') and
139
- hasattr(item, 'parameters')):
139
+ hasattr(item, 'parameters') and
140
+ hasattr(item, 'execute')):
140
141
 
141
142
  if hasattr(item, "check"):
142
143
  if not item.check():
@@ -1,7 +1,7 @@
1
1
  from typing import Dict, Any, List
2
- from jarvis.models.registry import PlatformRegistry
2
+ from jarvis.jarvis_platform.registry import PlatformRegistry
3
3
  from jarvis.utils import PrettyOutput, OutputType
4
- from jarvis.tools.read_webpage import WebpageTool
4
+ from jarvis.jarvis_tools.read_webpage import WebpageTool
5
5
  from playwright.sync_api import sync_playwright
6
6
  from urllib.parse import quote
7
7
 
jarvis/utils.py CHANGED
@@ -85,7 +85,7 @@ class PrettyOutput:
85
85
  """Pretty output using rich"""
86
86
 
87
87
  # Icons for different output types
88
- ICONS = {
88
+ _ICONS = {
89
89
  OutputType.SYSTEM: "🤖", # Robot - AI assistant
90
90
  OutputType.CODE: "📝", # Notebook - Code
91
91
  OutputType.RESULT: "✨", # Flash - Result
@@ -147,7 +147,7 @@ class PrettyOutput:
147
147
  return default_lang
148
148
 
149
149
  @staticmethod
150
- def format(text: str, output_type: OutputType, timestamp: bool = True) -> Text:
150
+ def _format(text: str, output_type: OutputType, timestamp: bool = True) -> Text:
151
151
  """Format output text using rich Text"""
152
152
  # Create rich Text object
153
153
  formatted = Text()
@@ -157,7 +157,7 @@ class PrettyOutput:
157
157
  formatted.append(f"[{datetime.now().strftime('%H:%M:%S')}] ", style="white")
158
158
  formatted.append(f"[{get_agent_list()}]", style="blue")
159
159
  # Add icon
160
- icon = PrettyOutput.ICONS.get(output_type, "")
160
+ icon = PrettyOutput._ICONS.get(output_type, "")
161
161
  formatted.append(f"{icon} ", style=output_type.value)
162
162
 
163
163
  return formatted
@@ -167,7 +167,7 @@ class PrettyOutput:
167
167
  """Print formatted output using rich console"""
168
168
  # Get formatted header
169
169
  lang = lang if lang is not None else PrettyOutput._detect_language(text, default_lang='markdown')
170
- header = PrettyOutput.format("", output_type, timestamp)
170
+ header = PrettyOutput._format("", output_type, timestamp)
171
171
 
172
172
  content = Syntax(text, lang, theme="monokai")
173
173
 
@@ -208,14 +208,6 @@ def get_single_line_input(tip: str) -> str:
208
208
  })
209
209
  return session.prompt(f"{tip}", style=style)
210
210
 
211
- def make_choice_input(tip: str, choices: list) -> str:
212
- """Get choice input, support direction key, history function, etc."""
213
- session = PromptSession(history=None)
214
- style = PromptStyle.from_dict({
215
- 'prompt': 'ansicyan',
216
- })
217
- return session.prompt(f"{tip}", style=style)
218
-
219
211
  class FileCompleter(Completer):
220
212
  """Custom completer for file paths with fuzzy matching."""
221
213
  def __init__(self):
@@ -341,7 +333,7 @@ def init_env():
341
333
  with open(env_file, "r", encoding="utf-8") as f:
342
334
  for line in f:
343
335
  line = line.strip()
344
- if line and not line.startswith("#"):
336
+ if line and not line.startswith(("#", ";")):
345
337
  try:
346
338
  key, value = line.split("=", 1)
347
339
  os.environ[key.strip()] = value.strip().strip("'").strip('"')
@@ -445,8 +437,7 @@ def load_rerank_model():
445
437
 
446
438
  return model, tokenizer
447
439
 
448
- def get_max_context_length():
449
- return int(os.getenv('JARVIS_MAX_CONTEXT_LENGTH', '131072')) # 默认128k
440
+
450
441
 
451
442
  def is_long_context(files: list) -> bool:
452
443
  """Check if the file list belongs to a long context (total characters exceed 80% of the maximum context length)"""
@@ -468,15 +459,12 @@ def is_long_context(files: list) -> bool:
468
459
 
469
460
  return total_chars > threshold
470
461
 
471
- def get_thread_count():
472
- return int(os.getenv('JARVIS_THREAD_COUNT', '1'))
462
+
473
463
 
474
464
  def get_file_md5(filepath: str)->str:
475
465
  return hashlib.md5(open(filepath, "rb").read(100*1024*1024)).hexdigest()
476
466
 
477
467
 
478
- def dont_use_local_model():
479
- return os.getenv('JARVIS_DONT_USE_LOCAL_MODEL', 'false') == 'true'
480
468
 
481
469
 
482
470
  def _create_methodology_embedding(embedding_model: Any, methodology_text: str) -> np.ndarray:
@@ -576,12 +564,7 @@ def load_methodology(user_input: str) -> str:
576
564
  import traceback
577
565
  PrettyOutput.print(f"Error trace: {traceback.format_exc()}", OutputType.INFO)
578
566
  return ""
579
-
580
- def is_auto_complete() -> bool:
581
- return os.getenv('JARVIS_AUTO_COMPLETE', 'false') == 'true'
582
567
 
583
- def is_disable_codebase() -> bool:
584
- return os.getenv('JARVIS_DISABLE_CODEBASE', 'false') == 'true'
585
568
 
586
569
  def user_confirm(tip: str, default: bool = True) -> bool:
587
570
  """Prompt the user for confirmation.
@@ -601,4 +584,64 @@ def get_file_line_count(filename: str) -> int:
601
584
  try:
602
585
  return len(open(filename, "r", encoding="utf-8").readlines())
603
586
  except Exception as e:
604
- return 0
587
+ return 0
588
+
589
+ def get_max_context_length():
590
+ return int(os.getenv('JARVIS_MAX_CONTEXT_LENGTH', '131072')) # 默认128k
591
+
592
+ def get_thread_count():
593
+ return int(os.getenv('JARVIS_THREAD_COUNT', '1'))
594
+
595
+ def dont_use_local_model():
596
+ return os.getenv('JARVIS_DONT_USE_LOCAL_MODEL', 'false') == 'true'
597
+
598
+ def is_auto_complete() -> bool:
599
+ return os.getenv('JARVIS_AUTO_COMPLETE', 'false') == 'true'
600
+
601
+ def is_disable_codebase() -> bool:
602
+ return os.getenv('JARVIS_DISABLE_CODEBASE', 'false') == 'true'
603
+
604
+ def is_use_methodology() -> bool:
605
+ return os.getenv('JARVIS_USE_METHODOLOGY', 'true') == 'true'
606
+
607
+ def is_record_methodology() -> bool:
608
+ return os.getenv('JARVIS_RECORD_METHODOLOGY', 'true') == 'true'
609
+
610
+ def is_need_summary() -> bool:
611
+ return os.getenv('JARVIS_NEED_SUMMARY', 'true') == 'true'
612
+
613
+ def get_min_paragraph_length() -> int:
614
+ return int(os.getenv('JARVIS_MIN_PARAGRAPH_LENGTH', '50'))
615
+
616
+ def get_max_paragraph_length() -> int:
617
+ return int(os.getenv('JARVIS_MAX_PARAGRAPH_LENGTH', '1000'))
618
+
619
+ def get_context_window() -> int:
620
+ return int(os.getenv('JARVIS_CONTEXT_WINDOW', '5'))
621
+
622
+ def get_shell_name() -> str:
623
+ return os.getenv('SHELL', 'bash')
624
+
625
+ def get_normal_platform_name() -> str:
626
+ return os.getenv('JARVIS_PLATFORM', 'kimi')
627
+
628
+ def get_normal_model_name() -> str:
629
+ return os.getenv('JARVIS_MODEL', 'kimi')
630
+
631
+ def get_codegen_platform_name() -> str:
632
+ return os.getenv('JARVIS_CODEGEN_PLATFORM', os.getenv('JARVIS_PLATFORM', 'kimi'))
633
+
634
+ def get_codegen_model_name() -> str:
635
+ return os.getenv('JARVIS_CODEGEN_MODEL', os.getenv('JARVIS_MODEL', 'kimi'))
636
+
637
+ def get_thinking_platform_name() -> str:
638
+ return os.getenv('JARVIS_THINKING_PLATFORM', os.getenv('JARVIS_PLATFORM', 'kimi'))
639
+
640
+ def get_thinking_model_name() -> str:
641
+ return os.getenv('JARVIS_THINKING_MODEL', os.getenv('JARVIS_MODEL', 'kimi'))
642
+
643
+ def get_cheap_platform_name() -> str:
644
+ return os.getenv('JARVIS_CHEAP_PLATFORM', os.getenv('JARVIS_PLATFORM', 'kimi'))
645
+
646
+ def get_cheap_model_name() -> str:
647
+ return os.getenv('JARVIS_CHEAP_MODEL', os.getenv('JARVIS_MODEL', 'kimi'))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.104
3
+ Version: 0.1.105
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire
@@ -59,6 +59,7 @@ Requires-Dist: rich>=13.3.1
59
59
  Requires-Dist: pygments>=2.15.0
60
60
  Requires-Dist: fuzzywuzzy>=0.18.0
61
61
  Requires-Dist: python-Levenshtein>=0.26.1
62
+ Requires-Dist: jedi>=0.19.0
62
63
  Provides-Extra: dev
63
64
  Requires-Dist: pytest; extra == "dev"
64
65
  Requires-Dist: black; extra == "dev"
@@ -133,15 +134,25 @@ Jarvis supports configuration through environment variables that can be set in t
133
134
 
134
135
  | Environment Variable | Description | Default Value | Required |
135
136
  |---------|------|--------|------|
136
- | JARVIS_PLATFORM | AI platform to use, supports kimi/openai/ai8 etc | kimi | Yes |
137
- | JARVIS_MODEL | Model name to use | - | No |
138
- | JARVIS_CODEGEN_PLATFORM | AI platform for code generation | Same as JARVIS_PLATFORM | No |
139
- | JARVIS_CODEGEN_MODEL | Model name for code generation | Same as JARVIS_MODEL | No |
140
- | JARVIS_CHEAP_PLATFORM | AI platform for cheap operations | Same as JARVIS_PLATFORM | No |
141
- | JARVIS_CHEAP_MODEL | Model name for cheap operations | Same as JARVIS_MODEL | No |
142
- | JARVIS_THINKING_PLATFORM | AI platform for thinking | Same as JARVIS_PLATFORM | No |
143
- | JARVIS_THINKING_MODEL | Model name for thinking | Same as JARVIS_MODEL | No |
144
- | JARVIS_THREAD_COUNT | Number of threads for parallel processing | 10 | No |
137
+ | JARVIS_PLATFORM | AI platform to use | kimi | Yes |
138
+ | JARVIS_MODEL | Model name to use | kimi | No |
139
+ | JARVIS_CODEGEN_PLATFORM | Platform for code generation | Same as JARVIS_PLATFORM | No |
140
+ | JARVIS_CODEGEN_MODEL | Model for code generation | Same as JARVIS_MODEL | No |
141
+ | JARVIS_THINKING_PLATFORM | Platform for thinking tasks | Same as JARVIS_PLATFORM | No |
142
+ | JARVIS_THINKING_MODEL | Model for thinking tasks | Same as JARVIS_MODEL | No |
143
+ | JARVIS_CHEAP_PLATFORM | Platform for cheap operations | Same as JARVIS_PLATFORM | No |
144
+ | JARVIS_CHEAP_MODEL | Model for cheap operations | Same as JARVIS_MODEL | No |
145
+ | JARVIS_THREAD_COUNT | Number of threads | 1 | No |
146
+ | JARVIS_MAX_CONTEXT_LENGTH | Maximum context length | 131072 | No |
147
+ | JARVIS_MIN_PARAGRAPH_LENGTH | Minimum paragraph length | 50 | No |
148
+ | JARVIS_MAX_PARAGRAPH_LENGTH | Maximum paragraph length | 1000 | No |
149
+ | JARVIS_CONTEXT_WINDOW | Context window size | 5 | No |
150
+ | JARVIS_AUTO_COMPLETE | Enable auto completion | false | No |
151
+ | JARVIS_DISABLE_CODEBASE | Disable codebase features | false | No |
152
+ | JARVIS_USE_METHODOLOGY | Enable methodology | true | No |
153
+ | JARVIS_RECORD_METHODOLOGY | Record methodology | true | No |
154
+ | JARVIS_NEED_SUMMARY | Generate summaries | true | No |
155
+ | JARVIS_DONT_USE_LOCAL_MODEL | Avoid using local models | false | No |
145
156
  | OPENAI_API_KEY | API key for OpenAI platform | - | Required for OpenAI |
146
157
  | OPENAI_API_BASE | Base URL for OpenAI API | https://api.deepseek.com | No |
147
158
  | OPENAI_MODEL_NAME | Model name for OpenAI | deepseek-chat | No |
@@ -0,0 +1,62 @@
1
+ jarvis/__init__.py,sha256=0EXA0IHadgSMXwFk2DyUhbdBSMBlm1Lgw0M-vuBVhI4,51
2
+ jarvis/agent.py,sha256=7FDrJc2_JlY9u7TRfeHKZRQ0PrY04r-0w4H64eGcbUM,22626
3
+ jarvis/utils.py,sha256=0w1rYsSovS7vgbHNdfdzpo3zSb3y-KWM7RvYMqBhDnM,22086
4
+ jarvis/jarvis_code_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ jarvis/jarvis_code_agent/code_agent.py,sha256=DDKqM4m235Ryd8aMHbHKeC0ULdNLF6JPW__FKbI-Gk0,10748
6
+ jarvis/jarvis_code_agent/file_select.py,sha256=KNxalhepCM2e-V__ca8ErmbXSXHP_1xmd0UEVWUXic8,8083
7
+ jarvis/jarvis_code_agent/patch.py,sha256=bbNB8k8mebjPVsNdI8aT3oOyjLyAhUQbKmX54tyziDk,4034
8
+ jarvis/jarvis_code_agent/relevant_files.py,sha256=PxSKQyHfCe6878bDqP6XyQd_jwcvNK4a9YKTfpLImRI,6160
9
+ jarvis/jarvis_codebase/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ jarvis/jarvis_codebase/main.py,sha256=8ihn2JpZE27VwV2BC5kKSZxsuYyVOppcqOJU0UPMd80,37570
11
+ jarvis/jarvis_lsp/base.py,sha256=_7pdbMKjdtYBW0DsRbjIodDHM3J7df-YgXHejN_WIrU,4490
12
+ jarvis/jarvis_lsp/cpp.py,sha256=F7Zo3BErkvtWS1_H9zQO83pX_FUmnijux-2SjhWzKCE,4985
13
+ jarvis/jarvis_lsp/go.py,sha256=p8LULiFdq4qjDYQzXFlzH0-FQZ3IyfiwN_sbO9i0L_A,5310
14
+ jarvis/jarvis_lsp/python.py,sha256=MpnCWDwudJuSZuIxAU7o79ADLAqw_BaVpOzqwRZw-sg,4807
15
+ jarvis/jarvis_lsp/registry.py,sha256=e3gw1ubIi64YyjkbvhgvsxIpb5iWS5glD_279kMASCg,9831
16
+ jarvis/jarvis_lsp/rust.py,sha256=VeInvOvjcK2otOM4bTakjII6bJHl6TockwpXD3PLi5U,5541
17
+ jarvis/jarvis_platform/__init__.py,sha256=mrOt67nselz_H1gX9wdAO4y2DY5WPXzABqJbr5Des8k,63
18
+ jarvis/jarvis_platform/ai8.py,sha256=ZBWHZ1QQp8gjgEAVgDWPmzoALA1v8TKNdlo-hV5DkuY,12003
19
+ jarvis/jarvis_platform/base.py,sha256=nQ-rsJL1Z-gMev3TPoY7tYdwxhCJY8LG6_gtJ-maiW0,2181
20
+ jarvis/jarvis_platform/kimi.py,sha256=3yiOL2PsEcKEL0Yj0Hm3lTg9M0Ahy0Ou1AUnJ0AS0Ss,15768
21
+ jarvis/jarvis_platform/ollama.py,sha256=9Ptu-UzRMnNxqFlx9uDpHO0_Imrzf0Wfw9sZqnv2wRI,5681
22
+ jarvis/jarvis_platform/openai.py,sha256=NYAIaQbFH9Usg5ZxkBSek1F0imu-pDB9Qf6Am0AtU0s,4130
23
+ jarvis/jarvis_platform/oyi.py,sha256=mV8tsQty2Htz--DNemBAnCiauih3JQ4jSyuZi5L4WQo,15089
24
+ jarvis/jarvis_platform/registry.py,sha256=9QLoihcnkYckrCzgNnlTqaLn_z_HMhaxMSyUNb8IEys,8538
25
+ jarvis/jarvis_platform_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ jarvis/jarvis_platform_manager/main.py,sha256=17607aNAStqJ1sOQLTGi6Tnv-cIQme_r5YvbB_S3enc,4985
27
+ jarvis/jarvis_rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ jarvis/jarvis_rag/main.py,sha256=0bVISZxDNZQpOUzAsTFl3QbISBiOMpJWMectmTzA4Hk,33164
29
+ jarvis/jarvis_smart_shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ jarvis/jarvis_smart_shell/main.py,sha256=VdUR-x932OccEwU0pcQM_pb_I4yfrAutE3hfm6jf5es,3955
31
+ jarvis/jarvis_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ jarvis/jarvis_tools/ask_codebase.py,sha256=1mLe9CHDU-NFJHmu3mxrWuA4IiHqQyum2ga31P3hLzU,2991
33
+ jarvis/jarvis_tools/ask_user.py,sha256=9ZhIffoPGSfxJIwiIsL03V95yM8uYJsRg7j1C8ltNGc,1830
34
+ jarvis/jarvis_tools/base.py,sha256=c0DMoDDPxmsqUYJR989zgUs7nIYRY6GWBrAdusIZKjc,656
35
+ jarvis/jarvis_tools/chdir.py,sha256=A53BNXFB9tvwoV_cxW_LpF_DfxANgAEJ8rjikTaTa-I,1813
36
+ jarvis/jarvis_tools/code_review.py,sha256=SY6Xw1VhAmmNVCJZsgd6ItDBmth4bgjnpd0T0afGVSA,8581
37
+ jarvis/jarvis_tools/create_code_agent.py,sha256=prkWzgYPMt6N2IHaom5cyEQCE4d0adRRG3K1E71Tbfk,3923
38
+ jarvis/jarvis_tools/create_sub_agent.py,sha256=jBwh8hvg_LST2biLwjZkLseJFegn56mTdjh-xCIghmo,2860
39
+ jarvis/jarvis_tools/deep_thinking.py,sha256=ltsMUfmE8XNyYTkgpWMD1Qow-6_x0dcD8WL7qL4i8R8,4471
40
+ jarvis/jarvis_tools/deep_thinking_agent.py,sha256=UBBWq8kp6SDEhwYXjO-tMMHP7Wblx5OA-gpQ8h_1tdk,4378
41
+ jarvis/jarvis_tools/execute_shell.py,sha256=bawfof8bUg3f9bjyCSifLa9bU-hkNoNOuos22uZffdg,2564
42
+ jarvis/jarvis_tools/file_operation.py,sha256=-1U_J5SEuBjRylzEl7wvCfjspNv6aA49UvFHLNQ3bJU,4098
43
+ jarvis/jarvis_tools/git_commiter.py,sha256=4dcFMTN3qmfuTfMkF6an4K95PTR1_0qBoplr20lH2jQ,2565
44
+ jarvis/jarvis_tools/lsp_find_definition.py,sha256=xV8YeN1RJfwd2F3gE6OnDeTwl-AnCmrxueHocbXkQOc,4800
45
+ jarvis/jarvis_tools/lsp_find_references.py,sha256=FohlJeLfTxcMUASfbjOT93hQGtI2WeyTpMGwRwShW_I,4043
46
+ jarvis/jarvis_tools/lsp_get_diagnostics.py,sha256=bEvbDk8TnKg9TTFFxMrYOJm5TBDgz5gO04WJFQUwQQE,4490
47
+ jarvis/jarvis_tools/lsp_get_document_symbols.py,sha256=dspL6r9HYnXL5TpARSApFY3IQLm2kcYVNVWCff2xoXI,3080
48
+ jarvis/jarvis_tools/lsp_prepare_rename.py,sha256=RxUyIef4awtp-jgupcD1LcPlno9P3mOE8AS3_Fm71Ys,4832
49
+ jarvis/jarvis_tools/lsp_validate_edit.py,sha256=M0iglK2QbnIEFv0RYK6o2iAYnv259jB6EU7To-rc51E,5247
50
+ jarvis/jarvis_tools/methodology.py,sha256=RFqcVjKuj8ESGmNYcQz_HyphsitDvF3XtqgGaqhafDQ,5770
51
+ jarvis/jarvis_tools/rag.py,sha256=2fQHqc4bw8JM-OxGTsHobLIOTo8Mip3rdtJCmAoY8XU,4952
52
+ jarvis/jarvis_tools/read_code.py,sha256=5DGmeXTgumAiG0RP1xB4sF4NdmBm5BEGjRRlIBzjGnQ,4002
53
+ jarvis/jarvis_tools/read_webpage.py,sha256=JCReSXhkDHDkQ606sZYIKG1Itlprjpmu1sSbF-Ed-jI,2478
54
+ jarvis/jarvis_tools/registry.py,sha256=mkAQ1NDPwDy1ESAaAFnzSxAJRrhce3NO3E7cWkb-quA,11732
55
+ jarvis/jarvis_tools/search.py,sha256=PLSSNETyajpqDoStCTfkoy-D41IMNudTuVzonMlT6Aw,9225
56
+ jarvis/jarvis_tools/select_code_files.py,sha256=bjJGwCNw0Ue_8jW60K1gcy1rUgKqoHihicu5SS58WNk,1890
57
+ jarvis_ai_assistant-0.1.105.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
58
+ jarvis_ai_assistant-0.1.105.dist-info/METADATA,sha256=NvR8zVsZ4g8uY-D64oppY_D_AmEfyf9IgPOnwxr6hQI,14208
59
+ jarvis_ai_assistant-0.1.105.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
60
+ jarvis_ai_assistant-0.1.105.dist-info/entry_points.txt,sha256=jF_A8npBiI3icEvMlWAs_MEQNjRSczY1TKeu5a-Cvl0,539
61
+ jarvis_ai_assistant-0.1.105.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
62
+ jarvis_ai_assistant-0.1.105.dist-info/RECORD,,
@@ -1,11 +1,11 @@
1
1
  [console_scripts]
2
2
  jarvis = jarvis.agent:main
3
3
  jarvis-code-agent = jarvis.jarvis_code_agent.code_agent:main
4
- jarvis-code-review = jarvis.tools.code_review:main
4
+ jarvis-code-review = jarvis.jarvis_tools.code_review:main
5
5
  jarvis-codebase = jarvis.jarvis_codebase.main:main
6
- jarvis-ctags = jarvis.tools.create_ctags_agent:main
7
- jarvis-git-commit = jarvis.tools.git_commiter:main
8
- jarvis-platform = jarvis.jarvis_platform.main:main
6
+ jarvis-ctags = jarvis.jarvis_tools.create_ctags_agent:main
7
+ jarvis-git-commit = jarvis.jarvis_tools.git_commiter:main
8
+ jarvis-platform-manager = jarvis.jarvis_platform_manager.main:main
9
9
  jarvis-rag = jarvis.jarvis_rag.main:main
10
10
  jarvis-smart-shell = jarvis.jarvis_smart_shell.main:main
11
11
  jss = jarvis.jarvis_smart_shell.main:main
jarvis/models/__init__.py DELETED
@@ -1,3 +0,0 @@
1
- from .base import BasePlatform
2
-
3
- __all__ = ['BasePlatform']