File size: 5,706 Bytes
6575706
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1c2d73c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6575706
1c2d73c
 
 
 
6575706
1c2d73c
6575706
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1c2d73c
 
6575706
 
 
 
 
 
 
 
 
1c2d73c
6575706
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# RAG ์ฑ—๋ด‡ + LocalPCAgent ํ†ตํ•ฉ ํ”„๋กœ์ ํŠธ ๊ณ„ํš

## ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
๊ธฐ์กด RAG ์ฑ—๋ด‡(Flask ๊ธฐ๋ฐ˜)์— LocalPCAgent ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ†ตํ•ฉ ์ž‘์—…์ž…๋‹ˆ๋‹ค. Gradio UI ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์„ Flask+HTML/JS ๊ตฌ์กฐ์— ์ด์‹ํ•ฉ๋‹ˆ๋‹ค.

## ์™„๋ฃŒ๋œ ์ž‘์—…
- [x] ๊ธฐ๋ณธ Flask ๊ธฐ๋ฐ˜ RAG ์ฑ—๋ด‡ ๋ฐฑ์—”๋“œ ๊ตฌํ˜„
- [x] LocalPCAgent ์ œ์–ด๋ฅผ ์œ„ํ•œ API ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€ (`app_device_routes.py`)
- [x] Flask ๋ฐฑ์—”๋“œ์™€ LocalPCAgent ๊ฐ„ ํ†ต์‹  ๋กœ์ง ๊ตฌํ˜„
- [x] ์›น UI์— LocalPCAgent ์ œ์–ด ํ™”๋ฉด ์ถ”๊ฐ€ (HTML/CSS)
- [x] ์›น UI์—์„œ LocalPCAgent ์ œ์–ด ๊ธฐ๋Šฅ์„ ์œ„ํ•œ JavaScript ๋กœ์ง ๊ตฌํ˜„
- [x] ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ์ •๋ฆฌ ๋ฐ ์ตœ์ ํ™”
  - ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ๋ฐ ์ฝ”๋“œ ์ œ๊ฑฐ
  - ๋ชจ๋“ˆํ™”๋œ ์ฝ”๋“œ ๊ตฌ์กฐ ๊ฐœ์„ 

## ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ •๋ฆฌ
- ์ฃผ์š” ์‹คํ–‰ ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ณ  `app_revised.py`๋ฅผ ์ฃผ ํŒŒ์ผ๋กœ ์„ ํƒ
- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ 'app' ํŒจํ‚ค์ง€๋กœ ๋ชจ๋“ˆํ™”:
  - ์žฅ์น˜ ์ œ์–ด ๋ผ์šฐํ„ฐ: `app/app_device_routes.py`
  - ๊ธฐ๋ณธ API ๋ผ์šฐํ„ฐ: `app/app_routes.py`
  - ๊ฒ€์ƒ‰๊ธฐ ์ดˆ๊ธฐํ™”: `app/init_retriever.py`
- ํ”„๋ŸฐํŠธ์—”๋“œ ์ฝ”๋“œ ํ†ตํ•ฉ:
  - `templates/index.html`์— ์žฅ์น˜ ์ œ์–ด UI ์„น์…˜
  - `static/js/app-device.js`์— ์žฅ์น˜ ์ œ์–ด JavaScript ์ฝ”๋“œ
  - `static/css/device-style.css`์— ์žฅ์น˜ ์ œ์–ด ์Šคํƒ€์ผ

## ํ˜„์žฌ ์ƒํƒœ
์ฝ”๋“œ ๊ฒ€ํ†  ๊ฒฐ๊ณผ ๋Œ€๋ถ€๋ถ„์˜ ํ†ตํ•ฉ ์ž‘์—…์ด ์ด๋ฏธ ์™„๋ฃŒ๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค:
- Flask ๋ฐฑ์—”๋“œ์— LocalPCAgent API ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (`app_device_routes.py`)
- ํ”„๋ก ํŠธ์—”๋“œ UI์— ์žฅ์น˜ ์ œ์–ด ํƒญ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (`index.html`)
- ์žฅ์น˜ ์ œ์–ด๋ฅผ ์œ„ํ•œ JavaScript ๋กœ์ง์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (`app-device.js`)
- ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ๋ช…๋ น์–ด ์‹คํ–‰ ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

