vue-agent-start 0.1.0

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 (169) hide show
  1. package/package.json +30 -0
  2. package/pnpm-workspace.yaml +3 -0
  3. package/src/agent-flow/adapter/backend.ts +99 -0
  4. package/src/agent-flow/components/ChatIframePanel.vue +773 -0
  5. package/src/agent-flow/components/DatasetItemCard.vue +313 -0
  6. package/src/agent-flow/components/MemoryWindow.vue +104 -0
  7. package/src/agent-flow/components/PromptEditor.vue +804 -0
  8. package/src/agent-flow/components/PromptEditorTagPanel.vue +460 -0
  9. package/src/agent-flow/components/SvgIcon.vue +32 -0
  10. package/src/agent-flow/components/ToolItemCard.vue +169 -0
  11. package/src/agent-flow/components/VariableCard.vue +161 -0
  12. package/src/agent-flow/components/VariableSelector.vue +162 -0
  13. package/src/agent-flow/components/chat-iframe-types.ts +35 -0
  14. package/src/agent-flow/components/stubs/DatasetChooser.vue +70 -0
  15. package/src/agent-flow/components/stubs/Embedding.vue +22 -0
  16. package/src/agent-flow/components/stubs/ModelSelect.vue +24 -0
  17. package/src/agent-flow/components/stubs/RestfulSelectCard.vue +24 -0
  18. package/src/agent-flow/components/stubs/ToolChooser.vue +96 -0
  19. package/src/agent-flow/components/stubs/TriggersItemCard.vue +126 -0
  20. package/src/agent-flow/components/stubs/VariableModal.vue +115 -0
  21. package/src/agent-flow/index.ts +73 -0
  22. package/src/agent-flow/stores/workflow.ts +72 -0
  23. package/src/agent-flow/utils/langUtils.ts +173 -0
  24. package/src/agent-flow/workflow/Ability.vue +65 -0
  25. package/src/agent-flow/workflow/AuthorizationItem.vue +101 -0
  26. package/src/agent-flow/workflow/ConversationVar.vue +42 -0
  27. package/src/agent-flow/workflow/CustomEdge.vue +94 -0
  28. package/src/agent-flow/workflow/EnvironmentVar.vue +40 -0
  29. package/src/agent-flow/workflow/FlowDesigner.vue +2802 -0
  30. package/src/agent-flow/workflow/Icon.vue +179 -0
  31. package/src/agent-flow/workflow/NodeConfig.vue +509 -0
  32. package/src/agent-flow/workflow/NodeConfigCard.vue +460 -0
  33. package/src/agent-flow/workflow/NodeHandle.vue +147 -0
  34. package/src/agent-flow/workflow/NodeHeaderToolbar.vue +77 -0
  35. package/src/agent-flow/workflow/NodeHoverToolbar.vue +176 -0
  36. package/src/agent-flow/workflow/OutputItemCard.vue +668 -0
  37. package/src/agent-flow/workflow/ParamTableItem.vue +200 -0
  38. package/src/agent-flow/workflow/StructTable.vue +202 -0
  39. package/src/agent-flow/workflow/VarInsertField.vue +517 -0
  40. package/src/agent-flow/workflow/VarSelectField.vue +223 -0
  41. package/src/agent-flow/workflow/VariableSelectorItem.vue +48 -0
  42. package/src/agent-flow/workflow/WfField.vue +206 -0
  43. package/src/agent-flow/workflow/_config-base.css +470 -0
  44. package/src/agent-flow/workflow/composables/useNode.js +55 -0
  45. package/src/agent-flow/workflow/index.vue +53 -0
  46. package/src/agent-flow/workflow/nodeCard/AgentNodeCard.vue +180 -0
  47. package/src/agent-flow/workflow/nodeCard/AnswerNodeCard.vue +65 -0
  48. package/src/agent-flow/workflow/nodeCard/ClassifierCard.vue +152 -0
  49. package/src/agent-flow/workflow/nodeCard/CodeNodeCard.vue +139 -0
  50. package/src/agent-flow/workflow/nodeCard/ConditionNodeCard.vue +323 -0
  51. package/src/agent-flow/workflow/nodeCard/DocumentExtractorCard.vue +83 -0
  52. package/src/agent-flow/workflow/nodeCard/EndNodeCard.vue +123 -0
  53. package/src/agent-flow/workflow/nodeCard/HttpNodeCard.vue +451 -0
  54. package/src/agent-flow/workflow/nodeCard/HumanInputCard.vue +152 -0
  55. package/src/agent-flow/workflow/nodeCard/IterationCard.vue +66 -0
  56. package/src/agent-flow/workflow/nodeCard/KnowledgeRetrievalCard.vue +48 -0
  57. package/src/agent-flow/workflow/nodeCard/LLMNodeCard.vue +206 -0
  58. package/src/agent-flow/workflow/nodeCard/ListOperatorCard.vue +188 -0
  59. package/src/agent-flow/workflow/nodeCard/ParameterExtractorCard.vue +352 -0
  60. package/src/agent-flow/workflow/nodeCard/ServiceApiNodeCard.vue +188 -0
  61. package/src/agent-flow/workflow/nodeCard/StartNodeCard.vue +216 -0
  62. package/src/agent-flow/workflow/nodeCard/VariableAssignerCard.vue +125 -0
  63. package/src/agent-flow/workflow/nodeCard/VariableNodeCard.vue +121 -0
  64. package/src/agent-flow/workflow/nodes/AgentNode.vue +122 -0
  65. package/src/agent-flow/workflow/nodes/AnswerNode.vue +99 -0
  66. package/src/agent-flow/workflow/nodes/ClassifierNode.vue +199 -0
  67. package/src/agent-flow/workflow/nodes/CodeNode.vue +152 -0
  68. package/src/agent-flow/workflow/nodes/ConditionNode.vue +232 -0
  69. package/src/agent-flow/workflow/nodes/DocumentExtractorNode.vue +96 -0
  70. package/src/agent-flow/workflow/nodes/EndNode.vue +119 -0
  71. package/src/agent-flow/workflow/nodes/FileUploadNode.vue +97 -0
  72. package/src/agent-flow/workflow/nodes/HttpNode.vue +204 -0
  73. package/src/agent-flow/workflow/nodes/HumanInputNode.vue +110 -0
  74. package/src/agent-flow/workflow/nodes/IterationNode.vue +98 -0
  75. package/src/agent-flow/workflow/nodes/KnowledgeRetrievalNode.vue +253 -0
  76. package/src/agent-flow/workflow/nodes/LLMNode.vue +134 -0
  77. package/src/agent-flow/workflow/nodes/ListOperatorNode.vue +111 -0
  78. package/src/agent-flow/workflow/nodes/LoopNode.vue +94 -0
  79. package/src/agent-flow/workflow/nodes/ParameterExtractorNode.vue +147 -0
  80. package/src/agent-flow/workflow/nodes/ServiceApiNode.vue +161 -0
  81. package/src/agent-flow/workflow/nodes/StartNode.vue +199 -0
  82. package/src/agent-flow/workflow/nodes/TemplateNode.vue +103 -0
  83. package/src/agent-flow/workflow/nodes/UserInputNode.vue +92 -0
  84. package/src/agent-flow/workflow/nodes/VariableAssignerNode.vue +145 -0
  85. package/src/agent-flow/workflow/nodes/VariableNode.vue +130 -0
  86. package/src/agent-flow/workflow/nodes/_node-base.css +338 -0
  87. package/src/agent-flow/workflow/utils/node_card_form.ts +335 -0
  88. package/src/agent-flow/workflow/utils/node_config.ts +63 -0
  89. package/src/agent-flow/workflow/utils/workflow_utils.ts +151 -0
  90. package/src/agent-studio/adapters/springAgentStart.ts +390 -0
  91. package/src/agent-studio/api/index.ts +1 -0
  92. package/src/agent-studio/api/types.ts +173 -0
  93. package/src/agent-studio/components/AgentApiDocs.vue +500 -0
  94. package/src/agent-studio/components/AgentAppsPage.vue +1601 -0
  95. package/src/agent-studio/components/AgentCardGrid.vue +259 -0
  96. package/src/agent-studio/components/AgentChatPage.vue +553 -0
  97. package/src/agent-studio/components/AgentDebugPanel.vue +350 -0
  98. package/src/agent-studio/components/AgentLogsPanel.vue +391 -0
  99. package/src/agent-studio/components/AgentMonitorPanel.vue +204 -0
  100. package/src/agent-studio/components/AgentOrchestrate.vue +505 -0
  101. package/src/agent-studio/components/AgentPromptEditor.vue +237 -0
  102. package/src/agent-studio/components/AgentStudioShell.vue +227 -0
  103. package/src/agent-studio/components/AgentToolsPanel.vue +394 -0
  104. package/src/agent-studio/components/AgentVariablesPanel.vue +205 -0
  105. package/src/agent-studio/components/ApiKeyManager.vue +251 -0
  106. package/src/agent-studio/components/AppDesignDrawer.vue +3391 -0
  107. package/src/agent-studio/components/CreateAppModal.vue +737 -0
  108. package/src/agent-studio/components/SparkChart.vue +200 -0
  109. package/src/agent-studio/components/VariableEditorModal.vue +499 -0
  110. package/src/agent-studio/composables/useAgentStudio.ts +347 -0
  111. package/src/agent-studio/index.ts +60 -0
  112. package/src/agent-studio/panels/DrawerFlowDesigner.vue +203 -0
  113. package/src/agent-studio/panels/LogAnnotationPanel.vue +490 -0
  114. package/src/agent-studio/panels/MonitorPanel.vue +535 -0
  115. package/src/agent-studio/types.ts +242 -0
  116. package/src/index.ts +155 -0
  117. package/src/knowledge-hub/adapters/springAgentStart.ts +472 -0
  118. package/src/knowledge-hub/components/AddDocumentsWizard.vue +1452 -0
  119. package/src/knowledge-hub/components/CreateDatasetWizard.vue +1723 -0
  120. package/src/knowledge-hub/components/DatasetCardGrid.vue +467 -0
  121. package/src/knowledge-hub/components/DatasetDetailDrawer.vue +888 -0
  122. package/src/knowledge-hub/components/DatasetPicker.vue +65 -0
  123. package/src/knowledge-hub/components/DatasetPickerModal.vue +526 -0
  124. package/src/knowledge-hub/components/DatasetSettingsPanel.vue +908 -0
  125. package/src/knowledge-hub/components/DatasetSidebar.vue +781 -0
  126. package/src/knowledge-hub/components/DocumentChunksView.vue +802 -0
  127. package/src/knowledge-hub/components/DocumentTable.vue +552 -0
  128. package/src/knowledge-hub/components/HitTestingPanel.vue +74 -0
  129. package/src/knowledge-hub/components/KnowledgeApp.vue +66 -0
  130. package/src/knowledge-hub/components/KnowledgeHubApp.vue +504 -0
  131. package/src/knowledge-hub/components/RecallTestingPanelV2.vue +515 -0
  132. package/src/knowledge-hub/components/RetrievalConfigPopover.vue +270 -0
  133. package/src/knowledge-hub/components/RetrievalMethodPicker.vue +547 -0
  134. package/src/knowledge-hub/components/RetrievedList.vue +24 -0
  135. package/src/knowledge-hub/components/internal/KhDialog.vue +195 -0
  136. package/src/knowledge-hub/composables/useKnowledge.ts +89 -0
  137. package/src/knowledge-hub/i18n/index.ts +2 -0
  138. package/src/knowledge-hub/i18n/messages.ts +422 -0
  139. package/src/knowledge-hub/i18n/useKhI18n.ts +107 -0
  140. package/src/knowledge-hub/index.ts +46 -0
  141. package/src/knowledge-hub/styles/index.css +4 -0
  142. package/src/knowledge-hub/styles/tokens.css +138 -0
  143. package/src/knowledge-hub/types/api.ts +213 -0
  144. package/src/knowledge-hub/types/dataset.ts +88 -0
  145. package/src/knowledge-hub/types/document.ts +45 -0
  146. package/src/knowledge-hub/types/index.ts +9 -0
  147. package/src/knowledge-hub/types/retrieval.ts +46 -0
  148. package/src/provider-hub/components/CredentialForm.vue +103 -0
  149. package/src/provider-hub/components/DefaultModelsPanel.vue +270 -0
  150. package/src/provider-hub/components/GroupedModelSelect.vue +445 -0
  151. package/src/provider-hub/components/ModelCardGrid.vue +332 -0
  152. package/src/provider-hub/components/ModelParameterDrawer.vue +739 -0
  153. package/src/provider-hub/components/ModelPickerPopover.vue +1282 -0
  154. package/src/provider-hub/components/ProviderApp.vue +159 -0
  155. package/src/provider-hub/components/ProviderCredentialModal.vue +321 -0
  156. package/src/provider-hub/components/ProviderGallery.vue +131 -0
  157. package/src/provider-hub/components/ProviderHubShell.vue +1992 -0
  158. package/src/provider-hub/components/ProviderIcon.vue +130 -0
  159. package/src/provider-hub/composables/useProviderHub.ts +358 -0
  160. package/src/provider-hub/index.ts +43 -0
  161. package/src/provider-hub/svg/MiniMax.svg +1 -0
  162. package/src/provider-hub/svg/Volcengine.svg +1 -0
  163. package/src/provider-hub/svg/Zhipu.svg +1 -0
  164. package/src/provider-hub/svg/deepseek.svg +1 -0
  165. package/src/provider-hub/svg/moonshot.svg +1 -0
  166. package/src/provider-hub/svg/openai.svg +1 -0
  167. package/src/provider-hub/svg/qwen.svg +1 -0
  168. package/src/provider-hub/svg/siliconflow.svg +1 -0
  169. package/src/provider-hub/types.ts +256 -0
