auto-coder 0.1.221__tar.gz → 0.1.224__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.221 → auto_coder-0.1.224}/PKG-INFO +1 -1
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/auto_coder.egg-info/PKG-INFO +1 -1
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/auto_coder.egg-info/SOURCES.txt +3 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/auto_coder.py +53 -16
- auto_coder-0.1.224/src/autocoder/auto_coder_rag_client_mcp.py +170 -0
- auto_coder-0.1.224/src/autocoder/auto_coder_rag_mcp.py +193 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/chat_auto_coder.py +57 -6
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/__init__.py +3 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/command_completer.py +1 -1
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/mcp_hub.py +4 -4
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/mcp_server.py +38 -38
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +2 -2
- auto_coder-0.1.224/src/autocoder/common/memory_manager.py +112 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/long_context_rag.py +3 -0
- auto_coder-0.1.224/src/autocoder/version.py +1 -0
- auto_coder-0.1.221/src/autocoder/version.py +0 -1
- {auto_coder-0.1.221 → auto_coder-0.1.224}/LICENSE +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/README.md +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/setup.cfg +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/setup.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/auto_coder.egg-info/requires.txt +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/auto_coder_lang.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/llm_rerank.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/dispacher/actions/plugins/action_translate.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/cache/simple_cache.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/doc_filter.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/document_retriever.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/raw_rag.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/simple_directory_reader.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/simple_rag.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/src/autocoder/utils/tests.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/tests/test_planner.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.221 → auto_coder-0.1.224}/tests/test_symbols_utils.py +0 -0
|
@@ -11,6 +11,8 @@ src/autocoder/__init__.py
|
|
|
11
11
|
src/autocoder/auto_coder.py
|
|
12
12
|
src/autocoder/auto_coder_lang.py
|
|
13
13
|
src/autocoder/auto_coder_rag.py
|
|
14
|
+
src/autocoder/auto_coder_rag_client_mcp.py
|
|
15
|
+
src/autocoder/auto_coder_rag_mcp.py
|
|
14
16
|
src/autocoder/auto_coder_server.py
|
|
15
17
|
src/autocoder/benchmark.py
|
|
16
18
|
src/autocoder/chat_auto_coder.py
|
|
@@ -58,6 +60,7 @@ src/autocoder/common/llm_rerank.py
|
|
|
58
60
|
src/autocoder/common/mcp_hub.py
|
|
59
61
|
src/autocoder/common/mcp_server.py
|
|
60
62
|
src/autocoder/common/mcp_tools.py
|
|
63
|
+
src/autocoder/common/memory_manager.py
|
|
61
64
|
src/autocoder/common/recall_validation.py
|
|
62
65
|
src/autocoder/common/screenshots.py
|
|
63
66
|
src/autocoder/common/search.py
|
|
@@ -40,6 +40,7 @@ from rich.panel import Panel
|
|
|
40
40
|
from rich.markdown import Markdown
|
|
41
41
|
from rich.live import Live
|
|
42
42
|
from autocoder.auto_coder_lang import get_message
|
|
43
|
+
from autocoder.common.memory_manager import save_to_memory_file
|
|
43
44
|
|
|
44
45
|
console = Console()
|
|
45
46
|
|
|
@@ -577,6 +578,9 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
577
578
|
with Live(
|
|
578
579
|
Panel("", title="Response", border_style="green", expand=False),
|
|
579
580
|
refresh_per_second=4,
|
|
581
|
+
auto_refresh=True,
|
|
582
|
+
vertical_overflow="visible",
|
|
583
|
+
console=Console(force_terminal=True, color_system="auto", height=None)
|
|
580
584
|
) as live:
|
|
581
585
|
live.update(
|
|
582
586
|
Panel(
|
|
@@ -689,6 +693,9 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
689
693
|
with Live(
|
|
690
694
|
Panel("", title="Response", border_style="green", expand=False),
|
|
691
695
|
refresh_per_second=4,
|
|
696
|
+
auto_refresh=True,
|
|
697
|
+
vertical_overflow="visible",
|
|
698
|
+
console=Console(force_terminal=True, color_system="auto", height=None)
|
|
692
699
|
) as live:
|
|
693
700
|
live.update(
|
|
694
701
|
Panel(
|
|
@@ -698,8 +705,8 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
698
705
|
expand=False,
|
|
699
706
|
)
|
|
700
707
|
)
|
|
701
|
-
return
|
|
702
708
|
|
|
709
|
+
return
|
|
703
710
|
elif raw_args.agent_command == "designer":
|
|
704
711
|
from autocoder.agent.designer import SVGDesigner, SDDesigner, LogoDesigner
|
|
705
712
|
|
|
@@ -786,7 +793,7 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
786
793
|
pre_conversations.append(
|
|
787
794
|
{
|
|
788
795
|
"role": "user",
|
|
789
|
-
"content": f"
|
|
796
|
+
"content": f"请阅读下面的代码和文档:\n\n <files>\n{file_content}\n</files>",
|
|
790
797
|
},
|
|
791
798
|
)
|
|
792
799
|
pre_conversations.append(
|
|
@@ -813,7 +820,7 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
813
820
|
pre_conversations.append(
|
|
814
821
|
{
|
|
815
822
|
"role": "user",
|
|
816
|
-
"content": f"
|
|
823
|
+
"content": f"请阅读下面的代码和文档:\n\n <files>\n{s}\n</files>",
|
|
817
824
|
}
|
|
818
825
|
)
|
|
819
826
|
pre_conversations.append(
|
|
@@ -821,7 +828,7 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
821
828
|
source_count += 1
|
|
822
829
|
|
|
823
830
|
loaded_conversations = pre_conversations + \
|
|
824
|
-
chat_history["ask_conversation"]
|
|
831
|
+
chat_history["ask_conversation"]
|
|
825
832
|
|
|
826
833
|
if args.human_as_model:
|
|
827
834
|
console = Console()
|
|
@@ -830,12 +837,10 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
830
837
|
def chat_with_human_as_model(
|
|
831
838
|
source_codes, pre_conversations, last_conversation
|
|
832
839
|
):
|
|
833
|
-
"""
|
|
834
|
-
|
|
835
|
-
{% if source_codes %}
|
|
840
|
+
"""
|
|
841
|
+
{% if source_codes %}
|
|
836
842
|
{{ source_codes }}
|
|
837
|
-
{% endif %}
|
|
838
|
-
</files>
|
|
843
|
+
{% endif %}
|
|
839
844
|
|
|
840
845
|
{% if pre_conversations %}
|
|
841
846
|
下面是我们之间的历史对话,假设我是A,你是B。
|
|
@@ -847,7 +852,7 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
847
852
|
{% endif %}
|
|
848
853
|
|
|
849
854
|
|
|
850
|
-
|
|
855
|
+
参考上面的文件以及历史对话,回答用户的问题。
|
|
851
856
|
用户的问题: {{ last_conversation.content }}
|
|
852
857
|
"""
|
|
853
858
|
|
|
@@ -936,13 +941,31 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
936
941
|
),
|
|
937
942
|
)
|
|
938
943
|
|
|
944
|
+
if "save" in args.action:
|
|
945
|
+
save_to_memory_file(ask_conversation=chat_history["ask_conversation"],
|
|
946
|
+
query=args.query,
|
|
947
|
+
response=result)
|
|
948
|
+
print("Saved to your memory")
|
|
939
949
|
return {}
|
|
940
950
|
|
|
941
|
-
if
|
|
951
|
+
if "rag" in args.action:
|
|
952
|
+
args.enable_rag_search = True
|
|
953
|
+
args.enable_rag_context = False
|
|
942
954
|
rag = RAGFactory.get_rag(llm=chat_llm, args=args, path="")
|
|
943
955
|
response = rag.stream_chat_oai(
|
|
944
|
-
conversations=
|
|
956
|
+
conversations=[{"role": "user", "content": args.query}])[0]
|
|
945
957
|
v = ([item, None] for item in response)
|
|
958
|
+
|
|
959
|
+
elif "mcp" in args.action:
|
|
960
|
+
from autocoder.common.mcp_server import get_mcp_server, McpRequest, McpInstallRequest, McpRemoveRequest, McpListRequest, McpListRunningRequest, McpRefreshRequest
|
|
961
|
+
mcp_server = get_mcp_server()
|
|
962
|
+
response = mcp_server.send_request(
|
|
963
|
+
McpRequest(
|
|
964
|
+
query=args.query,
|
|
965
|
+
model=args.inference_model or args.model
|
|
966
|
+
)
|
|
967
|
+
)
|
|
968
|
+
v = [[response.result,None]]
|
|
946
969
|
else:
|
|
947
970
|
v = chat_llm.stream_chat_oai(
|
|
948
971
|
conversations=loaded_conversations, delta_mode=True
|
|
@@ -953,10 +976,11 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
953
976
|
|
|
954
977
|
try:
|
|
955
978
|
with Live(
|
|
956
|
-
Panel("", title="Response"),
|
|
979
|
+
Panel("", title="Response", border_style="green", expand=False),
|
|
957
980
|
refresh_per_second=4,
|
|
958
981
|
auto_refresh=True,
|
|
959
|
-
vertical_overflow="visible"
|
|
982
|
+
vertical_overflow="visible",
|
|
983
|
+
console=Console(force_terminal=True, color_system="auto", height=None)
|
|
960
984
|
) as live:
|
|
961
985
|
for res in v:
|
|
962
986
|
markdown_content += res[0]
|
|
@@ -977,7 +1001,7 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
977
1001
|
expand=False,
|
|
978
1002
|
)
|
|
979
1003
|
)
|
|
980
|
-
|
|
1004
|
+
live.update(
|
|
981
1005
|
Panel(
|
|
982
1006
|
Markdown(markdown_content),
|
|
983
1007
|
title="Response",
|
|
@@ -999,7 +1023,7 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
999
1023
|
value=StreamValue(value=[""]), status=RequestOption.COMPLETED
|
|
1000
1024
|
),
|
|
1001
1025
|
)
|
|
1002
|
-
|
|
1026
|
+
|
|
1003
1027
|
chat_history["ask_conversation"].append(
|
|
1004
1028
|
{"role": "assistant", "content": assistant_response}
|
|
1005
1029
|
)
|
|
@@ -1007,6 +1031,19 @@ def main(input_args: Optional[List[str]] = None):
|
|
|
1007
1031
|
with open(memory_file, "w") as f:
|
|
1008
1032
|
json.dump(chat_history, f, ensure_ascii=False)
|
|
1009
1033
|
|
|
1034
|
+
if "copy" in args.action:
|
|
1035
|
+
#copy assistant_response to clipboard
|
|
1036
|
+
import pyperclip
|
|
1037
|
+
try:
|
|
1038
|
+
pyperclip.copy(assistant_response)
|
|
1039
|
+
except:
|
|
1040
|
+
print("pyperclip not installed or clipboard is not supported, instruction will not be copied to clipboard.")
|
|
1041
|
+
|
|
1042
|
+
if "save" in args.action:
|
|
1043
|
+
save_to_memory_file(ask_conversation=chat_history["ask_conversation"],
|
|
1044
|
+
query=args.query,
|
|
1045
|
+
response=assistant_response)
|
|
1046
|
+
print("Saved to your memory")
|
|
1010
1047
|
return
|
|
1011
1048
|
|
|
1012
1049
|
else:
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
from typing import Any, List, Dict, Generator, Optional
|
|
2
|
+
import asyncio
|
|
3
|
+
import httpx
|
|
4
|
+
import argparse
|
|
5
|
+
from mcp.server.models import InitializationOptions
|
|
6
|
+
import mcp.types as types
|
|
7
|
+
from mcp.server import NotificationOptions, Server
|
|
8
|
+
import mcp.server.stdio
|
|
9
|
+
from autocoder.common import AutoCoderArgs
|
|
10
|
+
from byzerllm import ByzerLLM
|
|
11
|
+
from autocoder.lang import lang_desc
|
|
12
|
+
import locale
|
|
13
|
+
import pkg_resources
|
|
14
|
+
from openai import OpenAI
|
|
15
|
+
|
|
16
|
+
class AutoCoderRAGClientMCP:
|
|
17
|
+
def __init__(self, llm: ByzerLLM, args: AutoCoderArgs):
|
|
18
|
+
self.llm = llm
|
|
19
|
+
self.args = args
|
|
20
|
+
|
|
21
|
+
if not args.rag_url:
|
|
22
|
+
raise ValueError("rag_url is required for RAG client mode")
|
|
23
|
+
|
|
24
|
+
if not args.rag_url.startswith("http://"):
|
|
25
|
+
args.rag_url = f"http://{args.rag_url}"
|
|
26
|
+
|
|
27
|
+
if not args.rag_url.endswith("/v1"):
|
|
28
|
+
args.rag_url = args.rag_url.rstrip("/") + "/v1"
|
|
29
|
+
|
|
30
|
+
if not args.rag_token:
|
|
31
|
+
raise ValueError("rag_token is required for RAG client mode")
|
|
32
|
+
|
|
33
|
+
self.client = OpenAI(api_key=args.rag_token, base_url=args.rag_url)
|
|
34
|
+
|
|
35
|
+
self.server = Server("auto_coder_rag_client")
|
|
36
|
+
|
|
37
|
+
async def setup_server(self):
|
|
38
|
+
@self.server.list_tools()
|
|
39
|
+
async def handle_list_tools() -> List[types.Tool]:
|
|
40
|
+
return [
|
|
41
|
+
types.Tool(
|
|
42
|
+
name="rag-search",
|
|
43
|
+
description="Search documents using RAG",
|
|
44
|
+
inputSchema={
|
|
45
|
+
"type": "object",
|
|
46
|
+
"properties": {
|
|
47
|
+
"query": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"description": "Search query",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
"required": ["query"],
|
|
53
|
+
},
|
|
54
|
+
),
|
|
55
|
+
types.Tool(
|
|
56
|
+
name="rag-chat",
|
|
57
|
+
description="Chat with documents using RAG",
|
|
58
|
+
inputSchema={
|
|
59
|
+
"type": "object",
|
|
60
|
+
"properties": {
|
|
61
|
+
"query": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"description": "Chat query",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
"required": ["query"],
|
|
67
|
+
},
|
|
68
|
+
),
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
@self.server.call_tool()
|
|
72
|
+
async def handle_call_tool(
|
|
73
|
+
name: str, arguments: Dict[str, Any] | None
|
|
74
|
+
) -> List[types.TextContent | types.ImageContent | types.EmbeddedResource]:
|
|
75
|
+
if not arguments:
|
|
76
|
+
raise ValueError("Missing arguments")
|
|
77
|
+
|
|
78
|
+
if name == "rag-search":
|
|
79
|
+
query = arguments.get("query")
|
|
80
|
+
if not query:
|
|
81
|
+
raise ValueError("Missing query parameter")
|
|
82
|
+
|
|
83
|
+
response = self.client.chat.completions.create(
|
|
84
|
+
messages=[{"role": "user", "content": json.dumps({
|
|
85
|
+
"query": query,
|
|
86
|
+
"only_contexts": True
|
|
87
|
+
})}],
|
|
88
|
+
model=self.args.model,
|
|
89
|
+
max_tokens=self.args.rag_params_max_tokens,
|
|
90
|
+
)
|
|
91
|
+
result = response.choices[0].message.content
|
|
92
|
+
|
|
93
|
+
return [
|
|
94
|
+
types.TextContent(
|
|
95
|
+
type="text",
|
|
96
|
+
text=f"Search results for '{query}':\n\n{result}"
|
|
97
|
+
)
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
elif name == "rag-chat":
|
|
101
|
+
query = arguments.get("query")
|
|
102
|
+
if not query:
|
|
103
|
+
raise ValueError("Missing query parameter")
|
|
104
|
+
|
|
105
|
+
response = self.client.chat.completions.create(
|
|
106
|
+
messages=[{"role": "user", "content": query}],
|
|
107
|
+
model=self.args.model,
|
|
108
|
+
stream=True,
|
|
109
|
+
max_tokens=self.args.rag_params_max_tokens
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
full_response = ""
|
|
113
|
+
for chunk in response:
|
|
114
|
+
if chunk.choices[0].delta.content is not None:
|
|
115
|
+
full_response += chunk.choices[0].delta.content
|
|
116
|
+
|
|
117
|
+
return [
|
|
118
|
+
types.TextContent(
|
|
119
|
+
type="text",
|
|
120
|
+
text=f"Chat response for '{query}':\n\n{full_response}"
|
|
121
|
+
)
|
|
122
|
+
]
|
|
123
|
+
|
|
124
|
+
else:
|
|
125
|
+
raise ValueError(f"Unknown tool: {name}")
|
|
126
|
+
|
|
127
|
+
async def run(self):
|
|
128
|
+
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
|
|
129
|
+
await self.server.run(
|
|
130
|
+
read_stream,
|
|
131
|
+
write_stream,
|
|
132
|
+
InitializationOptions(
|
|
133
|
+
server_name="auto_coder_rag_client",
|
|
134
|
+
server_version="0.1.0",
|
|
135
|
+
capabilities=self.server.get_capabilities(
|
|
136
|
+
notification_options=NotificationOptions(),
|
|
137
|
+
experimental_capabilities={},
|
|
138
|
+
),
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
def parse_args(input_args: Optional[List[str]] = None) -> AutoCoderArgs:
|
|
143
|
+
system_lang, _ = locale.getdefaultlocale()
|
|
144
|
+
lang = "zh" if system_lang and system_lang.startswith("zh") else "en"
|
|
145
|
+
desc = lang_desc[lang]
|
|
146
|
+
|
|
147
|
+
parser = argparse.ArgumentParser(description="Auto Coder RAG Client MCP Server")
|
|
148
|
+
parser.add_argument("--rag_url", required=True, help="RAG server URL")
|
|
149
|
+
parser.add_argument("--rag_token", required=True, help="RAG server token")
|
|
150
|
+
parser.add_argument("--model", default="deepseek_chat", help=desc["model"])
|
|
151
|
+
parser.add_argument("--rag_params_max_tokens", type=int, default=4096, help="Max tokens for RAG response")
|
|
152
|
+
|
|
153
|
+
args = parser.parse_args(input_args)
|
|
154
|
+
return AutoCoderArgs(**vars(args))
|
|
155
|
+
|
|
156
|
+
async def main():
|
|
157
|
+
# Parse command line arguments
|
|
158
|
+
args = parse_args()
|
|
159
|
+
|
|
160
|
+
# Initialize LLM
|
|
161
|
+
llm = ByzerLLM()
|
|
162
|
+
llm.setup_default_model_name(args.model)
|
|
163
|
+
|
|
164
|
+
# Initialize and run server
|
|
165
|
+
server = AutoCoderRAGClientMCP(llm=llm, args=args)
|
|
166
|
+
await server.setup_server()
|
|
167
|
+
await server.run()
|
|
168
|
+
|
|
169
|
+
if __name__ == "__main__":
|
|
170
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
from typing import Any, List, Dict, Generator, Optional
|
|
2
|
+
import asyncio
|
|
3
|
+
import httpx
|
|
4
|
+
import argparse
|
|
5
|
+
from mcp.server.models import InitializationOptions
|
|
6
|
+
import mcp.types as types
|
|
7
|
+
from mcp.server import NotificationOptions, Server
|
|
8
|
+
import mcp.server.stdio
|
|
9
|
+
from autocoder.rag.long_context_rag import LongContextRAG
|
|
10
|
+
from autocoder.common import AutoCoderArgs
|
|
11
|
+
from byzerllm import ByzerLLM
|
|
12
|
+
from autocoder.lang import lang_desc
|
|
13
|
+
import locale
|
|
14
|
+
import pkg_resources
|
|
15
|
+
|
|
16
|
+
class AutoCoderRAGMCP:
|
|
17
|
+
def __init__(self, llm: ByzerLLM, args: AutoCoderArgs):
|
|
18
|
+
self.llm = llm
|
|
19
|
+
self.args = args
|
|
20
|
+
self.rag = LongContextRAG(
|
|
21
|
+
llm=llm,
|
|
22
|
+
args=args,
|
|
23
|
+
path=args.source_dir,
|
|
24
|
+
tokenizer_path=args.tokenizer_path
|
|
25
|
+
)
|
|
26
|
+
self.server = Server("auto_coder_rag")
|
|
27
|
+
|
|
28
|
+
async def setup_server(self):
|
|
29
|
+
@self.server.list_tools()
|
|
30
|
+
async def handle_list_tools() -> List[types.Tool]:
|
|
31
|
+
return [
|
|
32
|
+
types.Tool(
|
|
33
|
+
name="rag-search",
|
|
34
|
+
description="Search documents using RAG",
|
|
35
|
+
inputSchema={
|
|
36
|
+
"type": "object",
|
|
37
|
+
"properties": {
|
|
38
|
+
"query": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"description": "Search query",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
"required": ["query"],
|
|
44
|
+
},
|
|
45
|
+
),
|
|
46
|
+
types.Tool(
|
|
47
|
+
name="rag-chat",
|
|
48
|
+
description="Chat with documents using RAG",
|
|
49
|
+
inputSchema={
|
|
50
|
+
"type": "object",
|
|
51
|
+
"properties": {
|
|
52
|
+
"query": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"description": "Chat query",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
"required": ["query"],
|
|
58
|
+
},
|
|
59
|
+
),
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
@self.server.call_tool()
|
|
63
|
+
async def handle_call_tool(
|
|
64
|
+
name: str, arguments: Dict[str, Any] | None
|
|
65
|
+
) -> List[types.TextContent | types.ImageContent | types.EmbeddedResource]:
|
|
66
|
+
if not arguments:
|
|
67
|
+
raise ValueError("Missing arguments")
|
|
68
|
+
|
|
69
|
+
if name == "rag-search":
|
|
70
|
+
query = arguments.get("query")
|
|
71
|
+
if not query:
|
|
72
|
+
raise ValueError("Missing query parameter")
|
|
73
|
+
|
|
74
|
+
results = self.rag.search(query)
|
|
75
|
+
return [
|
|
76
|
+
types.TextContent(
|
|
77
|
+
type="text",
|
|
78
|
+
text=f"Search results for '{query}':\n\n" +
|
|
79
|
+
"\n".join([f"- {result.module_name}: {result.source_code[:200]}..."
|
|
80
|
+
for result in results])
|
|
81
|
+
)
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
elif name == "rag-chat":
|
|
85
|
+
query = arguments.get("query")
|
|
86
|
+
if not query:
|
|
87
|
+
raise ValueError("Missing query parameter")
|
|
88
|
+
|
|
89
|
+
response, _ = self.rag.stream_chat_oai(
|
|
90
|
+
conversations=[{"role": "user", "content": query}]
|
|
91
|
+
)
|
|
92
|
+
full_response = "".join([chunk for chunk in response])
|
|
93
|
+
|
|
94
|
+
return [
|
|
95
|
+
types.TextContent(
|
|
96
|
+
type="text",
|
|
97
|
+
text=f"Chat response for '{query}':\n\n{full_response}"
|
|
98
|
+
)
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
else:
|
|
102
|
+
raise ValueError(f"Unknown tool: {name}")
|
|
103
|
+
|
|
104
|
+
async def run(self):
|
|
105
|
+
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
|
|
106
|
+
await self.server.run(
|
|
107
|
+
read_stream,
|
|
108
|
+
write_stream,
|
|
109
|
+
InitializationOptions(
|
|
110
|
+
server_name="auto_coder_rag",
|
|
111
|
+
server_version="0.1.0",
|
|
112
|
+
capabilities=self.server.get_capabilities(
|
|
113
|
+
notification_options=NotificationOptions(),
|
|
114
|
+
experimental_capabilities={},
|
|
115
|
+
),
|
|
116
|
+
),
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def parse_args(input_args: Optional[List[str]] = None) -> AutoCoderArgs:
|
|
120
|
+
try:
|
|
121
|
+
tokenizer_path = pkg_resources.resource_filename(
|
|
122
|
+
"autocoder", "data/tokenizer.json"
|
|
123
|
+
)
|
|
124
|
+
except FileNotFoundError:
|
|
125
|
+
tokenizer_path = None
|
|
126
|
+
|
|
127
|
+
system_lang, _ = locale.getdefaultlocale()
|
|
128
|
+
lang = "zh" if system_lang and system_lang.startswith("zh") else "en"
|
|
129
|
+
desc = lang_desc[lang]
|
|
130
|
+
|
|
131
|
+
parser = argparse.ArgumentParser(description="Auto Coder RAG MCP Server")
|
|
132
|
+
parser.add_argument("--source_dir", default=".", help="Source directory path")
|
|
133
|
+
parser.add_argument("--tokenizer_path", default=tokenizer_path, help="Path to tokenizer file")
|
|
134
|
+
parser.add_argument("--model", default="deepseek_chat", help=desc["model"])
|
|
135
|
+
parser.add_argument("--index_model", default="", help=desc["index_model"])
|
|
136
|
+
parser.add_argument("--emb_model", default="", help=desc["emb_model"])
|
|
137
|
+
parser.add_argument("--ray_address", default="auto", help=desc["ray_address"])
|
|
138
|
+
parser.add_argument("--required_exts", default="", help=desc["doc_build_parse_required_exts"])
|
|
139
|
+
parser.add_argument("--rag_doc_filter_relevance", type=int, default=5, help="Relevance score threshold for document filtering")
|
|
140
|
+
parser.add_argument("--rag_context_window_limit", type=int, default=56000, help="Context window limit for RAG")
|
|
141
|
+
parser.add_argument("--full_text_ratio", type=float, default=0.7, help="Ratio of full text area in context window")
|
|
142
|
+
parser.add_argument("--segment_ratio", type=float, default=0.2, help="Ratio of segment area in context window")
|
|
143
|
+
parser.add_argument("--index_filter_workers", type=int, default=5, help="Number of workers for document filtering")
|
|
144
|
+
parser.add_argument("--index_filter_file_num", type=int, default=3, help="Maximum number of files to filter")
|
|
145
|
+
parser.add_argument("--host", default="", help="Server host address")
|
|
146
|
+
parser.add_argument("--port", type=int, default=8000, help="Server port")
|
|
147
|
+
parser.add_argument("--monitor_mode", action="store_true", help="Enable document monitoring mode")
|
|
148
|
+
parser.add_argument("--enable_hybrid_index", action="store_true", help="Enable hybrid index")
|
|
149
|
+
parser.add_argument("--disable_auto_window", action="store_true", help="Disable automatic window adaptation")
|
|
150
|
+
parser.add_argument("--disable_segment_reorder", action="store_true", help="Disable segment reordering")
|
|
151
|
+
parser.add_argument("--disable_inference_enhance", action="store_true", help="Disable inference enhancement")
|
|
152
|
+
parser.add_argument("--inference_deep_thought", action="store_true", help="Enable deep thought in inference")
|
|
153
|
+
parser.add_argument("--inference_slow_without_deep_thought", action="store_true", help="Enable slow inference without deep thought")
|
|
154
|
+
parser.add_argument("--inference_compute_precision", type=int, default=64, help="Inference compute precision")
|
|
155
|
+
parser.add_argument("--data_cells_max_num", type=int, default=2000, help="Maximum number of data cells to process")
|
|
156
|
+
parser.add_argument("--recall_model", default="", help="Model used for document recall")
|
|
157
|
+
parser.add_argument("--chunk_model", default="", help="Model used for document chunking")
|
|
158
|
+
parser.add_argument("--qa_model", default="", help="Model used for question answering")
|
|
159
|
+
|
|
160
|
+
args = parser.parse_args(input_args)
|
|
161
|
+
return AutoCoderArgs(**vars(args)),args
|
|
162
|
+
|
|
163
|
+
async def main():
|
|
164
|
+
# Parse command line arguments
|
|
165
|
+
args,raw_rags = parse_args()
|
|
166
|
+
|
|
167
|
+
# Initialize LLM
|
|
168
|
+
llm = ByzerLLM()
|
|
169
|
+
llm.setup_default_model_name(args.model)
|
|
170
|
+
|
|
171
|
+
# Setup sub models if specified
|
|
172
|
+
if raw_rags.recall_model:
|
|
173
|
+
recall_model = ByzerLLM()
|
|
174
|
+
recall_model.setup_default_model_name(args.recall_model)
|
|
175
|
+
llm.setup_sub_client("recall_model", recall_model)
|
|
176
|
+
|
|
177
|
+
if raw_rags.chunk_model:
|
|
178
|
+
chunk_model = ByzerLLM()
|
|
179
|
+
chunk_model.setup_default_model_name(args.chunk_model)
|
|
180
|
+
llm.setup_sub_client("chunk_model", chunk_model)
|
|
181
|
+
|
|
182
|
+
if raw_rags.qa_model:
|
|
183
|
+
qa_model = ByzerLLM()
|
|
184
|
+
qa_model.setup_default_model_name(args.qa_model)
|
|
185
|
+
llm.setup_sub_client("qa_model", qa_model)
|
|
186
|
+
|
|
187
|
+
# Initialize and run server
|
|
188
|
+
server = AutoCoderRAGMCP(llm=llm, args=args)
|
|
189
|
+
await server.setup_server()
|
|
190
|
+
await server.run()
|
|
191
|
+
|
|
192
|
+
if __name__ == "__main__":
|
|
193
|
+
asyncio.run(main())
|