@aituber-onair/chat 0.25.1 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.ja.md +5 -4
  2. package/README.md +5 -4
  3. package/dist/cjs/constants/claude.d.ts +3 -2
  4. package/dist/cjs/constants/claude.d.ts.map +1 -1
  5. package/dist/cjs/constants/claude.js +5 -6
  6. package/dist/cjs/constants/claude.js.map +1 -1
  7. package/dist/cjs/constants/kimi.d.ts +1 -0
  8. package/dist/cjs/constants/kimi.d.ts.map +1 -1
  9. package/dist/cjs/constants/kimi.js +3 -2
  10. package/dist/cjs/constants/kimi.js.map +1 -1
  11. package/dist/cjs/services/providers/claude/ClaudeChatService.d.ts.map +1 -1
  12. package/dist/cjs/services/providers/claude/ClaudeChatService.js +3 -3
  13. package/dist/cjs/services/providers/claude/ClaudeChatService.js.map +1 -1
  14. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  15. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js +3 -5
  16. package/dist/cjs/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  17. package/dist/cjs/services/providers/kimi/KimiChatService.js +1 -1
  18. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
  19. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js +3 -3
  20. package/dist/cjs/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
  21. package/dist/esm/constants/claude.d.ts +3 -2
  22. package/dist/esm/constants/claude.d.ts.map +1 -1
  23. package/dist/esm/constants/claude.js +4 -5
  24. package/dist/esm/constants/claude.js.map +1 -1
  25. package/dist/esm/constants/kimi.d.ts +1 -0
  26. package/dist/esm/constants/kimi.d.ts.map +1 -1
  27. package/dist/esm/constants/kimi.js +2 -1
  28. package/dist/esm/constants/kimi.js.map +1 -1
  29. package/dist/esm/services/providers/claude/ClaudeChatService.d.ts.map +1 -1
  30. package/dist/esm/services/providers/claude/ClaudeChatService.js +4 -4
  31. package/dist/esm/services/providers/claude/ClaudeChatService.js.map +1 -1
  32. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.d.ts.map +1 -1
  33. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js +4 -6
  34. package/dist/esm/services/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
  35. package/dist/esm/services/providers/kimi/KimiChatService.js +2 -2
  36. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.d.ts.map +1 -1
  37. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js +4 -4
  38. package/dist/esm/services/providers/kimi/KimiChatServiceProvider.js.map +1 -1
  39. package/dist/umd/aituber-onair-chat.js +20 -20
  40. package/dist/umd/aituber-onair-chat.min.js +7 -7
  41. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { MODEL_CLAUDE_3_HAIKU, MODEL_CLAUDE_3_5_HAIKU, MODEL_CLAUDE_3_5_SONNET, MODEL_CLAUDE_3_7_SONNET, MODEL_CLAUDE_4_SONNET, MODEL_CLAUDE_4_OPUS, MODEL_CLAUDE_4_5_SONNET, MODEL_CLAUDE_4_5_HAIKU, MODEL_CLAUDE_4_5_OPUS, MODEL_CLAUDE_4_6_SONNET, MODEL_CLAUDE_4_6_OPUS, CLAUDE_VISION_SUPPORTED_MODELS, } from '../../../constants';
1
+ import { MODEL_CLAUDE_3_HAIKU, MODEL_CLAUDE_4_SONNET, MODEL_CLAUDE_4_OPUS, MODEL_CLAUDE_4_5_SONNET, MODEL_CLAUDE_4_5_HAIKU, MODEL_CLAUDE_4_5_OPUS, MODEL_CLAUDE_4_6_SONNET, MODEL_CLAUDE_4_6_OPUS, MODEL_CLAUDE_4_7_OPUS, CLAUDE_VISION_SUPPORTED_MODELS, } from '../../../constants';
2
2
  import { ClaudeChatService } from './ClaudeChatService';
3
3
  import { resolveVisionModel } from '../../../utils';
4
4
  /**
@@ -35,10 +35,6 @@ export class ClaudeChatServiceProvider {
35
35
  */
