auto-coder-web 0.1.81__py3-none-any.whl → 0.1.83__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.
Files changed (35) hide show
  1. auto_coder_web/auto_coder_runner_wrapper.py +1 -2
  2. auto_coder_web/file_manager.py +9 -7
  3. auto_coder_web/init_project.py +9 -0
  4. auto_coder_web/proxy.py +2 -2
  5. auto_coder_web/routers/auto_router.py +4 -5
  6. auto_coder_web/routers/chat_router.py +4 -4
  7. auto_coder_web/routers/coding_router.py +3 -3
  8. auto_coder_web/routers/direct_chat_router.py +42 -0
  9. auto_coder_web/routers/rules_router.py +601 -0
  10. auto_coder_web/version.py +1 -1
  11. auto_coder_web/web/assets/HistoryPanel-B59ay4X7.js +1 -0
  12. auto_coder_web/web/assets/{cssMode-CQYz0o1d.js → cssMode-dfzmIRw_.js} +1 -1
  13. auto_coder_web/web/assets/{freemarker2-BJU3cSen.js → freemarker2-CD79_SV-.js} +1 -1
  14. auto_coder_web/web/assets/{handlebars-VxUdciXQ.js → handlebars-B_inQ7Ga.js} +2 -2
  15. auto_coder_web/web/assets/{html-DEgskwXL.js → html-s8IXsV2v.js} +1 -1
  16. auto_coder_web/web/assets/{htmlMode-58cXxJlI.js → htmlMode-BNdCO4Um.js} +1 -1
  17. auto_coder_web/web/assets/{javascript-DbZlm-ig.js → javascript-D_ZBRKl9.js} +1 -1
  18. auto_coder_web/web/assets/{jsonMode-C2HKgmE0.js → jsonMode-lWocgRYn.js} +1 -1
  19. auto_coder_web/web/assets/{liquid-BFft-XkQ.js → liquid-CPaH0eVF.js} +1 -1
  20. auto_coder_web/web/assets/{main-x88Ziufd.css → main-B3_hzhoO.css} +2 -2
  21. auto_coder_web/web/assets/main.js +298 -298
  22. auto_coder_web/web/assets/{mdx-DZdDhrJW.js → mdx-DRx1b0qs.js} +1 -1
  23. auto_coder_web/web/assets/{python-DOHUGzLU.js → python-5rTPwuda.js} +2 -2
  24. auto_coder_web/web/assets/{razor-Dh5mSHi2.js → razor-zn6WfQ9V.js} +1 -1
  25. auto_coder_web/web/assets/{tsMode-tyI6CeIR.js → tsMode-CkhihvQ0.js} +1 -1
  26. auto_coder_web/web/assets/{typescript-DZzM_VgT.js → typescript-DH2E4fY1.js} +2 -2
  27. auto_coder_web/web/assets/{xml-Dl6413Na.js → xml-kipCCfsB.js} +2 -2
  28. auto_coder_web/web/assets/{yaml-DML583wh.js → yaml-BI9EB_1X.js} +1 -1
  29. auto_coder_web/web/index.html +1 -1
  30. {auto_coder_web-0.1.81.dist-info → auto_coder_web-0.1.83.dist-info}/METADATA +3 -2
  31. {auto_coder_web-0.1.81.dist-info → auto_coder_web-0.1.83.dist-info}/RECORD +34 -32
  32. auto_coder_web/web/assets/HistoryPanel-gl864o6H.js +0 -1
  33. {auto_coder_web-0.1.81.dist-info → auto_coder_web-0.1.83.dist-info}/WHEEL +0 -0
  34. {auto_coder_web-0.1.81.dist-info → auto_coder_web-0.1.83.dist-info}/entry_points.txt +0 -0
  35. {auto_coder_web-0.1.81.dist-info → auto_coder_web-0.1.83.dist-info}/top_level.txt +0 -0
