auto-coder 0.1.219__tar.gz → 0.1.220__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 (142) hide show
  1. {auto_coder-0.1.219 → auto_coder-0.1.220}/PKG-INFO +1 -1
  2. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/auto_coder.egg-info/PKG-INFO +1 -1
  3. auto_coder-0.1.220/src/autocoder/rag/doc_filter.py +176 -0
  4. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/long_context_rag.py +6 -4
  5. auto_coder-0.1.220/src/autocoder/version.py +1 -0
  6. auto_coder-0.1.219/src/autocoder/rag/doc_filter.py +0 -273
  7. auto_coder-0.1.219/src/autocoder/version.py +0 -1
  8. {auto_coder-0.1.219 → auto_coder-0.1.220}/LICENSE +0 -0
  9. {auto_coder-0.1.219 → auto_coder-0.1.220}/README.md +0 -0
  10. {auto_coder-0.1.219 → auto_coder-0.1.220}/setup.cfg +0 -0
  11. {auto_coder-0.1.219 → auto_coder-0.1.220}/setup.py +0 -0
  12. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/auto_coder.egg-info/SOURCES.txt +0 -0
  13. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  14. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/auto_coder.egg-info/entry_points.txt +0 -0
  15. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/auto_coder.egg-info/requires.txt +0 -0
  16. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/auto_coder.egg-info/top_level.txt +0 -0
  17. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/__init__.py +0 -0
  18. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/__init__.py +0 -0
  19. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  20. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/auto_filegroup.py +0 -0
  21. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/auto_guess_query.py +0 -0
  22. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/auto_tool.py +0 -0
  23. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/coder.py +0 -0
  24. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/designer.py +0 -0
  25. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/planner.py +0 -0
  26. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/agent/project_reader.py +0 -0
  27. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/auto_coder.py +0 -0
  28. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/auto_coder_lang.py +0 -0
  29. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/auto_coder_rag.py +0 -0
  30. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/auto_coder_server.py +0 -0
  31. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/benchmark.py +0 -0
  32. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/chat/__init__.py +0 -0
  33. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/chat_auto_coder.py +0 -0
  34. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/chat_auto_coder_lang.py +0 -0
  35. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/command_args.py +0 -0
  36. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/JupyterClient.py +0 -0
  37. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/ShellClient.py +0 -0
  38. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/__init__.py +0 -0
  39. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/anything2images.py +0 -0
  40. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/anything2img.py +0 -0
  41. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/audio.py +0 -0
  42. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/buildin_tokenizer.py +0 -0
  43. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/chunk_validation.py +0 -0
  44. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/cleaner.py +0 -0
  45. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_execute.py +0 -0
  46. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_generate.py +0 -0
  47. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_generate_diff.py +0 -0
  48. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
  49. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
  50. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_merge.py +0 -0
  51. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_merge_diff.py +0 -0
  52. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
  53. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
  54. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/code_modification_ranker.py +0 -0
  55. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/command_completer.py +0 -0
  56. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/command_generator.py +0 -0
  57. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/command_templates.py +0 -0
  58. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/const.py +0 -0
  59. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/git_utils.py +0 -0
  60. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/image_to_page.py +0 -0
  61. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/interpreter.py +0 -0
  62. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/llm_rerank.py +0 -0
  63. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/mcp_hub.py +0 -0
  64. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/mcp_server.py +0 -0
  65. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  66. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
  67. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/mcp_tools.py +0 -0
  68. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/recall_validation.py +0 -0
  69. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/screenshots.py +0 -0
  70. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/search.py +0 -0
  71. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/search_replace.py +0 -0
  72. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/sys_prompt.py +0 -0
  73. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/text.py +0 -0
  74. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/common/types.py +0 -0
  75. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/data/tokenizer.json +0 -0
  76. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/db/__init__.py +0 -0
  77. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/db/store.py +0 -0
  78. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/dispacher/__init__.py +0 -0
  79. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/dispacher/actions/__init__.py +0 -0
  80. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/dispacher/actions/action.py +0 -0
  81. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/dispacher/actions/copilot.py +0 -0
  82. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
  83. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
  84. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/dispacher/actions/plugins/action_translate.py +0 -0
  85. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/index/__init__.py +0 -0
  86. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/index/for_command.py +0 -0
  87. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/index/index.py +0 -0
  88. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/index/symbols_utils.py +0 -0
  89. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/lang.py +0 -0
  90. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/pyproject/__init__.py +0 -0
  91. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/__init__.py +0 -0
  92. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/api_server.py +0 -0
  93. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/cache/__init__.py +0 -0
  94. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/cache/base_cache.py +0 -0
  95. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
  96. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
  97. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/cache/simple_cache.py +0 -0
  98. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/document_retriever.py +0 -0
  99. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/llm_wrapper.py +0 -0
  100. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/loaders/__init__.py +0 -0
  101. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  102. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  103. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  104. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  105. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/rag_config.py +0 -0
  106. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/rag_entry.py +0 -0
  107. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/raw_rag.py +0 -0
  108. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/relevant_utils.py +0 -0
  109. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/simple_directory_reader.py +0 -0
  110. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/simple_rag.py +0 -0
  111. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/stream_event/__init__.py +0 -0
  112. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  113. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/stream_event/types.py +0 -0
  114. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/token_checker.py +0 -0
  115. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/token_counter.py +0 -0
  116. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/token_limiter.py +0 -0
  117. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/types.py +0 -0
  118. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/utils.py +0 -0
  119. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/rag/variable_holder.py +0 -0
  120. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/regexproject/__init__.py +0 -0
  121. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/suffixproject/__init__.py +0 -0
  122. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/tsproject/__init__.py +0 -0
  123. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/__init__.py +0 -0
  124. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/_markitdown.py +0 -0
  125. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/conversation_store.py +0 -0
  126. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  127. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/log_capture.py +0 -0
  128. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/multi_turn.py +0 -0
  129. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/operate_config_api.py +0 -0
  130. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/print_table.py +0 -0
  131. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/queue_communicate.py +0 -0
  132. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/request_event_queue.py +0 -0
  133. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/request_queue.py +0 -0
  134. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/rest.py +0 -0
  135. {auto_coder-0.1.219 → auto_coder-0.1.220}/src/autocoder/utils/tests.py +0 -0
  136. {auto_coder-0.1.219 → auto_coder-0.1.220}/tests/test_action_regex_project.py +0 -0
  137. {auto_coder-0.1.219 → auto_coder-0.1.220}/tests/test_chat_auto_coder.py +0 -0
  138. {auto_coder-0.1.219 → auto_coder-0.1.220}/tests/test_code_auto_merge_editblock.py +0 -0
  139. {auto_coder-0.1.219 → auto_coder-0.1.220}/tests/test_command_completer.py +0 -0
  140. {auto_coder-0.1.219 → auto_coder-0.1.220}/tests/test_planner.py +0 -0
  141. {auto_coder-0.1.219 → auto_coder-0.1.220}/tests/test_queue_communicate.py +0 -0
  142. {auto_coder-0.1.219 → auto_coder-0.1.220}/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.219
