@panguard-ai/core 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.
- package/dist/adapters/adapter-registry.d.ts +150 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +271 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +101 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +160 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/defender-adapter.d.ts +90 -0
- package/dist/adapters/defender-adapter.d.ts.map +1 -0
- package/dist/adapters/defender-adapter.js +227 -0
- package/dist/adapters/defender-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +22 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +23 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/syslog-adapter.d.ts +207 -0
- package/dist/adapters/syslog-adapter.d.ts.map +1 -0
- package/dist/adapters/syslog-adapter.js +432 -0
- package/dist/adapters/syslog-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +135 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +13 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/wazuh-adapter.d.ts +120 -0
- package/dist/adapters/wazuh-adapter.d.ts.map +1 -0
- package/dist/adapters/wazuh-adapter.js +266 -0
- package/dist/adapters/wazuh-adapter.js.map +1 -0
- package/dist/ai/claude-provider.d.ts +66 -0
- package/dist/ai/claude-provider.d.ts.map +1 -0
- package/dist/ai/claude-provider.js +166 -0
- package/dist/ai/claude-provider.js.map +1 -0
- package/dist/ai/funnel-router.d.ts +75 -0
- package/dist/ai/funnel-router.d.ts.map +1 -0
- package/dist/ai/funnel-router.js +173 -0
- package/dist/ai/funnel-router.js.map +1 -0
- package/dist/ai/index.d.ts +77 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +95 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/ollama-provider.d.ts +73 -0
- package/dist/ai/ollama-provider.d.ts.map +1 -0
- package/dist/ai/ollama-provider.js +200 -0
- package/dist/ai/ollama-provider.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +70 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +175 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/prompts/event-classifier.d.ts +25 -0
- package/dist/ai/prompts/event-classifier.d.ts.map +1 -0
- package/dist/ai/prompts/event-classifier.js +94 -0
- package/dist/ai/prompts/event-classifier.js.map +1 -0
- package/dist/ai/prompts/index.d.ts +13 -0
- package/dist/ai/prompts/index.d.ts.map +1 -0
- package/dist/ai/prompts/index.js +13 -0
- package/dist/ai/prompts/index.js.map +1 -0
- package/dist/ai/prompts/report-generator.d.ts +25 -0
- package/dist/ai/prompts/report-generator.d.ts.map +1 -0
- package/dist/ai/prompts/report-generator.js +131 -0
- package/dist/ai/prompts/report-generator.js.map +1 -0
- package/dist/ai/prompts/threat-analyzer.d.ts +26 -0
- package/dist/ai/prompts/threat-analyzer.d.ts.map +1 -0
- package/dist/ai/prompts/threat-analyzer.js +75 -0
- package/dist/ai/prompts/threat-analyzer.js.map +1 -0
- package/dist/ai/provider-base.d.ts +100 -0
- package/dist/ai/provider-base.d.ts.map +1 -0
- package/dist/ai/provider-base.js +166 -0
- package/dist/ai/provider-base.js.map +1 -0
- package/dist/ai/response-parser.d.ts +36 -0
- package/dist/ai/response-parser.d.ts.map +1 -0
- package/dist/ai/response-parser.js +195 -0
- package/dist/ai/response-parser.js.map +1 -0
- package/dist/ai/token-tracker.d.ts +72 -0
- package/dist/ai/token-tracker.d.ts.map +1 -0
- package/dist/ai/token-tracker.js +145 -0
- package/dist/ai/token-tracker.js.map +1 -0
- package/dist/ai/types.d.ts +138 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +12 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/index.d.ts +146 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +515 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +58 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +327 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/wizard.d.ts +58 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +200 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/discovery/firewall-checker.d.ts +28 -0
- package/dist/discovery/firewall-checker.d.ts.map +1 -0
- package/dist/discovery/firewall-checker.js +379 -0
- package/dist/discovery/firewall-checker.js.map +1 -0
- package/dist/discovery/index.d.ts +23 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +29 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/network-scanner.d.ts +60 -0
- package/dist/discovery/network-scanner.d.ts.map +1 -0
- package/dist/discovery/network-scanner.js +640 -0
- package/dist/discovery/network-scanner.js.map +1 -0
- package/dist/discovery/os-detector.d.ts +24 -0
- package/dist/discovery/os-detector.d.ts.map +1 -0
- package/dist/discovery/os-detector.js +253 -0
- package/dist/discovery/os-detector.js.map +1 -0
- package/dist/discovery/osquery-provider.d.ts +127 -0
- package/dist/discovery/osquery-provider.d.ts.map +1 -0
- package/dist/discovery/osquery-provider.js +214 -0
- package/dist/discovery/osquery-provider.js.map +1 -0
- package/dist/discovery/risk-scorer.d.ts +66 -0
- package/dist/discovery/risk-scorer.d.ts.map +1 -0
- package/dist/discovery/risk-scorer.js +294 -0
- package/dist/discovery/risk-scorer.js.map +1 -0
- package/dist/discovery/security-tools.d.ts +31 -0
- package/dist/discovery/security-tools.d.ts.map +1 -0
- package/dist/discovery/security-tools.js +346 -0
- package/dist/discovery/security-tools.js.map +1 -0
- package/dist/discovery/service-detector.d.ts +28 -0
- package/dist/discovery/service-detector.d.ts.map +1 -0
- package/dist/discovery/service-detector.js +300 -0
- package/dist/discovery/service-detector.js.map +1 -0
- package/dist/discovery/types.d.ts +502 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +12 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/discovery/user-auditor.d.ts +28 -0
- package/dist/discovery/user-auditor.d.ts.map +1 -0
- package/dist/discovery/user-auditor.js +385 -0
- package/dist/discovery/user-auditor.js.map +1 -0
- package/dist/i18n/config.d.ts +45 -0
- package/dist/i18n/config.d.ts.map +1 -0
- package/dist/i18n/config.js +135 -0
- package/dist/i18n/config.js.map +1 -0
- package/dist/i18n/index.d.ts +8 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +8 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/monitor/event-normalizer.d.ts +102 -0
- package/dist/monitor/event-normalizer.d.ts.map +1 -0
- package/dist/monitor/event-normalizer.js +195 -0
- package/dist/monitor/event-normalizer.js.map +1 -0
- package/dist/monitor/file-monitor.d.ts +90 -0
- package/dist/monitor/file-monitor.d.ts.map +1 -0
- package/dist/monitor/file-monitor.js +222 -0
- package/dist/monitor/file-monitor.js.map +1 -0
- package/dist/monitor/index.d.ts +147 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +293 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/log-monitor.d.ts +102 -0
- package/dist/monitor/log-monitor.d.ts.map +1 -0
- package/dist/monitor/log-monitor.js +245 -0
- package/dist/monitor/log-monitor.js.map +1 -0
- package/dist/monitor/network-monitor.d.ts +103 -0
- package/dist/monitor/network-monitor.d.ts.map +1 -0
- package/dist/monitor/network-monitor.js +336 -0
- package/dist/monitor/network-monitor.js.map +1 -0
- package/dist/monitor/process-monitor.d.ts +108 -0
- package/dist/monitor/process-monitor.d.ts.map +1 -0
- package/dist/monitor/process-monitor.js +245 -0
- package/dist/monitor/process-monitor.js.map +1 -0
- package/dist/monitor/threat-intel-feeds.d.ts +141 -0
- package/dist/monitor/threat-intel-feeds.d.ts.map +1 -0
- package/dist/monitor/threat-intel-feeds.js +430 -0
- package/dist/monitor/threat-intel-feeds.js.map +1 -0
- package/dist/monitor/threat-intel.d.ts +83 -0
- package/dist/monitor/threat-intel.d.ts.map +1 -0
- package/dist/monitor/threat-intel.js +215 -0
- package/dist/monitor/threat-intel.js.map +1 -0
- package/dist/monitor/types.d.ts +65 -0
- package/dist/monitor/types.d.ts.map +1 -0
- package/dist/monitor/types.js +20 -0
- package/dist/monitor/types.js.map +1 -0
- package/dist/rules/index.d.ts +115 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +244 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/rule-loader.d.ts +54 -0
- package/dist/rules/rule-loader.d.ts.map +1 -0
- package/dist/rules/rule-loader.js +167 -0
- package/dist/rules/rule-loader.js.map +1 -0
- package/dist/rules/sigma-matcher.d.ts +40 -0
- package/dist/rules/sigma-matcher.d.ts.map +1 -0
- package/dist/rules/sigma-matcher.js +447 -0
- package/dist/rules/sigma-matcher.js.map +1 -0
- package/dist/rules/sigma-parser.d.ts +36 -0
- package/dist/rules/sigma-parser.d.ts.map +1 -0
- package/dist/rules/sigma-parser.js +180 -0
- package/dist/rules/sigma-parser.js.map +1 -0
- package/dist/rules/types.d.ts +112 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +11 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/yara-scanner.d.ts +103 -0
- package/dist/rules/yara-scanner.d.ts.map +1 -0
- package/dist/rules/yara-scanner.js +421 -0
- package/dist/rules/yara-scanner.js.map +1 -0
- package/dist/scoring/achievements.d.ts +76 -0
- package/dist/scoring/achievements.d.ts.map +1 -0
- package/dist/scoring/achievements.js +211 -0
- package/dist/scoring/achievements.js.map +1 -0
- package/dist/scoring/index.d.ts +3 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +3 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/security-score.d.ts +60 -0
- package/dist/scoring/security-score.d.ts.map +1 -0
- package/dist/scoring/security-score.js +211 -0
- package/dist/scoring/security-score.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +38 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +71 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +35 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +56 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM response parsing utilities
|
|
3
|
+
* LLM 回應解析工具
|
|
4
|
+
*
|
|
5
|
+
* Parses raw LLM text responses into structured data objects.
|
|
6
|
+
* Supports JSON extraction from markdown code blocks and plain text fallback.
|
|
7
|
+
* 將原始 LLM 文字回應解析為結構化資料物件。
|
|
8
|
+
* 支援從 Markdown 程式碼區塊提取 JSON 以及純文字回退。
|
|
9
|
+
*
|
|
10
|
+
* @module @panguard-ai/core/ai/response-parser
|
|
11
|
+
*/
|
|
12
|
+
import { createLogger } from '../utils/logger.js';
|
|
13
|
+
const logger = createLogger('ai:response-parser');
|
|
14
|
+
/**
|
|
15
|
+
* Valid severity values for validation
|
|
16
|
+
* 用於驗證的有效嚴重等級值
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
const VALID_SEVERITIES = new Set([
|
|
20
|
+
'info',
|
|
21
|
+
'low',
|
|
22
|
+
'medium',
|
|
23
|
+
'high',
|
|
24
|
+
'critical',
|
|
25
|
+
]);
|
|
26
|
+
/**
|
|
27
|
+
* Attempt to extract a JSON object from a raw string
|
|
28
|
+
* 嘗試從原始字串中提取 JSON 物件
|
|
29
|
+
*
|
|
30
|
+
* Tries in order: direct JSON.parse, markdown code block extraction, brace extraction.
|
|
31
|
+
* 依序嘗試:直接 JSON.parse、Markdown 程式碼區塊提取、大括號提取。
|
|
32
|
+
*
|
|
33
|
+
* @param raw - Raw LLM response text / 原始 LLM 回應文字
|
|
34
|
+
* @returns Parsed object or null if parsing fails / 解析的物件,或解析失敗時回傳 null
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
function extractJson(raw) {
|
|
38
|
+
const trimmed = raw.trim();
|
|
39
|
+
// Strategy 1: Direct JSON.parse
|
|
40
|
+
// 策略 1:直接 JSON.parse
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(trimmed);
|
|
43
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Not pure JSON, try next strategy
|
|
49
|
+
// 非純 JSON,嘗試下一個策略
|
|
50
|
+
}
|
|
51
|
+
// Strategy 2: Extract from markdown code block (```json ... ``` or ``` ... ```)
|
|
52
|
+
// 策略 2:從 Markdown 程式碼區塊提取
|
|
53
|
+
const codeBlockMatch = trimmed.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);
|
|
54
|
+
if (codeBlockMatch?.[1]) {
|
|
55
|
+
try {
|
|
56
|
+
const parsed = JSON.parse(codeBlockMatch[1].trim());
|
|
57
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
58
|
+
return parsed;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Code block content is not valid JSON
|
|
63
|
+
// 程式碼區塊內容非有效 JSON
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Strategy 3: Find first { ... } block (greedy inner match)
|
|
67
|
+
// 策略 3:尋找第一個 { ... } 區塊
|
|
68
|
+
const braceStart = trimmed.indexOf('{');
|
|
69
|
+
const braceEnd = trimmed.lastIndexOf('}');
|
|
70
|
+
if (braceStart !== -1 && braceEnd > braceStart) {
|
|
71
|
+
try {
|
|
72
|
+
const jsonCandidate = trimmed.slice(braceStart, braceEnd + 1);
|
|
73
|
+
const parsed = JSON.parse(jsonCandidate);
|
|
74
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
75
|
+
return parsed;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Brace extraction failed
|
|
80
|
+
// 大括號提取失敗
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Validate and coerce a severity string
|
|
87
|
+
* 驗證並強制轉換嚴重等級字串
|
|
88
|
+
*
|
|
89
|
+
* @param value - Raw severity value / 原始嚴重等級值
|
|
90
|
+
* @returns Valid Severity or 'medium' as default / 有效嚴重等級或預設 'medium'
|
|
91
|
+
* @internal
|
|
92
|
+
*/
|
|
93
|
+
function coerceSeverity(value) {
|
|
94
|
+
if (typeof value === 'string' && VALID_SEVERITIES.has(value.toLowerCase())) {
|
|
95
|
+
return value.toLowerCase();
|
|
96
|
+
}
|
|
97
|
+
return 'medium';
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate and coerce a confidence value
|
|
101
|
+
* 驗證並強制轉換信心值
|
|
102
|
+
*
|
|
103
|
+
* @param value - Raw confidence value / 原始信心值
|
|
104
|
+
* @returns Number between 0 and 1, default 0.5 / 0 到 1 之間的數字,預設 0.5
|
|
105
|
+
* @internal
|
|
106
|
+
*/
|
|
107
|
+
function coerceConfidence(value) {
|
|
108
|
+
if (typeof value === 'number' && isFinite(value)) {
|
|
109
|
+
return Math.max(0, Math.min(1, value));
|
|
110
|
+
}
|
|
111
|
+
if (typeof value === 'string') {
|
|
112
|
+
const num = parseFloat(value);
|
|
113
|
+
if (isFinite(num)) {
|
|
114
|
+
return Math.max(0, Math.min(1, num));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return 0.5;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Parse a raw LLM response into an AnalysisResult
|
|
121
|
+
* 將原始 LLM 回應解析為 AnalysisResult
|
|
122
|
+
*
|
|
123
|
+
* Attempts JSON parsing first, then falls back to treating the entire
|
|
124
|
+
* response as a text summary.
|
|
125
|
+
* 首先嘗試 JSON 解析,然後回退到將整個回應視為文字摘要。
|
|
126
|
+
*
|
|
127
|
+
* @param raw - Raw LLM response text / 原始 LLM 回應文字
|
|
128
|
+
* @returns Parsed analysis result / 解析的分析結果
|
|
129
|
+
*/
|
|
130
|
+
export function parseAnalysisResponse(raw) {
|
|
131
|
+
const json = extractJson(raw);
|
|
132
|
+
if (json) {
|
|
133
|
+
logger.debug('Successfully parsed analysis response as JSON', {
|
|
134
|
+
keys: Object.keys(json),
|
|
135
|
+
});
|
|
136
|
+
const recommendations = Array.isArray(json['recommendations'])
|
|
137
|
+
? json['recommendations'].map(String)
|
|
138
|
+
: typeof json['recommendations'] === 'string'
|
|
139
|
+
? [json['recommendations']]
|
|
140
|
+
: [];
|
|
141
|
+
return {
|
|
142
|
+
summary: typeof json['summary'] === 'string' ? json['summary'] : raw.slice(0, 500),
|
|
143
|
+
severity: coerceSeverity(json['severity']),
|
|
144
|
+
confidence: coerceConfidence(json['confidence']),
|
|
145
|
+
recommendations,
|
|
146
|
+
rawResponse: raw,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Fallback: treat the entire response as a text summary
|
|
150
|
+
// 回退:將整個回應視為文字摘要
|
|
151
|
+
logger.debug('JSON parsing failed, using text fallback for analysis response');
|
|
152
|
+
return {
|
|
153
|
+
summary: raw.slice(0, 2000),
|
|
154
|
+
severity: 'medium',
|
|
155
|
+
confidence: 0.3,
|
|
156
|
+
recommendations: [],
|
|
157
|
+
rawResponse: raw,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Parse a raw LLM response into a ThreatClassification
|
|
162
|
+
* 將原始 LLM 回應解析為 ThreatClassification
|
|
163
|
+
*
|
|
164
|
+
* Attempts JSON parsing first, then falls back to a generic classification.
|
|
165
|
+
* 首先嘗試 JSON 解析,然後回退到通用分類。
|
|
166
|
+
*
|
|
167
|
+
* @param raw - Raw LLM response text / 原始 LLM 回應文字
|
|
168
|
+
* @returns Parsed threat classification / 解析的威脅分類
|
|
169
|
+
*/
|
|
170
|
+
export function parseClassificationResponse(raw) {
|
|
171
|
+
const json = extractJson(raw);
|
|
172
|
+
if (json) {
|
|
173
|
+
logger.debug('Successfully parsed classification response as JSON', {
|
|
174
|
+
keys: Object.keys(json),
|
|
175
|
+
});
|
|
176
|
+
return {
|
|
177
|
+
category: typeof json['category'] === 'string' ? json['category'] : 'Unknown',
|
|
178
|
+
technique: typeof json['technique'] === 'string' ? json['technique'] : 'T0000',
|
|
179
|
+
severity: coerceSeverity(json['severity']),
|
|
180
|
+
confidence: coerceConfidence(json['confidence']),
|
|
181
|
+
description: typeof json['description'] === 'string' ? json['description'] : raw.slice(0, 500),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
// Fallback: generic unclassified threat
|
|
185
|
+
// 回退:通用未分類威脅
|
|
186
|
+
logger.debug('JSON parsing failed, using text fallback for classification response');
|
|
187
|
+
return {
|
|
188
|
+
category: 'Unknown',
|
|
189
|
+
technique: 'T0000',
|
|
190
|
+
severity: 'medium',
|
|
191
|
+
confidence: 0.2,
|
|
192
|
+
description: raw.slice(0, 500),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=response-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-parser.js","sourceRoot":"","sources":["../../src/ai/response-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,MAAM,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;AAElD;;;;GAIG;AACH,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IACpD,MAAM;IACN,KAAK;IACL,QAAQ;IACR,MAAM;IACN,UAAU;CACX,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,gCAAgC;IAChC,qBAAqB;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC9D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;QACnC,kBAAkB;IACpB,CAAC;IAED,gFAAgF;IAChF,0BAA0B;IAC1B,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC9E,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;YAC/E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;YACvC,kBAAkB;QACpB,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,wBAAwB;IACxB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAA4B,CAAC;YACpE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;YAC1B,UAAU;QACZ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC,WAAW,EAAc,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE;YAC5D,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC5D,CAAC,CAAE,IAAI,CAAC,iBAAiB,CAAe,CAAC,GAAG,CAAC,MAAM,CAAC;YACpD,CAAC,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,QAAQ;gBAC3C,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAW,CAAC;gBACrC,CAAC,CAAC,EAAE,CAAC;QAET,OAAO;YACL,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAClF,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChD,eAAe;YACf,WAAW,EAAE,GAAG;SACjB,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,iBAAiB;IACjB,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAE/E,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAC3B,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,GAAG;QACf,eAAe,EAAE,EAAE;QACnB,WAAW,EAAE,GAAG;KACjB,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,KAAK,CAAC,qDAAqD,EAAE;YAClE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7E,SAAS,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO;YAC9E,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChD,WAAW,EACT,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACpF,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,aAAa;IACb,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAErF,OAAO;QACL,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,OAAO;QAClB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token usage tracking and cost estimation
|
|
3
|
+
* Token 使用追蹤與費用估算
|
|
4
|
+
*
|
|
5
|
+
* Tracks cumulative token usage across LLM requests and calculates
|
|
6
|
+
* estimated costs based on provider-specific pricing.
|
|
7
|
+
* 追蹤跨 LLM 請求的累計 Token 使用量,並根據供應商定價計算估算費用。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/ai/token-tracker
|
|
10
|
+
*/
|
|
11
|
+
import type { LLMProviderType, TokenUsage } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Tracks token usage and estimates cost for an LLM provider
|
|
14
|
+
* 追蹤 LLM 供應商的 Token 使用量並估算費用
|
|
15
|
+
*/
|
|
16
|
+
export declare class TokenTracker {
|
|
17
|
+
private readonly provider;
|
|
18
|
+
private readonly model;
|
|
19
|
+
/**
|
|
20
|
+
* Cumulative token usage / 累計 Token 使用量
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
private usage;
|
|
24
|
+
/**
|
|
25
|
+
* Create a new TokenTracker instance
|
|
26
|
+
* 建立新的 TokenTracker 實例
|
|
27
|
+
*
|
|
28
|
+
* @param provider - The LLM provider type / LLM 供應商類型
|
|
29
|
+
* @param model - The model name / 模型名稱
|
|
30
|
+
*/
|
|
31
|
+
constructor(provider: LLMProviderType, model: string);
|
|
32
|
+
/**
|
|
33
|
+
* Record token usage from a single request
|
|
34
|
+
* 記錄單次請求的 Token 使用量
|
|
35
|
+
*
|
|
36
|
+
* @param promptTokens - Number of prompt tokens used / 使用的提示詞 Token 數
|
|
37
|
+
* @param completionTokens - Number of completion tokens used / 使用的完成回應 Token 數
|
|
38
|
+
*/
|
|
39
|
+
track(promptTokens: number, completionTokens: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get current cumulative token usage
|
|
42
|
+
* 取得目前累計 Token 使用量
|
|
43
|
+
*
|
|
44
|
+
* @returns A copy of the current token usage / 目前 Token 使用量的副本
|
|
45
|
+
*/
|
|
46
|
+
getUsage(): TokenUsage;
|
|
47
|
+
/**
|
|
48
|
+
* Reset all usage counters to zero
|
|
49
|
+
* 重置所有使用量計數器為零
|
|
50
|
+
*/
|
|
51
|
+
reset(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Calculate the estimated cost based on cumulative usage
|
|
54
|
+
* 根據累計使用量計算估算費用
|
|
55
|
+
*
|
|
56
|
+
* @returns Estimated cost in USD / 估算費用(美元)
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
private calculateCost;
|
|
60
|
+
/**
|
|
61
|
+
* Look up pricing for the current provider and model
|
|
62
|
+
* 查詢目前供應商和模型的定價
|
|
63
|
+
*
|
|
64
|
+
* Falls back to provider default, then to zero cost.
|
|
65
|
+
* 回退到供應商預設值,然後回退到零費用。
|
|
66
|
+
*
|
|
67
|
+
* @returns Pricing tier / 定價層級
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
private getPricing;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=token-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/ai/token-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8C9D;;;GAGG;AACH,qBAAa,YAAY;IAoBrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IApBxB;;;OAGG;IACH,OAAO,CAAC,KAAK,CAKX;IAEF;;;;;;OAMG;gBAEgB,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,MAAM;IAGhC;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAO3D;;;;;OAKG;IACH,QAAQ,IAAI,UAAU;IAItB;;;OAGG;IACH,KAAK,IAAI,IAAI;IASb;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;;;;;OASG;IACH,OAAO,CAAC,UAAU;CAuBnB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token usage tracking and cost estimation
|
|
3
|
+
* Token 使用追蹤與費用估算
|
|
4
|
+
*
|
|
5
|
+
* Tracks cumulative token usage across LLM requests and calculates
|
|
6
|
+
* estimated costs based on provider-specific pricing.
|
|
7
|
+
* 追蹤跨 LLM 請求的累計 Token 使用量,並根據供應商定價計算估算費用。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/ai/token-tracker
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Approximate pricing table for supported providers and models
|
|
13
|
+
* 支援的供應商和模型的近似定價表
|
|
14
|
+
*
|
|
15
|
+
* Pricing is per 1M tokens in USD.
|
|
16
|
+
* 定價為每 1M Token 的美元費用。
|
|
17
|
+
*
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
const PRICING = {
|
|
21
|
+
// Ollama: free (local inference)
|
|
22
|
+
// Ollama:免費(本地推論)
|
|
23
|
+
'ollama:default': { input: 0, output: 0 },
|
|
24
|
+
// Claude models (current generation)
|
|
25
|
+
'claude:claude-opus-4-6': { input: 15, output: 75 },
|
|
26
|
+
'claude:claude-sonnet-4-6': { input: 3, output: 15 },
|
|
27
|
+
'claude:claude-haiku-4-5-20251001': { input: 0.8, output: 4 },
|
|
28
|
+
// Claude models (previous generation)
|
|
29
|
+
'claude:claude-sonnet-4-20250514': { input: 3, output: 15 },
|
|
30
|
+
'claude:claude-3-5-sonnet-20241022': { input: 3, output: 15 },
|
|
31
|
+
'claude:claude-3-haiku-20240307': { input: 0.25, output: 1.25 },
|
|
32
|
+
'claude:claude-3-opus-20240229': { input: 15, output: 75 },
|
|
33
|
+
// OpenAI models
|
|
34
|
+
'openai:gpt-4o': { input: 2.5, output: 10 },
|
|
35
|
+
'openai:gpt-4o-mini': { input: 0.15, output: 0.6 },
|
|
36
|
+
'openai:gpt-4-turbo': { input: 10, output: 30 },
|
|
37
|
+
'openai:gpt-3.5-turbo': { input: 0.5, output: 1.5 },
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Tracks token usage and estimates cost for an LLM provider
|
|
41
|
+
* 追蹤 LLM 供應商的 Token 使用量並估算費用
|
|
42
|
+
*/
|
|
43
|
+
export class TokenTracker {
|
|
44
|
+
provider;
|
|
45
|
+
model;
|
|
46
|
+
/**
|
|
47
|
+
* Cumulative token usage / 累計 Token 使用量
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
usage = {
|
|
51
|
+
promptTokens: 0,
|
|
52
|
+
completionTokens: 0,
|
|
53
|
+
totalTokens: 0,
|
|
54
|
+
estimatedCost: 0,
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Create a new TokenTracker instance
|
|
58
|
+
* 建立新的 TokenTracker 實例
|
|
59
|
+
*
|
|
60
|
+
* @param provider - The LLM provider type / LLM 供應商類型
|
|
61
|
+
* @param model - The model name / 模型名稱
|
|
62
|
+
*/
|
|
63
|
+
constructor(provider, model) {
|
|
64
|
+
this.provider = provider;
|
|
65
|
+
this.model = model;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Record token usage from a single request
|
|
69
|
+
* 記錄單次請求的 Token 使用量
|
|
70
|
+
*
|
|
71
|
+
* @param promptTokens - Number of prompt tokens used / 使用的提示詞 Token 數
|
|
72
|
+
* @param completionTokens - Number of completion tokens used / 使用的完成回應 Token 數
|
|
73
|
+
*/
|
|
74
|
+
track(promptTokens, completionTokens) {
|
|
75
|
+
this.usage.promptTokens += promptTokens;
|
|
76
|
+
this.usage.completionTokens += completionTokens;
|
|
77
|
+
this.usage.totalTokens += promptTokens + completionTokens;
|
|
78
|
+
this.usage.estimatedCost = this.calculateCost();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get current cumulative token usage
|
|
82
|
+
* 取得目前累計 Token 使用量
|
|
83
|
+
*
|
|
84
|
+
* @returns A copy of the current token usage / 目前 Token 使用量的副本
|
|
85
|
+
*/
|
|
86
|
+
getUsage() {
|
|
87
|
+
return { ...this.usage };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Reset all usage counters to zero
|
|
91
|
+
* 重置所有使用量計數器為零
|
|
92
|
+
*/
|
|
93
|
+
reset() {
|
|
94
|
+
this.usage = {
|
|
95
|
+
promptTokens: 0,
|
|
96
|
+
completionTokens: 0,
|
|
97
|
+
totalTokens: 0,
|
|
98
|
+
estimatedCost: 0,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Calculate the estimated cost based on cumulative usage
|
|
103
|
+
* 根據累計使用量計算估算費用
|
|
104
|
+
*
|
|
105
|
+
* @returns Estimated cost in USD / 估算費用(美元)
|
|
106
|
+
* @internal
|
|
107
|
+
*/
|
|
108
|
+
calculateCost() {
|
|
109
|
+
const pricing = this.getPricing();
|
|
110
|
+
const inputCost = (this.usage.promptTokens / 1_000_000) * pricing.input;
|
|
111
|
+
const outputCost = (this.usage.completionTokens / 1_000_000) * pricing.output;
|
|
112
|
+
return Math.round((inputCost + outputCost) * 1_000_000) / 1_000_000;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Look up pricing for the current provider and model
|
|
116
|
+
* 查詢目前供應商和模型的定價
|
|
117
|
+
*
|
|
118
|
+
* Falls back to provider default, then to zero cost.
|
|
119
|
+
* 回退到供應商預設值,然後回退到零費用。
|
|
120
|
+
*
|
|
121
|
+
* @returns Pricing tier / 定價層級
|
|
122
|
+
* @internal
|
|
123
|
+
*/
|
|
124
|
+
getPricing() {
|
|
125
|
+
const key = `${this.provider}:${this.model}`;
|
|
126
|
+
if (PRICING[key]) {
|
|
127
|
+
return PRICING[key];
|
|
128
|
+
}
|
|
129
|
+
// Fallback: match by provider prefix
|
|
130
|
+
// 回退:按供應商前綴匹配
|
|
131
|
+
const providerDefault = `${this.provider}:default`;
|
|
132
|
+
if (PRICING[providerDefault]) {
|
|
133
|
+
return PRICING[providerDefault];
|
|
134
|
+
}
|
|
135
|
+
// All Ollama models are free (local)
|
|
136
|
+
// 所有 Ollama 模型免費(本地推論)
|
|
137
|
+
if (this.provider === 'ollama') {
|
|
138
|
+
return { input: 0, output: 0 };
|
|
139
|
+
}
|
|
140
|
+
// Unknown model: return zero to avoid incorrect charges
|
|
141
|
+
// 未知模型:回傳零以避免錯誤計費
|
|
142
|
+
return { input: 0, output: 0 };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=token-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../src/ai/token-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI/LLM unified interface type definitions
|
|
3
|
+
* AI/LLM 統一介面型別定義
|
|
4
|
+
*
|
|
5
|
+
* Defines the contracts for all LLM providers, analysis results,
|
|
6
|
+
* threat classifications, and token usage tracking.
|
|
7
|
+
* 定義所有 LLM 供應商、分析結果、威脅分類和 Token 使用追蹤的契約。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/ai/types
|
|
10
|
+
*/
|
|
11
|
+
import type { Language, Severity, SecurityEvent } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Supported LLM provider types
|
|
14
|
+
* 支援的 LLM 供應商類型
|
|
15
|
+
*/
|
|
16
|
+
export type LLMProviderType = 'ollama' | 'claude' | 'openai';
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for initializing an LLM provider
|
|
19
|
+
* 初始化 LLM 供應商的配置
|
|
20
|
+
*/
|
|
21
|
+
export interface LLMConfig {
|
|
22
|
+
/** Provider type / 供應商類型 */
|
|
23
|
+
provider: LLMProviderType;
|
|
24
|
+
/** Model name (e.g., 'llama3', 'claude-sonnet-4-20250514', 'gpt-4o') / 模型名稱 */
|
|
25
|
+
model: string;
|
|
26
|
+
/** API endpoint for Ollama, default 'http://localhost:11434' / Ollama API 端點 */
|
|
27
|
+
endpoint?: string;
|
|
28
|
+
/** API key for Claude/OpenAI / Claude/OpenAI API 金鑰 */
|
|
29
|
+
apiKey?: string;
|
|
30
|
+
/** Response language / 回應語言 */
|
|
31
|
+
lang: Language;
|
|
32
|
+
/** Sampling temperature, default 0.3 / 取樣溫度 */
|
|
33
|
+
temperature?: number;
|
|
34
|
+
/** Maximum output tokens, default 2048 / 最大輸出 Token 數 */
|
|
35
|
+
maxTokens?: number;
|
|
36
|
+
/** Request timeout in milliseconds, default 30000 / 請求逾時時間(毫秒) */
|
|
37
|
+
timeout?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Result of an AI-powered security analysis
|
|
41
|
+
* AI 驅動的安全分析結果
|
|
42
|
+
*/
|
|
43
|
+
export interface AnalysisResult {
|
|
44
|
+
/** Human-readable summary of the analysis / 人類可讀的分析摘要 */
|
|
45
|
+
summary: string;
|
|
46
|
+
/** Assessed severity level / 評估的嚴重等級 */
|
|
47
|
+
severity: Severity;
|
|
48
|
+
/** Confidence score from 0 to 1 / 信心分數(0 到 1) */
|
|
49
|
+
confidence: number;
|
|
50
|
+
/** Actionable recommendations / 可執行的建議 */
|
|
51
|
+
recommendations: string[];
|
|
52
|
+
/** Raw LLM response for debugging / 原始 LLM 回應(供除錯用) */
|
|
53
|
+
rawResponse?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* MITRE ATT&CK-based threat classification
|
|
57
|
+
* 基於 MITRE ATT&CK 的威脅分類
|
|
58
|
+
*/
|
|
59
|
+
export interface ThreatClassification {
|
|
60
|
+
/** MITRE ATT&CK tactic category / MITRE ATT&CK 戰術分類 */
|
|
61
|
+
category: string;
|
|
62
|
+
/** MITRE ATT&CK technique ID (e.g., 'T1059') / MITRE ATT&CK 技術 ID */
|
|
63
|
+
technique: string;
|
|
64
|
+
/** Assessed severity level / 評估的嚴重等級 */
|
|
65
|
+
severity: Severity;
|
|
66
|
+
/** Confidence score from 0 to 1 / 信心分數(0 到 1) */
|
|
67
|
+
confidence: number;
|
|
68
|
+
/** Description of the classified threat / 分類威脅的描述 */
|
|
69
|
+
description: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Token usage and cost tracking
|
|
73
|
+
* Token 使用量與費用追蹤
|
|
74
|
+
*/
|
|
75
|
+
export interface TokenUsage {
|
|
76
|
+
/** Number of tokens in the prompt / 提示詞 Token 數量 */
|
|
77
|
+
promptTokens: number;
|
|
78
|
+
/** Number of tokens in the completion / 完成回應 Token 數量 */
|
|
79
|
+
completionTokens: number;
|
|
80
|
+
/** Total tokens (prompt + completion) / 總 Token 數量 */
|
|
81
|
+
totalTokens: number;
|
|
82
|
+
/** Estimated cost in USD / 估算費用(美元) */
|
|
83
|
+
estimatedCost: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Unified interface for all LLM providers
|
|
87
|
+
* 所有 LLM 供應商的統一介面
|
|
88
|
+
*
|
|
89
|
+
* Implementations must provide security-focused analysis, classification,
|
|
90
|
+
* and summarization capabilities.
|
|
91
|
+
* 實作必須提供安全導向的分析、分類和摘要功能。
|
|
92
|
+
*/
|
|
93
|
+
export interface LLMProvider {
|
|
94
|
+
/** The provider type identifier / 供應商類型識別碼 */
|
|
95
|
+
readonly providerType: LLMProviderType;
|
|
96
|
+
/** The model name being used / 使用的模型名稱 */
|
|
97
|
+
readonly model: string;
|
|
98
|
+
/**
|
|
99
|
+
* Analyze a security prompt with optional context
|
|
100
|
+
* 分析安全提示詞,可附帶上下文
|
|
101
|
+
*
|
|
102
|
+
* @param prompt - The analysis prompt / 分析提示詞
|
|
103
|
+
* @param context - Optional additional context / 可選的額外上下文
|
|
104
|
+
* @returns Analysis result / 分析結果
|
|
105
|
+
*/
|
|
106
|
+
analyze(prompt: string, context?: string): Promise<AnalysisResult>;
|
|
107
|
+
/**
|
|
108
|
+
* Classify a security event using MITRE ATT&CK framework
|
|
109
|
+
* 使用 MITRE ATT&CK 框架分類安全事件
|
|
110
|
+
*
|
|
111
|
+
* @param event - The security event to classify / 要分類的安全事件
|
|
112
|
+
* @returns Threat classification / 威脅分類
|
|
113
|
+
*/
|
|
114
|
+
classify(event: SecurityEvent): Promise<ThreatClassification>;
|
|
115
|
+
/**
|
|
116
|
+
* Summarize multiple security events into a report
|
|
117
|
+
* 將多個安全事件摘要為報告
|
|
118
|
+
*
|
|
119
|
+
* @param events - Array of security events / 安全事件陣列
|
|
120
|
+
* @returns Summary text / 摘要文字
|
|
121
|
+
*/
|
|
122
|
+
summarize(events: SecurityEvent[]): Promise<string>;
|
|
123
|
+
/**
|
|
124
|
+
* Check if the provider is available and properly configured
|
|
125
|
+
* 檢查供應商是否可用且配置正確
|
|
126
|
+
*
|
|
127
|
+
* @returns True if provider is ready / 供應商就緒時回傳 true
|
|
128
|
+
*/
|
|
129
|
+
isAvailable(): Promise<boolean>;
|
|
130
|
+
/**
|
|
131
|
+
* Get cumulative token usage statistics
|
|
132
|
+
* 取得累計 Token 使用統計
|
|
133
|
+
*
|
|
134
|
+
* @returns Token usage data / Token 使用資料
|
|
135
|
+
*/
|
|
136
|
+
getTokenUsage(): TokenUsage;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;IACvC,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnE;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAE9D;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpD;;;;;OAKG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;;;;OAKG;IACH,aAAa,IAAI,UAAU,CAAC;CAC7B"}
|
package/dist/ai/types.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI/LLM unified interface type definitions
|
|
3
|
+
* AI/LLM 統一介面型別定義
|
|
4
|
+
*
|
|
5
|
+
* Defines the contracts for all LLM providers, analysis results,
|
|
6
|
+
* threat classifications, and token usage tracking.
|
|
7
|
+
* 定義所有 LLM 供應商、分析結果、威脅分類和 Token 使用追蹤的契約。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/ai/types
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|