auto-coder 0.1.219__tar.gz → 0.1.221__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.
- {auto_coder-0.1.219 → auto_coder-0.1.221}/PKG-INFO +1 -1
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/auto_coder.egg-info/PKG-INFO +1 -1
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/auto_coder.py +10 -0
- auto_coder-0.1.221/src/autocoder/rag/doc_filter.py +176 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/long_context_rag.py +6 -4
- auto_coder-0.1.221/src/autocoder/version.py +1 -0
- auto_coder-0.1.219/src/autocoder/rag/doc_filter.py +0 -273
- auto_coder-0.1.219/src/autocoder/version.py +0 -1
- {auto_coder-0.1.219 → auto_coder-0.1.221}/LICENSE +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/README.md +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/setup.cfg +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/setup.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/auto_coder.egg-info/SOURCES.txt +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/auto_coder.egg-info/requires.txt +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/auto_coder_lang.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/chat_auto_coder.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/command_completer.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/llm_rerank.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/mcp_hub.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/mcp_server.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/dispacher/actions/plugins/action_translate.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/cache/simple_cache.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/document_retriever.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/raw_rag.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/simple_directory_reader.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/simple_rag.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/utils/tests.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/tests/test_planner.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.219 → auto_coder-0.1.221}/tests/test_symbols_utils.py +0 -0
|
@@ -955,6 +955,8 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
955
955
|
with Live(
|
|
956
956
|
Panel("", title="Response"),
|
|
957
957
|
refresh_per_second=4,
|
|
958
|
+
auto_refresh=True,
|
|
959
|
+
vertical_overflow="visible"
|
|
958
960
|
) as live:
|
|
959
961
|
for res in v:
|
|
960
962
|
markdown_content += res[0]
|
|
@@ -975,6 +977,14 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
975
977
|
expand=False,
|
|
976
978
|
)
|
|
977
979
|
)
|
|
980
|
+
live.update(
|
|
981
|
+
Panel(
|
|
982
|
+
Markdown(markdown_content),
|
|
983
|
+
title="Response",
|
|
984
|
+
border_style="green",
|
|
985
|
+
expand=False,
|
|
986
|
+
)
|
|
987
|
+
)
|
|
978
988
|
except Exception as e:
|
|
979
989
|
request_queue.add_request(
|
|
980
990
|
args.request_id,
|
|
@@ -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
|
-
|
|
467
|
-
|
|
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.221"
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_generate_editblock.py
RENAMED
|
File without changes
|
{auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_generate_strict_diff.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/code_auto_merge_strict_diff.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{auto_coder-0.1.219 → auto_coder-0.1.221}/src/autocoder/dispacher/actions/plugins/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|