@aituber-onair/chat 0.40.0 → 0.42.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 (87) hide show
  1. package/README.ja.md +37 -2
  2. package/README.md +39 -2
  3. package/dist/cjs/constants/index.d.ts +2 -0
  4. package/dist/cjs/constants/index.d.ts.map +1 -1
  5. package/dist/cjs/constants/index.js +2 -0
  6. package/dist/cjs/constants/index.js.map +1 -1
  7. package/dist/cjs/constants/plamo.d.ts +7 -0
  8. package/dist/cjs/constants/plamo.d.ts.map +1 -0
  9. package/dist/cjs/constants/plamo.js +12 -0
  10. package/dist/cjs/constants/plamo.js.map +1 -0
  11. package/dist/cjs/constants/sakana.d.ts +7 -0
  12. package/dist/cjs/constants/sakana.d.ts.map +1 -0
  13. package/dist/cjs/constants/sakana.js +14 -0
  14. package/dist/cjs/constants/sakana.js.map +1 -0
  15. package/dist/cjs/index.d.ts +5 -1
  16. package/dist/cjs/index.d.ts.map +1 -1
  17. package/dist/cjs/index.js +11 -1
  18. package/dist/cjs/index.js.map +1 -1
  19. package/dist/cjs/services/providers/ChatServiceProvider.d.ts +9 -1
  20. package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
  21. package/dist/cjs/services/providers/index.d.ts +3 -1
  22. package/dist/cjs/services/providers/index.d.ts.map +1 -1
  23. package/dist/cjs/services/providers/index.js +4 -0
  24. package/dist/cjs/services/providers/index.js.map +1 -1
  25. package/dist/cjs/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  26. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js +8 -0
  27. package/dist/cjs/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  28. package/dist/cjs/services/providers/plamo/PlamoChatService.d.ts +8 -0
  29. package/dist/cjs/services/providers/plamo/PlamoChatService.d.ts.map +1 -0
  30. package/dist/cjs/services/providers/plamo/PlamoChatService.js +12 -0
  31. package/dist/cjs/services/providers/plamo/PlamoChatService.js.map +1 -0
  32. package/dist/cjs/services/providers/plamo/PlamoChatServiceProvider.d.ts +16 -0
  33. package/dist/cjs/services/providers/plamo/PlamoChatServiceProvider.d.ts.map +1 -0
  34. package/dist/cjs/services/providers/plamo/PlamoChatServiceProvider.js +57 -0
  35. package/dist/cjs/services/providers/plamo/PlamoChatServiceProvider.js.map +1 -0
  36. package/dist/cjs/services/providers/sakana/SakanaChatService.d.ts +7 -0
  37. package/dist/cjs/services/providers/sakana/SakanaChatService.d.ts.map +1 -0
  38. package/dist/cjs/services/providers/sakana/SakanaChatService.js +12 -0
  39. package/dist/cjs/services/providers/sakana/SakanaChatService.js.map +1 -0
  40. package/dist/cjs/services/providers/sakana/SakanaChatServiceProvider.d.ts +16 -0
  41. package/dist/cjs/services/providers/sakana/SakanaChatServiceProvider.d.ts.map +1 -0
  42. package/dist/cjs/services/providers/sakana/SakanaChatServiceProvider.js +57 -0
  43. package/dist/cjs/services/providers/sakana/SakanaChatServiceProvider.js.map +1 -0
  44. package/dist/esm/constants/index.d.ts +2 -0
  45. package/dist/esm/constants/index.d.ts.map +1 -1
  46. package/dist/esm/constants/index.js +2 -0
  47. package/dist/esm/constants/index.js.map +1 -1
  48. package/dist/esm/constants/plamo.d.ts +7 -0
  49. package/dist/esm/constants/plamo.d.ts.map +1 -0
  50. package/dist/esm/constants/plamo.js +9 -0
  51. package/dist/esm/constants/plamo.js.map +1 -0
  52. package/dist/esm/constants/sakana.d.ts +7 -0
  53. package/dist/esm/constants/sakana.d.ts.map +1 -0
  54. package/dist/esm/constants/sakana.js +11 -0
  55. package/dist/esm/constants/sakana.js.map +1 -0
  56. package/dist/esm/index.d.ts +5 -1
  57. package/dist/esm/index.d.ts.map +1 -1
  58. package/dist/esm/index.js +6 -0
  59. package/dist/esm/index.js.map +1 -1
  60. package/dist/esm/services/providers/ChatServiceProvider.d.ts +9 -1
  61. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
  62. package/dist/esm/services/providers/index.d.ts +3 -1
  63. package/dist/esm/services/providers/index.d.ts.map +1 -1
  64. package/dist/esm/services/providers/index.js +4 -0
  65. package/dist/esm/services/providers/index.js.map +1 -1
  66. package/dist/esm/services/providers/openai/openaiRequestBuilder.d.ts.map +1 -1
  67. package/dist/esm/services/providers/openai/openaiRequestBuilder.js +8 -0
  68. package/dist/esm/services/providers/openai/openaiRequestBuilder.js.map +1 -1
  69. package/dist/esm/services/providers/plamo/PlamoChatService.d.ts +8 -0
  70. package/dist/esm/services/providers/plamo/PlamoChatService.d.ts.map +1 -0
  71. package/dist/esm/services/providers/plamo/PlamoChatService.js +8 -0
  72. package/dist/esm/services/providers/plamo/PlamoChatService.js.map +1 -0
  73. package/dist/esm/services/providers/plamo/PlamoChatServiceProvider.d.ts +16 -0
  74. package/dist/esm/services/providers/plamo/PlamoChatServiceProvider.d.ts.map +1 -0
  75. package/dist/esm/services/providers/plamo/PlamoChatServiceProvider.js +53 -0
  76. package/dist/esm/services/providers/plamo/PlamoChatServiceProvider.js.map +1 -0
  77. package/dist/esm/services/providers/sakana/SakanaChatService.d.ts +7 -0
  78. package/dist/esm/services/providers/sakana/SakanaChatService.d.ts.map +1 -0
  79. package/dist/esm/services/providers/sakana/SakanaChatService.js +8 -0
  80. package/dist/esm/services/providers/sakana/SakanaChatService.js.map +1 -0
  81. package/dist/esm/services/providers/sakana/SakanaChatServiceProvider.d.ts +16 -0
  82. package/dist/esm/services/providers/sakana/SakanaChatServiceProvider.d.ts.map +1 -0
  83. package/dist/esm/services/providers/sakana/SakanaChatServiceProvider.js +53 -0
  84. package/dist/esm/services/providers/sakana/SakanaChatServiceProvider.js.map +1 -0
  85. package/dist/umd/aituber-onair-chat.js +205 -2
  86. package/dist/umd/aituber-onair-chat.min.js +10 -10
  87. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ import { ChatService } from '../../ChatService';
