auto-coder-web 0.1.57__py3-none-any.whl → 0.1.59__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.
- auto_coder_web/expert_routers/history_router.py +1 -2
- auto_coder_web/proxy.py +3 -1
- auto_coder_web/routers/rag_router.py +122 -0
- auto_coder_web/version.py +1 -1
- auto_coder_web/web/assets/{cssMode-CASSua2g.js → cssMode-l2jjsqtW.js} +1 -1
- auto_coder_web/web/assets/{freemarker2-Cfge5bCe.js → freemarker2-S4tCPD6N.js} +1 -1
- auto_coder_web/web/assets/{handlebars-DD9vaFGU.js → handlebars-Wil-azPx.js} +1 -1
- auto_coder_web/web/assets/{html-wMu7NWVV.js → html-BHkmBm1e.js} +1 -1
- auto_coder_web/web/assets/{htmlMode-BJMZKVjn.js → htmlMode-BafxlJGB.js} +1 -1
- auto_coder_web/web/assets/{index-dgy4j9V_.css → index-Dwgw7mFY.css} +2 -2
- auto_coder_web/web/assets/{index-BB-izReD.js → index-KrCRB6ZK.js} +385 -372
- auto_coder_web/web/assets/{javascript-2ffNaYoE.js → javascript-BN1li3Zy.js} +1 -1
- auto_coder_web/web/assets/{jsonMode-C5X-fxen.js → jsonMode-j073Sr5k.js} +1 -1
- auto_coder_web/web/assets/{liquid-C3uwo_9k.js → liquid-DnS5RM1s.js} +1 -1
- auto_coder_web/web/assets/{mdx-CqGFZJJX.js → mdx-sr8FaC_m.js} +1 -1
- auto_coder_web/web/assets/{python-BvxzqvR4.js → python-Cz-JMHEr.js} +1 -1
- auto_coder_web/web/assets/{razor-DFYpxRz5.js → razor-Bit5V0We.js} +1 -1
- auto_coder_web/web/assets/{tsMode-DLkYryH0.js → tsMode-72li3_GZ.js} +1 -1
- auto_coder_web/web/assets/{typescript-Dvi9C8gH.js → typescript-CzReOdw4.js} +1 -1
- auto_coder_web/web/assets/{xml-DTJhoFj9.js → xml-CDVdSTzU.js} +1 -1
- auto_coder_web/web/assets/{yaml-CveCF9Jn.js → yaml-BCzkXue7.js} +1 -1
- auto_coder_web/web/index.html +2 -2
- {auto_coder_web-0.1.57.dist-info → auto_coder_web-0.1.59.dist-info}/METADATA +2 -2
- {auto_coder_web-0.1.57.dist-info → auto_coder_web-0.1.59.dist-info}/RECORD +27 -26
- {auto_coder_web-0.1.57.dist-info → auto_coder_web-0.1.59.dist-info}/WHEEL +0 -0
- {auto_coder_web-0.1.57.dist-info → auto_coder_web-0.1.59.dist-info}/entry_points.txt +0 -0
- {auto_coder_web-0.1.57.dist-info → auto_coder_web-0.1.59.dist-info}/top_level.txt +0 -0
@@ -142,8 +142,7 @@ async def validate_and_load_history(
|
|
142
142
|
|
143
143
|
# 检查该提交是否已被撤销
|
144
144
|
is_reverted = False
|
145
|
-
if response_id and response_id in reverted_commits:
|
146
|
-
logger.info(f"提交 {response_id[:7]} 已被撤销")
|
145
|
+
if response_id and response_id in reverted_commits:
|
147
146
|
is_reverted = True
|
148
147
|
|
149
148
|
# 提取上下文URL(如果有)
|
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
|
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
|
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 rich.console import Console
|
@@ -99,6 +99,8 @@ class ProxyServer:
|
|
99
99
|
self.app.include_router(index_router.router)
|
100
100
|
self.app.include_router(config_router.router)
|
101
101
|
self.app.include_router(upload_router.router)
|
102
|
+
self.app.include_router(rag_router.router)
|
103
|
+
# self.app.include_router(rag_router.router)
|
102
104
|
|
103
105
|
@self.app.on_event("shutdown")
|
104
106
|
async def shutdown_event():
|
@@ -0,0 +1,122 @@
|
|
1
|
+
import os
|
2
|
+
import json
|
3
|
+
import logging
|
4
|
+
import aiofiles
|
5
|
+
from fastapi import APIRouter, HTTPException, Depends, Request
|
6
|
+
from pydantic import BaseModel
|
7
|
+
from typing import List, Optional
|
8
|
+
from pathlib import Path as FilePath
|
9
|
+
import asyncio
|
10
|
+
from fastapi.responses import JSONResponse
|
11
|
+
|
12
|
+
router = APIRouter()
|
13
|
+
|
14
|
+
# Configuration storage path
|
15
|
+
def get_rags_file_path(project_path: str) -> FilePath:
|
16
|
+
return FilePath(project_path) / ".auto-coder" / "auto-coder.web" / "rags" / "rags.json"
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
class Rag(BaseModel):
|
21
|
+
name: str
|
22
|
+
base_url: str
|
23
|
+
api_key: str = "xxxx"
|
24
|
+
|
25
|
+
class RagList(BaseModel):
|
26
|
+
data: List[Rag] = []
|
27
|
+
|
28
|
+
async def get_project_path(request: Request) -> str:
|
29
|
+
"""
|
30
|
+
从FastAPI请求上下文中获取项目路径
|
31
|
+
"""
|
32
|
+
return request.app.state.project_path
|
33
|
+
|
34
|
+
async def load_rags(project_path: str) -> RagList:
|
35
|
+
"""Asynchronously load RAGs"""
|
36
|
+
rags_file = get_rags_file_path(project_path)
|
37
|
+
|
38
|
+
# Ensure directory exists
|
39
|
+
rags_file.parent.mkdir(parents=True, exist_ok=True)
|
40
|
+
|
41
|
+
if not await asyncio.to_thread(lambda: rags_file.exists()):
|
42
|
+
# If file doesn't exist, return default empty list
|
43
|
+
return RagList()
|
44
|
+
|
45
|
+
try:
|
46
|
+
async with aiofiles.open(rags_file, mode='r') as f:
|
47
|
+
content = await f.read()
|
48
|
+
return RagList(**json.loads(content))
|
49
|
+
except (json.JSONDecodeError, FileNotFoundError):
|
50
|
+
logger.error("Failed to parse rags.json, returning empty list")
|
51
|
+
return RagList()
|
52
|
+
|
53
|
+
async def save_rags(rags: RagList, project_path: str):
|
54
|
+
"""Asynchronously save RAGs"""
|
55
|
+
rags_file = get_rags_file_path(project_path)
|
56
|
+
|
57
|
+
# Ensure directory exists
|
58
|
+
rags_file.parent.mkdir(parents=True, exist_ok=True)
|
59
|
+
|
60
|
+
async with aiofiles.open(rags_file, mode='w') as f:
|
61
|
+
await f.write(json.dumps(rags.dict(), indent=2, ensure_ascii=False))
|
62
|
+
|
63
|
+
@router.get("/api/rags")
|
64
|
+
async def get_rags(project_path: str = Depends(get_project_path)):
|
65
|
+
"""Get all RAGs"""
|
66
|
+
rags = await load_rags(project_path)
|
67
|
+
return rags
|
68
|
+
|
69
|
+
@router.post("/api/rags")
|
70
|
+
async def create_rag(rag: Rag, project_path: str = Depends(get_project_path)):
|
71
|
+
"""Create a new RAG"""
|
72
|
+
rags = await load_rags(project_path)
|
73
|
+
|
74
|
+
# Check if RAG with same name already exists
|
75
|
+
if any(r.name == rag.name for r in rags.data):
|
76
|
+
raise HTTPException(status_code=400, detail=f"RAG with name '{rag.name}' already exists")
|
77
|
+
|
78
|
+
rags.data.append(rag)
|
79
|
+
await save_rags(rags, project_path)
|
80
|
+
return {"status": "success", "message": "RAG created successfully"}
|
81
|
+
|
82
|
+
@router.get("/api/rags/{name}")
|
83
|
+
async def get_rag(name: str, project_path: str = Depends(get_project_path)):
|
84
|
+
"""Get a specific RAG by name"""
|
85
|
+
rags = await load_rags(project_path)
|
86
|
+
|
87
|
+
for rag in rags.data:
|
88
|
+
if rag.name == name:
|
89
|
+
return rag
|
90
|
+
|
91
|
+
raise HTTPException(status_code=404, detail=f"RAG with name '{name}' not found")
|
92
|
+
|
93
|
+
@router.put("/api/rags/{name}")
|
94
|
+
async def update_rag(name: str, updated_rag: Rag, project_path: str = Depends(get_project_path)):
|
95
|
+
"""Update an existing RAG"""
|
96
|
+
rags = await load_rags(project_path)
|
97
|
+
|
98
|
+
for i, rag in enumerate(rags.data):
|
99
|
+
if rag.name == name:
|
100
|
+
# Ensure name doesn't change
|
101
|
+
if updated_rag.name != name:
|
102
|
+
raise HTTPException(status_code=400, detail="RAG name cannot be changed")
|
103
|
+
|
104
|
+
rags.data[i] = updated_rag
|
105
|
+
await save_rags(rags, project_path)
|
106
|
+
return {"status": "success", "message": "RAG updated successfully"}
|
107
|
+
|
108
|
+
raise HTTPException(status_code=404, detail=f"RAG with name '{name}' not found")
|
109
|
+
|
110
|
+
@router.delete("/api/rags/{name}")
|
111
|
+
async def delete_rag(name: str, project_path: str = Depends(get_project_path)):
|
112
|
+
"""Delete a RAG by name"""
|
113
|
+
rags = await load_rags(project_path)
|
114
|
+
|
115
|
+
initial_count = len(rags.data)
|
116
|
+
rags.data = [rag for rag in rags.data if rag.name != name]
|
117
|
+
|
118
|
+
if len(rags.data) == initial_count:
|
119
|
+
raise HTTPException(status_code=404, detail=f"RAG with name '{name}' not found")
|
120
|
+
|
121
|
+
await save_rags(rags, project_path)
|
122
|
+
return {"status": "success", "message": "RAG deleted successfully"}
|
auto_coder_web/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.1.
|
1
|
+
__version__ = "0.1.59"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as et}from"./index-
|
1
|
+
import{m as et}from"./index-KrCRB6ZK.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as f}from"./index-
|
1
|
+
import{m as f}from"./index-KrCRB6ZK.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as l}from"./index-
|
1
|
+
import{m as l}from"./index-KrCRB6ZK.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as s}from"./index-
|
1
|
+
import{m as s}from"./index-KrCRB6ZK.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as lt}from"./index-
|
1
|
+
import{m as lt}from"./index-KrCRB6ZK.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|