auto-coder 0.1.270__tar.gz → 0.1.272__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 auto-coder might be problematic. Click here for more details.

Files changed (185) hide show
  1. {auto_coder-0.1.270 → auto_coder-0.1.272}/PKG-INFO +2 -2
  2. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/auto_coder.egg-info/PKG-INFO +2 -2
  3. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/auto_coder.egg-info/SOURCES.txt +1 -0
  4. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/auto_coder.egg-info/requires.txt +1 -1
  5. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/auto_coder_runner.py +4 -4
  6. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/commands/auto_command.py +33 -5
  7. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/commands/tools.py +28 -15
  8. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/auto_coder_lang.py +7 -3
  9. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/auto_configure.py +1 -1
  10. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/command_generator.py +3 -1
  11. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/files.py +44 -10
  12. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/shells.py +68 -0
  13. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/filter/quick_filter.py +4 -3
  14. auto_coder-0.1.272/src/autocoder/rag/doc_filter.py +281 -0
  15. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/llm_wrapper.py +3 -1
  16. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/long_context_rag.py +196 -51
  17. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/relevant_utils.py +12 -1
  18. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/token_limiter.py +159 -18
  19. auto_coder-0.1.272/src/autocoder/rag/token_limiter_utils.py +13 -0
  20. auto_coder-0.1.272/src/autocoder/version.py +1 -0
  21. auto_coder-0.1.270/src/autocoder/rag/doc_filter.py +0 -175
  22. auto_coder-0.1.270/src/autocoder/version.py +0 -1
  23. {auto_coder-0.1.270 → auto_coder-0.1.272}/LICENSE +0 -0
  24. {auto_coder-0.1.270 → auto_coder-0.1.272}/README.md +0 -0
  25. {auto_coder-0.1.270 → auto_coder-0.1.272}/setup.cfg +0 -0
  26. {auto_coder-0.1.270 → auto_coder-0.1.272}/setup.py +0 -0
  27. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  28. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/auto_coder.egg-info/entry_points.txt +0 -0
  29. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/auto_coder.egg-info/top_level.txt +0 -0
  30. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/__init__.py +0 -0
  31. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/__init__.py +0 -0
  32. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  33. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/auto_filegroup.py +0 -0
  34. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/auto_guess_query.py +0 -0
  35. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
  36. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/auto_review_commit.py +0 -0
  37. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/auto_tool.py +0 -0
  38. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/coder.py +0 -0
  39. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/designer.py +0 -0
  40. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/planner.py +0 -0
  41. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/agent/project_reader.py +0 -0
  42. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/auto_coder.py +0 -0
  43. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/auto_coder_rag.py +0 -0
  44. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/auto_coder_rag_client_mcp.py +0 -0
  45. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/auto_coder_rag_mcp.py +0 -0
  46. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/auto_coder_server.py +0 -0
  47. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/benchmark.py +0 -0
  48. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/chat/__init__.py +0 -0
  49. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/chat_auto_coder.py +0 -0
  50. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/chat_auto_coder_lang.py +0 -0
  51. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/command_args.py +0 -0
  52. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/commands/__init__.py +0 -0
  53. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/JupyterClient.py +0 -0
  54. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/ShellClient.py +0 -0
  55. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/__init__.py +0 -0
  56. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/anything2images.py +0 -0
  57. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/anything2img.py +0 -0
  58. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/audio.py +0 -0
  59. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/buildin_tokenizer.py +0 -0
  60. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/chunk_validation.py +0 -0
  61. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/cleaner.py +0 -0
  62. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_execute.py +0 -0
  63. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_generate.py +0 -0
  64. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_generate_diff.py +0 -0
  65. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
  66. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
  67. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_merge.py +0 -0
  68. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_merge_diff.py +0 -0
  69. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
  70. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
  71. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/code_modification_ranker.py +0 -0
  72. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/command_completer.py +0 -0
  73. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/command_templates.py +0 -0
  74. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/conf_import_export.py +0 -0
  75. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/conf_validator.py +0 -0
  76. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/const.py +0 -0
  77. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/context_pruner.py +0 -0
  78. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/conversation_pruner.py +0 -0
  79. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/git_utils.py +0 -0
  80. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/global_cancel.py +0 -0
  81. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/image_to_page.py +0 -0
  82. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/index_import_export.py +0 -0
  83. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/interpreter.py +0 -0
  84. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/llm_rerank.py +0 -0
  85. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/mcp_hub.py +0 -0
  86. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/mcp_server.py +0 -0
  87. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  88. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
  89. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/mcp_tools.py +0 -0
  90. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/memory_manager.py +0 -0
  91. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/model_speed_test.py +0 -0
  92. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/printer.py +0 -0
  93. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/recall_validation.py +0 -0
  94. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/result_manager.py +0 -0
  95. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/screenshots.py +0 -0
  96. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/search.py +0 -0
  97. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/search_replace.py +0 -0
  98. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/stats_panel.py +0 -0
  99. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/sys_prompt.py +0 -0
  100. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/text.py +0 -0
  101. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/types.py +0 -0
  102. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/common/utils_code_auto_generate.py +0 -0
  103. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/data/byzerllm.md +0 -0
  104. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/data/tokenizer.json +0 -0
  105. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/db/__init__.py +0 -0
  106. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/db/store.py +0 -0
  107. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/dispacher/__init__.py +0 -0
  108. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/dispacher/actions/__init__.py +0 -0
  109. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/dispacher/actions/action.py +0 -0
  110. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/dispacher/actions/copilot.py +0 -0
  111. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
  112. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
  113. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/dispacher/actions/plugins/action_translate.py +0 -0
  114. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/__init__.py +0 -0
  115. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/entry.py +0 -0
  116. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/filter/__init__.py +0 -0
  117. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/filter/normal_filter.py +0 -0
  118. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/for_command.py +0 -0
  119. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/index.py +0 -0
  120. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/symbols_utils.py +0 -0
  121. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/index/types.py +0 -0
  122. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/lang.py +0 -0
  123. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/models.py +0 -0
  124. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/privacy/__init__.py +0 -0
  125. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/privacy/model_filter.py +0 -0
  126. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/pyproject/__init__.py +0 -0
  127. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/__init__.py +0 -0
  128. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/api_server.py +0 -0
  129. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/cache/__init__.py +0 -0
  130. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/cache/base_cache.py +0 -0
  131. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
  132. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
  133. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/cache/simple_cache.py +0 -0
  134. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/document_retriever.py +0 -0
  135. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/loaders/__init__.py +0 -0
  136. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  137. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  138. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  139. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  140. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/rag_config.py +0 -0
  141. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/rag_entry.py +0 -0
  142. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/raw_rag.py +0 -0
  143. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/simple_directory_reader.py +0 -0
  144. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/simple_rag.py +0 -0
  145. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/stream_event/__init__.py +0 -0
  146. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  147. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/stream_event/types.py +0 -0
  148. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/token_checker.py +0 -0
  149. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/token_counter.py +0 -0
  150. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/types.py +0 -0
  151. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/utils.py +0 -0
  152. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/rag/variable_holder.py +0 -0
  153. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/regexproject/__init__.py +0 -0
  154. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/suffixproject/__init__.py +0 -0
  155. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/tsproject/__init__.py +0 -0
  156. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/__init__.py +0 -0
  157. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/_markitdown.py +0 -0
  158. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
  159. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
  160. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/auto_project_type.py +0 -0
  161. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
  162. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/conversation_store.py +0 -0
  163. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  164. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/llms.py +0 -0
  165. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/log_capture.py +0 -0
  166. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/model_provider_selector.py +0 -0
  167. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/multi_turn.py +0 -0
  168. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/operate_config_api.py +0 -0
  169. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/print_table.py +0 -0
  170. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/project_structure.py +0 -0
  171. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/queue_communicate.py +0 -0
  172. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/request_event_queue.py +0 -0
  173. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/request_queue.py +0 -0
  174. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/rest.py +0 -0
  175. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/tests.py +0 -0
  176. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/thread_utils.py +0 -0
  177. {auto_coder-0.1.270 → auto_coder-0.1.272}/src/autocoder/utils/types.py +0 -0
  178. {auto_coder-0.1.270 → auto_coder-0.1.272}/tests/test_action_regex_project.py +0 -0
  179. {auto_coder-0.1.270 → auto_coder-0.1.272}/tests/test_chat_auto_coder.py +0 -0
  180. {auto_coder-0.1.270 → auto_coder-0.1.272}/tests/test_code_auto_merge_editblock.py +0 -0
  181. {auto_coder-0.1.270 → auto_coder-0.1.272}/tests/test_command_completer.py +0 -0
  182. {auto_coder-0.1.270 → auto_coder-0.1.272}/tests/test_planner.py +0 -0
  183. {auto_coder-0.1.270 → auto_coder-0.1.272}/tests/test_privacy.py +0 -0
  184. {auto_coder-0.1.270 → auto_coder-0.1.272}/tests/test_queue_communicate.py +0 -0
  185. {auto_coder-0.1.270 → auto_coder-0.1.272}/tests/test_symbols_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.270
