@liujitcn/kratos-admin-system 0.0.62 → 0.0.65

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 (101) hide show
  1. package/README.md +16 -1
  2. package/dist/package/declarations/src/api/base/v1/ai_provider.d.ts +7 -0
  3. package/dist/package/declarations/src/api/system/admin/v1/ai_provider.d.ts +20 -0
  4. package/dist/package/declarations/src/api/system/admin/v1/base_api_rate_limit_policy.d.ts +19 -0
  5. package/dist/package/declarations/src/api/system/admin/v1/base_message_provider.d.ts +21 -0
  6. package/dist/package/declarations/src/api/system/admin/v1/base_message_template.d.ts +16 -0
  7. package/dist/package/declarations/src/api/system/admin/v1/base_oauth_provider.d.ts +18 -0
  8. package/dist/package/declarations/src/api/system/admin/v1/base_rate_limit_rule.d.ts +21 -0
  9. package/dist/package/declarations/src/components/api/ApiTransfer.vue.d.ts +35 -0
  10. package/dist/package/declarations/src/components/api/apiTransfer.d.ts +13 -0
  11. package/dist/package/declarations/src/components/i18n/DynamicI18nCell.vue.d.ts +2 -2
  12. package/dist/package/declarations/src/components/i18n/dynamicI18n.d.ts +3 -4
  13. package/dist/package/declarations/src/locales/generated.d.ts +968 -0
  14. package/dist/package/declarations/src/rpc/base/v1/ai_message.d.ts +4 -0
  15. package/dist/package/declarations/src/rpc/base/v1/ai_provider.d.ts +29 -0
  16. package/dist/package/declarations/src/rpc/base/v1/oauth.d.ts +20 -0
  17. package/dist/package/declarations/src/rpc/google/protobuf/struct.d.ts +81 -0
  18. package/dist/package/declarations/src/rpc/system/admin/v1/ai_provider.d.ts +133 -0
  19. package/dist/package/declarations/src/rpc/system/admin/v1/base_api_rate_limit_policy.d.ts +137 -0
  20. package/dist/package/declarations/src/rpc/system/admin/v1/base_i18n.d.ts +4 -23
  21. package/dist/package/declarations/src/rpc/system/admin/v1/base_message.d.ts +4 -4
  22. package/dist/package/declarations/src/rpc/system/admin/v1/base_message_category.d.ts +19 -0
  23. package/dist/package/declarations/src/rpc/system/admin/v1/base_message_provider.d.ts +126 -0
  24. package/dist/package/declarations/src/rpc/system/admin/v1/base_message_template.d.ts +99 -0
  25. package/dist/package/declarations/src/rpc/system/admin/v1/base_oauth_provider.d.ts +133 -0
  26. package/dist/package/declarations/src/rpc/system/admin/v1/base_rate_limit_rule.d.ts +144 -0
  27. package/dist/package/declarations/src/utils/persisted-message.d.ts +4 -0
  28. package/dist/package/declarations/src/utils/rateLimit.d.ts +24 -0
  29. package/dist/package/declarations/src/views/ai/chat/components/ChatPanel.vue.d.ts +11 -2
  30. package/dist/package/declarations/src/views/ai/chat/components/XSender.vue.d.ts +9 -0
  31. package/dist/package/declarations/src/views/ai/chat/modelDisplay.d.ts +5 -0
  32. package/dist/package/declarations/src/views/ai/chat/modelSelection.d.ts +9 -0
  33. package/dist/package/declarations/src/views/base/ai-provider/index.vue.d.ts +3 -0
  34. package/dist/package/declarations/src/views/base/api-rate-limit-policy/index.vue.d.ts +3 -0
  35. package/dist/package/declarations/src/views/base/message-provider/index.vue.d.ts +3 -0
  36. package/dist/package/declarations/src/views/base/message-template/index.vue.d.ts +3 -0
  37. package/dist/package/declarations/src/views/base/oauth-provider/index.vue.d.ts +3 -0
  38. package/dist/package/declarations/src/views/base/rate-limit-rule/index.vue.d.ts +3 -0
  39. package/dist/package/src/api/base/v1/ai_provider.ts +22 -0
  40. package/dist/package/src/api/system/admin/v1/ai_provider.ts +57 -0
  41. package/dist/package/src/api/system/admin/v1/base_api_rate_limit_policy.ts +51 -0
  42. package/dist/package/src/api/system/admin/v1/base_message_provider.ts +57 -0
  43. package/dist/package/src/api/system/admin/v1/base_message_template.ts +44 -0
  44. package/dist/package/src/api/system/admin/v1/base_oauth_provider.ts +50 -0
  45. package/dist/package/src/api/system/admin/v1/base_rate_limit_rule.ts +58 -0
  46. package/dist/package/src/components/ai/Ai.vue +1 -1
  47. package/dist/package/src/components/api/ApiTransfer.vue +117 -0
  48. package/dist/package/src/components/api/apiTransfer.ts +27 -0
  49. package/dist/package/src/components/i18n/DynamicI18nCell.vue +8 -8
  50. package/dist/package/src/components/i18n/DynamicI18nEditor.vue +6 -3
  51. package/dist/package/src/components/i18n/dynamicI18n.ts +4 -5
  52. package/dist/package/src/components/tenant-project/TenantProjectManager.vue +2 -1
  53. package/dist/package/src/locales/en-US.json +246 -4
  54. package/dist/package/src/locales/ja-JP.json +246 -4
  55. package/dist/package/src/locales/zh-CN.json +246 -4
  56. package/dist/package/src/locales/zh-TW.json +246 -4
  57. package/dist/package/src/rpc/base/v1/ai_message.ts +7 -1
  58. package/dist/package/src/rpc/base/v1/ai_provider.ts +41 -0
  59. package/dist/package/src/rpc/base/v1/oauth.ts +16 -0
  60. package/dist/package/src/rpc/google/protobuf/struct.ts +80 -0
  61. package/dist/package/src/rpc/system/admin/v1/ai_provider.ts +155 -0
  62. package/dist/package/src/rpc/system/admin/v1/base_api_rate_limit_policy.ts +160 -0
  63. package/dist/package/src/rpc/system/admin/v1/base_i18n.ts +4 -24
  64. package/dist/package/src/rpc/system/admin/v1/base_message.ts +4 -4
  65. package/dist/package/src/rpc/system/admin/v1/base_message_category.ts +20 -0
  66. package/dist/package/src/rpc/system/admin/v1/base_message_provider.ts +150 -0
  67. package/dist/package/src/rpc/system/admin/v1/base_message_template.ts +117 -0
  68. package/dist/package/src/rpc/system/admin/v1/base_oauth_provider.ts +156 -0
  69. package/dist/package/src/rpc/system/admin/v1/base_rate_limit_rule.ts +167 -0
  70. package/dist/package/src/utils/persisted-message.ts +21 -0
  71. package/dist/package/src/utils/rateLimit.ts +140 -0
  72. package/dist/package/src/views/ai/chat/components/ChatPanel.vue +40 -5
  73. package/dist/package/src/views/ai/chat/components/XSender.vue +309 -3
  74. package/dist/package/src/views/ai/chat/index.vue +48 -1
  75. package/dist/package/src/views/ai/chat/modelDisplay.ts +67 -0
  76. package/dist/package/src/views/ai/chat/modelSelection.ts +31 -0
  77. package/dist/package/src/views/base/ai-provider/index.vue +613 -0
  78. package/dist/package/src/views/base/api-rate-limit-policy/index.vue +429 -0
  79. package/dist/package/src/views/base/backup-management/archive-record/index.vue +2 -0
  80. package/dist/package/src/views/base/backup-management/archive-restore/index.vue +2 -1
  81. package/dist/package/src/views/base/backup-management/backup-record/index.vue +2 -0
  82. package/dist/package/src/views/base/backup-management/backup-restore/index.vue +2 -1
  83. package/dist/package/src/views/base/config/index.vue +12 -13
  84. package/dist/package/src/views/base/dict/index.vue +2 -3
  85. package/dist/package/src/views/base/dict/item.vue +2 -3
  86. package/dist/package/src/views/base/job/index.vue +2 -3
  87. package/dist/package/src/views/base/job/log.vue +3 -2
  88. package/dist/package/src/views/base/menu/index.vue +27 -83
  89. package/dist/package/src/views/base/message/index.vue +9 -3
  90. package/dist/package/src/views/base/message-category/index.vue +34 -3
  91. package/dist/package/src/views/base/message-provider/index.vue +168 -0
  92. package/dist/package/src/views/base/message-template/index.vue +105 -0
  93. package/dist/package/src/views/base/migration/index.vue +1 -1
  94. package/dist/package/src/views/base/oauth-client/index.vue +6 -6
  95. package/dist/package/src/views/base/oauth-provider/index.vue +274 -0
  96. package/dist/package/src/views/base/rate-limit-rule/index.vue +327 -0
  97. package/dist/package/src/views/base/redact-output-policy/index.vue +1 -1
  98. package/dist/package/src/views/base/redact-rule/index.vue +12 -2
  99. package/dist/package/src/views/base/redact-storage-policy/index.vue +4 -0
  100. package/dist/package/src/views/base/tenant/index.vue +3 -3
  101. package/package.json +2 -2
