jarvis-ai-assistant 0.1.141__py3-none-any.whl → 0.1.142__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.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/patch.py +76 -49
- jarvis/jarvis_agent/shell_input_handler.py +1 -0
- jarvis/jarvis_code_analysis/code_review.py +8 -13
- jarvis/jarvis_git_utils/git_commiter.py +11 -13
- jarvis/jarvis_platform/kimi.py +0 -1
- jarvis/jarvis_platform/yuanbao.py +60 -55
- jarvis/jarvis_tools/file_analyzer.py +5 -5
- jarvis/jarvis_tools/registry.py +7 -7
- jarvis/jarvis_utils/config.py +4 -0
- jarvis/jarvis_utils/methodology.py +26 -26
- {jarvis_ai_assistant-0.1.141.dist-info → jarvis_ai_assistant-0.1.142.dist-info}/METADATA +1 -1
- {jarvis_ai_assistant-0.1.141.dist-info → jarvis_ai_assistant-0.1.142.dist-info}/RECORD +17 -17
- {jarvis_ai_assistant-0.1.141.dist-info → jarvis_ai_assistant-0.1.142.dist-info}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.141.dist-info → jarvis_ai_assistant-0.1.142.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.1.141.dist-info → jarvis_ai_assistant-0.1.142.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.141.dist-info → jarvis_ai_assistant-0.1.142.dist-info}/top_level.txt +0 -0
jarvis/__init__.py
CHANGED
jarvis/jarvis_agent/patch.py
CHANGED
|
@@ -9,7 +9,8 @@ from jarvis.jarvis_platform.base import BasePlatform
|
|
|
9
9
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
|
10
10
|
from jarvis.jarvis_git_utils.git_commiter import GitCommitTool
|
|
11
11
|
from jarvis.jarvis_tools.file_operation import FileOperationTool
|
|
12
|
-
from jarvis.jarvis_utils.config import is_confirm_before_apply_patch
|
|
12
|
+
from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_token_count, is_confirm_before_apply_patch
|
|
13
|
+
from jarvis.jarvis_utils.embedding import get_context_token_count
|
|
13
14
|
from jarvis.jarvis_utils.git_utils import get_commits_between, get_latest_commit_hash
|
|
14
15
|
from jarvis.jarvis_utils.globals import add_read_file_record, has_read_file
|
|
15
16
|
from jarvis.jarvis_utils.input import get_multiline_input
|
|
@@ -308,8 +309,11 @@ def handle_small_code_operation(filepath: str, patch_content: str) -> bool:
|
|
|
308
309
|
with yaspin(text=f"正在修改文件 {filepath}...", color="cyan") as spinner:
|
|
309
310
|
try:
|
|
310
311
|
model = PlatformRegistry().get_normal_platform()
|
|
312
|
+
upload_success = False
|
|
313
|
+
file_content = FileOperationTool().execute({"operation":"read", "files":[{"path":filepath}]})["stdout"]
|
|
311
314
|
with spinner.hidden():
|
|
312
|
-
model.upload_files([filepath])
|
|
315
|
+
if get_context_token_count(file_content) > get_max_input_token_count() - INPUT_WINDOW_REVERSE_SIZE and model.upload_files([filepath]):
|
|
316
|
+
upload_success = True
|
|
313
317
|
|
|
314
318
|
model.set_suppress_output(False)
|
|
315
319
|
|
|
@@ -342,7 +346,12 @@ def handle_small_code_operation(filepath: str, patch_content: str) -> bool:
|
|
|
342
346
|
[合并后的完整代码,包括所有空行和缩进]
|
|
343
347
|
{ct("MERGED_CODE")}
|
|
344
348
|
"""
|
|
345
|
-
|
|
349
|
+
if not upload_success:
|
|
350
|
+
prompt += f"""
|
|
351
|
+
# 原始代码
|
|
352
|
+
{file_content}
|
|
353
|
+
"""
|
|
354
|
+
|
|
346
355
|
count = 30
|
|
347
356
|
start_line = -1
|
|
348
357
|
end_line = -1
|
|
@@ -403,9 +412,13 @@ def handle_large_code_operation(filepath: str, patch_content: str, model: BasePl
|
|
|
403
412
|
"""处理大型代码文件的补丁操作,使用差异化补丁格式"""
|
|
404
413
|
with yaspin(text=f"正在处理文件 {filepath}...", color="cyan") as spinner:
|
|
405
414
|
try:
|
|
415
|
+
file_content = FileOperationTool().execute({"operation":"read", "files":[{"path":filepath}]})["stdout"]
|
|
416
|
+
upload_success = False
|
|
406
417
|
# 读取原始文件内容
|
|
407
418
|
with spinner.hidden():
|
|
408
|
-
model.upload_files([filepath])
|
|
419
|
+
if get_context_token_count(file_content) > get_max_input_token_count() - INPUT_WINDOW_REVERSE_SIZE and model.upload_files([filepath]):
|
|
420
|
+
upload_success = True
|
|
421
|
+
|
|
409
422
|
|
|
410
423
|
model.set_suppress_output(False)
|
|
411
424
|
|
|
@@ -434,13 +447,13 @@ def handle_large_code_operation(filepath: str, patch_content: str, model: BasePl
|
|
|
434
447
|
- 每个{ot("DIFF")}块必须包含SEARCH部分和REPLACE部分
|
|
435
448
|
- SEARCH部分是需要查找的原始代码
|
|
436
449
|
- REPLACE部分是替换后的新代码
|
|
437
|
-
- 确保SEARCH
|
|
450
|
+
- 确保SEARCH部分能在原文件中**唯一匹配**
|
|
438
451
|
- 如果修改较大,可以使用多个{ot("DIFF")}块
|
|
439
452
|
|
|
440
453
|
## 输出模板
|
|
441
454
|
{ot("DIFF")}
|
|
442
455
|
>>>>>> SEARCH
|
|
443
|
-
[
|
|
456
|
+
[需要查找的原始代码,包含足够上下文,避免出现可匹配多处的情况]
|
|
444
457
|
======
|
|
445
458
|
[替换后的新代码]
|
|
446
459
|
<<<<<< REPLACE
|
|
@@ -448,55 +461,69 @@ def handle_large_code_operation(filepath: str, patch_content: str, model: BasePl
|
|
|
448
461
|
|
|
449
462
|
{ot("DIFF")}
|
|
450
463
|
>>>>>> SEARCH
|
|
451
|
-
[
|
|
464
|
+
[另一处需要查找的原始代码,包含足够上下文,避免出现可匹配多处的情况]
|
|
452
465
|
======
|
|
453
466
|
[另一处替换后的新代码]
|
|
454
467
|
<<<<<< REPLACE
|
|
455
468
|
{ct("DIFF")}
|
|
456
469
|
"""
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
470
|
+
if not upload_success:
|
|
471
|
+
prompt += f"""
|
|
472
|
+
# 原始代码
|
|
473
|
+
{file_content}
|
|
474
|
+
"""
|
|
475
|
+
for _ in range(3):
|
|
476
|
+
# 获取补丁内容
|
|
477
|
+
with spinner.hidden():
|
|
478
|
+
response = model.chat_until_success(prompt)
|
|
479
|
+
|
|
480
|
+
# 解析差异化补丁
|
|
481
|
+
diff_blocks = re.finditer(ot("DIFF")+r'\s*>{4,} SEARCH\n?(.*?)\n?={4,}\n?(.*?)\s*<{4,} REPLACE\n?'+ct("DIFF"),
|
|
482
|
+
response, re.DOTALL)
|
|
483
|
+
|
|
484
|
+
# 读取原始文件内容
|
|
485
|
+
with open(filepath, 'r', encoding='utf-8', errors="ignore") as f:
|
|
486
|
+
file_content = f.read()
|
|
487
|
+
|
|
488
|
+
# 应用所有差异化补丁
|
|
489
|
+
modified_content = file_content
|
|
490
|
+
patch_count = 0
|
|
491
|
+
success = True
|
|
492
|
+
for match in diff_blocks:
|
|
493
|
+
search_text = match.group(1).strip()
|
|
494
|
+
replace_text = match.group(2).strip()
|
|
495
|
+
patch_count += 1
|
|
496
|
+
# 检查搜索文本是否存在于文件中
|
|
497
|
+
if search_text in modified_content:
|
|
498
|
+
# 如果有多处,报错
|
|
499
|
+
if modified_content.count(search_text) > 1:
|
|
500
|
+
spinner.text = f"补丁 #{patch_count} 应用失败:找到多个匹配的代码段"
|
|
501
|
+
prompt = f"补丁 #{patch_count} 应用失败:找到多个匹配的代码段"
|
|
502
|
+
spinner.fail("❌")
|
|
503
|
+
success = False
|
|
504
|
+
break
|
|
505
|
+
# 应用替换
|
|
506
|
+
modified_content = modified_content.replace(
|
|
507
|
+
search_text, replace_text)
|
|
508
|
+
spinner.write(f"✅ 补丁 #{patch_count} 应用成功")
|
|
509
|
+
else:
|
|
510
|
+
spinner.text = f"补丁 #{patch_count} 应用失败:无法找到匹配的代码段"
|
|
511
|
+
prompt = f"补丁 #{patch_count} 应用失败:无法找到匹配的代码段"
|
|
482
512
|
spinner.fail("❌")
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
spinner.text = f"文件 {filepath} 修改完成,应用了 {patch_count} 个补丁"
|
|
498
|
-
spinner.ok("✅")
|
|
499
|
-
return True
|
|
513
|
+
success = False
|
|
514
|
+
break
|
|
515
|
+
if not success:
|
|
516
|
+
revert_file(filepath)
|
|
517
|
+
continue
|
|
518
|
+
|
|
519
|
+
# 写入修改后的内容
|
|
520
|
+
with open(filepath, 'w', encoding='utf-8', errors="ignore") as f:
|
|
521
|
+
f.write(modified_content)
|
|
522
|
+
|
|
523
|
+
spinner.text = f"文件 {filepath} 修改完成,应用了 {patch_count} 个补丁"
|
|
524
|
+
spinner.ok("✅")
|
|
525
|
+
return True
|
|
526
|
+
return False
|
|
500
527
|
|
|
501
528
|
except Exception as e:
|
|
502
529
|
spinner.text = f"文件修改失败: {str(e)}"
|
|
@@ -16,6 +16,7 @@ def shell_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
|
16
16
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
17
17
|
output = ToolRegistry().handle_tool_calls({
|
|
18
18
|
"name": "execute_script",
|
|
19
|
+
"want": "提取命令执行结果关键信息",
|
|
19
20
|
"arguments": {
|
|
20
21
|
"interpreter": "bash",
|
|
21
22
|
"script_content": script
|
|
@@ -4,12 +4,15 @@ import os
|
|
|
4
4
|
import re
|
|
5
5
|
import tempfile
|
|
6
6
|
|
|
7
|
+
from httpx import get
|
|
7
8
|
from yaspin import yaspin
|
|
8
9
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
|
9
10
|
from jarvis.jarvis_tools.read_code import ReadCodeTool
|
|
10
11
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
11
12
|
from jarvis.jarvis_agent import Agent
|
|
12
13
|
|
|
14
|
+
from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_token_count
|
|
15
|
+
from jarvis.jarvis_utils.embedding import get_context_token_count
|
|
13
16
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
14
17
|
from jarvis.jarvis_utils.utils import ct, ot, init_env
|
|
15
18
|
from jarvis.jarvis_code_analysis.checklists.loader import get_language_checklist
|
|
@@ -341,14 +344,7 @@ class CodeReviewTool:
|
|
|
341
344
|
# Add language-specific checklists
|
|
342
345
|
if detected_languages:
|
|
343
346
|
review_info += "\n\n----- 检测到的编程语言 -----"
|
|
344
|
-
|
|
345
|
-
'c_cpp': 'C/C++',
|
|
346
|
-
'go': 'Go',
|
|
347
|
-
'python': 'Python',
|
|
348
|
-
'rust': 'Rust'
|
|
349
|
-
}
|
|
350
|
-
detected_lang_names = [language_names.get(lang, lang) for lang in detected_languages]
|
|
351
|
-
review_info += f"\n检测到的语言: {', '.join(detected_lang_names)}"
|
|
347
|
+
review_info += f"\n检测到的语言: {', '.join(detected_languages)}"
|
|
352
348
|
|
|
353
349
|
review_info += "\n\n----- 语言特定审查清单 -----"
|
|
354
350
|
for lang in detected_languages:
|
|
@@ -533,22 +529,21 @@ class CodeReviewTool:
|
|
|
533
529
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.diff', delete=False) as temp_file:
|
|
534
530
|
temp_file_path = temp_file.name
|
|
535
531
|
temp_file.write(diff_output)
|
|
532
|
+
temp_file.flush()
|
|
536
533
|
|
|
537
534
|
try:
|
|
535
|
+
upload_success = False
|
|
538
536
|
# Upload the file to the agent's model
|
|
539
537
|
with yaspin(text="正在上传代码差异文件...", color="cyan") as spinner:
|
|
540
|
-
if agent.model and hasattr(agent.model, 'upload_files'):
|
|
538
|
+
if get_context_token_count(diff_output) > get_max_input_token_count() - INPUT_WINDOW_REVERSE_SIZE and agent.model and hasattr(agent.model, 'upload_files'):
|
|
541
539
|
upload_success = agent.model.upload_files([temp_file_path])
|
|
542
540
|
if upload_success:
|
|
543
541
|
spinner.ok("✅")
|
|
544
542
|
PrettyOutput.print(f"已成功上传代码差异文件", OutputType.SUCCESS)
|
|
543
|
+
upload_success = True
|
|
545
544
|
else:
|
|
546
|
-
spinner.fail("❌")
|
|
547
|
-
PrettyOutput.print(f"上传代码差异文件失败", OutputType.WARNING)
|
|
548
545
|
upload_success = False
|
|
549
546
|
else:
|
|
550
|
-
spinner.fail("❌")
|
|
551
|
-
PrettyOutput.print(f"当前模型不支持文件上传", OutputType.WARNING)
|
|
552
547
|
upload_success = False
|
|
553
548
|
|
|
554
549
|
# Prepare the prompt based on upload status
|
|
@@ -11,7 +11,7 @@ import sys
|
|
|
11
11
|
import argparse
|
|
12
12
|
import os
|
|
13
13
|
|
|
14
|
-
from jarvis.jarvis_utils.config import get_max_input_token_count
|
|
14
|
+
from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_token_count
|
|
15
15
|
from jarvis.jarvis_utils.embedding import get_context_token_count
|
|
16
16
|
from jarvis.jarvis_utils.git_utils import find_git_root, has_uncommitted_changes
|
|
17
17
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
@@ -106,17 +106,8 @@ class GitCommitTool:
|
|
|
106
106
|
)
|
|
107
107
|
diff = process.communicate()[0].decode()
|
|
108
108
|
spinner.write(f"✅ 获取差异 ({file_count} 个文件)")
|
|
109
|
-
|
|
110
|
-
# 写入差异文件
|
|
111
|
-
temp_diff_file = None
|
|
112
109
|
try:
|
|
113
|
-
|
|
114
|
-
temp_diff_file = tempfile.NamedTemporaryFile(mode='w', suffix='.diff', delete=False)
|
|
115
|
-
temp_diff_file_path = temp_diff_file.name
|
|
116
|
-
temp_diff_file.write(diff)
|
|
117
|
-
temp_diff_file.flush()
|
|
118
|
-
temp_diff_file.close()
|
|
119
|
-
spinner.write(f"✅ 差异内容已写入临时文件")
|
|
110
|
+
temp_diff_file = None
|
|
120
111
|
# 生成提交信息
|
|
121
112
|
spinner.text = "正在生成提交消息..."
|
|
122
113
|
|
|
@@ -143,10 +134,16 @@ class GitCommitTool:
|
|
|
143
134
|
platform = PlatformRegistry().get_normal_platform()
|
|
144
135
|
upload_success = False
|
|
145
136
|
|
|
146
|
-
if hasattr(platform, 'upload_files')
|
|
137
|
+
if get_context_token_count(diff) > get_max_input_token_count() - INPUT_WINDOW_REVERSE_SIZE and hasattr(platform, 'upload_files'):
|
|
147
138
|
spinner.text = "正在上传代码差异文件..."
|
|
148
139
|
try:
|
|
149
140
|
with spinner.hidden():
|
|
141
|
+
# 创建临时文件并写入差异内容
|
|
142
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.diff', delete=False) as temp_diff_file:
|
|
143
|
+
temp_diff_file_path = temp_diff_file.name
|
|
144
|
+
temp_diff_file.write(diff)
|
|
145
|
+
temp_diff_file.flush()
|
|
146
|
+
spinner.write(f"✅ 差异内容已写入临时文件")
|
|
150
147
|
upload_success = platform.upload_files([temp_diff_file_path])
|
|
151
148
|
if upload_success:
|
|
152
149
|
spinner.write("✅ 成功上传代码差异文件")
|
|
@@ -217,12 +214,13 @@ class GitCommitTool:
|
|
|
217
214
|
"commit_message": commit_message
|
|
218
215
|
}),
|
|
219
216
|
"stderr": ""
|
|
220
|
-
|
|
217
|
+
}
|
|
221
218
|
finally:
|
|
222
219
|
# Always restore original directory
|
|
223
220
|
os.chdir(original_dir)
|
|
224
221
|
|
|
225
222
|
except Exception as e:
|
|
223
|
+
PrettyOutput.print(f"提交失败: {str(e)}", OutputType.ERROR)
|
|
226
224
|
return {
|
|
227
225
|
"success": False,
|
|
228
226
|
"stdout": "",
|
jarvis/jarvis_platform/kimi.py
CHANGED
|
@@ -11,12 +11,13 @@ from pathlib import Path
|
|
|
11
11
|
from PIL import Image
|
|
12
12
|
from yaspin import yaspin
|
|
13
13
|
from yaspin.spinners import Spinners
|
|
14
|
+
from yaspin.api import Yaspin
|
|
14
15
|
from jarvis.jarvis_platform.base import BasePlatform
|
|
15
16
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
16
17
|
from jarvis.jarvis_utils.utils import while_success
|
|
17
18
|
|
|
18
19
|
class YuanbaoPlatform(BasePlatform):
|
|
19
|
-
"""Hunyuan
|
|
20
|
+
"""Hunyuan模型实现"""
|
|
20
21
|
|
|
21
22
|
platform_name = "yuanbao"
|
|
22
23
|
|
|
@@ -63,7 +64,7 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
63
64
|
self.multimedia = []
|
|
64
65
|
|
|
65
66
|
def set_system_message(self, message: str):
|
|
66
|
-
"""
|
|
67
|
+
"""设置系统消息"""
|
|
67
68
|
self.system_message = message
|
|
68
69
|
|
|
69
70
|
def set_model_name(self, model_name: str):
|
|
@@ -76,7 +77,7 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
76
77
|
PrettyOutput.print(f"错误:不支持的模型: {model_name}", OutputType.ERROR)
|
|
77
78
|
|
|
78
79
|
def _get_base_headers(self):
|
|
79
|
-
"""
|
|
80
|
+
"""获取API请求的基础头部信息"""
|
|
80
81
|
return {
|
|
81
82
|
'Host': 'yuanbao.tencent.com',
|
|
82
83
|
'X-Language': 'zh-CN',
|
|
@@ -101,7 +102,7 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
101
102
|
}
|
|
102
103
|
|
|
103
104
|
def _create_conversation(self) -> bool:
|
|
104
|
-
"""
|
|
105
|
+
"""创建一个新的对话会话"""
|
|
105
106
|
url = "https://yuanbao.tencent.com/api/user/agent/conversation/create"
|
|
106
107
|
|
|
107
108
|
headers = self._get_base_headers()
|
|
@@ -125,13 +126,13 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
125
126
|
return False
|
|
126
127
|
|
|
127
128
|
def upload_files(self, file_list: List[str]) -> bool:
|
|
128
|
-
"""
|
|
129
|
+
"""上传文件到元宝平台
|
|
129
130
|
|
|
130
|
-
|
|
131
|
-
file_list:
|
|
131
|
+
参数:
|
|
132
|
+
file_list: 要上传的文件路径列表
|
|
132
133
|
|
|
133
|
-
|
|
134
|
-
|
|
134
|
+
返回:
|
|
135
|
+
用于聊天消息的文件元数据字典列表
|
|
135
136
|
"""
|
|
136
137
|
if not self.cookies:
|
|
137
138
|
PrettyOutput.print("未设置YUANBAO_COOKIES,无法上传文件", OutputType.ERROR)
|
|
@@ -149,27 +150,29 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
149
150
|
file_size = os.path.getsize(file_path)
|
|
150
151
|
file_extension = os.path.splitext(file_path)[1].lower().lstrip('.')
|
|
151
152
|
|
|
152
|
-
# Determine file_type using
|
|
153
|
-
|
|
153
|
+
# Determine file_type using file extension
|
|
154
|
+
file_type = "txt" # Default type
|
|
154
155
|
|
|
155
|
-
# Default to txt if mime_type couldn't be determined
|
|
156
|
-
if not mime_type:
|
|
157
|
-
file_type = "txt"
|
|
158
156
|
# Image types
|
|
159
|
-
|
|
157
|
+
if file_extension in ['jpg', 'jpeg', 'png', 'webp', 'bmp', 'gif']:
|
|
160
158
|
file_type = "image"
|
|
161
159
|
# PDF type
|
|
162
|
-
elif
|
|
160
|
+
elif file_extension == 'pdf':
|
|
163
161
|
file_type = "pdf"
|
|
162
|
+
# Spreadsheet types
|
|
163
|
+
elif file_extension in ['xls', 'xlsx', 'csv']:
|
|
164
|
+
file_type = "excel"
|
|
165
|
+
# Presentation types
|
|
166
|
+
elif file_extension in ['ppt', 'pptx']:
|
|
167
|
+
file_type = "ppt"
|
|
164
168
|
# Document types
|
|
165
|
-
elif
|
|
166
|
-
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
167
|
-
'application/rtf',
|
|
168
|
-
'application/vnd.oasis.opendocument.text']:
|
|
169
|
+
elif file_extension in ['doc', 'docx', 'txt', 'text', 'md']:
|
|
169
170
|
file_type = "doc"
|
|
170
|
-
#
|
|
171
|
-
|
|
172
|
-
|
|
171
|
+
# Code file types
|
|
172
|
+
elif file_extension in ['bat', 'c', 'cpp', 'cs', 'css', 'go', 'h', 'hpp', 'ini',
|
|
173
|
+
'java', 'js', 'json', 'log', 'lua', 'php', 'pl', 'py', 'rb',
|
|
174
|
+
'sh', 'sql', 'swift', 'tex', 'toml', 'vue', 'yaml', 'yml']:
|
|
175
|
+
file_type = "code"
|
|
173
176
|
|
|
174
177
|
# 2. Generate upload information
|
|
175
178
|
spinner.text = f"获取上传信息: {file_name}"
|
|
@@ -181,7 +184,7 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
181
184
|
|
|
182
185
|
# 3. Upload the file to COS
|
|
183
186
|
spinner.text = f"上传文件到云存储: {file_name}"
|
|
184
|
-
upload_success = self._upload_file_to_cos(file_path, upload_info)
|
|
187
|
+
upload_success = self._upload_file_to_cos(file_path, upload_info, spinner)
|
|
185
188
|
if not upload_success:
|
|
186
189
|
spinner.text = f"上传文件 {file_name} 失败"
|
|
187
190
|
spinner.fail("❌")
|
|
@@ -200,7 +203,7 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
200
203
|
}
|
|
201
204
|
|
|
202
205
|
# Get image dimensions if it's an image file
|
|
203
|
-
if file_type == "
|
|
206
|
+
if file_type == "image":
|
|
204
207
|
try:
|
|
205
208
|
with Image.open(file_path) as img:
|
|
206
209
|
file_metadata["width"] = img.width
|
|
@@ -221,13 +224,13 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
221
224
|
return True
|
|
222
225
|
|
|
223
226
|
def _generate_upload_info(self, file_name: str) -> Dict:
|
|
224
|
-
"""
|
|
227
|
+
"""从元宝API生成上传信息
|
|
225
228
|
|
|
226
|
-
|
|
227
|
-
file_name:
|
|
229
|
+
参数:
|
|
230
|
+
file_name: 要上传的文件名
|
|
228
231
|
|
|
229
|
-
|
|
230
|
-
|
|
232
|
+
返回:
|
|
233
|
+
包含上传信息的字典,如果失败则返回空字典
|
|
231
234
|
"""
|
|
232
235
|
url = "https://yuanbao.tencent.com/api/resource/genUploadInfo"
|
|
233
236
|
|
|
@@ -258,15 +261,15 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
258
261
|
PrettyOutput.print(f"获取上传信息时出错: {str(e)}", OutputType.ERROR)
|
|
259
262
|
return {}
|
|
260
263
|
|
|
261
|
-
def _upload_file_to_cos(self, file_path: str, upload_info: Dict) -> bool:
|
|
262
|
-
"""
|
|
264
|
+
def _upload_file_to_cos(self, file_path: str, upload_info: Dict, spinner: Yaspin) -> bool:
|
|
265
|
+
"""使用提供的上传信息将文件上传到腾讯COS
|
|
263
266
|
|
|
264
|
-
|
|
265
|
-
file_path:
|
|
266
|
-
upload_info:
|
|
267
|
+
参数:
|
|
268
|
+
file_path: 要上传的文件路径
|
|
269
|
+
upload_info: 从generate_upload_info获取的上传信息
|
|
267
270
|
|
|
268
|
-
|
|
269
|
-
|
|
271
|
+
返回:
|
|
272
|
+
布尔值表示成功或失败
|
|
270
273
|
"""
|
|
271
274
|
try:
|
|
272
275
|
# Extract required information from upload_info
|
|
@@ -285,6 +288,8 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
285
288
|
# Read file content
|
|
286
289
|
with open(file_path, 'rb') as file:
|
|
287
290
|
file_content = file.read()
|
|
291
|
+
|
|
292
|
+
spinner.write(f"ℹ️ 上传文件大小: {len(file_content)}")
|
|
288
293
|
|
|
289
294
|
# Prepare headers for PUT request
|
|
290
295
|
host = f"{upload_info['bucketName']}.{upload_info.get('accelerateDomain', 'cos.accelerate.myqcloud.com')}"
|
|
@@ -329,18 +334,18 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
329
334
|
|
|
330
335
|
def _generate_cos_signature(self, secret_key: str, method: str, path: str,
|
|
331
336
|
params: Dict, headers: Dict, key_time: str) -> str:
|
|
332
|
-
"""
|
|
337
|
+
"""根据腾讯云COS文档生成COS签名
|
|
333
338
|
|
|
334
|
-
|
|
335
|
-
secret_key:
|
|
336
|
-
method: HTTP
|
|
337
|
-
path:
|
|
338
|
-
params: URL
|
|
339
|
-
headers: HTTP
|
|
340
|
-
key_time:
|
|
339
|
+
参数:
|
|
340
|
+
secret_key: 临时密钥
|
|
341
|
+
method: HTTP方法(GET, PUT等)
|
|
342
|
+
path: 对象路径
|
|
343
|
+
params: URL参数
|
|
344
|
+
headers: HTTP头部
|
|
345
|
+
key_time: 签名时间范围
|
|
341
346
|
|
|
342
|
-
|
|
343
|
-
|
|
347
|
+
返回:
|
|
348
|
+
签名字符串
|
|
344
349
|
"""
|
|
345
350
|
try:
|
|
346
351
|
# 1. Generate SignKey
|
|
@@ -377,14 +382,14 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
377
382
|
raise e
|
|
378
383
|
|
|
379
384
|
def chat(self, message: str) -> str:
|
|
380
|
-
"""
|
|
385
|
+
"""发送消息并获取响应,可选文件附件
|
|
381
386
|
|
|
382
|
-
|
|
383
|
-
message:
|
|
384
|
-
file_list:
|
|
387
|
+
参数:
|
|
388
|
+
message: 要发送的消息文本
|
|
389
|
+
file_list: 可选的上传和附加文件路径列表
|
|
385
390
|
|
|
386
|
-
|
|
387
|
-
|
|
391
|
+
返回:
|
|
392
|
+
模型的响应
|
|
388
393
|
"""
|
|
389
394
|
if not self.conversation_id:
|
|
390
395
|
if not self._create_conversation():
|
|
@@ -489,7 +494,7 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
489
494
|
raise Exception(f"对话失败: {str(e)}")
|
|
490
495
|
|
|
491
496
|
def delete_chat(self) -> bool:
|
|
492
|
-
"""
|
|
497
|
+
"""删除当前会话"""
|
|
493
498
|
if not self.conversation_id:
|
|
494
499
|
return True # 如果没有会话ID,视为删除成功
|
|
495
500
|
|
|
@@ -526,5 +531,5 @@ class YuanbaoPlatform(BasePlatform):
|
|
|
526
531
|
return False
|
|
527
532
|
|
|
528
533
|
def name(self) -> str:
|
|
529
|
-
"""
|
|
534
|
+
"""模型名称"""
|
|
530
535
|
return self.model_name
|
|
@@ -79,7 +79,8 @@ class FileAnalyzerTool:
|
|
|
79
79
|
# 上传文件
|
|
80
80
|
with yaspin(Spinners.dots, text="正在上传文件...") as spinner:
|
|
81
81
|
try:
|
|
82
|
-
|
|
82
|
+
with spinner.hidden():
|
|
83
|
+
upload_result = platform.upload_files(valid_files)
|
|
83
84
|
if not upload_result:
|
|
84
85
|
spinner.text = "文件上传失败"
|
|
85
86
|
spinner.fail("❌")
|
|
@@ -88,6 +89,7 @@ class FileAnalyzerTool:
|
|
|
88
89
|
"stdout": "",
|
|
89
90
|
"stderr": "文件上传失败"
|
|
90
91
|
}
|
|
92
|
+
spinner.text = "文件上传成功"
|
|
91
93
|
spinner.ok("✅")
|
|
92
94
|
except Exception as e:
|
|
93
95
|
spinner.text = "文件上传失败"
|
|
@@ -97,9 +99,6 @@ class FileAnalyzerTool:
|
|
|
97
99
|
"stdout": "",
|
|
98
100
|
"stderr": f"文件上传失败: {str(e)}"
|
|
99
101
|
}
|
|
100
|
-
|
|
101
|
-
prompt = f"""我上传了文件,收到请回复“已接收到文件”"""
|
|
102
|
-
platform.chat_until_success(prompt)
|
|
103
102
|
|
|
104
103
|
platform.set_suppress_output(False)
|
|
105
104
|
|
|
@@ -112,7 +111,8 @@ class FileAnalyzerTool:
|
|
|
112
111
|
|
|
113
112
|
# 发送请求并获取分析结果
|
|
114
113
|
with yaspin(Spinners.dots, text="正在分析文件...") as spinner:
|
|
115
|
-
|
|
114
|
+
with spinner.hidden():
|
|
115
|
+
analysis_result = platform.chat_until_success(analysis_request)
|
|
116
116
|
spinner.text = "分析完成"
|
|
117
117
|
spinner.ok("✅")
|
|
118
118
|
|
jarvis/jarvis_tools/registry.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import json
|
|
2
|
-
import os
|
|
3
2
|
from pathlib import Path
|
|
4
3
|
import re
|
|
5
4
|
import sys
|
|
@@ -12,7 +11,7 @@ from yaspin import yaspin
|
|
|
12
11
|
from jarvis.jarvis_agent.output_handler import OutputHandler
|
|
13
12
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
|
14
13
|
from jarvis.jarvis_tools.base import Tool
|
|
15
|
-
from jarvis.jarvis_utils.config import get_max_input_token_count
|
|
14
|
+
from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_token_count
|
|
16
15
|
from jarvis.jarvis_utils.embedding import get_context_token_count
|
|
17
16
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
18
17
|
from jarvis.jarvis_utils.utils import ct, ot, init_env
|
|
@@ -133,7 +132,7 @@ class ToolRegistry(OutputHandler):
|
|
|
133
132
|
# 加载内置工具和外部工具
|
|
134
133
|
self._load_builtin_tools()
|
|
135
134
|
self._load_external_tools()
|
|
136
|
-
self.max_input_token_count = get_max_input_token_count() -
|
|
135
|
+
self.max_input_token_count = get_max_input_token_count() - INPUT_WINDOW_REVERSE_SIZE
|
|
137
136
|
|
|
138
137
|
def use_tools(self, name: List[str]):
|
|
139
138
|
"""使用指定工具"""
|
|
@@ -336,12 +335,13 @@ class ToolRegistry(OutputHandler):
|
|
|
336
335
|
|
|
337
336
|
# 处理结果
|
|
338
337
|
if get_context_token_count(output) > self.max_input_token_count:
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
338
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as tmp_file:
|
|
339
|
+
output_file = tmp_file.name
|
|
340
|
+
tmp_file.write(output)
|
|
341
|
+
tmp_file.flush()
|
|
342
342
|
model = PlatformRegistry().get_normal_platform()
|
|
343
343
|
model.set_suppress_output(False)
|
|
344
|
-
model.upload_files([output_file])
|
|
344
|
+
model.upload_files([output_file]) # TODO 处理错误
|
|
345
345
|
prompt = f"该文件为工具执行结果,请阅读文件内容,并根据文件提取出以下信息:{want}"
|
|
346
346
|
return f"""工具调用原始输出过长,以下是根据输出提出的信息:
|
|
347
347
|
|
jarvis/jarvis_utils/config.py
CHANGED
|
@@ -8,9 +8,11 @@
|
|
|
8
8
|
"""
|
|
9
9
|
import os
|
|
10
10
|
import json
|
|
11
|
-
import hashlib
|
|
12
11
|
import tempfile
|
|
13
|
-
from typing import Dict,
|
|
12
|
+
from typing import Dict, Optional
|
|
13
|
+
|
|
14
|
+
from jarvis.jarvis_utils.config import INPUT_WINDOW_REVERSE_SIZE, get_max_input_token_count
|
|
15
|
+
from jarvis.jarvis_utils.embedding import get_context_token_count
|
|
14
16
|
from jarvis.jarvis_utils.output import PrettyOutput, OutputType
|
|
15
17
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
|
16
18
|
|
|
@@ -82,6 +84,7 @@ def _create_methodology_temp_file(methodologies: Dict[str, str]) -> Optional[str
|
|
|
82
84
|
f.write(f"## {problem_type}\n\n")
|
|
83
85
|
f.write(f"{content}\n\n")
|
|
84
86
|
f.write("---\n\n")
|
|
87
|
+
f.flush()
|
|
85
88
|
|
|
86
89
|
return temp_path
|
|
87
90
|
except Exception as e:
|
|
@@ -115,33 +118,28 @@ def load_methodology(user_input: str) -> str:
|
|
|
115
118
|
return ""
|
|
116
119
|
spinner.text = f"加载方法论文件完成 (共 {len(methodologies)} 个)"
|
|
117
120
|
spinner.ok("✅")
|
|
118
|
-
|
|
119
|
-
# 创建临时文件
|
|
120
|
-
with yaspin(text="创建方法论临时文件...", color="yellow") as spinner:
|
|
121
|
-
temp_file_path = _create_methodology_temp_file(methodologies)
|
|
122
|
-
if not temp_file_path:
|
|
123
|
-
spinner.text = "创建方法论临时文件失败"
|
|
124
|
-
spinner.fail("❌")
|
|
125
|
-
return ""
|
|
126
|
-
spinner.text = f"创建方法论临时文件完成: {temp_file_path}"
|
|
127
|
-
spinner.ok("✅")
|
|
128
121
|
|
|
129
122
|
# 获取当前平台
|
|
130
|
-
platform = PlatformRegistry().
|
|
123
|
+
platform = PlatformRegistry().get_normal_platform()
|
|
131
124
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if not
|
|
138
|
-
spinner.text = "
|
|
125
|
+
upload_result = False
|
|
126
|
+
if get_context_token_count(user_input) > get_max_input_token_count() - INPUT_WINDOW_REVERSE_SIZE:
|
|
127
|
+
# 创建临时文件
|
|
128
|
+
with yaspin(text="创建方法论临时文件...", color="yellow") as spinner:
|
|
129
|
+
temp_file_path = _create_methodology_temp_file(methodologies)
|
|
130
|
+
if not temp_file_path:
|
|
131
|
+
spinner.text = "创建方法论临时文件失败"
|
|
139
132
|
spinner.fail("❌")
|
|
140
133
|
return ""
|
|
134
|
+
spinner.text = f"创建方法论临时文件完成: {temp_file_path}"
|
|
135
|
+
spinner.ok("✅")
|
|
136
|
+
if platform.upload_files([temp_file_path]):
|
|
137
|
+
upload_result = True
|
|
141
138
|
|
|
142
139
|
spinner.text = "上传方法论文件成功"
|
|
143
140
|
spinner.ok("✅")
|
|
144
141
|
|
|
142
|
+
platform.set_suppress_output(False)
|
|
145
143
|
# 构建提示信息
|
|
146
144
|
prompt = f"""根据用户需求: {user_input}
|
|
147
145
|
|
|
@@ -151,13 +149,15 @@ def load_methodology(user_input: str) -> str:
|
|
|
151
149
|
1. [步骤1描述]
|
|
152
150
|
2. [步骤2描述]
|
|
153
151
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
### 执行计划
|
|
158
|
-
1. [步骤1描述]
|
|
159
|
-
2. [步骤2描述]
|
|
152
|
+
如果没有匹配的方法论,请输出:没有历史方法论可参考
|
|
153
|
+
除以上要求外,不要输出任何内容
|
|
160
154
|
"""
|
|
155
|
+
if not upload_result:
|
|
156
|
+
prompt += f"""
|
|
157
|
+
# 方法论内容
|
|
158
|
+
"""
|
|
159
|
+
for problem_type, content in methodologies.items():
|
|
160
|
+
prompt += f"## {problem_type}\n\n{content}\n\n---\n\n"
|
|
161
161
|
return platform.chat_until_success(prompt)
|
|
162
162
|
|
|
163
163
|
except Exception as e:
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
jarvis/__init__.py,sha256=
|
|
1
|
+
jarvis/__init__.py,sha256=k7rfKx4vgw6yD017iMbhcRMd_XMauKsvdaFRUtuSXeM,50
|
|
2
2
|
jarvis/jarvis_agent/__init__.py,sha256=doFjWa2a6nVGkKkuQkgrupswqqY8dBNJxUDxUfckvPo,23557
|
|
3
3
|
jarvis/jarvis_agent/builtin_input_handler.py,sha256=aWb5RiKaY5-07LtiLi_mMh9Z-l4DaA_3nLbmFbBGb-w,2429
|
|
4
4
|
jarvis/jarvis_agent/file_input_handler.py,sha256=6rIF_FgC9_3UcQhFCmoMoECG4tjKaLBZZ5zDtBl037I,3235
|
|
5
5
|
jarvis/jarvis_agent/jarvis.py,sha256=NmxVJ8KwSc4fumntNL1T5TWj-FvcRgssLeBhG4sA3xk,5368
|
|
6
6
|
jarvis/jarvis_agent/main.py,sha256=Hx1cavfGkrGVEk_HrOJX6FNE0fEh2CDLy7Efr_VSiKI,2636
|
|
7
7
|
jarvis/jarvis_agent/output_handler.py,sha256=4limQ-Kf-YYvQjT5SMjJIyyvD1DVG8tINv1A_qbv4ho,405
|
|
8
|
-
jarvis/jarvis_agent/patch.py,sha256=
|
|
9
|
-
jarvis/jarvis_agent/shell_input_handler.py,sha256=
|
|
8
|
+
jarvis/jarvis_agent/patch.py,sha256=vwuSg93NZBHD7giucj1yqvKX9LYdxfZ9YrZhFONI-Us,21422
|
|
9
|
+
jarvis/jarvis_agent/shell_input_handler.py,sha256=9IoGQCe6FF4HA2V5S11q63AtnWDZFpNeRd3hcqCAlBw,1237
|
|
10
10
|
jarvis/jarvis_code_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
jarvis/jarvis_code_agent/code_agent.py,sha256=c6UBBJku-yoH70f-uapsewewp4EKYxevTnMCZ-KqWKA,12599
|
|
12
|
-
jarvis/jarvis_code_analysis/code_review.py,sha256=
|
|
12
|
+
jarvis/jarvis_code_analysis/code_review.py,sha256=nS_GeT3RhkzeF6xvOdncqufMKG8OKDhYbLsnOiX1WcQ,29289
|
|
13
13
|
jarvis/jarvis_code_analysis/checklists/__init__.py,sha256=PCjlyxLa939613cAzS7pfEPgP57setO-1RvcdzzPivw,54
|
|
14
14
|
jarvis/jarvis_code_analysis/checklists/c_cpp.py,sha256=8lfWmhImAxeTBdHPOgVXDjMllaq280Qki1ZOOSDBnvk,1293
|
|
15
15
|
jarvis/jarvis_code_analysis/checklists/csharp.py,sha256=fg35Iima2nIsirEmAjianfAybVjwRYml9BtbSQFff7w,2396
|
|
@@ -35,7 +35,7 @@ jarvis/jarvis_git_details/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
35
35
|
jarvis/jarvis_git_details/main.py,sha256=YowncVxYyJ3y2EvGrZhAJeR4yizXp6aB3dqvoYTepFY,6117
|
|
36
36
|
jarvis/jarvis_git_squash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
37
|
jarvis/jarvis_git_squash/main.py,sha256=xBNkAl7_8_pQC-C6RcUImA1mEU4KTqhjtA57rG_mMJ8,2179
|
|
38
|
-
jarvis/jarvis_git_utils/git_commiter.py,sha256=
|
|
38
|
+
jarvis/jarvis_git_utils/git_commiter.py,sha256=mBmrsbN6NrjdVPqa_tW7zLgx1vRWzYM2OMU__iACifw,10805
|
|
39
39
|
jarvis/jarvis_init/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
40
|
jarvis/jarvis_init/main.py,sha256=Mb41DdhkWRYxdqEqCJPiQRAT4IspbRmak6la9ITcXdg,2102
|
|
41
41
|
jarvis/jarvis_lsp/base.py,sha256=CWfiqiQ6ZBc_lrW64Y1YAsFQeNPGoWcgTBGKgOrPVQg,2047
|
|
@@ -49,10 +49,10 @@ jarvis/jarvis_multi_agent/__init__.py,sha256=SX8lBErhltKyYRM-rymrMz3sJ0Zl3hBXrps
|
|
|
49
49
|
jarvis/jarvis_multi_agent/main.py,sha256=aGuUC3YQmahabqwDwZXJjfQLYsZ3KIZdf8DZDlVNMe4,1543
|
|
50
50
|
jarvis/jarvis_platform/__init__.py,sha256=WIJtD5J7lOrWLX2bsgZGkmlMcN0NOJsnh_reybmHPjg,58
|
|
51
51
|
jarvis/jarvis_platform/base.py,sha256=Ge-UgZGCHICFWOqrHzg-_qXQXjS1I2lZSxfYs5Angwo,3234
|
|
52
|
-
jarvis/jarvis_platform/kimi.py,sha256=
|
|
52
|
+
jarvis/jarvis_platform/kimi.py,sha256=tytHhRSddPTNwkaPYPr59rBZfGMo7616QMcnFQxLRic,16494
|
|
53
53
|
jarvis/jarvis_platform/openai.py,sha256=V_76W4hwKXRQ4Je7qj4nrTOedgQDc2_8l_NUuJq3Q2U,4115
|
|
54
54
|
jarvis/jarvis_platform/registry.py,sha256=QuH8V65uwqf-x_Y-T_rmvIDtPLzkX_COWPfzsH1eH0s,7612
|
|
55
|
-
jarvis/jarvis_platform/yuanbao.py,sha256=
|
|
55
|
+
jarvis/jarvis_platform/yuanbao.py,sha256=VF_-OP8ViJgM6pA7pZrwm8NP36y_Sl9wYEwS-zGNrWM,21907
|
|
56
56
|
jarvis/jarvis_platform_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
57
|
jarvis/jarvis_platform_manager/main.py,sha256=o7UDrcCkLf9dTh2LOO-_bQVHjWf2X6RuSY5XRtCGvZs,20245
|
|
58
58
|
jarvis/jarvis_platform_manager/openai_test.py,sha256=8L9Xx-oR82X8l38NsVhkymYucICwMb-6yrH17Usk2TI,4954
|
|
@@ -66,29 +66,29 @@ jarvis/jarvis_tools/chdir.py,sha256=tijYhhGbaAiTcA877w9thlxt0smoK2SX2AntcBBETmA,
|
|
|
66
66
|
jarvis/jarvis_tools/create_code_agent.py,sha256=7AOte1Ua6tOXjLYuetN6qwBx6ID0XX29IEjXmMAouxY,4295
|
|
67
67
|
jarvis/jarvis_tools/create_sub_agent.py,sha256=Hpu50UO-ekakYHxD6-5Civi9lvti5aPnRpTwSxAbFVo,3046
|
|
68
68
|
jarvis/jarvis_tools/execute_script.py,sha256=dMUwg_8nFkYqL-9gFO6LHM1kEKXYLW8PXHRtEWLFcBI,6485
|
|
69
|
-
jarvis/jarvis_tools/file_analyzer.py,sha256=
|
|
69
|
+
jarvis/jarvis_tools/file_analyzer.py,sha256=ybmjKJGNdkNhIBSL-fgrhOVrbD4rCBDovQ-xrlJSmTg,4862
|
|
70
70
|
jarvis/jarvis_tools/file_operation.py,sha256=efFTysX7G-4O8GyChZZRi_ozlDUV14ybflri_cGHRx0,10374
|
|
71
71
|
jarvis/jarvis_tools/find_methodology.py,sha256=zLxDPhoxrkECu_K6OlUDgvOWKewokCOp8VJMdomQns0,2276
|
|
72
72
|
jarvis/jarvis_tools/lsp_get_diagnostics.py,sha256=v_tnnaOgXBWog_73pbZdK-vR3MW2vC6BDmHVxlOF1GA,5363
|
|
73
73
|
jarvis/jarvis_tools/methodology.py,sha256=Nh5dvsUuRaWuLtN9TjdSa1qdAtWk2eLj_bNpKZfQJKE,5200
|
|
74
74
|
jarvis/jarvis_tools/read_code.py,sha256=8TFvORPxu_juMAPqj-UBa3qo810AMqXh8S3Gbq_IXaY,6133
|
|
75
75
|
jarvis/jarvis_tools/read_webpage.py,sha256=6ILzxZm45lW1zke4_01RLclFUbxgI_7mKgaTQtTovYU,2231
|
|
76
|
-
jarvis/jarvis_tools/registry.py,sha256=
|
|
76
|
+
jarvis/jarvis_tools/registry.py,sha256=arrAFzjMy4PlkFAOXHhlm5gpEuVVPVsC-g0JrfX1EPo,17268
|
|
77
77
|
jarvis/jarvis_tools/search_web.py,sha256=ZM1LKb7VApSBn7H1a7oawkhkv7_KBPcCSBKfETED7vo,1397
|
|
78
78
|
jarvis/jarvis_tools/virtual_tty.py,sha256=9aSA14thmJ1e0PVhi0TNAj5lICiVD5j8DVIvzknDupc,15524
|
|
79
79
|
jarvis/jarvis_utils/__init__.py,sha256=KMg-KY5rZIhGTeOD5e2Xo5CU7DX1DUz4ULWAaTQ-ZNw,825
|
|
80
|
-
jarvis/jarvis_utils/config.py,sha256=
|
|
80
|
+
jarvis/jarvis_utils/config.py,sha256=qw2Jr_yTbco6yhVq8fDuK4JYw37n4XoGHWuQuzOqucE,5252
|
|
81
81
|
jarvis/jarvis_utils/embedding.py,sha256=NjbhqoUrSH0p0upQCalGO3O34CyXQ8MMvF1eQTRn5JQ,7129
|
|
82
82
|
jarvis/jarvis_utils/file_processors.py,sha256=VchHOIXxxGWqSu5q0Q_epVWUHJTxaKz2wmqiDoRy5Ik,14324
|
|
83
83
|
jarvis/jarvis_utils/git_utils.py,sha256=rAMXKlAYIvqF64iDFc_FDLxi5SMqEuKYH8GzC7RaZGY,4967
|
|
84
84
|
jarvis/jarvis_utils/globals.py,sha256=DaQ-lfLtK8bDyGVlR6jtkenkkgxQVsIkSZCZwklelzc,2769
|
|
85
85
|
jarvis/jarvis_utils/input.py,sha256=yBrak_UP9ZN3fgV7G19o6TDBjEYVdh3UOyjQ_IpRvz8,6585
|
|
86
|
-
jarvis/jarvis_utils/methodology.py,sha256=
|
|
86
|
+
jarvis/jarvis_utils/methodology.py,sha256=5YDfs5JN1TBb13nQYTrJ3WCEmEX4Lk5f_cHQuoFi3FI,6205
|
|
87
87
|
jarvis/jarvis_utils/output.py,sha256=EUJQ1pnCj7PcD9-gXIXMFNrxAwyZBeUd8X-fNEJYJ1k,8443
|
|
88
88
|
jarvis/jarvis_utils/utils.py,sha256=ZYclSrkrHBxatxYQkoNpAgIupO0j9CjiLIp8xBijWXc,12164
|
|
89
|
-
jarvis_ai_assistant-0.1.
|
|
90
|
-
jarvis_ai_assistant-0.1.
|
|
91
|
-
jarvis_ai_assistant-0.1.
|
|
92
|
-
jarvis_ai_assistant-0.1.
|
|
93
|
-
jarvis_ai_assistant-0.1.
|
|
94
|
-
jarvis_ai_assistant-0.1.
|
|
89
|
+
jarvis_ai_assistant-0.1.142.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
|
|
90
|
+
jarvis_ai_assistant-0.1.142.dist-info/METADATA,sha256=7ADpL30GWjCXNC55ew2Yq55igYtChLZ5Ste2HgzGjhk,10004
|
|
91
|
+
jarvis_ai_assistant-0.1.142.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
|
|
92
|
+
jarvis_ai_assistant-0.1.142.dist-info/entry_points.txt,sha256=vuvEtcYSta_LgCFHS4m0OjtF7z1jKX_Dy2pG0rOMNIE,972
|
|
93
|
+
jarvis_ai_assistant-0.1.142.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
|
|
94
|
+
jarvis_ai_assistant-0.1.142.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.141.dist-info → jarvis_ai_assistant-0.1.142.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.141.dist-info → jarvis_ai_assistant-0.1.142.dist-info}/top_level.txt
RENAMED
|
File without changes
|