opensentinel 2.1.1 → 3.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.
- package/README.md +354 -283
- package/dist/archiver-AVNBYCKQ.js +15340 -0
- package/dist/archiver-AVNBYCKQ.js.map +1 -0
- package/dist/audit-logger-OBPR7CRO.js +22 -0
- package/dist/auth-UOX5K2BE.js +18 -0
- package/dist/autonomy-ZXDBDQUJ.js +86 -0
- package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
- package/dist/aws-s3-Q4LLZZPD.js +146 -0
- package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
- package/dist/backup-restore-PZ7CYYB7.js +16 -0
- package/dist/blocks-R3PODY47.js +23 -0
- package/dist/bot-QRARP4UN.js +36 -0
- package/dist/brain-7XLLM3KC.js +56 -0
- package/dist/camera-monitor-M5CYKUU4.js +335 -0
- package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
- package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
- package/dist/chunk-22VGGA7S.js +330 -0
- package/dist/chunk-22VGGA7S.js.map +1 -0
- package/dist/chunk-35WYTA3C.js +382 -0
- package/dist/chunk-35WYTA3C.js.map +1 -0
- package/dist/chunk-3E2PSU2C.js +146 -0
- package/dist/chunk-3E2PSU2C.js.map +1 -0
- package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
- package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
- package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
- package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
- package/dist/chunk-6KONMXQ6.js +297 -0
- package/dist/chunk-6KONMXQ6.js.map +1 -0
- package/dist/chunk-6PMVAAA7.js +196 -0
- package/dist/chunk-6PMVAAA7.js.map +1 -0
- package/dist/chunk-766ASQWE.js +32620 -0
- package/dist/chunk-766ASQWE.js.map +1 -0
- package/dist/chunk-7WQO5J2M.js +29 -0
- package/dist/chunk-7WQO5J2M.js.map +1 -0
- package/dist/chunk-APHSRMBS.js +148 -0
- package/dist/chunk-APHSRMBS.js.map +1 -0
- package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
- package/dist/chunk-AYUKPTSM.js.map +1 -0
- package/dist/chunk-BIPYADGB.js +84 -0
- package/dist/chunk-BIPYADGB.js.map +1 -0
- package/dist/chunk-BRBWNV65.js +457 -0
- package/dist/chunk-BRBWNV65.js.map +1 -0
- package/dist/chunk-BXZ6EA52.js +382 -0
- package/dist/chunk-BXZ6EA52.js.map +1 -0
- package/dist/chunk-EVE7MIIY.js +290 -0
- package/dist/chunk-EVE7MIIY.js.map +1 -0
- package/dist/chunk-F3TTNID2.js +138 -0
- package/dist/chunk-F3TTNID2.js.map +1 -0
- package/dist/chunk-H5RQOFO2.js +190 -0
- package/dist/chunk-H5RQOFO2.js.map +1 -0
- package/dist/chunk-HN3F4WSW.js +145 -0
- package/dist/chunk-HN3F4WSW.js.map +1 -0
- package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
- package/dist/chunk-I6BDYQIG.js.map +1 -0
- package/dist/chunk-IZJMVV7O.js +347 -0
- package/dist/chunk-IZJMVV7O.js.map +1 -0
- package/dist/chunk-KM22GV7G.js +211 -0
- package/dist/chunk-KM22GV7G.js.map +1 -0
- package/dist/chunk-MGFBLVR7.js +103 -0
- package/dist/chunk-MGFBLVR7.js.map +1 -0
- package/dist/chunk-MQJ2ECQT.js +228 -0
- package/dist/chunk-MQJ2ECQT.js.map +1 -0
- package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
- package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
- package/dist/chunk-NPRTSZIF.js +131 -0
- package/dist/chunk-NPRTSZIF.js.map +1 -0
- package/dist/chunk-O7IH7JTI.js +1898 -0
- package/dist/chunk-O7IH7JTI.js.map +1 -0
- package/dist/chunk-OCVQGBJK.js +293 -0
- package/dist/chunk-OCVQGBJK.js.map +1 -0
- package/dist/chunk-P6QINGFL.js +332 -0
- package/dist/chunk-P6QINGFL.js.map +1 -0
- package/dist/chunk-PHDZKPNE.js +91 -0
- package/dist/chunk-PHDZKPNE.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-PTGTGXV2.js +164 -0
- package/dist/chunk-PTGTGXV2.js.map +1 -0
- package/dist/chunk-REMIY4U2.js +171 -0
- package/dist/chunk-REMIY4U2.js.map +1 -0
- package/dist/chunk-RZ4YESBG.js +141 -0
- package/dist/chunk-RZ4YESBG.js.map +1 -0
- package/dist/chunk-SAX5MHK4.js +111 -0
- package/dist/chunk-SAX5MHK4.js.map +1 -0
- package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
- package/dist/chunk-SPPMCAKG.js +777 -0
- package/dist/chunk-SPPMCAKG.js.map +1 -0
- package/dist/chunk-SVAPX2XN.js +2441 -0
- package/dist/chunk-SVAPX2XN.js.map +1 -0
- package/dist/chunk-TVEWKIK3.js +452 -0
- package/dist/chunk-TVEWKIK3.js.map +1 -0
- package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
- package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
- package/dist/chunk-VNX5GMTN.js +128 -0
- package/dist/chunk-VNX5GMTN.js.map +1 -0
- package/dist/chunk-VRD5CYRL.js +1568 -0
- package/dist/chunk-VRD5CYRL.js.map +1 -0
- package/dist/chunk-WLUHNG6X.js +122 -0
- package/dist/chunk-WLUHNG6X.js.map +1 -0
- package/dist/chunk-WRAKK6K6.js +265 -0
- package/dist/chunk-WRAKK6K6.js.map +1 -0
- package/dist/chunk-XKYRH4FM.js +681 -0
- package/dist/chunk-XKYRH4FM.js.map +1 -0
- package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
- package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
- package/dist/chunk-ZLZKF2PM.js +310 -0
- package/dist/chunk-ZLZKF2PM.js.map +1 -0
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/client-ZQSFPMOB.js +21 -0
- package/dist/clipboard-manager-TEO2GEDN.js +24 -0
- package/dist/commands/setup.js +3 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.js +3 -3
- package/dist/commands/status.js +2 -2
- package/dist/commands/stop.js +2 -2
- package/dist/commands/utils.js +2 -2
- package/dist/cron-explain-HHQKPD3M.js +16 -0
- package/dist/crypto-4AP47IKC.js +14 -0
- package/dist/crypto-4AP47IKC.js.map +1 -0
- package/dist/databases-37X4CI2Y.js +21 -0
- package/dist/databases-37X4CI2Y.js.map +1 -0
- package/dist/discord-B3HUPGQ6.js +70 -0
- package/dist/discord-B3HUPGQ6.js.map +1 -0
- package/dist/dist-UISMLMFN.js +21847 -0
- package/dist/dist-UISMLMFN.js.map +1 -0
- package/dist/email-K7LO2IPB.js +268 -0
- package/dist/email-K7LO2IPB.js.map +1 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
- package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
- package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
- package/dist/entity-resolution-Y3IUWEAT.js +24 -0
- package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
- package/dist/env-IWXUVTCB.js +12 -0
- package/dist/env-IWXUVTCB.js.map +1 -0
- package/dist/google-workspace-DKWUVNGC.js +169 -0
- package/dist/google-workspace-DKWUVNGC.js.map +1 -0
- package/dist/hash-tool-ULQYD7B5.js +22 -0
- package/dist/hash-tool-ULQYD7B5.js.map +1 -0
- package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
- package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
- package/dist/image-generation-OSU7FP6F.js +486 -0
- package/dist/image-generation-OSU7FP6F.js.map +1 -0
- package/dist/imessage-NGA2XF2V.js +35 -0
- package/dist/imessage-NGA2XF2V.js.map +1 -0
- package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
- package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
- package/dist/incident-response-C5J7Q6DT.js +244 -0
- package/dist/incident-response-C5J7Q6DT.js.map +1 -0
- package/dist/inventory-manager-352OHXWD.js +24 -0
- package/dist/inventory-manager-352OHXWD.js.map +1 -0
- package/dist/jira-GSGDBMIG.js +199 -0
- package/dist/jira-GSGDBMIG.js.map +1 -0
- package/dist/json-tool-QE2SYHEG.js +26 -0
- package/dist/json-tool-QE2SYHEG.js.map +1 -0
- package/dist/key-rotation-DPHU4ZTB.js +18 -0
- package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
- package/dist/lib.d.ts +603 -11
- package/dist/lib.js +161 -35
- package/dist/lib.js.map +1 -1
- package/dist/mailchimp-KKNF6QJ7.js +152 -0
- package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
- package/dist/matrix-QVHG76I7.js +279 -0
- package/dist/matrix-QVHG76I7.js.map +1 -0
- package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
- package/dist/mcp-3JI6W7ZE.js.map +1 -0
- package/dist/microsoft365-UCBKJHNX.js +164 -0
- package/dist/microsoft365-UCBKJHNX.js.map +1 -0
- package/dist/ocr-AC7NPX33.js +22 -0
- package/dist/ocr-AC7NPX33.js.map +1 -0
- package/dist/ollama-BOAMSPLJ.js +8 -0
- package/dist/ollama-BOAMSPLJ.js.map +1 -0
- package/dist/pages-MI523RB7.js +26 -0
- package/dist/pages-MI523RB7.js.map +1 -0
- package/dist/pair-JDFTERIK.js +24 -0
- package/dist/pair-JDFTERIK.js.map +1 -0
- package/dist/pairing-IFQYCPNS.js +10 -0
- package/dist/pairing-IFQYCPNS.js.map +1 -0
- package/dist/pdf-ALQVOEJR.js +17 -0
- package/dist/pdf-ALQVOEJR.js.map +1 -0
- package/dist/presentations-DSV5IHG5.js +1002 -0
- package/dist/presentations-DSV5IHG5.js.map +1 -0
- package/dist/prometheus-JNT2BD4L.js +10 -0
- package/dist/prometheus-JNT2BD4L.js.map +1 -0
- package/dist/providers-J4LYPHDR.js +19 -0
- package/dist/providers-J4LYPHDR.js.map +1 -0
- package/dist/qr-code-WIX4PB4U.js +16 -0
- package/dist/qr-code-WIX4PB4U.js.map +1 -0
- package/dist/quickbooks-XB4NII2S.js +190 -0
- package/dist/quickbooks-XB4NII2S.js.map +1 -0
- package/dist/regex-tool-W4ABRKGK.js +24 -0
- package/dist/regex-tool-W4ABRKGK.js.map +1 -0
- package/dist/scheduler-VK4WFERV.js +63 -0
- package/dist/scheduler-VK4WFERV.js.map +1 -0
- package/dist/search-BCLBO5E3.js +25 -0
- package/dist/search-BCLBO5E3.js.map +1 -0
- package/dist/sendgrid-RNXCAFKM.js +152 -0
- package/dist/sendgrid-RNXCAFKM.js.map +1 -0
- package/dist/shopify-NCXYJB4R.js +171 -0
- package/dist/shopify-NCXYJB4R.js.map +1 -0
- package/dist/signal-6CGDFYL2.js +35 -0
- package/dist/signal-6CGDFYL2.js.map +1 -0
- package/dist/slack-IZQWIKOH.js +75 -0
- package/dist/slack-IZQWIKOH.js.map +1 -0
- package/dist/sms-M3JIOTCW.js +23 -0
- package/dist/sms-M3JIOTCW.js.map +1 -0
- package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
- package/dist/src-VYUE6LRA.js.map +1 -0
- package/dist/stocks-XXWBPOCU.js +14 -0
- package/dist/stocks-XXWBPOCU.js.map +1 -0
- package/dist/text-transform-6SGUA5Z4.js +22 -0
- package/dist/text-transform-6SGUA5Z4.js.map +1 -0
- package/dist/tools-2RLEI2N6.js +38 -0
- package/dist/tools-2RLEI2N6.js.map +1 -0
- package/dist/tunnel-IWMXUML4.js +301 -0
- package/dist/tunnel-IWMXUML4.js.map +1 -0
- package/dist/twilio-53GEW5JT.js +139 -0
- package/dist/twilio-53GEW5JT.js.map +1 -0
- package/dist/unit-converter-ZYXMEZOE.js +14 -0
- package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
- package/dist/whatsapp-LFX6YKCM.js +35 -0
- package/dist/whatsapp-LFX6YKCM.js.map +1 -0
- package/dist/word-document-7B6SJMAY.js +902 -0
- package/dist/word-document-7B6SJMAY.js.map +1 -0
- package/dist/xero-QYO66D45.js +162 -0
- package/dist/xero-QYO66D45.js.map +1 -0
- package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
- package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
- package/drizzle/0002_mushy_master_mold.sql +140 -0
- package/drizzle/meta/0002_snapshot.json +3637 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +100 -98
- package/dist/bot-KJ26BG56.js +0 -15
- package/dist/chunk-4LVWXUNC.js.map +0 -1
- package/dist/chunk-4TG2IG5K.js +0 -5249
- package/dist/chunk-4TG2IG5K.js.map +0 -1
- package/dist/chunk-6DRDKB45.js.map +0 -1
- package/dist/chunk-CI6Q63MM.js +0 -1613
- package/dist/chunk-CI6Q63MM.js.map +0 -1
- package/dist/chunk-KHNYJY2Z.js +0 -178
- package/dist/chunk-KHNYJY2Z.js.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -17
- package/dist/discord-ZOJFTVTB.js +0 -49
- package/dist/imessage-JFRB6EJ7.js +0 -14
- package/dist/scheduler-EZ7CZMCS.js +0 -42
- package/dist/signal-T3MCSULM.js +0 -14
- package/dist/slack-N2M4FHAJ.js +0 -54
- package/dist/src-K7GASHRH.js.map +0 -1
- package/dist/tools-24GZHYRF.js +0 -16
- package/dist/whatsapp-VCRUPAO5.js +0 -14
- /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
- /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
- /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
- /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
- /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
- /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
- /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
- /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
- /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
- /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
- /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
- /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
- /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
- /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
- /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
- /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
- /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
- /package/dist/{whatsapp-VCRUPAO5.js.map → cron-explain-HHQKPD3M.js.map} +0 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import {
|
|
2
|
+
env
|
|
3
|
+
} from "./chunk-ZLZKF2PM.js";
|
|
4
|
+
import {
|
|
5
|
+
OpenAICompatibleProvider
|
|
6
|
+
} from "./chunk-35WYTA3C.js";
|
|
7
|
+
|
|
8
|
+
// src/core/providers/anthropic-provider.ts
|
|
9
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
10
|
+
var AnthropicProvider = class {
|
|
11
|
+
id;
|
|
12
|
+
name;
|
|
13
|
+
type = "anthropic";
|
|
14
|
+
client;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.id = config.id;
|
|
17
|
+
this.name = config.name;
|
|
18
|
+
this.client = new Anthropic({ apiKey: config.apiKey });
|
|
19
|
+
}
|
|
20
|
+
getCapabilities() {
|
|
21
|
+
return {
|
|
22
|
+
supportsVision: true,
|
|
23
|
+
supportsToolUse: true,
|
|
24
|
+
supportsStreaming: true,
|
|
25
|
+
supportsExtendedThinking: true,
|
|
26
|
+
supportsSystemPrompt: true,
|
|
27
|
+
maxContextWindow: 2e5
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async createMessage(request) {
|
|
31
|
+
const { system, messages } = this.extractSystem(request);
|
|
32
|
+
const params = {
|
|
33
|
+
model: request.model,
|
|
34
|
+
max_tokens: request.max_tokens,
|
|
35
|
+
system,
|
|
36
|
+
messages
|
|
37
|
+
};
|
|
38
|
+
if (request.tools?.length) {
|
|
39
|
+
params.tools = request.tools.map(toLLMToolToAnthropicTool);
|
|
40
|
+
}
|
|
41
|
+
if (request.thinking) {
|
|
42
|
+
params.thinking = request.thinking;
|
|
43
|
+
}
|
|
44
|
+
const response = await this.client.messages.create(params);
|
|
45
|
+
return {
|
|
46
|
+
content: response.content.map(anthropicBlockToLLM),
|
|
47
|
+
stop_reason: mapStopReason(response.stop_reason),
|
|
48
|
+
usage: {
|
|
49
|
+
input_tokens: response.usage.input_tokens,
|
|
50
|
+
output_tokens: response.usage.output_tokens
|
|
51
|
+
},
|
|
52
|
+
model: response.model
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
streamMessage(request) {
|
|
56
|
+
const { system, messages } = this.extractSystem(request);
|
|
57
|
+
const params = {
|
|
58
|
+
model: request.model,
|
|
59
|
+
max_tokens: request.max_tokens,
|
|
60
|
+
system,
|
|
61
|
+
messages
|
|
62
|
+
};
|
|
63
|
+
if (request.tools?.length) {
|
|
64
|
+
params.tools = request.tools.map(toLLMToolToAnthropicTool);
|
|
65
|
+
}
|
|
66
|
+
const stream = this.client.messages.stream(params);
|
|
67
|
+
const events = {
|
|
68
|
+
async *[Symbol.asyncIterator]() {
|
|
69
|
+
for await (const event of stream) {
|
|
70
|
+
if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
|
|
71
|
+
yield {
|
|
72
|
+
type: "content_block_delta",
|
|
73
|
+
delta: { type: "text_delta", text: event.delta.text }
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
events,
|
|
81
|
+
async finalMessage() {
|
|
82
|
+
const msg = await stream.finalMessage();
|
|
83
|
+
return {
|
|
84
|
+
content: msg.content.map(anthropicBlockToLLM),
|
|
85
|
+
stop_reason: mapStopReason(msg.stop_reason),
|
|
86
|
+
usage: {
|
|
87
|
+
input_tokens: msg.usage.input_tokens,
|
|
88
|
+
output_tokens: msg.usage.output_tokens
|
|
89
|
+
},
|
|
90
|
+
model: msg.model
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async listModels() {
|
|
96
|
+
return [
|
|
97
|
+
"claude-haiku-4-5-20251001",
|
|
98
|
+
"claude-sonnet-4-20250514",
|
|
99
|
+
"claude-opus-4-20250514"
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
async isAvailable() {
|
|
103
|
+
try {
|
|
104
|
+
await this.client.messages.create({
|
|
105
|
+
model: "claude-haiku-4-5-20251001",
|
|
106
|
+
max_tokens: 1,
|
|
107
|
+
messages: [{ role: "user", content: "hi" }]
|
|
108
|
+
});
|
|
109
|
+
return true;
|
|
110
|
+
} catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Get the raw Anthropic client (for specialized use cases like vision) */
|
|
115
|
+
getClient() {
|
|
116
|
+
return this.client;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Extract system messages and convert LLMMessages to Anthropic MessageParam format.
|
|
120
|
+
* Anthropic uses a separate `system` parameter instead of a system role message.
|
|
121
|
+
*/
|
|
122
|
+
extractSystem(request) {
|
|
123
|
+
let system = request.system || "";
|
|
124
|
+
const messages = request.messages.filter((m) => m.role !== "system").map((m) => llmMessageToAnthropicMessage(m));
|
|
125
|
+
return { system, messages };
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
function toLLMToolToAnthropicTool(tool) {
|
|
129
|
+
return {
|
|
130
|
+
name: tool.name,
|
|
131
|
+
description: tool.description,
|
|
132
|
+
input_schema: tool.input_schema
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function llmMessageToAnthropicMessage(msg) {
|
|
136
|
+
if (typeof msg.content === "string") {
|
|
137
|
+
return { role: msg.role, content: msg.content };
|
|
138
|
+
}
|
|
139
|
+
const anthropicContent = msg.content.map((block) => {
|
|
140
|
+
switch (block.type) {
|
|
141
|
+
case "text":
|
|
142
|
+
return { type: "text", text: block.text };
|
|
143
|
+
case "image":
|
|
144
|
+
return {
|
|
145
|
+
type: "image",
|
|
146
|
+
source: {
|
|
147
|
+
type: block.source?.type || "base64",
|
|
148
|
+
media_type: block.source?.mediaType || "image/jpeg",
|
|
149
|
+
data: block.source?.data,
|
|
150
|
+
...block.source?.url ? { url: block.source.url } : {}
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
case "tool_use":
|
|
154
|
+
return {
|
|
155
|
+
type: "tool_use",
|
|
156
|
+
id: block.id,
|
|
157
|
+
name: block.name,
|
|
158
|
+
input: block.input
|
|
159
|
+
};
|
|
160
|
+
case "tool_result":
|
|
161
|
+
return {
|
|
162
|
+
type: "tool_result",
|
|
163
|
+
tool_use_id: block.tool_use_id,
|
|
164
|
+
content: block.content
|
|
165
|
+
};
|
|
166
|
+
default:
|
|
167
|
+
return { type: "text", text: block.text || "" };
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return { role: msg.role, content: anthropicContent };
|
|
171
|
+
}
|
|
172
|
+
function anthropicBlockToLLM(block) {
|
|
173
|
+
switch (block.type) {
|
|
174
|
+
case "text":
|
|
175
|
+
return { type: "text", text: block.text };
|
|
176
|
+
case "tool_use":
|
|
177
|
+
return {
|
|
178
|
+
type: "tool_use",
|
|
179
|
+
id: block.id,
|
|
180
|
+
name: block.name,
|
|
181
|
+
input: block.input
|
|
182
|
+
};
|
|
183
|
+
default:
|
|
184
|
+
return { type: "text", text: block.text || "" };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function mapStopReason(reason) {
|
|
188
|
+
switch (reason) {
|
|
189
|
+
case "end_turn":
|
|
190
|
+
return "end_turn";
|
|
191
|
+
case "tool_use":
|
|
192
|
+
return "tool_use";
|
|
193
|
+
case "max_tokens":
|
|
194
|
+
return "max_tokens";
|
|
195
|
+
default:
|
|
196
|
+
return "end_turn";
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// src/core/providers/registry.ts
|
|
201
|
+
var ProviderRegistry = class {
|
|
202
|
+
providers = /* @__PURE__ */ new Map();
|
|
203
|
+
defaultProviderId = null;
|
|
204
|
+
register(provider) {
|
|
205
|
+
this.providers.set(provider.id, provider);
|
|
206
|
+
if (!this.defaultProviderId) {
|
|
207
|
+
this.defaultProviderId = provider.id;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
unregister(id) {
|
|
211
|
+
this.providers.delete(id);
|
|
212
|
+
if (this.defaultProviderId === id) {
|
|
213
|
+
this.defaultProviderId = this.providers.keys().next().value || null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
get(id) {
|
|
217
|
+
return this.providers.get(id);
|
|
218
|
+
}
|
|
219
|
+
getDefault() {
|
|
220
|
+
if (!this.defaultProviderId) {
|
|
221
|
+
throw new Error(
|
|
222
|
+
"[ProviderRegistry] No LLM providers configured. Set CLAUDE_API_KEY, OPENROUTER_API_KEY, or OLLAMA_ENABLED."
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
const provider = this.providers.get(this.defaultProviderId);
|
|
226
|
+
if (!provider) {
|
|
227
|
+
throw new Error(`[ProviderRegistry] Default provider '${this.defaultProviderId}' not found.`);
|
|
228
|
+
}
|
|
229
|
+
return provider;
|
|
230
|
+
}
|
|
231
|
+
setDefault(id) {
|
|
232
|
+
if (!this.providers.has(id)) {
|
|
233
|
+
console.warn(`[ProviderRegistry] Provider '${id}' not registered, cannot set as default.`);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
this.defaultProviderId = id;
|
|
237
|
+
}
|
|
238
|
+
getDefaultId() {
|
|
239
|
+
return this.defaultProviderId;
|
|
240
|
+
}
|
|
241
|
+
has(id) {
|
|
242
|
+
return this.providers.has(id);
|
|
243
|
+
}
|
|
244
|
+
listProviders() {
|
|
245
|
+
return Array.from(this.providers.values()).map((p) => ({
|
|
246
|
+
id: p.id,
|
|
247
|
+
name: p.name,
|
|
248
|
+
type: p.type
|
|
249
|
+
}));
|
|
250
|
+
}
|
|
251
|
+
getProviderCount() {
|
|
252
|
+
return this.providers.size;
|
|
253
|
+
}
|
|
254
|
+
clear() {
|
|
255
|
+
this.providers.clear();
|
|
256
|
+
this.defaultProviderId = null;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
var providerRegistry = new ProviderRegistry();
|
|
260
|
+
|
|
261
|
+
// src/core/providers/index.ts
|
|
262
|
+
async function initializeProviders() {
|
|
263
|
+
if (env.CLAUDE_API_KEY) {
|
|
264
|
+
providerRegistry.register(
|
|
265
|
+
new AnthropicProvider({
|
|
266
|
+
id: "anthropic",
|
|
267
|
+
name: "Anthropic",
|
|
268
|
+
type: "anthropic",
|
|
269
|
+
apiKey: env.CLAUDE_API_KEY,
|
|
270
|
+
enabled: true
|
|
271
|
+
})
|
|
272
|
+
);
|
|
273
|
+
console.log("[LLM] Registered provider: Anthropic");
|
|
274
|
+
}
|
|
275
|
+
if (env.OPENAI_LLM_ENABLED && env.OPENAI_API_KEY) {
|
|
276
|
+
providerRegistry.register(
|
|
277
|
+
new OpenAICompatibleProvider({
|
|
278
|
+
id: "openai",
|
|
279
|
+
name: "OpenAI",
|
|
280
|
+
type: "openai",
|
|
281
|
+
apiKey: env.OPENAI_API_KEY,
|
|
282
|
+
baseUrl: "https://api.openai.com/v1",
|
|
283
|
+
defaultModel: "gpt-4o",
|
|
284
|
+
enabled: true
|
|
285
|
+
})
|
|
286
|
+
);
|
|
287
|
+
console.log("[LLM] Registered provider: OpenAI");
|
|
288
|
+
}
|
|
289
|
+
if (env.OPENROUTER_API_KEY) {
|
|
290
|
+
providerRegistry.register(
|
|
291
|
+
new OpenAICompatibleProvider({
|
|
292
|
+
id: "openrouter",
|
|
293
|
+
name: "OpenRouter",
|
|
294
|
+
type: "openai-compatible",
|
|
295
|
+
apiKey: env.OPENROUTER_API_KEY,
|
|
296
|
+
baseUrl: env.OPENROUTER_BASE_URL || "https://openrouter.ai/api/v1",
|
|
297
|
+
defaultModel: "anthropic/claude-sonnet-4-20250514",
|
|
298
|
+
enabled: true
|
|
299
|
+
})
|
|
300
|
+
);
|
|
301
|
+
console.log("[LLM] Registered provider: OpenRouter");
|
|
302
|
+
}
|
|
303
|
+
if (env.GROQ_API_KEY) {
|
|
304
|
+
providerRegistry.register(
|
|
305
|
+
new OpenAICompatibleProvider({
|
|
306
|
+
id: "groq",
|
|
307
|
+
name: "Groq",
|
|
308
|
+
type: "openai-compatible",
|
|
309
|
+
apiKey: env.GROQ_API_KEY,
|
|
310
|
+
baseUrl: "https://api.groq.com/openai/v1",
|
|
311
|
+
defaultModel: "llama-3.1-70b-versatile",
|
|
312
|
+
enabled: true
|
|
313
|
+
})
|
|
314
|
+
);
|
|
315
|
+
console.log("[LLM] Registered provider: Groq");
|
|
316
|
+
}
|
|
317
|
+
if (env.MISTRAL_API_KEY) {
|
|
318
|
+
providerRegistry.register(
|
|
319
|
+
new OpenAICompatibleProvider({
|
|
320
|
+
id: "mistral",
|
|
321
|
+
name: "Mistral",
|
|
322
|
+
type: "openai-compatible",
|
|
323
|
+
apiKey: env.MISTRAL_API_KEY,
|
|
324
|
+
baseUrl: "https://api.mistral.ai/v1",
|
|
325
|
+
defaultModel: "mistral-large-latest",
|
|
326
|
+
enabled: true
|
|
327
|
+
})
|
|
328
|
+
);
|
|
329
|
+
console.log("[LLM] Registered provider: Mistral");
|
|
330
|
+
}
|
|
331
|
+
if (env.OPENAI_COMPATIBLE_BASE_URL) {
|
|
332
|
+
providerRegistry.register(
|
|
333
|
+
new OpenAICompatibleProvider({
|
|
334
|
+
id: "custom",
|
|
335
|
+
name: "Custom Provider",
|
|
336
|
+
type: "openai-compatible",
|
|
337
|
+
apiKey: env.OPENAI_COMPATIBLE_API_KEY || "not-needed",
|
|
338
|
+
baseUrl: env.OPENAI_COMPATIBLE_BASE_URL,
|
|
339
|
+
defaultModel: env.OPENAI_COMPATIBLE_MODEL || "default",
|
|
340
|
+
enabled: true
|
|
341
|
+
})
|
|
342
|
+
);
|
|
343
|
+
console.log("[LLM] Registered provider: Custom (" + env.OPENAI_COMPATIBLE_BASE_URL + ")");
|
|
344
|
+
}
|
|
345
|
+
if (env.OLLAMA_ENABLED) {
|
|
346
|
+
try {
|
|
347
|
+
const { OllamaProvider: OllamaProvider2 } = await import("./ollama-BOAMSPLJ.js");
|
|
348
|
+
const ollamaBaseUrl = env.OLLAMA_BASE_URL || "http://localhost:11434";
|
|
349
|
+
const ollamaModel = env.OLLAMA_DEFAULT_MODEL || "llama3.1";
|
|
350
|
+
const ollama = new OllamaProvider2(ollamaBaseUrl, ollamaModel);
|
|
351
|
+
const available = await ollama.isAvailable();
|
|
352
|
+
if (available) {
|
|
353
|
+
providerRegistry.register(ollama);
|
|
354
|
+
const models = await ollama.listModels();
|
|
355
|
+
console.log(`[LLM] Registered provider: Ollama (${models.length} model(s): ${models.slice(0, 5).join(", ")})`);
|
|
356
|
+
} else {
|
|
357
|
+
console.warn(`[LLM] Ollama enabled but not reachable at ${ollamaBaseUrl}`);
|
|
358
|
+
}
|
|
359
|
+
} catch (err) {
|
|
360
|
+
console.warn("[LLM] Failed to initialize Ollama:", err.message);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
const defaultId = env.LLM_PROVIDER || "anthropic";
|
|
364
|
+
if (providerRegistry.has(defaultId)) {
|
|
365
|
+
providerRegistry.setDefault(defaultId);
|
|
366
|
+
}
|
|
367
|
+
const providers = providerRegistry.listProviders();
|
|
368
|
+
if (providers.length === 0) {
|
|
369
|
+
console.warn("[LLM] No LLM providers configured. Set CLAUDE_API_KEY or another provider key.");
|
|
370
|
+
} else {
|
|
371
|
+
console.log(
|
|
372
|
+
`[LLM] ${providers.length} provider(s) ready. Default: ${providerRegistry.getDefaultId()}`
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export {
|
|
378
|
+
AnthropicProvider,
|
|
379
|
+
providerRegistry,
|
|
380
|
+
initializeProviders
|
|
381
|
+
};
|
|
382
|
+
//# sourceMappingURL=chunk-BXZ6EA52.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/providers/anthropic-provider.ts","../src/core/providers/registry.ts","../src/core/providers/index.ts"],"sourcesContent":["/**\n * Anthropic Provider — Wraps the Anthropic SDK\n *\n * Converts between provider-agnostic LLM types and Anthropic's SDK types.\n * Handles extended thinking, vision, and tool use natively.\n */\n\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport type { LLMProvider } from \"./provider\";\nimport type {\n LLMProviderCapabilities,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMContentBlock,\n LLMStreamEvent,\n LLMStreamResult,\n LLMMessage,\n LLMTool,\n} from \"./types\";\n\nexport class AnthropicProvider implements LLMProvider {\n readonly id: string;\n readonly name: string;\n readonly type = \"anthropic\";\n private client: Anthropic;\n\n constructor(config: LLMProviderConfig) {\n this.id = config.id;\n this.name = config.name;\n this.client = new Anthropic({ apiKey: config.apiKey });\n }\n\n getCapabilities(): LLMProviderCapabilities {\n return {\n supportsVision: true,\n supportsToolUse: true,\n supportsStreaming: true,\n supportsExtendedThinking: true,\n supportsSystemPrompt: true,\n maxContextWindow: 200000,\n };\n }\n\n async createMessage(request: LLMRequest): Promise<LLMResponse> {\n const { system, messages } = this.extractSystem(request);\n\n const params: any = {\n model: request.model,\n max_tokens: request.max_tokens,\n system,\n messages,\n };\n\n if (request.tools?.length) {\n params.tools = request.tools.map(toLLMToolToAnthropicTool);\n }\n\n if (request.thinking) {\n params.thinking = request.thinking;\n }\n\n const response = await this.client.messages.create(params);\n\n return {\n content: response.content.map(anthropicBlockToLLM),\n stop_reason: mapStopReason(response.stop_reason),\n usage: {\n input_tokens: response.usage.input_tokens,\n output_tokens: response.usage.output_tokens,\n },\n model: response.model,\n };\n }\n\n streamMessage(request: LLMRequest): LLMStreamResult {\n const { system, messages } = this.extractSystem(request);\n\n const params: any = {\n model: request.model,\n max_tokens: request.max_tokens,\n system,\n messages,\n };\n\n if (request.tools?.length) {\n params.tools = request.tools.map(toLLMToolToAnthropicTool);\n }\n\n const stream = this.client.messages.stream(params);\n\n const events: AsyncIterable<LLMStreamEvent> = {\n async *[Symbol.asyncIterator]() {\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && (event.delta as any).type === \"text_delta\") {\n yield {\n type: \"content_block_delta\" as const,\n delta: { type: \"text_delta\" as const, text: (event.delta as any).text },\n };\n }\n }\n },\n };\n\n return {\n events,\n async finalMessage(): Promise<LLMResponse> {\n const msg = await stream.finalMessage();\n return {\n content: msg.content.map(anthropicBlockToLLM),\n stop_reason: mapStopReason(msg.stop_reason),\n usage: {\n input_tokens: msg.usage.input_tokens,\n output_tokens: msg.usage.output_tokens,\n },\n model: msg.model,\n };\n },\n };\n }\n\n async listModels(): Promise<string[]> {\n return [\n \"claude-haiku-4-5-20251001\",\n \"claude-sonnet-4-20250514\",\n \"claude-opus-4-20250514\",\n ];\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n // Minimal API call to check connectivity\n await this.client.messages.create({\n model: \"claude-haiku-4-5-20251001\",\n max_tokens: 1,\n messages: [{ role: \"user\", content: \"hi\" }],\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /** Get the raw Anthropic client (for specialized use cases like vision) */\n getClient(): Anthropic {\n return this.client;\n }\n\n /**\n * Extract system messages and convert LLMMessages to Anthropic MessageParam format.\n * Anthropic uses a separate `system` parameter instead of a system role message.\n */\n private extractSystem(request: LLMRequest): {\n system: string;\n messages: any[];\n } {\n let system = request.system || \"\";\n\n const messages = request.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => llmMessageToAnthropicMessage(m));\n\n return { system, messages };\n }\n}\n\n// ============================================\n// Conversion helpers\n// ============================================\n\nfunction toLLMToolToAnthropicTool(tool: LLMTool): any {\n // Anthropic uses the same format: { name, description, input_schema }\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.input_schema,\n };\n}\n\nfunction llmMessageToAnthropicMessage(msg: LLMMessage): any {\n if (typeof msg.content === \"string\") {\n return { role: msg.role, content: msg.content };\n }\n\n // Convert content blocks\n const anthropicContent = msg.content.map((block) => {\n switch (block.type) {\n case \"text\":\n return { type: \"text\", text: block.text };\n case \"image\":\n return {\n type: \"image\",\n source: {\n type: block.source?.type || \"base64\",\n media_type: block.source?.mediaType || \"image/jpeg\",\n data: block.source?.data,\n ...(block.source?.url ? { url: block.source.url } : {}),\n },\n };\n case \"tool_use\":\n return {\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n case \"tool_result\":\n return {\n type: \"tool_result\",\n tool_use_id: block.tool_use_id,\n content: block.content,\n };\n default:\n return { type: \"text\", text: block.text || \"\" };\n }\n });\n\n return { role: msg.role, content: anthropicContent };\n}\n\nfunction anthropicBlockToLLM(block: any): LLMContentBlock {\n switch (block.type) {\n case \"text\":\n return { type: \"text\", text: block.text };\n case \"tool_use\":\n return {\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n default:\n return { type: \"text\", text: block.text || \"\" };\n }\n}\n\nfunction mapStopReason(reason: string | null): LLMResponse[\"stop_reason\"] {\n switch (reason) {\n case \"end_turn\":\n return \"end_turn\";\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n default:\n return \"end_turn\";\n }\n}\n","/**\n * Provider Registry — Manages all configured LLM providers\n */\n\nimport type { LLMProvider } from \"./provider\";\n\nexport class ProviderRegistry {\n private providers: Map<string, LLMProvider> = new Map();\n private defaultProviderId: string | null = null;\n\n register(provider: LLMProvider): void {\n this.providers.set(provider.id, provider);\n // First registered provider becomes default\n if (!this.defaultProviderId) {\n this.defaultProviderId = provider.id;\n }\n }\n\n unregister(id: string): void {\n this.providers.delete(id);\n if (this.defaultProviderId === id) {\n this.defaultProviderId = this.providers.keys().next().value || null;\n }\n }\n\n get(id: string): LLMProvider | undefined {\n return this.providers.get(id);\n }\n\n getDefault(): LLMProvider {\n if (!this.defaultProviderId) {\n throw new Error(\n \"[ProviderRegistry] No LLM providers configured. Set CLAUDE_API_KEY, OPENROUTER_API_KEY, or OLLAMA_ENABLED.\"\n );\n }\n const provider = this.providers.get(this.defaultProviderId);\n if (!provider) {\n throw new Error(`[ProviderRegistry] Default provider '${this.defaultProviderId}' not found.`);\n }\n return provider;\n }\n\n setDefault(id: string): void {\n if (!this.providers.has(id)) {\n console.warn(`[ProviderRegistry] Provider '${id}' not registered, cannot set as default.`);\n return;\n }\n this.defaultProviderId = id;\n }\n\n getDefaultId(): string | null {\n return this.defaultProviderId;\n }\n\n has(id: string): boolean {\n return this.providers.has(id);\n }\n\n listProviders(): Array<{ id: string; name: string; type: string }> {\n return Array.from(this.providers.values()).map((p) => ({\n id: p.id,\n name: p.name,\n type: p.type,\n }));\n }\n\n getProviderCount(): number {\n return this.providers.size;\n }\n\n clear(): void {\n this.providers.clear();\n this.defaultProviderId = null;\n }\n}\n\nexport const providerRegistry = new ProviderRegistry();\n","/**\n * Provider initialization and re-exports\n */\n\nimport { env } from \"../../config/env\";\nimport { AnthropicProvider } from \"./anthropic-provider\";\nimport { OpenAICompatibleProvider } from \"./openai-compatible-provider\";\nimport { providerRegistry } from \"./registry\";\n\n/**\n * Initialize all configured LLM providers from environment variables.\n * Called once during application startup.\n */\nexport async function initializeProviders(): Promise<void> {\n // Always register Anthropic if CLAUDE_API_KEY is set\n if (env.CLAUDE_API_KEY) {\n providerRegistry.register(\n new AnthropicProvider({\n id: \"anthropic\",\n name: \"Anthropic\",\n type: \"anthropic\",\n apiKey: env.CLAUDE_API_KEY,\n enabled: true,\n })\n );\n console.log(\"[LLM] Registered provider: Anthropic\");\n }\n\n // Register OpenAI if key is set (for LLM use, separate from Whisper STT)\n if ((env as any).OPENAI_LLM_ENABLED && env.OPENAI_API_KEY) {\n providerRegistry.register(\n new OpenAICompatibleProvider({\n id: \"openai\",\n name: \"OpenAI\",\n type: \"openai\",\n apiKey: env.OPENAI_API_KEY,\n baseUrl: \"https://api.openai.com/v1\",\n defaultModel: \"gpt-4o\",\n enabled: true,\n })\n );\n console.log(\"[LLM] Registered provider: OpenAI\");\n }\n\n // Register OpenRouter if configured\n if ((env as any).OPENROUTER_API_KEY) {\n providerRegistry.register(\n new OpenAICompatibleProvider({\n id: \"openrouter\",\n name: \"OpenRouter\",\n type: \"openai-compatible\",\n apiKey: (env as any).OPENROUTER_API_KEY,\n baseUrl: (env as any).OPENROUTER_BASE_URL || \"https://openrouter.ai/api/v1\",\n defaultModel: \"anthropic/claude-sonnet-4-20250514\",\n enabled: true,\n })\n );\n console.log(\"[LLM] Registered provider: OpenRouter\");\n }\n\n // Register Groq if configured\n if ((env as any).GROQ_API_KEY) {\n providerRegistry.register(\n new OpenAICompatibleProvider({\n id: \"groq\",\n name: \"Groq\",\n type: \"openai-compatible\",\n apiKey: (env as any).GROQ_API_KEY,\n baseUrl: \"https://api.groq.com/openai/v1\",\n defaultModel: \"llama-3.1-70b-versatile\",\n enabled: true,\n })\n );\n console.log(\"[LLM] Registered provider: Groq\");\n }\n\n // Register Mistral if configured\n if ((env as any).MISTRAL_API_KEY) {\n providerRegistry.register(\n new OpenAICompatibleProvider({\n id: \"mistral\",\n name: \"Mistral\",\n type: \"openai-compatible\",\n apiKey: (env as any).MISTRAL_API_KEY,\n baseUrl: \"https://api.mistral.ai/v1\",\n defaultModel: \"mistral-large-latest\",\n enabled: true,\n })\n );\n console.log(\"[LLM] Registered provider: Mistral\");\n }\n\n // Register generic OpenAI-compatible endpoint if configured\n if ((env as any).OPENAI_COMPATIBLE_BASE_URL) {\n providerRegistry.register(\n new OpenAICompatibleProvider({\n id: \"custom\",\n name: \"Custom Provider\",\n type: \"openai-compatible\",\n apiKey: (env as any).OPENAI_COMPATIBLE_API_KEY || \"not-needed\",\n baseUrl: (env as any).OPENAI_COMPATIBLE_BASE_URL,\n defaultModel: (env as any).OPENAI_COMPATIBLE_MODEL || \"default\",\n enabled: true,\n })\n );\n console.log(\"[LLM] Registered provider: Custom (\" + (env as any).OPENAI_COMPATIBLE_BASE_URL + \")\");\n }\n\n // Register Ollama if enabled (requires async probe)\n if ((env as any).OLLAMA_ENABLED) {\n try {\n const { OllamaProvider } = await import(\"./ollama\");\n const ollamaBaseUrl = (env as any).OLLAMA_BASE_URL || \"http://localhost:11434\";\n const ollamaModel = (env as any).OLLAMA_DEFAULT_MODEL || \"llama3.1\";\n const ollama = new OllamaProvider(ollamaBaseUrl, ollamaModel);\n\n const available = await ollama.isAvailable();\n if (available) {\n providerRegistry.register(ollama);\n const models = await ollama.listModels();\n console.log(`[LLM] Registered provider: Ollama (${models.length} model(s): ${models.slice(0, 5).join(\", \")})`);\n } else {\n console.warn(`[LLM] Ollama enabled but not reachable at ${ollamaBaseUrl}`);\n }\n } catch (err: any) {\n console.warn(\"[LLM] Failed to initialize Ollama:\", err.message);\n }\n }\n\n // Set default provider\n const defaultId = (env as any).LLM_PROVIDER || \"anthropic\";\n if (providerRegistry.has(defaultId)) {\n providerRegistry.setDefault(defaultId);\n }\n\n const providers = providerRegistry.listProviders();\n if (providers.length === 0) {\n console.warn(\"[LLM] No LLM providers configured. Set CLAUDE_API_KEY or another provider key.\");\n } else {\n console.log(\n `[LLM] ${providers.length} provider(s) ready. Default: ${providerRegistry.getDefaultId()}`\n );\n }\n}\n\n// Re-exports\nexport { providerRegistry } from \"./registry\";\nexport { AnthropicProvider } from \"./anthropic-provider\";\nexport { OpenAICompatibleProvider } from \"./openai-compatible-provider\";\nexport { OllamaProvider } from \"./ollama\";\nexport type { LLMProvider } from \"./provider\";\nexport type {\n LLMMessage,\n LLMContentBlock,\n LLMTool,\n LLMRequest,\n LLMResponse,\n LLMStreamEvent,\n LLMStreamResult,\n LLMProviderCapabilities,\n LLMProviderConfig,\n} from \"./types\";\n"],"mappings":"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","names":["OllamaProvider"]}
|