@@ -4,8 +4,7 @@ from autocoder.auto_coder_runner import (
4
4
  load_memory,
5
5
  save_memory,
6
6
  configure,
7
- manage_models,
8
- print_conf,
7
+ manage_models,
9
8
  exclude_dirs,
10
9
  exclude_files,
11
10
  ask,
@@ -40,10 +40,11 @@ def get_directory_tree(root_path: str, path: str = None, lazy: bool = False) ->
40
40
 
41
41
  def should_ignore(name: str) -> bool:
42
42
  """Check if a file or directory should be ignored"""
43
- # Ignore hidden files/directories
44
- if name.startswith('.'):
43
+ allowed_hidden_files = {'.autocoderrules', '.gitignore', '.autocoderignore'}
44
+ # Ignore hidden files/directories, unless they are explicitly allowed
45
+ if name.startswith('.') and name not in allowed_hidden_files:
45
46
  return True
46
- # Ignore exact matches and pattern matches
47
+ # Ignore exact matches and pattern matches from IGNORE_PATTERNS
47
48
  return name in IGNORE_PATTERNS
48
49
 
49
50
  def build_tree(current_path: str) -> List[Dict[str, Any]]:
@@ -146,11 +147,12 @@ async def get_directory_tree_async(root_path: str, path: str = None, lazy: bool
146
147
 
147
148
  def should_ignore(name: str) -> bool:
148
149
  """Check if a file or directory should be ignored"""
149
- # Ignore hidden files/directories (starting with '.')
150
- ## and name != ".auto-coder":
151
- if name.startswith('.'):
150
+ allowed_hidden_files = {'.autocoderrules', '.gitignore', '.autocoderignore'}
151
+ # Ignore hidden files/directories (starting with '.'), unless explicitly allowed
152
+ ## and name != ".auto-coder": # Original comment kept for context if needed
153
+ if name.startswith('.') and name not in allowed_hidden_files:
152
154
  return True
153
- # Ignore exact matches
155
+ # Ignore exact matches from IGNORE_PATTERNS
154
156
  return name in IGNORE_PATTERNS
155
157
 
156
158
  async def build_tree(current_path: str) -> List[Dict[str, Any]]:
@@ -20,6 +20,15 @@ def init_project(project_path: str):
20
20
  f.write("\n/actions/")
21
21
  f.write("\n/output.txt")
22
22
 
23
+
24
+ # 生成 .autocoderignore 文件,采用 .gitignore 格式
25
+ autocoderignore_path = os.path.join(source_dir, ".autocoderignore")
26
+ autocoderignore_content = (
27
+ "target\n"
28
+ )
29
+ with open(autocoderignore_path, "w", encoding="utf-8") as f:
30
+ f.write(autocoderignore_content)
31
+
23
32
  print(
24
33
  f"""Successfully initialized auto-coder project in {os.path.abspath(project_path)}."""
25
34
  )
auto_coder_web/proxy.py CHANGED
@@ -19,7 +19,7 @@ import sys
19
19
  from auto_coder_web.terminal import terminal_manager
20
20
  from autocoder.common import AutoCoderArgs
21
21
  from auto_coder_web.auto_coder_runner_wrapper import AutoCoderRunnerWrapper
22
- from auto_coder_web.routers import todo_router, settings_router, auto_router, commit_router, chat_router, coding_router, index_router, config_router, upload_router, rag_router, editable_preview_router,mcp_router
22
+ from auto_coder_web.routers import todo_router, settings_router, auto_router, commit_router, chat_router, coding_router, index_router, config_router, upload_router, rag_router, editable_preview_router, mcp_router, direct_chat_router
23
23
  from auto_coder_web.expert_routers import history_router
24
24
  from auto_coder_web.common_router import completions_router, file_router, auto_coder_conf_router, chat_list_router, file_group_router, model_router, compiler_router
25
25
  from auto_coder_web.common_router import active_context_router
@@ -106,7 +106,7 @@ class ProxyServer:
106
106
  self.app.include_router(editable_preview_router.router)
107
107
  self.app.include_router(mcp_router.router)
108
108
  self.app.include_router(active_context_router.router)
109
- # self.app.include_router(rag_router.router)
109
+ self.app.include_router(direct_chat_router.router)
110
110
 
111
111
  @self.app.on_event("shutdown")
112
112
  async def shutdown_event():
@@ -96,7 +96,8 @@ async def auto_command(request: AutoCommandRequest, project_path: str = Depends(
96
96
  try:
97
97
  # 创建AutoCoderRunnerWrapper实例,使用从应用上下文获取的项目路径
98
98
  wrapper = AutoCoderRunnerWrapper(project_path)
99
- wrapper.configure_wrapper(f"event_file:{event_file}")
99
+ wrapper.configure_wrapper(f"event_file:{event_file}")
100
+ global_cancel.register_token(event_file)
100
101
  prompt_text = request.command
101
102
 
102
103
  if request.include_conversation_history:
@@ -374,12 +375,10 @@ async def cancel_task(request: CancelTaskRequest, project_path: str = Depends(ge
374
375
  """
375
376
  # 定义在线程中执行的取消任务函数
376
377
  def cancel_task_thread(event_file_id: str, project_path: str):
377
- try:
378
- # 设置全局取消标志
379
- global_cancel.set()
380
-
378
+ try:
381
379
  # 获取事件文件路径和事件管理器
382
380
  event_file = get_event_file_path(file_id=event_file_id, project_path=project_path)
381
+ global_cancel.set(token=event_file)
383
382
  event_manager = get_event_manager(event_file)
384
383
 
385
384
  # 向事件流写入取消事件
@@ -68,7 +68,8 @@ async def chat_command(request: ChatCommandRequest, project_path: str = Depends(
68
68
  try:
69
69
  # 创建AutoCoderRunnerWrapper实例,使用从应用上下文获取的项目路径
70
70
  wrapper = AutoCoderRunnerWrapper(project_path)
71
- wrapper.configure_wrapper(f"event_file:{event_file}")
71
+ wrapper.configure_wrapper(f"event_file:{event_file}")
72
+ global_cancel.register_token(event_file)
72
73
 
73
74
  # 调用chat方法
74
75
  result = wrapper.chat_wrapper(request.command)
@@ -304,9 +305,8 @@ async def cancel_task(request: CancelTaskRequest, project_path: str = Depends(ge
304
305
  event_file = get_event_file_path(file_id=request.event_file_id, project_path=project_path)
305
306
 
306
307
  def cancel_in_thread():
307
- try:
308
- # 设置全局取消标志
309
- global_cancel.set_cancel(request.event_file_id)
308
+ try:
309
+ global_cancel.set(token=event_file)
310
310
 
311
311
  # 获取事件管理器
312
312
  event_manager = get_event_manager(event_file)
@@ -89,6 +89,7 @@ async def coding_command(request: CodingCommandRequest, project_path: str = Depe
89
89
  # 创建AutoCoderRunnerWrapper实例,使用从应用上下文获取的项目路径
90
90
  wrapper = AutoCoderRunnerWrapper(project_path)
91
91
  wrapper.configure_wrapper(f"event_file:{event_file}")
92
+ global_cancel.register_token(event_file)
92
93
 
93
94
  # 获取当前会话名称
94
95
  current_session_file = os.path.join(project_path, ".auto-coder", "auto-coder.web", "current-session.json")
@@ -362,9 +363,8 @@ async def cancel_task(request: CancelTaskRequest, project_path: str = Depends(ge
362
363
  event_file = get_event_file_path(file_id=request.event_file_id, project_path=project_path)
363
364
 
364
365
  def cancel_in_thread():
365
- try:
366
- # 设置全局取消标志
367
- global_cancel.set()
366
+ try:
367
+ global_cancel.set(token=event_file)
368
368
 
369
369
  # 获取事件管理器
370
370
  event_manager = get_event_manager(event_file)
@@ -0,0 +1,42 @@
1
+ import traceback
2
+ from fastapi import APIRouter, Request
3
+ from pydantic import BaseModel
4
+ from typing import Any, Dict
5
+ from loguru import logger
6
+ import byzerllm
7
+
8
+ from autocoder.utils.llms import get_single_llm
9
+
10
+ router = APIRouter()
11
+
12
+ class DirectChatRequest(BaseModel):
13
+ model: str
14
+ content: str
15
+ product_mode: str = "lite"
16
+ options: Dict[str, Any] = {}
17
+
18
+ class DirectChatResponse(BaseModel):
19
+ success: bool
20
+ result: Any = None
21
+ error: str = None
22
+
23
+ @router.post("/api/direct_chat", response_model=DirectChatResponse)
24
+ async def direct_chat(req: DirectChatRequest, request: Request):
25
+ """
26
+ 简单直聊API,指定模型和内容,返回模型回复。
27
+ """
28
+ try:
29
+ # 获取模型
30
+ llm = get_single_llm(req.model, product_mode=req.product_mode)
31
+
32
+ @byzerllm.prompt()
33
+ def chat_func(content: str) -> str:
34
+ """
35
+ {{ content }}
36
+ """
37
+ # 支持自定义llm_config等参数
38
+ result = chat_func.with_llm(llm).run(req.content)
39
+ return DirectChatResponse(success=True, result=result)
40
+ except Exception as e:
41
+ logger.error(f"direct_chat error: {e}\n{traceback.format_exc()}")
42
+ return DirectChatResponse(success=False, error=f"{str(e)}")