auto-coder 0.1.176__py3-none-any.whl → 0.1.178__py3-none-any.whl
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.176.dist-info → auto_coder-0.1.178.dist-info}/METADATA +1 -1
- {auto_coder-0.1.176.dist-info → auto_coder-0.1.178.dist-info}/RECORD +12 -12
- autocoder/rag/document_retriever.py +3 -1
- autocoder/rag/long_context_rag.py +53 -21
- autocoder/rag/token_counter.py +2 -2
- autocoder/rag/token_limiter.py +29 -19
- autocoder/rag/variable_holder.py +3 -2
- autocoder/version.py +1 -1
- {auto_coder-0.1.176.dist-info → auto_coder-0.1.178.dist-info}/LICENSE +0 -0
- {auto_coder-0.1.176.dist-info → auto_coder-0.1.178.dist-info}/WHEEL +0 -0
- {auto_coder-0.1.176.dist-info → auto_coder-0.1.178.dist-info}/entry_points.txt +0 -0
- {auto_coder-0.1.176.dist-info → auto_coder-0.1.178.dist-info}/top_level.txt +0 -0
|
@@ -7,7 +7,7 @@ autocoder/chat_auto_coder.py,sha256=i5xIuWlTqF0pJz8kXoa-_bW3Ic3SfCFvU2WJIMxrUHU,
|
|
|
7
7
|
autocoder/chat_auto_coder_lang.py,sha256=QYtu5gWEQmWKVovR_qUZ8plySZarNFX_Onk-1vN9IiA,8524
|
|
8
8
|
autocoder/command_args.py,sha256=ftWw6HnFUZPiQPt1oV-SfpHQe69XN3knaFy1lpROBcU,26854
|
|
9
9
|
autocoder/lang.py,sha256=e-07rYTgimpxS8sm-AxKSmH4kKQX4N05YFHJBg9trVs,12598
|
|
10
|
-
autocoder/version.py,sha256=
|
|
10
|
+
autocoder/version.py,sha256=EFm__1MLoFEQx_MuXleZfEID925EbP4uHw_aNT8swgI,23
|
|
11
11
|
autocoder/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
12
|
autocoder/agent/auto_tool.py,sha256=DBzip-P_T6ZtT2eHexPcusmKYD0h7ufzp7TLwXAY10E,11554
|
|
13
13
|
autocoder/agent/coder.py,sha256=dnITYHqkcOip8zV4lywbkYNH9w7Q3qyYaUArJ4WPrTs,866
|
|
@@ -60,9 +60,9 @@ autocoder/pyproject/__init__.py,sha256=-2-ImQVw6e3NQZQOyDlHEP5b4xVs5ur2G5izB-JCa
|
|
|
60
60
|
autocoder/rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
61
61
|
autocoder/rag/api_server.py,sha256=zokIlDJlk7ucRorSLQm80uICO1mecfmn4J2zVqEBskE,6786
|
|
62
62
|
autocoder/rag/doc_filter.py,sha256=LqU8Wi6klwpY9WTHVtkioSHpmo9IWhRz39dzV1gvp6E,9315
|
|
63
|
-
autocoder/rag/document_retriever.py,sha256=
|
|
63
|
+
autocoder/rag/document_retriever.py,sha256=itypkUdY9vUITMAGhxHvWe-IZpxLi5h0A1mJuIVW6QA,23406
|
|
64
64
|
autocoder/rag/llm_wrapper.py,sha256=xRbTBpLUH43Ah5jplL8WWWU-kjKfNgEJoUntLGBq5F4,2484
|
|
65
|
-
autocoder/rag/long_context_rag.py,sha256=
|
|
65
|
+
autocoder/rag/long_context_rag.py,sha256=FW4Qv7YpNXOMrNbe28p3hY-baes6nwyVmZ7Qq73J-uc,20173
|
|
66
66
|
autocoder/rag/rag_config.py,sha256=8LwFcTd8OJWWwi1_WY4IzjqgtT6RyE2j4PjxS5cCTDE,802
|
|
67
67
|
autocoder/rag/rag_entry.py,sha256=V1RJ8RGqM30DNPmzymv64rZjNRGWn6kfc8sRy_LECg0,2451
|
|
68
68
|
autocoder/rag/raw_rag.py,sha256=yS2Ur6kG0IRjhCj2_VonwxjY_xls_E62jO5Gz5j2nqE,2952
|
|
@@ -70,10 +70,10 @@ autocoder/rag/relevant_utils.py,sha256=OGfp98OXG4jr3jNmtHIeXGPF8mOlIbTnolPIVTZzY
|
|
|
70
70
|
autocoder/rag/simple_directory_reader.py,sha256=LkKreCkNdEOoL4fNhc3_hDoyyWTQUte4uqextISRz4U,24485
|
|
71
71
|
autocoder/rag/simple_rag.py,sha256=I902EUqOK1WM0Y2WFd7RzDJYofElvTZNLVCBtX5A9rc,14885
|
|
72
72
|
autocoder/rag/token_checker.py,sha256=jc76x6KWmvVxds6W8juZfQGaoErudc2HenG3sNQfSLs,2819
|
|
73
|
-
autocoder/rag/token_counter.py,sha256=
|
|
74
|
-
autocoder/rag/token_limiter.py,sha256=
|
|
73
|
+
autocoder/rag/token_counter.py,sha256=LReZEYXmWriDI3KYjUvK0E4Gn4MeDJX6RPCfJCmluGY,2110
|
|
74
|
+
autocoder/rag/token_limiter.py,sha256=4cGy2kFCvbsM5CtONfuvLmXgpK_1HZTHehLTob08eks,10959
|
|
75
75
|
autocoder/rag/types.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
-
autocoder/rag/variable_holder.py,sha256=
|
|
76
|
+
autocoder/rag/variable_holder.py,sha256=PFvBjFcR7-fNDD4Vcsc8CpH2Te057vcpwJMxtrfUgKI,75
|
|
77
77
|
autocoder/rag/loaders/__init__.py,sha256=EQHEZ5Cmz-mGP2SllUTvcIbYCnF7W149dNpNItfs0yE,304
|
|
78
78
|
autocoder/rag/loaders/docx_loader.py,sha256=g6Ta8rMUbfgwB8N1qiajhyO6wpaWl7zygAZiKShuioI,174
|
|
79
79
|
autocoder/rag/loaders/excel_loader.py,sha256=Ue8YB1z_kBs8SjIPuBskyM08Q1JiONs_BJZPrzi59oo,896
|
|
@@ -95,9 +95,9 @@ autocoder/utils/request_event_queue.py,sha256=r3lo5qGsB1dIjzVQ05dnr0z_9Z3zOkBdP1
|
|
|
95
95
|
autocoder/utils/request_queue.py,sha256=nwp6PMtgTCiuwJI24p8OLNZjUiprC-TsefQrhMI-yPE,3889
|
|
96
96
|
autocoder/utils/rest.py,sha256=3tXA8KZG6jKz_tddHNLGx77Icee88WcUeesfNsgPno4,8790
|
|
97
97
|
autocoder/utils/tests.py,sha256=BqphrwyycGAvs-5mhH8pKtMZdObwhFtJ5MC_ZAOiLq8,1340
|
|
98
|
-
auto_coder-0.1.
|
|
99
|
-
auto_coder-0.1.
|
|
100
|
-
auto_coder-0.1.
|
|
101
|
-
auto_coder-0.1.
|
|
102
|
-
auto_coder-0.1.
|
|
103
|
-
auto_coder-0.1.
|
|
98
|
+
auto_coder-0.1.178.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
|
|
99
|
+
auto_coder-0.1.178.dist-info/METADATA,sha256=X77KLl-OBGY5OArDncTSTJIpfln9pBwS_VOHExh6DqI,2352
|
|
100
|
+
auto_coder-0.1.178.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
101
|
+
auto_coder-0.1.178.dist-info/entry_points.txt,sha256=0nzHtHH4pNcM7xq4EBA2toS28Qelrvcbrr59GqD_0Ak,350
|
|
102
|
+
auto_coder-0.1.178.dist-info/top_level.txt,sha256=Jqc0_uJSw2GwoFQAa9iJxYns-2mWla-9ok_Y3Gcznjk,10
|
|
103
|
+
auto_coder-0.1.178.dist-info/RECORD,,
|
|
@@ -159,6 +159,8 @@ def process_file_local(file_path: str) -> List[SourceCode]:
|
|
|
159
159
|
return v
|
|
160
160
|
except Exception as e:
|
|
161
161
|
logger.error(f"Error processing file {file_path}: {str(e)}")
|
|
162
|
+
import traceback
|
|
163
|
+
traceback.print_exc()
|
|
162
164
|
return []
|
|
163
165
|
|
|
164
166
|
|
|
@@ -392,7 +394,7 @@ class AutoCoderRAGAsyncUpdateQueue:
|
|
|
392
394
|
elif isinstance(file_list, AddOrUpdateEvent):
|
|
393
395
|
for file_info in file_list.file_infos:
|
|
394
396
|
logger.info(f"{file_info[0]} is detected to be updated")
|
|
395
|
-
result = process_file_local(file_info)
|
|
397
|
+
result = process_file_local(file_info[0])
|
|
396
398
|
self.update_cache(file_info, result)
|
|
397
399
|
|
|
398
400
|
self.write_cache()
|
|
@@ -7,7 +7,6 @@ import byzerllm
|
|
|
7
7
|
import pandas as pd
|
|
8
8
|
import pathspec
|
|
9
9
|
from byzerllm import ByzerLLM
|
|
10
|
-
from jinja2 import Template
|
|
11
10
|
from loguru import logger
|
|
12
11
|
from openai import OpenAI
|
|
13
12
|
from rich.console import Console
|
|
@@ -28,7 +27,12 @@ from autocoder.rag.token_checker import check_token_limit
|
|
|
28
27
|
from autocoder.rag.token_counter import RemoteTokenCounter, TokenCounter
|
|
29
28
|
from autocoder.rag.token_limiter import TokenLimiter
|
|
30
29
|
from tokenizers import Tokenizer
|
|
31
|
-
from autocoder.rag import
|
|
30
|
+
from autocoder.rag.variable_holder import VariableHolder
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
from autocoder_pro.rag.llm_compute import LLMComputeEngine
|
|
34
|
+
except ImportError:
|
|
35
|
+
LLMComputeEngine = None
|
|
32
36
|
|
|
33
37
|
|
|
34
38
|
class LongContextRAG:
|
|
@@ -68,8 +72,8 @@ class LongContextRAG:
|
|
|
68
72
|
self.on_ray = False
|
|
69
73
|
|
|
70
74
|
if self.tokenizer_path:
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
VariableHolder.TOKENIZER_PATH = self.tokenizer_path
|
|
76
|
+
VariableHolder.TOKENIZER_MODEL = Tokenizer.from_file(self.tokenizer_path)
|
|
73
77
|
self.tokenizer = TokenCounter(self.tokenizer_path)
|
|
74
78
|
else:
|
|
75
79
|
if llm.is_model_exist("deepseek_tokenizer"):
|
|
@@ -119,13 +123,13 @@ class LongContextRAG:
|
|
|
119
123
|
self.monitor_mode,
|
|
120
124
|
## 确保全文区至少能放下一个文件
|
|
121
125
|
single_file_token_limit=self.full_text_limit - 100,
|
|
122
|
-
disable_auto_window=self.args.disable_auto_window
|
|
126
|
+
disable_auto_window=self.args.disable_auto_window,
|
|
123
127
|
)
|
|
124
128
|
|
|
125
129
|
self.doc_filter = DocFilter(
|
|
126
130
|
self.index_model, self.args, on_ray=self.on_ray, path=self.path
|
|
127
131
|
)
|
|
128
|
-
|
|
132
|
+
|
|
129
133
|
doc_num = 0
|
|
130
134
|
token_num = 0
|
|
131
135
|
token_counts = []
|
|
@@ -151,7 +155,7 @@ class LongContextRAG:
|
|
|
151
155
|
f" Max doc tokens: {max(token_counts) if token_counts else 0}\n"
|
|
152
156
|
f" Min doc tokens: {min(token_counts) if token_counts else 0}\n"
|
|
153
157
|
f" Avg doc tokens: {avg_tokens:.2f}\n"
|
|
154
|
-
f" Median doc tokens: {median_tokens:.2f}\n"
|
|
158
|
+
f" Median doc tokens: {median_tokens:.2f}\n"
|
|
155
159
|
)
|
|
156
160
|
|
|
157
161
|
def count_tokens(self, text: str) -> int:
|
|
@@ -391,8 +395,13 @@ class LongContextRAG:
|
|
|
391
395
|
relevant_docs_info = []
|
|
392
396
|
for doc in relevant_docs:
|
|
393
397
|
info = f"- {doc.module_name.replace(self.path,'',1)}"
|
|
394
|
-
if
|
|
395
|
-
original_docs = ", ".join(
|
|
398
|
+
if "original_docs" in doc.metadata:
|
|
399
|
+
original_docs = ", ".join(
|
|
400
|
+
[
|
|
401
|
+
doc.replace(self.path, "", 1)
|
|
402
|
+
for doc in doc.metadata["original_docs"]
|
|
403
|
+
]
|
|
404
|
+
)
|
|
396
405
|
info += f" (Original docs: {original_docs})"
|
|
397
406
|
relevant_docs_info.append(info)
|
|
398
407
|
|
|
@@ -411,7 +420,7 @@ class LongContextRAG:
|
|
|
411
420
|
segment_limit=self.segment_limit,
|
|
412
421
|
buff_limit=self.buff_limit,
|
|
413
422
|
llm=self.llm,
|
|
414
|
-
disable_segment_reorder
|
|
423
|
+
disable_segment_reorder=self.args.disable_segment_reorder,
|
|
415
424
|
)
|
|
416
425
|
final_relevant_docs = token_limiter.limit_tokens(
|
|
417
426
|
relevant_docs=relevant_docs,
|
|
@@ -443,13 +452,20 @@ class LongContextRAG:
|
|
|
443
452
|
|
|
444
453
|
# Add relevant docs information
|
|
445
454
|
final_relevant_docs_info = []
|
|
446
|
-
for doc in relevant_docs:
|
|
455
|
+
for doc in relevant_docs:
|
|
447
456
|
info = f"- {doc.module_name.replace(self.path,'',1)}"
|
|
448
|
-
if
|
|
449
|
-
original_docs = ", ".join(
|
|
457
|
+
if "original_docs" in doc.metadata:
|
|
458
|
+
original_docs = ", ".join(
|
|
459
|
+
[
|
|
460
|
+
doc.replace(self.path, "", 1)
|
|
461
|
+
for doc in doc.metadata["original_docs"]
|
|
462
|
+
]
|
|
463
|
+
)
|
|
450
464
|
info += f" (Original docs: {original_docs})"
|
|
451
465
|
if "chunk_ranges" in doc.metadata:
|
|
452
|
-
chunk_ranges = json.dumps(
|
|
466
|
+
chunk_ranges = json.dumps(
|
|
467
|
+
doc.metadata["chunk_ranges"], ensure_ascii=False
|
|
468
|
+
)
|
|
453
469
|
info += f" (Chunk ranges: {chunk_ranges})"
|
|
454
470
|
final_relevant_docs_info.append(info)
|
|
455
471
|
|
|
@@ -465,10 +481,29 @@ class LongContextRAG:
|
|
|
465
481
|
|
|
466
482
|
# Log the panel using rich
|
|
467
483
|
console.print(panel)
|
|
468
|
-
|
|
484
|
+
|
|
469
485
|
request_tokens = sum([doc.tokens for doc in relevant_docs])
|
|
470
|
-
target_model = model or self.llm.default_model_name
|
|
471
|
-
logger.info(
|
|
486
|
+
target_model = model or self.llm.default_model_name
|
|
487
|
+
logger.info(
|
|
488
|
+
f"Start to send to model {target_model} with {request_tokens} tokens"
|
|
489
|
+
)
|
|
490
|
+
|
|
491
|
+
if LLMComputeEngine is not None:
|
|
492
|
+
llm_compute_engine = LLMComputeEngine(llm=self.llm)
|
|
493
|
+
new_conversations = llm_compute_engine.process_conversation(
|
|
494
|
+
conversations, query, [doc.source_code for doc in relevant_docs]
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
return (
|
|
498
|
+
llm_compute_engine.stream_chat_oai(
|
|
499
|
+
conversations=new_conversations,
|
|
500
|
+
model=model,
|
|
501
|
+
role_mapping=role_mapping,
|
|
502
|
+
llm_config=llm_config,
|
|
503
|
+
delta_mode=True,
|
|
504
|
+
),
|
|
505
|
+
context,
|
|
506
|
+
)
|
|
472
507
|
|
|
473
508
|
new_conversations = conversations[:-1] + [
|
|
474
509
|
{
|
|
@@ -480,10 +515,6 @@ class LongContextRAG:
|
|
|
480
515
|
}
|
|
481
516
|
]
|
|
482
517
|
|
|
483
|
-
# # 将 new_conversations 转化为 JSON 并写入文件
|
|
484
|
-
# with open('/tmp/rag.json', 'w', encoding='utf-8') as f:
|
|
485
|
-
# json.dump(new_conversations, f, ensure_ascii=False, indent=2)
|
|
486
|
-
|
|
487
518
|
chunks = self.llm.stream_chat_oai(
|
|
488
519
|
conversations=new_conversations,
|
|
489
520
|
model=model,
|
|
@@ -491,4 +522,5 @@ class LongContextRAG:
|
|
|
491
522
|
llm_config=llm_config,
|
|
492
523
|
delta_mode=True,
|
|
493
524
|
)
|
|
525
|
+
|
|
494
526
|
return (chunk[0] for chunk in chunks), context
|
autocoder/rag/token_counter.py
CHANGED
|
@@ -2,7 +2,7 @@ import time
|
|
|
2
2
|
from loguru import logger
|
|
3
3
|
from tokenizers import Tokenizer
|
|
4
4
|
from multiprocessing import Pool, cpu_count
|
|
5
|
-
from autocoder.rag.variable_holder import
|
|
5
|
+
from autocoder.rag.variable_holder import VariableHolder
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class RemoteTokenCounter:
|
|
@@ -28,7 +28,7 @@ def initialize_tokenizer(tokenizer_path):
|
|
|
28
28
|
def count_tokens(text: str) -> int:
|
|
29
29
|
try:
|
|
30
30
|
# start_time = time.time_ns()
|
|
31
|
-
encoded = TOKENIZER_MODEL.encode('{"role":"user","content":"' + text + '"}')
|
|
31
|
+
encoded = VariableHolder.TOKENIZER_MODEL.encode('{"role":"user","content":"' + text + '"}')
|
|
32
32
|
v = len(encoded.ids)
|
|
33
33
|
# elapsed_time = time.time_ns() - start_time
|
|
34
34
|
# logger.info(f"Token counting took {elapsed_time/1000000} ms")
|
autocoder/rag/token_limiter.py
CHANGED
|
@@ -17,7 +17,7 @@ class TokenLimiter:
|
|
|
17
17
|
segment_limit: int,
|
|
18
18
|
buff_limit: int,
|
|
19
19
|
llm,
|
|
20
|
-
disable_segment_reorder:bool
|
|
20
|
+
disable_segment_reorder: bool,
|
|
21
21
|
):
|
|
22
22
|
self.count_tokens = count_tokens
|
|
23
23
|
self.full_text_limit = full_text_limit
|
|
@@ -96,8 +96,7 @@ class TokenLimiter:
|
|
|
96
96
|
doc_num_count = 0
|
|
97
97
|
|
|
98
98
|
reorder_relevant_docs = []
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
|
|
101
100
|
## 文档分段(单个文档过大)和重排序逻辑
|
|
102
101
|
## 1. 背景:在检索过程中,许多文档被切割成多个段落(segments)
|
|
103
102
|
## 2. 问题:这些segments在召回时因为是按相关分做了排序可能是乱序的,不符合原文顺序,会强化大模型的幻觉。
|
|
@@ -106,20 +105,33 @@ class TokenLimiter:
|
|
|
106
105
|
## a) 方案一(保留位置):统一文档的不同segments 根据chunk_index 来置换位置
|
|
107
106
|
## b) 方案二(当前实现):遍历文档,发现某文档的segment A,立即查找该文档的所有其他segments,
|
|
108
107
|
## 对它们进行排序,并将排序后多个segments插入到当前的segment A 位置中。
|
|
109
|
-
## TODO:
|
|
110
|
-
## 1. 未来根据参数决定是否开启重排以及重排的策略
|
|
111
|
-
if not self.disable_segment_reorder:
|
|
108
|
+
## TODO:
|
|
109
|
+
## 1. 未来根据参数决定是否开启重排以及重排的策略
|
|
110
|
+
if not self.disable_segment_reorder:
|
|
111
|
+
num_count = 0
|
|
112
112
|
for doc in relevant_docs:
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
113
|
+
num_count += 1
|
|
114
|
+
reorder_relevant_docs.append(doc)
|
|
115
|
+
if "original_doc" in doc.metadata and "chunk_index" in doc.metadata:
|
|
116
|
+
original_doc_name = doc.metadata["original_doc"].module_name
|
|
117
|
+
|
|
118
|
+
temp_docs = []
|
|
119
|
+
for temp_doc in relevant_docs[num_count:]:
|
|
120
|
+
if (
|
|
121
|
+
"original_doc" in temp_doc.metadata
|
|
122
|
+
and "chunk_index" in temp_doc.metadata
|
|
123
|
+
):
|
|
124
|
+
if (
|
|
125
|
+
temp_doc.metadata["original_doc"].module_name
|
|
126
|
+
== original_doc_name
|
|
127
|
+
):
|
|
128
|
+
if temp_doc not in reorder_relevant_docs:
|
|
129
|
+
temp_docs.append(temp_doc)
|
|
130
|
+
|
|
131
|
+
temp_docs.sort(key=lambda x: x.metadata["chunk_index"])
|
|
132
|
+
reorder_relevant_docs.extend(temp_docs)
|
|
133
|
+
else:
|
|
134
|
+
reorder_relevant_docs = relevant_docs
|
|
123
135
|
|
|
124
136
|
## 非窗口分区实现
|
|
125
137
|
for doc in reorder_relevant_docs:
|
|
@@ -247,7 +259,5 @@ class TokenLimiter:
|
|
|
247
259
|
f"Failed to process doc {doc.module_name} after {max_retries} attempts: {str(e)}"
|
|
248
260
|
)
|
|
249
261
|
return SourceCode(
|
|
250
|
-
module_name=doc.module_name,
|
|
251
|
-
source_code="",
|
|
252
|
-
tokens= 0
|
|
262
|
+
module_name=doc.module_name, source_code="", tokens=0
|
|
253
263
|
)
|
autocoder/rag/variable_holder.py
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
class VariableHolder:
|
|
2
|
+
TOKENIZER_PATH = None
|
|
3
|
+
TOKENIZER_MODEL = None
|
autocoder/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.1.
|
|
1
|
+
__version__ = "0.1.178"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|