3
+ Version: 0.1.272
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: jupyter_client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
- Requires-Dist: byzerllm[saas]>=0.1.168
29
+ Requires-Dist: byzerllm[saas]>=0.1.169
30
30
  Requires-Dist: patch
31
31
  Requires-Dist: diff_match_patch
32
32
  Requires-Dist: GitPython
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.270
3
+ Version: 0.1.272
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: jupyter_client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
- Requires-Dist: byzerllm[saas]>=0.1.168
29
+ Requires-Dist: byzerllm[saas]>=0.1.169
30
30
  Requires-Dist: patch
31
31
  Requires-Dist: diff_match_patch
32
32
  Requires-Dist: GitPython
@@ -129,6 +129,7 @@ src/autocoder/rag/simple_rag.py
129
129
  src/autocoder/rag/token_checker.py
130
130
  src/autocoder/rag/token_counter.py
131
131
  src/autocoder/rag/token_limiter.py
132
+ src/autocoder/rag/token_limiter_utils.py
132
133
  src/autocoder/rag/types.py
133
134
  src/autocoder/rag/utils.py
134
135
  src/autocoder/rag/variable_holder.py
@@ -16,7 +16,7 @@ tabulate
16
16
  jupyter_client
17
17
  prompt-toolkit
18
18
  tokenizers