@@ -27,7 +27,11 @@
27
27
  :sending="currentSessionSending"
28
28
  :shortcuts="starterShortcuts"
29
29
  :loading-shortcuts="loadingShortcuts"
30
+ :model-providers="modelProviders"
31
+ :provider-id="selectedProviderId"
32
+ :model-name="selectedModelName"
30
33
  @submit="handleSubmit"
34
+ @model-change="handleModelChange"
31
35
  @message-action="handleMessageAction"
32
36
  @message-edit="handleEditMessage"
33
37
  >
@@ -54,8 +58,10 @@ import { getAdminAiExtension } from "@liujitcn/kratos-admin-system";
54
58
  import { defAiMessageService } from "@liujitcn/kratos-admin-system/api/base/v1/ai_message";
55
59
  import { defAiSessionService } from "@liujitcn/kratos-admin-system/api/base/v1/ai_session";
56
60
  import { defAiToolService } from "@liujitcn/kratos-admin-system/api/base/v1/ai_tool";
61
+ import { defAiModelService } from "@liujitcn/kratos-admin-system/api/base/v1/ai_provider";
57
62
  import type { AiAction } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_message";
58
63
  import type { AiSession } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_session";
64
+ import type { AiProviderModelOption } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_provider";
59
65
  import type { AiShortcut } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_tool";
