@roll-agent/smart-reply-agent 0.1.0 → 0.1.1

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 (129) hide show
  1. package/dist/ai/model-registry.d.ts +0 -1
  2. package/dist/ai/model-registry.js +1 -205
  3. package/dist/ai/structured-output.d.ts +0 -1
  4. package/dist/ai/structured-output.js +1 -78
  5. package/dist/errors/app-error.d.ts +0 -1
  6. package/dist/errors/app-error.js +1 -95
  7. package/dist/errors/error-codes.d.ts +0 -1
  8. package/dist/errors/error-codes.js +1 -115
  9. package/dist/errors/error-factory.d.ts +0 -1
  10. package/dist/errors/error-factory.js +1 -86
  11. package/dist/errors/error-utils.d.ts +0 -1
  12. package/dist/errors/error-utils.js +1 -188
  13. package/dist/errors/index.d.ts +0 -1
  14. package/dist/errors/index.js +1 -5
  15. package/dist/index.d.ts +0 -1
  16. package/dist/index.js +1 -12
  17. package/dist/log-control.d.ts +0 -1
  18. package/dist/log-control.js +1 -15
  19. package/dist/pipeline/age-eligibility.d.ts +0 -1
  20. package/dist/pipeline/age-eligibility.js +1 -176
  21. package/dist/pipeline/candidate-context.d.ts +0 -1
  22. package/dist/pipeline/candidate-context.js +1 -31
  23. package/dist/pipeline/candidate-utils.d.ts +0 -1
  24. package/dist/pipeline/candidate-utils.js +1 -33
  25. package/dist/pipeline/classification.d.ts +0 -1
  26. package/dist/pipeline/classification.js +1 -206
  27. package/dist/pipeline/context-builder.d.ts +0 -1
  28. package/dist/pipeline/context-builder.js +1 -404
  29. package/dist/pipeline/pipeline-progress.d.ts +0 -1
  30. package/dist/pipeline/pipeline-progress.js +1 -33
  31. package/dist/pipeline/reply-gate.d.ts +0 -1
  32. package/dist/pipeline/reply-gate.js +1 -139
  33. package/dist/pipeline/smart-reply.d.ts +0 -1
  34. package/dist/pipeline/smart-reply.js +1 -418
  35. package/dist/pipeline.d.ts +0 -1
  36. package/dist/pipeline.js +1 -12
  37. package/dist/services/brand-alias.d.ts +0 -1
  38. package/dist/services/brand-alias.js +1 -184
  39. package/dist/services/brand-config-selectors.d.ts +0 -1
  40. package/dist/services/brand-config-selectors.js +1 -30
  41. package/dist/services/config-loader.d.ts +0 -1
  42. package/dist/services/config-loader.js +1 -45
  43. package/dist/services/duliday-api.d.ts +0 -1
  44. package/dist/services/duliday-api.js +1 -160
  45. package/dist/services/duliday-mapper.d.ts +0 -1
  46. package/dist/services/duliday-mapper.js +1 -536
  47. package/dist/tools/generate-reply.d.ts +0 -1
  48. package/dist/tools/generate-reply.js +1 -132
  49. package/dist/tools/sync-brand-data.d.ts +0 -1
  50. package/dist/tools/sync-brand-data.js +1 -114
  51. package/dist/types/brand-resolution.d.ts +0 -1
  52. package/dist/types/brand-resolution.js +1 -37
  53. package/dist/types/classification.d.ts +0 -1
  54. package/dist/types/classification.js +1 -30
  55. package/dist/types/config.d.ts +0 -1
  56. package/dist/types/config.js +1 -7
  57. package/dist/types/duliday-api.d.ts +0 -1
  58. package/dist/types/duliday-api.js +1 -235
  59. package/dist/types/geocoding.d.ts +0 -1
  60. package/dist/types/geocoding.js +1 -12
  61. package/dist/types/reply-policy.d.ts +0 -1
  62. package/dist/types/reply-policy.js +1 -332
  63. package/dist/types/zhipin.d.ts +0 -1
  64. package/dist/types/zhipin.js +1 -123
  65. package/package.json +3 -3
  66. package/dist/ai/model-registry.d.ts.map +0 -1
  67. package/dist/ai/model-registry.js.map +0 -1
  68. package/dist/ai/structured-output.d.ts.map +0 -1
  69. package/dist/ai/structured-output.js.map +0 -1
  70. package/dist/errors/app-error.d.ts.map +0 -1
  71. package/dist/errors/app-error.js.map +0 -1
  72. package/dist/errors/error-codes.d.ts.map +0 -1
  73. package/dist/errors/error-codes.js.map +0 -1
  74. package/dist/errors/error-factory.d.ts.map +0 -1
  75. package/dist/errors/error-factory.js.map +0 -1
  76. package/dist/errors/error-utils.d.ts.map +0 -1
  77. package/dist/errors/error-utils.js.map +0 -1
  78. package/dist/errors/index.d.ts.map +0 -1
  79. package/dist/errors/index.js.map +0 -1
  80. package/dist/index.d.ts.map +0 -1
  81. package/dist/index.js.map +0 -1
  82. package/dist/log-control.d.ts.map +0 -1
  83. package/dist/log-control.js.map +0 -1
  84. package/dist/pipeline/age-eligibility.d.ts.map +0 -1
  85. package/dist/pipeline/age-eligibility.js.map +0 -1
  86. package/dist/pipeline/candidate-context.d.ts.map +0 -1
  87. package/dist/pipeline/candidate-context.js.map +0 -1
  88. package/dist/pipeline/candidate-utils.d.ts.map +0 -1
  89. package/dist/pipeline/candidate-utils.js.map +0 -1
  90. package/dist/pipeline/classification.d.ts.map +0 -1
  91. package/dist/pipeline/classification.js.map +0 -1
  92. package/dist/pipeline/context-builder.d.ts.map +0 -1
  93. package/dist/pipeline/context-builder.js.map +0 -1
  94. package/dist/pipeline/pipeline-progress.d.ts.map +0 -1
  95. package/dist/pipeline/pipeline-progress.js.map +0 -1
  96. package/dist/pipeline/reply-gate.d.ts.map +0 -1
  97. package/dist/pipeline/reply-gate.js.map +0 -1
  98. package/dist/pipeline/smart-reply.d.ts.map +0 -1
  99. package/dist/pipeline/smart-reply.js.map +0 -1
  100. package/dist/pipeline.d.ts.map +0 -1
  101. package/dist/pipeline.js.map +0 -1
  102. package/dist/services/brand-alias.d.ts.map +0 -1
  103. package/dist/services/brand-alias.js.map +0 -1
  104. package/dist/services/brand-config-selectors.d.ts.map +0 -1
  105. package/dist/services/brand-config-selectors.js.map +0 -1
  106. package/dist/services/config-loader.d.ts.map +0 -1
  107. package/dist/services/config-loader.js.map +0 -1
  108. package/dist/services/duliday-api.d.ts.map +0 -1
  109. package/dist/services/duliday-api.js.map +0 -1
  110. package/dist/services/duliday-mapper.d.ts.map +0 -1
  111. package/dist/services/duliday-mapper.js.map +0 -1
  112. package/dist/tools/generate-reply.d.ts.map +0 -1
  113. package/dist/tools/generate-reply.js.map +0 -1
  114. package/dist/tools/sync-brand-data.d.ts.map +0 -1
  115. package/dist/tools/sync-brand-data.js.map +0 -1
  116. package/dist/types/brand-resolution.d.ts.map +0 -1
  117. package/dist/types/brand-resolution.js.map +0 -1
  118. package/dist/types/classification.d.ts.map +0 -1
  119. package/dist/types/classification.js.map +0 -1
  120. package/dist/types/config.d.ts.map +0 -1
  121. package/dist/types/config.js.map +0 -1
  122. package/dist/types/duliday-api.d.ts.map +0 -1
  123. package/dist/types/duliday-api.js.map +0 -1
  124. package/dist/types/geocoding.d.ts.map +0 -1
  125. package/dist/types/geocoding.js.map +0 -1
  126. package/dist/types/reply-policy.d.ts.map +0 -1
  127. package/dist/types/reply-policy.js.map +0 -1
  128. package/dist/types/zhipin.d.ts.map +0 -1
  129. package/dist/types/zhipin.js.map +0 -1