## ์ถ”๊ฐ€ ๊ฐœ๋ฐœ ๊ณ„ํš: ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

### ๊ฐœ๋ฐœ ๋ชฉํ‘œ
๋กœ์ปฌPC์— ์—ฐ๊ฒฐ๋œ ์žฅ์น˜(ํŠนํžˆ COM ํฌํŠธ์™€ USB ์žฅ์น˜)๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

### ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ
1. **๋กœ์ปฌPC ์žฅ์น˜ ์กฐํšŒ Python ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ**
   - COM ํฌํŠธ ๋ฐ USB ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ
   - ์žฅ์น˜๋ณ„ ์ƒ์„ธ ์ •๋ณด(์ œ์กฐ์‚ฌ, ์ œํ’ˆ๋ช…, ์‹œ๋ฆฌ์–ผ ๋ฒˆํ˜ธ ๋“ฑ) ์ˆ˜์ง‘
   - ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ ์ง€์›(Windows, Linux, macOS)

2. **LocalPCAgent API ํ™•์žฅ**
   - ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ API ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€
   - ์กฐํšŒ ๊ฒฐ๊ณผ ํšจ์œจ์ ์ธ ์ „์†ก ๋ฐฉ์‹ ๊ตฌํ˜„

3. **UI ํ™•์žฅ**
   - ์žฅ์น˜ ์ œ์–ด ํƒญ์— ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์„น์…˜ ์ถ”๊ฐ€
   - ์กฐํšŒ ๊ฒฐ๊ณผ ํ‘œ์‹œ UI ๊ตฌํ˜„
   - ์žฅ์น˜ ํƒ€์ž…๋ณ„ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ๊ตฌํ˜„

### ๊ธฐ์ˆ  ์Šคํƒ
- ๋ฐฑ์—”๋“œ: Python(`pyserial`, `pyusb`), Flask
- ํ”„๋ก ํŠธ์—”๋“œ: HTML, CSS, JavaScript
- ํ†ต์‹ : REST API, JSON ํฌ๋งท

### ๊ตฌํ˜„ ๊ณ„ํš
1. **๋กœ์ปฌPC ์žฅ์น˜ ์กฐํšŒ Python ์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ**
   - `scan_devices.py` ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ
   - ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น…

2. **LocalPCAgent์— ํ†ตํ•ฉ**
   - LocalPCAgent ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก์— ๋“ฑ๋ก
   - API ์—”๋“œํฌ์ธํŠธ ํ…Œ์ŠคํŠธ

3. **Flask ๋ฐฑ์—”๋“œ API ํ™•์žฅ**
   - `app_device_routes.py`์— ์žฅ์น˜ ์กฐํšŒ API ์ถ”๊ฐ€
   - ๋ฐ์ดํ„ฐ ํฌ๋งท ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

4. **ํ”„๋ก ํŠธ์—”๋“œ UI ๊ฐœ๋ฐœ**
   - `index.html`์— ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์„น์…˜ ์ถ”๊ฐ€
   - `app-device.js`์— ์žฅ์น˜ ์กฐํšŒ ๊ด€๋ จ ํ•จ์ˆ˜ ์ถ”๊ฐ€
   - ํ•„์š”์‹œ CSS ์Šคํƒ€์ผ ์ถ”๊ฐ€

## ๋‚จ์€ ์ž‘์—…
- [ ] ๋กœ์ปฌPC ์žฅ์น˜ ์กฐํšŒ Python ์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ
- [ ] LocalPCAgent ์„œ๋ฒ„์— ์žฅ์น˜ ์กฐํšŒ ๊ธฐ๋Šฅ ํ†ตํ•ฉ
- [ ] Flask ๋ฐฑ์—”๋“œ ์žฅ์น˜ ์กฐํšŒ API ๊ตฌํ˜„
- [ ] ํ”„๋ก ํŠธ์—”๋“œ UI ํ™•์žฅ
- [ ] ์ „์ฒด ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น…
- [ ] ์ตœ์ข… ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ๋ฌธ์„œํ™” ๋ณด์™„

