tianxincode 1.0.7 → 1.0.9
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.
- package/@.txcode/req//351/241/265/351/235/242/345/270/203/345/261/200/AI/346/234/215/345/212/241/345/225/206/345/222/214/346/250/241/345/236/213/351/205/215/347/275/256.html +241 -0
- package/dist/api/ai-log.routes.d.ts +2 -0
- package/dist/api/ai-log.routes.d.ts.map +1 -0
- package/dist/api/ai-log.routes.js +21 -0
- package/dist/api/ai-log.routes.js.map +1 -0
- package/dist/api/chat.routes.d.ts.map +1 -1
- package/dist/api/chat.routes.js +35 -1
- package/dist/api/chat.routes.js.map +1 -1
- package/dist/api/config.routes.js +21 -0
- package/dist/api/config.routes.js.map +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -1
- package/dist/components/App.d.ts.map +1 -1
- package/dist/components/App.js +71 -19
- package/dist/components/App.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/ai/ai-log.service.d.ts +42 -0
- package/dist/modules/ai/ai-log.service.d.ts.map +1 -0
- package/dist/modules/ai/ai-log.service.js +52 -0
- package/dist/modules/ai/ai-log.service.js.map +1 -0
- package/dist/modules/ai/ai.service.d.ts +7 -6
- package/dist/modules/ai/ai.service.d.ts.map +1 -1
- package/dist/modules/ai/ai.service.js +53 -25
- package/dist/modules/ai/ai.service.js.map +1 -1
- package/dist/modules/ai/ai.types.d.ts +3 -0
- package/dist/modules/ai/ai.types.d.ts.map +1 -1
- package/dist/modules/ai/openai.provider.d.ts +2 -0
- package/dist/modules/ai/openai.provider.d.ts.map +1 -1
- package/dist/modules/ai/openai.provider.js +26 -2
- package/dist/modules/ai/openai.provider.js.map +1 -1
- package/dist/modules/ai/provider/base.d.ts +1 -0
- package/dist/modules/ai/provider/base.d.ts.map +1 -1
- package/dist/modules/ai/provider/openai/openai-agent.d.ts +2 -0
- package/dist/modules/ai/provider/openai/openai-agent.d.ts.map +1 -1
- package/dist/modules/ai/provider/openai/openai-agent.js +45 -8
- package/dist/modules/ai/provider/openai/openai-agent.js.map +1 -1
- package/dist/modules/ai/provider/openai/prompts.js +1 -1
- package/dist/modules/ai/provider/openai/prompts.js.map +1 -1
- package/dist/modules/ai/react.agent.d.ts +1 -0
- package/dist/modules/ai/react.agent.d.ts.map +1 -1
- package/dist/modules/ai/react.agent.js +14 -1
- package/dist/modules/ai/react.agent.js.map +1 -1
- package/dist/modules/db/db.service.d.ts +13 -66
- package/dist/modules/db/db.service.d.ts.map +1 -1
- package/dist/modules/db/db.service.js +171 -143
- package/dist/modules/db/db.service.js.map +1 -1
- package/dist/modules/db/db.types.d.ts +3 -3
- package/dist/modules/db/db.types.d.ts.map +1 -1
- package/dist/modules/db/db.types.js +1 -1
- package/dist/modules/tools/builtin/bash.js +3 -2
- package/dist/modules/tools/builtin/bash.js.map +1 -1
- package/dist/modules/tools/provider/bash.d.ts +3 -0
- package/dist/modules/tools/provider/bash.d.ts.map +1 -0
- package/dist/modules/tools/provider/bash.js +135 -0
- package/dist/modules/tools/provider/bash.js.map +1 -0
- package/dist/modules/tools/provider/code_search.d.ts +3 -0
- package/dist/modules/tools/provider/code_search.d.ts.map +1 -0
- package/dist/modules/tools/provider/code_search.js +90 -0
- package/dist/modules/tools/provider/code_search.js.map +1 -0
- package/dist/modules/tools/provider/edit_file.d.ts +3 -0
- package/dist/modules/tools/provider/edit_file.d.ts.map +1 -0
- package/dist/modules/tools/provider/edit_file.js +95 -0
- package/dist/modules/tools/provider/edit_file.js.map +1 -0
- package/dist/modules/tools/provider/glob.d.ts +3 -0
- package/dist/modules/tools/provider/glob.d.ts.map +1 -0
- package/dist/modules/tools/provider/glob.js +87 -0
- package/dist/modules/tools/provider/glob.js.map +1 -0
- package/dist/modules/tools/provider/grep.d.ts +3 -0
- package/dist/modules/tools/provider/grep.d.ts.map +1 -0
- package/dist/modules/tools/provider/grep.js +96 -0
- package/dist/modules/tools/provider/grep.js.map +1 -0
- package/dist/modules/tools/provider/index.d.ts +7 -0
- package/dist/modules/tools/provider/index.d.ts.map +1 -0
- package/dist/modules/tools/provider/index.js +37 -0
- package/dist/modules/tools/provider/index.js.map +1 -0
- package/dist/modules/tools/provider/lsp.d.ts +6 -0
- package/dist/modules/tools/provider/lsp.d.ts.map +1 -0
- package/dist/modules/tools/provider/lsp.js +128 -0
- package/dist/modules/tools/provider/lsp.js.map +1 -0
- package/dist/modules/tools/provider/memory.d.ts +3 -0
- package/dist/modules/tools/provider/memory.d.ts.map +1 -0
- package/dist/modules/tools/provider/memory.js +80 -0
- package/dist/modules/tools/provider/memory.js.map +1 -0
- package/dist/modules/tools/provider/read_file.d.ts +3 -0
- package/dist/modules/tools/provider/read_file.d.ts.map +1 -0
- package/dist/modules/tools/provider/read_file.js +109 -0
- package/dist/modules/tools/provider/read_file.js.map +1 -0
- package/dist/modules/tools/provider/skill.d.ts +6 -0
- package/dist/modules/tools/provider/skill.d.ts.map +1 -0
- package/dist/modules/tools/provider/skill.js +64 -0
- package/dist/modules/tools/provider/skill.js.map +1 -0
- package/dist/modules/tools/provider/todo_read.d.ts +3 -0
- package/dist/modules/tools/provider/todo_read.d.ts.map +1 -0
- package/dist/modules/tools/provider/todo_read.js +26 -0
- package/dist/modules/tools/provider/todo_read.js.map +1 -0
- package/dist/modules/tools/provider/todo_write.d.ts +3 -0
- package/dist/modules/tools/provider/todo_write.d.ts.map +1 -0
- package/dist/modules/tools/provider/todo_write.js +49 -0
- package/dist/modules/tools/provider/todo_write.js.map +1 -0
- package/dist/modules/tools/provider/tools.d.ts +4 -0
- package/dist/modules/tools/provider/tools.d.ts.map +1 -0
- package/dist/modules/tools/provider/tools.js +14 -0
- package/dist/modules/tools/provider/tools.js.map +1 -0
- package/dist/modules/tools/provider/web_fetch.d.ts +3 -0
- package/dist/modules/tools/provider/web_fetch.d.ts.map +1 -0
- package/dist/modules/tools/provider/web_fetch.js +56 -0
- package/dist/modules/tools/provider/web_fetch.js.map +1 -0
- package/dist/modules/tools/provider/web_search.d.ts +3 -0
- package/dist/modules/tools/provider/web_search.d.ts.map +1 -0
- package/dist/modules/tools/provider/web_search.js +104 -0
- package/dist/modules/tools/provider/web_search.js.map +1 -0
- package/dist/modules/tools/provider/write_file.d.ts +3 -0
- package/dist/modules/tools/provider/write_file.d.ts.map +1 -0
- package/dist/modules/tools/provider/write_file.js +63 -0
- package/dist/modules/tools/provider/write_file.js.map +1 -0
- package/dist/web/web.service.d.ts +2 -0
- package/dist/web/web.service.d.ts.map +1 -1
- package/dist/web/web.service.js +57 -8
- package/dist/web/web.service.js.map +1 -1
- package/package.json +5 -3
- package/web/dist/assets/AiLogsView-DWqwdXrD.js +1 -0
- package/web/dist/assets/Layout-CoiSqTWB.js +1 -0
- package/web/dist/assets/{index-CEHMSOel.js → index-B-R-RCGS.js} +65 -65
- package/web/dist/assets/{index-BnpKQafm.css → index-BGmGnKjT.css} +1 -1
- package/web/dist/index.html +2 -2
- package/web/dist/assets/Layout-Pvn6DBHZ.js +0 -1
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>AI 服务商 & 模型配置</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #f5f5f5; padding: 20px; }
|
|
10
|
+
.container { max-width: 900px; margin: 0 auto; }
|
|
11
|
+
h1 { font-size: 20px; font-weight: 600; margin-bottom: 20px; color: #333; }
|
|
12
|
+
|
|
13
|
+
.card { background: #fff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); margin-bottom: 16px; }
|
|
14
|
+
.card-header { padding: 16px; border-bottom: 1px solid #eee; display: flex; justify-content: space-between; align-items: center; }
|
|
15
|
+
.card-header h2 { font-size: 16px; font-weight: 600; }
|
|
16
|
+
.card-body { padding: 16px; }
|
|
17
|
+
|
|
18
|
+
.provider-item { border: 1px solid #e5e5e5; border-radius: 6px; margin-bottom: 12px; overflow: hidden; }
|
|
19
|
+
.provider-main { display: flex; align-items: center; padding: 12px; cursor: pointer; transition: background 0.2s; }
|
|
20
|
+
.provider-main:hover { background: #fafafa; }
|
|
21
|
+
.provider-main.active { background: #f0f7ff; border-bottom: 1px solid #e5e5e5; }
|
|
22
|
+
.expand-icon { width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; transition: transform 0.2s; margin-right: 8px; }
|
|
23
|
+
.expand-icon.expanded { transform: rotate(90deg); }
|
|
24
|
+
.provider-logo { width: 40px; height: 40px; background: #eee; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 14px; margin-right: 12px; }
|
|
25
|
+
.provider-info { flex: 1; }
|
|
26
|
+
.provider-name { font-weight: 600; font-size: 14px; }
|
|
27
|
+
.provider-desc { font-size: 12px; color: #999; margin-top: 2px; }
|
|
28
|
+
.provider-actions { display: flex; gap: 8px; }
|
|
29
|
+
|
|
30
|
+
.models-panel { display: none; padding: 16px; background: #fafafa; }
|
|
31
|
+
.models-panel.expanded { display: block; }
|
|
32
|
+
.models-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }
|
|
33
|
+
.models-header h3 { font-size: 14px; color: #666; }
|
|
34
|
+
|
|
35
|
+
.model-item { display: flex; align-items: center; padding: 10px 12px; background: #fff; border: 1px solid #e5e5e5; border-radius: 6px; margin-bottom: 8px; }
|
|
36
|
+
.model-item:hover { border-color: #1890ff; }
|
|
37
|
+
.model-name { flex: 1; font-size: 14px; }
|
|
38
|
+
.model-status { font-size: 12px; color: #52c41a; margin-right: 12px; }
|
|
39
|
+
.model-actions { display: flex; gap: 6px; }
|
|
40
|
+
|
|
41
|
+
.btn { padding: 6px 12px; border-radius: 4px; font-size: 12px; cursor: pointer; border: 1px solid #d9d9d9; background: #fff; transition: all 0.2s; }
|
|
42
|
+
.btn:hover { border-color: #1890ff; color: #1890ff; }
|
|
43
|
+
.btn-primary { background: #1890ff; color: #fff; border: none; }
|
|
44
|
+
.btn-primary:hover { background: #40a9ff; }
|
|
45
|
+
.btn-danger { color: #ff4d4f; border-color: #ff4d4f; }
|
|
46
|
+
.btn-danger:hover { background: #fff1f0; }
|
|
47
|
+
.btn-sm { padding: 4px 8px; font-size: 11px; }
|
|
48
|
+
</style>
|
|
49
|
+
</head>
|
|
50
|
+
<body>
|
|
51
|
+
<div class="container">
|
|
52
|
+
<h1>AI 服务商 & 模型配置</h1>
|
|
53
|
+
|
|
54
|
+
<div class="card">
|
|
55
|
+
<div class="card-header">
|
|
56
|
+
<h2>服务商列表</h2>
|
|
57
|
+
<button class="btn btn-primary">+ 添加服务商</button>
|
|
58
|
+
</div>
|
|
59
|
+
<div class="card-body">
|
|
60
|
+
|
|
61
|
+
<div class="provider-item">
|
|
62
|
+
<div class="provider-main" onclick="toggleModels(this)">
|
|
63
|
+
<span class="expand-icon">▶</span>
|
|
64
|
+
<div class="provider-logo" style="background:#412dea;color:#fff;">O</div>
|
|
65
|
+
<div class="provider-info">
|
|
66
|
+
<div class="provider-name">OpenAI</div>
|
|
67
|
+
<div class="provider-desc">GPT-4、GPT-3.5 等模型</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="provider-actions">
|
|
70
|
+
<button class="btn btn-sm">修改</button>
|
|
71
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="models-panel">
|
|
75
|
+
<div class="models-header">
|
|
76
|
+
<h3>模型列表</h3>
|
|
77
|
+
<button class="btn btn-sm btn-primary">+ 添加模型</button>
|
|
78
|
+
</div>
|
|
79
|
+
<div class="model-item">
|
|
80
|
+
<div class="model-name">gpt-4o</div>
|
|
81
|
+
<span class="model-status">● 默认</span>
|
|
82
|
+
<div class="model-actions">
|
|
83
|
+
<button class="btn btn-sm">修改</button>
|
|
84
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="model-item">
|
|
88
|
+
<div class="model-name">gpt-4-turbo</div>
|
|
89
|
+
<div class="model-actions">
|
|
90
|
+
<button class="btn btn-sm">修改</button>
|
|
91
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="model-item">
|
|
95
|
+
<div class="model-name">gpt-4</div>
|
|
96
|
+
<div class="model-actions">
|
|
97
|
+
<button class="btn btn-sm">修改</button>
|
|
98
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
<div class="model-item">
|
|
102
|
+
<div class="model-name">gpt-3.5-turbo</div>
|
|
103
|
+
<div class="model-actions">
|
|
104
|
+
<button class="btn btn-sm">修改</button>
|
|
105
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div class="provider-item">
|
|
112
|
+
<div class="provider-main" onclick="toggleModels(this)">
|
|
113
|
+
<span class="expand-icon">▶</span>
|
|
114
|
+
<div class="provider-logo" style="background:#25b864;color:#fff;">A</div>
|
|
115
|
+
<div class="provider-info">
|
|
116
|
+
<div class="provider-name">Anthropic Claude</div>
|
|
117
|
+
<div class="provider-desc">Claude 3.5、Claude 3 等模型</div>
|
|
118
|
+
</div>
|
|
119
|
+
<div class="provider-actions">
|
|
120
|
+
<button class="btn btn-sm">修改</button>
|
|
121
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
<div class="models-panel">
|
|
125
|
+
<div class="models-header">
|
|
126
|
+
<h3>模型列表</h3>
|
|
127
|
+
<button class="btn btn-sm btn-primary">+ 添加模型</button>
|
|
128
|
+
</div>
|
|
129
|
+
<div class="model-item">
|
|
130
|
+
<div class="model-name">claude-3-5-sonnet-20241022</div>
|
|
131
|
+
<span class="model-status">● 默认</span>
|
|
132
|
+
<div class="model-actions">
|
|
133
|
+
<button class="btn btn-sm">修改</button>
|
|
134
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
<div class="model-item">
|
|
138
|
+
<div class="model-name">claude-3-opus-20240229</div>
|
|
139
|
+
<div class="model-actions">
|
|
140
|
+
<button class="btn btn-sm">修改</button>
|
|
141
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
<div class="provider-item">
|
|
148
|
+
<div class="provider-main" onclick="toggleModels(this)">
|
|
149
|
+
<span class="expand-icon">▶</span>
|
|
150
|
+
<div class="provider-logo" style="background:#1abcab;color:#fff;">G</div>
|
|
151
|
+
<div class="provider-info">
|
|
152
|
+
<div class="provider-name">Google Gemini</div>
|
|
153
|
+
<div class="provider-desc">Gemini Pro、Flash 等模型</div>
|
|
154
|
+
</div>
|
|
155
|
+
<div class="provider-actions">
|
|
156
|
+
<button class="btn btn-sm">修改</button>
|
|
157
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
<div class="models-panel">
|
|
161
|
+
<div class="models-header">
|
|
162
|
+
<h3>模型列表</h3>
|
|
163
|
+
<button class="btn btn-sm btn-primary">+ 添加模型</button>
|
|
164
|
+
</div>
|
|
165
|
+
<div class="model-item">
|
|
166
|
+
<div class="model-name">gemini-2.0-flash-exp</div>
|
|
167
|
+
<span class="model-status">● 默认</span>
|
|
168
|
+
<div class="model-actions">
|
|
169
|
+
<button class="btn btn-sm">修改</button>
|
|
170
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
<div class="model-item">
|
|
174
|
+
<div class="model-name">gemini-1.5-pro</div>
|
|
175
|
+
<div class="model-actions">
|
|
176
|
+
<button class="btn btn-sm">修改</button>
|
|
177
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
<div class="model-item">
|
|
181
|
+
<div class="model-name">gemini-1.5-flash</div>
|
|
182
|
+
<div class="model-actions">
|
|
183
|
+
<button class="btn btn-sm">修改</button>
|
|
184
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<div class="provider-item">
|
|
191
|
+
<div class="provider-main" onclick="toggleModels(this)">
|
|
192
|
+
<span class="expand-icon">▶</span>
|
|
193
|
+
<div class="provider-logo" style="background:#fe7a1e;color:#fff;">D</div>
|
|
194
|
+
<div class="provider-info">
|
|
195
|
+
<div class="provider-name">DeepSeek</div>
|
|
196
|
+
<div class="provider-desc">DeepSeek V3、DeepSeek Coder</div>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="provider-actions">
|
|
199
|
+
<button class="btn btn-sm">修改</button>
|
|
200
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
<div class="models-panel">
|
|
204
|
+
<div class="models-header">
|
|
205
|
+
<h3>模型列表</h3>
|
|
206
|
+
<button class="btn btn-sm btn-primary">+ 添加模型</button>
|
|
207
|
+
</div>
|
|
208
|
+
<div class="model-item">
|
|
209
|
+
<div class="model-name">deepseek-chat</div>
|
|
210
|
+
<span class="model-status">● 默认</span>
|
|
211
|
+
<div class="model-actions">
|
|
212
|
+
<button class="btn btn-sm">修改</button>
|
|
213
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
<div class="model-item">
|
|
217
|
+
<div class="model-name">deepseek-coder</div>
|
|
218
|
+
<div class="model-actions">
|
|
219
|
+
<button class="btn btn-sm">修改</button>
|
|
220
|
+
<button class="btn btn-sm btn-danger">删除</button>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
|
|
229
|
+
</div>
|
|
230
|
+
|
|
231
|
+
<script>
|
|
232
|
+
function toggleModels(el) {
|
|
233
|
+
const panel = el.nextElementSibling;
|
|
234
|
+
const icon = el.querySelector('.expand-icon');
|
|
235
|
+
panel.classList.toggle('expanded');
|
|
236
|
+
icon.classList.toggle('expanded');
|
|
237
|
+
el.classList.toggle('active');
|
|
238
|
+
}
|
|
239
|
+
</script>
|
|
240
|
+
</body>
|
|
241
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-log.routes.d.ts","sourceRoot":"","sources":["../../src/api/ai-log.routes.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,4CAAW,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { aiLogService } from '../modules/ai/ai-log.service.js';
|
|
3
|
+
export const aiLogRouter = Router();
|
|
4
|
+
aiLogRouter.get('/logs', async (req, res) => {
|
|
5
|
+
const page = parseInt(req.query.page) || 1;
|
|
6
|
+
const pageSize = parseInt(req.query.pageSize) || 50;
|
|
7
|
+
try {
|
|
8
|
+
const result = aiLogService.getLogs(page, pageSize);
|
|
9
|
+
res.json({
|
|
10
|
+
success: true,
|
|
11
|
+
data: result,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
res.status(500).json({
|
|
16
|
+
success: false,
|
|
17
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=ai-log.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-log.routes.js","sourceRoot":"","sources":["../../src/api/ai-log.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;AAEpC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAkB,CAAC,IAAI,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.routes.d.ts","sourceRoot":"","sources":["../../src/api/chat.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"chat.routes.d.ts","sourceRoot":"","sources":["../../src/api/chat.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAmBH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,4CAAW,CAAC"}
|
package/dist/api/chat.routes.js
CHANGED
|
@@ -21,6 +21,15 @@ import { aiService } from '../modules/ai/index.js';
|
|
|
21
21
|
import { sessionService } from '../modules/session/index.js';
|
|
22
22
|
import { memoryService } from '../modules/memory/index.js';
|
|
23
23
|
import { logger } from '../modules/logger/logger.js';
|
|
24
|
+
import { aiLogService } from '../modules/ai/ai-log.service.js';
|
|
25
|
+
import { configService } from '../modules/config/config.service.js';
|
|
26
|
+
function calculateCost(usage) {
|
|
27
|
+
if (!usage)
|
|
28
|
+
return 0;
|
|
29
|
+
const promptCost = (usage.promptTokens || 0) * 0.00015 / 1000;
|
|
30
|
+
const completionCost = (usage.completionTokens || 0) * 0.0006 / 1000;
|
|
31
|
+
return promptCost + completionCost;
|
|
32
|
+
}
|
|
24
33
|
/**
|
|
25
34
|
* 创建聊天路由 Router
|
|
26
35
|
*
|
|
@@ -82,6 +91,8 @@ chatRouter.post('/', async (req, res) => {
|
|
|
82
91
|
// ========== 步骤 3: 切换到当前会话 ==========
|
|
83
92
|
// 设置当前会话为活跃状态,后续操作都基于此会话
|
|
84
93
|
sessionService.switchTo(session.id);
|
|
94
|
+
// ========== 记录请求开始时间 ==========
|
|
95
|
+
const requestStartTime = Date.now();
|
|
85
96
|
// ========== 步骤 4: 准备 ReAct 执行 ==========
|
|
86
97
|
// 创建数组存储 ReAct 执行过程中的每一步
|
|
87
98
|
// 用于返回给客户端,便于调试和展示思考过程
|
|
@@ -105,7 +116,7 @@ chatRouter.post('/', async (req, res) => {
|
|
|
105
116
|
* - memoryService: 记忆服务
|
|
106
117
|
* - onStep: 每一步执行完的回调 (用于收集步骤)
|
|
107
118
|
*/
|
|
108
|
-
const result = await aiService.
|
|
119
|
+
const result = await aiService.chatWithTools(message, {
|
|
109
120
|
sessionId: session.id,
|
|
110
121
|
projectPath: session.projectPath || undefined,
|
|
111
122
|
memoryService,
|
|
@@ -127,6 +138,24 @@ chatRouter.post('/', async (req, res) => {
|
|
|
127
138
|
});
|
|
128
139
|
},
|
|
129
140
|
});
|
|
141
|
+
// ========== 记录 AI 调用日志 ==========
|
|
142
|
+
const requestEndTime = Date.now();
|
|
143
|
+
const durationMs = requestEndTime - requestStartTime;
|
|
144
|
+
const providerConfig = configService.getDefaultProvider();
|
|
145
|
+
const models = providerConfig ? configService.getModels(providerConfig.id) : [];
|
|
146
|
+
const defaultModel = models.find(m => m.enabled) || { name: 'gpt-4' };
|
|
147
|
+
aiLogService.logAiCall({
|
|
148
|
+
model_address: providerConfig?.baseUrl || '',
|
|
149
|
+
model_name: defaultModel?.name || '',
|
|
150
|
+
request_time: new Date(requestStartTime),
|
|
151
|
+
response_time: new Date(requestEndTime),
|
|
152
|
+
duration_ms: durationMs,
|
|
153
|
+
input_tokens: result.usage?.promptTokens || 0,
|
|
154
|
+
output_tokens: result.usage?.completionTokens || 0,
|
|
155
|
+
cost: calculateCost(result.usage),
|
|
156
|
+
call_type: reactSteps.length > 0 ? 'tool_call' : 'normal',
|
|
157
|
+
session_id: session.id,
|
|
158
|
+
});
|
|
130
159
|
// ========== 步骤 5: 返回响应 ==========
|
|
131
160
|
const lastStep = result.steps[result.steps.length - 1];
|
|
132
161
|
const lastThought = lastStep && 'thought' in lastStep ? lastStep.thought : undefined;
|
|
@@ -137,6 +166,11 @@ chatRouter.post('/', async (req, res) => {
|
|
|
137
166
|
iterations: result.iterations,
|
|
138
167
|
success: result.success,
|
|
139
168
|
error: result.error,
|
|
169
|
+
usage: result.usage ? {
|
|
170
|
+
promptTokens: result.usage.promptTokens,
|
|
171
|
+
completionTokens: result.usage.completionTokens,
|
|
172
|
+
totalTokens: result.usage.totalTokens,
|
|
173
|
+
} : undefined,
|
|
140
174
|
};
|
|
141
175
|
// 记录响应日志
|
|
142
176
|
logger.logResponse('/api/chat', responseData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.routes.js","sourceRoot":"","sources":["../../src/api/chat.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.routes.js","sourceRoot":"","sources":["../../src/api/chat.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,SAAS,aAAa,CAAC,KAA4D;IACjF,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;IAC9D,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACrE,OAAO,UAAU,GAAG,cAAc,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACzD,qCAAqC;IACrC,gBAAgB;IAChB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAmB,CAAC;IAE3E,SAAS;IACT,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,sCAAsC;QACtC;;;;;;;;WAQG;QACH,IAAI,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,uBAAuB;YACvB,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3D,CAAC;QAED,sCAAsC;QACtC,yBAAyB;QACzB,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEpC,iCAAiC;QACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEpC,0CAA0C;QAC1C,yBAAyB;QACzB,uBAAuB;QACvB,MAAM,UAAU,GAAU,EAAE,CAAC;QAE7B;;;;;;;;;;;;;;;;;;WAkBG;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE;YACpD,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS;YAC7C,aAAa;YACb,gCAAgC;YAChC,gDAAgD;YAChD,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;gBAC1B,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA2C,EAAE,EAAE,CAAC,CAAC;oBACzF,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,WAAW,EAAE,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;wBAC5C,CAAC,CAAC,CAAC,CAAC,WAAW;wBACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;iBAClC,CAAC,CAAC,CAAC;gBAEJ,UAAU,CAAC,IAAI,CAAC;oBACd,SAAS,EAA8B,SAAS;oBAChD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAkB,WAAW;oBAClD,OAAO,EAAgC,WAAW;oBAClD,WAAW,EAAE,IAAI,CAAC,WAAW,EAAU,SAAS;oBAChD,WAAW,EAAE,IAAI,CAAC,WAAW,EAAU,YAAY;iBACpD,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,cAAc,GAAG,gBAAgB,CAAC;QAErD,MAAM,cAAc,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAEtE,YAAY,CAAC,SAAS,CAAC;YACrB,aAAa,EAAE,cAAc,EAAE,OAAO,IAAI,EAAE;YAC5C,UAAU,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE;YACpC,YAAY,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC;YACxC,aAAa,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC;YACvC,WAAW,EAAE,UAAU;YACvB,YAAY,EAAG,MAAc,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;YACtD,aAAa,EAAG,MAAc,CAAC,KAAK,EAAE,gBAAgB,IAAI,CAAC;YAC3D,IAAI,EAAE,aAAa,CAAE,MAAc,CAAC,KAAK,CAAC;YAC1C,SAAS,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;YACzD,UAAU,EAAE,OAAO,CAAC,EAAE;SACvB,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,QAAQ,IAAI,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAE,QAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,MAAM,YAAY,GAAG;YACnB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,IAAI,WAAW;YACtC,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YAC1D,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACpB,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;gBACvC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB;gBAC/C,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;aACtC,CAAC,CAAC,CAAC,SAAS;SACd,CAAC;QAEF,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAE9C,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6BAA6B;QAC7B,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAE3G,iBAAiB;QACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC/D,mCAAmC;IACnC,2CAA2C;IAC3C,iCAAiC;IACjC,iCAAiC;IACjC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAE1C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAAmB,CAAC;IAEpE,IAAI,CAAC;QACH,6BAA6B;QAC7B,IAAI,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3D,CAAC;QAED,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEpC,kCAAkC;QAClC,yBAAyB;QACzB,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAE5D,+BAA+B;QAC/B,qBAAqB;QACrB,MAAM,QAAQ,GAAG,aAAa,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEhE,gCAAgC;QAChC,6BAA6B;QAC7B,mCAAmC;QACnC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,CAAC,UAAU,CAC5C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAC1D,EAAE,CAAC;YACF,8BAA8B;YAC9B,gCAAgC;YAChC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;QAED,+BAA+B;QAC/B,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC9B,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6BAA6B;QAC7B,cAAc;QACd,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;QAC9G,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,UAAU,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAK,GAAW,CAAC,UAAU,EAAE,CAAC;gBACnD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACpD,SAAS,GAAG,IAAI,CAAC;gBACnB,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEpD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,MAAM,EAAE,EAAE;wBACV,KAAK,EAAE,EAAE;wBACT,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBAChC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA2C,EAAE,EAAE,CAAC,CAAC;4BACzF,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;yBACtH,CAAC,CAAC,CAAC;wBACJ,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,MAAM;4BACZ,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;4BAC3B,OAAO;4BACP,OAAO,EAAE,IAAI;yBACd,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -26,6 +26,27 @@ configRouter.get('/providers', (req, res) => {
|
|
|
26
26
|
})),
|
|
27
27
|
});
|
|
28
28
|
});
|
|
29
|
+
/**
|
|
30
|
+
* 获取单个提供商(包含 API Key)
|
|
31
|
+
*/
|
|
32
|
+
configRouter.get('/providers/:id', (req, res) => {
|
|
33
|
+
const id = String(req.params.id);
|
|
34
|
+
const provider = configService.getProvider(id);
|
|
35
|
+
if (!provider) {
|
|
36
|
+
return res.status(404).json({ success: false, error: 'Provider not found' });
|
|
37
|
+
}
|
|
38
|
+
res.json({
|
|
39
|
+
success: true,
|
|
40
|
+
data: {
|
|
41
|
+
id: provider.id,
|
|
42
|
+
name: provider.name,
|
|
43
|
+
apiKey: provider.apiKey,
|
|
44
|
+
baseUrl: provider.baseUrl,
|
|
45
|
+
enabled: provider.enabled,
|
|
46
|
+
isDefault: provider.isDefault,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
});
|
|
29
50
|
/**
|
|
30
51
|
* 添加提供商
|
|
31
52
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.routes.js","sourceRoot":"","sources":["../../src/api/config.routes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.routes.js","sourceRoot":"","sources":["../../src/api/config.routes.ts"],"names":[],"mappings":"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"}
|
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,eAAO,MAAM,SAAS,4CAAW,CAAC;AAalC,cAAc,gBAAgB,CAAC"}
|
package/dist/api/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { projectsRouter } from './projects.routes.js';
|
|
|
11
11
|
import { dbRouter } from './db.routes.js';
|
|
12
12
|
import { filesRouter } from './files.routes.js';
|
|
13
13
|
import { filesystemRouter } from './filesystem.routes.js';
|
|
14
|
+
import { aiLogRouter } from './ai-log.routes.js';
|
|
14
15
|
export const apiRouter = Router();
|
|
15
16
|
apiRouter.use('/chat', chatRouter);
|
|
16
17
|
apiRouter.use('/sessions', sessionRouter);
|
|
@@ -21,5 +22,6 @@ apiRouter.use('/projects', projectsRouter);
|
|
|
21
22
|
apiRouter.use('/db', dbRouter);
|
|
22
23
|
apiRouter.use('/files', filesRouter);
|
|
23
24
|
apiRouter.use('/filesystem', filesystemRouter);
|
|
25
|
+
apiRouter.use('/ai-logs', aiLogRouter);
|
|
24
26
|
export * from './api.types.js';
|
|
25
27
|
//# sourceMappingURL=index.js.map
|
package/dist/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;AAElC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACnC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1C,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACjC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAC3C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACrC,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAC/C,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAEvC,cAAc,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAuBhE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,GAAG,sBAyxBlB"}
|
package/dist/components/App.js
CHANGED
|
@@ -21,6 +21,7 @@ import { executeCommand } from '../cli/commands.js';
|
|
|
21
21
|
import { sessionService } from '../modules/session/index.js';
|
|
22
22
|
import { memoryService } from '../modules/memory/index.js';
|
|
23
23
|
import { aiService } from '../modules/ai/index.js';
|
|
24
|
+
import { dbService } from '../modules/db/index.js';
|
|
24
25
|
/**
|
|
25
26
|
* App 主组件函数
|
|
26
27
|
*
|
|
@@ -50,7 +51,7 @@ export function App() {
|
|
|
50
51
|
// ========== 消息相关状态 ==========
|
|
51
52
|
/** 聊天消息列表 */
|
|
52
53
|
const [messages, setMessages] = useState([]);
|
|
53
|
-
/** 当前状态:idle(空闲) 或 thinking(AI 思考中) */
|
|
54
|
+
/** 当前状态:idle(空闲) 或 thinking(AI 思考中) 或 stopping(正在停止) */
|
|
54
55
|
const [status, setStatus] = useState('idle');
|
|
55
56
|
/** 当前会话 ID */
|
|
56
57
|
const [currentSession, setCurrentSession] = useState(null);
|
|
@@ -90,6 +91,39 @@ export function App() {
|
|
|
90
91
|
const [inputHistory, setInputHistory] = useState([]);
|
|
91
92
|
/** 当前历史记录索引 */
|
|
92
93
|
const [historyIndex, setHistoryIndex] = useState(-1);
|
|
94
|
+
// ========== 动画相关状态 ==========
|
|
95
|
+
/** 三点动画字符 */
|
|
96
|
+
const [dotAnimation, setDotAnimation] = useState('');
|
|
97
|
+
// ========== AI 停止控制 ==========
|
|
98
|
+
/** AbortController 用于停止 AI 调用 */
|
|
99
|
+
const abortControllerRef = React.useRef(null);
|
|
100
|
+
// ========== 程序退出时保存数据库 ==========
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
const handleExit = () => {
|
|
103
|
+
dbService.close();
|
|
104
|
+
};
|
|
105
|
+
process.on('exit', handleExit);
|
|
106
|
+
process.on('SIGINT', handleExit);
|
|
107
|
+
return () => {
|
|
108
|
+
process.off('exit', handleExit);
|
|
109
|
+
process.off('SIGINT', handleExit);
|
|
110
|
+
};
|
|
111
|
+
}, []);
|
|
112
|
+
// ========== 三点动画效果 ==========
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
if (status === 'thinking') {
|
|
115
|
+
const dots = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧'];
|
|
116
|
+
let i = 0;
|
|
117
|
+
const interval = setInterval(() => {
|
|
118
|
+
setDotAnimation(dots[i % dots.length]);
|
|
119
|
+
i++;
|
|
120
|
+
}, 150);
|
|
121
|
+
return () => clearInterval(interval);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
setDotAnimation('');
|
|
125
|
+
}
|
|
126
|
+
}, [status]);
|
|
93
127
|
// ========== 辅助函数 ==========
|
|
94
128
|
/**
|
|
95
129
|
* 加载目录内容 - 用于文件选择器
|
|
@@ -263,6 +297,7 @@ export function App() {
|
|
|
263
297
|
addMessage('system', result.message);
|
|
264
298
|
}
|
|
265
299
|
if (result.data?.exit) {
|
|
300
|
+
dbService.close();
|
|
266
301
|
exit();
|
|
267
302
|
}
|
|
268
303
|
if (result.data?.id && result.success) {
|
|
@@ -279,10 +314,12 @@ export function App() {
|
|
|
279
314
|
sessionService.switchTo(sessionId);
|
|
280
315
|
}
|
|
281
316
|
setStatus('thinking');
|
|
317
|
+
abortControllerRef.current = new AbortController();
|
|
282
318
|
try {
|
|
283
|
-
const result = await aiService.
|
|
319
|
+
const result = await aiService.chatWithTools(trimmedInput, {
|
|
284
320
|
sessionId: sessionId,
|
|
285
321
|
memoryService,
|
|
322
|
+
abortSignal: abortControllerRef.current.signal,
|
|
286
323
|
onStep: (state, iteration) => {
|
|
287
324
|
if (state.thought) {
|
|
288
325
|
const thoughtPreview = state.thought.length > 150
|
|
@@ -405,11 +442,11 @@ export function App() {
|
|
|
405
442
|
memoryService.addMessage(sessionId, 'assistant', result.answer, true);
|
|
406
443
|
}
|
|
407
444
|
if (result.usage) {
|
|
408
|
-
setTokenStats(
|
|
409
|
-
promptTokens:
|
|
410
|
-
completionTokens:
|
|
411
|
-
totalTokens:
|
|
412
|
-
})
|
|
445
|
+
setTokenStats({
|
|
446
|
+
promptTokens: result.usage.promptTokens,
|
|
447
|
+
completionTokens: result.usage.completionTokens,
|
|
448
|
+
totalTokens: result.usage.totalTokens,
|
|
449
|
+
});
|
|
413
450
|
}
|
|
414
451
|
if (sessionId) {
|
|
415
452
|
const stats = memoryService.getSessionStats(sessionId);
|
|
@@ -421,10 +458,16 @@ export function App() {
|
|
|
421
458
|
}
|
|
422
459
|
catch (err) {
|
|
423
460
|
const errorMsg = err instanceof Error ? err.message : 'Unknown error';
|
|
424
|
-
|
|
425
|
-
|
|
461
|
+
if (errorMsg === 'ABORTED') {
|
|
462
|
+
addMessage('system', '已停止');
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
setError(errorMsg);
|
|
466
|
+
addMessage('system', `错误: ${errorMsg}`);
|
|
467
|
+
}
|
|
426
468
|
}
|
|
427
469
|
finally {
|
|
470
|
+
abortControllerRef.current = null;
|
|
428
471
|
setStatus('idle');
|
|
429
472
|
}
|
|
430
473
|
}, [input, status, currentSession, addMessage, exit]);
|
|
@@ -566,7 +609,14 @@ export function App() {
|
|
|
566
609
|
}
|
|
567
610
|
}
|
|
568
611
|
else if (key.escape) {
|
|
569
|
-
|
|
612
|
+
if (status === 'thinking' && abortControllerRef.current) {
|
|
613
|
+
setStatus('stopping');
|
|
614
|
+
abortControllerRef.current.abort();
|
|
615
|
+
}
|
|
616
|
+
else if (status === 'idle') {
|
|
617
|
+
dbService.close();
|
|
618
|
+
exit();
|
|
619
|
+
}
|
|
570
620
|
}
|
|
571
621
|
else if (char && !key.ctrl && !key.meta) {
|
|
572
622
|
const newInput = input.slice(0, cursorPosition) + char + input.slice(cursorPosition);
|
|
@@ -644,12 +694,15 @@ export function App() {
|
|
|
644
694
|
React.createElement(Text, { bold: true, color: "cyan" }, "\u25A3 Build"),
|
|
645
695
|
React.createElement(Text, { dimColor: true },
|
|
646
696
|
" \u00B7 ",
|
|
647
|
-
currentModelName)
|
|
697
|
+
currentModelName),
|
|
698
|
+
React.createElement(Text, { dimColor: true }, " \u00B7 \u6309 ESC \u505C\u6B62..."))),
|
|
699
|
+
status === 'stopping' && (React.createElement(Box, { marginBottom: 1, paddingLeft: 2 },
|
|
700
|
+
React.createElement(Text, { bold: true, color: "yellow" }, "\u25A0 \u6B63\u5728\u505C\u6B62...")))),
|
|
648
701
|
React.createElement(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, marginBottom: 1 },
|
|
649
702
|
React.createElement(Text, { dimColor: true }, '> '),
|
|
650
|
-
React.createElement(Text, null, input.slice(0, cursorPosition)),
|
|
703
|
+
React.createElement(Text, null, status === 'stopping' ? '等待停止...' : input.slice(0, cursorPosition)),
|
|
651
704
|
React.createElement(Text, { color: "cyan" }, "\u258B"),
|
|
652
|
-
React.createElement(Text, null, input.slice(cursorPosition))),
|
|
705
|
+
React.createElement(Text, null, status === 'stopping' ? '' : input.slice(cursorPosition))),
|
|
653
706
|
fileSelectMode && (React.createElement(Box, { flexDirection: "column", marginBottom: 1, paddingX: 1 },
|
|
654
707
|
React.createElement(Text, { dimColor: true },
|
|
655
708
|
currentDir || '/',
|
|
@@ -664,12 +717,11 @@ export function App() {
|
|
|
664
717
|
modelList.length === 0 && (React.createElement(Text, { dimColor: true }, "\u672A\u627E\u5230\u6A21\u578B...")))),
|
|
665
718
|
React.createElement(Box, { paddingX: 2 },
|
|
666
719
|
React.createElement(Text, { dimColor: true },
|
|
667
|
-
|
|
668
|
-
currentModelName
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
` |
|
|
672
|
-
' | /help 帮助 | ESC 退出')),
|
|
720
|
+
status === 'thinking' ? `${dotAnimation} 思考中` : '✓ 就绪',
|
|
721
|
+
` | 模型:${currentModelName}`,
|
|
722
|
+
` | 会话:${sessionText}`,
|
|
723
|
+
` | token:(${tokenStats.promptTokens}${tokenStats.promptTokens > 50000 ? ' 会话太大推荐用/compact压缩会话' : ''})`,
|
|
724
|
+
` | 帮助 /help | 退出 ctrl+c`)),
|
|
673
725
|
error && (React.createElement(Box, { marginTop: 1 },
|
|
674
726
|
React.createElement(Text, { color: "red" },
|
|
675
727
|
"\u9519\u8BEF: ",
|