@@ -101,4 +101,3 @@ interface ModelRegistry {
101
101
  }
102
102
  export declare function getDynamicRegistry(providerConfigs: Record<string, ProviderConfig>): ModelRegistry;
103
103
  export {};
104
- //# sourceMappingURL=model-registry.d.ts.map
@@ -1,205 +1 @@
1
- import { createAnthropic } from "@ai-sdk/anthropic";
2
- import { createAlibaba } from "@ai-sdk/alibaba";
3
- import { createProviderRegistry } from "ai";
4
- import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
5
- import { createDeepSeek } from "@ai-sdk/deepseek";
6
- import { createGoogleGenerativeAI } from "@ai-sdk/google";
7
- import { createOpenAI } from "@ai-sdk/openai";
8
- import { verboseLog } from "../log-control.js";
9
- export const MODEL_DICTIONARY = {
10
- "qwen/qwen-max-latest": {
11
- provider: "qwen",
12
- name: "Qwen Max Latest",
13
- categories: ["general"],
14
- },
15
- "qwen/qwen-plus-latest": {
16
- provider: "qwen",
17
- name: "Qwen Plus Latest",
18
- categories: ["general"],
19
- },
20
- "google/gemini-embedding-2-preview": {
21
- provider: "google",
22
- name: "Gemini Embedding 2 Preview",
23
- categories: ["general"],
24
- },
25
- "google/gemini-3.1-flash-lite-preview": {
26
- provider: "google",
27
- name: "Gemini 3.1 Flash Lite Preview",
28
- categories: ["general", "chat"],
29
- },
30
- "google/gemini-3.1-pro-preview": {
31
- provider: "google",
32
- name: "Gemini 3.1 Pro Preview",
33
- categories: ["chat", "general"],
34
- },
35
- "anthropic/claude-sonnet-4-6": {
36
- provider: "anthropic",
37
- name: "Claude Sonnet 4.6",
38
- categories: ["chat", "general"],
39
- },
40
- "anthropic/claude-opus-4-6": {
41
- provider: "anthropic",
42
- name: "Claude Opus 4.6",
43
- categories: ["chat", "general"],
44
- },
45
- "anthropic/claude-haiku-4-5": {
46
- provider: "anthropic",
47
- name: "Claude Haiku 4.5",
48
- categories: ["chat", "general"],
49
- },
50
- "openai/gpt-5.1": {
51
- provider: "openai",
52
- name: "GPT-5.1",
53
- categories: ["chat", "general"],
54
- },
55
- "openai/gpt-5.2": {
56
- provider: "openai",
57
- name: "GPT-5.2",
58
- categories: ["general"],
59
- },
60
- "openai/gpt-5.4": {
61
- provider: "openai",
62
- name: "GPT-5.4",
63
- categories: ["chat", "general"],
64
- },
65
- "openai/gpt-5-mini": {
66
- provider: "openai",
67
- name: "GPT-5 Mini",
68
- categories: ["general"],
69
- },
70
- "ohmygpt/gemini-3.1-flash-lite-preview": {
71
- provider: "ohmygpt",
72
- name: "Gemini 3.1 Flash Lite Preview (OhMyGPT)",
73
- categories: ["general"],
74
- },
75
- "ohmygpt/gemini-3.1-pro-preview": {
76
- provider: "ohmygpt",
77
- name: "Gemini 3.1 Pro Preview (OhMyGPT)",
78
- categories: ["general"],
79
- },
80
- "moonshotai/kimi-k2.5": {
81
- provider: "moonshotai",
82
- name: "Kimi K2.5",
83
- categories: ["chat", "general"],
84
- },
85
- "moonshotai/kimi-k2-thinking-turbo": {
86
- provider: "moonshotai",
87
- name: "Kimi K2 Thinking Turbo",
88
- categories: ["chat", "general"],
89
- },
90
- "deepseek/deepseek-chat": {
91
- provider: "deepseek",
92
- name: "DeepSeek Chat",
93
- categories: ["chat", "general"],
94
- },
95
- };
96
- // ========== Default Configs ==========
97
- /**
98
- * Anthropic/OpenAI/OhMyGPT 默认走共享代理,保证“统一 key + 默认模型”开箱可用。
99
- * 如果需要切换,优先使用 SMART_REPLY_PROXY_BASE_URL,或为单个 provider 指定专属 base URL。
100
- */
101
- const PROXY_BASE_URL = process.env.SMART_REPLY_PROXY_BASE_URL;
102
- const DEFAULT_SHARED_PROXY_BASE_URL = "https://apic1.ohmycdn.com/v1";
103
- const SHARED_PROXY_BASE_URL = PROXY_BASE_URL || DEFAULT_SHARED_PROXY_BASE_URL;
104
- const FALLBACK_URLS = {
105
- anthropic: process.env.ANTHROPIC_BASE_URL || SHARED_PROXY_BASE_URL,
106
- openai: process.env.OPENAI_BASE_URL || SHARED_PROXY_BASE_URL,
107
- ohmygpt: process.env.OHMYGPT_BASE_URL || SHARED_PROXY_BASE_URL,
108
- moonshotai: process.env.MOONSHOT_BASE_URL || "https://api.moonshot.cn/v1",
109
- deepseek: process.env.DEEPSEEK_BASE_URL || "https://api.deepseek.com",
110
- qwen: process.env.QWEN_BASE_URL || "https://dashscope.aliyuncs.com/compatible-mode/v1",
111
- google: process.env.GOOGLE_BASE_URL || "https://generativelanguage.googleapis.com/v1beta",
112
- };
113
- export const DEFAULT_PROVIDER_CONFIGS = {
114
- anthropic: {
115
- name: "Anthropic",
116
- baseURL: FALLBACK_URLS.anthropic,
117
- description: "Anthropic Claude",
118
- },
119
- openai: { name: "OpenAI", baseURL: FALLBACK_URLS.openai, description: "OpenAI GPT" },
120
- ohmygpt: { name: "OhMyGPT", baseURL: FALLBACK_URLS.ohmygpt, description: "OhMyGPT" },
121
- moonshotai: { name: "MoonshotAI", baseURL: FALLBACK_URLS.moonshotai, description: "MoonshotAI" },
122
- deepseek: { name: "DeepSeek", baseURL: FALLBACK_URLS.deepseek, description: "DeepSeek" },
123
- qwen: { name: "Qwen", baseURL: FALLBACK_URLS.qwen, description: "Qwen" },
124
- google: { name: "Google", baseURL: FALLBACK_URLS.google, description: "Google Gemini" },
125
- };
126
- export const DEFAULT_MODEL_CONFIG = {
127
- chatModel: "anthropic/claude-haiku-4-5",
128
- classifyModel: process.env.SMART_REPLY_CLASSIFY_MODEL || "openai/gpt-5-mini",
129
- replyModel: process.env.SMART_REPLY_REPLY_MODEL || "openai/gpt-5.4",
130
- };
131
- function getSharedProxyApiKey() {
132
- // 当前统一代理对 Anthropic/OpenAI/OhMyGPT 走同一套鉴权。
133
- // 为兼容仓库里仍存在的 OPENAI_API_KEY 示例,回退读取 OPENAI_API_KEY。
134
- return process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY || "";
135
- }
136
- // ========== Custom Provider Factories ==========
137
- function createCustomOpenAI(config) {
138
- const openaiInstance = createOpenAI({
139
- apiKey: config.apiKey || "",
140
- ...(config.baseURL !== undefined ? { baseURL: config.baseURL } : {}),
141
- });
142
- return new Proxy(openaiInstance, {
143
- get(_target, prop) {
144
- if (prop === "languageModel") {
145
- return (modelId) => openaiInstance.chat(modelId);
146
- }
147
- if (prop === "chat" || prop === "completion") {
148
- return openaiInstance[prop];
149
- }
150
- if (prop === "embeddingModel" || prop === "imageModel") {
151
- const method = openaiInstance[prop];
152
- return method || undefined;
153
- }
154
- return openaiInstance[prop];
155
- },
156
- });
157
- }
158
- // ========== Dynamic Registry ==========
159
- function createDynamicRegistry(providerConfigs) {
160
- const sharedProxyApiKey = getSharedProxyApiKey();
161
- return createProviderRegistry({
162
- anthropic: createAnthropic({
163
- apiKey: sharedProxyApiKey,
164
- baseURL: providerConfigs.anthropic?.baseURL || FALLBACK_URLS.anthropic,
165
- }),
166
- openai: createCustomOpenAI({
167
- apiKey: sharedProxyApiKey,
168
- baseURL: providerConfigs.openai?.baseURL || FALLBACK_URLS.openai,
169
- }),
170
- ohmygpt: createOpenAICompatible({
171
- name: "ohmygpt",
172
- baseURL: providerConfigs.ohmygpt?.baseURL || FALLBACK_URLS.ohmygpt,
173
- apiKey: sharedProxyApiKey,
174
- }),
175
- moonshotai: createOpenAICompatible({
176
- name: "moonshotai",
177
- baseURL: providerConfigs.moonshotai?.baseURL || FALLBACK_URLS.moonshotai,
178
- apiKey: process.env.MOONSHOT_API_KEY || "",
179
- }),
180
- deepseek: createDeepSeek({
181
- baseURL: providerConfigs.deepseek?.baseURL || FALLBACK_URLS.deepseek,
182
- apiKey: process.env.DEEPSEEK_API_KEY || "",
183
- }),
184
- google: createGoogleGenerativeAI({
185
- apiKey: process.env.GEMINI_API_KEY || "",
186
- baseURL: providerConfigs.google?.baseURL || FALLBACK_URLS.google,
187
- }),
188
- qwen: createAlibaba({
189
- apiKey: process.env.DASHSCOPE_API_KEY || process.env.ALIBABA_API_KEY || "",
190
- baseURL: providerConfigs.qwen?.baseURL || FALLBACK_URLS.qwen,
191
- }),
192
- }, { separator: "/" });
193
- }
194
- let cachedRegistry = null;
195
- let lastConfigHash = null;
196
- export function getDynamicRegistry(providerConfigs) {
197
- const configHash = JSON.stringify(providerConfigs);
198
- if (cachedRegistry && lastConfigHash === configHash)
199
- return cachedRegistry;
200
- cachedRegistry = createDynamicRegistry(providerConfigs);
201
- lastConfigHash = configHash;
202
- verboseLog("[DYNAMIC REGISTRY] 创建新的动态registry,配置哈希:", configHash.substring(0, 16) + "...");
203
- return cachedRegistry;
204
- }
205
- //# sourceMappingURL=model-registry.js.map
1
+ import{createAnthropic as e}from"@ai-sdk/anthropic";import{createAlibaba as o}from"@ai-sdk/alibaba";import{createProviderRegistry as i}from"ai";import{createOpenAICompatible as a}from"@ai-sdk/openai-compatible";import{createDeepSeek as n}from"@ai-sdk/deepseek";import{createGoogleGenerativeAI as r}from"@ai-sdk/google";import{createOpenAI as t}from"@ai-sdk/openai";import{verboseLog as p}from"../log-control.js";export const MODEL_DICTIONARY={"qwen/qwen-max-latest":{provider:"qwen",name:"Qwen Max Latest",categories:["general"]},"qwen/qwen-plus-latest":{provider:"qwen",name:"Qwen Plus Latest",categories:["general"]},"google/gemini-embedding-2-preview":{provider:"google",name:"Gemini Embedding 2 Preview",categories:["general"]},"google/gemini-3.1-flash-lite-preview":{provider:"google",name:"Gemini 3.1 Flash Lite Preview",categories:["general","chat"]},"google/gemini-3.1-pro-preview":{provider:"google",name:"Gemini 3.1 Pro Preview",categories:["chat","general"]},"anthropic/claude-sonnet-4-6":{provider:"anthropic",name:"Claude Sonnet 4.6",categories:["chat","general"]},"anthropic/claude-opus-4-6":{provider:"anthropic",name:"Claude Opus 4.6",categories:["chat","general"]},"anthropic/claude-haiku-4-5":{provider:"anthropic",name:"Claude Haiku 4.5",categories:["chat","general"]},"openai/gpt-5.1":{provider:"openai",name:"GPT-5.1",categories:["chat","general"]},"openai/gpt-5.2":{provider:"openai",name:"GPT-5.2",categories:["general"]},"openai/gpt-5.4":{provider:"openai",name:"GPT-5.4",categories:["chat","general"]},"openai/gpt-5-mini":{provider:"openai",name:"GPT-5 Mini",categories:["general"]},"ohmygpt/gemini-3.1-flash-lite-preview":{provider:"ohmygpt",name:"Gemini 3.1 Flash Lite Preview (OhMyGPT)",categories:["general"]},"ohmygpt/gemini-3.1-pro-preview":{provider:"ohmygpt",name:"Gemini 3.1 Pro Preview (OhMyGPT)",categories:["general"]},"moonshotai/kimi-k2.5":{provider:"moonshotai",name:"Kimi K2.5",categories:["chat","general"]},"moonshotai/kimi-k2-thinking-turbo":{provider:"moonshotai",name:"Kimi K2 Thinking Turbo",categories:["chat","general"]},"deepseek/deepseek-chat":{provider:"deepseek",name:"DeepSeek Chat",categories:["chat","general"]}};const s=process.env.SMART_REPLY_PROXY_BASE_URL,g="https://apic1.ohmycdn.com/v1",c=s||g,m={anthropic:process.env.ANTHROPIC_BASE_URL||c,openai:process.env.OPENAI_BASE_URL||c,ohmygpt:process.env.OHMYGPT_BASE_URL||c,moonshotai:process.env.MOONSHOT_BASE_URL||"https://api.moonshot.cn/v1",deepseek:process.env.DEEPSEEK_BASE_URL||"https://api.deepseek.com",qwen:process.env.QWEN_BASE_URL||"https://dashscope.aliyuncs.com/compatible-mode/v1",google:process.env.GOOGLE_BASE_URL||"https://generativelanguage.googleapis.com/v1beta"};export const DEFAULT_PROVIDER_CONFIGS={anthropic:{name:"Anthropic",baseURL:m.anthropic,description:"Anthropic Claude"},openai:{name:"OpenAI",baseURL:m.openai,description:"OpenAI GPT"},ohmygpt:{name:"OhMyGPT",baseURL:m.ohmygpt,description:"OhMyGPT"},moonshotai:{name:"MoonshotAI",baseURL:m.moonshotai,description:"MoonshotAI"},deepseek:{name:"DeepSeek",baseURL:m.deepseek,description:"DeepSeek"},qwen:{name:"Qwen",baseURL:m.qwen,description:"Qwen"},google:{name:"Google",baseURL:m.google,description:"Google Gemini"}};export const DEFAULT_MODEL_CONFIG={chatModel:"anthropic/claude-haiku-4-5",classifyModel:process.env.SMART_REPLY_CLASSIFY_MODEL||"openai/gpt-5-mini",replyModel:process.env.SMART_REPLY_REPLY_MODEL||"openai/gpt-5.4"};function h(){return process.env.ANTHROPIC_API_KEY||process.env.OPENAI_API_KEY||""}function l(e){const o=t({apiKey:e.apiKey||"",...void 0!==e.baseURL?{baseURL:e.baseURL}:{}});return new Proxy(o,{get(e,i){if("languageModel"===i)return e=>o.chat(e);if("chat"===i||"completion"===i)return o[i];if("embeddingModel"===i||"imageModel"===i){return o[i]||void 0}return o[i]}})}function d(t){const p=h();return i({anthropic:e({apiKey:p,baseURL:t.anthropic?.baseURL||m.anthropic}),openai:l({apiKey:p,baseURL:t.openai?.baseURL||m.openai}),ohmygpt:a({name:"ohmygpt",baseURL:t.ohmygpt?.baseURL||m.ohmygpt,apiKey:p}),moonshotai:a({name:"moonshotai",baseURL:t.moonshotai?.baseURL||m.moonshotai,apiKey:process.env.MOONSHOT_API_KEY||""}),deepseek:n({baseURL:t.deepseek?.baseURL||m.deepseek,apiKey:process.env.DEEPSEEK_API_KEY||""}),google:r({apiKey:process.env.GEMINI_API_KEY||"",baseURL:t.google?.baseURL||m.google}),qwen:o({apiKey:process.env.DASHSCOPE_API_KEY||process.env.ALIBABA_API_KEY||"",baseURL:t.qwen?.baseURL||m.qwen})},{separator:"/"})}let v=null,L=null;export function getDynamicRegistry(e){const o=JSON.stringify(e);return v&&L===o||(v=d(e),L=o,p("[DYNAMIC REGISTRY] 创建新的动态registry,配置哈希:",o.substring(0,16)+"...")),v}
@@ -47,4 +47,3 @@ export interface SafeGenerateTextFailure {
47
47
  }