## ํŒŒ์ผ ๊ตฌ์กฐ
- `app_revised.py`: ๋ฉ”์ธ Flask ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
- `app.py`: ๋‹จ์ˆœํ™”๋œ ์ง„์ž…์  (app_revised.py ํ˜ธ์ถœ)
- `app/`: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ
  - `__init__.py`: ํŒจํ‚ค์ง€ ์ดˆ๊ธฐํ™”
  - `app_device_routes.py`: LocalPCAgent ์ œ์–ด API ๋ผ์šฐํŠธ
  - `app_routes.py`: ๊ธฐ๋ณธ RAG ์ฑ—๋ด‡ API ๋ผ์šฐํŠธ
  - `init_retriever.py`: RAG ๋ชจ๋ธ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ
- `static/`: ์ •์  ํŒŒ์ผ
  - `css/`: ์Šคํƒ€์ผ์‹œํŠธ
    - `style.css`: ๊ธฐ๋ณธ ์Šคํƒ€์ผ
    - `device-style.css`: ์žฅ์น˜ ์ œ์–ด ์Šคํƒ€์ผ
  - `js/`: JavaScript ํŒŒ์ผ
    - `app.js`: ๋ฉ”์ธ JavaScript
    - `app-core.js`: ํ•ต์‹ฌ ๊ธฐ๋Šฅ
    - `app-device.js`: ์žฅ์น˜ ์ œ์–ด ๊ธฐ๋Šฅ
    - `app-docs.js`: ๋ฌธ์„œ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ
    - `app-llm.js`: LLM ๊ด€๋ จ ๊ธฐ๋Šฅ
- `templates/`: HTML ํ…œํ”Œ๋ฆฟ
  - `index.html`: ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŽ˜์ด์ง€
  - `login.html`: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
  - `loading.html`: ๋กœ๋”ฉ ํŽ˜์ด์ง€
- `docs/`: ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ
  - `project_plan.md`: ํ”„๋กœ์ ํŠธ ๊ณ„ํš ๋ฌธ์„œ
  - `cleanup_plan.md`: ์ฝ”๋“œ ์ •๋ฆฌ ๊ณ„ํš ๋ฌธ์„œ
- **์‹ ๊ทœ ํŒŒ์ผ:**
  - `LocalPCAgent/programs/scan_devices.py`: ์žฅ์น˜ ์กฐํšŒ Python ์Šคํฌ๋ฆฝํŠธ

## LocalPCAgent ํ†ตํ•ฉ ์š”์•ฝ
- **๋ฐฑ์—”๋“œ API**: `app/app_device_routes.py`์— ๊ตฌํ˜„
  - `/api/device/status`: ์žฅ์น˜ ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ
  - `/api/device/connect`: ์‚ฌ์šฉ์ž ์ง€์ • URL ์—ฐ๊ฒฐ
  - `/api/device/list`: ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ
  - `/api/device/programs`: ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ
  - `/api/device/programs/<program_id>/execute`: ๋“ฑ๋ก๋œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
  - `/api/device/execute-custom`: ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
  - **์ถ”๊ฐ€ ์˜ˆ์ •:** `/api/device/scan-ports`: COM ํฌํŠธ ๋ฐ USB ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ

- **ํ”„๋ŸฐํŠธ์—”๋“œ**: ๊ธฐ๋Šฅ ์™„์„ฑ
  - ์žฅ์น˜ ์ œ์–ด ํƒญ UI: `templates/index.html`์— ๊ตฌํ˜„
  - JavaScript ๋กœ์ง: `static/js/app-device.js`์— ๊ตฌํ˜„
  - ์Šคํƒ€์ผ: `static/css/device-style.css`์— ๊ตฌํ˜„

## ์ฃผ์˜์‚ฌํ•ญ
- JavaScript๋Š” ์ง์ ‘ LocalPCAgent์™€ ํ†ต์‹ ํ•˜์ง€ ์•Š๊ณ  Flask ๋ฐฑ์—”๋“œ๋ฅผ ํ†ตํ•ด ํ†ต์‹ 
- ๋ชจ๋“  ์žฅ์น˜ ๊ด€๋ จ API๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ (`login_required` ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ ์šฉ)
- ๋กœ๊น… ์ฝ”๋“œ ์œ ์ง€ํ•˜์—ฌ ๋””๋ฒ„๊น… ์šฉ์ดํ•˜๊ฒŒ ํ•จ