@@ -0,0 +1,332 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * ModelCardGrid — Dify-style card grid of already-configured models, grouped
4
+ * by provider. Each card has a hover "⋯" menu wired via events so the host app
5
+ * decides which ops it wants (edit credentials / set default / delete / test).
6
+ */
7
+ import { computed, ref } from 'vue';
8
+
9
+ import {
10
+ modelTypeColor,
11
+ modelTypeLabel,
12
+ useProviderHub,
13
+ } from '../composables/useProviderHub';
14
+ import type { ModelEntity, ModelTestResult, ProviderView } from '../types';
15
+ import ProviderIcon from './ProviderIcon.vue';
16
+
17
+ interface Props {
18
+ models: ModelEntity[];
19
+ providers: ProviderView[];
20
+ /** When true, expose an inline "🔍 测试" button on every card. */
21
+ showTestButton?: boolean;
22
+ }
23
+
24
+ const props = withDefaults(defineProps<Props>(), {
25
+ showTestButton: true,
26
+ });
27
+
28
+ const emit = defineEmits<{
29
+ (e: 'editCredentials', model: ModelEntity): void;
30
+ (e: 'setDefault', model: ModelEntity): void;
31
+ (e: 'delete', model: ModelEntity): void;
32
+ (e: 'test', model: ModelEntity, result: ModelTestResult): void;
33
+ }>();
34
+
35
+ const { testModel } = useProviderHub();
36
+
37
+ // Per-model test result cache keyed by model id. Persists for the lifetime of
38
+ // the component so a user can eyeball recent latencies without re-testing.
39
+ const testResults = ref<
40
+ Record<string, { ok: boolean; text: string; ts: number }>
41
+ >({});
42
+ const testingId = ref<null | string>(null);
43
+
44
+ async function runTest(m: ModelEntity) {
45
+ testingId.value = m.id;
46
+ try {
47
+ const r = await testModel(m.id);
48
+ const badge = r.ok ? '✓' : '✗';
49
+ const suffix = r.ok
50
+ ? r.kind === 'embedding'
51
+ ? `dim ${r.dimensions}`
52
+ : (r.snippet ?? 'ok').slice(0, 40)
53
+ : (r.error ?? 'failed');
54
+ testResults.value[m.id] = {
55
+ ok: !!r.ok,
56
+ text: `${badge} ${r.latencyMs}ms · ${suffix}`,
57
+ ts: Date.now(),
58
+ };
59
+ emit('test', m, r);
60
+ } catch (e: any) {
61
+ const txt = `✗ ${e?.message ?? e}`;
62
+ testResults.value[m.id] = { ok: false, text: txt, ts: Date.now() };
63
+ emit('test', m, { ok: false, latencyMs: 0, error: String(e) });
64
+ } finally {
65
+ testingId.value = null;
66
+ }
67
+ }
68
+
69
+ const grouped = computed(() => {
70
+ const acc: Record<string, ModelEntity[]> = {};
71
+ for (const m of props.models) {
72
+ (acc[m.providerName] ??= []).push(m);
73
+ }
74
+ return acc;
75
+ });
76
+
77
+ const providersWithModels = computed(() =>
78
+ Object.keys(grouped.value).sort(),
79
+ );
80
+
81
+ function providerLabel(name: string): string {
82
+ return props.providers.find((p) => p.name === name)?.label ?? name;
83
+ }
84
+ </script>
85
+
86
+ <template>
87
+ <div>
88
+ <div
89
+ v-for="provName in providersWithModels"
90
+ :key="provName"
91
+ class="ph-group"
92
+ >
93
+ <div class="ph-group-header">
94
+ <ProviderIcon :name="provName" :size="28" />
95
+ <div class="ph-group-name">{{ providerLabel(provName) }}</div>
96
+ <div class="ph-group-count">
97
+ {{ grouped[provName]?.length ?? 0 }} 个模型
98
+ </div>
99
+ </div>
100
+ <div class="ph-model-grid">
101
+ <div
102
+ v-for="m in grouped[provName] ?? []"
103
+ :key="m.id"
104
+ class="ph-model-card"
105
+ >
106
+ <div class="ph-model-header">
107
+ <ProviderIcon :name="m.providerName" :size="40" />
108
+ <div class="ph-title-wrap">
109
+ <div class="ph-title" :title="m.modelName">{{ m.modelName }}</div>
110
+ <div class="ph-tags">
111
+ <span
112
+ class="ph-type-tag"
113
+ :data-color="modelTypeColor(m.modelType)"
114
+ >
115
+ {{ modelTypeLabel(m.modelType) }}
116
+ </span>
117
+ <span v-if="m.isDefault" class="ph-default-tag">默认</span>
118
+ </div>
119
+ </div>
120
+ </div>
121
+
122
+ <div class="ph-desc">
123
+ <span
124
+ v-if="testResults[m.id]"
125
+ :class="testResults[m.id]!.ok ? 'ph-ok' : 'ph-fail'"
126
+ >
127
+ {{ testResults[m.id]!.text }}
128
+ </span>
129
+ <span v-else>{{ providerLabel(m.providerName) }} · 凭证加密存储</span>
130
+ </div>
131
+
132
+ <div class="ph-footer">
133
+ <span class="ph-status">
134
+ {{ m.enabled ? '✅ 已启用' : '⛔ 已停用' }}
135
+ </span>
136
+ <div class="ph-actions">
137
+ <button
138
+ v-if="showTestButton"
139
+ class="ph-btn"
140
+ :disabled="testingId === m.id"
141
+ @click.stop="runTest(m)"
142
+ >
143
+ {{ testingId === m.id ? '测试中...' : '🔍 测试' }}
144
+ </button>
145
+ <button
146
+ class="ph-btn"
147
+ @click.stop="emit('editCredentials', m)"
148
+ >
149
+ 编辑凭证
150
+ </button>
151
+ <button
152
+ v-if="!m.isDefault"
153
+ class="ph-btn"
154
+ @click.stop="emit('setDefault', m)"
155
+ >
156
+ 设为默认
157
+ </button>
158
+ <button
159
+ class="ph-btn ph-btn-danger"
160
+ @click.stop="emit('delete', m)"
161
+ >
162
+ 删除
163
+ </button>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </div>
168
+ </div>
169
+ </div>
170
+ </template>
171
+
172
+ <style scoped>
173
+ .ph-group {
174
+ margin-bottom: 20px;
175
+ }
176
+ .ph-group-header {
177
+ display: flex;
178
+ align-items: center;
179
+ gap: 8px;
180
+ margin-bottom: 10px;
181
+ }
182
+ .ph-group-icon {
183
+ width: 28px;
184
+ height: 28px;
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: center;
188
+ border-radius: 6px;
189
+ font-size: 16px;
190
+ flex-shrink: 0;
191
+ }
192
+ .ph-group-name {
193
+ font-size: 15px;
194
+ font-weight: 500;
195
+ color: #111827;
196
+ }
197
+ .ph-group-count {
198
+ padding: 1px 8px;
199
+ font-size: 11px;
200
+ border-radius: 10px;
201
+ background: #eef2ff;
202
+ color: #4338ca;
203
+ }
204
+ .ph-model-grid {
205
+ display: grid;
206
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
207
+ gap: 12px;
208
+ }
209
+ .ph-model-card {
210
+ padding: 14px 16px 12px;
211
+ background: #fff;
212
+ border: 1px solid #e5e7eb;
213
+ border-radius: 12px;
214
+ display: flex;
215
+ flex-direction: column;
216
+ transition:
217
+ box-shadow 0.15s ease,
218
+ transform 0.15s ease;
219
+ }
220
+ .ph-model-card:hover {
221
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.08);
222
+ transform: translateY(-1px);
223
+ }
224
+ .ph-model-header {
225
+ display: flex;
226
+ gap: 12px;
227
+ align-items: flex-start;
228
+ }
229
+ .ph-icon {
230
+ width: 40px;
231
+ height: 40px;
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ border-radius: 8px;
236
+ font-size: 22px;
237
+ flex-shrink: 0;
238
+ }
239
+ .ph-title-wrap {
240
+ min-width: 0;
241
+ flex: 1;
242
+ }
243
+ .ph-title {
244
+ font-size: 15px;
245
+ font-weight: 600;
246
+ color: #111827;
247
+ white-space: nowrap;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ }
251
+ .ph-tags {
252
+ margin-top: 4px;
253
+ display: flex;
254
+ gap: 4px;
255
+ }
256
+ .ph-type-tag {
257
+ padding: 1px 6px;
258
+ font-size: 11px;
259
+ border-radius: 4px;
260
+ background: #eef2ff;
261
+ color: #4338ca;
262
+ }
263
+ .ph-type-tag[data-color='green'] {
264
+ background: #ecfdf5;
265
+ color: #059669;
266
+ }
267
+ .ph-type-tag[data-color='orange'] {
268
+ background: #fff7ed;
269
+ color: #c2410c;
270
+ }
271
+ .ph-default-tag {
272
+ padding: 1px 6px;
273
+ font-size: 11px;
274
+ border-radius: 4px;
275
+ background: #dbeafe;
276
+ color: #1e40af;
277
+ }
278
+ .ph-desc {
279
+ margin-top: 10px;
280
+ font-size: 12px;
281
+ color: #6b7280;
282
+ min-height: 18px;
283
+ }
284
+ .ph-ok {
285
+ color: #059669;
286
+ font-weight: 500;
287
+ }
288
+ .ph-fail {
289
+ color: #dc2626;
290
+ font-weight: 500;
291
+ }
292
+ .ph-footer {
293
+ margin-top: 12px;
294
+ display: flex;
295
+ align-items: center;
296
+ justify-content: space-between;
297
+ border-top: 1px solid #f3f4f6;
298
+ padding-top: 8px;
299
+ }
300
+ .ph-status {
301
+ font-size: 11px;
302
+ color: #6b7280;
303
+ }
304
+ .ph-actions {
305
+ display: flex;
306
+ gap: 4px;
307
+ flex-wrap: wrap;
308
+ justify-content: flex-end;
309
+ }
310
+ .ph-btn {
311
+ padding: 2px 8px;
312
+ font-size: 11px;
313
+ border: 1px solid transparent;
314
+ border-radius: 4px;
315
+ background: transparent;
316
+ color: #4338ca;
317
+ cursor: pointer;
318
+ }
319
+ .ph-btn:hover {
320
+ background: #eef2ff;
321
+ }
322
+ .ph-btn:disabled {
323
+ color: #9ca3af;
324
+ cursor: not-allowed;
325
+ }
326
+ .ph-btn-danger {
327
+ color: #dc2626;
328
+ }
329
+ .ph-btn-danger:hover {
330
+ background: #fef2f2;
331
+ }
332
+ </style>