48
48
  export type SafeGenerateTextResult = SafeGenerateTextSuccess | SafeGenerateTextFailure;
49
49
  export declare function safeGenerateText(options: SafeGenerateTextOptions): Promise<SafeGenerateTextResult>;
50
- //# sourceMappingURL=structured-output.d.ts.map
@@ -1,78 +1 @@
1
- import { generateText, NoObjectGeneratedError, Output, } from "ai";
2
- import { z } from "zod";
3
- import { wrapError, logError, ErrorCode } from "../errors/index.js";
4
- import { verboseLog } from "../log-control.js";
5
- export async function safeGenerateObject(options) {
6
- const { model, schema, schemaName, system, prompt, onError } = options;
7
- try {
8
- const result = await generateText({
9
- model,
10
- ...(system !== undefined ? { system } : {}),
11
- prompt,
12
- output: Output.object({
13
- schema,
14
- ...(schemaName !== undefined ? { name: schemaName } : {}),
15
- }),
16
- });
17
- return { success: true, data: result.output, usage: result.usage };
18
- }
19
- catch (error) {
20
- const appError = wrapError(error, ErrorCode.LLM_RESPONSE_PARSE_ERROR);
21
- let rawText;
22
- if (NoObjectGeneratedError.isInstance(error))
23
- rawText = error.text;
24
- if (schemaName && appError.details && typeof appError.details === "object") {
25
- appError.details.schemaName = schemaName;
26
- }
27
- logError(`Structured output generation (${schemaName || "unknown"})`, appError);
28
- if (onError)
29
- onError(appError, rawText);
30
- return { success: false, error: appError, rawText };
31
- }
32
- }
33
- // ========== safeGenerateText ==========
34
- const DEFAULT_TIMEOUT_MS = 30_000;
35
- const DEFAULT_MAX_OUTPUT_TOKENS = 2000;
36
- export async function safeGenerateText(options) {
37
- const { model, system, prompt, timeoutMs = DEFAULT_TIMEOUT_MS, maxOutputTokens = DEFAULT_MAX_OUTPUT_TOKENS, context = "generateText", onError, } = options;
38
- const startTime = performance.now();
39
- try {
40
- const controller = new AbortController();
41
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
42
- const result = await generateText({
43
- model,
44
- ...(system !== undefined ? { system } : {}),
45
- prompt,
46
- maxOutputTokens,
47
- abortSignal: controller.signal,
48
- });
49
- clearTimeout(timeoutId);
50
- const latencyMs = Math.round(performance.now() - startTime);
51
- const rawUsage = result.usage;
52
- const totalTokens = rawUsage?.inputTokens !== undefined && rawUsage?.outputTokens !== undefined
53
- ? rawUsage.inputTokens + rawUsage.outputTokens
54
- : undefined;
55
- const usage = {
56
- inputTokens: rawUsage?.inputTokens,
57
- outputTokens: rawUsage?.outputTokens,
58
- totalTokens,
59
- };
60
- verboseLog(`[${context}] 生成成功 | 耗时: ${latencyMs}ms | Tokens: ${totalTokens ?? "N/A"} (input: ${usage.inputTokens ?? "?"}, output: ${usage.outputTokens ?? "?"})`);
61
- return { success: true, text: result.text, usage, latencyMs };
62
- }
63
- catch (error) {
64
- const latencyMs = Math.round(performance.now() - startTime);
65
- const isTimeout = error instanceof Error && (error.name === "AbortError" || error.message.includes("aborted"));
66
- const errorCode = isTimeout ? ErrorCode.LLM_TIMEOUT : ErrorCode.LLM_GENERATION_FAILED;
67
- const appError = wrapError(error, errorCode);
68
- if (appError.details && typeof appError.details === "object") {
69
- appError.details.context = context;
70
- appError.details.latencyMs = latencyMs;
71
- }
72
- logError(`${context} (${latencyMs}ms)`, appError);
73
- if (onError)
74
- onError(appError);
75
- return { success: false, error: appError };
76
- }
77
- }
78
- //# sourceMappingURL=structured-output.js.map
1
+ import{generateText as t,NoObjectGeneratedError as e,Output as o}from"ai";import{z as s}from"zod";import{wrapError as n,logError as r,ErrorCode as a}from"../errors/index.js";import{verboseLog as u}from"../log-control.js";export async function safeGenerateObject(s){const{model:u,schema:c,schemaName:m,system:i,prompt:p,onError:d}=s;try{const e=await t({model:u,...void 0!==i?{system:i}:{},prompt:p,output:o.object({schema:c,...void 0!==m?{name:m}:{}})});return{success:!0,data:e.output,usage:e.usage}}catch(t){const o=n(t,a.LLM_RESPONSE_PARSE_ERROR);let s;return e.isInstance(t)&&(s=t.text),m&&o.details&&"object"==typeof o.details&&(o.details.schemaName=m),r(`Structured output generation (${m||"unknown"})`,o),d&&d(o,s),{success:!1,error:o,rawText:s}}}const c=3e4,m=2e3;export async function safeGenerateText(e){const{model:o,system:s,prompt:i,timeoutMs:p=c,maxOutputTokens:d=m,context:l="generateText",onError:T}=e,k=performance.now();try{const e=new AbortController,n=setTimeout(()=>e.abort(),p),r=await t({model:o,...void 0!==s?{system:s}:{},prompt:i,maxOutputTokens:d,abortSignal:e.signal});clearTimeout(n);const a=Math.round(performance.now()-k),c=r.usage,m=void 0!==c?.inputTokens&&void 0!==c?.outputTokens?c.inputTokens+c.outputTokens:void 0,T={inputTokens:c?.inputTokens,outputTokens:c?.outputTokens,totalTokens:m};return u(`[${l}] 生成成功 | 耗时: ${a}ms | Tokens: ${m??"N/A"} (input: ${T.inputTokens??"?"}, output: ${T.outputTokens??"?"})`),{success:!0,text:r.text,usage:T,latencyMs:a}}catch(t){const e=Math.round(performance.now()-k),o=t instanceof Error&&("AbortError"===t.name||t.message.includes("aborted"))?a.LLM_TIMEOUT:a.LLM_GENERATION_FAILED,s=n(t,o);return s.details&&"object"==typeof s.details&&(s.details.context=l,s.details.latencyMs=e),r(`${l} (${e}ms)`,s),T&&T(s),{success:!1,error:s}}}
@@ -40,4 +40,3 @@ export declare function isLLMError(error: unknown): boolean;
40
40
  export declare function isConfigError(error: unknown): boolean;