60
66
  import { AiMessageStatus } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_session";
61
67
  import { Terminal } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_tool";
@@ -79,6 +85,7 @@ import {
79
85
  sortMessages
80
86
  } from "./message";
81
87
  import { readAiEventStream } from "./stream";
88
+ import { loadStoredModelSelection, saveModelSelection } from "./modelSelection";
82
89
  import type {
83
90
  AiStreamEvent,
84
91
  AiStreamPayload,
@@ -102,6 +109,9 @@ const loadingSessionID = ref("");
102
109
  const loadingShortcuts = ref(false);
103
110
  const sessions = ref<AiSession[]>([]);
104
111
  const starterShortcuts = ref<AiShortcut[]>([]);
112
+ const modelProviders = ref<AiProviderModelOption[]>([]);
113
+ const selectedProviderId = ref(0);
114
+ const selectedModelName = ref("");
105
115
  const messages = ref<Record<string, ChatMessageItem[]>>({});
106
116
  const pendingDeltaMap = new Map<string, AiStreamPayload>();
107
117
  const runningStreamTaskMap = new Map<string, AiStreamTask>();
@@ -217,6 +227,8 @@ async function runAiStreamTask(sessionID: string, payload: SubmitPayload) {
217
227
  {
218
228
  session_id: sessionID,
219
229
  content: payload.text,
230
+ provider_id: selectedProviderId.value,
231
+ model_name: selectedModelName.value,
220
232
  attachments: payload.attachments.map(item => ({
221
233
  id: item.id,
222
234
  name: item.name,
@@ -645,15 +657,50 @@ async function loadAiShortcuts() {
645
657
  if (loadingShortcuts.value) return;
646
658
  loadingShortcuts.value = true;
647
659
  try {
648
- const response = await defAiToolService.ListAiShortcut({ terminal: Terminal.TERMINAL_ADMIN });
660
+ const [response, providerResponse] = await Promise.all([
661
+ defAiToolService.ListAiShortcut({ terminal: Terminal.TERMINAL_ADMIN }),
662
+ defAiModelService.ListAiProviderModelOptions({})
663
+ ]);
649
664
  starterShortcuts.value = normalizeStarterShortcuts(response.shortcuts);
665
+ modelProviders.value = providerResponse.providers ?? [];
666
+ applyModelSelection();
650
667
  } catch {
651
668
  starterShortcuts.value = [];
669
+ modelProviders.value = [];
670
+ selectedProviderId.value = 0;
671
+ selectedModelName.value = "";
652
672
  } finally {
653
673
  loadingShortcuts.value = false;
654
674
  }
655
675
  }
656
676
 
677
+ /** 优先恢复本地缓存的模型选择,缓存失效时回退到首个可用模型。 */
678
+ function applyModelSelection() {
679
+ const stored = loadStoredModelSelection();
680
+ const provider = stored
681
+ ? modelProviders.value.find(
682
+ item =>
683
+ item.provider_id === stored.provider_id &&
684
+ item.models.some(model => model.model_name === stored.model_name)
685
+ )
686
+ : undefined;
687
+ if (provider && stored) {
688
+ selectedProviderId.value = provider.provider_id;
689
+ selectedModelName.value = stored.model_name;
690
+ return;
691
+ }
692
+ const firstProvider = modelProviders.value[0];
693
+ selectedProviderId.value = firstProvider?.provider_id ?? 0;
694
+ selectedModelName.value = firstProvider?.models[0]?.model_name ?? "";
695
+ }
696
+
697
+ /** 更新当前聊天使用的供应商与模型并持久化到本地缓存。 */
698
+ function handleModelChange(providerId: number, modelName: string) {
699
+ selectedProviderId.value = providerId;
700
+ selectedModelName.value = modelName;
701
+ saveModelSelection({ provider_id: providerId, model_name: modelName });
702
+ }
703
+
657
704
  /** 使指定会话仍在途的消息列表请求失效。 */
658
705
  function invalidateLoadMessages(sessionID: string) {
659
706
  loadMessagesSeq.set(sessionID, (loadMessagesSeq.get(sessionID) ?? 0) + 1);
@@ -0,0 +1,67 @@
1
+ import type { AiProviderModelOption } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_provider";
2
+
3
+ /** 常见模型的展示名映射;未命中时按通用规则美化原始名。 */
4
+ const MODEL_DISPLAY_NAMES: Record<string, string> = {
5
+ "deepseek-chat": "DeepSeek Chat",
6
+ "deepseek-reasoner": "DeepSeek Reasoner",
7
+ "deepseek-v3": "DeepSeek V3",
8
+ "deepseek-r1": "DeepSeek R1",
9
+ "gpt-4o": "GPT-4o",
10
+ "gpt-4o-mini": "GPT-4o mini",
11
+ "gpt-4.1": "GPT-4.1",
12
+ "gpt-4.1-mini": "GPT-4.1 mini",
13
+ "gpt-4-turbo": "GPT-4 Turbo",
14
+ "o3-mini": "O3-mini",
15
+ "claude-3-5-sonnet": "Claude 3.5 Sonnet",
16
+ "claude-3-7-sonnet": "Claude 3.7 Sonnet",
17
+ "qwen-max": "Qwen Max",
18
+ "qwen-plus": "Qwen Plus"
19
+ };
20
+
21
+ /** 需要整体大写的模型名片段。 */
22
+ const UPPERCASE_TOKENS = new Set([
23
+ "gpt",
24
+ "llama",
25
+ "qwen",
26
+ "glm",
27
+ "kimi",
28
+ "gemini",
29
+ "claude",
30
+ "doubao",
31
+ "deepseek",
32
+ "moonshot",
33
+ "hunyuan"
34
+ ]);
35
+
36
+ /** 对未配置展示名的模型名做通用美化。 */
37
+ export function fallbackModelDisplayName(modelName: string): string {
38
+ if (!modelName) return "";
39
+ const mapped = MODEL_DISPLAY_NAMES[modelName.toLowerCase()];
40
+ if (mapped) return mapped;
41
+ return modelName
42
+ .split(/[-_]/)
43
+ .filter(Boolean)
44
+ .map(token => {
45
+ const lower = token.toLowerCase();
46
+ if (UPPERCASE_TOKENS.has(lower)) return lower.toUpperCase();
47
+ return lower.charAt(0).toUpperCase() + lower.slice(1);
48
+ })
49
+ .join(" ");
50
+ }
51
+
52
+ /** 从供应商模型选项中解析模型展示名称,兼容历史消息中「供应商 / 模型」格式的原始值。 */
53
+ export function resolveModelDisplayName(
54
+ providers: AiProviderModelOption[] | undefined,
55
+ modelName: string
56
+ ): string {
57
+ if (!modelName) return "";
58
+ const separator = " / ";
59
+ const modelPart = modelName.includes(separator)
60
+ ? modelName.slice(modelName.lastIndexOf(separator) + separator.length)
61
+ : modelName;
62
+ for (const provider of providers ?? []) {
63
+ const matched = provider.models.find(item => item.model_name === modelPart);
64
+ if (matched?.display_name) return matched.display_name;
65
+ }
66
+ return fallbackModelDisplayName(modelPart);
67
+ }
@@ -0,0 +1,31 @@
1
+ /** 用户最近一次选择的供应商与模型,仅保存在浏览器本地。 */
2
+ export interface AiModelSelection {
3
+ provider_id: number;
4
+ model_name: string;
5
+ }
6
+
7
+ const MODEL_SELECTION_STORAGE_KEY = "kratos-admin:ai:model-selection";
8
+
9
+ /** 读取本地缓存的模型选择,缓存缺失或损坏时返回 undefined。 */
10
+ export function loadStoredModelSelection(): AiModelSelection | undefined {
11
+ try {
12
+ const raw = localStorage.getItem(MODEL_SELECTION_STORAGE_KEY);
13
+ if (!raw) return undefined;
14
+ const parsed = JSON.parse(raw) as Partial<AiModelSelection>;
15
+ if (typeof parsed.provider_id === "number" && typeof parsed.model_name === "string" && parsed.model_name) {
16
+ return { provider_id: parsed.provider_id, model_name: parsed.model_name };
17
+ }
18
+ } catch {
19
+ // 缓存损坏或存储不可用时忽略,回退到默认选择。
20
+ }
21
+ return undefined;
22
+ }
23
+
24
+ /** 持久化模型选择,存储不可用时静默失败,选择仍对当前会话生效。 */
25
+ export function saveModelSelection(selection: AiModelSelection): void {
26
+ try {
27
+ localStorage.setItem(MODEL_SELECTION_STORAGE_KEY, JSON.stringify(selection));
28
+ } catch {
29
+ // 忽略存储失败,不影响当前会话内的选择。
30
+ }
31
+ }