36
36
  getSupportedModels() {
37
37
  return [
38
- MODEL_CLAUDE_3_HAIKU,
39
- MODEL_CLAUDE_3_5_HAIKU,
40
- MODEL_CLAUDE_3_5_SONNET,
41
- MODEL_CLAUDE_3_7_SONNET,
42
38
  MODEL_CLAUDE_4_SONNET,
43
39
  MODEL_CLAUDE_4_OPUS,
44
40
  MODEL_CLAUDE_4_5_SONNET,
@@ -46,6 +42,8 @@ export class ClaudeChatServiceProvider {
46
42
  MODEL_CLAUDE_4_5_OPUS,
47
43
  MODEL_CLAUDE_4_6_SONNET,
48
44
  MODEL_CLAUDE_4_6_OPUS,
45
+ MODEL_CLAUDE_4_7_OPUS,
46
+ MODEL_CLAUDE_3_HAIKU,
49
47
  ];
50
48
  }
51
49
  /**
@@ -53,7 +51,7 @@ export class ClaudeChatServiceProvider {
53
51
  * @returns Default model name
54
52
  */
55
53
  getDefaultModel() {
56
- return MODEL_CLAUDE_3_HAIKU;
54
+ return MODEL_CLAUDE_4_5_HAIKU;
57
55
  }
58
56
  /**
59
57
  * Check if this provider supports vision (image processing)
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IAGpC;;;;OAIG;IACH,iBAAiB,CAAC,OAAiC;QACjD,gFAAgF;QAChF,MAAM,WAAW,GAAG,kBAAkB,CAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;YACpC,kBAAkB,EAAE,IAAI,CAAC,eAAe,EAAE;YAC1C,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACrE,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,OAAO,IAAI,iBAAiB,CAC1B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,EACX,OAAO,CAAC,KAAK,IAAI,EAAE,EACnB,OAAO,CAAC,UAAU,IAAI,EAAE,EACxB,OAAO,CAAC,cAAc,CACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO;YACL,oBAAoB;YACpB,sBAAsB;YACtB,uBAAuB;YACvB,uBAAuB;YACvB,qBAAqB;YACrB,mBAAmB;YACnB,uBAAuB;YACvB,sBAAsB;YACtB,qBAAqB;YACrB,uBAAuB;YACvB,qBAAqB;SACtB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,qBAAqB,EAAE,KAAK,aAAa,CAAC;IACxD,CAAC;IAED,qBAAqB;QACnB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,8BAA8B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,6BAA6B,CAAC,KAAa;QACzC,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1E,CAAC;CACF"}
1
+ {"version":3,"file":"ClaudeChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/claude/ClaudeChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IAGpC;;;;OAIG;IACH,iBAAiB,CAAC,OAAiC;QACjD,gFAAgF;QAChF,MAAM,WAAW,GAAG,kBAAkB,CAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;YACpC,kBAAkB,EAAE,IAAI,CAAC,eAAe,EAAE;YAC1C,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACrE,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,OAAO,IAAI,iBAAiB,CAC1B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,EACX,OAAO,CAAC,KAAK,IAAI,EAAE,EACnB,OAAO,CAAC,UAAU,IAAI,EAAE,EACxB,OAAO,CAAC,cAAc,CACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO;YACL,qBAAqB;YACrB,mBAAmB;YACnB,uBAAuB;YACvB,sBAAsB;YACtB,qBAAqB;YACrB,uBAAuB;YACvB,qBAAqB;YACrB,qBAAqB;YACrB,oBAAoB;SACrB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,qBAAqB,EAAE,KAAK,aAAa,CAAC;IACxD,CAAC;IAED,qBAAqB;QACnB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,8BAA8B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,6BAA6B,CAAC,KAAa;QACzC,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1E,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import { ENDPOINT_KIMI_CHAT_COMPLETIONS_API, MODEL_KIMI_K2_5, isKimiVisionModel, } from '../../../constants/kimi';
1
+ import { ENDPOINT_KIMI_CHAT_COMPLETIONS_API, MODEL_KIMI_K2_6, isKimiVisionModel, } from '../../../constants/kimi';
2
2
  import { getMaxTokensForResponseLength, } from '../../../constants/chat';
3
3
  import { ChatServiceHttpClient } from '../../../utils/chatServiceHttpClient';
4
4
  import { buildOpenAICompatibleTools, parseOpenAICompatibleOneShot, parseOpenAICompatibleTextStream, parseOpenAICompatibleToolStream, processChatWithOptionalTools, } from '../../../utils';
@@ -12,7 +12,7 @@ export class KimiChatService {
12
12
  * @param model Name of the model to use
13
13
  * @param visionModel Name of the vision model
14
14
  */
15
- constructor(apiKey, model = MODEL_KIMI_K2_5, visionModel = MODEL_KIMI_K2_5, tools, endpoint = ENDPOINT_KIMI_CHAT_COMPLETIONS_API, responseLength, responseFormat, thinking) {
15
+ constructor(apiKey, model = MODEL_KIMI_K2_6, visionModel = MODEL_KIMI_K2_6, tools, endpoint = ENDPOINT_KIMI_CHAT_COMPLETIONS_API, responseLength, responseFormat, thinking) {
16
16
  /** Provider name */
17
17
  this.provider = 'kimi';
18
18
  this.apiKey = apiKey;
@@ -1 +1 @@
1
- {"version":3,"file":"KimiChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/kimi/KimiChatServiceProvider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAIhC;;GAEG;AACH,qBAAa,uBACX,YAAW,mBAAmB,CAAC,sBAAsB,CAAC;IAEtD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,GAAG,WAAW;IAgC/D;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAI7B;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB,qBAAqB,IAAI,kBAAkB;IAI3C;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB;IAIhE,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,iBAAiB;CAG1B"}
1
+ {"version":3,"file":"KimiChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/kimi/KimiChatServiceProvider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAIhC;;GAEG;AACH,qBAAa,uBACX,YAAW,mBAAmB,CAAC,sBAAsB,CAAC;IAEtD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,GAAG,WAAW;IAgC/D;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAI7B;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB,qBAAqB,IAAI,kBAAkB;IAI3C;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB;IAIhE,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,iBAAiB;CAG1B"}
@@ -1,4 +1,4 @@
1
- import { ENDPOINT_KIMI_CHAT_COMPLETIONS_API, MODEL_KIMI_K2_5, isKimiVisionModel, } from '../../../constants/kimi';
1
+ import { ENDPOINT_KIMI_CHAT_COMPLETIONS_API, MODEL_KIMI_K2_6, MODEL_KIMI_K2_5, isKimiVisionModel, } from '../../../constants/kimi';
2
2
  import { KimiChatService } from './KimiChatService';
3
3
  import { resolveVisionModel } from '../../../utils';
4
4
  /**
@@ -36,19 +36,19 @@ export class KimiChatServiceProvider {
36
36
  * Get the list of supported models
37
37
  */
38
38
  getSupportedModels() {
39
- return [MODEL_KIMI_K2_5];
39
+ return [MODEL_KIMI_K2_6, MODEL_KIMI_K2_5];
40
40
  }
41
41
  /**
42
42
  * Get the default model
43
43
  */
44
44
  getDefaultModel() {
45
- return MODEL_KIMI_K2_5;
45
+ return MODEL_KIMI_K2_6;
46
46
  }
47
47
  /**
48
48
  * Get the default vision model
49
49
  */
50
50
  getDefaultVisionModel() {
51
- return MODEL_KIMI_K2_5;
51
+ return MODEL_KIMI_K2_6;
52
52
  }
53
53
  /**
54
54
  * Check if this provider supports vision
@@ -1 +1 @@
1
- {"version":3,"file":"KimiChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/kimi/KimiChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,eAAe,EACf,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAGlC;;OAEG;IACH,iBAAiB,CAAC,OAA+B;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,kBAAkB,CAAC;YACrC,KAAK;YACL,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;YACpC,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,EAAE;YAChD,sBAAsB,EAAE,CAAC,WAAW,EAAE,EAAE,CACtC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC;YAC1C,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAiC,OAAO,CAAC,KAAK,CAAC;QAC1D,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC;QACzE,MAAM,QAAQ,GACZ,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE;YAC/B,CAAC,CAAC,eAAe,CAAC;QAEtB,OAAO,IAAI,eAAe,CACxB,OAAO,CAAC,MAAM,EACd,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,cAAc,EACtB,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,qBAAqB,EAAE,KAAK,aAAa,CAAC;IACxD,CAAC;IAED,qBAAqB;QACnB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,6BAA6B,CAAC,KAAa;QACzC,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1E,CAAC;IAEO,eAAe,CAAC,OAA+B;QACrD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC1C,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,GAAG,OAAO,mBAAmB,CAAC;QACvC,CAAC;QACD,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAEO,iBAAiB,CAAC,KAAa;QACrC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"KimiChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/kimi/KimiChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAGlC;;OAEG;IACH,iBAAiB,CAAC,OAA+B;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,kBAAkB,CAAC;YACrC,KAAK;YACL,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;YACpC,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,EAAE;YAChD,sBAAsB,EAAE,CAAC,WAAW,EAAE,EAAE,CACtC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC;YAC1C,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAiC,OAAO,CAAC,KAAK,CAAC;QAC1D,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC;QACzE,MAAM,QAAQ,GACZ,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE;YAC/B,CAAC,CAAC,eAAe,CAAC;QAEtB,OAAO,IAAI,eAAe,CACxB,OAAO,CAAC,MAAM,EACd,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,cAAc,EACtB,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,qBAAqB,EAAE,KAAK,aAAa,CAAC;IACxD,CAAC;IAED,qBAAqB;QACnB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,6BAA6B,CAAC,KAAa;QACzC,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1E,CAAC;IAEO,eAAe,CAAC,OAA+B;QACrD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC1C,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,GAAG,OAAO,mBAAmB,CAAC;QACvC,CAAC;QACD,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAEO,iBAAiB,CAAC,KAAa;QACrC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -68,6 +68,7 @@ var AITuberOnAirChat = (() => {
68
68
  MODEL_CLAUDE_4_5_SONNET: () => MODEL_CLAUDE_4_5_SONNET,
69
69
  MODEL_CLAUDE_4_6_OPUS: () => MODEL_CLAUDE_4_6_OPUS,
70
70
  MODEL_CLAUDE_4_6_SONNET: () => MODEL_CLAUDE_4_6_SONNET,
71
+ MODEL_CLAUDE_4_7_OPUS: () => MODEL_CLAUDE_4_7_OPUS,
71
72
  MODEL_CLAUDE_4_OPUS: () => MODEL_CLAUDE_4_OPUS,
72
73
  MODEL_CLAUDE_4_SONNET: () => MODEL_CLAUDE_4_SONNET,
73
74
  MODEL_GEMINI_2_0_FLASH: () => MODEL_GEMINI_2_0_FLASH,
@@ -114,6 +115,7 @@ var AITuberOnAirChat = (() => {
114
115
  MODEL_GROK_4_20_NON_REASONING: () => MODEL_GROK_4_20_NON_REASONING,
115
116
  MODEL_GROK_4_20_REASONING: () => MODEL_GROK_4_20_REASONING,
116
117
  MODEL_KIMI_K2_5: () => MODEL_KIMI_K2_5,
118
+ MODEL_KIMI_K2_6: () => MODEL_KIMI_K2_6,
117
119
  MODEL_MOONSHOTAI_KIMI_K2_5: () => MODEL_MOONSHOTAI_KIMI_K2_5,
118
120
  MODEL_O1: () => MODEL_O1,
119
121
  MODEL_O1_MINI: () => MODEL_O1_MINI,
@@ -281,25 +283,24 @@ var AITuberOnAirChat = (() => {
281
283
  var MODEL_CLAUDE_3_5_HAIKU = "claude-3-5-haiku-20241022";
282
284
  var MODEL_CLAUDE_3_5_SONNET = "claude-3-5-sonnet-20241022";
283
285
  var MODEL_CLAUDE_3_7_SONNET = "claude-3-7-sonnet-20250219";
284
- var MODEL_CLAUDE_4_SONNET = "claude-4-sonnet-20250514";
285
- var MODEL_CLAUDE_4_OPUS = "claude-4-opus-20250514";
286
+ var MODEL_CLAUDE_4_SONNET = "claude-sonnet-4-20250514";
287
+ var MODEL_CLAUDE_4_OPUS = "claude-opus-4-20250514";
286
288
  var MODEL_CLAUDE_4_5_SONNET = "claude-sonnet-4-5-20250929";
287
289
  var MODEL_CLAUDE_4_5_HAIKU = "claude-haiku-4-5-20251001";
288
290
  var MODEL_CLAUDE_4_5_OPUS = "claude-opus-4-5-20251101";
289
291
  var MODEL_CLAUDE_4_6_SONNET = "claude-sonnet-4-6";
290
292
  var MODEL_CLAUDE_4_6_OPUS = "claude-opus-4-6";
293
+ var MODEL_CLAUDE_4_7_OPUS = "claude-opus-4-7";
291
294
  var CLAUDE_VISION_SUPPORTED_MODELS = [
292
295
  MODEL_CLAUDE_3_HAIKU,
293
- MODEL_CLAUDE_3_5_HAIKU,
294
- MODEL_CLAUDE_3_5_SONNET,
295
- MODEL_CLAUDE_3_7_SONNET,
296
296
  MODEL_CLAUDE_4_SONNET,
297
297
  MODEL_CLAUDE_4_OPUS,
298
298
  MODEL_CLAUDE_4_5_SONNET,
299
299
  MODEL_CLAUDE_4_5_HAIKU,
300
300
  MODEL_CLAUDE_4_5_OPUS,
301
301
  MODEL_CLAUDE_4_6_SONNET,
302
- MODEL_CLAUDE_4_6_OPUS
302
+ MODEL_CLAUDE_4_6_OPUS,
303
+ MODEL_CLAUDE_4_7_OPUS
303
304
  ];
304
305
 
305
306
  // src/constants/openrouter.ts
@@ -399,8 +400,9 @@ var AITuberOnAirChat = (() => {
399
400
 
400
401
  // src/constants/kimi.ts
401
402
  var ENDPOINT_KIMI_CHAT_COMPLETIONS_API = "https://api.moonshot.ai/v1/chat/completions";
403
+ var MODEL_KIMI_K2_6 = "kimi-k2.6";
402
404
  var MODEL_KIMI_K2_5 = "kimi-k2.5";
403
- var KIMI_VISION_SUPPORTED_MODELS = [MODEL_KIMI_K2_5];
405
+ var KIMI_VISION_SUPPORTED_MODELS = [MODEL_KIMI_K2_6, MODEL_KIMI_K2_5];
404
406
  function isKimiVisionModel(model) {
405
407
  return KIMI_VISION_SUPPORTED_MODELS.includes(model);
406
408
  }
@@ -1104,12 +1106,12 @@ If it's in another language, summarize in that language.
1104
1106
  * @param mcpServers Array of MCP server configurations (optional)
1105
1107
  * @throws Error if the vision model doesn't support vision capabilities
1106
1108
  */
1107
- constructor(apiKey, model = MODEL_CLAUDE_3_HAIKU, visionModel = MODEL_CLAUDE_3_HAIKU, tools = [], mcpServers = [], responseLength) {
1109
+ constructor(apiKey, model = MODEL_CLAUDE_4_5_HAIKU, visionModel = MODEL_CLAUDE_4_5_HAIKU, tools = [], mcpServers = [], responseLength) {
1108
1110
  /** Provider name */
1109
1111
  this.provider = "claude";
1110
1112
  this.apiKey = apiKey;
1111
- this.model = model || MODEL_CLAUDE_3_HAIKU;
1112
- this.visionModel = visionModel || MODEL_CLAUDE_3_HAIKU;
1113
+ this.model = model || MODEL_CLAUDE_4_5_HAIKU;
1114
+ this.visionModel = visionModel || MODEL_CLAUDE_4_5_HAIKU;
1113
1115
  this.tools = tools;
1114
1116
  this.mcpServers = mcpServers;
1115
1117
  this.responseLength = responseLength;
@@ -1581,17 +1583,15 @@ If it's in another language, summarize in that language.
1581
1583
  */
1582
1584
  getSupportedModels() {
1583
1585
  return [
1584
- MODEL_CLAUDE_3_HAIKU,
1585
- MODEL_CLAUDE_3_5_HAIKU,
1586
- MODEL_CLAUDE_3_5_SONNET,
1587
- MODEL_CLAUDE_3_7_SONNET,
1588
1586
  MODEL_CLAUDE_4_SONNET,
1589
1587
  MODEL_CLAUDE_4_OPUS,
1590
1588
  MODEL_CLAUDE_4_5_SONNET,
1591
1589
  MODEL_CLAUDE_4_5_HAIKU,
1592
1590
  MODEL_CLAUDE_4_5_OPUS,
1593
1591
  MODEL_CLAUDE_4_6_SONNET,
1594
- MODEL_CLAUDE_4_6_OPUS
1592
+ MODEL_CLAUDE_4_6_OPUS,
1593
+ MODEL_CLAUDE_4_7_OPUS,
1594
+ MODEL_CLAUDE_3_HAIKU
1595
1595
  ];
1596
1596
  }
1597
1597
  /**
@@ -1599,7 +1599,7 @@ If it's in another language, summarize in that language.
1599
1599
  * @returns Default model name
1600
1600
  */
1601
1601
  getDefaultModel() {
1602
- return MODEL_CLAUDE_3_HAIKU;
1602
+ return MODEL_CLAUDE_4_5_HAIKU;
1603
1603
  }
1604
1604
  /**
1605
1605
  * Check if this provider supports vision (image processing)
@@ -2574,7 +2574,7 @@ If it's in another language, summarize in that language.
2574
2574
  * @param model Name of the model to use
2575
2575
  * @param visionModel Name of the vision model
2576
2576
  */
2577
- constructor(apiKey, model = MODEL_KIMI_K2_5, visionModel = MODEL_KIMI_K2_5, tools, endpoint = ENDPOINT_KIMI_CHAT_COMPLETIONS_API, responseLength, responseFormat, thinking) {
2577
+ constructor(apiKey, model = MODEL_KIMI_K2_6, visionModel = MODEL_KIMI_K2_6, tools, endpoint = ENDPOINT_KIMI_CHAT_COMPLETIONS_API, responseLength, responseFormat, thinking) {
2578
2578
  /** Provider name */
2579
2579
  this.provider = "kimi";
2580
2580
  this.apiKey = apiKey;
@@ -2772,19 +2772,19 @@ If it's in another language, summarize in that language.
2772
2772
  * Get the list of supported models
2773
2773
  */
2774
2774
  getSupportedModels() {
2775
- return [MODEL_KIMI_K2_5];
2775
+ return [MODEL_KIMI_K2_6, MODEL_KIMI_K2_5];
2776
2776
  }
2777
2777
  /**
2778
2778
  * Get the default model
2779
2779
  */
2780
2780
  getDefaultModel() {
2781
- return MODEL_KIMI_K2_5;
2781
+ return MODEL_KIMI_K2_6;
2782
2782
  }
2783
2783
  /**
2784
2784
  * Get the default vision model
2785
2785
  */
2786
2786
  getDefaultVisionModel() {
2787
- return MODEL_KIMI_K2_5;
2787
+ return MODEL_KIMI_K2_6;
2788
2788
  }
2789
2789
  /**
2790
2790
  * Check if this provider supports vision
@@ -1,4 +1,4 @@
1
- "use strict";var AITuberOnAirChat=(()=>{var xt=Object.defineProperty;var go=Object.getOwnPropertyDescriptor;var _o=Object.getOwnPropertyNames;var fo=Object.prototype.hasOwnProperty;var vo=(r,e)=>{for(var t in e)xt(r,t,{get:e[t],enumerable:!0})},Mo=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of _o(e))!fo.call(r,s)&&s!==t&&xt(r,s,{get:()=>e[s],enumerable:!(o=go(e,s))||o.enumerable});return r};var Oo=r=>Mo(xt({},"__esModule",{value:!0}),r);var Bo={};vo(Bo,{CHAT_RESPONSE_LENGTH:()=>C,CLAUDE_VISION_SUPPORTED_MODELS:()=>Pe,ChatServiceFactory:()=>Se,ChatServiceHttpClient:()=>_,ClaudeChatService:()=>ae,ClaudeChatServiceProvider:()=>le,DEFAULT_MAX_TOKENS:()=>Jt,DEFAULT_SUMMARY_PROMPT_TEMPLATE:()=>To,DEFAULT_VISION_PROMPT:()=>yo,EMOTION_TAG_CLEANUP_REGEX:()=>Qt,EMOTION_TAG_REGEX:()=>no,ENDPOINT_CLAUDE_API:()=>Gt,ENDPOINT_GEMINI_API:()=>kt,ENDPOINT_KIMI_CHAT_COMPLETIONS_API:()=>ie,ENDPOINT_OPENAI_CHAT_COMPLETIONS_API:()=>Z,ENDPOINT_OPENAI_RESPONSES_API:()=>I,ENDPOINT_OPENROUTER_API:()=>xe,ENDPOINT_XAI_CHAT_COMPLETIONS_API:()=>be,ENDPOINT_ZAI_CHAT_COMPLETIONS_API:()=>Ie,EmotionParser:()=>ne,GEMINI_NANO_MAX_CONTEXT_MESSAGES:()=>Yt,GEMINI_VISION_SUPPORTED_MODELS:()=>Le,GPT5_PRESETS:()=>Zt,GPT_5_MODELS:()=>to,GeminiChatService:()=>pe,GeminiChatServiceProvider:()=>ce,GeminiNanoChatService:()=>ue,GeminiNanoChatServiceProvider:()=>he,HttpError:()=>G,KIMI_VISION_SUPPORTED_MODELS:()=>ro,KimiChatService:()=>de,KimiChatServiceProvider:()=>me,MAX_TOKENS_BY_LENGTH:()=>yt,MODEL_ANTHROPIC_CLAUDE_3_5_SONNET:()=>Ft,MODEL_ANTHROPIC_CLAUDE_3_7_SONNET:()=>dt,MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU:()=>mt,MODEL_ANTHROPIC_CLAUDE_OPUS_4:()=>ut,MODEL_ANTHROPIC_CLAUDE_SONNET_4:()=>ht,MODEL_CLAUDE_3_5_HAIKU:()=>qe,MODEL_CLAUDE_3_5_SONNET:()=>ze,MODEL_CLAUDE_3_7_SONNET:()=>Xe,MODEL_CLAUDE_3_HAIKU:()=>b,MODEL_CLAUDE_4_5_HAIKU:()=>Qe,MODEL_CLAUDE_4_5_OPUS:()=>et,MODEL_CLAUDE_4_5_SONNET:()=>Ye,MODEL_CLAUDE_4_6_OPUS:()=>ot,MODEL_CLAUDE_4_6_SONNET:()=>tt,MODEL_CLAUDE_4_OPUS:()=>Ze,MODEL_CLAUDE_4_SONNET:()=>Je,MODEL_GEMINI_2_0_FLASH:()=>je,MODEL_GEMINI_2_0_FLASH_LITE:()=>V,MODEL_GEMINI_2_5_FLASH:()=>Be,MODEL_GEMINI_2_5_FLASH_LITE:()=>Ke,MODEL_GEMINI_2_5_FLASH_LITE_PREVIEW_06_17:()=>$e,MODEL_GEMINI_2_5_PRO:()=>We,MODEL_GEMINI_3_1_FLASH_LITE_PREVIEW:()=>Fe,MODEL_GEMINI_3_1_PRO_PREVIEW:()=>Ge,MODEL_GEMINI_3_FLASH_PREVIEW:()=>He,MODEL_GEMINI_3_PRO_PREVIEW:()=>Ue,MODEL_GEMINI_NANO:()=>X,MODEL_GEMMA_4_26B_A4B_IT:()=>ke,MODEL_GEMMA_4_31B_IT:()=>Ve,MODEL_GLM_4_6:()=>zt,MODEL_GLM_4_6V:()=>Mt,MODEL_GLM_4_6V_FLASH:()=>z,MODEL_GLM_4_6V_FLASHX:()=>Ot,MODEL_GLM_4_7:()=>te,MODEL_GLM_4_7_FLASH:()=>qt,MODEL_GLM_4_7_FLASHX:()=>jt,MODEL_GLM_5:()=>Kt,MODEL_GLM_5_TURBO:()=>$t,MODEL_GOOGLE_GEMINI_2_5_FLASH:()=>_t,MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025:()=>ft,MODEL_GOOGLE_GEMINI_2_5_PRO:()=>gt,MODEL_GPT_4O:()=>we,MODEL_GPT_4O_MINI:()=>$,MODEL_GPT_4_1:()=>Ae,MODEL_GPT_4_1_MINI:()=>De,MODEL_GPT_4_1_NANO:()=>Ne,MODEL_GPT_5:()=>Q,MODEL_GPT_5_1:()=>W,MODEL_GPT_5_4:()=>N,MODEL_GPT_5_4_MINI:()=>B,MODEL_GPT_5_4_NANO:()=>K,MODEL_GPT_5_4_PRO:()=>w,MODEL_GPT_5_MINI:()=>Y,MODEL_GPT_5_NANO:()=>H,MODEL_GPT_OSS_20B_FREE:()=>k,MODEL_GROK_4_1_FAST_NON_REASONING:()=>A,MODEL_GROK_4_1_FAST_REASONING:()=>St,MODEL_GROK_4_20_NON_REASONING:()=>Ct,MODEL_GROK_4_20_REASONING:()=>Et,MODEL_KIMI_K2_5:()=>D,MODEL_MOONSHOTAI_KIMI_K2_5:()=>st,MODEL_O1:()=>Rt,MODEL_O1_MINI:()=>bt,MODEL_O3_MINI:()=>It,MODEL_OPENAI_GPT_4O:()=>lt,MODEL_OPENAI_GPT_4_1_MINI:()=>pt,MODEL_OPENAI_GPT_4_1_NANO:()=>ct,MODEL_OPENAI_GPT_5_1_CHAT:()=>it,MODEL_OPENAI_GPT_5_1_CODEX:()=>rt,MODEL_OPENAI_GPT_5_MINI:()=>nt,MODEL_OPENAI_GPT_5_NANO:()=>at,MODEL_ZAI_GLM_4_5_AIR:()=>Ht,MODEL_ZAI_GLM_4_5_AIR_FREE:()=>vt,MODEL_ZAI_GLM_4_7_FLASH:()=>Ut,OPENROUTER_CREDITS_THRESHOLD:()=>So,OPENROUTER_FREE_DAILY_LIMIT_HIGH_CREDITS:()=>Co,OPENROUTER_FREE_DAILY_LIMIT_LOW_CREDITS:()=>Eo,OPENROUTER_FREE_MODELS:()=>Wt,OPENROUTER_FREE_RATE_LIMIT_PER_MINUTE:()=>Bt,OPENROUTER_VISION_SUPPORTED_MODELS:()=>oo,OpenAIChatService:()=>F,OpenAIChatServiceProvider:()=>_e,OpenAICompatibleChatServiceProvider:()=>ge,OpenRouterChatService:()=>fe,OpenRouterChatServiceProvider:()=>ve,StreamTextAccumulator:()=>v,VISION_SUPPORTED_MODELS:()=>Te,XAIChatService:()=>Me,XAIChatServiceProvider:()=>Oe,XAI_VISION_SUPPORTED_MODELS:()=>io,ZAIChatService:()=>Ee,ZAIChatServiceProvider:()=>Ce,ZAI_VISION_SUPPORTED_MODELS:()=>so,allowsReasoningLow:()=>Vt,allowsReasoningMinimal:()=>wt,allowsReasoningNone:()=>Nt,allowsReasoningXHigh:()=>Dt,buildOpenAICompatibleTools:()=>P,getDefaultReasoningEffortForGPT5Model:()=>R,getMaxTokensForResponseLength:()=>O,installGASFetch:()=>mo,isGPT5Model:()=>j,isKimiVisionModel:()=>re,isOpenRouterFreeModel:()=>q,isOpenRouterVisionModel:()=>ee,isResponsesOnlyGPT5Model:()=>At,isXaiVisionModel:()=>se,isZaiToolStreamModel:()=>Xt,isZaiVisionModel:()=>oe,parseOpenAICompatibleOneShot:()=>L,parseOpenAICompatibleTextStream:()=>y,parseOpenAICompatibleToolStream:()=>T,processChatWithOptionalTools:()=>f,refreshOpenRouterFreeModels:()=>Fo,resolveVisionModel:()=>E,runOnceText:()=>Io,screenplayToText:()=>xo,textToScreenplay:()=>ao,textsToScreenplay:()=>Po});var Z="https://api.openai.com/v1/chat/completions",I="https://api.openai.com/v1/responses",H="gpt-5-nano",Y="gpt-5-mini",Q="gpt-5",W="gpt-5.1",N="gpt-5.4",B="gpt-5.4-mini",K="gpt-5.4-nano",w="gpt-5.4-pro",Ae="gpt-4.1",De="gpt-4.1-mini",Ne="gpt-4.1-nano",$="gpt-4o-mini",we="gpt-4o",It="o3-mini",bt="o1-mini",Rt="o1",Te=[H,Y,Q,W,N,B,K,w,Ae,De,Ne,$,we,"o1"],to=[H,Y,Q,W,N,B,K,w];function j(r){return to.includes(r)}function At(r){return r===w}function Dt(r){return r===N||r===B||r===K||r===w}function Nt(r){return r===W||r===N||r===B||r===K}function wt(r){return r===H||r===Y||r===Q}function Vt(r){return r!==w}function R(r){return r===W||r===N?"none":"medium"}var kt="https://generativelanguage.googleapis.com",Ve="gemma-4-31b-it",ke="gemma-4-26b-a4b-it",Ge="gemini-3.1-pro-preview",Fe="gemini-3.1-flash-lite-preview",Ue="gemini-3-pro-preview",He="gemini-3-flash-preview",We="gemini-2.5-pro",Be="gemini-2.5-flash",Ke="gemini-2.5-flash-lite",$e="gemini-2.5-flash-lite-preview-06-17",je="gemini-2.0-flash",V="gemini-2.0-flash-lite",Le=[Ve,ke,Ge,Fe,Ue,He,We,Be,Ke,$e,je,V];var Gt="https://api.anthropic.com/v1/messages",b="claude-3-haiku-20240307",qe="claude-3-5-haiku-20241022",ze="claude-3-5-sonnet-20241022",Xe="claude-3-7-sonnet-20250219",Je="claude-4-sonnet-20250514",Ze="claude-4-opus-20250514",Ye="claude-sonnet-4-5-20250929",Qe="claude-haiku-4-5-20251001",et="claude-opus-4-5-20251101",tt="claude-sonnet-4-6",ot="claude-opus-4-6",Pe=[b,qe,ze,Xe,Je,Ze,Ye,Qe,et,tt,ot];var xe="https://openrouter.ai/api/v1/chat/completions",k="openai/gpt-oss-20b:free",st="moonshotai/kimi-k2.5",it="openai/gpt-5.1-chat",rt="openai/gpt-5.1-codex",nt="openai/gpt-5-mini",at="openai/gpt-5-nano",lt="openai/gpt-4o",pt="openai/gpt-4.1-mini",ct="openai/gpt-4.1-nano",ut="anthropic/claude-opus-4",ht="anthropic/claude-sonnet-4",dt="anthropic/claude-3.7-sonnet",Ft="anthropic/claude-3.5-sonnet",mt="anthropic/claude-haiku-4.5",gt="google/gemini-2.5-pro",_t="google/gemini-2.5-flash",ft="google/gemini-2.5-flash-lite-preview-09-2025",Ut="z-ai/glm-4.7-flash",Ht="z-ai/glm-4.5-air",vt="z-ai/glm-4.5-air:free",Wt=[k,vt],oo=[it,rt,nt,at,lt,pt,ct,ut,ht,dt,mt,gt,_t,ft,st],Bt=20,Eo=50,Co=1e3,So=10;function q(r){return r.trim().endsWith(":free")}function ee(r){return oo.some(e=>r.includes(e))}var Ie="https://api.z.ai/api/paas/v4/chat/completions",Kt="glm-5",$t="glm-5-turbo",te="glm-4.7",jt="glm-4.7-FlashX",qt="glm-4.7-Flash",zt="glm-4.6",Mt="glm-4.6V",Ot="glm-4.6V-FlashX",z="glm-4.6V-Flash",so=[Mt,Ot,z];function oe(r){return so.includes(r)}function Xt(r){return r.toLowerCase().startsWith("glm-4.6")}var be="https://api.x.ai/v1/chat/completions",Et="grok-4.20-0309-reasoning",Ct="grok-4.20-0309-non-reasoning",St="grok-4-1-fast-reasoning",A="grok-4-1-fast-non-reasoning",io=[Et,Ct,St,A];function se(r){return io.includes(r)}var ie="https://api.moonshot.ai/v1/chat/completions",D="kimi-k2.5",ro=[D];function re(r){return ro.includes(r)}var C={VERY_SHORT:"veryShort",SHORT:"short",MEDIUM:"medium",LONG:"long",VERY_LONG:"veryLong",DEEP:"deep"},yt={[C.VERY_SHORT]:40,[C.SHORT]:100,[C.MEDIUM]:200,[C.LONG]:300,[C.VERY_LONG]:1e3,[C.DEEP]:5e3},Jt=5e3,Zt={casual:{reasoning_effort:"minimal",verbosity:"low",description:"Fast responses for casual chat, quick questions (GPT-4 like experience)"},balanced:{reasoning_effort:"medium",verbosity:"medium",description:"Balanced reasoning for business tasks, learning, general problem solving"},expert:{reasoning_effort:"high",verbosity:"high",description:"Deep reasoning for research, complex analysis, expert-level tasks"}};function O(r){return r?yt[r]??Jt:Jt}var yo="You are a friendly AI avatar. Comment on the situation based on the broadcast screen.",To=`You are a skilled summarizing assistant.
1
+ "use strict";var AITuberOnAirChat=(()=>{var Pt=Object.defineProperty;var mo=Object.getOwnPropertyDescriptor;var go=Object.getOwnPropertyNames;var _o=Object.prototype.hasOwnProperty;var fo=(r,e)=>{for(var t in e)Pt(r,t,{get:e[t],enumerable:!0})},vo=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of go(e))!_o.call(r,s)&&s!==t&&Pt(r,s,{get:()=>e[s],enumerable:!(o=mo(e,s))||o.enumerable});return r};var Mo=r=>vo(Pt({},"__esModule",{value:!0}),r);var $o={};fo($o,{CHAT_RESPONSE_LENGTH:()=>C,CLAUDE_VISION_SUPPORTED_MODELS:()=>Pe,ChatServiceFactory:()=>Se,ChatServiceHttpClient:()=>_,ClaudeChatService:()=>ae,ClaudeChatServiceProvider:()=>le,DEFAULT_MAX_TOKENS:()=>Xt,DEFAULT_SUMMARY_PROMPT_TEMPLATE:()=>Po,DEFAULT_VISION_PROMPT:()=>Lo,EMOTION_TAG_CLEANUP_REGEX:()=>Yt,EMOTION_TAG_REGEX:()=>ro,ENDPOINT_CLAUDE_API:()=>kt,ENDPOINT_GEMINI_API:()=>Vt,ENDPOINT_KIMI_CHAT_COMPLETIONS_API:()=>ie,ENDPOINT_OPENAI_CHAT_COMPLETIONS_API:()=>Z,ENDPOINT_OPENAI_RESPONSES_API:()=>I,ENDPOINT_OPENROUTER_API:()=>xe,ENDPOINT_XAI_CHAT_COMPLETIONS_API:()=>be,ENDPOINT_ZAI_CHAT_COMPLETIONS_API:()=>Ie,EmotionParser:()=>ne,GEMINI_NANO_MAX_CONTEXT_MESSAGES:()=>Zt,GEMINI_VISION_SUPPORTED_MODELS:()=>Le,GPT5_PRESETS:()=>Jt,GPT_5_MODELS:()=>eo,GeminiChatService:()=>pe,GeminiChatServiceProvider:()=>ce,GeminiNanoChatService:()=>ue,GeminiNanoChatServiceProvider:()=>he,HttpError:()=>G,KIMI_VISION_SUPPORTED_MODELS:()=>io,KimiChatService:()=>de,KimiChatServiceProvider:()=>me,MAX_TOKENS_BY_LENGTH:()=>St,MODEL_ANTHROPIC_CLAUDE_3_5_SONNET:()=>Gt,MODEL_ANTHROPIC_CLAUDE_3_7_SONNET:()=>ut,MODEL_ANTHROPIC_CLAUDE_4_5_HAIKU:()=>ht,MODEL_ANTHROPIC_CLAUDE_OPUS_4:()=>pt,MODEL_ANTHROPIC_CLAUDE_SONNET_4:()=>ct,MODEL_CLAUDE_3_5_HAIKU:()=>Oo,MODEL_CLAUDE_3_5_SONNET:()=>Eo,MODEL_CLAUDE_3_7_SONNET:()=>Co,MODEL_CLAUDE_3_HAIKU:()=>qe,MODEL_CLAUDE_4_5_HAIKU:()=>b,MODEL_CLAUDE_4_5_OPUS:()=>Ze,MODEL_CLAUDE_4_5_SONNET:()=>Je,MODEL_CLAUDE_4_6_OPUS:()=>Qe,MODEL_CLAUDE_4_6_SONNET:()=>Ye,MODEL_CLAUDE_4_7_OPUS:()=>et,MODEL_CLAUDE_4_OPUS:()=>Xe,MODEL_CLAUDE_4_SONNET:()=>ze,MODEL_GEMINI_2_0_FLASH:()=>je,MODEL_GEMINI_2_0_FLASH_LITE:()=>V,MODEL_GEMINI_2_5_FLASH:()=>Be,MODEL_GEMINI_2_5_FLASH_LITE:()=>Ke,MODEL_GEMINI_2_5_FLASH_LITE_PREVIEW_06_17:()=>$e,MODEL_GEMINI_2_5_PRO:()=>We,MODEL_GEMINI_3_1_FLASH_LITE_PREVIEW:()=>Fe,MODEL_GEMINI_3_1_PRO_PREVIEW:()=>Ge,MODEL_GEMINI_3_FLASH_PREVIEW:()=>He,MODEL_GEMINI_3_PRO_PREVIEW:()=>Ue,MODEL_GEMINI_NANO:()=>X,MODEL_GEMMA_4_26B_A4B_IT:()=>ke,MODEL_GEMMA_4_31B_IT:()=>Ve,MODEL_GLM_4_6:()=>qt,MODEL_GLM_4_6V:()=>ft,MODEL_GLM_4_6V_FLASH:()=>z,MODEL_GLM_4_6V_FLASHX:()=>vt,MODEL_GLM_4_7:()=>te,MODEL_GLM_4_7_FLASH:()=>jt,MODEL_GLM_4_7_FLASHX:()=>$t,MODEL_GLM_5:()=>Bt,MODEL_GLM_5_TURBO:()=>Kt,MODEL_GOOGLE_GEMINI_2_5_FLASH:()=>mt,MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE_PREVIEW_09_2025:()=>gt,MODEL_GOOGLE_GEMINI_2_5_PRO:()=>dt,MODEL_GPT_4O:()=>we,MODEL_GPT_4O_MINI:()=>$,MODEL_GPT_4_1:()=>Ae,MODEL_GPT_4_1_MINI:()=>De,MODEL_GPT_4_1_NANO:()=>Ne,MODEL_GPT_5:()=>Q,MODEL_GPT_5_1:()=>W,MODEL_GPT_5_4:()=>N,MODEL_GPT_5_4_MINI:()=>B,MODEL_GPT_5_4_NANO:()=>K,MODEL_GPT_5_4_PRO:()=>w,MODEL_GPT_5_MINI:()=>Y,MODEL_GPT_5_NANO:()=>H,MODEL_GPT_OSS_20B_FREE:()=>k,MODEL_GROK_4_1_FAST_NON_REASONING:()=>A,MODEL_GROK_4_1_FAST_REASONING:()=>Et,MODEL_GROK_4_20_NON_REASONING:()=>Ot,MODEL_GROK_4_20_REASONING:()=>Mt,MODEL_KIMI_K2_5:()=>Ct,MODEL_KIMI_K2_6:()=>D,MODEL_MOONSHOTAI_KIMI_K2_5:()=>tt,MODEL_O1:()=>bt,MODEL_O1_MINI:()=>It,MODEL_O3_MINI:()=>xt,MODEL_OPENAI_GPT_4O:()=>nt,MODEL_OPENAI_GPT_4_1_MINI:()=>at,MODEL_OPENAI_GPT_4_1_NANO:()=>lt,MODEL_OPENAI_GPT_5_1_CHAT:()=>ot,MODEL_OPENAI_GPT_5_1_CODEX:()=>st,MODEL_OPENAI_GPT_5_MINI:()=>it,MODEL_OPENAI_GPT_5_NANO:()=>rt,MODEL_ZAI_GLM_4_5_AIR:()=>Ut,MODEL_ZAI_GLM_4_5_AIR_FREE:()=>_t,MODEL_ZAI_GLM_4_7_FLASH:()=>Ft,OPENROUTER_CREDITS_THRESHOLD:()=>To,OPENROUTER_FREE_DAILY_LIMIT_HIGH_CREDITS:()=>yo,OPENROUTER_FREE_DAILY_LIMIT_LOW_CREDITS:()=>So,OPENROUTER_FREE_MODELS:()=>Ht,OPENROUTER_FREE_RATE_LIMIT_PER_MINUTE:()=>Wt,OPENROUTER_VISION_SUPPORTED_MODELS:()=>to,OpenAIChatService:()=>F,OpenAIChatServiceProvider:()=>_e,OpenAICompatibleChatServiceProvider:()=>ge,OpenRouterChatService:()=>fe,OpenRouterChatServiceProvider:()=>ve,StreamTextAccumulator:()=>v,VISION_SUPPORTED_MODELS:()=>Te,XAIChatService:()=>Me,XAIChatServiceProvider:()=>Oe,XAI_VISION_SUPPORTED_MODELS:()=>so,ZAIChatService:()=>Ee,ZAIChatServiceProvider:()=>Ce,ZAI_VISION_SUPPORTED_MODELS:()=>oo,allowsReasoningLow:()=>wt,allowsReasoningMinimal:()=>Nt,allowsReasoningNone:()=>Dt,allowsReasoningXHigh:()=>At,buildOpenAICompatibleTools:()=>P,getDefaultReasoningEffortForGPT5Model:()=>R,getMaxTokensForResponseLength:()=>O,installGASFetch:()=>ho,isGPT5Model:()=>j,isKimiVisionModel:()=>re,isOpenRouterFreeModel:()=>q,isOpenRouterVisionModel:()=>ee,isResponsesOnlyGPT5Model:()=>Rt,isXaiVisionModel:()=>se,isZaiToolStreamModel:()=>zt,isZaiVisionModel:()=>oe,parseOpenAICompatibleOneShot:()=>L,parseOpenAICompatibleTextStream:()=>y,parseOpenAICompatibleToolStream:()=>T,processChatWithOptionalTools:()=>f,refreshOpenRouterFreeModels:()=>Ho,resolveVisionModel:()=>E,runOnceText:()=>Ro,screenplayToText:()=>bo,textToScreenplay:()=>no,textsToScreenplay:()=>Io});var Z="https://api.openai.com/v1/chat/completions",I="https://api.openai.com/v1/responses",H="gpt-5-nano",Y="gpt-5-mini",Q="gpt-5",W="gpt-5.1",N="gpt-5.4",B="gpt-5.4-mini",K="gpt-5.4-nano",w="gpt-5.4-pro",Ae="gpt-4.1",De="gpt-4.1-mini",Ne="gpt-4.1-nano",$="gpt-4o-mini",we="gpt-4o",xt="o3-mini",It="o1-mini",bt="o1",Te=[H,Y,Q,W,N,B,K,w,Ae,De,Ne,$,we,"o1"],eo=[H,Y,Q,W,N,B,K,w];function j(r){return eo.includes(r)}function Rt(r){return r===w}function At(r){return r===N||r===B||r===K||r===w}function Dt(r){return r===W||r===N||r===B||r===K}function Nt(r){return r===H||r===Y||r===Q}function wt(r){return r!==w}function R(r){return r===W||r===N?"none":"medium"}var Vt="https://generativelanguage.googleapis.com",Ve="gemma-4-31b-it",ke="gemma-4-26b-a4b-it",Ge="gemini-3.1-pro-preview",Fe="gemini-3.1-flash-lite-preview",Ue="gemini-3-pro-preview",He="gemini-3-flash-preview",We="gemini-2.5-pro",Be="gemini-2.5-flash",Ke="gemini-2.5-flash-lite",$e="gemini-2.5-flash-lite-preview-06-17",je="gemini-2.0-flash",V="gemini-2.0-flash-lite",Le=[Ve,ke,Ge,Fe,Ue,He,We,Be,Ke,$e,je,V];var kt="https://api.anthropic.com/v1/messages",qe="claude-3-haiku-20240307",Oo="claude-3-5-haiku-20241022",Eo="claude-3-5-sonnet-20241022",Co="claude-3-7-sonnet-20250219",ze="claude-sonnet-4-20250514",Xe="claude-opus-4-20250514",Je="claude-sonnet-4-5-20250929",b="claude-haiku-4-5-20251001",Ze="claude-opus-4-5-20251101",Ye="claude-sonnet-4-6",Qe="claude-opus-4-6",et="claude-opus-4-7",Pe=[qe,ze,Xe,Je,b,Ze,Ye,Qe,et];var xe="https://openrouter.ai/api/v1/chat/completions",k="openai/gpt-oss-20b:free",tt="moonshotai/kimi-k2.5",ot="openai/gpt-5.1-chat",st="openai/gpt-5.1-codex",it="openai/gpt-5-mini",rt="openai/gpt-5-nano",nt="openai/gpt-4o",at="openai/gpt-4.1-mini",lt="openai/gpt-4.1-nano",pt="anthropic/claude-opus-4",ct="anthropic/claude-sonnet-4",ut="anthropic/claude-3.7-sonnet",Gt="anthropic/claude-3.5-sonnet",ht="anthropic/claude-haiku-4.5",dt="google/gemini-2.5-pro",mt="google/gemini-2.5-flash",gt="google/gemini-2.5-flash-lite-preview-09-2025",Ft="z-ai/glm-4.7-flash",Ut="z-ai/glm-4.5-air",_t="z-ai/glm-4.5-air:free",Ht=[k,_t],to=[ot,st,it,rt,nt,at,lt,pt,ct,ut,ht,dt,mt,gt,tt],Wt=20,So=50,yo=1e3,To=10;function q(r){return r.trim().endsWith(":free")}function ee(r){return to.some(e=>r.includes(e))}var Ie="https://api.z.ai/api/paas/v4/chat/completions",Bt="glm-5",Kt="glm-5-turbo",te="glm-4.7",$t="glm-4.7-FlashX",jt="glm-4.7-Flash",qt="glm-4.6",ft="glm-4.6V",vt="glm-4.6V-FlashX",z="glm-4.6V-Flash",oo=[ft,vt,z];function oe(r){return oo.includes(r)}function zt(r){return r.toLowerCase().startsWith("glm-4.6")}var be="https://api.x.ai/v1/chat/completions",Mt="grok-4.20-0309-reasoning",Ot="grok-4.20-0309-non-reasoning",Et="grok-4-1-fast-reasoning",A="grok-4-1-fast-non-reasoning",so=[Mt,Ot,Et,A];function se(r){return so.includes(r)}var ie="https://api.moonshot.ai/v1/chat/completions",D="kimi-k2.6",Ct="kimi-k2.5",io=[D,Ct];function re(r){return io.includes(r)}var C={VERY_SHORT:"veryShort",SHORT:"short",MEDIUM:"medium",LONG:"long",VERY_LONG:"veryLong",DEEP:"deep"},St={[C.VERY_SHORT]:40,[C.SHORT]:100,[C.MEDIUM]:200,[C.LONG]:300,[C.VERY_LONG]:1e3,[C.DEEP]:5e3},Xt=5e3,Jt={casual:{reasoning_effort:"minimal",verbosity:"low",description:"Fast responses for casual chat, quick questions (GPT-4 like experience)"},balanced:{reasoning_effort:"medium",verbosity:"medium",description:"Balanced reasoning for business tasks, learning, general problem solving"},expert:{reasoning_effort:"high",verbosity:"high",description:"Deep reasoning for research, complex analysis, expert-level tasks"}};function O(r){return r?St[r]??Xt:Xt}var Lo="You are a friendly AI avatar. Comment on the situation based on the broadcast screen.",Po=`You are a skilled summarizing assistant.
2
2
  Analyze the following conversation and produce a summary in the **same language** as the majority of the conversation:
3
3
  - Summaries should highlight key points
4
4
  - Stay concise (around {maxLength} characters if possible)
@@ -7,15 +7,15 @@ Analyze the following conversation and produce a summary in the **same language*
7
7
  If the conversation is in Japanese, summarize in Japanese.
8
8
  If it's in English, summarize in English.
9
9
  If it's in another language, summarize in that language.
10
- `;var X="gemini-nano",Yt=20;var G=class extends Error{constructor(t,o,s){super(`HTTP ${t}: ${o}`);this.status=t;this.statusText=o;this.body=s;this.name="HttpError"}},Re=class Re{static setFetch(e){this.fetchImpl=e}static async post(e,t,o={},s={}){let{timeout:i=3e4,retries:n=0,retryDelay:a=1e3}=s,u={...{"Content-Type":"application/json"},...o},m=null;for(let c=0;c<=n;c++)try{let d=typeof AbortController<"u",p=d?new AbortController:void 0,h=d?setTimeout(()=>p.abort(),i):void 0,M=await Re.fetchImpl(e,{method:"POST",headers:u,body:typeof t=="string"?t:JSON.stringify(t),...p?{signal:p.signal}:{}});if(h&&clearTimeout(h),!M.ok){let S=await M.text();throw new G(M.status,M.statusText,S)}return M}catch(d){if(m=d,d instanceof G&&d.status>=400&&d.status<500)throw d;if(d instanceof Error&&d.name==="AbortError")throw new Error(`Request timeout after ${i}ms`);c<n&&await new Promise(p=>setTimeout(p,a*(c+1)))}throw m||new Error("Request failed")}static async handleErrorResponse(e){let t=await e.text();throw new G(e.status,e.statusText,t)}static async get(e,t={},o={}){let{timeout:s=3e4,retries:i=0,retryDelay:n=1e3}=o,a=null;for(let l=0;l<=i;l++)try{let u=typeof AbortController<"u",m=u?new AbortController:void 0,c=u?setTimeout(()=>m.abort(),s):void 0,d=await Re.fetchImpl(e,{method:"GET",headers:t,...m?{signal:m.signal}:{}});if(c&&clearTimeout(c),!d.ok){let p=await d.text();throw new G(d.status,d.statusText,p)}return d}catch(u){if(a=u,u instanceof G&&u.status>=400&&u.status<500)throw u;if(u instanceof Error&&u.name==="AbortError")throw new Error(`Request timeout after ${s}ms`);l<i&&await new Promise(m=>setTimeout(m,n*(l+1)))}throw a||new Error("Request failed")}};Re.fetchImpl=(e,t)=>fetch(e,t);var _=Re;var v=class{static append(e,t){if(!t)return;let o=e[e.length-1];o&&o.type==="text"?o.text+=t:e.push({type:"text",text:t})}static getFullText(e){return e.filter(t=>t.type==="text").map(t=>t.text).join("")}static addTextBlock(e,t){t&&e.push({type:"text",text:t})}};var Lo=["happy","sad","angry","surprised","neutral"],no=/\[([a-z]+)\]/i,Qt=/\[[a-z]+\]\s*/gi,ne=class{static extractEmotion(e){let t=e.match(no);if(t){let o=t[1].toLowerCase(),s=e.replace(Qt,"").trim();return{emotion:o,cleanText:s}}return{cleanText:e}}static isValidEmotion(e){return Lo.includes(e)}static cleanEmotionTags(e){return e.replace(Qt,"").trim()}static addEmotionTag(e,t){return`[${e}] ${t}`}};function ao(r){let{emotion:e,cleanText:t}=ne.extractEmotion(r);return e?{emotion:e,text:t}:{text:t}}function Po(r){return r.map(e=>ao(e))}function xo(r){return r.emotion?ne.addEmotionTag(r.emotion,r.text):r.text}async function Io(r,e){let{blocks:t}=await r.chatOnce(e,!1,()=>{});return v.getFullText(t)}var lo=(r,e)=>{try{return JSON.parse(r)}catch(t){if(e){e(r,t);return}throw t}},po=async(r,e)=>{let t=r.body?.getReader();if(!t)throw new Error("Response body is null.");let o=new TextDecoder,s="",i=!1;for(;!i;){let{done:n,value:a}=await t.read();if(n)break;s+=o.decode(a,{stream:!0});let l=s.split(`
11
- `);s=l.pop()||"";for(let u of l){let m=u.trim();if(!m||m.startsWith(":")||!m.startsWith("data:"))continue;let c=m.slice(5).trim();if(c==="[DONE]"){i=!0;break}e(c)}}};async function y(r,e,t={}){let o="";return await po(r,s=>{let i=lo(s,t.onJsonError);if(!i)return;let n=i.choices?.[0]?.delta?.content||"";n&&(e(n),o+=n)}),o}async function T(r,e,t={}){let o=[],s=new Map,i,n,a=t.appendTextBlock??v.append;await po(r,m=>{let c=lo(m,t.onJsonError);if(!c)return;let d=c.choices?.[0];typeof d?.finish_reason=="string"&&(i=d.finish_reason),c.usage&&(n=c.usage);let p=d?.delta;p?.content&&(e(p.content),a(o,p.content)),p?.tool_calls&&p.tool_calls.forEach(h=>{let M=s.get(h.index)??{id:h.id,name:h.function?.name,args:""};M.args+=h.function?.arguments||"",s.set(h.index,M)})});let l=Array.from(s.entries()).sort((m,c)=>m[0]-c[0]).map(([m,c])=>({type:"tool_use",id:c.id,name:c.name,input:JSON.parse(c.args||"{}")}));return{blocks:[...o,...l],stop_reason:l.length?"tool_use":"end",truncated:i==="length",finish_reason:i,usage:n}}function L(r){let e=r?.choices?.[0],t=[];return e?.message?.tool_calls?.length?e.message.tool_calls.forEach(o=>t.push({type:"tool_use",id:o.id,name:o.function?.name,input:JSON.parse(o.function?.arguments||"{}")})):e?.message?.content&&t.push({type:"text",text:e.message.content}),{blocks:t,stop_reason:e?.finish_reason==="tool_calls"||t.some(o=>o.type==="tool_use")?"tool_use":"end",truncated:e?.finish_reason==="length",finish_reason:e?.finish_reason,usage:r?.usage}}var P=(r,e="chat-completions")=>r.length===0?[]:e==="responses"?r.map(t=>({type:"function",name:t.name,description:t.description,parameters:t.parameters})):r.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters}}));async function f(r){if(!r.hasTools){let t=await r.runWithoutTools();await r.onCompleteResponse(t);return}let e=await r.runWithTools();if(r.onToolBlocks&&r.onToolBlocks(e.blocks),e.stop_reason==="end"){let t=v.getFullText(e.blocks);await r.onCompleteResponse(t);return}throw new Error(r.toolErrorMessage)}var E=r=>{let e=r.model??r.defaultModel,t=r.visionModel??(r.supportsVisionForModel(e)?e:r.defaultVisionModel);if(r.validate==="explicit"&&r.visionModel&&!r.supportsVisionForModel(r.visionModel))throw new Error(`Model ${r.visionModel} does not support vision capabilities.`);if(r.validate==="resolved"&&!r.supportsVisionForModel(t))throw new Error(`Model ${t} does not support vision capabilities.`);return t};var bo="https://openrouter.ai/api/v1/models",Ro=2,Ao=12e3,Do=1,No=10;function eo(r){return r instanceof Error?r.message:String(r)}function Tt(r,e){return typeof r!="number"||!Number.isFinite(r)?e:Math.max(1,Math.floor(r))}function wo(r){let e=new Set,t=[];for(let o of r){let s=o.trim();!s||e.has(s)||(e.add(s),t.push(s))}return t}async function co(r,e,t){if(!(typeof AbortController<"u"))return fetch(r,e);let s=new AbortController,i=setTimeout(()=>s.abort(),t);try{return await fetch(r,{...e,signal:s.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?new Error(`Timeout after ${t}ms`):n}finally{clearTimeout(i)}}async function uo(r){let e=`HTTP ${r.status} ${r.statusText}`.trim(),t="";try{t=await r.text()}catch{return e}let o=t.replace(/\s+/g," ").trim().slice(0,200);return o?`${e}: ${o}`:e}function Vo(r){if(!r||typeof r!="object")throw new Error("Invalid models response shape");let e=r,t=Array.isArray(e.data)?e.data:Array.isArray(e.models)?e.models:[];if(t.length===0)return[];let o=t.map(s=>s.id).filter(s=>typeof s=="string");return wo(o)}async function ko({modelId:r,apiKey:e,endpoint:t,timeoutMs:o,appName:s,appUrl:i}){let n={Authorization:`Bearer ${e}`,"Content-Type":"application/json"};s&&(n["X-Title"]=s),i&&(n["HTTP-Referer"]=i);try{let a=await co(t,{method:"POST",headers:n,body:JSON.stringify({model:r,messages:[{role:"user",content:"Reply only with OK."}],stream:!1})},o);if(!a.ok)return{id:r,ok:!1,reason:await uo(a)};try{await a.json()}catch(l){return{id:r,ok:!1,reason:`JSON parse failed: ${eo(l)}`}}return{id:r,ok:!0}}catch(a){return{id:r,ok:!1,reason:eo(a)}}}async function Go(r,e,t){if(r.length===0)return[];let o=new Array(r.length),s=0,i=Math.min(e,r.length);return await Promise.all(Array.from({length:i},async()=>{for(;s<r.length;){let n=s;s+=1,o[n]=await t(r[n])}})),o}async function Fo(r){let e=r.apiKey.trim();if(!e)throw new Error("OpenRouter API key is required.");let t=r.modelsEndpoint||bo,o=r.endpoint||xe,s=Tt(r.timeoutMs,Ao),i=Tt(r.concurrency,Ro),n=Tt(r.maxCandidates,Do),a=Tt(r.maxWorking,No),l=await co(t,{method:"GET"},s);if(!l.ok)throw new Error(await uo(l));let u;try{u=await l.json()}catch(h){throw new Error(`JSON parse failed: ${eo(h)}`)}let m=Vo(u).filter(h=>q(h)).slice(0,n),c=await Go(m,i,h=>ko({modelId:h,apiKey:e,endpoint:o,timeoutMs:s,appName:r.appName,appUrl:r.appUrl})),d=c.filter(h=>h.ok).map(h=>h.id).slice(0,a),p=c.filter(h=>!h.ok).map(h=>({id:h.id,reason:h.reason||"Unknown error"}));return{working:d,failed:p,fetchedAt:Date.now()}}var ae=class{constructor(e,t=b,o=b,s=[],i=[],n){this.provider="claude";if(this.apiKey=e,this.model=t||b,this.visionModel=o||b,this.tools=s,this.mcpServers=i,this.responseLength=n,!Pe.includes(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`)}getModel(){return this.model}getVisionModel(){return this.visionModel}getMCPServers(){return this.mcpServers}addMCPServer(e){this.mcpServers.push(e)}removeMCPServer(e){this.mcpServers=this.mcpServers.filter(t=>t.name!==e)}hasMCPServers(){return this.mcpServers.length>0}async processChat(e,t,o){await f({hasTools:this.tools.length>0||this.mcpServers.length>0,runWithoutTools:async()=>{let s=await this.callClaude(e,this.model,!0);return this.parsePureStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){await f({hasTools:this.tools.length>0||this.mcpServers.length>0,runWithoutTools:async()=>{let s=await this.callClaude(e,this.visionModel,!0);return this.parsePureStream(s,t)},runWithTools:()=>this.visionChatOnce(e),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}convertMessagesToClaudeFormat(e){return e.map(t=>({role:this.mapRoleToClaude(t.role),content:t.content}))}convertVisionMessagesToClaudeFormat(e){return e.map(t=>{if(typeof t.content=="string")return{role:this.mapRoleToClaude(t.role),content:[{type:"text",text:t.content}]};if(Array.isArray(t.content)){let o=t.content.map(s=>{if(s.type==="image_url"){if(s.image_url.url.startsWith("data:")){let i=s.image_url.url.match(/^data:([^;]+);base64,(.+)$/);return i?{type:"image",source:{type:"base64",media_type:i[1],data:i[2]}}:null}return{type:"image",source:{type:"url",url:s.image_url.url,media_type:this.getMimeTypeFromUrl(s.image_url.url)}}}return s}).filter(s=>s);return{role:this.mapRoleToClaude(t.role),content:o}}return{role:this.mapRoleToClaude(t.role),content:[]}})}mapRoleToClaude(e){switch(e){case"system":return"system";case"user":return"user";case"assistant":return"assistant";default:return"user"}}getMimeTypeFromUrl(e){switch(e.split(".").pop()?.toLowerCase()){case"jpg":case"jpeg":return"image/jpeg";case"png":return"image/png";case"gif":return"image/gif";case"webp":return"image/webp";default:return"image/jpeg"}}async callClaude(e,t,o,s){let i=e.find(c=>c.role==="system")?.content??"",n=e.filter(c=>c.role!=="system"),a=n.some(c=>Array.isArray(c.content)&&c.content.some(d=>d.type==="image_url"||d.type==="image")),l={model:t,system:i,messages:a?this.convertVisionMessagesToClaudeFormat(n):this.convertMessagesToClaudeFormat(n),stream:o,max_tokens:s!==void 0?s:O(this.responseLength)};this.tools.length&&(l.tools=this.tools.map(c=>({name:c.name,description:c.description,input_schema:c.parameters})),l.tool_choice={type:"auto"}),this.mcpServers.length>0&&(l.mcp_servers=this.mcpServers);let u={"Content-Type":"application/json","x-api-key":this.apiKey,"anthropic-version":"2023-06-01","anthropic-dangerous-direct-browser-access":"true"};return this.mcpServers.length>0&&(u["anthropic-beta"]="mcp-client-2025-04-04"),await _.post(Gt,l,u)}async parseStream(e,t){let o=e.body.getReader(),s=new TextDecoder,i=[],n=new Map,a="";for(;;){let{done:l,value:u}=await o.read();if(l)break;a+=s.decode(u,{stream:!0});let m;for(;(m=a.indexOf(`
12
- `))!==-1;){let c=a.slice(0,m).trim();if(a=a.slice(m+1),!c.startsWith("data:"))continue;let d=c.slice(5).trim();if(d==="[DONE]")break;let p=JSON.parse(d);if(p.type==="content_block_delta"&&p.delta?.text&&(t(p.delta.text),i.push({type:"text",text:p.delta.text})),p.type==="content_block_start"&&p.content_block?.type==="tool_use"?n.set(p.index,{id:p.content_block.id,name:p.content_block.name,args:""}):p.type==="content_block_start"&&p.content_block?.type==="mcp_tool_use"?n.set(p.index,{id:p.content_block.id,name:p.content_block.name,args:"",server_name:p.content_block.server_name}):p.type==="content_block_start"&&p.content_block?.type==="tool_result"?i.push({type:"tool_result",tool_use_id:p.content_block.tool_use_id,content:p.content_block.content??""}):p.type==="content_block_start"&&p.content_block?.type==="mcp_tool_result"&&i.push({type:"mcp_tool_result",tool_use_id:p.content_block.tool_use_id,is_error:p.content_block.is_error??!1,content:p.content_block.content??[]}),p.type==="content_block_delta"&&p.delta?.type==="input_json_delta"){let h=n.get(p.index);h&&(h.args+=p.delta.partial_json||"")}if(p.type==="content_block_stop"&&n.has(p.index)){let{id:h,name:M,args:S,server_name:g}=n.get(p.index);g?i.push({type:"mcp_tool_use",id:h,name:M,server_name:g,input:JSON.parse(S||"{}")}):i.push({type:"tool_use",id:h,name:M,input:JSON.parse(S||"{}")}),n.delete(p.index)}}}return{blocks:i,stop_reason:i.some(l=>l.type==="tool_use"||l.type==="mcp_tool_use")?"tool_use":"end"}}async parsePureStream(e,t){let{blocks:o}=await this.parseStream(e,t);return o.filter(s=>s.type==="text").map(s=>s.text).join("")}parseOneShot(e){let t=[];return(e.content??[]).forEach(o=>{o.type==="text"?t.push({type:"text",text:o.text}):o.type==="tool_use"?t.push({type:"tool_use",id:o.id,name:o.name,input:o.input??{}}):o.type==="mcp_tool_use"?t.push({type:"mcp_tool_use",id:o.id,name:o.name,server_name:o.server_name,input:o.input??{}}):o.type==="tool_result"?t.push({type:"tool_result",tool_use_id:o.tool_use_id,content:o.content??""}):o.type==="mcp_tool_result"&&t.push({type:"mcp_tool_result",tool_use_id:o.tool_use_id,is_error:o.is_error??!1,content:o.content??[]})}),{blocks:t,stop_reason:t.some(o=>o.type==="tool_use"||o.type==="mcp_tool_use")?"tool_use":"end"}}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callClaude(e,this.model,t,s),n=t?await this.parseStream(i,o):this.parseOneShot(await i.json());return this.convertToStandardCompletion(n)}async visionChatOnce(e,t=!1,o=()=>{},s){let i=await this.callClaude(e,this.visionModel,t,s),n=t?await this.parseStream(i,o):this.parseOneShot(await i.json());return this.convertToStandardCompletion(n)}convertToStandardCompletion(e){return{blocks:e.blocks.filter(o=>o.type==="text"||o.type==="tool_use"||o.type==="tool_result"),stop_reason:e.stop_reason}}};var le=class{createChatService(e){let t=E({model:e.model,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultModel(),supportsVisionForModel:o=>this.supportsVisionForModel(o),validate:"resolved"});return new ae(e.apiKey,e.model||this.getDefaultModel(),t,e.tools??[],e.mcpServers??[],e.responseLength)}getProviderName(){return"claude"}getSupportedModels(){return[b,qe,ze,Xe,Je,Ze,Ye,Qe,et,tt,ot]}getDefaultModel(){return b}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return Pe.includes(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}};var Lt=class{static async fetchToolSchemas(e){try{let t={"Content-Type":"application/json"};e.authorization_token&&(t.Authorization=`Bearer ${e.authorization_token}`);let s=await(await _.post(`${e.url}/tools`,{},t)).json();return Array.isArray(s.tools)?s.tools.map(i=>({name:`mcp_${e.name}_${i.name}`,description:i.description||`Tool from ${e.name} MCP server`,parameters:i.inputSchema||{type:"object",properties:{},required:[]}})):[{name:`mcp_${e.name}_search`,description:`Search using ${e.name} MCP server`,parameters:{type:"object",properties:{query:{type:"string",description:"Search query"}},required:["query"]}}]}catch(t){return console.warn(`Failed to fetch MCP schemas from ${e.name}:`,t),[{name:`mcp_${e.name}_search`,description:`Search using ${e.name} MCP server (schema fetch failed)`,parameters:{type:"object",properties:{query:{type:"string",description:"Search query"}},required:["query"]}}]}}static async fetchAllToolSchemas(e){let t=[];for(let o of e)try{let s=await this.fetchToolSchemas(o);t.push(...s)}catch(s){console.error(`Failed to fetch schemas from ${o.name}:`,s)}return t}};var pe=class{constructor(e,t=V,o=V,s=[],i=[],n){this.provider="gemini";this.mcpToolSchemas=[];this.mcpSchemasInitialized=!1;this.callIdMap=new Map;if(this.apiKey=e,this.model=t,this.responseLength=n,!Le.includes(o))throw new Error(`Model ${o} does not support vision capabilities.`);this.visionModel=o,this.tools=s,this.mcpServers=i}safeJsonParse(e){try{return JSON.parse(e)}catch{return e}}normalizeToolResult(e){return e===null?{content:null}:typeof e=="object"?e:{content:e}}isGemma4Model(e){return/^gemma-4-/.test(e)}shouldExposeTextPart(e,t){return!(!e.text||this.isGemma4Model(t)&&e.thought===!0)}adaptKeysForApi(e){let t={toolConfig:"tool_config",functionCallingConfig:"function_calling_config",functionDeclarations:"function_declarations",functionCall:"function_call",functionResponse:"function_response"};return Array.isArray(e)?e.map(o=>this.adaptKeysForApi(o)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([o,s])=>[t[o]??o,this.adaptKeysForApi(s)])):e}getModel(){return this.model}getVisionModel(){return this.visionModel}getMCPServers(){return this.mcpServers}addMCPServer(e){this.mcpServers.push(e),this.mcpSchemasInitialized=!1}removeMCPServer(e){this.mcpServers=this.mcpServers.filter(t=>t.name!==e),this.mcpSchemasInitialized=!1}hasMCPServers(){return this.mcpServers.length>0}async initializeMCPSchemas(){if(!(this.mcpSchemasInitialized||this.mcpServers.length===0))try{let e=new Promise((o,s)=>setTimeout(()=>s(new Error("MCP schema fetch timeout")),5e3)),t=Lt.fetchAllToolSchemas(this.mcpServers);this.mcpToolSchemas=await Promise.race([t,e]),this.mcpSchemasInitialized=!0}catch(e){console.warn("Failed to initialize MCP schemas, using fallback:",e),this.mcpToolSchemas=this.mcpServers.map(t=>({name:`mcp_${t.name}_search`,description:`Search using ${t.name} MCP server (fallback)`,parameters:{type:"object",properties:{query:{type:"string",description:"Search query"}},required:["query"]}})),this.mcpSchemasInitialized=!0}}async processChat(e,t,o){try{await f({hasTools:this.tools.length>0||this.mcpServers.length>0,runWithoutTools:async()=>{let s=await this.callGemini(e,this.model,!0),{blocks:i}=await this.parseStream(s,t,this.model);return v.getFullText(i)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"Received functionCall. Use chatOnce() loop when tools are enabled."})}catch(s){throw console.error("Error in processChat:",s),s}}async processVisionChat(e,t,o){try{await f({hasTools:this.tools.length>0||this.mcpServers.length>0,runWithoutTools:async()=>{let s=await this.callGemini(e,this.visionModel,!0),{blocks:i}=await this.parseStream(s,t,this.visionModel);return v.getFullText(i)},runWithTools:()=>this.visionChatOnce(e),onToolBlocks:s=>{s.filter(i=>i.type==="text").forEach(i=>t(i.text))},onCompleteResponse:o,toolErrorMessage:"Received functionCall. Use visionChatOnce() loop when tools are enabled."})}catch(s){throw console.error("Error in processVisionChat:",s),s}}convertMessagesToGeminiFormat(e){let t=[],o=null,s=[],i=()=>{o&&s.length&&(t.push({role:o,parts:[...s]}),s=[])};for(let n of e){let a=this.mapRoleToGemini(n.role);if(n.tool_calls){i();for(let l of n.tool_calls)this.callIdMap.set(l.id,l.function.name),t.push({role:"model",parts:[{functionCall:{name:l.function.name,args:JSON.parse(l.function.arguments||"{}")}}]});continue}if(n.role==="tool"){i();let l=n.name??this.callIdMap.get(n.tool_call_id)??"result";t.push({role:"user",parts:[{functionResponse:{name:l,response:this.normalizeToolResult(this.safeJsonParse(n.content))}}]});continue}a!==o&&i(),o=a,s.push({text:n.content})}return i(),t}async callGemini(e,t,o=!1,s){let a={contents:e.some(g=>Array.isArray(g.content)&&g.content.some(x=>x?.type==="image_url"||x?.inlineData))?await this.convertVisionMessagesToGeminiFormat(e):this.convertMessagesToGeminiFormat(e),generationConfig:{maxOutputTokens:s!==void 0?s:O(this.responseLength)}};this.isGemma4Model(t)&&(a.generationConfig.thinkingConfig={includeThoughts:!1,thinkingLevel:"minimal"});let l=[];if(this.tools.length>0&&l.push(...this.tools.map(g=>({name:g.name,description:g.description,parameters:g.parameters}))),this.mcpServers.length>0)try{await this.initializeMCPSchemas(),l.push(...this.mcpToolSchemas.map(g=>({name:g.name,description:g.description,parameters:g.parameters})))}catch(g){console.warn("MCP initialization failed, skipping MCP tools:",g)}l.length>0&&(a.tools=[{functionDeclarations:l}],a.toolConfig={functionCallingConfig:{mode:"AUTO"}});let u=async(g,x)=>{let U=o?"streamGenerateContent":"generateContent",ye=o?"?alt=sse":"",Pt=`${kt}/${g}/models/${t}:${U}${ye}${ye?"&":"?"}key=${this.apiKey}`;return _.post(Pt,x)},m=/flash[-_]lite/.test(t),c=this.isGemma4Model(t),d=/gemini-2\.5/.test(t),p=/^gemini-3(?:\.[0-9]+)?-.*preview/.test(t),h=m||c||d||p,M=h?"v1beta":"v1",S=async()=>{try{let g=M==="v1"?a:this.adaptKeysForApi(a);return await u(M,g)}catch(g){let x=/Unknown name|Cannot find field|404/.test(g?.message||"")||g?.status===404;if(!h&&x)return await u("v1beta",this.adaptKeysForApi(a));throw g}};try{return await S()}catch(g){throw g.body&&(console.error("Gemini API Error Details:",g.body),console.error("Request Body:",JSON.stringify(a,null,2))),g}}async convertVisionMessagesToGeminiFormat(e){let t=[],o=null,s=[];for(let i of e){let n=this.mapRoleToGemini(i.role);if(i.tool_calls){for(let a of i.tool_calls)t.push({role:"model",parts:[{functionCall:{name:a.function.name,args:JSON.parse(a.function.arguments||"{}")}}]});continue}if(i.role==="tool"){let a=i.name??this.callIdMap.get(i.tool_call_id)??"result";t.push({role:"user",parts:[{functionResponse:{name:a,response:this.normalizeToolResult(this.safeJsonParse(i.content))}}]});continue}if(n!==o&&s.length>0&&(t.push({role:o,parts:[...s]}),s=[]),o=n,typeof i.content=="string")s.push({text:i.content});else if(Array.isArray(i.content)){for(let a of i.content)if(a.type==="text")s.push({text:a.text});else if(a.type==="image_url")try{let u=await(await _.get(a.image_url.url)).blob(),m=await this.blobToBase64(u);s.push({inlineData:{mimeType:u.type||"image/jpeg",data:m.split(",")[1]}})}catch(l){throw console.error("Error processing image:",l),new Error(`Failed to process image: ${l.message}`)}}}return o&&s.length>0&&t.push({role:o,parts:[...s]}),t}blobToBase64(e){return new Promise((t,o)=>{let s=new FileReader;s.onloadend=()=>t(s.result),s.onerror=o,s.readAsDataURL(e)})}mapRoleToGemini(e){switch(e){case"system":return"model";case"user":return"user";case"assistant":return"model";default:return"user"}}async parseStream(e,t,o){let s=e.body.getReader(),i=new TextDecoder,n=[],a=[],l="",u=c=>{if(!c||c==="[DONE]")return;let d;try{d=JSON.parse(c)}catch{return}for(let p of d.candidates??[])for(let h of p.content?.parts??[])this.shouldExposeTextPart(h,o)&&(t(h.text),v.addTextBlock(n,h.text)),h.functionCall&&a.push({type:"tool_use",id:this.genUUID(),name:h.functionCall.name,input:h.functionCall.args??{}}),h.functionResponse&&a.push({type:"tool_result",tool_use_id:h.functionResponse.name,content:JSON.stringify(h.functionResponse.response)})};for(;;){let{done:c,value:d}=await s.read();if(c)break;l+=i.decode(d,{stream:!0});let p;for(;(p=l.indexOf(`
13
- `))!==-1;){let h=l.slice(0,p);if(l=l.slice(p+1),h.endsWith("\r")&&(h=h.slice(0,-1)),!h.trim()){u("");continue}h.startsWith("data:")&&(h=h.slice(5).trim()),h&&u(h)}}return l&&u(l),{blocks:[...n,...a],stop_reason:a.some(c=>c.type==="tool_use")?"tool_use":"end"}}parseOneShot(e,t){let o=[],s=[];for(let n of e.candidates??[])for(let a of n.content?.parts??[])this.shouldExposeTextPart(a,t)&&o.push({type:"text",text:a.text}),a.functionCall&&s.push({type:"tool_use",id:this.genUUID(),name:a.functionCall.name,input:a.functionCall.args??{}}),a.functionResponse&&s.push({type:"tool_result",tool_use_id:a.functionResponse.name,content:JSON.stringify(a.functionResponse.response)});return{blocks:[...o,...s],stop_reason:s.some(n=>n.type==="tool_use")?"tool_use":"end"}}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callGemini(e,this.model,t,s);return t?this.parseStream(i,o,this.model):this.parseOneShot(await i.json(),this.model)}async visionChatOnce(e,t=!1,o=()=>{},s){let i=await this.callGemini(e,this.visionModel,t,s);return t?this.parseStream(i,o,this.visionModel):this.parseOneShot(await i.json(),this.visionModel)}genUUID(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}};var ce=class{createChatService(e){let t=E({model:e.model,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultModel(),supportsVisionForModel:o=>this.supportsVisionForModel(o),validate:"resolved"});return new pe(e.apiKey,e.model||this.getDefaultModel(),t,e.tools||[],e.mcpServers||[],e.responseLength)}getProviderName(){return"gemini"}getSupportedModels(){return[Ve,ke,Ge,Fe,Ue,He,We,Be,Ke,$e,je,V]}getDefaultModel(){return V}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return Le.includes(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}};function Uo(){if(typeof globalThis<"u"&&"LanguageModel"in globalThis)return globalThis.LanguageModel}var ue=class{constructor(e={}){this.provider="gemini-nano";this.expectedInputLanguages=e.expectedInputLanguages??["ja"],this.expectedOutputLanguages=e.expectedOutputLanguages??["ja"],this._responseLength=e.responseLength}getModel(){return X}getVisionModel(){return X}async processChat(e,t,o){let s=await this.generateResponse(e);t(s),await o(s)}async processVisionChat(e,t,o){throw new Error("Gemini Nano does not support vision capabilities.")}async chatOnce(e,t=!1,o=()=>{},s){let i=await this.generateResponse(e);return o(i),{blocks:[{type:"text",text:i}],stop_reason:"end"}}async visionChatOnce(e,t=!1,o=()=>{},s){throw new Error("Gemini Nano does not support vision capabilities.")}async generateResponse(e){let t=Uo();if(!t)throw new Error("Gemini Nano is not available in this environment. Chrome 138+ with Prompt API enabled is required.");let o=await t.availability();if(o!=="available"&&o!=="downloadable")throw new Error(`Gemini Nano Prompt API is not ready in this environment. LanguageModel.availability() returned "${o}". Expected "available" or "downloadable".`);let i=e.filter(u=>u.role==="system").map(u=>u.content).join(`
10
+ `;var X="gemini-nano",Zt=20;var G=class extends Error{constructor(t,o,s){super(`HTTP ${t}: ${o}`);this.status=t;this.statusText=o;this.body=s;this.name="HttpError"}},Re=class Re{static setFetch(e){this.fetchImpl=e}static async post(e,t,o={},s={}){let{timeout:i=3e4,retries:n=0,retryDelay:a=1e3}=s,u={...{"Content-Type":"application/json"},...o},m=null;for(let c=0;c<=n;c++)try{let d=typeof AbortController<"u",p=d?new AbortController:void 0,h=d?setTimeout(()=>p.abort(),i):void 0,M=await Re.fetchImpl(e,{method:"POST",headers:u,body:typeof t=="string"?t:JSON.stringify(t),...p?{signal:p.signal}:{}});if(h&&clearTimeout(h),!M.ok){let S=await M.text();throw new G(M.status,M.statusText,S)}return M}catch(d){if(m=d,d instanceof G&&d.status>=400&&d.status<500)throw d;if(d instanceof Error&&d.name==="AbortError")throw new Error(`Request timeout after ${i}ms`);c<n&&await new Promise(p=>setTimeout(p,a*(c+1)))}throw m||new Error("Request failed")}static async handleErrorResponse(e){let t=await e.text();throw new G(e.status,e.statusText,t)}static async get(e,t={},o={}){let{timeout:s=3e4,retries:i=0,retryDelay:n=1e3}=o,a=null;for(let l=0;l<=i;l++)try{let u=typeof AbortController<"u",m=u?new AbortController:void 0,c=u?setTimeout(()=>m.abort(),s):void 0,d=await Re.fetchImpl(e,{method:"GET",headers:t,...m?{signal:m.signal}:{}});if(c&&clearTimeout(c),!d.ok){let p=await d.text();throw new G(d.status,d.statusText,p)}return d}catch(u){if(a=u,u instanceof G&&u.status>=400&&u.status<500)throw u;if(u instanceof Error&&u.name==="AbortError")throw new Error(`Request timeout after ${s}ms`);l<i&&await new Promise(m=>setTimeout(m,n*(l+1)))}throw a||new Error("Request failed")}};Re.fetchImpl=(e,t)=>fetch(e,t);var _=Re;var v=class{static append(e,t){if(!t)return;let o=e[e.length-1];o&&o.type==="text"?o.text+=t:e.push({type:"text",text:t})}static getFullText(e){return e.filter(t=>t.type==="text").map(t=>t.text).join("")}static addTextBlock(e,t){t&&e.push({type:"text",text:t})}};var xo=["happy","sad","angry","surprised","neutral"],ro=/\[([a-z]+)\]/i,Yt=/\[[a-z]+\]\s*/gi,ne=class{static extractEmotion(e){let t=e.match(ro);if(t){let o=t[1].toLowerCase(),s=e.replace(Yt,"").trim();return{emotion:o,cleanText:s}}return{cleanText:e}}static isValidEmotion(e){return xo.includes(e)}static cleanEmotionTags(e){return e.replace(Yt,"").trim()}static addEmotionTag(e,t){return`[${e}] ${t}`}};function no(r){let{emotion:e,cleanText:t}=ne.extractEmotion(r);return e?{emotion:e,text:t}:{text:t}}function Io(r){return r.map(e=>no(e))}function bo(r){return r.emotion?ne.addEmotionTag(r.emotion,r.text):r.text}async function Ro(r,e){let{blocks:t}=await r.chatOnce(e,!1,()=>{});return v.getFullText(t)}var ao=(r,e)=>{try{return JSON.parse(r)}catch(t){if(e){e(r,t);return}throw t}},lo=async(r,e)=>{let t=r.body?.getReader();if(!t)throw new Error("Response body is null.");let o=new TextDecoder,s="",i=!1;for(;!i;){let{done:n,value:a}=await t.read();if(n)break;s+=o.decode(a,{stream:!0});let l=s.split(`
11
+ `);s=l.pop()||"";for(let u of l){let m=u.trim();if(!m||m.startsWith(":")||!m.startsWith("data:"))continue;let c=m.slice(5).trim();if(c==="[DONE]"){i=!0;break}e(c)}}};async function y(r,e,t={}){let o="";return await lo(r,s=>{let i=ao(s,t.onJsonError);if(!i)return;let n=i.choices?.[0]?.delta?.content||"";n&&(e(n),o+=n)}),o}async function T(r,e,t={}){let o=[],s=new Map,i,n,a=t.appendTextBlock??v.append;await lo(r,m=>{let c=ao(m,t.onJsonError);if(!c)return;let d=c.choices?.[0];typeof d?.finish_reason=="string"&&(i=d.finish_reason),c.usage&&(n=c.usage);let p=d?.delta;p?.content&&(e(p.content),a(o,p.content)),p?.tool_calls&&p.tool_calls.forEach(h=>{let M=s.get(h.index)??{id:h.id,name:h.function?.name,args:""};M.args+=h.function?.arguments||"",s.set(h.index,M)})});let l=Array.from(s.entries()).sort((m,c)=>m[0]-c[0]).map(([m,c])=>({type:"tool_use",id:c.id,name:c.name,input:JSON.parse(c.args||"{}")}));return{blocks:[...o,...l],stop_reason:l.length?"tool_use":"end",truncated:i==="length",finish_reason:i,usage:n}}function L(r){let e=r?.choices?.[0],t=[];return e?.message?.tool_calls?.length?e.message.tool_calls.forEach(o=>t.push({type:"tool_use",id:o.id,name:o.function?.name,input:JSON.parse(o.function?.arguments||"{}")})):e?.message?.content&&t.push({type:"text",text:e.message.content}),{blocks:t,stop_reason:e?.finish_reason==="tool_calls"||t.some(o=>o.type==="tool_use")?"tool_use":"end",truncated:e?.finish_reason==="length",finish_reason:e?.finish_reason,usage:r?.usage}}var P=(r,e="chat-completions")=>r.length===0?[]:e==="responses"?r.map(t=>({type:"function",name:t.name,description:t.description,parameters:t.parameters})):r.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters}}));async function f(r){if(!r.hasTools){let t=await r.runWithoutTools();await r.onCompleteResponse(t);return}let e=await r.runWithTools();if(r.onToolBlocks&&r.onToolBlocks(e.blocks),e.stop_reason==="end"){let t=v.getFullText(e.blocks);await r.onCompleteResponse(t);return}throw new Error(r.toolErrorMessage)}var E=r=>{let e=r.model??r.defaultModel,t=r.visionModel??(r.supportsVisionForModel(e)?e:r.defaultVisionModel);if(r.validate==="explicit"&&r.visionModel&&!r.supportsVisionForModel(r.visionModel))throw new Error(`Model ${r.visionModel} does not support vision capabilities.`);if(r.validate==="resolved"&&!r.supportsVisionForModel(t))throw new Error(`Model ${t} does not support vision capabilities.`);return t};var Ao="https://openrouter.ai/api/v1/models",Do=2,No=12e3,wo=1,Vo=10;function Qt(r){return r instanceof Error?r.message:String(r)}function yt(r,e){return typeof r!="number"||!Number.isFinite(r)?e:Math.max(1,Math.floor(r))}function ko(r){let e=new Set,t=[];for(let o of r){let s=o.trim();!s||e.has(s)||(e.add(s),t.push(s))}return t}async function po(r,e,t){if(!(typeof AbortController<"u"))return fetch(r,e);let s=new AbortController,i=setTimeout(()=>s.abort(),t);try{return await fetch(r,{...e,signal:s.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?new Error(`Timeout after ${t}ms`):n}finally{clearTimeout(i)}}async function co(r){let e=`HTTP ${r.status} ${r.statusText}`.trim(),t="";try{t=await r.text()}catch{return e}let o=t.replace(/\s+/g," ").trim().slice(0,200);return o?`${e}: ${o}`:e}function Go(r){if(!r||typeof r!="object")throw new Error("Invalid models response shape");let e=r,t=Array.isArray(e.data)?e.data:Array.isArray(e.models)?e.models:[];if(t.length===0)return[];let o=t.map(s=>s.id).filter(s=>typeof s=="string");return ko(o)}async function Fo({modelId:r,apiKey:e,endpoint:t,timeoutMs:o,appName:s,appUrl:i}){let n={Authorization:`Bearer ${e}`,"Content-Type":"application/json"};s&&(n["X-Title"]=s),i&&(n["HTTP-Referer"]=i);try{let a=await po(t,{method:"POST",headers:n,body:JSON.stringify({model:r,messages:[{role:"user",content:"Reply only with OK."}],stream:!1})},o);if(!a.ok)return{id:r,ok:!1,reason:await co(a)};try{await a.json()}catch(l){return{id:r,ok:!1,reason:`JSON parse failed: ${Qt(l)}`}}return{id:r,ok:!0}}catch(a){return{id:r,ok:!1,reason:Qt(a)}}}async function Uo(r,e,t){if(r.length===0)return[];let o=new Array(r.length),s=0,i=Math.min(e,r.length);return await Promise.all(Array.from({length:i},async()=>{for(;s<r.length;){let n=s;s+=1,o[n]=await t(r[n])}})),o}async function Ho(r){let e=r.apiKey.trim();if(!e)throw new Error("OpenRouter API key is required.");let t=r.modelsEndpoint||Ao,o=r.endpoint||xe,s=yt(r.timeoutMs,No),i=yt(r.concurrency,Do),n=yt(r.maxCandidates,wo),a=yt(r.maxWorking,Vo),l=await po(t,{method:"GET"},s);if(!l.ok)throw new Error(await co(l));let u;try{u=await l.json()}catch(h){throw new Error(`JSON parse failed: ${Qt(h)}`)}let m=Go(u).filter(h=>q(h)).slice(0,n),c=await Uo(m,i,h=>Fo({modelId:h,apiKey:e,endpoint:o,timeoutMs:s,appName:r.appName,appUrl:r.appUrl})),d=c.filter(h=>h.ok).map(h=>h.id).slice(0,a),p=c.filter(h=>!h.ok).map(h=>({id:h.id,reason:h.reason||"Unknown error"}));return{working:d,failed:p,fetchedAt:Date.now()}}var ae=class{constructor(e,t=b,o=b,s=[],i=[],n){this.provider="claude";if(this.apiKey=e,this.model=t||b,this.visionModel=o||b,this.tools=s,this.mcpServers=i,this.responseLength=n,!Pe.includes(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`)}getModel(){return this.model}getVisionModel(){return this.visionModel}getMCPServers(){return this.mcpServers}addMCPServer(e){this.mcpServers.push(e)}removeMCPServer(e){this.mcpServers=this.mcpServers.filter(t=>t.name!==e)}hasMCPServers(){return this.mcpServers.length>0}async processChat(e,t,o){await f({hasTools:this.tools.length>0||this.mcpServers.length>0,runWithoutTools:async()=>{let s=await this.callClaude(e,this.model,!0);return this.parsePureStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){await f({hasTools:this.tools.length>0||this.mcpServers.length>0,runWithoutTools:async()=>{let s=await this.callClaude(e,this.visionModel,!0);return this.parsePureStream(s,t)},runWithTools:()=>this.visionChatOnce(e),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}convertMessagesToClaudeFormat(e){return e.map(t=>({role:this.mapRoleToClaude(t.role),content:t.content}))}convertVisionMessagesToClaudeFormat(e){return e.map(t=>{if(typeof t.content=="string")return{role:this.mapRoleToClaude(t.role),content:[{type:"text",text:t.content}]};if(Array.isArray(t.content)){let o=t.content.map(s=>{if(s.type==="image_url"){if(s.image_url.url.startsWith("data:")){let i=s.image_url.url.match(/^data:([^;]+);base64,(.+)$/);return i?{type:"image",source:{type:"base64",media_type:i[1],data:i[2]}}:null}return{type:"image",source:{type:"url",url:s.image_url.url,media_type:this.getMimeTypeFromUrl(s.image_url.url)}}}return s}).filter(s=>s);return{role:this.mapRoleToClaude(t.role),content:o}}return{role:this.mapRoleToClaude(t.role),content:[]}})}mapRoleToClaude(e){switch(e){case"system":return"system";case"user":return"user";case"assistant":return"assistant";default:return"user"}}getMimeTypeFromUrl(e){switch(e.split(".").pop()?.toLowerCase()){case"jpg":case"jpeg":return"image/jpeg";case"png":return"image/png";case"gif":return"image/gif";case"webp":return"image/webp";default:return"image/jpeg"}}async callClaude(e,t,o,s){let i=e.find(c=>c.role==="system")?.content??"",n=e.filter(c=>c.role!=="system"),a=n.some(c=>Array.isArray(c.content)&&c.content.some(d=>d.type==="image_url"||d.type==="image")),l={model:t,system:i,messages:a?this.convertVisionMessagesToClaudeFormat(n):this.convertMessagesToClaudeFormat(n),stream:o,max_tokens:s!==void 0?s:O(this.responseLength)};this.tools.length&&(l.tools=this.tools.map(c=>({name:c.name,description:c.description,input_schema:c.parameters})),l.tool_choice={type:"auto"}),this.mcpServers.length>0&&(l.mcp_servers=this.mcpServers);let u={"Content-Type":"application/json","x-api-key":this.apiKey,"anthropic-version":"2023-06-01","anthropic-dangerous-direct-browser-access":"true"};return this.mcpServers.length>0&&(u["anthropic-beta"]="mcp-client-2025-04-04"),await _.post(kt,l,u)}async parseStream(e,t){let o=e.body.getReader(),s=new TextDecoder,i=[],n=new Map,a="";for(;;){let{done:l,value:u}=await o.read();if(l)break;a+=s.decode(u,{stream:!0});let m;for(;(m=a.indexOf(`
12
+ `))!==-1;){let c=a.slice(0,m).trim();if(a=a.slice(m+1),!c.startsWith("data:"))continue;let d=c.slice(5).trim();if(d==="[DONE]")break;let p=JSON.parse(d);if(p.type==="content_block_delta"&&p.delta?.text&&(t(p.delta.text),i.push({type:"text",text:p.delta.text})),p.type==="content_block_start"&&p.content_block?.type==="tool_use"?n.set(p.index,{id:p.content_block.id,name:p.content_block.name,args:""}):p.type==="content_block_start"&&p.content_block?.type==="mcp_tool_use"?n.set(p.index,{id:p.content_block.id,name:p.content_block.name,args:"",server_name:p.content_block.server_name}):p.type==="content_block_start"&&p.content_block?.type==="tool_result"?i.push({type:"tool_result",tool_use_id:p.content_block.tool_use_id,content:p.content_block.content??""}):p.type==="content_block_start"&&p.content_block?.type==="mcp_tool_result"&&i.push({type:"mcp_tool_result",tool_use_id:p.content_block.tool_use_id,is_error:p.content_block.is_error??!1,content:p.content_block.content??[]}),p.type==="content_block_delta"&&p.delta?.type==="input_json_delta"){let h=n.get(p.index);h&&(h.args+=p.delta.partial_json||"")}if(p.type==="content_block_stop"&&n.has(p.index)){let{id:h,name:M,args:S,server_name:g}=n.get(p.index);g?i.push({type:"mcp_tool_use",id:h,name:M,server_name:g,input:JSON.parse(S||"{}")}):i.push({type:"tool_use",id:h,name:M,input:JSON.parse(S||"{}")}),n.delete(p.index)}}}return{blocks:i,stop_reason:i.some(l=>l.type==="tool_use"||l.type==="mcp_tool_use")?"tool_use":"end"}}async parsePureStream(e,t){let{blocks:o}=await this.parseStream(e,t);return o.filter(s=>s.type==="text").map(s=>s.text).join("")}parseOneShot(e){let t=[];return(e.content??[]).forEach(o=>{o.type==="text"?t.push({type:"text",text:o.text}):o.type==="tool_use"?t.push({type:"tool_use",id:o.id,name:o.name,input:o.input??{}}):o.type==="mcp_tool_use"?t.push({type:"mcp_tool_use",id:o.id,name:o.name,server_name:o.server_name,input:o.input??{}}):o.type==="tool_result"?t.push({type:"tool_result",tool_use_id:o.tool_use_id,content:o.content??""}):o.type==="mcp_tool_result"&&t.push({type:"mcp_tool_result",tool_use_id:o.tool_use_id,is_error:o.is_error??!1,content:o.content??[]})}),{blocks:t,stop_reason:t.some(o=>o.type==="tool_use"||o.type==="mcp_tool_use")?"tool_use":"end"}}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callClaude(e,this.model,t,s),n=t?await this.parseStream(i,o):this.parseOneShot(await i.json());return this.convertToStandardCompletion(n)}async visionChatOnce(e,t=!1,o=()=>{},s){let i=await this.callClaude(e,this.visionModel,t,s),n=t?await this.parseStream(i,o):this.parseOneShot(await i.json());return this.convertToStandardCompletion(n)}convertToStandardCompletion(e){return{blocks:e.blocks.filter(o=>o.type==="text"||o.type==="tool_use"||o.type==="tool_result"),stop_reason:e.stop_reason}}};var le=class{createChatService(e){let t=E({model:e.model,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultModel(),supportsVisionForModel:o=>this.supportsVisionForModel(o),validate:"resolved"});return new ae(e.apiKey,e.model||this.getDefaultModel(),t,e.tools??[],e.mcpServers??[],e.responseLength)}getProviderName(){return"claude"}getSupportedModels(){return[ze,Xe,Je,b,Ze,Ye,Qe,et,qe]}getDefaultModel(){return b}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return Pe.includes(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}};var Tt=class{static async fetchToolSchemas(e){try{let t={"Content-Type":"application/json"};e.authorization_token&&(t.Authorization=`Bearer ${e.authorization_token}`);let s=await(await _.post(`${e.url}/tools`,{},t)).json();return Array.isArray(s.tools)?s.tools.map(i=>({name:`mcp_${e.name}_${i.name}`,description:i.description||`Tool from ${e.name} MCP server`,parameters:i.inputSchema||{type:"object",properties:{},required:[]}})):[{name:`mcp_${e.name}_search`,description:`Search using ${e.name} MCP server`,parameters:{type:"object",properties:{query:{type:"string",description:"Search query"}},required:["query"]}}]}catch(t){return console.warn(`Failed to fetch MCP schemas from ${e.name}:`,t),[{name:`mcp_${e.name}_search`,description:`Search using ${e.name} MCP server (schema fetch failed)`,parameters:{type:"object",properties:{query:{type:"string",description:"Search query"}},required:["query"]}}]}}static async fetchAllToolSchemas(e){let t=[];for(let o of e)try{let s=await this.fetchToolSchemas(o);t.push(...s)}catch(s){console.error(`Failed to fetch schemas from ${o.name}:`,s)}return t}};var pe=class{constructor(e,t=V,o=V,s=[],i=[],n){this.provider="gemini";this.mcpToolSchemas=[];this.mcpSchemasInitialized=!1;this.callIdMap=new Map;if(this.apiKey=e,this.model=t,this.responseLength=n,!Le.includes(o))throw new Error(`Model ${o} does not support vision capabilities.`);this.visionModel=o,this.tools=s,this.mcpServers=i}safeJsonParse(e){try{return JSON.parse(e)}catch{return e}}normalizeToolResult(e){return e===null?{content:null}:typeof e=="object"?e:{content:e}}isGemma4Model(e){return/^gemma-4-/.test(e)}shouldExposeTextPart(e,t){return!(!e.text||this.isGemma4Model(t)&&e.thought===!0)}adaptKeysForApi(e){let t={toolConfig:"tool_config",functionCallingConfig:"function_calling_config",functionDeclarations:"function_declarations",functionCall:"function_call",functionResponse:"function_response"};return Array.isArray(e)?e.map(o=>this.adaptKeysForApi(o)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([o,s])=>[t[o]??o,this.adaptKeysForApi(s)])):e}getModel(){return this.model}getVisionModel(){return this.visionModel}getMCPServers(){return this.mcpServers}addMCPServer(e){this.mcpServers.push(e),this.mcpSchemasInitialized=!1}removeMCPServer(e){this.mcpServers=this.mcpServers.filter(t=>t.name!==e),this.mcpSchemasInitialized=!1}hasMCPServers(){return this.mcpServers.length>0}async initializeMCPSchemas(){if(!(this.mcpSchemasInitialized||this.mcpServers.length===0))try{let e=new Promise((o,s)=>setTimeout(()=>s(new Error("MCP schema fetch timeout")),5e3)),t=Tt.fetchAllToolSchemas(this.mcpServers);this.mcpToolSchemas=await Promise.race([t,e]),this.mcpSchemasInitialized=!0}catch(e){console.warn("Failed to initialize MCP schemas, using fallback:",e),this.mcpToolSchemas=this.mcpServers.map(t=>({name:`mcp_${t.name}_search`,description:`Search using ${t.name} MCP server (fallback)`,parameters:{type:"object",properties:{query:{type:"string",description:"Search query"}},required:["query"]}})),this.mcpSchemasInitialized=!0}}async processChat(e,t,o){try{await f({hasTools:this.tools.length>0||this.mcpServers.length>0,runWithoutTools:async()=>{let s=await this.callGemini(e,this.model,!0),{blocks:i}=await this.parseStream(s,t,this.model);return v.getFullText(i)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"Received functionCall. Use chatOnce() loop when tools are enabled."})}catch(s){throw console.error("Error in processChat:",s),s}}async processVisionChat(e,t,o){try{await f({hasTools:this.tools.length>0||this.mcpServers.length>0,runWithoutTools:async()=>{let s=await this.callGemini(e,this.visionModel,!0),{blocks:i}=await this.parseStream(s,t,this.visionModel);return v.getFullText(i)},runWithTools:()=>this.visionChatOnce(e),onToolBlocks:s=>{s.filter(i=>i.type==="text").forEach(i=>t(i.text))},onCompleteResponse:o,toolErrorMessage:"Received functionCall. Use visionChatOnce() loop when tools are enabled."})}catch(s){throw console.error("Error in processVisionChat:",s),s}}convertMessagesToGeminiFormat(e){let t=[],o=null,s=[],i=()=>{o&&s.length&&(t.push({role:o,parts:[...s]}),s=[])};for(let n of e){let a=this.mapRoleToGemini(n.role);if(n.tool_calls){i();for(let l of n.tool_calls)this.callIdMap.set(l.id,l.function.name),t.push({role:"model",parts:[{functionCall:{name:l.function.name,args:JSON.parse(l.function.arguments||"{}")}}]});continue}if(n.role==="tool"){i();let l=n.name??this.callIdMap.get(n.tool_call_id)??"result";t.push({role:"user",parts:[{functionResponse:{name:l,response:this.normalizeToolResult(this.safeJsonParse(n.content))}}]});continue}a!==o&&i(),o=a,s.push({text:n.content})}return i(),t}async callGemini(e,t,o=!1,s){let a={contents:e.some(g=>Array.isArray(g.content)&&g.content.some(x=>x?.type==="image_url"||x?.inlineData))?await this.convertVisionMessagesToGeminiFormat(e):this.convertMessagesToGeminiFormat(e),generationConfig:{maxOutputTokens:s!==void 0?s:O(this.responseLength)}};this.isGemma4Model(t)&&(a.generationConfig.thinkingConfig={includeThoughts:!1,thinkingLevel:"minimal"});let l=[];if(this.tools.length>0&&l.push(...this.tools.map(g=>({name:g.name,description:g.description,parameters:g.parameters}))),this.mcpServers.length>0)try{await this.initializeMCPSchemas(),l.push(...this.mcpToolSchemas.map(g=>({name:g.name,description:g.description,parameters:g.parameters})))}catch(g){console.warn("MCP initialization failed, skipping MCP tools:",g)}l.length>0&&(a.tools=[{functionDeclarations:l}],a.toolConfig={functionCallingConfig:{mode:"AUTO"}});let u=async(g,x)=>{let U=o?"streamGenerateContent":"generateContent",ye=o?"?alt=sse":"",Lt=`${Vt}/${g}/models/${t}:${U}${ye}${ye?"&":"?"}key=${this.apiKey}`;return _.post(Lt,x)},m=/flash[-_]lite/.test(t),c=this.isGemma4Model(t),d=/gemini-2\.5/.test(t),p=/^gemini-3(?:\.[0-9]+)?-.*preview/.test(t),h=m||c||d||p,M=h?"v1beta":"v1",S=async()=>{try{let g=M==="v1"?a:this.adaptKeysForApi(a);return await u(M,g)}catch(g){let x=/Unknown name|Cannot find field|404/.test(g?.message||"")||g?.status===404;if(!h&&x)return await u("v1beta",this.adaptKeysForApi(a));throw g}};try{return await S()}catch(g){throw g.body&&(console.error("Gemini API Error Details:",g.body),console.error("Request Body:",JSON.stringify(a,null,2))),g}}async convertVisionMessagesToGeminiFormat(e){let t=[],o=null,s=[];for(let i of e){let n=this.mapRoleToGemini(i.role);if(i.tool_calls){for(let a of i.tool_calls)t.push({role:"model",parts:[{functionCall:{name:a.function.name,args:JSON.parse(a.function.arguments||"{}")}}]});continue}if(i.role==="tool"){let a=i.name??this.callIdMap.get(i.tool_call_id)??"result";t.push({role:"user",parts:[{functionResponse:{name:a,response:this.normalizeToolResult(this.safeJsonParse(i.content))}}]});continue}if(n!==o&&s.length>0&&(t.push({role:o,parts:[...s]}),s=[]),o=n,typeof i.content=="string")s.push({text:i.content});else if(Array.isArray(i.content)){for(let a of i.content)if(a.type==="text")s.push({text:a.text});else if(a.type==="image_url")try{let u=await(await _.get(a.image_url.url)).blob(),m=await this.blobToBase64(u);s.push({inlineData:{mimeType:u.type||"image/jpeg",data:m.split(",")[1]}})}catch(l){throw console.error("Error processing image:",l),new Error(`Failed to process image: ${l.message}`)}}}return o&&s.length>0&&t.push({role:o,parts:[...s]}),t}blobToBase64(e){return new Promise((t,o)=>{let s=new FileReader;s.onloadend=()=>t(s.result),s.onerror=o,s.readAsDataURL(e)})}mapRoleToGemini(e){switch(e){case"system":return"model";case"user":return"user";case"assistant":return"model";default:return"user"}}async parseStream(e,t,o){let s=e.body.getReader(),i=new TextDecoder,n=[],a=[],l="",u=c=>{if(!c||c==="[DONE]")return;let d;try{d=JSON.parse(c)}catch{return}for(let p of d.candidates??[])for(let h of p.content?.parts??[])this.shouldExposeTextPart(h,o)&&(t(h.text),v.addTextBlock(n,h.text)),h.functionCall&&a.push({type:"tool_use",id:this.genUUID(),name:h.functionCall.name,input:h.functionCall.args??{}}),h.functionResponse&&a.push({type:"tool_result",tool_use_id:h.functionResponse.name,content:JSON.stringify(h.functionResponse.response)})};for(;;){let{done:c,value:d}=await s.read();if(c)break;l+=i.decode(d,{stream:!0});let p;for(;(p=l.indexOf(`
13
+ `))!==-1;){let h=l.slice(0,p);if(l=l.slice(p+1),h.endsWith("\r")&&(h=h.slice(0,-1)),!h.trim()){u("");continue}h.startsWith("data:")&&(h=h.slice(5).trim()),h&&u(h)}}return l&&u(l),{blocks:[...n,...a],stop_reason:a.some(c=>c.type==="tool_use")?"tool_use":"end"}}parseOneShot(e,t){let o=[],s=[];for(let n of e.candidates??[])for(let a of n.content?.parts??[])this.shouldExposeTextPart(a,t)&&o.push({type:"text",text:a.text}),a.functionCall&&s.push({type:"tool_use",id:this.genUUID(),name:a.functionCall.name,input:a.functionCall.args??{}}),a.functionResponse&&s.push({type:"tool_result",tool_use_id:a.functionResponse.name,content:JSON.stringify(a.functionResponse.response)});return{blocks:[...o,...s],stop_reason:s.some(n=>n.type==="tool_use")?"tool_use":"end"}}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callGemini(e,this.model,t,s);return t?this.parseStream(i,o,this.model):this.parseOneShot(await i.json(),this.model)}async visionChatOnce(e,t=!1,o=()=>{},s){let i=await this.callGemini(e,this.visionModel,t,s);return t?this.parseStream(i,o,this.visionModel):this.parseOneShot(await i.json(),this.visionModel)}genUUID(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}};var ce=class{createChatService(e){let t=E({model:e.model,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultModel(),supportsVisionForModel:o=>this.supportsVisionForModel(o),validate:"resolved"});return new pe(e.apiKey,e.model||this.getDefaultModel(),t,e.tools||[],e.mcpServers||[],e.responseLength)}getProviderName(){return"gemini"}getSupportedModels(){return[Ve,ke,Ge,Fe,Ue,He,We,Be,Ke,$e,je,V]}getDefaultModel(){return V}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return Le.includes(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}};function Wo(){if(typeof globalThis<"u"&&"LanguageModel"in globalThis)return globalThis.LanguageModel}var ue=class{constructor(e={}){this.provider="gemini-nano";this.expectedInputLanguages=e.expectedInputLanguages??["ja"],this.expectedOutputLanguages=e.expectedOutputLanguages??["ja"],this._responseLength=e.responseLength}getModel(){return X}getVisionModel(){return X}async processChat(e,t,o){let s=await this.generateResponse(e);t(s),await o(s)}async processVisionChat(e,t,o){throw new Error("Gemini Nano does not support vision capabilities.")}async chatOnce(e,t=!1,o=()=>{},s){let i=await this.generateResponse(e);return o(i),{blocks:[{type:"text",text:i}],stop_reason:"end"}}async visionChatOnce(e,t=!1,o=()=>{},s){throw new Error("Gemini Nano does not support vision capabilities.")}async generateResponse(e){let t=Wo();if(!t)throw new Error("Gemini Nano is not available in this environment. Chrome 138+ with Prompt API enabled is required.");let o=await t.availability();if(o!=="available"&&o!=="downloadable")throw new Error(`Gemini Nano Prompt API is not ready in this environment. LanguageModel.availability() returned "${o}". Expected "available" or "downloadable".`);let i=e.filter(u=>u.role==="system").map(u=>u.content).join(`
14
14
  `),n=e.filter(u=>u.role!=="system").slice(-20),a=[...n].reverse().find(u=>u.role==="user");if(!a)throw new Error("No user message found in the provided messages.");let l=await this.createSession(t,i,n);try{return await l.prompt(a.content)}finally{try{l.destroy()}catch{}}}async createSession(e,t,o){let s=this.buildSystemPrompt(t),i=o.slice(0,-1);if(i.length>0){let n=i.map(a=>`${a.role==="user"?"User":"Assistant"}: ${a.content}`).join(`
15
15
  `);s+=`
16
16
 
17
17
  The following is the prior conversation history. Use it as context for your response:
18
18
  `+n}return e.create({systemPrompt:s,expectedInputs:[{type:"text",languages:this.expectedInputLanguages}],expectedOutputs:[{type:"text",languages:this.expectedOutputLanguages}]})}buildSystemPrompt(e){let t=[];e&&t.push(e);let o=this.getResponseLengthInstruction();return o&&t.push(o),t.join(`
19
19
 
20
- `)}getResponseLengthInstruction(){if(!this._responseLength)return;let e=yt[this._responseLength];if(e)return`Please keep your response concise, within approximately ${e} tokens.`}};var he=class{createChatService(e){return new ue({expectedInputLanguages:e.expectedInputLanguages,expectedOutputLanguages:e.expectedOutputLanguages,responseLength:e.responseLength})}getProviderName(){return"gemini-nano"}getSupportedModels(){return[X]}getDefaultModel(){return X}supportsVision(){return!1}getVisionSupportLevel(){return"unsupported"}};var de=class{constructor(e,t=D,o=D,s,i=ie,n,a,l){this.provider="kimi";this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.responseLength=n,this.responseFormat=a,this.thinking=l??{type:"enabled"},this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async processChat(e,t,o){await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callKimi(e,this.model,!0);return this.handleStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){if(!re(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callKimi(e,this.visionModel,!0);return this.handleStream(s,t)},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callKimi(e,this.model,t,s);return this.parseResponse(i,t,o)}async visionChatOnce(e,t=!1,o=()=>{},s){if(!re(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);let i=await this.callKimi(e,this.visionModel,t,s);return this.parseResponse(i,t,o)}async parseResponse(e,t,o){return t?this.parseStream(e,o):this.parseOneShot(await e.json())}async callKimi(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s);return await _.post(this.endpoint,i,{Authorization:`Bearer ${this.apiKey}`})}buildRequestBody(e,t,o,s){let i={model:t,stream:o,messages:e},n=s!==void 0?s:O(this.responseLength);n!==void 0&&(i.max_tokens=n),this.responseFormat&&(i.response_format=this.responseFormat);let a=this.tools.length>0?{type:"disabled"}:this.thinking;a&&(this.isSelfHostedEndpoint()?a.type==="disabled"&&(i.chat_template_kwargs={thinking:!1}):i.thinking=a);let l=this.buildToolsDefinition();return l.length>0&&(i.tools=l,i.tool_choice="auto"),i}isSelfHostedEndpoint(){return this.normalizeEndpoint(this.endpoint)!==this.normalizeEndpoint(ie)}normalizeEndpoint(e){return e.replace(/\/+$/,"")}buildToolsDefinition(){return P(this.tools,"chat-completions")}async handleStream(e,t){return y(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}async parseStream(e,t){return T(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}parseOneShot(e){return L(e)}};var me=class{createChatService(e){let t=this.resolveEndpoint(e),o=e.model||this.getDefaultModel(),s=E({model:o,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultVisionModel(),supportsVisionForModel:l=>this.supportsVisionForModel(l),validate:"explicit"}),i=e.tools,n=e.thinking??{type:"enabled"},a=i&&i.length>0?{type:"disabled"}:n;return new de(e.apiKey,o,s,i,t,e.responseLength,e.responseFormat,a)}getProviderName(){return"kimi"}getSupportedModels(){return[D]}getDefaultModel(){return D}getDefaultVisionModel(){return D}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return re(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}resolveEndpoint(e){if(e.endpoint)return this.normalizeEndpoint(e.endpoint);if(e.baseUrl){let t=this.normalizeEndpoint(e.baseUrl);return t.endsWith("/chat/completions")?t:`${t}/chat/completions`}return ie}normalizeEndpoint(e){return e.replace(/\/+$/,"")}};var Ho={[C.VERY_SHORT]:800,[C.SHORT]:1200,[C.MEDIUM]:2e3,[C.LONG]:3e3,[C.VERY_LONG]:8e3,[C.DEEP]:25e3},Wo={none:1200,minimal:1600,low:2500,medium:4e3,high:8e3,xhigh:12e3},F=class{constructor(e,t=$,o=$,s,i=Z,n=[],a,l,u,m=!1,c="openai",d=!0){if(this.provider=c,this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.mcpServers=n,this.responseLength=a,this.verbosity=l,this.reasoning_effort=u,this.enableReasoningSummary=m,d&&!Te.includes(o))throw new Error(`Model ${o} does not support vision capabilities.`);this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async processChat(e,t,o){await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callOpenAI(e,this.model,!0),i=this.endpoint===I;try{if(i){let n=await this.parseResponsesStream(s,t);return v.getFullText(n.blocks)}return this.handleStream(s,t)}catch(n){throw console.error("[processChat] Error in streaming/completion:",n),n}},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){try{await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callOpenAI(e,this.visionModel,!0),i=this.endpoint===I;try{if(i){let n=await this.parseResponsesStream(s,t);return v.getFullText(n.blocks)}return this.handleStream(s,t)}catch(n){throw console.error("[processVisionChat] Error in streaming/completion:",n),n}},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}catch(s){throw console.error("Error in processVisionChat:",s),s}}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callOpenAI(e,this.model,t,s);return this.parseResponse(i,t,o)}async visionChatOnce(e,t=!1,o=()=>{},s){let i=await this.callOpenAI(e,this.visionModel,t,s);return this.parseResponse(i,t,o)}async parseResponse(e,t,o){return this.endpoint===I?t?this.parseResponsesStream(e,o):this.parseResponsesOneShot(await e.json()):t?this.parseStream(e,o):this.parseOneShot(await e.json())}async callOpenAI(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s),n={};return(this.provider!=="openai-compatible"||this.apiKey.trim()!=="")&&(n.Authorization=`Bearer ${this.apiKey}`),await _.post(this.endpoint,i,n)}buildRequestBody(e,t,o,s){let i=this.endpoint===I;this.validateMCPCompatibility();let n={model:t,stream:o},a=this.resolveTokenLimit(t,s);i?a!==void 0&&(n.max_output_tokens=a):a!==void 0&&(this.provider==="openai-compatible"?n.max_tokens=a:n.max_completion_tokens=a),i?n.input=this.cleanMessagesForResponsesAPI(e):n.messages=e,j(t)&&(i?(this.reasoning_effort&&(n.reasoning={...n.reasoning,effort:this.reasoning_effort},this.enableReasoningSummary&&(n.reasoning.summary="auto")),this.verbosity&&(n.text={...n.text,format:{type:"text"},verbosity:this.verbosity})):(this.reasoning_effort&&(n.reasoning_effort=this.reasoning_effort),this.verbosity&&(n.verbosity=this.verbosity)));let l=this.buildToolsDefinition();return l.length>0&&(n.tools=l,i||(n.tool_choice="auto")),n}resolveTokenLimit(e,t){if(t!==void 0)return t;let o=this.provider==="openai-compatible"?this.responseLength!==void 0?O(this.responseLength):void 0:O(this.responseLength);if(this.provider!=="openai"||!j(e)||this.responseLength===void 0)return o;let s=this.reasoning_effort??R(e);return Math.max(o??0,Ho[this.responseLength],Wo[s])}validateMCPCompatibility(){if(this.mcpServers.length>0&&this.endpoint===Z)throw new Error(`MCP servers are not supported with Chat Completions API. Current endpoint: ${this.endpoint}. Please use OpenAI Responses API endpoint: ${I}. MCP tools are only available in the Responses API endpoint.`)}cleanMessagesForResponsesAPI(e){return e.map(t=>{let s={role:t.role==="tool"?"user":t.role};return typeof t.content=="string"?s.content=t.content:Array.isArray(t.content)?s.content=t.content.map(i=>i.type==="text"?{type:"input_text",text:i.text}:i.type==="image_url"?{type:"input_image",image_url:i.image_url.url}:i):s.content=t.content,s})}buildToolsDefinition(){let e=this.endpoint===I,t=[];return this.tools.length>0&&t.push(...P(this.tools,e?"responses":"chat-completions")),this.mcpServers.length>0&&e&&t.push(...this.buildMCPToolsDefinition()),t}buildMCPToolsDefinition(){return this.mcpServers.map(e=>{let t={type:"mcp",server_label:e.name,server_url:e.url};return e.require_approval&&(t.require_approval=e.require_approval),e.tool_configuration?.allowed_tools&&(t.allowed_tools=e.tool_configuration.allowed_tools),e.authorization_token&&(t.headers={Authorization:`Bearer ${e.authorization_token}`}),t})}async handleStream(e,t){return y(e,t)}async parseStream(e,t){return T(e,t,{appendTextBlock:v.addTextBlock})}parseOneShot(e){return L(e)}async parseResponsesStream(e,t){let o=e.body.getReader(),s=new TextDecoder,i=[],n=new Map,a,l,u,m="";for(;;){let{done:p,value:h}=await o.read();if(p)break;m+=s.decode(h,{stream:!0});let M="",S="",g=m.split(`
21
- `);m=g.pop()||"";for(let x=0;x<g.length;x++){let U=g[x].trim();if(U.startsWith("event:"))M=U.slice(6).trim();else if(U.startsWith("data:"))S=U.slice(5).trim();else if(U===""&&M&&S){try{let ye=JSON.parse(S),Pt=this.handleResponsesSSEEvent(M,ye,t,i,n,J=>{J.responseStatus!==void 0&&(a=J.responseStatus),J.incompleteDetails!==void 0&&(l=J.incompleteDetails),J.usage!==void 0&&(u=J.usage)})}catch{console.warn("Failed to parse SSE data:",S)}M="",S=""}}}let c=Array.from(n.values()).map(p=>({type:"tool_use",id:p.id,name:p.name,input:p.input||{}}));return{blocks:[...i,...c],stop_reason:c.length?"tool_use":"end",truncated:a==="incomplete",response_status:a,incomplete_details:l,usage:u}}handleResponsesSSEEvent(e,t,o,s,i,n){switch(e){case"response.output_item.added":t.item?.type==="message"&&Array.isArray(t.item.content)?t.item.content.forEach(a=>{a.type==="output_text"&&a.text&&(o(a.text),v.append(s,a.text))}):t.item?.type==="function_call"&&i.set(t.item.id,{id:t.item.id,name:t.item.name,input:t.item.arguments?JSON.parse(t.item.arguments):{}});break;case"response.content_part.added":t.part?.type==="output_text"&&typeof t.part.text=="string"&&(o(t.part.text),v.append(s,t.part.text));break;case"response.output_text.delta":case"response.content_part.delta":{let a=typeof t.delta=="string"?t.delta:t.delta?.text??"";a&&(o(a),v.append(s,a))}break;case"response.output_text.done":case"response.content_part.done":break;case"response.completed":return n(this.extractResponsesMetadata(t,"completed")),"completed";case"response.incomplete":return n(this.extractResponsesMetadata(t,"incomplete")),"completed";case"response.reasoning.started":case"response.reasoning.delta":case"response.reasoning.done":break;default:break}}extractResponsesMetadata(e,t){let o=e?.response??e;return{responseStatus:o?.status??t,incompleteDetails:o?.incomplete_details??null,usage:o?.usage}}parseResponsesOneShot(e){let t=[];return e.output&&Array.isArray(e.output)&&e.output.forEach(o=>{o.type==="message"&&o.content&&o.content.forEach(s=>{s.type==="output_text"&&s.text&&t.push({type:"text",text:s.text})}),o.type==="function_call"&&t.push({type:"tool_use",id:o.id,name:o.name,input:o.arguments?JSON.parse(o.arguments):{}})}),{blocks:t,stop_reason:t.some(o=>o.type==="tool_use")?"tool_use":"end",truncated:e?.status==="incomplete",response_status:e?.status,incomplete_details:e?.incomplete_details??null,usage:e?.usage}}};var ge=class{createChatService(e){return this.validateRequiredOptions(e),new F(e.apiKey?.trim()??"",e.model,e.visionModel??e.model,e.tools,e.endpoint,[],e.responseLength,e.verbosity,e.reasoning_effort,e.enableReasoningSummary,this.getProviderName(),!1)}getProviderName(){return"openai-compatible"}getSupportedModels(){return[]}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"unknown"}supportsVisionForModel(e){return!0}getVisionSupportLevelForModel(e){return"unknown"}getDefaultModel(){return"local-model"}validateRequiredOptions(e){if(e.mcpServers!==void 0)throw new Error("openai-compatible provider does not support mcpServers.");let t=e.endpoint?.trim();if(!t)throw new Error("openai-compatible provider requires endpoint (full URL).");let o;try{o=new URL(t)}catch{throw new Error("openai-compatible provider requires endpoint to be a full URL.")}if(o.protocol!=="http:"&&o.protocol!=="https:")throw new Error("openai-compatible provider requires endpoint to be a full URL.");if(!e.model?.trim())throw new Error("openai-compatible provider requires model.")}};var _e=class{createChatService(e){let t=this.optimizeGPT5Options(e),o=E({model:t.model,visionModel:t.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultModel(),supportsVisionForModel:u=>this.supportsVisionForModel(u),validate:"resolved"}),s=t.tools,i=t.mcpServers??[],n=t.model||this.getDefaultModel(),a=!1;i.length>0||At(n)?a=!0:j(n)&&(a=(t.gpt5EndpointPreference||"chat")==="responses");let l=t.endpoint||(a?I:Z);return new F(t.apiKey,n,o,s,l,i,t.responseLength,t.verbosity,t.reasoning_effort,t.enableReasoningSummary,this.getProviderName())}getProviderName(){return"openai"}getSupportedModels(){return[H,Y,Q,W,N,B,K,w,Ae,De,Ne,$,we,It,bt,"o1"]}getDefaultModel(){return H}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return Te.includes(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}optimizeGPT5Options(e){let t=e.model||this.getDefaultModel();if(!j(t))return e;let o={...e};if(e.gpt5Preset){let s=Zt[e.gpt5Preset];o.reasoning_effort=s.reasoning_effort,o.verbosity=s.verbosity}else e.reasoning_effort||(o.reasoning_effort=R(t));return o.reasoning_effort=this.normalizeReasoningEffort(t,o.reasoning_effort),o}normalizeReasoningEffort(e,t){if(t)return t==="none"&&!Nt(e)?R(e):t==="minimal"&&!wt(e)?R(e):t==="low"&&!Vt(e)?R(e):t==="xhigh"&&!Dt(e)?R(e):t}};var fe=class{constructor(e,t=k,o=k,s,i=xe,n,a,l,u,m,c){this.provider="openrouter";this.lastRequestTime=0;this.requestCount=0;this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.responseLength=n,this.appName=a,this.appUrl=l,this.reasoning_effort=u,this.includeReasoning=m,this.reasoningMaxTokens=c,this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async applyRateLimiting(){if(!q(this.model))return;let e=Date.now(),t=e-this.lastRequestTime;if(t>6e4&&(this.requestCount=0),this.requestCount>=Bt){let o=6e4-t;o>0&&(console.log(`Rate limit reached for free tier. Waiting ${o}ms...`),await new Promise(s=>setTimeout(s,o)),this.requestCount=0)}this.lastRequestTime=e,this.requestCount++}async processChat(e,t,o){await this.applyRateLimiting(),await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callOpenRouter(e,this.model,!0);return this.handleStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){if(!ee(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await this.applyRateLimiting();try{await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callOpenRouter(e,this.visionModel,!0);return this.handleStream(s,t)},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}catch(s){throw console.error("Error in processVisionChat:",s),s}}async chatOnce(e,t=!0,o=()=>{},s){await this.applyRateLimiting();let i=await this.callOpenRouter(e,this.model,t,s);return t?this.parseStream(i,o):this.parseOneShot(await i.json())}async visionChatOnce(e,t=!1,o=()=>{},s){if(!ee(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await this.applyRateLimiting();let i=await this.callOpenRouter(e,this.visionModel,t,s);return t?this.parseStream(i,o):this.parseOneShot(await i.json())}async callOpenRouter(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s),n={Authorization:`Bearer ${this.apiKey}`};return this.appUrl&&(n["HTTP-Referer"]=this.appUrl),this.appName&&(n["X-Title"]=this.appName),await _.post(this.endpoint,i,n)}buildRequestBody(e,t,o,s){let i={model:t,messages:e,stream:o};if((s!==void 0?s:O(this.responseLength))&&console.warn("OpenRouter: Token limits are not supported for gpt-oss-20b model due to known issues. Using unlimited tokens instead."),this.reasoning_effort!==void 0||this.includeReasoning!==void 0||this.reasoningMaxTokens){if(i.reasoning={},this.reasoning_effort&&this.reasoning_effort!=="none"){let a=this.reasoning_effort==="minimal"?"low":this.reasoning_effort;i.reasoning.effort=a}(this.reasoning_effort==="none"||this.includeReasoning!==!0)&&(i.reasoning.exclude=!0),this.reasoningMaxTokens&&(i.reasoning.max_tokens=this.reasoningMaxTokens)}else i.reasoning={exclude:!0};return this.tools.length>0&&(i.tools=P(this.tools,"chat-completions"),i.tool_choice="auto"),i}async handleStream(e,t){return y(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}async parseStream(e,t){return T(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}parseOneShot(e){return L(e)}};var ve=class{createChatService(e){let t=E({model:e.model,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:e.model||this.getDefaultModel(),supportsVisionForModel:n=>this.supportsVisionForModel(n),validate:"explicit"}),o=e.tools,s=e.appName,i=e.appUrl;return new fe(e.apiKey,e.model||this.getDefaultModel(),t,o,e.endpoint,e.responseLength,s,i,e.reasoning_effort,e.includeReasoning,e.reasoningMaxTokens)}getProviderName(){return"openrouter"}getSupportedModels(){return[k,vt,it,rt,nt,at,lt,pt,ct,ut,ht,dt,Ft,mt,gt,_t,ft,Ut,Ht,st]}getDefaultModel(){return k}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return this.getSupportedModels().some(e=>this.supportsVisionForModel(e))?"supported":"unsupported"}supportsVisionForModel(e){return ee(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}getFreeModels(){return Wt}isModelFree(e){return q(e)}};var Me=class{constructor(e,t=A,o=A,s,i=be,n){this.provider="xai";this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.responseLength=n,this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async processChat(e,t,o){await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callXAI(e,this.model,!0);return this.handleStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){if(!se(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callXAI(e,this.visionModel,!0);return this.handleStream(s,t)},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callXAI(e,this.model,t,s);return this.parseResponse(i,t,o)}async visionChatOnce(e,t=!1,o=()=>{},s){if(!se(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);let i=await this.callXAI(e,this.visionModel,t,s);return this.parseResponse(i,t,o)}async parseResponse(e,t,o){return t?this.parseStream(e,o):this.parseOneShot(await e.json())}async callXAI(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s);return await _.post(this.endpoint,i,{Authorization:`Bearer ${this.apiKey}`})}buildRequestBody(e,t,o,s){let i={model:t,stream:o,messages:e},n=s!==void 0?s:O(this.responseLength);n!==void 0&&(i.max_tokens=n);let a=this.buildToolsDefinition();return a.length>0&&(i.tools=a,i.tool_choice="auto"),i}buildToolsDefinition(){return P(this.tools,"chat-completions")}async handleStream(e,t){return y(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}async parseStream(e,t){return T(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}parseOneShot(e){return L(e)}};var Oe=class{createChatService(e){let t=e.model||this.getDefaultModel(),o=E({model:t,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultVisionModel(),supportsVisionForModel:i=>this.supportsVisionForModel(i),validate:"explicit"}),s=e.tools;return new Me(e.apiKey,t,o,s,e.endpoint||be,e.responseLength)}getProviderName(){return"xai"}getSupportedModels(){return[Et,Ct,St,A]}getDefaultModel(){return A}getDefaultVisionModel(){return A}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return se(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}};var Ee=class{constructor(e,t=te,o=z,s,i=Ie,n,a,l){this.provider="zai";this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.responseLength=n,this.responseFormat=a,this.thinking=l??{type:"disabled"},this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async processChat(e,t,o){await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callZAI(e,this.model,!0);return this.handleStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){if(!oe(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callZAI(e,this.visionModel,!0);return this.handleStream(s,t)},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callZAI(e,this.model,t,s);return this.parseResponse(i,t,o)}async visionChatOnce(e,t=!1,o=()=>{},s){if(!oe(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);let i=await this.callZAI(e,this.visionModel,t,s);return this.parseResponse(i,t,o)}async parseResponse(e,t,o){return t?this.parseStream(e,o):this.parseOneShot(await e.json())}async callZAI(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s);return await _.post(this.endpoint,i,{Authorization:`Bearer ${this.apiKey}`})}buildRequestBody(e,t,o,s){let i={model:t,stream:o,messages:e},n=s!==void 0?s:O(this.responseLength);n!==void 0&&(i.max_tokens=n),this.responseFormat&&(i.response_format=this.responseFormat),this.thinking&&(i.thinking=this.thinking);let a=this.buildToolsDefinition();return a.length>0&&(i.tools=a,i.tool_choice="auto",o&&Xt(t)&&(i.tool_stream=!0)),i}buildToolsDefinition(){return P(this.tools,"chat-completions")}async handleStream(e,t){return y(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}async parseStream(e,t){return T(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}parseOneShot(e){return L(e)}};var Ce=class{createChatService(e){let t=e.model||this.getDefaultModel(),o=E({model:t,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultVisionModel(),supportsVisionForModel:n=>this.supportsVisionForModel(n),validate:"explicit"}),s=e.tools,i=e.thinking??{type:"disabled"};return new Ee(e.apiKey,t,o,s,e.endpoint||Ie,e.responseLength,e.responseFormat,i)}getProviderName(){return"zai"}getSupportedModels(){return[Kt,$t,te,jt,qt,zt,Mt,Ot,z]}getDefaultModel(){return te}getDefaultVisionModel(){return z}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return oe(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}};var ho=[new _e,new ge,new ce,new he,new le,new ve,new Ce,new Oe,new me];var Se=class{static registerProvider(e){this.providers.set(e.getProviderName(),e)}static createChatService(e,t){let o=this.providers.get(e);if(!o)throw new Error(`Unknown chat provider: ${e}`);return o.createChatService(t)}static getProviders(){return this.providers}static getAvailableProviders(){return Array.from(this.providers.keys())}static getSupportedModels(e){let t=this.providers.get(e);return t?t.getSupportedModels():[]}static getVisionSupportLevel(e){let t=this.providers.get(e);return t?t.getVisionSupportLevel():"unsupported"}static getVisionSupportLevelForModel(e,t){let o=this.providers.get(e);return o?o.getVisionSupportLevelForModel?o.getVisionSupportLevelForModel(t):o.supportsVisionForModel?o.supportsVisionForModel(t)?"supported":"unsupported":o.getVisionSupportLevel():"unsupported"}};Se.providers=new Map;ho.forEach(r=>Se.registerProvider(r));function mo(){_.setFetch(async(r,e={})=>{let t=(e.method||"GET").toString().toUpperCase(),o=e.headers,s={};if(Array.isArray(o))for(let[c,d]of o)s[c]=String(d);else if(o&&typeof o=="object")for(let[c,d]of Object.entries(o))s[c]=String(d);let i={method:t,headers:s,muteHttpExceptions:!0},n=e.body;typeof n=="string"?i.payload=n:n!=null&&(s["Content-Type"]||(s["Content-Type"]="application/json"),i.payload=JSON.stringify(n));let a=UrlFetchApp.fetch(r,i),l=a.getResponseCode(),u=a.getContentText();return{ok:l>=200&&l<300,status:l,statusText:String(l),text:async()=>u,json:async()=>u?JSON.parse(u):null}})}return Oo(Bo);})();
20
+ `)}getResponseLengthInstruction(){if(!this._responseLength)return;let e=St[this._responseLength];if(e)return`Please keep your response concise, within approximately ${e} tokens.`}};var he=class{createChatService(e){return new ue({expectedInputLanguages:e.expectedInputLanguages,expectedOutputLanguages:e.expectedOutputLanguages,responseLength:e.responseLength})}getProviderName(){return"gemini-nano"}getSupportedModels(){return[X]}getDefaultModel(){return X}supportsVision(){return!1}getVisionSupportLevel(){return"unsupported"}};var de=class{constructor(e,t=D,o=D,s,i=ie,n,a,l){this.provider="kimi";this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.responseLength=n,this.responseFormat=a,this.thinking=l??{type:"enabled"},this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async processChat(e,t,o){await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callKimi(e,this.model,!0);return this.handleStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){if(!re(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callKimi(e,this.visionModel,!0);return this.handleStream(s,t)},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callKimi(e,this.model,t,s);return this.parseResponse(i,t,o)}async visionChatOnce(e,t=!1,o=()=>{},s){if(!re(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);let i=await this.callKimi(e,this.visionModel,t,s);return this.parseResponse(i,t,o)}async parseResponse(e,t,o){return t?this.parseStream(e,o):this.parseOneShot(await e.json())}async callKimi(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s);return await _.post(this.endpoint,i,{Authorization:`Bearer ${this.apiKey}`})}buildRequestBody(e,t,o,s){let i={model:t,stream:o,messages:e},n=s!==void 0?s:O(this.responseLength);n!==void 0&&(i.max_tokens=n),this.responseFormat&&(i.response_format=this.responseFormat);let a=this.tools.length>0?{type:"disabled"}:this.thinking;a&&(this.isSelfHostedEndpoint()?a.type==="disabled"&&(i.chat_template_kwargs={thinking:!1}):i.thinking=a);let l=this.buildToolsDefinition();return l.length>0&&(i.tools=l,i.tool_choice="auto"),i}isSelfHostedEndpoint(){return this.normalizeEndpoint(this.endpoint)!==this.normalizeEndpoint(ie)}normalizeEndpoint(e){return e.replace(/\/+$/,"")}buildToolsDefinition(){return P(this.tools,"chat-completions")}async handleStream(e,t){return y(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}async parseStream(e,t){return T(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}parseOneShot(e){return L(e)}};var me=class{createChatService(e){let t=this.resolveEndpoint(e),o=e.model||this.getDefaultModel(),s=E({model:o,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultVisionModel(),supportsVisionForModel:l=>this.supportsVisionForModel(l),validate:"explicit"}),i=e.tools,n=e.thinking??{type:"enabled"},a=i&&i.length>0?{type:"disabled"}:n;return new de(e.apiKey,o,s,i,t,e.responseLength,e.responseFormat,a)}getProviderName(){return"kimi"}getSupportedModels(){return[D,Ct]}getDefaultModel(){return D}getDefaultVisionModel(){return D}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return re(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}resolveEndpoint(e){if(e.endpoint)return this.normalizeEndpoint(e.endpoint);if(e.baseUrl){let t=this.normalizeEndpoint(e.baseUrl);return t.endsWith("/chat/completions")?t:`${t}/chat/completions`}return ie}normalizeEndpoint(e){return e.replace(/\/+$/,"")}};var Bo={[C.VERY_SHORT]:800,[C.SHORT]:1200,[C.MEDIUM]:2e3,[C.LONG]:3e3,[C.VERY_LONG]:8e3,[C.DEEP]:25e3},Ko={none:1200,minimal:1600,low:2500,medium:4e3,high:8e3,xhigh:12e3},F=class{constructor(e,t=$,o=$,s,i=Z,n=[],a,l,u,m=!1,c="openai",d=!0){if(this.provider=c,this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.mcpServers=n,this.responseLength=a,this.verbosity=l,this.reasoning_effort=u,this.enableReasoningSummary=m,d&&!Te.includes(o))throw new Error(`Model ${o} does not support vision capabilities.`);this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async processChat(e,t,o){await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callOpenAI(e,this.model,!0),i=this.endpoint===I;try{if(i){let n=await this.parseResponsesStream(s,t);return v.getFullText(n.blocks)}return this.handleStream(s,t)}catch(n){throw console.error("[processChat] Error in streaming/completion:",n),n}},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){try{await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callOpenAI(e,this.visionModel,!0),i=this.endpoint===I;try{if(i){let n=await this.parseResponsesStream(s,t);return v.getFullText(n.blocks)}return this.handleStream(s,t)}catch(n){throw console.error("[processVisionChat] Error in streaming/completion:",n),n}},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}catch(s){throw console.error("Error in processVisionChat:",s),s}}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callOpenAI(e,this.model,t,s);return this.parseResponse(i,t,o)}async visionChatOnce(e,t=!1,o=()=>{},s){let i=await this.callOpenAI(e,this.visionModel,t,s);return this.parseResponse(i,t,o)}async parseResponse(e,t,o){return this.endpoint===I?t?this.parseResponsesStream(e,o):this.parseResponsesOneShot(await e.json()):t?this.parseStream(e,o):this.parseOneShot(await e.json())}async callOpenAI(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s),n={};return(this.provider!=="openai-compatible"||this.apiKey.trim()!=="")&&(n.Authorization=`Bearer ${this.apiKey}`),await _.post(this.endpoint,i,n)}buildRequestBody(e,t,o,s){let i=this.endpoint===I;this.validateMCPCompatibility();let n={model:t,stream:o},a=this.resolveTokenLimit(t,s);i?a!==void 0&&(n.max_output_tokens=a):a!==void 0&&(this.provider==="openai-compatible"?n.max_tokens=a:n.max_completion_tokens=a),i?n.input=this.cleanMessagesForResponsesAPI(e):n.messages=e,j(t)&&(i?(this.reasoning_effort&&(n.reasoning={...n.reasoning,effort:this.reasoning_effort},this.enableReasoningSummary&&(n.reasoning.summary="auto")),this.verbosity&&(n.text={...n.text,format:{type:"text"},verbosity:this.verbosity})):(this.reasoning_effort&&(n.reasoning_effort=this.reasoning_effort),this.verbosity&&(n.verbosity=this.verbosity)));let l=this.buildToolsDefinition();return l.length>0&&(n.tools=l,i||(n.tool_choice="auto")),n}resolveTokenLimit(e,t){if(t!==void 0)return t;let o=this.provider==="openai-compatible"?this.responseLength!==void 0?O(this.responseLength):void 0:O(this.responseLength);if(this.provider!=="openai"||!j(e)||this.responseLength===void 0)return o;let s=this.reasoning_effort??R(e);return Math.max(o??0,Bo[this.responseLength],Ko[s])}validateMCPCompatibility(){if(this.mcpServers.length>0&&this.endpoint===Z)throw new Error(`MCP servers are not supported with Chat Completions API. Current endpoint: ${this.endpoint}. Please use OpenAI Responses API endpoint: ${I}. MCP tools are only available in the Responses API endpoint.`)}cleanMessagesForResponsesAPI(e){return e.map(t=>{let s={role:t.role==="tool"?"user":t.role};return typeof t.content=="string"?s.content=t.content:Array.isArray(t.content)?s.content=t.content.map(i=>i.type==="text"?{type:"input_text",text:i.text}:i.type==="image_url"?{type:"input_image",image_url:i.image_url.url}:i):s.content=t.content,s})}buildToolsDefinition(){let e=this.endpoint===I,t=[];return this.tools.length>0&&t.push(...P(this.tools,e?"responses":"chat-completions")),this.mcpServers.length>0&&e&&t.push(...this.buildMCPToolsDefinition()),t}buildMCPToolsDefinition(){return this.mcpServers.map(e=>{let t={type:"mcp",server_label:e.name,server_url:e.url};return e.require_approval&&(t.require_approval=e.require_approval),e.tool_configuration?.allowed_tools&&(t.allowed_tools=e.tool_configuration.allowed_tools),e.authorization_token&&(t.headers={Authorization:`Bearer ${e.authorization_token}`}),t})}async handleStream(e,t){return y(e,t)}async parseStream(e,t){return T(e,t,{appendTextBlock:v.addTextBlock})}parseOneShot(e){return L(e)}async parseResponsesStream(e,t){let o=e.body.getReader(),s=new TextDecoder,i=[],n=new Map,a,l,u,m="";for(;;){let{done:p,value:h}=await o.read();if(p)break;m+=s.decode(h,{stream:!0});let M="",S="",g=m.split(`
21
+ `);m=g.pop()||"";for(let x=0;x<g.length;x++){let U=g[x].trim();if(U.startsWith("event:"))M=U.slice(6).trim();else if(U.startsWith("data:"))S=U.slice(5).trim();else if(U===""&&M&&S){try{let ye=JSON.parse(S),Lt=this.handleResponsesSSEEvent(M,ye,t,i,n,J=>{J.responseStatus!==void 0&&(a=J.responseStatus),J.incompleteDetails!==void 0&&(l=J.incompleteDetails),J.usage!==void 0&&(u=J.usage)})}catch{console.warn("Failed to parse SSE data:",S)}M="",S=""}}}let c=Array.from(n.values()).map(p=>({type:"tool_use",id:p.id,name:p.name,input:p.input||{}}));return{blocks:[...i,...c],stop_reason:c.length?"tool_use":"end",truncated:a==="incomplete",response_status:a,incomplete_details:l,usage:u}}handleResponsesSSEEvent(e,t,o,s,i,n){switch(e){case"response.output_item.added":t.item?.type==="message"&&Array.isArray(t.item.content)?t.item.content.forEach(a=>{a.type==="output_text"&&a.text&&(o(a.text),v.append(s,a.text))}):t.item?.type==="function_call"&&i.set(t.item.id,{id:t.item.id,name:t.item.name,input:t.item.arguments?JSON.parse(t.item.arguments):{}});break;case"response.content_part.added":t.part?.type==="output_text"&&typeof t.part.text=="string"&&(o(t.part.text),v.append(s,t.part.text));break;case"response.output_text.delta":case"response.content_part.delta":{let a=typeof t.delta=="string"?t.delta:t.delta?.text??"";a&&(o(a),v.append(s,a))}break;case"response.output_text.done":case"response.content_part.done":break;case"response.completed":return n(this.extractResponsesMetadata(t,"completed")),"completed";case"response.incomplete":return n(this.extractResponsesMetadata(t,"incomplete")),"completed";case"response.reasoning.started":case"response.reasoning.delta":case"response.reasoning.done":break;default:break}}extractResponsesMetadata(e,t){let o=e?.response??e;return{responseStatus:o?.status??t,incompleteDetails:o?.incomplete_details??null,usage:o?.usage}}parseResponsesOneShot(e){let t=[];return e.output&&Array.isArray(e.output)&&e.output.forEach(o=>{o.type==="message"&&o.content&&o.content.forEach(s=>{s.type==="output_text"&&s.text&&t.push({type:"text",text:s.text})}),o.type==="function_call"&&t.push({type:"tool_use",id:o.id,name:o.name,input:o.arguments?JSON.parse(o.arguments):{}})}),{blocks:t,stop_reason:t.some(o=>o.type==="tool_use")?"tool_use":"end",truncated:e?.status==="incomplete",response_status:e?.status,incomplete_details:e?.incomplete_details??null,usage:e?.usage}}};var ge=class{createChatService(e){return this.validateRequiredOptions(e),new F(e.apiKey?.trim()??"",e.model,e.visionModel??e.model,e.tools,e.endpoint,[],e.responseLength,e.verbosity,e.reasoning_effort,e.enableReasoningSummary,this.getProviderName(),!1)}getProviderName(){return"openai-compatible"}getSupportedModels(){return[]}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"unknown"}supportsVisionForModel(e){return!0}getVisionSupportLevelForModel(e){return"unknown"}getDefaultModel(){return"local-model"}validateRequiredOptions(e){if(e.mcpServers!==void 0)throw new Error("openai-compatible provider does not support mcpServers.");let t=e.endpoint?.trim();if(!t)throw new Error("openai-compatible provider requires endpoint (full URL).");let o;try{o=new URL(t)}catch{throw new Error("openai-compatible provider requires endpoint to be a full URL.")}if(o.protocol!=="http:"&&o.protocol!=="https:")throw new Error("openai-compatible provider requires endpoint to be a full URL.");if(!e.model?.trim())throw new Error("openai-compatible provider requires model.")}};var _e=class{createChatService(e){let t=this.optimizeGPT5Options(e),o=E({model:t.model,visionModel:t.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultModel(),supportsVisionForModel:u=>this.supportsVisionForModel(u),validate:"resolved"}),s=t.tools,i=t.mcpServers??[],n=t.model||this.getDefaultModel(),a=!1;i.length>0||Rt(n)?a=!0:j(n)&&(a=(t.gpt5EndpointPreference||"chat")==="responses");let l=t.endpoint||(a?I:Z);return new F(t.apiKey,n,o,s,l,i,t.responseLength,t.verbosity,t.reasoning_effort,t.enableReasoningSummary,this.getProviderName())}getProviderName(){return"openai"}getSupportedModels(){return[H,Y,Q,W,N,B,K,w,Ae,De,Ne,$,we,xt,It,"o1"]}getDefaultModel(){return H}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return Te.includes(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}optimizeGPT5Options(e){let t=e.model||this.getDefaultModel();if(!j(t))return e;let o={...e};if(e.gpt5Preset){let s=Jt[e.gpt5Preset];o.reasoning_effort=s.reasoning_effort,o.verbosity=s.verbosity}else e.reasoning_effort||(o.reasoning_effort=R(t));return o.reasoning_effort=this.normalizeReasoningEffort(t,o.reasoning_effort),o}normalizeReasoningEffort(e,t){if(t)return t==="none"&&!Dt(e)?R(e):t==="minimal"&&!Nt(e)?R(e):t==="low"&&!wt(e)?R(e):t==="xhigh"&&!At(e)?R(e):t}};var fe=class{constructor(e,t=k,o=k,s,i=xe,n,a,l,u,m,c){this.provider="openrouter";this.lastRequestTime=0;this.requestCount=0;this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.responseLength=n,this.appName=a,this.appUrl=l,this.reasoning_effort=u,this.includeReasoning=m,this.reasoningMaxTokens=c,this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async applyRateLimiting(){if(!q(this.model))return;let e=Date.now(),t=e-this.lastRequestTime;if(t>6e4&&(this.requestCount=0),this.requestCount>=Wt){let o=6e4-t;o>0&&(console.log(`Rate limit reached for free tier. Waiting ${o}ms...`),await new Promise(s=>setTimeout(s,o)),this.requestCount=0)}this.lastRequestTime=e,this.requestCount++}async processChat(e,t,o){await this.applyRateLimiting(),await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callOpenRouter(e,this.model,!0);return this.handleStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){if(!ee(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await this.applyRateLimiting();try{await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callOpenRouter(e,this.visionModel,!0);return this.handleStream(s,t)},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}catch(s){throw console.error("Error in processVisionChat:",s),s}}async chatOnce(e,t=!0,o=()=>{},s){await this.applyRateLimiting();let i=await this.callOpenRouter(e,this.model,t,s);return t?this.parseStream(i,o):this.parseOneShot(await i.json())}async visionChatOnce(e,t=!1,o=()=>{},s){if(!ee(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await this.applyRateLimiting();let i=await this.callOpenRouter(e,this.visionModel,t,s);return t?this.parseStream(i,o):this.parseOneShot(await i.json())}async callOpenRouter(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s),n={Authorization:`Bearer ${this.apiKey}`};return this.appUrl&&(n["HTTP-Referer"]=this.appUrl),this.appName&&(n["X-Title"]=this.appName),await _.post(this.endpoint,i,n)}buildRequestBody(e,t,o,s){let i={model:t,messages:e,stream:o};if((s!==void 0?s:O(this.responseLength))&&console.warn("OpenRouter: Token limits are not supported for gpt-oss-20b model due to known issues. Using unlimited tokens instead."),this.reasoning_effort!==void 0||this.includeReasoning!==void 0||this.reasoningMaxTokens){if(i.reasoning={},this.reasoning_effort&&this.reasoning_effort!=="none"){let a=this.reasoning_effort==="minimal"?"low":this.reasoning_effort;i.reasoning.effort=a}(this.reasoning_effort==="none"||this.includeReasoning!==!0)&&(i.reasoning.exclude=!0),this.reasoningMaxTokens&&(i.reasoning.max_tokens=this.reasoningMaxTokens)}else i.reasoning={exclude:!0};return this.tools.length>0&&(i.tools=P(this.tools,"chat-completions"),i.tool_choice="auto"),i}async handleStream(e,t){return y(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}async parseStream(e,t){return T(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}parseOneShot(e){return L(e)}};var ve=class{createChatService(e){let t=E({model:e.model,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:e.model||this.getDefaultModel(),supportsVisionForModel:n=>this.supportsVisionForModel(n),validate:"explicit"}),o=e.tools,s=e.appName,i=e.appUrl;return new fe(e.apiKey,e.model||this.getDefaultModel(),t,o,e.endpoint,e.responseLength,s,i,e.reasoning_effort,e.includeReasoning,e.reasoningMaxTokens)}getProviderName(){return"openrouter"}getSupportedModels(){return[k,_t,ot,st,it,rt,nt,at,lt,pt,ct,ut,Gt,ht,dt,mt,gt,Ft,Ut,tt]}getDefaultModel(){return k}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return this.getSupportedModels().some(e=>this.supportsVisionForModel(e))?"supported":"unsupported"}supportsVisionForModel(e){return ee(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}getFreeModels(){return Ht}isModelFree(e){return q(e)}};var Me=class{constructor(e,t=A,o=A,s,i=be,n){this.provider="xai";this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.responseLength=n,this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async processChat(e,t,o){await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callXAI(e,this.model,!0);return this.handleStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){if(!se(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callXAI(e,this.visionModel,!0);return this.handleStream(s,t)},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callXAI(e,this.model,t,s);return this.parseResponse(i,t,o)}async visionChatOnce(e,t=!1,o=()=>{},s){if(!se(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);let i=await this.callXAI(e,this.visionModel,t,s);return this.parseResponse(i,t,o)}async parseResponse(e,t,o){return t?this.parseStream(e,o):this.parseOneShot(await e.json())}async callXAI(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s);return await _.post(this.endpoint,i,{Authorization:`Bearer ${this.apiKey}`})}buildRequestBody(e,t,o,s){let i={model:t,stream:o,messages:e},n=s!==void 0?s:O(this.responseLength);n!==void 0&&(i.max_tokens=n);let a=this.buildToolsDefinition();return a.length>0&&(i.tools=a,i.tool_choice="auto"),i}buildToolsDefinition(){return P(this.tools,"chat-completions")}async handleStream(e,t){return y(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}async parseStream(e,t){return T(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}parseOneShot(e){return L(e)}};var Oe=class{createChatService(e){let t=e.model||this.getDefaultModel(),o=E({model:t,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultVisionModel(),supportsVisionForModel:i=>this.supportsVisionForModel(i),validate:"explicit"}),s=e.tools;return new Me(e.apiKey,t,o,s,e.endpoint||be,e.responseLength)}getProviderName(){return"xai"}getSupportedModels(){return[Mt,Ot,Et,A]}getDefaultModel(){return A}getDefaultVisionModel(){return A}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return se(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}};var Ee=class{constructor(e,t=te,o=z,s,i=Ie,n,a,l){this.provider="zai";this.apiKey=e,this.model=t,this.tools=s||[],this.endpoint=i,this.responseLength=n,this.responseFormat=a,this.thinking=l??{type:"disabled"},this.visionModel=o}getModel(){return this.model}getVisionModel(){return this.visionModel}async processChat(e,t,o){await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callZAI(e,this.model,!0);return this.handleStream(s,t)},runWithTools:()=>this.chatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processChat received tool_calls. ChatProcessor must use chatOnce() loop when tools are enabled."})}async processVisionChat(e,t,o){if(!oe(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);await f({hasTools:this.tools.length>0,runWithoutTools:async()=>{let s=await this.callZAI(e,this.visionModel,!0);return this.handleStream(s,t)},runWithTools:()=>this.visionChatOnce(e,!0,t),onCompleteResponse:o,toolErrorMessage:"processVisionChat received tool_calls. ChatProcessor must use visionChatOnce() loop when tools are enabled."})}async chatOnce(e,t=!0,o=()=>{},s){let i=await this.callZAI(e,this.model,t,s);return this.parseResponse(i,t,o)}async visionChatOnce(e,t=!1,o=()=>{},s){if(!oe(this.visionModel))throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);let i=await this.callZAI(e,this.visionModel,t,s);return this.parseResponse(i,t,o)}async parseResponse(e,t,o){return t?this.parseStream(e,o):this.parseOneShot(await e.json())}async callZAI(e,t,o=!1,s){let i=this.buildRequestBody(e,t,o,s);return await _.post(this.endpoint,i,{Authorization:`Bearer ${this.apiKey}`})}buildRequestBody(e,t,o,s){let i={model:t,stream:o,messages:e},n=s!==void 0?s:O(this.responseLength);n!==void 0&&(i.max_tokens=n),this.responseFormat&&(i.response_format=this.responseFormat),this.thinking&&(i.thinking=this.thinking);let a=this.buildToolsDefinition();return a.length>0&&(i.tools=a,i.tool_choice="auto",o&&zt(t)&&(i.tool_stream=!0)),i}buildToolsDefinition(){return P(this.tools,"chat-completions")}async handleStream(e,t){return y(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}async parseStream(e,t){return T(e,t,{onJsonError:o=>console.debug("Failed to parse SSE data:",o)})}parseOneShot(e){return L(e)}};var Ce=class{createChatService(e){let t=e.model||this.getDefaultModel(),o=E({model:t,visionModel:e.visionModel,defaultModel:this.getDefaultModel(),defaultVisionModel:this.getDefaultVisionModel(),supportsVisionForModel:n=>this.supportsVisionForModel(n),validate:"explicit"}),s=e.tools,i=e.thinking??{type:"disabled"};return new Ee(e.apiKey,t,o,s,e.endpoint||Ie,e.responseLength,e.responseFormat,i)}getProviderName(){return"zai"}getSupportedModels(){return[Bt,Kt,te,$t,jt,qt,ft,vt,z]}getDefaultModel(){return te}getDefaultVisionModel(){return z}supportsVision(){return this.getVisionSupportLevel()!=="unsupported"}getVisionSupportLevel(){return"supported"}supportsVisionForModel(e){return oe(e)}getVisionSupportLevelForModel(e){return this.supportsVisionForModel(e)?"supported":"unsupported"}};var uo=[new _e,new ge,new ce,new he,new le,new ve,new Ce,new Oe,new me];var Se=class{static registerProvider(e){this.providers.set(e.getProviderName(),e)}static createChatService(e,t){let o=this.providers.get(e);if(!o)throw new Error(`Unknown chat provider: ${e}`);return o.createChatService(t)}static getProviders(){return this.providers}static getAvailableProviders(){return Array.from(this.providers.keys())}static getSupportedModels(e){let t=this.providers.get(e);return t?t.getSupportedModels():[]}static getVisionSupportLevel(e){let t=this.providers.get(e);return t?t.getVisionSupportLevel():"unsupported"}static getVisionSupportLevelForModel(e,t){let o=this.providers.get(e);return o?o.getVisionSupportLevelForModel?o.getVisionSupportLevelForModel(t):o.supportsVisionForModel?o.supportsVisionForModel(t)?"supported":"unsupported":o.getVisionSupportLevel():"unsupported"}};Se.providers=new Map;uo.forEach(r=>Se.registerProvider(r));function ho(){_.setFetch(async(r,e={})=>{let t=(e.method||"GET").toString().toUpperCase(),o=e.headers,s={};if(Array.isArray(o))for(let[c,d]of o)s[c]=String(d);else if(o&&typeof o=="object")for(let[c,d]of Object.entries(o))s[c]=String(d);let i={method:t,headers:s,muteHttpExceptions:!0},n=e.body;typeof n=="string"?i.payload=n:n!=null&&(s["Content-Type"]||(s["Content-Type"]="application/json"),i.payload=JSON.stringify(n));let a=UrlFetchApp.fetch(r,i),l=a.getResponseCode(),u=a.getContentText();return{ok:l>=200&&l<300,status:l,statusText:String(l),text:async()=>u,json:async()=>u?JSON.parse(u):null}})}return Mo($o);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aituber-onair/chat",
3
- "version": "0.25.1",
3
+ "version": "0.27.0",
4
4
  "description": "Chat and LLM API integration library for AITuber OnAir",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",