3
+ Version: 0.1.220
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.219
3
+ Version: 0.1.220
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -0,0 +1,176 @@
1
+ import time
2
+ from typing import List, Dict, Optional
3
+ from loguru import logger
4
+ from concurrent.futures import ThreadPoolExecutor, as_completed
5
+
6
+ from autocoder.rag.relevant_utils import (
7
+ parse_relevance,
8
+ FilterDoc,
9
+ TaskTiming,
10
+ )
11
+
12
+ from autocoder.common import SourceCode, AutoCoderArgs
13
+ from autocoder.rag.rag_config import RagConfigManager
14
+ from byzerllm import ByzerLLM
15
+ import byzerllm
16
+
17
+
18
+ @byzerllm.prompt()
19
+ def _check_relevance_with_conversation(
20
+ conversations: List[Dict[str, str]],
21
+ documents: List[str],
22
+ filter_config: Optional[str] = None,
23
+ ) -> str:
24
+ """
25
+ 使用以下文档和对话历史来回答问题。如果文档中没有相关信息,请说"我没有足够的信息来回答这个问题"。
26
+
27
+ 文档:
28
+ <documents>
29
+ {% for doc in documents %}
30
+ {{ doc }}
31
+ {% endfor %}
32
+ </documents>
33
+
34
+ 对话历史:
35
+ <conversations>
36
+ {% for msg in conversations %}
37
+ <{{ msg.role }}>: {{ msg.content }}
38
+ {% endfor %}
39
+ </conversations>
40
+
41
+ {% if filter_config %}
42
+ 一些提示:
43
+ {{ filter_config }}
44
+ {% endif %}
45
+
46
+ 请结合提供的文档以及用户对话历史,判断提供的文档是不是能和用户的最后一个问题相关。
47
+ 如果该文档提供的知识能够和用户的问题相关,那么请回复"yes/<relevant>" 否则回复"no/<relevant>"。
48
+ 其中, <relevant> 是你认为文档中和问题的相关度,0-10之间的数字,数字越大表示相关度越高。
49
+ """
50
+
51
+
52
+ class DocFilter:
53
+ def __init__(
54
+ self,
55
+ llm: ByzerLLM,
56
+ args: AutoCoderArgs,
57
+ on_ray: bool = False,
58
+ path: Optional[str] = None,
59
+ ):
60
+ self.llm = llm
61
+ if self.llm.get_sub_client("recall_model"):
62
+ self.recall_llm = self.llm.get_sub_client("recall_model")
63
+ else:
64
+ self.recall_llm = self.llm
65
+
66
+ self.args = args
67
+ self.relevant_score = self.args.rag_doc_filter_relevance or 5
68
+ self.on_ray = on_ray
69
+ self.path = path
70
+
71
+ def filter_docs(
72
+ self, conversations: List[Dict[str, str]], documents: List[SourceCode]
73
+ ) -> List[FilterDoc]:
74
+ return self.filter_docs_with_threads(conversations, documents)
75
+
76
+ def filter_docs_with_threads(
77
+ self, conversations: List[Dict[str, str]], documents: List[SourceCode]
78
+ ) -> List[FilterDoc]:
79
+
80
+ rag_manager = RagConfigManager(path=self.path)
81
+ rag_config = rag_manager.load_config()
82
+ documents = list(documents)
83
+ logger.info(f"Filtering {len(documents)} documents....")
84
+ with ThreadPoolExecutor(
85
+ max_workers=self.args.index_filter_workers or 5
86
+ ) as executor:
87
+ future_to_doc = {}
88
+ for doc in documents:
89
+ submit_time = time.time()
90
+
91
+ def _run(conversations, docs):
92
+ submit_time_1 = time.time()
93
+ try:
94
+ llm = ByzerLLM()
95
+ llm.skip_nontext_check = True
96
+ llm.setup_default_model_name(self.recall_llm.default_model_name)
97
+
98
+ v = (
99
+ _check_relevance_with_conversation.with_llm(
100
+ llm)
101
+ .options({"llm_config": {"max_length": 10}})
102
+ .run(
103
+ conversations=conversations,
104
+ documents=docs,
105
+ filter_config=rag_config.filter_config,
106
+ )
107
+ )
108
+ except Exception as e:
109
+ logger.error(
110
+ f"Error in _check_relevance_with_conversation: {str(e)}"
111
+ )
112
+ return (None, submit_time_1, time.time())
113
+
114
+ end_time_2 = time.time()
115
+ return (v, submit_time_1, end_time_2)
116
+
117
+ m = executor.submit(
118
+ _run,
119
+ conversations,
120
+ [f"##File: {doc.module_name}\n{doc.source_code}"],
121
+ )
122
+ future_to_doc[m] = (doc, submit_time)
123
+
124
+ relevant_docs = []
125
+ for future in as_completed(list(future_to_doc.keys())):
126
+ try:
127
+ doc, submit_time = future_to_doc[future]
128
+ end_time = time.time()
129
+ v, submit_time_1, end_time_2 = future.result()
130
+ task_timing = TaskTiming(
131
+ submit_time=submit_time,
132
+ end_time=end_time,
133
+ duration=end_time - submit_time,
134
+ real_start_time=submit_time_1,
135
+ real_end_time=end_time_2,
136
+ real_duration=end_time_2 - submit_time_1,
137
+ )
138
+
139
+ relevance = parse_relevance(v)
140
+ logger.info(
141
+ f"Document filtering progress:\n"
142
+ f" - File: {doc.module_name}\n"
143
+ f" - Relevance: {'Relevant' if relevance and relevance.is_relevant else 'Not Relevant'}\n"
144
+ f" - Score: {relevance.relevant_score if relevance else 'N/A'}\n"
145
+ f" - Raw Response: {v}\n"
146
+ f" - Timing:\n"
147
+ f" * Total Duration: {task_timing.duration:.2f}s\n"
148
+ f" * Real Duration: {task_timing.real_duration:.2f}s\n"
149
+ f" * Queue Time: {(task_timing.real_start_time - task_timing.submit_time):.2f}s"
150
+ )
151
+ if (
152
+ relevance
153
+ and relevance.is_relevant
154
+ and relevance.relevant_score >= self.relevant_score
155
+ ):
156
+ relevant_docs.append(
157
+ FilterDoc(
158
+ source_code=doc,
159
+ relevance=relevance,
160
+ task_timing=task_timing,
161
+ )
162
+ )
163
+ except Exception as exc:
164
+ try:
165
+ doc, submit_time = future_to_doc[future]
166
+ logger.error(
167
+ f"Filtering document generated an exception (doc: {doc.module_name}): {exc}")
168
+ except Exception as e:
169
+ logger.error(
170
+ f"Filtering document generated an exception: {exc}")
171
+
172
+ # Sort relevant_docs by relevance score in descending order
173
+ relevant_docs.sort(
174
+ key=lambda x: x.relevance.relevant_score, reverse=True)
175
+ return relevant_docs
176
+
@@ -428,6 +428,7 @@ class LongContextRAG:
428
428
  if "only_contexts" in v:
