jarvis-ai-assistant 0.1.105__tar.gz → 0.1.107__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.105/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.107}/PKG-INFO +5 -9
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/README.md +4 -8
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/pyproject.toml +1 -2
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/setup.py +1 -2
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_codebase/main.py +125 -53
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_rag/main.py +282 -260
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107/src/jarvis_ai_assistant.egg-info}/PKG-INFO +5 -9
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -1
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/agent.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/file_select.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/patch.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/relevant_files.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_codebase/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/base.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/cpp.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/go.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/python.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/registry.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/rust.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/ai8.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/base.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/kimi.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/ollama.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/oyi.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_rag/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/chdir.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/code_review.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/deep_thinking.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/deep_thinking_agent.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/execute_shell.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/file_operation.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/git_commiter.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_find_definition.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_find_references.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_get_document_symbols.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_prepare_rename.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_validate_edit.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/rag.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/registry.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/search.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/select_code_files.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/utils.py +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: jarvis-ai-assistant
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.107
|
|
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
|
|
@@ -154,8 +154,8 @@ Jarvis supports configuration through environment variables that can be set in t
|
|
|
154
154
|
| JARVIS_NEED_SUMMARY | Generate summaries | true | No |
|
|
155
155
|
| JARVIS_DONT_USE_LOCAL_MODEL | Avoid using local models | false | No |
|
|
156
156
|
| OPENAI_API_KEY | API key for OpenAI platform | - | Required for OpenAI |
|
|
157
|
-
| OPENAI_API_BASE | Base URL for OpenAI API | https://api.
|
|
158
|
-
| OPENAI_MODEL_NAME | Model name for OpenAI |
|
|
157
|
+
| OPENAI_API_BASE | Base URL for OpenAI API | https://api.openai.com | No |
|
|
158
|
+
| OPENAI_MODEL_NAME | Model name for OpenAI | gpt-4o | No |
|
|
159
159
|
| AI8_API_KEY | API key for AI8 platform | - | Required for AI8 |
|
|
160
160
|
| KIMI_API_KEY | API key for Kimi platform | - | Required for Kimi |
|
|
161
161
|
| OYI_API_KEY | API key for OYI platform | - | Required for OYI |
|
|
@@ -202,11 +202,8 @@ jss "describe what you want to do"
|
|
|
202
202
|
# Manage git commits
|
|
203
203
|
jarvis-git-commit
|
|
204
204
|
|
|
205
|
-
# Generate and manage ctags
|
|
206
|
-
jarvis-ctags
|
|
207
|
-
|
|
208
205
|
# Manage AI platforms
|
|
209
|
-
jarvis-platform
|
|
206
|
+
jarvis-platform-manager
|
|
210
207
|
```
|
|
211
208
|
|
|
212
209
|
Each command supports `--help` flag for detailed usage information:
|
|
@@ -216,9 +213,8 @@ jarvis-code-agent --help
|
|
|
216
213
|
jarvis-codebase --help
|
|
217
214
|
jarvis-rag --help
|
|
218
215
|
jarvis-smart-shell --help
|
|
219
|
-
jarvis-platform --help
|
|
216
|
+
jarvis-platform-manager --help
|
|
220
217
|
jarvis-git-commit --help
|
|
221
|
-
jarvis-ctags --help
|
|
222
218
|
```
|
|
223
219
|
|
|
224
220
|
## 🛠️ Tools
|
|
@@ -83,8 +83,8 @@ Jarvis supports configuration through environment variables that can be set in t
|
|
|
83
83
|
| JARVIS_NEED_SUMMARY | Generate summaries | true | No |
|
|
84
84
|
| JARVIS_DONT_USE_LOCAL_MODEL | Avoid using local models | false | No |
|
|
85
85
|
| OPENAI_API_KEY | API key for OpenAI platform | - | Required for OpenAI |
|
|
86
|
-
| OPENAI_API_BASE | Base URL for OpenAI API | https://api.
|
|
87
|
-
| OPENAI_MODEL_NAME | Model name for OpenAI |
|
|
86
|
+
| OPENAI_API_BASE | Base URL for OpenAI API | https://api.openai.com | No |
|
|
87
|
+
| OPENAI_MODEL_NAME | Model name for OpenAI | gpt-4o | No |
|
|
88
88
|
| AI8_API_KEY | API key for AI8 platform | - | Required for AI8 |
|
|
89
89
|
| KIMI_API_KEY | API key for Kimi platform | - | Required for Kimi |
|
|
90
90
|
| OYI_API_KEY | API key for OYI platform | - | Required for OYI |
|
|
@@ -131,11 +131,8 @@ jss "describe what you want to do"
|
|
|
131
131
|
# Manage git commits
|
|
132
132
|
jarvis-git-commit
|
|
133
133
|
|
|
134
|
-
# Generate and manage ctags
|
|
135
|
-
jarvis-ctags
|
|
136
|
-
|
|
137
134
|
# Manage AI platforms
|
|
138
|
-
jarvis-platform
|
|
135
|
+
jarvis-platform-manager
|
|
139
136
|
```
|
|
140
137
|
|
|
141
138
|
Each command supports `--help` flag for detailed usage information:
|
|
@@ -145,9 +142,8 @@ jarvis-code-agent --help
|
|
|
145
142
|
jarvis-codebase --help
|
|
146
143
|
jarvis-rag --help
|
|
147
144
|
jarvis-smart-shell --help
|
|
148
|
-
jarvis-platform --help
|
|
145
|
+
jarvis-platform-manager --help
|
|
149
146
|
jarvis-git-commit --help
|
|
150
|
-
jarvis-ctags --help
|
|
151
147
|
```
|
|
152
148
|
|
|
153
149
|
## 🛠️ Tools
|
|
@@ -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.107"
|
|
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" }]
|
|
@@ -60,5 +60,4 @@ jarvis-smart-shell = "jarvis.jarvis_smart_shell.main:main"
|
|
|
60
60
|
jss = "jarvis.jarvis_smart_shell.main:main"
|
|
61
61
|
jarvis-platform-manager = "jarvis.jarvis_platform_manager.main:main"
|
|
62
62
|
jarvis-git-commit = "jarvis.jarvis_tools.git_commiter:main"
|
|
63
|
-
jarvis-ctags = "jarvis.jarvis_tools.create_ctags_agent:main"
|
|
64
63
|
jarvis-code-review = "jarvis.jarvis_tools.code_review: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.107",
|
|
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",
|
|
@@ -45,7 +45,6 @@ setup(
|
|
|
45
45
|
"jss=jarvis.jarvis_smart_shell.main:main",
|
|
46
46
|
"jarvis-platform-manager=jarvis.jarvis_platform_manager.main:main",
|
|
47
47
|
"jarvis-git-commit=jarvis.jarvis_tools.git_commiter:main",
|
|
48
|
-
"jarvis-ctags=jarvis.jarvis_tools.create_ctags_agent:main",
|
|
49
48
|
"jarvis-code-review=jarvis.jarvis_tools.code_review:main",
|
|
50
49
|
],
|
|
51
50
|
},
|
{jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_codebase/main.py
RENAMED
|
@@ -648,7 +648,7 @@ Note: Only include files that have a strong connection to the query."""
|
|
|
648
648
|
return []
|
|
649
649
|
|
|
650
650
|
def _generate_query_variants(self, query: str) -> List[str]:
|
|
651
|
-
"""Generate different expressions of the query
|
|
651
|
+
"""Generate different expressions of the query optimized for vector search
|
|
652
652
|
|
|
653
653
|
Args:
|
|
654
654
|
query: Original query
|
|
@@ -657,14 +657,44 @@ Note: Only include files that have a strong connection to the query."""
|
|
|
657
657
|
List[str]: The query variants list
|
|
658
658
|
"""
|
|
659
659
|
model = PlatformRegistry.get_global_platform_registry().get_normal_platform()
|
|
660
|
-
prompt = f"""Please generate 3 different expressions based on the following query
|
|
660
|
+
prompt = f"""Please generate 3 different expressions optimized for vector search based on the following query. Each expression should:
|
|
661
|
+
|
|
662
|
+
1. Focus on key technical concepts and terminology
|
|
663
|
+
2. Use clear and specific language
|
|
664
|
+
3. Include important contextual terms
|
|
665
|
+
4. Avoid general or ambiguous words
|
|
666
|
+
5. Maintain semantic similarity with original query
|
|
667
|
+
6. Be suitable for embedding-based search
|
|
668
|
+
|
|
661
669
|
Original query: {query}
|
|
662
670
|
|
|
663
|
-
|
|
671
|
+
Example transformations:
|
|
672
|
+
Query: "How to handle user login?"
|
|
673
|
+
Output format:
|
|
674
|
+
<QUESTION>
|
|
675
|
+
- user authentication implementation and flow
|
|
676
|
+
- login system architecture and components
|
|
677
|
+
- credential validation and session management
|
|
678
|
+
- ...
|
|
679
|
+
</QUESTION>
|
|
680
|
+
|
|
681
|
+
Please provide 10 search-optimized expressions in the specified format.
|
|
664
682
|
"""
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
683
|
+
response = model.chat_until_success(prompt)
|
|
684
|
+
|
|
685
|
+
# Parse the response using YAML format
|
|
686
|
+
import yaml
|
|
687
|
+
variants = []
|
|
688
|
+
question_match = re.search(r'<QUESTION>\n(.*?)</QUESTION>', response, re.DOTALL)
|
|
689
|
+
if question_match:
|
|
690
|
+
try:
|
|
691
|
+
variants = yaml.safe_load(question_match.group(1))
|
|
692
|
+
except Exception as e:
|
|
693
|
+
PrettyOutput.print(f"Failed to parse variants: {str(e)}", OutputType.ERROR)
|
|
694
|
+
|
|
695
|
+
# Add original query
|
|
696
|
+
variants.append(query)
|
|
697
|
+
return variants if variants else [query]
|
|
668
698
|
|
|
669
699
|
def _vector_search(self, query_variants: List[str], top_k: int) -> Dict[str, Tuple[str, float, str]]:
|
|
670
700
|
"""Use vector search to find related files
|
|
@@ -699,86 +729,128 @@ Please output 3 expressions directly, separated by two line breaks, without numb
|
|
|
699
729
|
|
|
700
730
|
|
|
701
731
|
def search_similar(self, query: str, top_k: int = 30) -> List[str]:
|
|
702
|
-
"""Search related files"""
|
|
732
|
+
"""Search related files with optimized retrieval"""
|
|
703
733
|
try:
|
|
704
734
|
self.generate_codebase()
|
|
705
735
|
if self.index is None:
|
|
706
|
-
return []
|
|
707
|
-
|
|
736
|
+
return []
|
|
737
|
+
|
|
738
|
+
# Generate query variants for better coverage
|
|
708
739
|
query_variants = self._generate_query_variants(query)
|
|
709
740
|
|
|
710
|
-
#
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
results = list(vector_results.values())
|
|
714
|
-
results.sort(key=lambda x: x[1], reverse=True)
|
|
715
|
-
|
|
716
|
-
# Take the top top_k results for reordering
|
|
717
|
-
initial_results = results[:top_k]
|
|
741
|
+
# Collect results from all variants
|
|
742
|
+
all_results = []
|
|
743
|
+
seen_files = set()
|
|
718
744
|
|
|
719
|
-
|
|
720
|
-
|
|
745
|
+
for variant in query_variants:
|
|
746
|
+
# Get vector for each variant
|
|
747
|
+
query_vector = self.get_embedding(variant)
|
|
748
|
+
query_vector = query_vector.reshape(1, -1)
|
|
749
|
+
|
|
750
|
+
# Search with current variant
|
|
751
|
+
initial_k = min(top_k * 2, len(self.file_paths))
|
|
752
|
+
distances, indices = self.index.search(query_vector, initial_k) # type: ignore
|
|
753
|
+
|
|
754
|
+
# Process results
|
|
755
|
+
for idx, dist in zip(indices[0], distances[0]):
|
|
756
|
+
if idx != -1:
|
|
757
|
+
file_path = self.file_paths[idx]
|
|
758
|
+
if file_path not in seen_files:
|
|
759
|
+
similarity = 1.0 / (1.0 + float(dist))
|
|
760
|
+
if similarity > 0.3: # Lower threshold for better recall
|
|
761
|
+
seen_files.add(file_path)
|
|
762
|
+
all_results.append((file_path, similarity, self.vector_cache[file_path]["description"]))
|
|
763
|
+
|
|
764
|
+
if not all_results:
|
|
721
765
|
return []
|
|
766
|
+
|
|
767
|
+
# Sort by similarity and take top_k
|
|
768
|
+
all_results.sort(key=lambda x: x[1], reverse=True)
|
|
769
|
+
results = all_results[:top_k]
|
|
722
770
|
|
|
723
|
-
#
|
|
724
|
-
initial_results = [(path, score, desc) for path, score, desc in initial_results if score >= 0.5]
|
|
725
|
-
|
|
771
|
+
# Display results with scores
|
|
726
772
|
message = "Found related files:\n"
|
|
727
|
-
for path, score, _ in
|
|
728
|
-
message += f"File: {path}
|
|
773
|
+
for path, score, _ in results:
|
|
774
|
+
message += f"File: {path} (Score: {score:.3f})\n"
|
|
729
775
|
PrettyOutput.print(message.rstrip(), output_type=OutputType.INFO, lang="markdown")
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
return self.pick_results(query, [path for path, _, _ in initial_results])
|
|
776
|
+
|
|
777
|
+
return [path for path, _, _ in results]
|
|
733
778
|
|
|
734
779
|
except Exception as e:
|
|
735
780
|
PrettyOutput.print(f"Failed to search: {str(e)}", output_type=OutputType.ERROR)
|
|
736
781
|
return []
|
|
737
782
|
|
|
738
783
|
def ask_codebase(self, query: str, top_k: int=20) -> str:
|
|
739
|
-
"""Query the codebase"""
|
|
740
|
-
|
|
784
|
+
"""Query the codebase with enhanced context building"""
|
|
785
|
+
files_from_codebase = self.search_similar(query, top_k)
|
|
741
786
|
|
|
742
787
|
from jarvis.jarvis_code_agent.relevant_files import find_relevant_files_from_agent
|
|
743
|
-
|
|
788
|
+
files_from_agent = find_relevant_files_from_agent(query, files_from_codebase)
|
|
744
789
|
|
|
745
|
-
if not
|
|
790
|
+
if not files_from_agent:
|
|
746
791
|
PrettyOutput.print("No related files found", output_type=OutputType.WARNING)
|
|
747
792
|
return ""
|
|
748
793
|
|
|
749
|
-
|
|
750
|
-
for path in
|
|
751
|
-
|
|
752
|
-
PrettyOutput.print(
|
|
794
|
+
output = "Found related files:\n"
|
|
795
|
+
for path in files_from_agent:
|
|
796
|
+
output += f"- {path}\n"
|
|
797
|
+
PrettyOutput.print(output, output_type=OutputType.INFO, lang="markdown")
|
|
753
798
|
|
|
754
|
-
|
|
799
|
+
# Build enhanced prompt
|
|
800
|
+
prompt = f"""Based on the following code files, please provide a comprehensive and accurate answer to the user's question.
|
|
801
|
+
|
|
802
|
+
Important guidelines:
|
|
803
|
+
1. Focus on code-specific details and implementation
|
|
804
|
+
2. Explain technical concepts clearly
|
|
805
|
+
3. Include relevant code snippets when helpful
|
|
806
|
+
4. If the code doesn't fully answer the question, indicate what's missing
|
|
807
|
+
|
|
808
|
+
Question: {query}
|
|
809
|
+
|
|
810
|
+
Relevant code files (ordered by relevance):
|
|
755
811
|
"""
|
|
756
|
-
|
|
812
|
+
# Add context with length control
|
|
813
|
+
available_length = self.max_context_length - len(prompt) - 1000 # Reserve space for answer
|
|
814
|
+
current_length = 0
|
|
815
|
+
|
|
816
|
+
for path in files_from_agent:
|
|
757
817
|
try:
|
|
758
|
-
if len(prompt) > self.max_context_length:
|
|
759
|
-
PrettyOutput.print(f"Avoid context overflow, discard low-related file: {path}", OutputType.WARNING)
|
|
760
|
-
continue
|
|
761
818
|
content = open(path, "r", encoding="utf-8").read()
|
|
762
|
-
|
|
763
|
-
File
|
|
764
|
-
|
|
819
|
+
file_content = f"""
|
|
820
|
+
File: {path}
|
|
821
|
+
Content:
|
|
765
822
|
{content}
|
|
766
|
-
|
|
823
|
+
----------------------------------------
|
|
767
824
|
"""
|
|
825
|
+
if current_length + len(file_content) > available_length:
|
|
826
|
+
PrettyOutput.print(
|
|
827
|
+
"Due to context length limit, some files were omitted",
|
|
828
|
+
output_type=OutputType.WARNING
|
|
829
|
+
)
|
|
830
|
+
break
|
|
831
|
+
|
|
832
|
+
prompt += file_content
|
|
833
|
+
current_length += len(file_content)
|
|
834
|
+
|
|
768
835
|
except Exception as e:
|
|
769
836
|
PrettyOutput.print(f"Failed to read file {path}: {str(e)}",
|
|
770
|
-
|
|
837
|
+
output_type=OutputType.ERROR)
|
|
771
838
|
continue
|
|
772
|
-
|
|
773
|
-
prompt +=
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
839
|
+
|
|
840
|
+
prompt += """
|
|
841
|
+
Please structure your answer as follows:
|
|
842
|
+
1. Direct answer to the question
|
|
843
|
+
2. Relevant code explanations
|
|
844
|
+
3. Implementation details
|
|
845
|
+
4. Any missing information or limitations
|
|
846
|
+
5. Add reference files and code snippets at the end of the answer.
|
|
847
|
+
|
|
848
|
+
Answer in Chinese using professional language.
|
|
779
849
|
"""
|
|
780
|
-
|
|
850
|
+
|
|
851
|
+
model = PlatformRegistry.get_global_platform_registry().get_normal_platform()
|
|
781
852
|
response = model.chat_until_success(prompt)
|
|
853
|
+
|
|
782
854
|
return response
|
|
783
855
|
|
|
784
856
|
def is_index_generated(self) -> bool:
|