19
- byzerllm[saas]>=0.1.168
19
+ byzerllm[saas]>=0.1.169
20
20
  patch
21
21
  diff_match_patch
22
22
  GitPython
@@ -2133,7 +2133,7 @@ def manage_models(query: str):
2133
2133
  # Check duplication
2134
2134
  if any(m["name"] == data_dict["name"] for m in models_data):
2135
2135
  printer.print_in_terminal("models_add_model_exists", style="yellow", name=data_dict["name"])
2136
- result_manager.add_result(content=printer.get_message_from_key("models_add_model_exists",name=data_dict["name"]),meta={
2136
+ result_manager.add_result(content=printer.get_message_from_key_with_format("models_add_model_exists",name=data_dict["name"]),meta={
2137
2137
  "action": "models",
2138
2138
  "input": {
2139
2139
  "query": query
@@ -2177,7 +2177,7 @@ def manage_models(query: str):
2177
2177
  filtered_models = [m for m in models_data if m["name"] != name]
2178
2178
  if len(filtered_models) == len(models_data):
2179
2179
  printer.print_in_terminal("models_add_model_remove", style="yellow", name=name)
2180
- result_manager.add_result(content=printer.get_message_from_key("models_add_model_remove",name=name),meta={
2180
+ result_manager.add_result(content=printer.get_message_from_key_with_format("models_add_model_remove",name=name),meta={
2181
2181
  "action": "models",
2182
2182
  "input": {
2183
2183
  "query": query
@@ -2186,7 +2186,7 @@ def manage_models(query: str):
2186
2186
  return
2187
2187
  models_module.save_models(filtered_models)
2188
2188
  printer.print_in_terminal("models_add_model_removed", style="green", name=name)
2189
- result_manager.add_result(content=printer.get_message_from_key("models_add_model_removed",name=name),meta={
2189
+ result_manager.add_result(content=printer.get_message_from_key_with_format("models_add_model_removed",name=name),meta={
2190
2190
  "action": "models",
2191
2191
  "input": {
2192
2192
  "query": query
@@ -2194,7 +2194,7 @@ def manage_models(query: str):
2194
2194
  })
2195
2195
  else:
2196
2196
  printer.print_in_terminal("models_unknown_subcmd", style="yellow", subcmd=subcmd)
2197
- result_manager.add_result(content=printer.get_message_from_key("models_unknown_subcmd",subcmd=subcmd),meta={
2197
+ result_manager.add_result(content=printer.get_message_from_key_with_format("models_unknown_subcmd",subcmd=subcmd),meta={
2198
2198
  "action": "models",
2199
2199
  "input": {
2200
2200
  "query": query
@@ -171,15 +171,21 @@ class CommandAutoTuner:
171
171
  当前用户环境信息如下:
172
172
  <os_info>
173
173
  操作系统: {{ env_info.os_name }} {{ env_info.os_version }}
174
+ 操作系统发行版: {{ os_distribution }}
174
175
  Python版本: {{ env_info.python_version }}
175
176
  终端类型: {{ env_info.shell_type }}
176
177
  终端编码: {{ env_info.shell_encoding }}
178
+
179
+ {%- if shell_type %}
180
+ 脚本类型:{{ shell_type }}
181
+ {%- endif %}
182
+
177
183
  {%- if env_info.conda_env %}
178
184
  Conda环境: {{ env_info.conda_env }}
179
185
  {%- endif %}
180
186
  {%- if env_info.virtualenv %}
181
187
  虚拟环境: {{ env_info.virtualenv }}
182
- {%- endif %}
188
+ {%- endif %}
183
189
  </os_info>
184
190
 
185
191
  我们的目标是根据用户输入和当前上下文,组合多个函数来完成用户的需求。
@@ -221,6 +227,7 @@ class CommandAutoTuner:
221
227
  每个文件的tokens数,你可以根据这个信息来决定如何读取这个文件。比如对于很小的文件,那么可以直接全部读取,
222
228
  而对于分析一个超大文件推荐组合 read_files 带上 line_ranges 参数来读取,或者组合 read_file_withread_file_with_keyword_ranges 等来读取,
223
229
  每个函数你还可以使用多次来获取更多信息。
230
+ 9. 根据操作系统,终端类型,脚本类型等各种信息,在涉及到路径或者脚本的时候,需要考虑平台差异性。
224
231
  </function_combination_readme>
225
232
 
226
233
 
@@ -260,7 +267,13 @@ class CommandAutoTuner:
260
267
  满足需求。
261
268
  """
262
269
 
263
- env_info = detect_env()
270
+ env_info = detect_env()
271
+ shell_type = "bash"
272
+ if shells.is_running_in_cmd():
273
+ shell_type = "cmd"
274
+ elif shells.is_running_in_powershell():
275
+ shell_type = "powershell"
276
+
264
277
  return {
265
278
  "user_input": request.user_input,
266
279
  "current_files": self.memory_config.memory["current_files"]["files"],
@@ -268,9 +281,10 @@ class CommandAutoTuner:
268
281
  "available_commands": self._command_readme.prompt(),
269
282
  "current_conf": json.dumps(self.memory_config.memory["conf"], indent=2),
270
283
  "env_info": env_info,
271
- "shell_type": shells.get_terminal_name(),
284
+ "shell_type": shell_type,
272
285
  "shell_encoding": shells.get_terminal_encoding(),
273
- "conversation_safe_zone_tokens": self.args.conversation_prune_safe_zone_tokens
286
+ "conversation_safe_zone_tokens": self.args.conversation_prune_safe_zone_tokens,
287
+ "os_distribution": shells.get_os_distribution()
274
288
  }
275
289
 
276
290
  @byzerllm.prompt()
@@ -1179,6 +1193,18 @@ class CommandAutoTuner:
1179
1193
  此时会返回诸如 "ts,py,java,go,js,ts" 这样的字符串,表示项目类型。
1180
1194
  </usage>
1181
1195
  </command>
1196
+
1197
+ <command>
1198
+ <name>response_user</name>
1199
+ <description>响应用户。</description>
1200
+ <usage>
1201
+ 如果你需要直接发送信息给用户,那么可以通过 response_user 函数来直接回复用户。
1202
+
1203
+ 比如用户问你是谁?
1204
+ 你可以通过如下方式来回答:
1205
+ response_user(response="你好,我是 auto-coder")
1206
+ </usage>
1207
+ </command>
1182
1208
  </commands>
1183
1209
 
1184
1210
 
@@ -1224,7 +1250,9 @@ class CommandAutoTuner:
1224
1250
  "get_project_related_files": self.tools.get_project_related_files,
1225
1251
  "ask_user":self.tools.ask_user,
1226
1252
  "read_file_with_keyword_ranges": self.tools.read_file_with_keyword_ranges,
1227
- "get_project_type": self.project_type_analyzer.analyze,
1253
+ "get_project_type": self.project_type_analyzer.analyze,
1254
+ "response_user": self.tools.response_user,
1255
+
1228
1256
  }
1229
1257
 
1230
1258
  if command not in command_map:
@@ -28,6 +28,10 @@ from autocoder.utils.queue_communicate import (
28
28
  import sys
29
29
  import io
30
30
  from autocoder.common import files as files_utils
31
+ from autocoder.common.printer import Printer
32
+ from prompt_toolkit import PromptSession
33
+ from prompt_toolkit.styles import Style
34
+
31
35
 
32
36
  @byzerllm.prompt()
33
37
  def detect_rm_command(command: str) -> Bool:
@@ -56,6 +60,7 @@ class AutoCommandTools:
56
60
  self.args = args
57
61
  self.llm = llm
58
62
  self.result_manager = ResultManager()
63
+ self.printer = Printer()
59
64
 
60
65
  def ask_user(self,question:str) -> str:
61
66
  '''
@@ -91,35 +96,43 @@ class AutoCommandTools:
91
96
  )
92
97
 
93
98
  # 显示问题面板
94
- console.print(question_panel)
99
+ console.print(question_panel)
95
100
 
96
- # 创建一个自定义提示符
97
- prompt = Prompt.ask(
98
- "\n[bold green]Your Answer[/bold green]",
99
- console=console
100
- )
101
+ session = PromptSession( message=self.printer.get_message_from_key('tool_ask_user'))
102
+ try:
103
+ answer = session.prompt()
104
+ except KeyboardInterrupt:
105
+ answer = ""
101
106
 
102
- # 获取用户的回答
103
- answer = prompt
107
+ self.result_manager.append(content=answer, meta = {
108
+ "action": "ask_user",
109
+ "input": {
110
+ "question": question
111
+ }
112
+ })
104
113
 
105
- # 显示用户的回答
106
- answer_text = Text(answer, style="italic")
114
+ return answer
115
+
116
+ def response_user(self, response: str):
117
+ console = Console()
118
+ answer_text = Text(response, style="italic")
107
119
  answer_panel = Panel(
108
120
  answer_text,
109
- title="[bold yellow]Your Response[/bold yellow]",
121
+ title="",
110
122
  border_style="green",
111
123
  expand=False
112
124
  )
113
125
  console.print(answer_panel)
114
126
 
115
- self.result_manager.append(content=answer, meta = {
116
- "action": "ask_user",
127
+ self.result_manager.append(content=response, meta = {
128
+ "action": "response_user",
117
129
  "input": {
118
- "question": question
130
+ "response": response
119
131
  }
120
132
  })
121
133
 
122
- return answer
134
+ return response
135
+
123
136
 
124
137
  def run_python_code(self, code: str) -> str:
125
138
  """
@@ -130,7 +130,7 @@ MESSAGES = {
130
130
  "quick_filter_too_long": "⚠️ index file is too large ({{ tokens_len }}/{{ max_tokens }}). The query will be split into {{ split_size }} chunks.",
131
131
  "quick_filter_tokens_len": "📊 Current index size: {{ tokens_len }} tokens",
132
132
  "estimated_chat_input_tokens": "Estimated chat input tokens: {{ estimated_input_tokens }}",
133
- "estimated_input_tokens_in_generate": "Estimated input tokens in generate ({{ generate_mode }}): {{ estimated_input_tokens }}",
133
+ "estimated_input_tokens_in_generate": "Estimated input tokens in generate ({{ generate_mode }}): {{ estimated_input_tokens_in_generate }}",
134
134
  "model_has_access_restrictions": "{{model_name}} has access restrictions, cannot use the current function",
135
135
  "auto_command_not_found": "Auto command not found: {{command}}. Please check your input and try again.",
136
136
  "auto_command_failed": "Auto command failed: {{error}}. Please check your input and try again.",
@@ -170,6 +170,8 @@ MESSAGES = {
170
170
  "sorted_files_message": "Reordered files:\n{% for file in files %}- {{ file }}\n{% endfor %}",
171
171
  "estimated_input_tokens_in_ranking": "estimate input token {{ estimated_input_tokens }} when ranking",
172
172
  "file_snippet_procesed": "{{ file_path }} processed with tokens: {{ tokens }} => {{ snippet_tokens }}. Current total tokens: {{ total_tokens }}",
173
+ "tool_ask_user": "Your Reply: ",
174
+ "tool_ask_user_accept":"Your Response received",
173
175
 
174
176
  },
175
177
  "zh": {
@@ -317,7 +319,7 @@ MESSAGES = {
317
319
  "quick_filter_title": "{{ model_name }} 正在分析如何筛选上下文...",
318
320
  "quick_filter_failed": "❌ 快速过滤器失败: {{ error }}. ",
319
321
  "estimated_chat_input_tokens": "对话输入token预估为: {{ estimated_input_tokens }}",
320
- "estimated_input_tokens_in_generate": "生成代码({{ generate_mode }})预计输入token数: {{ estimated_input_tokens }}",
322
+ "estimated_input_tokens_in_generate": "生成代码({{ generate_mode }})预计输入token数: {{ estimated_input_tokens_in_generate }}",
321
323
  "model_has_access_restrictions": "{{model_name}} 有访问限制,无法使用当前功能",
322
324
  "auto_command_not_found": "未找到自动命令: {{command}}。请检查您的输入并重试。",
323
325
  "auto_command_failed": "自动命令执行失败: {{error}}。请检查您的输入并重试。",
@@ -337,7 +339,9 @@ MESSAGES = {
337
339
  "rank_code_modification_title": "模型{{model_name}}对代码打分",
338
340
  "sorted_files_message": "重新排序后的文件路径:\n{% for file in files %}- {{ file }}\n{% endfor %}",
339
341
  "estimated_input_tokens_in_ranking": "排序预计输入token数: {{ estimated_input_tokens }}",
340
- "file_snippet_procesed": "文件 {{ file_path }} 处理后token数: {{ tokens }} => {{ snippet_tokens }} 当前总token数: {{ total_tokens }}"
342
+ "file_snippet_procesed": "文件 {{ file_path }} 处理后token数: {{ tokens }} => {{ snippet_tokens }} 当前总token数: {{ total_tokens }}",
343
+ "tool_ask_user": "您的回复: ",
344
+ "tool_ask_user_accept":"收到您的回复",
341
345
  }}
342
346
 
343
347
 
@@ -154,7 +154,7 @@ def config_readme() -> str:
154
154
  项目类型通常为如下三种选择:
155
155
  1. ts
156
156
  2. py
157
- 3. 代码文件后缀名列表(比如.java,.py,.go,.js,.ts),多个按逗号分割
157
+ 3. 代码文件后缀名列表(比如.java,.py,.go,.js,.ts),多个按逗号分割
158
158
 
159
159
  推荐使用 3 选项,因为项目类型通常为多种后缀名混合。
160
160
  """
@@ -12,6 +12,7 @@ def _generate_shell_script(user_input: str) -> str:
12
12
  环境信息如下:
13
13
 
14
14
  操作系统: {{ env_info.os_name }} {{ env_info.os_version }}
15
+ 操作系统发行版: {{ os_distribution }}
15
16
  Python版本: {{ env_info.python_version }}
16
17
  终端类型: {{ env_info.shell_type }}
17
18
  终端编码: {{ env_info.shell_encoding }}
@@ -49,7 +50,8 @@ def _generate_shell_script(user_input: str) -> str:
49
50
  return {
50
51
  "env_info": env_info,
51
52
  "shell_type": shell_type,
52
- "shell_encoding": shells.get_terminal_encoding()
53
+ "shell_encoding": shells.get_terminal_encoding(),
54
+ "os_distribution": shells.get_os_distribution()
53
55
  }
54
56
 
55
57
 
@@ -4,8 +4,7 @@ from typing import List, Dict, Union, Generator, Tuple
4
4
  def read_file(file_path):
5
5
  """Read a file with automatic encoding detection.
6
6
 
7
- Tries common encodings in sequence (UTF-8 > GBK > UTF-16 > Latin-1) to handle
8
- cross-platform encoding issues between Windows and Linux systems.
7
+ Tries common encodings in sequence to handle cross-platform encoding issues.
9
8
 
10
9
  Args:
11
10
  file_path (str): Path to the file to read
@@ -16,7 +15,10 @@ def read_file(file_path):
16
15
  Raises:
17
16
  ValueError: If the file cannot be decoded with any of the tried encodings
18
17
  """
19
- encodings = ['utf-8', 'gbk', 'utf-16', 'latin-1']
18
+ # Expanded list of encodings to try
19
+ encodings = ['utf-8', 'gbk', 'utf-16', 'latin-1',
20
+ 'big5', 'shift_jis', 'euc-jp', 'iso-8859-1',
21
+ 'cp1252', 'ascii']
20
22
 
21
23
  for encoding in encodings:
22
24
  try:
@@ -25,22 +27,54 @@ def read_file(file_path):
25
27
  return content
26
28
  except UnicodeDecodeError:
27
29
  continue
30
+ except Exception as e:
31
+ # Log other errors but continue trying other encodings
32
+ continue
28
33
 
29
- raise ValueError(get_message_with_format("file_decode_error",
30
- file_path=file_path,
31
- encodings=", ".join(encodings)))
34
+ # If all encodings fail, try reading as binary and decode with 'replace'
35
+ try:
36
+ with open(file_path, 'rb') as f:
37
+ return f.read().decode('utf-8', errors='replace')
38
+ except Exception as e:
39
+ raise ValueError(get_message_with_format("file_decode_error",
40
+ file_path=file_path,
41
+ encodings=", ".join(encodings)))
32
42
 
33
43
  def read_lines(file_path:str):
34
- encodings = ['utf-8', 'gbk', 'utf-16', 'latin-1']
44
+ """Read a file line by line with automatic encoding detection.
45
+
46
+ Args:
47
+ file_path (str): Path to the file to read
48
+
49
+ Returns:
50
+ List[str]: List of lines in the file
51
+
52
+ Raises:
53
+ ValueError: If the file cannot be decoded with any of the tried encodings
54
+ """
55
+ # Expanded list of encodings to try
56
+ encodings = ['utf-8', 'gbk', 'utf-16', 'latin-1',
57
+ 'big5', 'shift_jis', 'euc-jp', 'iso-8859-1',
58
+ 'cp1252', 'ascii']
59
+
35
60
  for encoding in encodings:
36
61
  try:
37
62
  with open(file_path, 'r', encoding=encoding) as f:
38
63
  return f.readlines()
39
64
  except UnicodeDecodeError:
40
65
  continue
41
- raise ValueError(get_message_with_format("file_decode_error",
42
- file_path=file_path,
43
- encodings=", ".join(encodings)))
66
+ except Exception as e:
67
+ # Log other errors but continue trying other encodings
68
+ continue
69
+
70
+ # If all encodings fail, try reading as binary and decode with 'replace'
71
+ try:
72
+ with open(file_path, 'rb') as f:
73
+ return f.read().decode('utf-8', errors='replace').splitlines()
74
+ except Exception as e:
75
+ raise ValueError(get_message_with_format("file_decode_error",
76
+ file_path=file_path,
77
+ encodings=", ".join(encodings)))
44
78
 
45
79
 
46
80
 
@@ -5,6 +5,7 @@ import subprocess
5
5
  import platform
6
6
  import tempfile
7
7
  import uuid
8
+ import re
8
9
  from rich.console import Console
9
10
  from rich.panel import Panel
10
11
  from rich.text import Text
@@ -187,6 +188,71 @@ def _get_windows_terminal_name() -> str:
187
188
  # 默认返回 cmd.exe
188
189
  return 'cmd'
189
190
 
191
+ def get_os_distribution() -> str:
192
+ """
193
+ 获取操作系统发行版名称
194
+
195
+ Returns:
196
+ str: 操作系统发行版名称,如 'Ubuntu 22.04', 'CentOS 7', 'Windows 10' 等
197
+ """
198
+ system = platform.system()
199
+
200
+ if system == 'Windows':
201
+ # Windows 系统版本
202
+ version = sys.getwindowsversion()
203
+ if version.major == 10 and version.build >= 22000:
204
+ return 'Windows 11'
205
+ elif version.major == 10:
206
+ return 'Windows 10'
207
+ elif version.major == 6:
208
+ if version.minor == 3:
209
+ return 'Windows 8.1'
210
+ elif version.minor == 2:
211
+ return 'Windows 8'
212
+ elif version.minor == 1:
213
+ return 'Windows 7'
214
+ elif version.minor == 0:
215
+ return 'Windows Vista'
216
+ elif version.major == 5:
217
+ if version.minor == 2:
218
+ return 'Windows Server 2003'
219
+ elif version.minor == 1:
220
+ return 'Windows XP'
221
+ return f'Windows {version.major}.{version.minor}'
222
+
223
+ elif system == 'Linux':
224
+ # Linux 发行版检测
225
+ try:
226
+ # 尝试读取 /etc/os-release
227
+ with open('/etc/os-release', 'r') as f:
228
+ os_release = f.read()
229
+
230
+ # 解析 NAME 和 VERSION_ID
231
+ name = re.search(r'NAME="([^"]+)"', os_release)
232
+ version = re.search(r'VERSION_ID="([^"]+)"', os_release)
233
+
234
+ if name and version:
235
+ return f"{name.group(1)} {version.group(1)}"
236
+
237
+ # 如果无法解析,尝试 lsb_release
238
+ try:
239
+ output = subprocess.check_output(['lsb_release', '-d'], stderr=subprocess.STDOUT)
240
+ return output.decode('utf-8').split(':')[1].strip()
241
+ except (subprocess.CalledProcessError, FileNotFoundError):
242
+ pass
243
+
244
+ # 最后尝试 uname
245
+ return platform.platform()
246
+ except Exception:
247
+ return platform.platform()
248
+
249
+ elif system == 'Darwin':
250
+ # macOS 版本
251
+ version = platform.mac_ver()[0]
252
+ return f'macOS {version}'
253
+
254
+ return platform.platform()
255
+
190
256
  def _get_unix_terminal_name() -> str:
191
257
  """Linux/Mac 系统终端检测"""
192
258
  # 从环境变量获取终端名称
@@ -238,6 +304,8 @@ def get_terminal_encoding() -> str:
238
304
  return _get_unix_terminal_encoding()
239
305
 
240
306
  def _get_windows_terminal_encoding() -> str:
307
+ # 添加发行版信息到环境变量
308
+ # os.environ['OS_DISTRIBUTION'] = get_os_distribution()
241
309
  """Windows 系统编码检测"""
242
310
  try:
243
311
  # 通过 chcp 命令获取代码页
@@ -287,6 +287,7 @@ class QuickFilter():
287
287
  当用户提一个需求的时候,我们要找到两种类型的源码文件:
288
288
  1. 根据需求需要被修改的文件,我们叫 edited_files
289
289
  2. 为了能够完成修改这些文件,还需要的一些额外参考文件, 我们叫 reference_files
290
+ 3. 因为修改了 edited_files 文件,可能有一些依赖 edited_files 的文件也需要被修改,我们叫 dependent_files
290
291
 
291
292
  现在,给定下面的索引文件:
292
293
 
@@ -315,9 +316,9 @@ class QuickFilter():
315
316
  ```
316
317
 
317
318
  特别注意:
318
- 1. 如果用户的query里有 @文件 或者 @@符号,那么被@的文件或者@@的符号必须要返回。
319
- 2. 根据需求以及根据 @文件 或者 @@符号 找到的文件,猜测需要被修改的edited_files文件,然后尝试通过索引文件诸如导入语句等信息找到这些文件依赖的其他文件得到 reference_files。
320
- 3. file_list 里的文件序号,按被 @ 或者 @@ 文件,edited_files文件,reference_files文件的顺序排列。注意,reference_files 你要根据需求来猜测是否需要,过滤掉不相关的,避免返回文件数过多。
319
+ 1. 如果用户的query里有 @文件 或者 @@符号,并且他们在索引文件中,那么被@的文件或者@@的符号必须要返回。
320
+ 2. 根据需求以及根据 @文件 或者 @@符号 找到的文件,猜测需要被修改的edited_files文件,然后尝试通过索引文件诸如导入语句等信息找到这些文件依赖的其他文件得到 reference_files,dependent_files
321
+ 3. file_list 里的文件序号,按被 @ 或者 @@ 文件,edited_files文件,reference_files,dependent_files文件的顺序排列。注意,reference_files 你要根据需求来猜测是否需要,过滤掉不相关的,避免返回文件数过多。
321
322
  4. 如果 query 里是一段历史对话,那么对话里的内容提及的文件路径必须要返回。
322
323
  5. 如果用户需求为空,则直接返回空列表即可。
323
324
  6. 返回的 json格式数据不允许有注释