41
41
  export declare function isNetworkError(error: unknown): boolean;
42
42
  export declare function isAuthError(error: unknown): boolean;
43
- //# sourceMappingURL=app-error.d.ts.map
@@ -1,95 +1 @@
1
- import { getErrorCategory, getErrorUserMessage } from "./error-codes.js";
2
- export class AppError extends Error {
3
- code;
4
- category;
5
- userMessage;
6
- details;
7
- cause;
8
- timestamp;
9
- constructor(options) {
10
- super(options.message);
11
- this.name = "AppError";
12
- this.code = options.code;
13
- this.category = getErrorCategory(options.code);
14
- this.userMessage = options.userMessage || getErrorUserMessage(options.code);
15
- this.details = options.details;
16
- this.cause = options.cause;
17
- this.timestamp = new Date().toISOString();
18
- if (Error.captureStackTrace) {
19
- Error.captureStackTrace(this, AppError);
20
- }
21
- }
22
- toJSON() {
23
- const result = {
24
- code: this.code,
25
- category: this.category,
26
- message: this.message,
27
- userMessage: this.userMessage,
28
- timestamp: this.timestamp,
29
- };
30
- if (this.details !== undefined) {
31
- result.details = this.details;
32
- }
33
- if (this.cause) {
34
- if (this.cause instanceof AppError) {
35
- result.cause = this.cause.toJSON();
36
- }
37
- else {
38
- result.cause = { message: this.cause.message, stack: this.cause.stack };
39
- }
40
- }
41
- return result;
42
- }
43
- getErrorChain() {
44
- const chain = [this];
45
- let current = this.cause;
46
- while (current) {
47
- chain.push(current);
48
- current = current instanceof AppError ? current.cause : undefined;
49
- }
50
- return chain;
51
- }
52
- getRootCause() {
53
- const chain = this.getErrorChain();
54
- // chain always contains at least `this`, so the last element is guaranteed
55
- return chain[chain.length - 1];
56
- }
57
- hasErrorCode(code) {
58
- return this.getErrorChain().some((error) => error instanceof AppError && error.code === code);
59
- }
60
- hasErrorCategory(category) {
61
- return this.getErrorChain().some((error) => error instanceof AppError && error.category === category);
62
- }
63
- toLogString() {
64
- const parts = [`[${this.code}]`, this.message];
65
- if (this.details) {
66
- parts.push(`Details: ${JSON.stringify(this.details)}`);
67
- }
68
- if (this.cause) {
69
- parts.push(`Caused by: ${this.cause.message}`);
70
- }
71
- return parts.join(" | ");
72
- }
73
- }
74
- export function isAppError(error) {
75
- return error instanceof AppError;
76
- }
77
- export function isErrorCode(error, code) {
78
- return isAppError(error) && error.code === code;
79
- }
80
- export function isErrorCategory(error, category) {
81
- return isAppError(error) && error.category === category;
82
- }
83
- export function isLLMError(error) {
84
- return isErrorCategory(error, "LLM");
85
- }
86
- export function isConfigError(error) {
87
- return isErrorCategory(error, "CONFIG");
88
- }
89
- export function isNetworkError(error) {
90
- return isErrorCategory(error, "NETWORK");
91
- }
92
- export function isAuthError(error) {
93
- return isErrorCategory(error, "AUTH");
94
- }
95
- //# sourceMappingURL=app-error.js.map
1
+ import{getErrorCategory as r,getErrorUserMessage as e}from"./error-codes.js";export class AppError extends Error{code;category;userMessage;details;cause;timestamp;constructor(s){super(s.message),this.name="AppError",this.code=s.code,this.category=r(s.code),this.userMessage=s.userMessage||e(s.code),this.details=s.details,this.cause=s.cause,this.timestamp=(new Date).toISOString(),Error.captureStackTrace&&Error.captureStackTrace(this,AppError)}toJSON(){const r={code:this.code,category:this.category,message:this.message,userMessage:this.userMessage,timestamp:this.timestamp};return void 0!==this.details&&(r.details=this.details),this.cause&&(this.cause instanceof AppError?r.cause=this.cause.toJSON():r.cause={message:this.cause.message,stack:this.cause.stack}),r}getErrorChain(){const r=[this];let e=this.cause;for(;e;)r.push(e),e=e instanceof AppError?e.cause:void 0;return r}getRootCause(){const r=this.getErrorChain();return r[r.length-1]}hasErrorCode(r){return this.getErrorChain().some(e=>e instanceof AppError&&e.code===r)}hasErrorCategory(r){return this.getErrorChain().some(e=>e instanceof AppError&&e.category===r)}toLogString(){const r=[`[${this.code}]`,this.message];return this.details&&r.push(`Details: ${JSON.stringify(this.details)}`),this.cause&&r.push(`Caused by: ${this.cause.message}`),r.join(" | ")}}export function isAppError(r){return r instanceof AppError}export function isErrorCode(r,e){return isAppError(r)&&r.code===e}export function isErrorCategory(r,e){return isAppError(r)&&r.category===e}export function isLLMError(r){return isErrorCategory(r,"LLM")}export function isConfigError(r){return isErrorCategory(r,"CONFIG")}export function isNetworkError(r){return isErrorCategory(r,"NETWORK")}export function isAuthError(r){return isErrorCategory(r,"AUTH")}
@@ -46,4 +46,3 @@ export declare const ERROR_USER_MESSAGES: Record<ErrorCode, string>;
46
46
  export declare function getErrorCategory(code: ErrorCode): ErrorCategory;