429
429
  query = v["query"]
430
430
  only_contexts = v["only_contexts"]
431
+ conversations[-1]["content"] = query
431
432
  except json.JSONDecodeError:
432
433
  pass
433
434
 
@@ -463,9 +464,10 @@ class LongContextRAG:
463
464
  )
464
465
 
465
466
  if only_contexts:
466
- return (
467
- doc.source_code.model_dump_json() + "\n" for doc in relevant_docs
468
- ), []
467
+ final_docs = []
468
+ for doc in relevant_docs:
469
+ final_docs.append(doc.model_dump())
470
+ return [json.dumps(final_docs,ensure_ascii=False)], []
469
471
 
470
472
  if not relevant_docs:
471
473
  return ["没有找到相关的文档来回答这个问题。"], []
@@ -612,7 +614,7 @@ class LongContextRAG:
612
614
  ),
613
615
  }
614
616
  ]
615
-
617
+
616
618
  chunks = target_llm.stream_chat_oai(
617
619
  conversations=new_conversations,
618
620
  model=model,
@@ -0,0 +1 @@
1
+ __version__ = "0.1.220"
@@ -1,273 +0,0 @@
1
- import time
2
- from typing import List, Dict, Optional
3
- from pydantic import BaseModel
4
- import ray
5
- from loguru import logger
6
- import os
7
- from concurrent.futures import ThreadPoolExecutor, as_completed
8
- from rich.progress import (
9
- Progress,
10
- SpinnerColumn,
11
- TextColumn,
12
- BarColumn,
13
- TaskProgressColumn,
14
- TimeElapsedColumn,
15
- )
16
- from rich.console import Console
17
-
18
- from autocoder.rag.relevant_utils import (
19
- parse_relevance,
20
- FilterDoc,
21
- DocRelevance,
22
- TaskTiming,
23
- )
24
-
25
- from autocoder.common import SourceCode, AutoCoderArgs
26
- from autocoder.rag.rag_config import RagConfigManager
27
- from byzerllm import ByzerLLM
28
- import byzerllm
29
-
30
-
31
- @byzerllm.prompt()
32
- def _check_relevance_with_conversation(
33
- conversations: List[Dict[str, str]],
34
- documents: List[str],
35
- filter_config: Optional[str] = None,
36
- ) -> str:
37
- """
38
- 使用以下文档和对话历史来回答问题。如果文档中没有相关信息,请说"我没有足够的信息来回答这个问题"。
39
-
40
- 文档:
41
- {% for doc in documents %}
42
- {{ doc }}
43
- {% endfor %}
44
-
45
- 对话历史:
46
- {% for msg in conversations %}
47
- <{{ msg.role }}>: {{ msg.content }}
48
- {% endfor %}
49
-
50
- {% if filter_config %}
51
- 一些提示:
52
- {{ filter_config }}
53
- {% endif %}
54
-
55
- 请结合提供的文档以及用户对话历史,判断提供的文档是不是能和用户的最后一个问题相关。
56
- 如果该文档提供的知识能够和用户的问题相关,那么请回复"yes/<relevant>" 否则回复"no/<relevant>"。
57
- 其中, <relevant> 是你认为文档中和问题的相关度,0-10之间的数字,数字越大表示相关度越高。
58
- """
59
-
60
-
61
- @ray.remote
62
- class DocFilterWorker:
63
- def __init__(self, llm: ByzerLLM):
64
- self.llm = llm
65
- if self.llm.get_sub_client("recall_model"):
66
- self.recall_llm = self.llm.get_sub_client("recall_model")
67
- else:
68
- self.recall_llm = self.llm
69
-
70
- def filter_doc(
71
- self, conversations: List[Dict[str, str]], docs: List[str]
72
- ) -> Optional[FilterDoc]:
73
- submit_time_1 = time.time()
74
- try:
75
- v = _check_relevance_with_conversation.with_llm(self.llm).run(
76
- conversations=conversations, documents=docs
77
- )
78
- except Exception as e:
79
- logger.error(
80
- f"Error in _check_relevance_with_conversation: {str(e)}")
81
- return (None, submit_time_1, time.time())
82
-
83
- end_time_2 = time.time()
84
- return (v, submit_time_1, end_time_2)
85
-
86
-
87
- class DocFilter:
88
- def __init__(
89
- self,
90
- llm: ByzerLLM,
91
- args: AutoCoderArgs,
92
- on_ray: bool = False,
93
- path: Optional[str] = None,
94
- ):
95
- self.llm = llm
96
- if self.llm.get_sub_client("recall_model"):
97
- self.recall_llm = self.llm.get_sub_client("recall_model")
98
- else:
99
- self.recall_llm = self.llm
100
-
101
- self.args = args
102
- self.relevant_score = self.args.rag_doc_filter_relevance or 5
103
- self.on_ray = on_ray
104
- self.path = path
105
- if self.on_ray:
106
- cpu_count = os.cpu_count() or 1
107
- self.workers = [
108
- DocFilterWorker.options(
109
- max_concurrency=1000, num_cpus=0).remote(llm)
110
- for _ in range(cpu_count)
111
- ]
112
-
113
- def filter_docs(
114
- self, conversations: List[Dict[str, str]], documents: List[SourceCode]
115
- ) -> List[FilterDoc]:
116
- if self.on_ray:
117
- return self.filter_docs_with_ray(conversations, documents)
118
- else:
119
- return self.filter_docs_with_threads(conversations, documents)
120
-
121
- def filter_docs_with_threads(
122
- self, conversations: List[Dict[str, str]], documents: List[SourceCode]
123
- ) -> List[FilterDoc]:
124
-
125
- console = Console()
126
- rag_manager = RagConfigManager(path=self.path)
127
- rag_config = rag_manager.load_config()
128
- documents = list(documents)
129
- with Progress(
130
- SpinnerColumn(),
131
- TextColumn("[progress.description]{task.description}"),
132
- BarColumn(),
133
- TimeElapsedColumn(),
134
- console=console,
135
- ) as progress:
136
- task = progress.add_task(
137
- "[cyan]Filtering documents...", total=len(documents)
138
- )
139
-
140
- with ThreadPoolExecutor(
141
- max_workers=self.args.index_filter_workers or 5
142
- ) as executor:
143
- future_to_doc = {}
144
- for doc in documents:
145
- submit_time = time.time()
146
-
147
- def _run(conversations, docs):
148
- submit_time_1 = time.time()
149
- try:
150
- llm = ByzerLLM()
151
- llm.skip_nontext_check = True
152
- llm.setup_default_model_name(self.recall_llm.default_model_name)
153
-
154
- v = (
155
- _check_relevance_with_conversation.with_llm(
156
- llm)
157
- .options({"llm_config": {"max_length": 10}})
158
- .run(
159
- conversations=conversations,
160
- documents=docs,
161
- filter_config=rag_config.filter_config,
162
- )
163
- )
164
- except Exception as e:
165
- logger.error(
166
- f"Error in _check_relevance_with_conversation: {str(e)}"
167
- )
168
- return (None, submit_time_1, time.time())
169
-
170
- end_time_2 = time.time()
171
- return (v, submit_time_1, end_time_2)
172
-
173
- m = executor.submit(
174
- _run,
175
- conversations,
176
- [f"##File: {doc.module_name}\n{doc.source_code}"],
177
- )
178
- future_to_doc[m] = (doc, submit_time)
179
-
180
- relevant_docs = []
181
- for future in as_completed(list(future_to_doc.keys())):
182
- try:
183
- doc, submit_time = future_to_doc[future]
184
- end_time = time.time()
185
- v, submit_time_1, end_time_2 = future.result()
186
- task_timing = TaskTiming(
187
- submit_time=submit_time,
188
- end_time=end_time,
189
- duration=end_time - submit_time,
190
- real_start_time=submit_time_1,
191
- real_end_time=end_time_2,
192
- real_duration=end_time_2 - submit_time_1,
193
- )
194
- progress.update(task, advance=1)
195
-
196
- relevance = parse_relevance(v)
197
- if (
198
- relevance
199
- and relevance.is_relevant
200
- and relevance.relevant_score >= self.relevant_score
201
- ):
202
- relevant_docs.append(
203
- FilterDoc(
204
- source_code=doc,
205
- relevance=relevance,
206
- task_timing=task_timing,
207
- )
208
- )
209
- except Exception as exc:
210
- logger.error(
211
- f"Document processing generated an exception: {exc}")
212
-
213
- # Sort relevant_docs by relevance score in descending order
214
- relevant_docs.sort(
215
- key=lambda x: x.relevance.relevant_score, reverse=True)
216
- return relevant_docs
217
-
218
- def filter_docs_with_ray(
219
- self, conversations: List[Dict[str, str]], documents: List[SourceCode]
220
- ) -> List[FilterDoc]:
221
- futures = []
222
- count = 0
223
- submit_time = time.time()
224
- for doc in documents:
225
- worker = self.workers[count % len(self.workers)]
226
- count += 1
227
- future = worker.filter_doc.remote(
228
- conversations, [
229
- f"##File: {doc.module_name}\n{doc.source_code}"]
230
- )
231
- futures.append((future, doc))
232
-
233
- relevant_docs = []
234
- for future, doc in futures:
235
- try:
236
- v, submit_time_1, end_time_2 = ray.get(future)
237
- end_time = time.time()
238
-
239
- if v is None:
240
- continue
241
-
242
- task_timing = TaskTiming(
243
- submit_time=submit_time,
244
- end_time=end_time,
245
- duration=end_time - submit_time,
246
- real_start_time=submit_time_1,
247
- real_end_time=end_time_2,
248
- real_duration=end_time_2 - submit_time_1,
249
- )
250
- logger.info(
251
- f"Document: {doc.module_name} Duration: {task_timing.duration:.2f} seconds/{task_timing.real_duration:.2f}/{task_timing.real_duration-task_timing.duration} seconds"
252
- )
253
- relevance = parse_relevance(v)
254
- if (
255
- relevance
256
- and relevance.is_relevant
257
- and relevance.relevant_score >= self.relevant_score
258
- ):
259
- relevant_docs.append(
260
- FilterDoc(
261
- source_code=doc,
262
- relevance=relevance,
263
- task_timing=task_timing,
264
- )
265
- )
266
- except Exception as exc:
267
- logger.error(
268
- f"Document processing generated an exception: {exc}")
269
-
270
- # Sort relevant_docs by relevance score in descending order
271
- relevant_docs.sort(
272
- key=lambda x: x.relevance.relevant_score, reverse=True)
273
- return relevant_docs
@@ -1 +0,0 @@
1
- __version__ = "0.1.219"
File without changes
File without changes
File without changes
File without changes