auto-coder 0.1.222__py3-none-any.whl → 0.1.223__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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.222
3
+ Version: 0.1.223
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -2,13 +2,15 @@ autocoder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  autocoder/auto_coder.py,sha256=BQvCwOc-4XgOtpwQWHCTvcx97XEejdwRordyrCYSf0s,43554
3
3
  autocoder/auto_coder_lang.py,sha256=Rtupq6N3_HT7JRhDKdgCBcwRaiAnyCOR_Gsp4jUomrI,3229
4
4
  autocoder/auto_coder_rag.py,sha256=illKgzP2bv-Tq50ujsofJnOHdI4pzr0ALtfR8NHHWdQ,22351
5
+ autocoder/auto_coder_rag_client_mcp.py,sha256=WU8WzwuRbJE-W_r94S8PYKOQ32FEv2WPJzCgZII7dBc,6277
6
+ autocoder/auto_coder_rag_mcp.py,sha256=-RrjNwFaS2e5v8XDIrKR-zlUNUE8UBaeOtojffBrvJo,8521
5
7
  autocoder/auto_coder_server.py,sha256=XU9b4SBH7zjPPXaTWWHV4_zJm-XYa6njuLQaplYJH_c,20290
6
8
  autocoder/benchmark.py,sha256=Ypomkdzd1T3GE6dRICY3Hj547dZ6_inqJbBJIp5QMco,4423
7
9
  autocoder/chat_auto_coder.py,sha256=x98afu7PCzYtf2545tIdJP13tI3lixFJg4sSSFtRjeM,95346
8
10
  autocoder/chat_auto_coder_lang.py,sha256=ReWukXKVvuzVvpbYk5O9kc1ev7XNmAv3DnuQhmpLmnc,8717
9
11
  autocoder/command_args.py,sha256=9aYJ-AmPxP1sQh6ciw04FWHjSn31f2W9afXFwo8wgx4,30441
10
12
  autocoder/lang.py,sha256=U6AjVV8Rs1uLyjFCZ8sT6WWuNUxMBqkXXIOs4S120uk,14511
11
- autocoder/version.py,sha256=tEdfS6Yw3kxd6NglROcL14L5i85YA9bN5_7H9HyePxA,24
13
+ autocoder/version.py,sha256=hA-WuAig1V69eSYfuZJjxnT6-tLr5fGDFA1I86siMMg,24
12
14
  autocoder/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
15
  autocoder/agent/auto_demand_organizer.py,sha256=NWSAEsEk94vT3lGjfo25kKLMwYdPcpy9e-i21txPasQ,6942
14
16
  autocoder/agent/auto_filegroup.py,sha256=CW7bqp0FW1GIEMnl-blyAc2UGT7O9Mom0q66ITz1ckM,6635
@@ -122,9 +124,9 @@ autocoder/utils/request_event_queue.py,sha256=r3lo5qGsB1dIjzVQ05dnr0z_9Z3zOkBdP1
122
124
  autocoder/utils/request_queue.py,sha256=nwp6PMtgTCiuwJI24p8OLNZjUiprC-TsefQrhMI-yPE,3889
123
125
  autocoder/utils/rest.py,sha256=HawagAap3wMIDROGhY1730zSZrJR_EycODAA5qOj83c,8807
124
126
  autocoder/utils/tests.py,sha256=BqphrwyycGAvs-5mhH8pKtMZdObwhFtJ5MC_ZAOiLq8,1340
125
- auto_coder-0.1.222.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
126
- auto_coder-0.1.222.dist-info/METADATA,sha256=T3YPAkMEoTSY8J8xgPi-f-Rn_szn6-A4wJhbQfn5Gvs,2615
127
- auto_coder-0.1.222.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
128
- auto_coder-0.1.222.dist-info/entry_points.txt,sha256=0nzHtHH4pNcM7xq4EBA2toS28Qelrvcbrr59GqD_0Ak,350
129
- auto_coder-0.1.222.dist-info/top_level.txt,sha256=Jqc0_uJSw2GwoFQAa9iJxYns-2mWla-9ok_Y3Gcznjk,10
130
- auto_coder-0.1.222.dist-info/RECORD,,
127
+ auto_coder-0.1.223.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
128
+ auto_coder-0.1.223.dist-info/METADATA,sha256=wma3ZSYec0V5FYUoLcbVDuWamEWG0ClOEoOInJkGnCQ,2615
129
+ auto_coder-0.1.223.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
130
+ auto_coder-0.1.223.dist-info/entry_points.txt,sha256=0nzHtHH4pNcM7xq4EBA2toS28Qelrvcbrr59GqD_0Ak,350
131
+ auto_coder-0.1.223.dist-info/top_level.txt,sha256=Jqc0_uJSw2GwoFQAa9iJxYns-2mWla-9ok_Y3Gcznjk,10
132
+ auto_coder-0.1.223.dist-info/RECORD,,
@@ -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": False
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())
autocoder/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.222"
1
+ __version__ = "0.1.223"