47
47
  export declare function getErrorUserMessage(code: ErrorCode): string;
48
48
  export declare function isErrorInCategory(code: ErrorCode, category: ErrorCategory): boolean;
49
- //# sourceMappingURL=error-codes.d.ts.map
@@ -1,115 +1 @@
1
- export const ErrorCategory = {
2
- CONFIG: "CONFIG",
3
- AUTH: "AUTH",
4
- NETWORK: "NETWORK",
5
- LLM: "LLM",
6
- VALIDATION: "VALIDATION",
7
- BUSINESS: "BUSINESS",
8
- SYSTEM: "SYSTEM",
9
- };
10
- export const ErrorCode = {
11
- LLM_UNAUTHORIZED: "LLM_UNAUTHORIZED",
12
- LLM_MODEL_NOT_FOUND: "LLM_MODEL_NOT_FOUND",
13
- LLM_RATE_LIMITED: "LLM_RATE_LIMITED",
14
- LLM_TIMEOUT: "LLM_TIMEOUT",
15
- LLM_GENERATION_FAILED: "LLM_GENERATION_FAILED",
16
- LLM_RESPONSE_PARSE_ERROR: "LLM_RESPONSE_PARSE_ERROR",
17
- CONFIG_NOT_FOUND: "CONFIG_NOT_FOUND",
18
- CONFIG_INVALID: "CONFIG_INVALID",
19
- CONFIG_MISSING_FIELD: "CONFIG_MISSING_FIELD",
20
- CONFIG_LOAD_FAILED: "CONFIG_LOAD_FAILED",
21
- NETWORK_TIMEOUT: "NETWORK_TIMEOUT",
22
- NETWORK_CONNECTION_FAILED: "NETWORK_CONNECTION_FAILED",
23
- NETWORK_HTTP_ERROR: "NETWORK_HTTP_ERROR",
24
- NETWORK_DNS_FAILED: "NETWORK_DNS_FAILED",
25
- AUTH_UNAUTHORIZED: "AUTH_UNAUTHORIZED",
26
- AUTH_FORBIDDEN: "AUTH_FORBIDDEN",
27
- AUTH_TOKEN_EXPIRED: "AUTH_TOKEN_EXPIRED",
28
- AUTH_TOKEN_INVALID: "AUTH_TOKEN_INVALID",
29
- VALIDATION_INVALID_INPUT: "VALIDATION_INVALID_INPUT",
30
- VALIDATION_MISSING_REQUIRED: "VALIDATION_MISSING_REQUIRED",
31
- VALIDATION_FORMAT_ERROR: "VALIDATION_FORMAT_ERROR",
32
- VALIDATION_SCHEMA_ERROR: "VALIDATION_SCHEMA_ERROR",
33
- BUSINESS_RULE_VIOLATION: "BUSINESS_RULE_VIOLATION",
34
- BUSINESS_RESOURCE_NOT_FOUND: "BUSINESS_RESOURCE_NOT_FOUND",
35
- BUSINESS_RESOURCE_EXISTS: "BUSINESS_RESOURCE_EXISTS",
36
- BUSINESS_OPERATION_NOT_ALLOWED: "BUSINESS_OPERATION_NOT_ALLOWED",
37
- SYSTEM_INTERNAL: "SYSTEM_INTERNAL",
38
- SYSTEM_DEPENDENCY_FAILED: "SYSTEM_DEPENDENCY_FAILED",
39
- SYSTEM_RESOURCE_UNAVAILABLE: "SYSTEM_RESOURCE_UNAVAILABLE",
40
- SYSTEM_UNKNOWN: "SYSTEM_UNKNOWN",
41
- };
42
- export const ERROR_CODE_TO_CATEGORY = {
43
- [ErrorCode.LLM_UNAUTHORIZED]: ErrorCategory.LLM,
44
- [ErrorCode.LLM_MODEL_NOT_FOUND]: ErrorCategory.LLM,
45
- [ErrorCode.LLM_RATE_LIMITED]: ErrorCategory.LLM,
46
- [ErrorCode.LLM_TIMEOUT]: ErrorCategory.LLM,
47
- [ErrorCode.LLM_GENERATION_FAILED]: ErrorCategory.LLM,
48
- [ErrorCode.LLM_RESPONSE_PARSE_ERROR]: ErrorCategory.LLM,
49
- [ErrorCode.CONFIG_NOT_FOUND]: ErrorCategory.CONFIG,
50
- [ErrorCode.CONFIG_INVALID]: ErrorCategory.CONFIG,
51
- [ErrorCode.CONFIG_MISSING_FIELD]: ErrorCategory.CONFIG,
52
- [ErrorCode.CONFIG_LOAD_FAILED]: ErrorCategory.CONFIG,
53
- [ErrorCode.NETWORK_TIMEOUT]: ErrorCategory.NETWORK,
54
- [ErrorCode.NETWORK_CONNECTION_FAILED]: ErrorCategory.NETWORK,
55
- [ErrorCode.NETWORK_HTTP_ERROR]: ErrorCategory.NETWORK,
56
- [ErrorCode.NETWORK_DNS_FAILED]: ErrorCategory.NETWORK,
57
- [ErrorCode.AUTH_UNAUTHORIZED]: ErrorCategory.AUTH,
58
- [ErrorCode.AUTH_FORBIDDEN]: ErrorCategory.AUTH,
59
- [ErrorCode.AUTH_TOKEN_EXPIRED]: ErrorCategory.AUTH,
60
- [ErrorCode.AUTH_TOKEN_INVALID]: ErrorCategory.AUTH,
61
- [ErrorCode.VALIDATION_INVALID_INPUT]: ErrorCategory.VALIDATION,
62
- [ErrorCode.VALIDATION_MISSING_REQUIRED]: ErrorCategory.VALIDATION,
63
- [ErrorCode.VALIDATION_FORMAT_ERROR]: ErrorCategory.VALIDATION,
64
- [ErrorCode.VALIDATION_SCHEMA_ERROR]: ErrorCategory.VALIDATION,
65
- [ErrorCode.BUSINESS_RULE_VIOLATION]: ErrorCategory.BUSINESS,
66
- [ErrorCode.BUSINESS_RESOURCE_NOT_FOUND]: ErrorCategory.BUSINESS,
67
- [ErrorCode.BUSINESS_RESOURCE_EXISTS]: ErrorCategory.BUSINESS,
68
- [ErrorCode.BUSINESS_OPERATION_NOT_ALLOWED]: ErrorCategory.BUSINESS,
69
- [ErrorCode.SYSTEM_INTERNAL]: ErrorCategory.SYSTEM,
70
- [ErrorCode.SYSTEM_DEPENDENCY_FAILED]: ErrorCategory.SYSTEM,
71
- [ErrorCode.SYSTEM_RESOURCE_UNAVAILABLE]: ErrorCategory.SYSTEM,
72
- [ErrorCode.SYSTEM_UNKNOWN]: ErrorCategory.SYSTEM,
73
- };
74
- export const ERROR_USER_MESSAGES = {
75
- [ErrorCode.LLM_UNAUTHORIZED]: "AI 服务认证失败,请检查配置",
76
- [ErrorCode.LLM_MODEL_NOT_FOUND]: "所选模型暂时不可用,请尝试其他模型",
77
- [ErrorCode.LLM_RATE_LIMITED]: "请求过于频繁,请稍后重试",
78
- [ErrorCode.LLM_TIMEOUT]: "AI 响应超时,请稍后重试",
79
- [ErrorCode.LLM_GENERATION_FAILED]: "内容生成失败,请稍后重试",
80
- [ErrorCode.LLM_RESPONSE_PARSE_ERROR]: "AI 响应格式异常,请重试",
81
- [ErrorCode.CONFIG_NOT_FOUND]: "配置数据未找到,请先进行初始化",
82
- [ErrorCode.CONFIG_INVALID]: "配置格式无效,请检查配置",
83
- [ErrorCode.CONFIG_MISSING_FIELD]: "配置缺少必需字段",
84
- [ErrorCode.CONFIG_LOAD_FAILED]: "配置加载失败,请重试",
85
- [ErrorCode.NETWORK_TIMEOUT]: "网络请求超时,请检查网络连接",
86
- [ErrorCode.NETWORK_CONNECTION_FAILED]: "网络连接失败,请检查网络",
87
- [ErrorCode.NETWORK_HTTP_ERROR]: "服务器返回错误,请稍后重试",
88
- [ErrorCode.NETWORK_DNS_FAILED]: "域名解析失败,请检查网络",
89
- [ErrorCode.AUTH_UNAUTHORIZED]: "请先登录",
90
- [ErrorCode.AUTH_FORBIDDEN]: "您没有权限执行此操作",
91
- [ErrorCode.AUTH_TOKEN_EXPIRED]: "登录已过期,请重新登录",
92
- [ErrorCode.AUTH_TOKEN_INVALID]: "认证信息无效,请重新登录",
93
- [ErrorCode.VALIDATION_INVALID_INPUT]: "输入参数无效",
94
- [ErrorCode.VALIDATION_MISSING_REQUIRED]: "缺少必需参数",
95
- [ErrorCode.VALIDATION_FORMAT_ERROR]: "数据格式错误",
96
- [ErrorCode.VALIDATION_SCHEMA_ERROR]: "数据验证失败",
97
- [ErrorCode.BUSINESS_RULE_VIOLATION]: "操作违反业务规则",
98
- [ErrorCode.BUSINESS_RESOURCE_NOT_FOUND]: "请求的资源不存在",
99
- [ErrorCode.BUSINESS_RESOURCE_EXISTS]: "资源已存在",
100
- [ErrorCode.BUSINESS_OPERATION_NOT_ALLOWED]: "当前操作不被允许",
101
- [ErrorCode.SYSTEM_INTERNAL]: "系统内部错误,请稍后重试",
102
- [ErrorCode.SYSTEM_DEPENDENCY_FAILED]: "依赖服务异常,请稍后重试",
103
- [ErrorCode.SYSTEM_RESOURCE_UNAVAILABLE]: "系统资源不可用,请稍后重试",
104
- [ErrorCode.SYSTEM_UNKNOWN]: "发生未知错误,请稍后重试",
105
- };
106
- export function getErrorCategory(code) {
107
- return ERROR_CODE_TO_CATEGORY[code];
108
- }
109
- export function getErrorUserMessage(code) {
110
- return ERROR_USER_MESSAGES[code];
111
- }
112
- export function isErrorInCategory(code, category) {
113
- return ERROR_CODE_TO_CATEGORY[code] === category;
114
- }
115
- //# sourceMappingURL=error-codes.js.map
1
+ export const ErrorCategory={CONFIG:"CONFIG",AUTH:"AUTH",NETWORK:"NETWORK",LLM:"LLM",VALIDATION:"VALIDATION",BUSINESS:"BUSINESS",SYSTEM:"SYSTEM"};export const ErrorCode={LLM_UNAUTHORIZED:"LLM_UNAUTHORIZED",LLM_MODEL_NOT_FOUND:"LLM_MODEL_NOT_FOUND",LLM_RATE_LIMITED:"LLM_RATE_LIMITED",LLM_TIMEOUT:"LLM_TIMEOUT",LLM_GENERATION_FAILED:"LLM_GENERATION_FAILED",LLM_RESPONSE_PARSE_ERROR:"LLM_RESPONSE_PARSE_ERROR",CONFIG_NOT_FOUND:"CONFIG_NOT_FOUND",CONFIG_INVALID:"CONFIG_INVALID",CONFIG_MISSING_FIELD:"CONFIG_MISSING_FIELD",CONFIG_LOAD_FAILED:"CONFIG_LOAD_FAILED",NETWORK_TIMEOUT:"NETWORK_TIMEOUT",NETWORK_CONNECTION_FAILED:"NETWORK_CONNECTION_FAILED",NETWORK_HTTP_ERROR:"NETWORK_HTTP_ERROR",NETWORK_DNS_FAILED:"NETWORK_DNS_FAILED",AUTH_UNAUTHORIZED:"AUTH_UNAUTHORIZED",AUTH_FORBIDDEN:"AUTH_FORBIDDEN",AUTH_TOKEN_EXPIRED:"AUTH_TOKEN_EXPIRED",AUTH_TOKEN_INVALID:"AUTH_TOKEN_INVALID",VALIDATION_INVALID_INPUT:"VALIDATION_INVALID_INPUT",VALIDATION_MISSING_REQUIRED:"VALIDATION_MISSING_REQUIRED",VALIDATION_FORMAT_ERROR:"VALIDATION_FORMAT_ERROR",VALIDATION_SCHEMA_ERROR:"VALIDATION_SCHEMA_ERROR",BUSINESS_RULE_VIOLATION:"BUSINESS_RULE_VIOLATION",BUSINESS_RESOURCE_NOT_FOUND:"BUSINESS_RESOURCE_NOT_FOUND",BUSINESS_RESOURCE_EXISTS:"BUSINESS_RESOURCE_EXISTS",BUSINESS_OPERATION_NOT_ALLOWED:"BUSINESS_OPERATION_NOT_ALLOWED",SYSTEM_INTERNAL:"SYSTEM_INTERNAL",SYSTEM_DEPENDENCY_FAILED:"SYSTEM_DEPENDENCY_FAILED",SYSTEM_RESOURCE_UNAVAILABLE:"SYSTEM_RESOURCE_UNAVAILABLE",SYSTEM_UNKNOWN:"SYSTEM_UNKNOWN"};export const ERROR_CODE_TO_CATEGORY={[ErrorCode.LLM_UNAUTHORIZED]:ErrorCategory.LLM,[ErrorCode.LLM_MODEL_NOT_FOUND]:ErrorCategory.LLM,[ErrorCode.LLM_RATE_LIMITED]:ErrorCategory.LLM,[ErrorCode.LLM_TIMEOUT]:ErrorCategory.LLM,[ErrorCode.LLM_GENERATION_FAILED]:ErrorCategory.LLM,[ErrorCode.LLM_RESPONSE_PARSE_ERROR]:ErrorCategory.LLM,[ErrorCode.CONFIG_NOT_FOUND]:ErrorCategory.CONFIG,[ErrorCode.CONFIG_INVALID]:ErrorCategory.CONFIG,[ErrorCode.CONFIG_MISSING_FIELD]:ErrorCategory.CONFIG,[ErrorCode.CONFIG_LOAD_FAILED]:ErrorCategory.CONFIG,[ErrorCode.NETWORK_TIMEOUT]:ErrorCategory.NETWORK,[ErrorCode.NETWORK_CONNECTION_FAILED]:ErrorCategory.NETWORK,[ErrorCode.NETWORK_HTTP_ERROR]:ErrorCategory.NETWORK,[ErrorCode.NETWORK_DNS_FAILED]:ErrorCategory.NETWORK,[ErrorCode.AUTH_UNAUTHORIZED]:ErrorCategory.AUTH,[ErrorCode.AUTH_FORBIDDEN]:ErrorCategory.AUTH,[ErrorCode.AUTH_TOKEN_EXPIRED]:ErrorCategory.AUTH,[ErrorCode.AUTH_TOKEN_INVALID]:ErrorCategory.AUTH,[ErrorCode.VALIDATION_INVALID_INPUT]:ErrorCategory.VALIDATION,[ErrorCode.VALIDATION_MISSING_REQUIRED]:ErrorCategory.VALIDATION,[ErrorCode.VALIDATION_FORMAT_ERROR]:ErrorCategory.VALIDATION,[ErrorCode.VALIDATION_SCHEMA_ERROR]:ErrorCategory.VALIDATION,[ErrorCode.BUSINESS_RULE_VIOLATION]:ErrorCategory.BUSINESS,[ErrorCode.BUSINESS_RESOURCE_NOT_FOUND]:ErrorCategory.BUSINESS,[ErrorCode.BUSINESS_RESOURCE_EXISTS]:ErrorCategory.BUSINESS,[ErrorCode.BUSINESS_OPERATION_NOT_ALLOWED]:ErrorCategory.BUSINESS,[ErrorCode.SYSTEM_INTERNAL]:ErrorCategory.SYSTEM,[ErrorCode.SYSTEM_DEPENDENCY_FAILED]:ErrorCategory.SYSTEM,[ErrorCode.SYSTEM_RESOURCE_UNAVAILABLE]:ErrorCategory.SYSTEM,[ErrorCode.SYSTEM_UNKNOWN]:ErrorCategory.SYSTEM};export const ERROR_USER_MESSAGES={[ErrorCode.LLM_UNAUTHORIZED]:"AI 服务认证失败,请检查配置",[ErrorCode.LLM_MODEL_NOT_FOUND]:"所选模型暂时不可用,请尝试其他模型",[ErrorCode.LLM_RATE_LIMITED]:"请求过于频繁,请稍后重试",[ErrorCode.LLM_TIMEOUT]:"AI 响应超时,请稍后重试",[ErrorCode.LLM_GENERATION_FAILED]:"内容生成失败,请稍后重试",[ErrorCode.LLM_RESPONSE_PARSE_ERROR]:"AI 响应格式异常,请重试",[ErrorCode.CONFIG_NOT_FOUND]:"配置数据未找到,请先进行初始化",[ErrorCode.CONFIG_INVALID]:"配置格式无效,请检查配置",[ErrorCode.CONFIG_MISSING_FIELD]:"配置缺少必需字段",[ErrorCode.CONFIG_LOAD_FAILED]:"配置加载失败,请重试",[ErrorCode.NETWORK_TIMEOUT]:"网络请求超时,请检查网络连接",[ErrorCode.NETWORK_CONNECTION_FAILED]:"网络连接失败,请检查网络",[ErrorCode.NETWORK_HTTP_ERROR]:"服务器返回错误,请稍后重试",[ErrorCode.NETWORK_DNS_FAILED]:"域名解析失败,请检查网络",[ErrorCode.AUTH_UNAUTHORIZED]:"请先登录",[ErrorCode.AUTH_FORBIDDEN]:"您没有权限执行此操作",[ErrorCode.AUTH_TOKEN_EXPIRED]:"登录已过期,请重新登录",[ErrorCode.AUTH_TOKEN_INVALID]:"认证信息无效,请重新登录",[ErrorCode.VALIDATION_INVALID_INPUT]:"输入参数无效",[ErrorCode.VALIDATION_MISSING_REQUIRED]:"缺少必需参数",[ErrorCode.VALIDATION_FORMAT_ERROR]:"数据格式错误",[ErrorCode.VALIDATION_SCHEMA_ERROR]:"数据验证失败",[ErrorCode.BUSINESS_RULE_VIOLATION]:"操作违反业务规则",[ErrorCode.BUSINESS_RESOURCE_NOT_FOUND]:"请求的资源不存在",[ErrorCode.BUSINESS_RESOURCE_EXISTS]:"资源已存在",[ErrorCode.BUSINESS_OPERATION_NOT_ALLOWED]:"当前操作不被允许",[ErrorCode.SYSTEM_INTERNAL]:"系统内部错误,请稍后重试",[ErrorCode.SYSTEM_DEPENDENCY_FAILED]:"依赖服务异常,请稍后重试",[ErrorCode.SYSTEM_RESOURCE_UNAVAILABLE]:"系统资源不可用,请稍后重试",[ErrorCode.SYSTEM_UNKNOWN]:"发生未知错误,请稍后重试"};export function getErrorCategory(E){return ERROR_CODE_TO_CATEGORY[E]}export function getErrorUserMessage(E){return ERROR_USER_MESSAGES[E]}export function isErrorInCategory(E,r){return ERROR_CODE_TO_CATEGORY[E]===r}
@@ -28,4 +28,3 @@ export declare function createValidationError(code: typeof ErrorCode.VALIDATION_
28
28
  export declare function createBusinessError(code: typeof ErrorCode.BUSINESS_RULE_VIOLATION | typeof ErrorCode.BUSINESS_RESOURCE_NOT_FOUND | typeof ErrorCode.BUSINESS_RESOURCE_EXISTS | typeof ErrorCode.BUSINESS_OPERATION_NOT_ALLOWED, message: string, userMessage?: string, details?: unknown): AppError;
29
29
  export declare function createSystemError(code: typeof ErrorCode.SYSTEM_INTERNAL | typeof ErrorCode.SYSTEM_DEPENDENCY_FAILED | typeof ErrorCode.SYSTEM_RESOURCE_UNAVAILABLE | typeof ErrorCode.SYSTEM_UNKNOWN, message: string, cause?: Error, details?: unknown): AppError;
30
30
  export declare function createStructuredOutputError(code: typeof ErrorCode.LLM_RESPONSE_PARSE_ERROR, cause: Error, context: StructuredOutputErrorContext): AppError;
31
- //# sourceMappingURL=error-factory.d.ts.map
@@ -1,86 +1 @@
1
- import { AppError } from "./app-error.js";
2
- import { ErrorCode } from "./error-codes.js";
3
- export function createLLMError(code, cause, context) {
4
- const modelInfo = context?.model ? ` (model: ${context.model})` : "";
5
- const providerInfo = context?.provider ? ` [${context.provider}]` : "";
6
- const messages = {
7
- [ErrorCode.LLM_UNAUTHORIZED]: `LLM API authentication failed${providerInfo}${modelInfo}`,
8
- [ErrorCode.LLM_MODEL_NOT_FOUND]: `Model not found or unavailable${modelInfo}${providerInfo}`,
9
- [ErrorCode.LLM_RATE_LIMITED]: `LLM API rate limited${providerInfo}`,
10
- [ErrorCode.LLM_TIMEOUT]: `LLM API request timeout${providerInfo}${modelInfo}`,
11
- [ErrorCode.LLM_GENERATION_FAILED]: `LLM generation failed${providerInfo}${modelInfo}`,
12
- [ErrorCode.LLM_RESPONSE_PARSE_ERROR]: `Failed to parse LLM response${providerInfo}`,
13
- };
14
- return new AppError({
15
- code,
16
- message: messages[code] || `LLM error: ${cause.message}`,
17
- cause,
18
- details: context,
19
- });
20
- }
21
- export function createConfigError(code, message, context, cause) {
22
- return new AppError({
23
- code,
24
- message,
25
- ...(cause !== undefined ? { cause } : {}),
26
- ...(context !== undefined ? { details: context } : {}),
27
- });
28
- }
29
- export function createNetworkError(code, cause, context) {
30
- const urlInfo = context?.url ? ` (${context.url})` : "";
31
- const statusInfo = context?.statusCode ? ` [${context.statusCode}]` : "";
32
- const messages = {
33
- [ErrorCode.NETWORK_TIMEOUT]: `Network request timeout${urlInfo}`,
34
- [ErrorCode.NETWORK_CONNECTION_FAILED]: `Failed to connect${urlInfo}`,
35
- [ErrorCode.NETWORK_HTTP_ERROR]: `HTTP error${statusInfo}${urlInfo}`,
36
- [ErrorCode.NETWORK_DNS_FAILED]: `DNS resolution failed${urlInfo}`,
37
- };
38
- return new AppError({
39
- code,
40
- message: messages[code] || `Network error: ${cause.message}`,
41
- cause,
42
- details: context,
43
- });
44
- }
45
- export function createValidationError(code, message, details) {
46
- return new AppError({
47
- code,
48
- message,
49
- ...(details !== undefined ? { details } : {}),
50
- });
51
- }
52
- export function createBusinessError(code, message, userMessage, details) {
53
- return new AppError({
54
- code,
55
- message,
56
- ...(userMessage !== undefined ? { userMessage } : {}),
57
- ...(details !== undefined ? { details } : {}),
58
- });
59
- }
60
- export function createSystemError(code, message, cause, details) {
61
- return new AppError({
62
- code,
63
- message,
64
- ...(cause !== undefined ? { cause } : {}),
65
- ...(details !== undefined ? { details } : {}),
66
- });
67
- }
68
- export function createStructuredOutputError(code, cause, context) {
69
- const formatInfo = context.isMarkdownFormat ? " (detected markdown format)" : "";
70
- const schemaInfo = context.schemaName ? ` for schema "${context.schemaName}"` : "";
71
- return new AppError({
72
- code,
73
- message: `Failed to parse structured output${schemaInfo}${formatInfo}`,
74
- cause,
75
- details: {
76
- rawText: context.rawText,
77
- isMarkdownFormat: context.isMarkdownFormat,
78
- parseErrorMessage: context.parseErrorMessage,
79
- model: context.model,
80
- provider: context.provider,
81
- schemaName: context.schemaName,
82
- usage: context.usage,
83
- },
84
- });
85
- }
86
- //# sourceMappingURL=error-factory.js.map
1
+ import{AppError as e}from"./app-error.js";import{ErrorCode as r}from"./error-codes.js";export function createLLMError(o,t,a){const s=a?.model?` (model: ${a.model})`:"",d=a?.provider?` [${a.provider}]`:"",i={[r.LLM_UNAUTHORIZED]:`LLM API authentication failed${d}${s}`,[r.LLM_MODEL_NOT_FOUND]:`Model not found or unavailable${s}${d}`,[r.LLM_RATE_LIMITED]:`LLM API rate limited${d}`,[r.LLM_TIMEOUT]:`LLM API request timeout${d}${s}`,[r.LLM_GENERATION_FAILED]:`LLM generation failed${d}${s}`,[r.LLM_RESPONSE_PARSE_ERROR]:`Failed to parse LLM response${d}`};return new e({code:o,message:i[o]||`LLM error: ${t.message}`,cause:t,details:a})}export function createConfigError(r,o,t,a){return new e({code:r,message:o,...void 0!==a?{cause:a}:{},...void 0!==t?{details:t}:{}})}export function createNetworkError(o,t,a){const s=a?.url?` (${a.url})`:"",d=a?.statusCode?` [${a.statusCode}]`:"",i={[r.NETWORK_TIMEOUT]:`Network request timeout${s}`,[r.NETWORK_CONNECTION_FAILED]:`Failed to connect${s}`,[r.NETWORK_HTTP_ERROR]:`HTTP error${d}${s}`,[r.NETWORK_DNS_FAILED]:`DNS resolution failed${s}`};return new e({code:o,message:i[o]||`Network error: ${t.message}`,cause:t,details:a})}export function createValidationError(r,o,t){return new e({code:r,message:o,...void 0!==t?{details:t}:{}})}export function createBusinessError(r,o,t,a){return new e({code:r,message:o,...void 0!==t?{userMessage:t}:{},...void 0!==a?{details:a}:{}})}export function createSystemError(r,o,t,a){return new e({code:r,message:o,...void 0!==t?{cause:t}:{},...void 0!==a?{details:a}:{}})}export function createStructuredOutputError(r,o,t){const a=t.isMarkdownFormat?" (detected markdown format)":"",s=t.schemaName?` for schema "${t.schemaName}"`:"";return new e({code:r,message:`Failed to parse structured output${s}${a}`,cause:o,details:{rawText:t.rawText,isMarkdownFormat:t.isMarkdownFormat,parseErrorMessage:t.parseErrorMessage,model:t.model,provider:t.provider,schemaName:t.schemaName,usage:t.usage}})}
@@ -37,4 +37,3 @@ export declare function extractErrorContext(error: AppError): ErrorContext;
37
37
  export declare function getUserMessage(error: unknown): string;
38
38
  export declare function logError(context: string, error: AppError): void;
39
39
  export {};
40
- //# sourceMappingURL=error-utils.d.ts.map