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.

Files changed (69) hide show
  1. {jarvis_ai_assistant-0.1.105/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.107}/PKG-INFO +5 -9
  2. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/README.md +4 -8
  3. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/pyproject.toml +1 -2
  4. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/setup.py +1 -2
  5. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/__init__.py +1 -1
  6. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_codebase/main.py +125 -53
  7. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_rag/main.py +282 -260
  8. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107/src/jarvis_ai_assistant.egg-info}/PKG-INFO +5 -9
  9. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -1
  10. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/LICENSE +0 -0
  11. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/MANIFEST.in +0 -0
  12. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/setup.cfg +0 -0
  13. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/agent.py +0 -0
  14. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  15. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
  16. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/file_select.py +0 -0
  17. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/patch.py +0 -0
  18. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_code_agent/relevant_files.py +0 -0
  19. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_codebase/__init__.py +0 -0
  20. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/base.py +0 -0
  21. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  22. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/go.py +0 -0
  23. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/python.py +0 -0
  24. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/registry.py +0 -0
  25. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_lsp/rust.py +0 -0
  26. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/__init__.py +0 -0
  27. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/ai8.py +0 -0
  28. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/base.py +0 -0
  29. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/kimi.py +0 -0
  30. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/ollama.py +0 -0
  31. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/openai.py +0 -0
  32. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/oyi.py +0 -0
  33. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform/registry.py +0 -0
  34. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  35. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  36. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_rag/__init__.py +0 -0
  37. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  38. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  39. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/__init__.py +0 -0
  40. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
  41. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  42. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/base.py +0 -0
  43. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/chdir.py +0 -0
  44. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/code_review.py +0 -0
  45. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  46. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  47. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/deep_thinking.py +0 -0
  48. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/deep_thinking_agent.py +0 -0
  49. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/execute_shell.py +0 -0
  50. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  51. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/git_commiter.py +0 -0
  52. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_find_definition.py +0 -0
  53. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_find_references.py +0 -0
  54. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  55. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_get_document_symbols.py +0 -0
  56. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_prepare_rename.py +0 -0
  57. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/lsp_validate_edit.py +0 -0
  58. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/methodology.py +0 -0
  59. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/rag.py +0 -0
  60. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/read_code.py +0 -0
  61. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  62. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/registry.py +0 -0
  63. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/search.py +0 -0
  64. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/jarvis_tools/select_code_files.py +0 -0
  65. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis/utils.py +0 -0
  66. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  67. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  68. {jarvis_ai_assistant-0.1.105 → jarvis_ai_assistant-0.1.107}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  69. {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.105
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.deepseek.com | No |
158
- | OPENAI_MODEL_NAME | Model name for OpenAI | deepseek-chat | No |
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.deepseek.com | No |
87
- | OPENAI_MODEL_NAME | Model name for OpenAI | deepseek-chat | No |
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.105"
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.105",
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
  },
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.105"
3
+ __version__ = "0.1.107"
@@ -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 in English, each expression should fully convey the meaning of the original query. These expressions will be used for code search, maintain professionalism and accuracy.
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
- Please output 3 expressions directly, separated by two line breaks, without numbering or other markers.
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
- variants = model.chat_until_success(prompt).strip().split('\n\n')
666
- variants.append(query) # Add the original query
667
- return variants
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
- # Generate the query variants
736
+ return []
737
+
738
+ # Generate query variants for better coverage
708
739
  query_variants = self._generate_query_variants(query)
709
740
 
710
- # Perform vector search
711
- vector_results = self._vector_search(query_variants, top_k)
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
- # If no results are found, return directly
720
- if not initial_results:
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
- # Filter low-scoring results
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 initial_results:
728
- message += f"File: {path} Similarity: {score:.3f}\n"
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
- # Reorder the preliminary results
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
- reuslts_from_codebase = self.search_similar(query, top_k)
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
- results_from_agent = find_relevant_files_from_agent(query, reuslts_from_codebase)
788
+ files_from_agent = find_relevant_files_from_agent(query, files_from_codebase)
744
789
 
745
- if not results_from_agent:
790
+ if not files_from_agent:
746
791
  PrettyOutput.print("No related files found", output_type=OutputType.WARNING)
747
792
  return ""
748
793
 
749
- message = "Found related files:\n"
750
- for path in results_from_agent:
751
- message += f"File: {path}\n"
752
- PrettyOutput.print(message.rstrip(), output_type=OutputType.SUCCESS, lang="markdown")
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
- prompt = f"""You are a code expert, please answer the user's question based on the following file information:
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
- for path in results_from_agent:
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
- prompt += f"""
763
- File path: {path}
764
- File content:
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
- output_type=OutputType.ERROR)
837
+ output_type=OutputType.ERROR)
771
838
  continue
772
-
773
- prompt += f"""
774
- User question: {query}
775
-
776
- Please answer the user's question in Chinese using professional language. If the provided file content is insufficient to answer the user's question, please inform the user. Never make up information.
777
-
778
- Add reference files and code snippets at the end of the answer.
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
- model = PlatformRegistry.get_global_platform_registry().get_codegen_platform()
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: