jarvis-ai-assistant 0.1.92__tar.gz → 0.1.93__tar.gz
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_ai_assistant-0.1.92/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.93}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/pyproject.toml +2 -1
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/setup.py +2 -1
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/agent.py +4 -4
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/jarvis_codebase/main.py +7 -13
- jarvis_ai_assistant-0.1.93/src/jarvis/jarvis_coder/git_utils.py +64 -0
- jarvis_ai_assistant-0.1.93/src/jarvis/jarvis_coder/main.py +630 -0
- jarvis_ai_assistant-0.1.93/src/jarvis/jarvis_coder/patch_handler.py +493 -0
- jarvis_ai_assistant-0.1.93/src/jarvis/jarvis_coder/plan_generator.py +75 -0
- jarvis_ai_assistant-0.1.93/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/main.py +1 -1
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/models/ai8.py +4 -3
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/models/openai.py +2 -2
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/models/oyi.py +13 -13
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/ask_user.py +1 -2
- jarvis_ai_assistant-0.1.93/src/jarvis/tools/coder.py +69 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/utils.py +25 -1
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +6 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis_ai_assistant.egg-info/entry_points.txt +1 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/README.md +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/jarvis_codebase/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.92/src/jarvis/jarvis_platform → jarvis_ai_assistant-0.1.93/src/jarvis/jarvis_coder}/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.92/src/jarvis/jarvis_rag → jarvis_ai_assistant-0.1.93/src/jarvis/jarvis_platform}/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/jarvis_platform/main.py +0 -0
- {jarvis_ai_assistant-0.1.92/src/jarvis/jarvis_smart_shell → jarvis_ai_assistant-0.1.93/src/jarvis/jarvis_rag}/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/jarvis_rag/main.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/models/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/models/base.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/models/kimi.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/models/ollama.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/models/registry.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/chdir.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/codebase_qa.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/file_ops.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/generator.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/rag.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/registry.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/search.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/shell.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/thinker.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/tools/webpage.py +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "jarvis-ai-assistant"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.93"
|
|
8
8
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "Your Name", email = "your.email@example.com" }]
|
|
@@ -48,6 +48,7 @@ Homepage = "https://github.com/skyfireitdiy/Jarvis"
|
|
|
48
48
|
|
|
49
49
|
[project.scripts]
|
|
50
50
|
jarvis = "jarvis.main:main"
|
|
51
|
+
jarvis-coder = "jarvis.jarvis_coder.main:main"
|
|
51
52
|
jarvis-codebase = "jarvis.jarvis_codebase.main:main"
|
|
52
53
|
jarvis-rag = "jarvis.jarvis_rag.main:main"
|
|
53
54
|
jarvis-smart-shell = "jarvis.jarvis_smart_shell.main:main"
|
|
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|
|
2
2
|
|
|
3
3
|
setup(
|
|
4
4
|
name="jarvis-ai-assistant",
|
|
5
|
-
version="0.1.
|
|
5
|
+
version="0.1.93",
|
|
6
6
|
author="skyfire",
|
|
7
7
|
author_email="skyfireitdiy@hotmail.com",
|
|
8
8
|
description="An AI assistant that uses various tools to interact with the system",
|
|
@@ -33,6 +33,7 @@ setup(
|
|
|
33
33
|
entry_points={
|
|
34
34
|
"console_scripts": [
|
|
35
35
|
"jarvis=jarvis.main:main",
|
|
36
|
+
"jarvis-coder=jarvis.jarvis_coder.main:main",
|
|
36
37
|
"jarvis-codebase=jarvis.jarvis_codebase.main:main",
|
|
37
38
|
"jarvis-rag=jarvis.jarvis_rag.main:main",
|
|
38
39
|
"jarvis-smart-shell=jarvis.jarvis_smart_shell.main:main",
|
|
@@ -140,7 +140,7 @@ class Agent:
|
|
|
140
140
|
|
|
141
141
|
def _load_methodology(self, user_input: str) -> Dict[str, str]:
|
|
142
142
|
"""加载方法论并构建向量索引"""
|
|
143
|
-
PrettyOutput.print("加载方法论...", OutputType.
|
|
143
|
+
PrettyOutput.print("加载方法论...", OutputType.PROGRESS)
|
|
144
144
|
user_jarvis_methodology = os.path.expanduser("~/.jarvis_methodology")
|
|
145
145
|
if not os.path.exists(user_jarvis_methodology):
|
|
146
146
|
return {}
|
|
@@ -165,13 +165,13 @@ class Agent:
|
|
|
165
165
|
|
|
166
166
|
if vectors:
|
|
167
167
|
vectors_array = np.vstack(vectors)
|
|
168
|
-
self.methodology_index.add_with_ids(vectors_array, np.array(ids))
|
|
168
|
+
self.methodology_index.add_with_ids(vectors_array, np.array(ids)) # type: ignore
|
|
169
169
|
query_embedding = self._create_methodology_embedding(user_input)
|
|
170
170
|
k = min(5, len(self.methodology_data))
|
|
171
171
|
PrettyOutput.print(f"检索方法论...", OutputType.INFO)
|
|
172
172
|
distances, indices = self.methodology_index.search(
|
|
173
173
|
query_embedding.reshape(1, -1), k
|
|
174
|
-
)
|
|
174
|
+
) # type: ignore
|
|
175
175
|
|
|
176
176
|
relevant_methodologies = {}
|
|
177
177
|
for dist, idx in zip(distances[0], indices[0]):
|
|
@@ -208,7 +208,7 @@ class Agent:
|
|
|
208
208
|
"""
|
|
209
209
|
# 创建一个新的模型实例来做总结,避免影响主对话
|
|
210
210
|
|
|
211
|
-
PrettyOutput.print("总结对话历史,准备生成总结,开始新的对话...", OutputType.
|
|
211
|
+
PrettyOutput.print("总结对话历史,准备生成总结,开始新的对话...", OutputType.PROGRESS)
|
|
212
212
|
|
|
213
213
|
prompt = """请总结之前对话中的关键信息,包括:
|
|
214
214
|
1. 当前任务目标
|
{jarvis_ai_assistant-0.1.92 → jarvis_ai_assistant-0.1.93}/src/jarvis/jarvis_codebase/main.py
RENAMED
|
@@ -93,16 +93,10 @@ class CodeBase:
|
|
|
93
93
|
model = PlatformRegistry.get_global_platform_registry().get_cheap_platform()
|
|
94
94
|
model.set_suppress_output(True)
|
|
95
95
|
prompt = f"""请分析以下代码文件,并生成一个详细的描述。描述应该包含以下要点:
|
|
96
|
+
1. 整个文件的功能描述,不超过100个字
|
|
97
|
+
2. 每个全局变量的函数、类型定义、类、方法等代码元素的一句话描述,不超过50字
|
|
96
98
|
|
|
97
|
-
|
|
98
|
-
2. 关键类和方法的作用
|
|
99
|
-
3. 重要的依赖和技术特征(如使用了什么框架、算法、设计模式等)
|
|
100
|
-
4. 代码处理的主要数据类型和数据结构
|
|
101
|
-
5. 关键业务逻辑和处理流程
|
|
102
|
-
6. 特殊功能点和亮点特性
|
|
103
|
-
|
|
104
|
-
请用简洁专业的语言描述,突出代码的技术特征和功能特点,以便后续进行关联代码检索。
|
|
105
|
-
|
|
99
|
+
请用简洁专业的语言描述,突出代码的技术功能,以便后续进行关联代码检索。
|
|
106
100
|
文件路径:{file_path}
|
|
107
101
|
代码内容:
|
|
108
102
|
{content}
|
|
@@ -210,7 +204,7 @@ class CodeBase:
|
|
|
210
204
|
except Exception as e:
|
|
211
205
|
PrettyOutput.print(f"Error vectorizing file {file_path}: {str(e)}",
|
|
212
206
|
output_type=OutputType.ERROR)
|
|
213
|
-
return np.zeros(self.vector_dim, dtype=np.float32)
|
|
207
|
+
return np.zeros(self.vector_dim, dtype=np.float32) # type: ignore
|
|
214
208
|
|
|
215
209
|
def clean_cache(self) -> bool:
|
|
216
210
|
"""清理过期的缓存记录,返回是否有文件被删除"""
|
|
@@ -296,7 +290,7 @@ class CodeBase:
|
|
|
296
290
|
|
|
297
291
|
if vectors:
|
|
298
292
|
vectors = np.vstack(vectors)
|
|
299
|
-
self.index.add_with_ids(vectors, np.array(ids))
|
|
293
|
+
self.index.add_with_ids(vectors, np.array(ids)) # type: ignore
|
|
300
294
|
else:
|
|
301
295
|
self.index = None
|
|
302
296
|
|
|
@@ -563,7 +557,7 @@ class CodeBase:
|
|
|
563
557
|
query_vector = self.get_embedding(query)
|
|
564
558
|
query_vector = query_vector.reshape(1, -1)
|
|
565
559
|
|
|
566
|
-
distances, indices = self.index.search(query_vector, top_k)
|
|
560
|
+
distances, indices = self.index.search(query_vector, top_k) # type: ignore
|
|
567
561
|
|
|
568
562
|
for i, distance in zip(indices[0], distances[0]):
|
|
569
563
|
if i == -1:
|
|
@@ -717,4 +711,4 @@ def main():
|
|
|
717
711
|
|
|
718
712
|
|
|
719
713
|
if __name__ == "__main__":
|
|
720
|
-
exit(main())
|
|
714
|
+
exit(main())
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import List
|
|
3
|
+
import yaml
|
|
4
|
+
import time
|
|
5
|
+
from jarvis.utils import OutputType, PrettyOutput, while_success
|
|
6
|
+
from jarvis.models.registry import PlatformRegistry
|
|
7
|
+
|
|
8
|
+
def has_uncommitted_files() -> bool:
|
|
9
|
+
"""判断代码库是否有未提交的文件"""
|
|
10
|
+
# 获取未暂存的修改
|
|
11
|
+
unstaged = os.popen("git diff --name-only").read()
|
|
12
|
+
# 获取已暂存但未提交的修改
|
|
13
|
+
staged = os.popen("git diff --cached --name-only").read()
|
|
14
|
+
# 获取未跟踪的文件
|
|
15
|
+
untracked = os.popen("git ls-files --others --exclude-standard").read()
|
|
16
|
+
|
|
17
|
+
return bool(unstaged or staged or untracked)
|
|
18
|
+
|
|
19
|
+
def generate_commit_message(git_diff: str, feature: str) -> str:
|
|
20
|
+
"""根据git diff和功能描述生成commit信息"""
|
|
21
|
+
prompt = f"""你是一个经验丰富的程序员,请根据以下代码变更和功能描述生成简洁明了的commit信息:
|
|
22
|
+
|
|
23
|
+
功能描述:
|
|
24
|
+
{feature}
|
|
25
|
+
|
|
26
|
+
代码变更:
|
|
27
|
+
Git Diff:
|
|
28
|
+
{git_diff}
|
|
29
|
+
|
|
30
|
+
请遵循以下规则:
|
|
31
|
+
1. 使用英文编写
|
|
32
|
+
2. 采用常规的commit message格式:<type>(<scope>): <subject>
|
|
33
|
+
3. 保持简洁,不超过50个字符
|
|
34
|
+
4. 准确描述代码变更的主要内容
|
|
35
|
+
5. 优先考虑功能描述和git diff中的变更内容
|
|
36
|
+
6. 仅生成commit信息的文本,不要输出任何其他内容
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
model = PlatformRegistry().get_global_platform_registry().get_codegen_platform()
|
|
40
|
+
response = while_success(lambda: model.chat(prompt), 5)
|
|
41
|
+
|
|
42
|
+
return response.strip().split("\n")[0]
|
|
43
|
+
|
|
44
|
+
def save_edit_record(record_dir: str, commit_message: str, git_diff: str) -> None:
|
|
45
|
+
"""保存代码修改记录"""
|
|
46
|
+
# 获取下一个序号
|
|
47
|
+
existing_records = [f for f in os.listdir(record_dir) if f.endswith('.yaml')]
|
|
48
|
+
next_num = 1
|
|
49
|
+
if existing_records:
|
|
50
|
+
last_num = max(int(f[:4]) for f in existing_records)
|
|
51
|
+
next_num = last_num + 1
|
|
52
|
+
|
|
53
|
+
# 创建记录文件
|
|
54
|
+
record = {
|
|
55
|
+
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
|
|
56
|
+
"commit_message": commit_message,
|
|
57
|
+
"git_diff": git_diff
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
record_path = os.path.join(record_dir, f"{next_num:04d}.yaml")
|
|
61
|
+
with open(record_path, "w", encoding="utf-8") as f:
|
|
62
|
+
yaml.safe_dump(record, f, allow_unicode=True)
|
|
63
|
+
|
|
64
|
+
PrettyOutput.print(f"已保存修改记录: {record_path}", OutputType.SUCCESS)
|