2
+ import { ChatServiceProvider, SakanaChatServiceOptions, VisionSupportLevel } from '../ChatServiceProvider';
3
+ export declare class SakanaChatServiceProvider implements ChatServiceProvider<SakanaChatServiceOptions> {
4
+ createChatService(options: SakanaChatServiceOptions): ChatService;
5
+ getProviderName(): string;
6
+ getSupportedModels(): string[];
7
+ getDefaultModel(): string;
8
+ supportsVision(): boolean;
9
+ getVisionSupportLevel(): VisionSupportLevel;
10
+ supportsVisionForModel(_model: string): boolean;
11
+ getVisionSupportLevelForModel(_model: string): VisionSupportLevel;
12
+ private validateRequiredOptions;
13
+ private resolveEndpoint;
14
+ private normalizeUrl;
15
+ }
16
+ //# sourceMappingURL=SakanaChatServiceProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SakanaChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/sakana/SakanaChatServiceProvider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAIhC,qBAAa,yBACX,YAAW,mBAAmB,CAAC,wBAAwB,CAAC;IAExD,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW;IAgBjE,eAAe,IAAI,MAAM;IAIzB,kBAAkB,IAAI,MAAM,EAAE;IAI9B,eAAe,IAAI,MAAM;IAIzB,cAAc,IAAI,OAAO;IAIzB,qBAAqB,IAAI,kBAAkB;IAI3C,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/C,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAIjE,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,YAAY;CAGrB"}
@@ -0,0 +1,53 @@
1
+ import { ENDPOINT_SAKANA_CHAT_COMPLETIONS_API, MODEL_FUGU, SAKANA_SUPPORTED_MODELS, } from '../../../constants/sakana';
2
+ import { SakanaChatService } from './SakanaChatService';
3
+ export class SakanaChatServiceProvider {
4
+ createChatService(options) {
5
+ this.validateRequiredOptions(options);
6
+ const model = options.model || this.getDefaultModel();
7
+ const tools = options.tools;
8
+ return new SakanaChatService(options.apiKey, model, options.visionModel ?? model, tools, this.resolveEndpoint(options), options.responseLength);
9
+ }
10
+ getProviderName() {
11
+ return 'sakana';
12
+ }
13
+ getSupportedModels() {
14
+ return [...SAKANA_SUPPORTED_MODELS];
15
+ }
16
+ getDefaultModel() {
17
+ return MODEL_FUGU;
18
+ }
19
+ supportsVision() {
20
+ return false;
21
+ }
22
+ getVisionSupportLevel() {
23
+ return 'unsupported';
24
+ }
25
+ supportsVisionForModel(_model) {
26
+ return false;
27
+ }
28
+ getVisionSupportLevelForModel(_model) {
29
+ return 'unsupported';
30
+ }
31
+ validateRequiredOptions(options) {
32
+ if (!options.apiKey?.trim()) {
33
+ throw new Error('sakana provider requires apiKey.');
34
+ }
35
+ }
36
+ resolveEndpoint(options) {
37
+ if (options.endpoint) {
38
+ return this.normalizeUrl(options.endpoint);
39
+ }
40
+ if (options.baseUrl) {
41
+ const baseUrl = this.normalizeUrl(options.baseUrl);
42
+ if (baseUrl.endsWith('/chat/completions')) {
43
+ return baseUrl;
44
+ }
45
+ return `${baseUrl}/chat/completions`;
46
+ }
47
+ return ENDPOINT_SAKANA_CHAT_COMPLETIONS_API;
48
+ }
49
+ normalizeUrl(value) {
50
+ return value.trim().replace(/\/+$/, '');
51
+ }
52
+ }
53
+ //# sourceMappingURL=SakanaChatServiceProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SakanaChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/sakana/SakanaChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oCAAoC,EACpC,UAAU,EACV,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAOnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,OAAO,yBAAyB;IAGpC,iBAAiB,CAAC,OAAiC;QACjD,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACtD,MAAM,KAAK,GAAiC,OAAO,CAAC,KAAK,CAAC;QAE1D,OAAO,IAAI,iBAAiB,CAC1B,OAAO,CAAC,MAAM,EACd,KAAK,EACL,OAAO,CAAC,WAAW,IAAI,KAAK,EAC5B,KAAK,EACL,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAC7B,OAAO,CAAC,cAAc,CACvB,CAAC;IACJ,CAAC;IAED,eAAe;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kBAAkB;QAChB,OAAO,CAAC,GAAG,uBAAuB,CAAC,CAAC;IACtC,CAAC;IAED,eAAe;QACb,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,cAAc;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qBAAqB;QACnB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,sBAAsB,CAAC,MAAc;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6BAA6B,CAAC,MAAc;QAC1C,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,uBAAuB,CAAC,OAAiC;QAC/D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAiC;QACvD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC1C,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,GAAG,OAAO,mBAAmB,CAAC;QACvC,CAAC;QAED,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IAEO,YAAY,CAAC,KAAa;QAChC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF"}
@@ -45,6 +45,8 @@ var AITuberOnAirChat = (() => {
45
45
  ENDPOINT_OPENAI_CHAT_COMPLETIONS_API: () => ENDPOINT_OPENAI_CHAT_COMPLETIONS_API,
46
46
  ENDPOINT_OPENAI_RESPONSES_API: () => ENDPOINT_OPENAI_RESPONSES_API,
47
47
  ENDPOINT_OPENROUTER_API: () => ENDPOINT_OPENROUTER_API,
48
+ ENDPOINT_PLAMO_CHAT_COMPLETIONS_API: () => ENDPOINT_PLAMO_CHAT_COMPLETIONS_API,
49
+ ENDPOINT_SAKANA_CHAT_COMPLETIONS_API: () => ENDPOINT_SAKANA_CHAT_COMPLETIONS_API,
48
50
  ENDPOINT_XAI_CHAT_COMPLETIONS_API: () => ENDPOINT_XAI_CHAT_COMPLETIONS_API,
49
51
  ENDPOINT_ZAI_CHAT_COMPLETIONS_API: () => ENDPOINT_ZAI_CHAT_COMPLETIONS_API,
50
52
  EmotionParser: () => EmotionParser,
@@ -92,6 +94,9 @@ var AITuberOnAirChat = (() => {
92
94
  MODEL_DEEPSEEK_REASONER: () => MODEL_DEEPSEEK_REASONER,
93
95
  MODEL_DEEPSEEK_V4_FLASH: () => MODEL_DEEPSEEK_V4_FLASH,
94
96
  MODEL_DEEPSEEK_V4_PRO: () => MODEL_DEEPSEEK_V4_PRO,
97
+ MODEL_FUGU: () => MODEL_FUGU,
98
+ MODEL_FUGU_ULTRA: () => MODEL_FUGU_ULTRA,
99
+ MODEL_FUGU_ULTRA_20260615: () => MODEL_FUGU_ULTRA_20260615,
95
100
  MODEL_GEMINI_2_5_FLASH: () => MODEL_GEMINI_2_5_FLASH,
96
101
  MODEL_GEMINI_2_5_FLASH_LITE: () => MODEL_GEMINI_2_5_FLASH_LITE,
97
102
  MODEL_GEMINI_2_5_FLASH_LITE_PREVIEW_06_17: () => MODEL_GEMINI_2_5_FLASH_LITE_PREVIEW_06_17,
@@ -169,6 +174,8 @@ var AITuberOnAirChat = (() => {
169
174
  MODEL_OPENAI_GPT_MINI_LATEST: () => MODEL_OPENAI_GPT_MINI_LATEST,
170
175
  MODEL_OPENROUTER_AUTO: () => MODEL_OPENROUTER_AUTO,
171
176
  MODEL_OPENROUTER_FUSION: () => MODEL_OPENROUTER_FUSION,
177
+ MODEL_PLAMO_2_2_PRIME: () => MODEL_PLAMO_2_2_PRIME,
178
+ MODEL_PLAMO_3_0_PRIME: () => MODEL_PLAMO_3_0_PRIME,
172
179
  MODEL_ZAI_GLM_4_5_AIR: () => MODEL_ZAI_GLM_4_5_AIR,
173
180
  MODEL_ZAI_GLM_4_5_AIR_FREE: () => MODEL_ZAI_GLM_4_5_AIR_FREE,
174
181
  MODEL_ZAI_GLM_4_7_FLASH: () => MODEL_ZAI_GLM_4_7_FLASH,
@@ -186,6 +193,14 @@ var AITuberOnAirChat = (() => {
186
193
  OpenAICompatibleChatServiceProvider: () => OpenAICompatibleChatServiceProvider,
187
194
  OpenRouterChatService: () => OpenRouterChatService,
188
195
  OpenRouterChatServiceProvider: () => OpenRouterChatServiceProvider,
196
+ PLAMO_API_BASE_URL: () => PLAMO_API_BASE_URL,
197
+ PLAMO_SUPPORTED_MODELS: () => PLAMO_SUPPORTED_MODELS,
198
+ PlamoChatService: () => PlamoChatService,
199
+ PlamoChatServiceProvider: () => PlamoChatServiceProvider,
200
+ SAKANA_API_BASE_URL: () => SAKANA_API_BASE_URL,
201
+ SAKANA_SUPPORTED_MODELS: () => SAKANA_SUPPORTED_MODELS,
202
+ SakanaChatService: () => SakanaChatService,
203
+ SakanaChatServiceProvider: () => SakanaChatServiceProvider,
189
204
  StreamTextAccumulator: () => StreamTextAccumulator,
190
205
  VISION_SUPPORTED_MODELS: () => VISION_SUPPORTED_MODELS,
191
206
  XAIChatService: () => XAIChatService,
@@ -567,6 +582,28 @@ var AITuberOnAirChat = (() => {
567
582
  return MISTRAL_VISION_SUPPORTED_MODELS.includes(model);
568
583
  }
569
584
 
585
+ // src/constants/sakana.ts
586
+ var SAKANA_API_BASE_URL = "https://api.sakana.ai/v1";
587
+ var ENDPOINT_SAKANA_CHAT_COMPLETIONS_API = `${SAKANA_API_BASE_URL}/chat/completions`;
588
+ var MODEL_FUGU = "fugu";
589
+ var MODEL_FUGU_ULTRA = "fugu-ultra";
590
+ var MODEL_FUGU_ULTRA_20260615 = "fugu-ultra-20260615";
591
+ var SAKANA_SUPPORTED_MODELS = [
592
+ MODEL_FUGU,
593
+ MODEL_FUGU_ULTRA,
594
+ MODEL_FUGU_ULTRA_20260615
595
+ ];
596
+
597
+ // src/constants/plamo.ts
598
+ var PLAMO_API_BASE_URL = "https://api.platform.preferredai.jp/v1";
599
+ var ENDPOINT_PLAMO_CHAT_COMPLETIONS_API = `${PLAMO_API_BASE_URL}/chat/completions`;
600
+ var MODEL_PLAMO_3_0_PRIME = "plamo-3.0-prime";
601
+ var MODEL_PLAMO_2_2_PRIME = "plamo-2.2-prime";
602
+ var PLAMO_SUPPORTED_MODELS = [
603
+ MODEL_PLAMO_3_0_PRIME,
604
+ MODEL_PLAMO_2_2_PRIME
605
+ ];
606
+
570
607
  // src/constants/chat.ts
571
608
  var CHAT_RESPONSE_LENGTH = {
572
609
  VERY_SHORT: "veryShort",
@@ -2033,7 +2070,9 @@ If it's in another language, summarize in that language.
2033
2070
  var OPENAI_COMPATIBLE_CHAT_COMPLETIONS_PROVIDERS = /* @__PURE__ */ new Set([
2034
2071
  "openai-compatible",
2035
2072
  "deepseek",
2036
- "mistral"
2073
+ "mistral",
2074
+ "sakana",
2075
+ "plamo"
2037
2076
  ]);
2038
2077
  function buildOpenAIRequestBody({
2039
2078
  provider,
@@ -2110,6 +2149,9 @@ If it's in another language, summarize in that language.
2110
2149
  if (provider === "mistral" && isMistralReasoningEffortModel(model) && reasoning_effort && isMistralReasoningEffort(reasoning_effort)) {
2111
2150
  body.reasoning_effort = reasoning_effort;
2112
2151
  }
2152
+ if (provider === "plamo" && reasoning_effort) {
2153
+ body.reasoning_effort = reasoning_effort;
2154
+ }
2113
2155
  const toolDefinitions = buildOpenAIToolsDefinition({
2114
2156
  tools,
2115
2157
  mcpServers,
@@ -4436,6 +4478,165 @@ If it's in another language, summarize in that language.
4436
4478
  }
4437
4479
  };
4438
4480
 
4481
+ // src/services/providers/plamo/PlamoChatService.ts
4482
+ var PlamoChatService = class extends OpenAIChatService {
4483
+ constructor(apiKey, model = MODEL_PLAMO_3_0_PRIME, visionModel = model, tools, endpoint = ENDPOINT_PLAMO_CHAT_COMPLETIONS_API, responseLength, reasoning_effort) {
4484
+ super(
4485
+ apiKey,
4486
+ model,
4487
+ visionModel,
4488
+ tools,
4489
+ endpoint,
4490
+ [],
4491
+ responseLength,
4492
+ void 0,
4493
+ reasoning_effort,
4494
+ false,
4495
+ "plamo",
4496
+ false
4497
+ );
4498
+ }
4499
+ };
4500
+
4501
+ // src/services/providers/plamo/PlamoChatServiceProvider.ts
4502
+ var PlamoChatServiceProvider = class {
4503
+ createChatService(options) {
4504
+ this.validateRequiredOptions(options);
4505
+ const model = options.model || this.getDefaultModel();
4506
+ const tools = options.tools;
4507
+ return new PlamoChatService(
4508
+ options.apiKey,
4509
+ model,
4510
+ options.visionModel ?? model,
4511
+ tools,
4512
+ this.resolveEndpoint(options),
4513
+ options.responseLength,
4514
+ options.reasoning_effort
4515
+ );
4516
+ }
4517
+ getProviderName() {
4518
+ return "plamo";
4519
+ }
4520
+ getSupportedModels() {
4521
+ return [...PLAMO_SUPPORTED_MODELS];
4522
+ }
4523
+ getDefaultModel() {
4524
+ return MODEL_PLAMO_3_0_PRIME;
4525
+ }
4526
+ supportsVision() {
4527
+ return false;
4528
+ }
4529
+ getVisionSupportLevel() {
4530
+ return "unsupported";
4531
+ }
4532
+ supportsVisionForModel(_model) {
4533
+ return false;
4534
+ }
4535
+ getVisionSupportLevelForModel(_model) {
4536
+ return "unsupported";
4537
+ }
4538
+ validateRequiredOptions(options) {
4539
+ if (!options.apiKey?.trim()) {
4540
+ throw new Error("plamo provider requires apiKey.");
4541
+ }
4542
+ }
4543
+ resolveEndpoint(options) {
4544
+ if (options.endpoint) {
4545
+ return this.normalizeUrl(options.endpoint);
4546
+ }
4547
+ if (options.baseUrl) {
4548
+ const baseUrl = this.normalizeUrl(options.baseUrl);
4549
+ if (baseUrl.endsWith("/chat/completions")) {
4550
+ return baseUrl;
4551
+ }
4552
+ return `${baseUrl}/chat/completions`;
4553
+ }
4554
+ return ENDPOINT_PLAMO_CHAT_COMPLETIONS_API;
4555
+ }
4556
+ normalizeUrl(value) {
4557
+ return value.trim().replace(/\/+$/, "");
4558
+ }
4559
+ };
4560
+
4561
+ // src/services/providers/sakana/SakanaChatService.ts
4562
+ var SakanaChatService = class extends OpenAIChatService {
4563
+ constructor(apiKey, model = MODEL_FUGU, visionModel = model, tools, endpoint = ENDPOINT_SAKANA_CHAT_COMPLETIONS_API, responseLength) {
4564
+ super(
4565
+ apiKey,
4566
+ model,
4567
+ visionModel,
4568
+ tools,
4569
+ endpoint,
4570
+ [],
4571
+ responseLength,
4572
+ void 0,
4573
+ void 0,
4574
+ false,
4575
+ "sakana",
4576
+ false
4577
+ );
4578
+ }
4579
+ };
4580
+
4581
+ // src/services/providers/sakana/SakanaChatServiceProvider.ts
4582
+ var SakanaChatServiceProvider = class {
4583
+ createChatService(options) {
4584
+ this.validateRequiredOptions(options);
4585
+ const model = options.model || this.getDefaultModel();
4586
+ const tools = options.tools;
4587
+ return new SakanaChatService(
4588
+ options.apiKey,
4589
+ model,
4590
+ options.visionModel ?? model,
4591
+ tools,
4592
+ this.resolveEndpoint(options),
4593
+ options.responseLength
4594
+ );
4595
+ }
4596
+ getProviderName() {
4597
+ return "sakana";
4598
+ }
4599
+ getSupportedModels() {
4600
+ return [...SAKANA_SUPPORTED_MODELS];
4601
+ }
4602
+ getDefaultModel() {
4603
+ return MODEL_FUGU;
4604
+ }
4605
+ supportsVision() {
4606
+ return false;
4607
+ }
4608
+ getVisionSupportLevel() {
4609
+ return "unsupported";
4610
+ }
4611
+ supportsVisionForModel(_model) {
4612
+ return false;
4613
+ }
4614
+ getVisionSupportLevelForModel(_model) {
4615
+ return "unsupported";
4616
+ }
4617
+ validateRequiredOptions(options) {
4618
+ if (!options.apiKey?.trim()) {
4619
+ throw new Error("sakana provider requires apiKey.");
4620
+ }
4621
+ }
4622
+ resolveEndpoint(options) {
4623
+ if (options.endpoint) {
4624
+ return this.normalizeUrl(options.endpoint);
4625
+ }
4626
+ if (options.baseUrl) {
4627
+ const baseUrl = this.normalizeUrl(options.baseUrl);
4628
+ if (baseUrl.endsWith("/chat/completions")) {
4629
+ return baseUrl;
4630
+ }
4631
+ return `${baseUrl}/chat/completions`;
4632
+ }
4633
+ return ENDPOINT_SAKANA_CHAT_COMPLETIONS_API;
4634
+ }
4635
+ normalizeUrl(value) {
4636
+ return value.trim().replace(/\/+$/, "");
4637
+ }
4638
+ };
4639
+
4439
4640
  // src/services/providers/xai/XAIChatService.ts
4440
4641
  var XAIChatService = class {
4441
4642
  /**
@@ -4907,7 +5108,9 @@ If it's in another language, summarize in that language.
4907
5108
  new XAIChatServiceProvider(),
4908
5109
  new KimiChatServiceProvider(),
4909
5110
  new DeepSeekChatServiceProvider(),
4910
- new MistralChatServiceProvider()
5111
+ new MistralChatServiceProvider(),
5112
+ new SakanaChatServiceProvider(),
5113
+ new PlamoChatServiceProvider()
4911
5114
  ];
4912
5115
 
4913
5116
  // src/services/ChatServiceFactory.ts