@soederpop/luca 0.1.1 → 0.1.2

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.
@@ -1,7 +1,7 @@
1
1
  import { setBuildTimeData, setContainerBuildTimeData } from './index.js';
2
2
 
3
3
  // Auto-generated introspection registry data
4
- // Generated at: 2026-03-28T06:19:48.227Z
4
+ // Generated at: 2026-03-30T06:52:54.952Z
5
5
 
6
6
  setBuildTimeData('features.googleDocs', {
7
7
  "id": "features.googleDocs",
@@ -12302,270 +12302,6 @@ setBuildTimeData('clients.supabase', {
12302
12302
  ]
12303
12303
  });
12304
12304
 
12305
- setBuildTimeData('clients.elevenlabs', {
12306
- "id": "clients.elevenlabs",
12307
- "description": "ElevenLabs client — text-to-speech synthesis via the ElevenLabs REST API. Provides methods for listing voices, listing models, and generating speech audio. Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.",
12308
- "shortcut": "clients.elevenlabs",
12309
- "className": "ElevenLabsClient",
12310
- "methods": {
12311
- "beforeRequest": {
12312
- "description": "Inject the xi-api-key header before each request.",
12313
- "parameters": {},
12314
- "required": [],
12315
- "returns": "void"
12316
- },
12317
- "connect": {
12318
- "description": "Validate the API key by listing available models.",
12319
- "parameters": {},
12320
- "required": [],
12321
- "returns": "Promise<this>",
12322
- "examples": [
12323
- {
12324
- "language": "ts",
12325
- "code": "await el.connect()"
12326
- }
12327
- ]
12328
- },
12329
- "listVoices": {
12330
- "description": "List available voices with optional search and filtering.",
12331
- "parameters": {
12332
- "options": {
12333
- "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
12334
- "description": "Query parameters for filtering voices"
12335
- }
12336
- },
12337
- "required": [],
12338
- "returns": "Promise<any>",
12339
- "examples": [
12340
- {
12341
- "language": "ts",
12342
- "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
12343
- }
12344
- ]
12345
- },
12346
- "getVoice": {
12347
- "description": "Get details for a single voice.",
12348
- "parameters": {
12349
- "voiceId": {
12350
- "type": "string",
12351
- "description": "The voice ID to look up"
12352
- }
12353
- },
12354
- "required": [
12355
- "voiceId"
12356
- ],
12357
- "returns": "Promise<any>",
12358
- "examples": [
12359
- {
12360
- "language": "ts",
12361
- "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
12362
- }
12363
- ]
12364
- },
12365
- "listModels": {
12366
- "description": "List available TTS models.",
12367
- "parameters": {},
12368
- "required": [],
12369
- "returns": "Promise<any[]>",
12370
- "examples": [
12371
- {
12372
- "language": "ts",
12373
- "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
12374
- }
12375
- ]
12376
- },
12377
- "synthesize": {
12378
- "description": "Synthesize speech from text, returning audio as a Buffer.",
12379
- "parameters": {
12380
- "text": {
12381
- "type": "string",
12382
- "description": "The text to convert to speech"
12383
- },
12384
- "options": {
12385
- "type": "SynthesizeOptions",
12386
- "description": "Voice, model, format, and voice settings overrides",
12387
- "properties": {
12388
- "voiceId": {
12389
- "type": "string",
12390
- "description": ""
12391
- },
12392
- "modelId": {
12393
- "type": "string",
12394
- "description": ""
12395
- },
12396
- "outputFormat": {
12397
- "type": "string",
12398
- "description": ""
12399
- },
12400
- "voiceSettings": {
12401
- "type": "ElevenLabsVoiceSettings",
12402
- "description": ""
12403
- },
12404
- "disableCache": {
12405
- "type": "boolean",
12406
- "description": ""
12407
- }
12408
- }
12409
- }
12410
- },
12411
- "required": [
12412
- "text"
12413
- ],
12414
- "returns": "Promise<Buffer>",
12415
- "examples": [
12416
- {
12417
- "language": "ts",
12418
- "code": "const audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data\n\nconst custom = await el.synthesize('Hello', {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n voiceSettings: { stability: 0.5, similarityBoost: 0.8 }\n})"
12419
- }
12420
- ]
12421
- },
12422
- "say": {
12423
- "description": "Synthesize speech and write the audio to a file.",
12424
- "parameters": {
12425
- "text": {
12426
- "type": "string",
12427
- "description": "The text to convert to speech"
12428
- },
12429
- "outputPath": {
12430
- "type": "string",
12431
- "description": "File path to write the audio to"
12432
- },
12433
- "options": {
12434
- "type": "SynthesizeOptions",
12435
- "description": "Voice, model, format, and voice settings overrides",
12436
- "properties": {
12437
- "voiceId": {
12438
- "type": "string",
12439
- "description": ""
12440
- },
12441
- "modelId": {
12442
- "type": "string",
12443
- "description": ""
12444
- },
12445
- "outputFormat": {
12446
- "type": "string",
12447
- "description": ""
12448
- },
12449
- "voiceSettings": {
12450
- "type": "ElevenLabsVoiceSettings",
12451
- "description": ""
12452
- },
12453
- "disableCache": {
12454
- "type": "boolean",
12455
- "description": ""
12456
- }
12457
- }
12458
- }
12459
- },
12460
- "required": [
12461
- "text",
12462
- "outputPath"
12463
- ],
12464
- "returns": "Promise<string>",
12465
- "examples": [
12466
- {
12467
- "language": "ts",
12468
- "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
12469
- }
12470
- ]
12471
- }
12472
- },
12473
- "getters": {
12474
- "apiKey": {
12475
- "description": "The resolved API key from options or environment.",
12476
- "returns": "string"
12477
- }
12478
- },
12479
- "events": {
12480
- "failure": {
12481
- "name": "failure",
12482
- "description": "Event emitted by ElevenLabsClient",
12483
- "arguments": {}
12484
- },
12485
- "voices": {
12486
- "name": "voices",
12487
- "description": "Event emitted by ElevenLabsClient",
12488
- "arguments": {}
12489
- },
12490
- "speech": {
12491
- "name": "speech",
12492
- "description": "Event emitted by ElevenLabsClient",
12493
- "arguments": {}
12494
- }
12495
- },
12496
- "state": {},
12497
- "options": {},
12498
- "envVars": [],
12499
- "examples": [
12500
- {
12501
- "language": "ts",
12502
- "code": "const el = container.client('elevenlabs')\nawait el.connect()\nconst voices = await el.listVoices()\nconst audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data"
12503
- }
12504
- ],
12505
- "types": {
12506
- "SynthesizeOptions": {
12507
- "description": "",
12508
- "properties": {
12509
- "voiceId": {
12510
- "type": "string",
12511
- "description": "",
12512
- "optional": true
12513
- },
12514
- "modelId": {
12515
- "type": "string",
12516
- "description": "",
12517
- "optional": true
12518
- },
12519
- "outputFormat": {
12520
- "type": "string",
12521
- "description": "",
12522
- "optional": true
12523
- },
12524
- "voiceSettings": {
12525
- "type": "ElevenLabsVoiceSettings",
12526
- "description": "",
12527
- "optional": true
12528
- },
12529
- "disableCache": {
12530
- "type": "boolean",
12531
- "description": "",
12532
- "optional": true
12533
- }
12534
- }
12535
- },
12536
- "ElevenLabsVoiceSettings": {
12537
- "description": "",
12538
- "properties": {
12539
- "stability": {
12540
- "type": "number",
12541
- "description": "",
12542
- "optional": true
12543
- },
12544
- "similarityBoost": {
12545
- "type": "number",
12546
- "description": "",
12547
- "optional": true
12548
- },
12549
- "style": {
12550
- "type": "number",
12551
- "description": "",
12552
- "optional": true
12553
- },
12554
- "speed": {
12555
- "type": "number",
12556
- "description": "",
12557
- "optional": true
12558
- },
12559
- "useSpeakerBoost": {
12560
- "type": "boolean",
12561
- "description": "",
12562
- "optional": true
12563
- }
12564
- }
12565
- }
12566
- }
12567
- });
12568
-
12569
12305
  setBuildTimeData('clients.comfyui', {
12570
12306
  "id": "clients.comfyui",
12571
12307
  "description": "ComfyUI client — execute Stable Diffusion workflows via the ComfyUI API. Connects to a ComfyUI instance to queue prompts, track execution via WebSocket or polling, and download generated images. Supports both UI-format and API-format workflows with automatic conversion.",
@@ -12674,136 +12410,383 @@ setBuildTimeData('clients.comfyui', {
12674
12410
  ],
12675
12411
  "returns": "Promise<any>"
12676
12412
  },
12677
- "viewImage": {
12678
- "description": "Download a generated image from ComfyUI as a Buffer.",
12413
+ "viewImage": {
12414
+ "description": "Download a generated image from ComfyUI as a Buffer.",
12415
+ "parameters": {
12416
+ "filename": {
12417
+ "type": "string",
12418
+ "description": "The image filename"
12419
+ },
12420
+ "subfolder": {
12421
+ "type": "any",
12422
+ "description": "Subfolder within the output directory"
12423
+ },
12424
+ "type": {
12425
+ "type": "any",
12426
+ "description": "Image type ('output', 'input', 'temp')"
12427
+ }
12428
+ },
12429
+ "required": [
12430
+ "filename"
12431
+ ],
12432
+ "returns": "Promise<Buffer>"
12433
+ },
12434
+ "connectWs": {
12435
+ "description": "Open a WebSocket connection to ComfyUI for real-time execution tracking. Events emitted: `execution_start`, `executing`, `progress`, `executed`, `execution_cached`, `execution_error`, `execution_complete`.",
12436
+ "parameters": {},
12437
+ "required": [],
12438
+ "returns": "Promise<void>"
12439
+ },
12440
+ "disconnectWs": {
12441
+ "description": "Close the WebSocket connection.",
12442
+ "parameters": {},
12443
+ "required": [],
12444
+ "returns": "void"
12445
+ },
12446
+ "toApiFormat": {
12447
+ "description": "Convert a UI-format workflow to the API format that /prompt expects. Requires a running ComfyUI instance to fetch `object_info` so we can map positional `widgets_values` to their named input fields. If the workflow is already in API format, it's returned as-is.",
12448
+ "parameters": {
12449
+ "workflow": {
12450
+ "type": "Record<string, any>",
12451
+ "description": "Parameter workflow"
12452
+ }
12453
+ },
12454
+ "required": [
12455
+ "workflow"
12456
+ ],
12457
+ "returns": "Promise<Record<string, any>>"
12458
+ },
12459
+ "runWorkflow": {
12460
+ "description": "Run a ComfyUI workflow with optional runtime input overrides. Inputs can be provided in two forms: **Direct node mapping** (when no `inputMap` in options): ``` { '3': { seed: 42 }, '6': { text: 'a cat' } } ``` **Named inputs** (when `inputMap` is provided in options): ``` inputs: { positive_prompt: 'a cat', seed: 42 } options.inputMap: { positive_prompt: { nodeId: '6', field: 'text' }, seed: { nodeId: '3', field: 'seed' } } ```",
12461
+ "parameters": {
12462
+ "workflow": {
12463
+ "type": "Record<string, any>",
12464
+ "description": "Parameter workflow"
12465
+ },
12466
+ "inputs": {
12467
+ "type": "Record<string, any>",
12468
+ "description": "Parameter inputs"
12469
+ },
12470
+ "options": {
12471
+ "type": "WorkflowRunOptions",
12472
+ "description": "Parameter options",
12473
+ "properties": {
12474
+ "poll": {
12475
+ "type": "boolean",
12476
+ "description": "Use polling instead of WebSocket for tracking execution"
12477
+ },
12478
+ "pollInterval": {
12479
+ "type": "number",
12480
+ "description": "Polling interval in ms (default 1000)"
12481
+ },
12482
+ "inputMap": {
12483
+ "type": "InputMapping",
12484
+ "description": "Named input mapping: semantic name -> { nodeId, field }"
12485
+ },
12486
+ "outputDir": {
12487
+ "type": "string",
12488
+ "description": "If provided, output images are downloaded to this directory"
12489
+ }
12490
+ }
12491
+ }
12492
+ },
12493
+ "required": [
12494
+ "workflow"
12495
+ ],
12496
+ "returns": "Promise<WorkflowResult>"
12497
+ }
12498
+ },
12499
+ "getters": {
12500
+ "clientId": {
12501
+ "description": "The unique client ID used for WebSocket session tracking.",
12502
+ "returns": "string"
12503
+ },
12504
+ "wsURL": {
12505
+ "description": "The WebSocket URL derived from baseURL or overridden via options.",
12506
+ "returns": "string"
12507
+ }
12508
+ },
12509
+ "events": {
12510
+ "execution_start": {
12511
+ "name": "execution_start",
12512
+ "description": "Event emitted by ComfyUIClient",
12513
+ "arguments": {}
12514
+ },
12515
+ "execution_complete": {
12516
+ "name": "execution_complete",
12517
+ "description": "Event emitted by ComfyUIClient",
12518
+ "arguments": {}
12519
+ },
12520
+ "executing": {
12521
+ "name": "executing",
12522
+ "description": "Event emitted by ComfyUIClient",
12523
+ "arguments": {}
12524
+ },
12525
+ "progress": {
12526
+ "name": "progress",
12527
+ "description": "Event emitted by ComfyUIClient",
12528
+ "arguments": {}
12529
+ },
12530
+ "executed": {
12531
+ "name": "executed",
12532
+ "description": "Event emitted by ComfyUIClient",
12533
+ "arguments": {}
12534
+ },
12535
+ "execution_cached": {
12536
+ "name": "execution_cached",
12537
+ "description": "Event emitted by ComfyUIClient",
12538
+ "arguments": {}
12539
+ },
12540
+ "execution_error": {
12541
+ "name": "execution_error",
12542
+ "description": "Event emitted by ComfyUIClient",
12543
+ "arguments": {}
12544
+ }
12545
+ },
12546
+ "state": {},
12547
+ "options": {},
12548
+ "envVars": [],
12549
+ "examples": [
12550
+ {
12551
+ "language": "ts",
12552
+ "code": "const comfy = container.client('comfyui', { baseURL: 'http://localhost:8188' })\nconst result = await comfy.runWorkflow(workflow, {\n '6': { text: 'a beautiful sunset' }\n})\nconsole.log(result.images)"
12553
+ }
12554
+ ],
12555
+ "types": {
12556
+ "WorkflowRunOptions": {
12557
+ "description": "",
12558
+ "properties": {
12559
+ "poll": {
12560
+ "type": "boolean",
12561
+ "description": "Use polling instead of WebSocket for tracking execution",
12562
+ "optional": true
12563
+ },
12564
+ "pollInterval": {
12565
+ "type": "number",
12566
+ "description": "Polling interval in ms (default 1000)",
12567
+ "optional": true
12568
+ },
12569
+ "inputMap": {
12570
+ "type": "InputMapping",
12571
+ "description": "Named input mapping: semantic name -> { nodeId, field }",
12572
+ "optional": true
12573
+ },
12574
+ "outputDir": {
12575
+ "type": "string",
12576
+ "description": "If provided, output images are downloaded to this directory",
12577
+ "optional": true
12578
+ }
12579
+ }
12580
+ },
12581
+ "WorkflowResult": {
12582
+ "description": "",
12583
+ "properties": {
12584
+ "promptId": {
12585
+ "type": "string",
12586
+ "description": ""
12587
+ },
12588
+ "outputs": {
12589
+ "type": "Record<string, any>",
12590
+ "description": ""
12591
+ },
12592
+ "images": {
12593
+ "type": "Array<{ filename: string; subfolder: string; type: string; localPath?: string }>",
12594
+ "description": "",
12595
+ "optional": true
12596
+ }
12597
+ }
12598
+ }
12599
+ }
12600
+ });
12601
+
12602
+ setBuildTimeData('clients.elevenlabs', {
12603
+ "id": "clients.elevenlabs",
12604
+ "description": "ElevenLabs client — text-to-speech synthesis via the ElevenLabs REST API. Provides methods for listing voices, listing models, and generating speech audio. Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.",
12605
+ "shortcut": "clients.elevenlabs",
12606
+ "className": "ElevenLabsClient",
12607
+ "methods": {
12608
+ "beforeRequest": {
12609
+ "description": "Inject the xi-api-key header before each request.",
12610
+ "parameters": {},
12611
+ "required": [],
12612
+ "returns": "void"
12613
+ },
12614
+ "connect": {
12615
+ "description": "Validate the API key by listing available models.",
12616
+ "parameters": {},
12617
+ "required": [],
12618
+ "returns": "Promise<this>",
12619
+ "examples": [
12620
+ {
12621
+ "language": "ts",
12622
+ "code": "await el.connect()"
12623
+ }
12624
+ ]
12625
+ },
12626
+ "listVoices": {
12627
+ "description": "List available voices with optional search and filtering.",
12628
+ "parameters": {
12629
+ "options": {
12630
+ "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
12631
+ "description": "Query parameters for filtering voices"
12632
+ }
12633
+ },
12634
+ "required": [],
12635
+ "returns": "Promise<any>",
12636
+ "examples": [
12637
+ {
12638
+ "language": "ts",
12639
+ "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
12640
+ }
12641
+ ]
12642
+ },
12643
+ "getVoice": {
12644
+ "description": "Get details for a single voice.",
12679
12645
  "parameters": {
12680
- "filename": {
12646
+ "voiceId": {
12681
12647
  "type": "string",
12682
- "description": "The image filename"
12683
- },
12684
- "subfolder": {
12685
- "type": "any",
12686
- "description": "Subfolder within the output directory"
12687
- },
12688
- "type": {
12689
- "type": "any",
12690
- "description": "Image type ('output', 'input', 'temp')"
12648
+ "description": "The voice ID to look up"
12691
12649
  }
12692
12650
  },
12693
12651
  "required": [
12694
- "filename"
12652
+ "voiceId"
12695
12653
  ],
12696
- "returns": "Promise<Buffer>"
12697
- },
12698
- "connectWs": {
12699
- "description": "Open a WebSocket connection to ComfyUI for real-time execution tracking. Events emitted: `execution_start`, `executing`, `progress`, `executed`, `execution_cached`, `execution_error`, `execution_complete`.",
12700
- "parameters": {},
12701
- "required": [],
12702
- "returns": "Promise<void>"
12654
+ "returns": "Promise<any>",
12655
+ "examples": [
12656
+ {
12657
+ "language": "ts",
12658
+ "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
12659
+ }
12660
+ ]
12703
12661
  },
12704
- "disconnectWs": {
12705
- "description": "Close the WebSocket connection.",
12662
+ "listModels": {
12663
+ "description": "List available TTS models.",
12706
12664
  "parameters": {},
12707
12665
  "required": [],
12708
- "returns": "void"
12666
+ "returns": "Promise<any[]>",
12667
+ "examples": [
12668
+ {
12669
+ "language": "ts",
12670
+ "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
12671
+ }
12672
+ ]
12709
12673
  },
12710
- "toApiFormat": {
12711
- "description": "Convert a UI-format workflow to the API format that /prompt expects. Requires a running ComfyUI instance to fetch `object_info` so we can map positional `widgets_values` to their named input fields. If the workflow is already in API format, it's returned as-is.",
12674
+ "synthesize": {
12675
+ "description": "Synthesize speech from text, returning audio as a Buffer.",
12712
12676
  "parameters": {
12713
- "workflow": {
12714
- "type": "Record<string, any>",
12715
- "description": "Parameter workflow"
12677
+ "text": {
12678
+ "type": "string",
12679
+ "description": "The text to convert to speech"
12680
+ },
12681
+ "options": {
12682
+ "type": "SynthesizeOptions",
12683
+ "description": "Voice, model, format, and voice settings overrides",
12684
+ "properties": {
12685
+ "voiceId": {
12686
+ "type": "string",
12687
+ "description": ""
12688
+ },
12689
+ "modelId": {
12690
+ "type": "string",
12691
+ "description": ""
12692
+ },
12693
+ "outputFormat": {
12694
+ "type": "string",
12695
+ "description": ""
12696
+ },
12697
+ "voiceSettings": {
12698
+ "type": "ElevenLabsVoiceSettings",
12699
+ "description": ""
12700
+ },
12701
+ "disableCache": {
12702
+ "type": "boolean",
12703
+ "description": ""
12704
+ }
12705
+ }
12716
12706
  }
12717
12707
  },
12718
12708
  "required": [
12719
- "workflow"
12709
+ "text"
12720
12710
  ],
12721
- "returns": "Promise<Record<string, any>>"
12711
+ "returns": "Promise<Buffer>",
12712
+ "examples": [
12713
+ {
12714
+ "language": "ts",
12715
+ "code": "const audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data\n\nconst custom = await el.synthesize('Hello', {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n voiceSettings: { stability: 0.5, similarityBoost: 0.8 }\n})"
12716
+ }
12717
+ ]
12722
12718
  },
12723
- "runWorkflow": {
12724
- "description": "Run a ComfyUI workflow with optional runtime input overrides. Inputs can be provided in two forms: **Direct node mapping** (when no `inputMap` in options): ``` { '3': { seed: 42 }, '6': { text: 'a cat' } } ``` **Named inputs** (when `inputMap` is provided in options): ``` inputs: { positive_prompt: 'a cat', seed: 42 } options.inputMap: { positive_prompt: { nodeId: '6', field: 'text' }, seed: { nodeId: '3', field: 'seed' } } ```",
12719
+ "say": {
12720
+ "description": "Synthesize speech and write the audio to a file.",
12725
12721
  "parameters": {
12726
- "workflow": {
12727
- "type": "Record<string, any>",
12728
- "description": "Parameter workflow"
12722
+ "text": {
12723
+ "type": "string",
12724
+ "description": "The text to convert to speech"
12729
12725
  },
12730
- "inputs": {
12731
- "type": "Record<string, any>",
12732
- "description": "Parameter inputs"
12726
+ "outputPath": {
12727
+ "type": "string",
12728
+ "description": "File path to write the audio to"
12733
12729
  },
12734
12730
  "options": {
12735
- "type": "WorkflowRunOptions",
12736
- "description": "Parameter options",
12731
+ "type": "SynthesizeOptions",
12732
+ "description": "Voice, model, format, and voice settings overrides",
12737
12733
  "properties": {
12738
- "poll": {
12739
- "type": "boolean",
12740
- "description": "Use polling instead of WebSocket for tracking execution"
12741
- },
12742
- "pollInterval": {
12743
- "type": "number",
12744
- "description": "Polling interval in ms (default 1000)"
12734
+ "voiceId": {
12735
+ "type": "string",
12736
+ "description": ""
12745
12737
  },
12746
- "inputMap": {
12747
- "type": "InputMapping",
12748
- "description": "Named input mapping: semantic name -> { nodeId, field }"
12738
+ "modelId": {
12739
+ "type": "string",
12740
+ "description": ""
12749
12741
  },
12750
- "outputDir": {
12742
+ "outputFormat": {
12751
12743
  "type": "string",
12752
- "description": "If provided, output images are downloaded to this directory"
12744
+ "description": ""
12745
+ },
12746
+ "voiceSettings": {
12747
+ "type": "ElevenLabsVoiceSettings",
12748
+ "description": ""
12749
+ },
12750
+ "disableCache": {
12751
+ "type": "boolean",
12752
+ "description": ""
12753
12753
  }
12754
12754
  }
12755
12755
  }
12756
12756
  },
12757
12757
  "required": [
12758
- "workflow"
12758
+ "text",
12759
+ "outputPath"
12759
12760
  ],
12760
- "returns": "Promise<WorkflowResult>"
12761
+ "returns": "Promise<string>",
12762
+ "examples": [
12763
+ {
12764
+ "language": "ts",
12765
+ "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
12766
+ }
12767
+ ]
12761
12768
  }
12762
12769
  },
12763
12770
  "getters": {
12764
- "clientId": {
12765
- "description": "The unique client ID used for WebSocket session tracking.",
12766
- "returns": "string"
12767
- },
12768
- "wsURL": {
12769
- "description": "The WebSocket URL derived from baseURL or overridden via options.",
12771
+ "apiKey": {
12772
+ "description": "The resolved API key from options or environment.",
12770
12773
  "returns": "string"
12771
12774
  }
12772
12775
  },
12773
12776
  "events": {
12774
- "execution_start": {
12775
- "name": "execution_start",
12776
- "description": "Event emitted by ComfyUIClient",
12777
- "arguments": {}
12778
- },
12779
- "execution_complete": {
12780
- "name": "execution_complete",
12781
- "description": "Event emitted by ComfyUIClient",
12782
- "arguments": {}
12783
- },
12784
- "executing": {
12785
- "name": "executing",
12786
- "description": "Event emitted by ComfyUIClient",
12787
- "arguments": {}
12788
- },
12789
- "progress": {
12790
- "name": "progress",
12791
- "description": "Event emitted by ComfyUIClient",
12792
- "arguments": {}
12793
- },
12794
- "executed": {
12795
- "name": "executed",
12796
- "description": "Event emitted by ComfyUIClient",
12777
+ "failure": {
12778
+ "name": "failure",
12779
+ "description": "Event emitted by ElevenLabsClient",
12797
12780
  "arguments": {}
12798
12781
  },
12799
- "execution_cached": {
12800
- "name": "execution_cached",
12801
- "description": "Event emitted by ComfyUIClient",
12782
+ "voices": {
12783
+ "name": "voices",
12784
+ "description": "Event emitted by ElevenLabsClient",
12802
12785
  "arguments": {}
12803
12786
  },
12804
- "execution_error": {
12805
- "name": "execution_error",
12806
- "description": "Event emitted by ComfyUIClient",
12787
+ "speech": {
12788
+ "name": "speech",
12789
+ "description": "Event emitted by ElevenLabsClient",
12807
12790
  "arguments": {}
12808
12791
  }
12809
12792
  },
@@ -12813,48 +12796,65 @@ setBuildTimeData('clients.comfyui', {
12813
12796
  "examples": [
12814
12797
  {
12815
12798
  "language": "ts",
12816
- "code": "const comfy = container.client('comfyui', { baseURL: 'http://localhost:8188' })\nconst result = await comfy.runWorkflow(workflow, {\n '6': { text: 'a beautiful sunset' }\n})\nconsole.log(result.images)"
12799
+ "code": "const el = container.client('elevenlabs')\nawait el.connect()\nconst voices = await el.listVoices()\nconst audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data"
12817
12800
  }
12818
12801
  ],
12819
12802
  "types": {
12820
- "WorkflowRunOptions": {
12803
+ "SynthesizeOptions": {
12821
12804
  "description": "",
12822
12805
  "properties": {
12823
- "poll": {
12824
- "type": "boolean",
12825
- "description": "Use polling instead of WebSocket for tracking execution",
12806
+ "voiceId": {
12807
+ "type": "string",
12808
+ "description": "",
12826
12809
  "optional": true
12827
12810
  },
12828
- "pollInterval": {
12829
- "type": "number",
12830
- "description": "Polling interval in ms (default 1000)",
12811
+ "modelId": {
12812
+ "type": "string",
12813
+ "description": "",
12831
12814
  "optional": true
12832
12815
  },
12833
- "inputMap": {
12834
- "type": "InputMapping",
12835
- "description": "Named input mapping: semantic name -> { nodeId, field }",
12816
+ "outputFormat": {
12817
+ "type": "string",
12818
+ "description": "",
12836
12819
  "optional": true
12837
12820
  },
12838
- "outputDir": {
12839
- "type": "string",
12840
- "description": "If provided, output images are downloaded to this directory",
12821
+ "voiceSettings": {
12822
+ "type": "ElevenLabsVoiceSettings",
12823
+ "description": "",
12824
+ "optional": true
12825
+ },
12826
+ "disableCache": {
12827
+ "type": "boolean",
12828
+ "description": "",
12841
12829
  "optional": true
12842
12830
  }
12843
12831
  }
12844
12832
  },
12845
- "WorkflowResult": {
12833
+ "ElevenLabsVoiceSettings": {
12846
12834
  "description": "",
12847
12835
  "properties": {
12848
- "promptId": {
12849
- "type": "string",
12850
- "description": ""
12836
+ "stability": {
12837
+ "type": "number",
12838
+ "description": "",
12839
+ "optional": true
12851
12840
  },
12852
- "outputs": {
12853
- "type": "Record<string, any>",
12854
- "description": ""
12841
+ "similarityBoost": {
12842
+ "type": "number",
12843
+ "description": "",
12844
+ "optional": true
12845
+ },
12846
+ "style": {
12847
+ "type": "number",
12848
+ "description": "",
12849
+ "optional": true
12850
+ },
12851
+ "speed": {
12852
+ "type": "number",
12853
+ "description": "",
12854
+ "optional": true
12855
12855
  },
12856
- "images": {
12857
- "type": "Array<{ filename: string; subfolder: string; type: string; localPath?: string }>",
12856
+ "useSpeakerBoost": {
12857
+ "type": "boolean",
12858
12858
  "description": "",
12859
12859
  "optional": true
12860
12860
  }
@@ -25297,549 +25297,186 @@ export const introspectionData = [
25297
25297
  "type": "string",
25298
25298
  "description": "Optional operation name when the mutation contains multiple operations"
25299
25299
  }
25300
- },
25301
- "required": [
25302
- "mutation"
25303
- ],
25304
- "returns": "Promise<R>"
25305
- }
25306
- },
25307
- "getters": {
25308
- "endpoint": {
25309
- "description": "The GraphQL endpoint path. Defaults to '/graphql'.",
25310
- "returns": "any"
25311
- }
25312
- },
25313
- "events": {
25314
- "graphqlError": {
25315
- "name": "graphqlError",
25316
- "description": "Event emitted by GraphClient",
25317
- "arguments": {}
25318
- },
25319
- "failure": {
25320
- "name": "failure",
25321
- "description": "Event emitted by GraphClient",
25322
- "arguments": {}
25323
- }
25324
- },
25325
- "state": {},
25326
- "options": {},
25327
- "envVars": [],
25328
- "examples": [
25329
- {
25330
- "language": "ts",
25331
- "code": "const gql = container.client('graph', { baseURL: 'https://api.example.com' })\nconst data = await gql.query(`{ users { id name } }`)\nawait gql.mutate(`mutation($name: String!) { createUser(name: $name) { id } }`, { name: 'Alice' })"
25332
- }
25333
- ]
25334
- },
25335
- {
25336
- "id": "clients.rest",
25337
- "description": "HTTP REST client built on top of axios. Provides convenience methods for GET, POST, PUT, PATCH, and DELETE requests with automatic JSON handling, configurable base URL, and error event emission.",
25338
- "shortcut": "clients.rest",
25339
- "className": "RestClient",
25340
- "methods": {
25341
- "beforeRequest": {
25342
- "description": "",
25343
- "parameters": {},
25344
- "required": [],
25345
- "returns": "Promise<void>"
25346
- },
25347
- "patch": {
25348
- "description": "Send a PATCH request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25349
- "parameters": {
25350
- "url": {
25351
- "type": "string",
25352
- "description": "Request path relative to baseURL"
25353
- },
25354
- "data": {
25355
- "type": "any",
25356
- "description": "Request body"
25357
- },
25358
- "options": {
25359
- "type": "AxiosRequestConfig",
25360
- "description": "Additional axios request config"
25361
- }
25362
- },
25363
- "required": [
25364
- "url"
25365
- ],
25366
- "returns": "Promise<any>"
25367
- },
25368
- "put": {
25369
- "description": "Send a PUT request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25370
- "parameters": {
25371
- "url": {
25372
- "type": "string",
25373
- "description": "Request path relative to baseURL"
25374
- },
25375
- "data": {
25376
- "type": "any",
25377
- "description": "Request body"
25378
- },
25379
- "options": {
25380
- "type": "AxiosRequestConfig",
25381
- "description": "Additional axios request config"
25382
- }
25383
- },
25384
- "required": [
25385
- "url"
25386
- ],
25387
- "returns": "Promise<any>"
25388
- },
25389
- "post": {
25390
- "description": "Send a POST request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25391
- "parameters": {
25392
- "url": {
25393
- "type": "string",
25394
- "description": "Request path relative to baseURL"
25395
- },
25396
- "data": {
25397
- "type": "any",
25398
- "description": "Request body"
25399
- },
25400
- "options": {
25401
- "type": "AxiosRequestConfig",
25402
- "description": "Additional axios request config"
25403
- }
25404
- },
25405
- "required": [
25406
- "url"
25407
- ],
25408
- "returns": "Promise<any>"
25409
- },
25410
- "delete": {
25411
- "description": "Send a DELETE request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25412
- "parameters": {
25413
- "url": {
25414
- "type": "string",
25415
- "description": "Request path relative to baseURL"
25416
- },
25417
- "params": {
25418
- "type": "any",
25419
- "description": "Query parameters"
25420
- },
25421
- "options": {
25422
- "type": "AxiosRequestConfig",
25423
- "description": "Additional axios request config"
25424
- }
25425
- },
25426
- "required": [
25427
- "url"
25428
- ],
25429
- "returns": "Promise<any>"
25430
- },
25431
- "get": {
25432
- "description": "Send a GET request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25433
- "parameters": {
25434
- "url": {
25435
- "type": "string",
25436
- "description": "Request path relative to baseURL"
25437
- },
25438
- "params": {
25439
- "type": "any",
25440
- "description": "Query parameters"
25441
- },
25442
- "options": {
25443
- "type": "AxiosRequestConfig",
25444
- "description": "Additional axios request config"
25445
- }
25446
- },
25447
- "required": [
25448
- "url"
25449
- ],
25450
- "returns": "Promise<any>"
25451
- },
25452
- "handleError": {
25453
- "description": "Handle an axios error by emitting 'failure' and returning the error as JSON.",
25454
- "parameters": {
25455
- "error": {
25456
- "type": "AxiosError",
25457
- "description": "Parameter error"
25458
- }
25459
- },
25460
- "required": [
25461
- "error"
25462
- ],
25463
- "returns": "Promise<object>"
25464
- }
25465
- },
25466
- "getters": {
25467
- "useJSON": {
25468
- "description": "Whether JSON content-type headers should be set automatically.",
25469
- "returns": "any"
25470
- },
25471
- "baseURL": {
25472
- "description": "",
25473
- "returns": "any"
25474
- }
25475
- },
25476
- "events": {
25477
- "failure": {
25478
- "name": "failure",
25479
- "description": "Event emitted by RestClient",
25480
- "arguments": {}
25481
- }
25482
- },
25483
- "state": {},
25484
- "options": {},
25485
- "envVars": [],
25486
- "examples": [
25487
- {
25488
- "language": "ts",
25489
- "code": "const api = container.client('rest', { baseURL: 'https://api.example.com', json: true })\nconst users = await api.get('/users')\nawait api.post('/users', { name: 'Alice' })"
25490
- }
25491
- ]
25492
- },
25493
- {
25494
- "id": "clients.websocket",
25495
- "description": "WebSocketClient helper",
25496
- "shortcut": "clients.websocket",
25497
- "className": "WebSocketClient",
25498
- "methods": {
25499
- "connect": {
25500
- "description": "Establish a WebSocket connection to the configured baseURL. Wires all raw WebSocket events (open, message, close, error) to the Helper event bus and updates connection state accordingly. Resolves once the connection is open; rejects on error.",
25501
- "parameters": {},
25502
- "required": [],
25503
- "returns": "Promise<this>"
25504
- },
25505
- "send": {
25506
- "description": "Send data over the WebSocket connection. Automatically JSON-serializes the payload. If not currently connected, attempts to connect first.",
25507
- "parameters": {
25508
- "data": {
25509
- "type": "any",
25510
- "description": "The data to send (will be JSON.stringify'd)"
25511
- }
25512
- },
25513
- "required": [
25514
- "data"
25515
- ],
25516
- "returns": "Promise<void>"
25517
- },
25518
- "ask": {
25519
- "description": "Send a request and wait for a correlated response. The message is sent with a unique `requestId`; the remote side is expected to reply with a message containing `replyTo` set to that same ID.",
25520
- "parameters": {
25521
- "type": {
25522
- "type": "string",
25523
- "description": "A string identifying the request type"
25524
- },
25525
- "data": {
25526
- "type": "any",
25527
- "description": "Optional payload to include with the request"
25528
- },
25529
- "timeout": {
25530
- "type": "any",
25531
- "description": "How long to wait for a response (default 10 000 ms)"
25532
- }
25533
- },
25534
- "required": [
25535
- "type"
25536
- ],
25537
- "returns": "Promise<R>",
25538
- "examples": [
25539
- {
25540
- "language": "ts",
25541
- "code": "const result = await ws.ask('getUser', { id: 42 })"
25542
- }
25543
- ]
25544
- },
25545
- "disconnect": {
25546
- "description": "Gracefully close the WebSocket connection. Suppresses auto-reconnect and updates connection state to disconnected.",
25547
- "parameters": {},
25548
- "required": [],
25549
- "returns": "Promise<this>"
25300
+ },
25301
+ "required": [
25302
+ "mutation"
25303
+ ],
25304
+ "returns": "Promise<R>"
25550
25305
  }
25551
25306
  },
25552
25307
  "getters": {
25553
- "hasError": {
25554
- "description": "Whether the client is in an error state.",
25308
+ "endpoint": {
25309
+ "description": "The GraphQL endpoint path. Defaults to '/graphql'.",
25555
25310
  "returns": "any"
25556
25311
  }
25557
25312
  },
25558
25313
  "events": {
25559
- "open": {
25560
- "name": "open",
25561
- "description": "Event emitted by WebSocketClient",
25562
- "arguments": {}
25563
- },
25564
- "error": {
25565
- "name": "error",
25566
- "description": "Event emitted by WebSocketClient",
25567
- "arguments": {}
25568
- },
25569
- "message": {
25570
- "name": "message",
25571
- "description": "Event emitted by WebSocketClient",
25572
- "arguments": {}
25573
- },
25574
- "close": {
25575
- "name": "close",
25576
- "description": "Event emitted by WebSocketClient",
25314
+ "graphqlError": {
25315
+ "name": "graphqlError",
25316
+ "description": "Event emitted by GraphClient",
25577
25317
  "arguments": {}
25578
25318
  },
25579
- "reconnecting": {
25580
- "name": "reconnecting",
25581
- "description": "Event emitted by WebSocketClient",
25319
+ "failure": {
25320
+ "name": "failure",
25321
+ "description": "Event emitted by GraphClient",
25582
25322
  "arguments": {}
25583
25323
  }
25584
25324
  },
25585
25325
  "state": {},
25586
25326
  "options": {},
25587
- "envVars": []
25327
+ "envVars": [],
25328
+ "examples": [
25329
+ {
25330
+ "language": "ts",
25331
+ "code": "const gql = container.client('graph', { baseURL: 'https://api.example.com' })\nconst data = await gql.query(`{ users { id name } }`)\nawait gql.mutate(`mutation($name: String!) { createUser(name: $name) { id } }`, { name: 'Alice' })"
25332
+ }
25333
+ ]
25588
25334
  },
25589
25335
  {
25590
- "id": "clients.openai",
25591
- "description": "OpenAI client wraps the OpenAI SDK for chat completions, responses API, embeddings, and image generation. Provides convenience methods for common operations while tracking token usage and request counts. Supports both the Chat Completions API and the newer Responses API.",
25592
- "shortcut": "clients.openai",
25593
- "className": "OpenAIClient",
25336
+ "id": "clients.rest",
25337
+ "description": "HTTP REST client built on top of axios. Provides convenience methods for GET, POST, PUT, PATCH, and DELETE requests with automatic JSON handling, configurable base URL, and error event emission.",
25338
+ "shortcut": "clients.rest",
25339
+ "className": "RestClient",
25594
25340
  "methods": {
25595
- "connect": {
25596
- "description": "Test the API connection by listing models.",
25341
+ "beforeRequest": {
25342
+ "description": "",
25597
25343
  "parameters": {},
25598
25344
  "required": [],
25599
- "returns": "Promise<this>",
25600
- "examples": [
25601
- {
25602
- "language": "ts",
25603
- "code": "await openai.connect()"
25604
- }
25605
- ]
25345
+ "returns": "Promise<void>"
25606
25346
  },
25607
- "createChatCompletion": {
25608
- "description": "Create a chat completion using the Chat Completions API.",
25347
+ "patch": {
25348
+ "description": "Send a PATCH request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25609
25349
  "parameters": {
25610
- "messages": {
25611
- "type": "OpenAI.Chat.Completions.ChatCompletionMessageParam[]",
25612
- "description": "Array of chat messages"
25350
+ "url": {
25351
+ "type": "string",
25352
+ "description": "Request path relative to baseURL"
25613
25353
  },
25614
- "options": {
25615
- "type": "Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams>",
25616
- "description": "Additional parameters for the completion"
25617
- }
25618
- },
25619
- "required": [
25620
- "messages"
25621
- ],
25622
- "returns": "Promise<OpenAI.Chat.Completions.ChatCompletion>",
25623
- "examples": [
25624
- {
25625
- "language": "ts",
25626
- "code": "const response = await openai.createChatCompletion([\n { role: 'system', content: 'You are a helpful assistant.' },\n { role: 'user', content: 'Hello!' }\n])\nconsole.log(response.choices[0]?.message?.content)"
25627
- }
25628
- ]
25629
- },
25630
- "createResponse": {
25631
- "description": "Create a response using the Responses API.",
25632
- "parameters": {
25633
- "input": {
25634
- "type": "OpenAI.Responses.ResponseInput | string",
25635
- "description": "The input prompt or message array"
25354
+ "data": {
25355
+ "type": "any",
25356
+ "description": "Request body"
25636
25357
  },
25637
25358
  "options": {
25638
- "type": "Partial<OpenAI.Responses.ResponseCreateParamsNonStreaming>",
25639
- "description": "Additional parameters for the response"
25359
+ "type": "AxiosRequestConfig",
25360
+ "description": "Additional axios request config"
25640
25361
  }
25641
25362
  },
25642
25363
  "required": [
25643
- "input"
25364
+ "url"
25644
25365
  ],
25645
- "returns": "Promise<OpenAI.Responses.Response>",
25646
- "examples": [
25647
- {
25648
- "language": "ts",
25649
- "code": "const response = await openai.createResponse('Explain quantum computing')"
25650
- }
25651
- ]
25366
+ "returns": "Promise<any>"
25652
25367
  },
25653
- "streamResponse": {
25654
- "description": "Stream a response using the Responses API.",
25368
+ "put": {
25369
+ "description": "Send a PUT request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25655
25370
  "parameters": {
25656
- "input": {
25657
- "type": "OpenAI.Responses.ResponseInput | string",
25658
- "description": "The input prompt or message array"
25371
+ "url": {
25372
+ "type": "string",
25373
+ "description": "Request path relative to baseURL"
25374
+ },
25375
+ "data": {
25376
+ "type": "any",
25377
+ "description": "Request body"
25659
25378
  },
25660
25379
  "options": {
25661
- "type": "Partial<OpenAI.Responses.ResponseCreateParamsStreaming>",
25662
- "description": "Additional parameters for the streaming response"
25380
+ "type": "AxiosRequestConfig",
25381
+ "description": "Additional axios request config"
25663
25382
  }
25664
25383
  },
25665
25384
  "required": [
25666
- "input"
25385
+ "url"
25667
25386
  ],
25668
- "returns": "Promise<AsyncIterable<OpenAI.Responses.ResponseStreamEvent>>",
25669
- "examples": [
25670
- {
25671
- "language": "ts",
25672
- "code": "const stream = await openai.streamResponse('Write a poem')\nfor await (const event of stream) {\n if (event.type === 'response.output_text.delta') {\n process.stdout.write(event.delta)\n }\n}"
25673
- }
25674
- ]
25387
+ "returns": "Promise<any>"
25675
25388
  },
25676
- "createCompletion": {
25677
- "description": "Create a legacy text completion.",
25389
+ "post": {
25390
+ "description": "Send a POST request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25678
25391
  "parameters": {
25679
- "prompt": {
25392
+ "url": {
25680
25393
  "type": "string",
25681
- "description": "The text prompt to complete"
25394
+ "description": "Request path relative to baseURL"
25682
25395
  },
25683
- "options": {
25684
- "type": "Partial<OpenAI.Completions.CompletionCreateParams>",
25685
- "description": "Additional parameters for the completion"
25686
- }
25687
- },
25688
- "required": [
25689
- "prompt"
25690
- ],
25691
- "returns": "Promise<OpenAI.Completions.Completion>",
25692
- "examples": [
25693
- {
25694
- "language": "ts",
25695
- "code": "const response = await openai.createCompletion('Once upon a time')"
25696
- }
25697
- ]
25698
- },
25699
- "createEmbedding": {
25700
- "description": "Create text embeddings for semantic search or similarity comparisons.",
25701
- "parameters": {
25702
- "input": {
25703
- "type": "string | string[]",
25704
- "description": "A string or array of strings to embed"
25396
+ "data": {
25397
+ "type": "any",
25398
+ "description": "Request body"
25705
25399
  },
25706
25400
  "options": {
25707
- "type": "Partial<OpenAI.Embeddings.EmbeddingCreateParams>",
25708
- "description": "Additional parameters (model, etc.)"
25401
+ "type": "AxiosRequestConfig",
25402
+ "description": "Additional axios request config"
25709
25403
  }
25710
25404
  },
25711
25405
  "required": [
25712
- "input"
25406
+ "url"
25713
25407
  ],
25714
- "returns": "Promise<OpenAI.Embeddings.CreateEmbeddingResponse>",
25715
- "examples": [
25716
- {
25717
- "language": "ts",
25718
- "code": "const response = await openai.createEmbedding('Hello world')\nconsole.log(response.data[0].embedding.length)"
25719
- }
25720
- ]
25408
+ "returns": "Promise<any>"
25721
25409
  },
25722
- "createImage": {
25723
- "description": "Generate an image from a text prompt using DALL-E.",
25410
+ "delete": {
25411
+ "description": "Send a DELETE request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25724
25412
  "parameters": {
25725
- "prompt": {
25413
+ "url": {
25726
25414
  "type": "string",
25727
- "description": "Description of the image to generate"
25415
+ "description": "Request path relative to baseURL"
25416
+ },
25417
+ "params": {
25418
+ "type": "any",
25419
+ "description": "Query parameters"
25728
25420
  },
25729
25421
  "options": {
25730
- "type": "Partial<OpenAI.Images.ImageGenerateParams>",
25731
- "description": "Additional parameters (size, n, etc.)"
25422
+ "type": "AxiosRequestConfig",
25423
+ "description": "Additional axios request config"
25732
25424
  }
25733
25425
  },
25734
25426
  "required": [
25735
- "prompt"
25427
+ "url"
25736
25428
  ],
25737
- "returns": "Promise<OpenAI.Images.ImagesResponse>",
25738
- "examples": [
25739
- {
25740
- "language": "ts",
25741
- "code": "const response = await openai.createImage('A sunset over mountains')\nconsole.log(response.data[0].url)"
25742
- }
25743
- ]
25744
- },
25745
- "listModels": {
25746
- "description": "List all available models.",
25747
- "parameters": {},
25748
- "required": [],
25749
- "returns": "Promise<OpenAI.Models.ModelsPage>",
25750
- "examples": [
25751
- {
25752
- "language": "ts",
25753
- "code": "const models = await openai.listModels()"
25754
- }
25755
- ]
25429
+ "returns": "Promise<any>"
25756
25430
  },
25757
- "ask": {
25758
- "description": "Ask a single question and get a text response. Convenience wrapper around `createChatCompletion` for simple Q&A.",
25431
+ "get": {
25432
+ "description": "Send a GET request. Returns the parsed response body directly (not an axios Response wrapper). On HTTP errors, returns the error as JSON instead of throwing.",
25759
25433
  "parameters": {
25760
- "question": {
25434
+ "url": {
25761
25435
  "type": "string",
25762
- "description": "The question to ask"
25436
+ "description": "Request path relative to baseURL"
25763
25437
  },
25764
- "options": {
25765
- "type": "Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams>",
25766
- "description": "Additional completion parameters"
25767
- }
25768
- },
25769
- "required": [
25770
- "question"
25771
- ],
25772
- "returns": "Promise<string>",
25773
- "examples": [
25774
- {
25775
- "language": "ts",
25776
- "code": "const answer = await openai.ask('What is 2 + 2?')\nconsole.log(answer) // '4'"
25777
- }
25778
- ]
25779
- },
25780
- "chat": {
25781
- "description": "Send a multi-turn conversation and get a text response. Convenience wrapper around `createChatCompletion` that returns just the text.",
25782
- "parameters": {
25783
- "messages": {
25784
- "type": "OpenAI.Chat.Completions.ChatCompletionMessageParam[]",
25785
- "description": "Array of chat messages"
25438
+ "params": {
25439
+ "type": "any",
25440
+ "description": "Query parameters"
25786
25441
  },
25787
25442
  "options": {
25788
- "type": "Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams>",
25789
- "description": "Additional completion parameters"
25443
+ "type": "AxiosRequestConfig",
25444
+ "description": "Additional axios request config"
25790
25445
  }
25791
25446
  },
25792
25447
  "required": [
25793
- "messages"
25448
+ "url"
25794
25449
  ],
25795
- "returns": "Promise<string>",
25796
- "examples": [
25797
- {
25798
- "language": "ts",
25799
- "code": "const reply = await openai.chat([\n { role: 'system', content: 'You are a pirate.' },\n { role: 'user', content: 'Hello!' }\n])"
25450
+ "returns": "Promise<any>"
25451
+ },
25452
+ "handleError": {
25453
+ "description": "Handle an axios error by emitting 'failure' and returning the error as JSON.",
25454
+ "parameters": {
25455
+ "error": {
25456
+ "type": "AxiosError",
25457
+ "description": "Parameter error"
25800
25458
  }
25801
- ]
25459
+ },
25460
+ "required": [
25461
+ "error"
25462
+ ],
25463
+ "returns": "Promise<object>"
25802
25464
  }
25803
25465
  },
25804
25466
  "getters": {
25805
- "defaultModel": {
25806
- "description": "The default model used for completions, from options or 'gpt-4o'.",
25807
- "returns": "string"
25467
+ "useJSON": {
25468
+ "description": "Whether JSON content-type headers should be set automatically.",
25469
+ "returns": "any"
25808
25470
  },
25809
- "raw": {
25810
- "description": "The underlying OpenAI SDK instance for advanced use cases.",
25811
- "returns": "OpenAI"
25471
+ "baseURL": {
25472
+ "description": "",
25473
+ "returns": "any"
25812
25474
  }
25813
25475
  },
25814
25476
  "events": {
25815
- "connected": {
25816
- "name": "connected",
25817
- "description": "Event emitted by OpenAIClient",
25818
- "arguments": {}
25819
- },
25820
25477
  "failure": {
25821
25478
  "name": "failure",
25822
- "description": "Event emitted by OpenAIClient",
25823
- "arguments": {}
25824
- },
25825
- "completion": {
25826
- "name": "completion",
25827
- "description": "Event emitted by OpenAIClient",
25828
- "arguments": {}
25829
- },
25830
- "embedding": {
25831
- "name": "embedding",
25832
- "description": "Event emitted by OpenAIClient",
25833
- "arguments": {}
25834
- },
25835
- "image": {
25836
- "name": "image",
25837
- "description": "Event emitted by OpenAIClient",
25838
- "arguments": {}
25839
- },
25840
- "models": {
25841
- "name": "models",
25842
- "description": "Event emitted by OpenAIClient",
25479
+ "description": "Event emitted by RestClient",
25843
25480
  "arguments": {}
25844
25481
  }
25845
25482
  },
@@ -25849,393 +25486,360 @@ export const introspectionData = [
25849
25486
  "examples": [
25850
25487
  {
25851
25488
  "language": "ts",
25852
- "code": "const openai = container.client('openai', { defaultModel: 'gpt-4o' })\nconst answer = await openai.ask('What is the meaning of life?')\nconsole.log(answer)"
25489
+ "code": "const api = container.client('rest', { baseURL: 'https://api.example.com', json: true })\nconst users = await api.get('/users')\nawait api.post('/users', { name: 'Alice' })"
25853
25490
  }
25854
25491
  ]
25855
25492
  },
25856
25493
  {
25857
- "id": "clients.supabase",
25858
- "description": "Supabase client for the Luca container system. Wraps the official `@supabase/supabase-js` SDK and exposes it through Luca's typed state, events, and introspection system. The SDK is isomorphic so this single implementation works in both Node and browser containers. Use `client.sdk` for full SDK access, or use the convenience wrappers for common operations (auth, database queries, storage, edge functions, realtime).",
25859
- "shortcut": "clients.supabase",
25860
- "className": "SupabaseClient",
25494
+ "id": "clients.websocket",
25495
+ "description": "WebSocketClient helper",
25496
+ "shortcut": "clients.websocket",
25497
+ "className": "WebSocketClient",
25861
25498
  "methods": {
25862
- "from": {
25863
- "description": "Start a query on a Postgres table or view.",
25864
- "parameters": {
25865
- "table": {
25866
- "type": "string",
25867
- "description": "The table or view name to query"
25868
- }
25869
- },
25870
- "required": [
25871
- "table"
25872
- ],
25873
- "returns": "void"
25499
+ "connect": {
25500
+ "description": "Establish a WebSocket connection to the configured baseURL. Wires all raw WebSocket events (open, message, close, error) to the Helper event bus and updates connection state accordingly. Resolves once the connection is open; rejects on error.",
25501
+ "parameters": {},
25502
+ "required": [],
25503
+ "returns": "Promise<this>"
25874
25504
  },
25875
- "rpc": {
25876
- "description": "Call a Postgres function (RPC).",
25505
+ "send": {
25506
+ "description": "Send data over the WebSocket connection. Automatically JSON-serializes the payload. If not currently connected, attempts to connect first.",
25877
25507
  "parameters": {
25878
- "fn": {
25879
- "type": "string",
25880
- "description": "The function name"
25881
- },
25882
- "params": {
25883
- "type": "Record<string, unknown>",
25884
- "description": "Arguments to pass to the function"
25885
- },
25886
- "options": {
25887
- "type": "{ head?: boolean; get?: boolean; count?: \"exact\" | \"planned\" | \"estimated\" }",
25888
- "description": "Optional settings (head, get, count)"
25508
+ "data": {
25509
+ "type": "any",
25510
+ "description": "The data to send (will be JSON.stringify'd)"
25889
25511
  }
25890
25512
  },
25891
25513
  "required": [
25892
- "fn"
25514
+ "data"
25893
25515
  ],
25894
- "returns": "void"
25516
+ "returns": "Promise<void>"
25895
25517
  },
25896
- "signInWithPassword": {
25897
- "description": "Sign in with email and password.",
25518
+ "ask": {
25519
+ "description": "Send a request and wait for a correlated response. The message is sent with a unique `requestId`; the remote side is expected to reply with a message containing `replyTo` set to that same ID.",
25898
25520
  "parameters": {
25899
- "email": {
25521
+ "type": {
25900
25522
  "type": "string",
25901
- "description": "Parameter email"
25523
+ "description": "A string identifying the request type"
25902
25524
  },
25903
- "password": {
25904
- "type": "string",
25905
- "description": "Parameter password"
25906
- }
25907
- },
25908
- "required": [
25909
- "email",
25910
- "password"
25911
- ],
25912
- "returns": "void"
25913
- },
25914
- "signUp": {
25915
- "description": "Create a new user account with email and password.",
25916
- "parameters": {
25917
- "email": {
25918
- "type": "string",
25919
- "description": "Parameter email"
25525
+ "data": {
25526
+ "type": "any",
25527
+ "description": "Optional payload to include with the request"
25920
25528
  },
25921
- "password": {
25922
- "type": "string",
25923
- "description": "Parameter password"
25529
+ "timeout": {
25530
+ "type": "any",
25531
+ "description": "How long to wait for a response (default 10 000 ms)"
25924
25532
  }
25925
25533
  },
25926
25534
  "required": [
25927
- "email",
25928
- "password"
25535
+ "type"
25929
25536
  ],
25930
- "returns": "void"
25537
+ "returns": "Promise<R>",
25538
+ "examples": [
25539
+ {
25540
+ "language": "ts",
25541
+ "code": "const result = await ws.ask('getUser', { id: 42 })"
25542
+ }
25543
+ ]
25931
25544
  },
25932
- "signOut": {
25933
- "description": "Sign the current user out.",
25545
+ "disconnect": {
25546
+ "description": "Gracefully close the WebSocket connection. Suppresses auto-reconnect and updates connection state to disconnected.",
25934
25547
  "parameters": {},
25935
25548
  "required": [],
25936
- "returns": "void"
25549
+ "returns": "Promise<this>"
25550
+ }
25551
+ },
25552
+ "getters": {
25553
+ "hasError": {
25554
+ "description": "Whether the client is in an error state.",
25555
+ "returns": "any"
25556
+ }
25557
+ },
25558
+ "events": {
25559
+ "open": {
25560
+ "name": "open",
25561
+ "description": "Event emitted by WebSocketClient",
25562
+ "arguments": {}
25937
25563
  },
25938
- "getSession": {
25939
- "description": "Get the current session, if any.",
25940
- "parameters": {},
25941
- "required": [],
25942
- "returns": "void"
25564
+ "error": {
25565
+ "name": "error",
25566
+ "description": "Event emitted by WebSocketClient",
25567
+ "arguments": {}
25943
25568
  },
25944
- "getUser": {
25945
- "description": "Get the current user, if any.",
25569
+ "message": {
25570
+ "name": "message",
25571
+ "description": "Event emitted by WebSocketClient",
25572
+ "arguments": {}
25573
+ },
25574
+ "close": {
25575
+ "name": "close",
25576
+ "description": "Event emitted by WebSocketClient",
25577
+ "arguments": {}
25578
+ },
25579
+ "reconnecting": {
25580
+ "name": "reconnecting",
25581
+ "description": "Event emitted by WebSocketClient",
25582
+ "arguments": {}
25583
+ }
25584
+ },
25585
+ "state": {},
25586
+ "options": {},
25587
+ "envVars": []
25588
+ },
25589
+ {
25590
+ "id": "clients.openai",
25591
+ "description": "OpenAI client — wraps the OpenAI SDK for chat completions, responses API, embeddings, and image generation. Provides convenience methods for common operations while tracking token usage and request counts. Supports both the Chat Completions API and the newer Responses API.",
25592
+ "shortcut": "clients.openai",
25593
+ "className": "OpenAIClient",
25594
+ "methods": {
25595
+ "connect": {
25596
+ "description": "Test the API connection by listing models.",
25946
25597
  "parameters": {},
25947
25598
  "required": [],
25948
- "returns": "void"
25599
+ "returns": "Promise<this>",
25600
+ "examples": [
25601
+ {
25602
+ "language": "ts",
25603
+ "code": "await openai.connect()"
25604
+ }
25605
+ ]
25949
25606
  },
25950
- "invoke": {
25951
- "description": "Invoke a Supabase Edge Function by name.",
25607
+ "createChatCompletion": {
25608
+ "description": "Create a chat completion using the Chat Completions API.",
25952
25609
  "parameters": {
25953
- "name": {
25954
- "type": "string",
25955
- "description": "Parameter name"
25610
+ "messages": {
25611
+ "type": "OpenAI.Chat.Completions.ChatCompletionMessageParam[]",
25612
+ "description": "Array of chat messages"
25613
+ },
25614
+ "options": {
25615
+ "type": "Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams>",
25616
+ "description": "Additional parameters for the completion"
25617
+ }
25618
+ },
25619
+ "required": [
25620
+ "messages"
25621
+ ],
25622
+ "returns": "Promise<OpenAI.Chat.Completions.ChatCompletion>",
25623
+ "examples": [
25624
+ {
25625
+ "language": "ts",
25626
+ "code": "const response = await openai.createChatCompletion([\n { role: 'system', content: 'You are a helpful assistant.' },\n { role: 'user', content: 'Hello!' }\n])\nconsole.log(response.choices[0]?.message?.content)"
25627
+ }
25628
+ ]
25629
+ },
25630
+ "createResponse": {
25631
+ "description": "Create a response using the Responses API.",
25632
+ "parameters": {
25633
+ "input": {
25634
+ "type": "OpenAI.Responses.ResponseInput | string",
25635
+ "description": "The input prompt or message array"
25956
25636
  },
25957
- "body": {
25958
- "type": "any",
25959
- "description": "Parameter body"
25637
+ "options": {
25638
+ "type": "Partial<OpenAI.Responses.ResponseCreateParamsNonStreaming>",
25639
+ "description": "Additional parameters for the response"
25960
25640
  }
25961
25641
  },
25962
25642
  "required": [
25963
- "name"
25643
+ "input"
25964
25644
  ],
25965
- "returns": "void"
25645
+ "returns": "Promise<OpenAI.Responses.Response>",
25646
+ "examples": [
25647
+ {
25648
+ "language": "ts",
25649
+ "code": "const response = await openai.createResponse('Explain quantum computing')"
25650
+ }
25651
+ ]
25966
25652
  },
25967
- "subscribe": {
25968
- "description": "Subscribe to realtime changes on a Postgres table.",
25653
+ "streamResponse": {
25654
+ "description": "Stream a response using the Responses API.",
25969
25655
  "parameters": {
25970
- "channelName": {
25971
- "type": "string",
25972
- "description": "A name for this subscription channel"
25973
- },
25974
- "table": {
25975
- "type": "string",
25976
- "description": "The table to listen to"
25977
- },
25978
- "callback": {
25979
- "type": "(payload: any) => void",
25980
- "description": "Called with the payload on each change"
25656
+ "input": {
25657
+ "type": "OpenAI.Responses.ResponseInput | string",
25658
+ "description": "The input prompt or message array"
25981
25659
  },
25982
- "event": {
25983
- "type": "\"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\"",
25984
- "description": "The event type to listen for (default: all changes)"
25660
+ "options": {
25661
+ "type": "Partial<OpenAI.Responses.ResponseCreateParamsStreaming>",
25662
+ "description": "Additional parameters for the streaming response"
25985
25663
  }
25986
25664
  },
25987
25665
  "required": [
25988
- "channelName",
25989
- "table",
25990
- "callback"
25666
+ "input"
25991
25667
  ],
25992
- "returns": "RealtimeChannel"
25668
+ "returns": "Promise<AsyncIterable<OpenAI.Responses.ResponseStreamEvent>>",
25669
+ "examples": [
25670
+ {
25671
+ "language": "ts",
25672
+ "code": "const stream = await openai.streamResponse('Write a poem')\nfor await (const event of stream) {\n if (event.type === 'response.output_text.delta') {\n process.stdout.write(event.delta)\n }\n}"
25673
+ }
25674
+ ]
25993
25675
  },
25994
- "unsubscribe": {
25995
- "description": "Unsubscribe and remove a realtime channel by name.",
25676
+ "createCompletion": {
25677
+ "description": "Create a legacy text completion.",
25996
25678
  "parameters": {
25997
- "channelName": {
25679
+ "prompt": {
25998
25680
  "type": "string",
25999
- "description": "The channel name to remove"
25681
+ "description": "The text prompt to complete"
25682
+ },
25683
+ "options": {
25684
+ "type": "Partial<OpenAI.Completions.CompletionCreateParams>",
25685
+ "description": "Additional parameters for the completion"
26000
25686
  }
26001
25687
  },
26002
25688
  "required": [
26003
- "channelName"
25689
+ "prompt"
26004
25690
  ],
26005
- "returns": "void"
26006
- },
26007
- "unsubscribeAll": {
26008
- "description": "Unsubscribe and remove all realtime channels.",
26009
- "parameters": {},
26010
- "required": [],
26011
- "returns": "void"
26012
- },
26013
- "connect": {
26014
- "description": "Connect is a no-op since the Supabase SDK initializes on construction. The client is ready to use immediately after creation.",
26015
- "parameters": {},
26016
- "required": [],
26017
- "returns": "void"
26018
- },
26019
- "disconnect": {
26020
- "description": "Disconnect by signing out and removing all realtime channels.",
26021
- "parameters": {},
26022
- "required": [],
26023
- "returns": "void"
26024
- }
26025
- },
26026
- "getters": {
26027
- "sdk": {
26028
- "description": "Returns the raw Supabase SDK client for full access to all SDK methods.",
26029
- "returns": "SupabaseSDKClient<any, any>"
26030
- },
26031
- "storage": {
26032
- "description": "Returns the Supabase Storage client for managing buckets and files.",
26033
- "returns": "any"
26034
- },
26035
- "functions": {
26036
- "description": "Returns the Supabase Functions client.",
26037
- "returns": "any"
26038
- }
26039
- },
26040
- "events": {},
26041
- "state": {},
26042
- "options": {},
26043
- "envVars": [],
26044
- "examples": [
26045
- {
26046
- "language": "ts",
26047
- "code": "const supabase = container.client('supabase', {\n supabaseUrl: 'https://xyz.supabase.co',\n supabaseKey: 'your-anon-key',\n})\n\n// Query data\nconst { data } = await supabase.from('users').select('*')\n\n// Auth\nawait supabase.signInWithPassword('user@example.com', 'password')\n\n// Realtime\nsupabase.subscribe('changes', 'users', (payload) => {\n console.log('Change:', payload)\n})"
26048
- }
26049
- ]
26050
- },
26051
- {
26052
- "id": "clients.elevenlabs",
26053
- "description": "ElevenLabs client — text-to-speech synthesis via the ElevenLabs REST API. Provides methods for listing voices, listing models, and generating speech audio. Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.",
26054
- "shortcut": "clients.elevenlabs",
26055
- "className": "ElevenLabsClient",
26056
- "methods": {
26057
- "beforeRequest": {
26058
- "description": "Inject the xi-api-key header before each request.",
26059
- "parameters": {},
26060
- "required": [],
26061
- "returns": "void"
26062
- },
26063
- "connect": {
26064
- "description": "Validate the API key by listing available models.",
26065
- "parameters": {},
26066
- "required": [],
26067
- "returns": "Promise<this>",
25691
+ "returns": "Promise<OpenAI.Completions.Completion>",
26068
25692
  "examples": [
26069
25693
  {
26070
25694
  "language": "ts",
26071
- "code": "await el.connect()"
25695
+ "code": "const response = await openai.createCompletion('Once upon a time')"
26072
25696
  }
26073
25697
  ]
26074
25698
  },
26075
- "listVoices": {
26076
- "description": "List available voices with optional search and filtering.",
25699
+ "createEmbedding": {
25700
+ "description": "Create text embeddings for semantic search or similarity comparisons.",
26077
25701
  "parameters": {
25702
+ "input": {
25703
+ "type": "string | string[]",
25704
+ "description": "A string or array of strings to embed"
25705
+ },
26078
25706
  "options": {
26079
- "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
26080
- "description": "Query parameters for filtering voices"
25707
+ "type": "Partial<OpenAI.Embeddings.EmbeddingCreateParams>",
25708
+ "description": "Additional parameters (model, etc.)"
26081
25709
  }
26082
25710
  },
26083
- "required": [],
26084
- "returns": "Promise<any>",
25711
+ "required": [
25712
+ "input"
25713
+ ],
25714
+ "returns": "Promise<OpenAI.Embeddings.CreateEmbeddingResponse>",
26085
25715
  "examples": [
26086
25716
  {
26087
25717
  "language": "ts",
26088
- "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
25718
+ "code": "const response = await openai.createEmbedding('Hello world')\nconsole.log(response.data[0].embedding.length)"
26089
25719
  }
26090
25720
  ]
26091
25721
  },
26092
- "getVoice": {
26093
- "description": "Get details for a single voice.",
25722
+ "createImage": {
25723
+ "description": "Generate an image from a text prompt using DALL-E.",
26094
25724
  "parameters": {
26095
- "voiceId": {
25725
+ "prompt": {
26096
25726
  "type": "string",
26097
- "description": "The voice ID to look up"
25727
+ "description": "Description of the image to generate"
25728
+ },
25729
+ "options": {
25730
+ "type": "Partial<OpenAI.Images.ImageGenerateParams>",
25731
+ "description": "Additional parameters (size, n, etc.)"
26098
25732
  }
26099
25733
  },
26100
25734
  "required": [
26101
- "voiceId"
25735
+ "prompt"
26102
25736
  ],
26103
- "returns": "Promise<any>",
25737
+ "returns": "Promise<OpenAI.Images.ImagesResponse>",
26104
25738
  "examples": [
26105
25739
  {
26106
25740
  "language": "ts",
26107
- "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
25741
+ "code": "const response = await openai.createImage('A sunset over mountains')\nconsole.log(response.data[0].url)"
26108
25742
  }
26109
25743
  ]
26110
25744
  },
26111
25745
  "listModels": {
26112
- "description": "List available TTS models.",
25746
+ "description": "List all available models.",
26113
25747
  "parameters": {},
26114
25748
  "required": [],
26115
- "returns": "Promise<any[]>",
25749
+ "returns": "Promise<OpenAI.Models.ModelsPage>",
26116
25750
  "examples": [
26117
25751
  {
26118
25752
  "language": "ts",
26119
- "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
25753
+ "code": "const models = await openai.listModels()"
26120
25754
  }
26121
25755
  ]
26122
25756
  },
26123
- "synthesize": {
26124
- "description": "Synthesize speech from text, returning audio as a Buffer.",
25757
+ "ask": {
25758
+ "description": "Ask a single question and get a text response. Convenience wrapper around `createChatCompletion` for simple Q&A.",
26125
25759
  "parameters": {
26126
- "text": {
25760
+ "question": {
26127
25761
  "type": "string",
26128
- "description": "The text to convert to speech"
25762
+ "description": "The question to ask"
26129
25763
  },
26130
25764
  "options": {
26131
- "type": "SynthesizeOptions",
26132
- "description": "Voice, model, format, and voice settings overrides",
26133
- "properties": {
26134
- "voiceId": {
26135
- "type": "string",
26136
- "description": ""
26137
- },
26138
- "modelId": {
26139
- "type": "string",
26140
- "description": ""
26141
- },
26142
- "outputFormat": {
26143
- "type": "string",
26144
- "description": ""
26145
- },
26146
- "voiceSettings": {
26147
- "type": "ElevenLabsVoiceSettings",
26148
- "description": ""
26149
- },
26150
- "disableCache": {
26151
- "type": "boolean",
26152
- "description": ""
26153
- }
26154
- }
25765
+ "type": "Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams>",
25766
+ "description": "Additional completion parameters"
26155
25767
  }
26156
25768
  },
26157
25769
  "required": [
26158
- "text"
25770
+ "question"
26159
25771
  ],
26160
- "returns": "Promise<Buffer>",
25772
+ "returns": "Promise<string>",
26161
25773
  "examples": [
26162
25774
  {
26163
25775
  "language": "ts",
26164
- "code": "const audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data\n\nconst custom = await el.synthesize('Hello', {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n voiceSettings: { stability: 0.5, similarityBoost: 0.8 }\n})"
25776
+ "code": "const answer = await openai.ask('What is 2 + 2?')\nconsole.log(answer) // '4'"
26165
25777
  }
26166
25778
  ]
26167
25779
  },
26168
- "say": {
26169
- "description": "Synthesize speech and write the audio to a file.",
26170
- "parameters": {
26171
- "text": {
26172
- "type": "string",
26173
- "description": "The text to convert to speech"
26174
- },
26175
- "outputPath": {
26176
- "type": "string",
26177
- "description": "File path to write the audio to"
26178
- },
26179
- "options": {
26180
- "type": "SynthesizeOptions",
26181
- "description": "Voice, model, format, and voice settings overrides",
26182
- "properties": {
26183
- "voiceId": {
26184
- "type": "string",
26185
- "description": ""
26186
- },
26187
- "modelId": {
26188
- "type": "string",
26189
- "description": ""
26190
- },
26191
- "outputFormat": {
26192
- "type": "string",
26193
- "description": ""
26194
- },
26195
- "voiceSettings": {
26196
- "type": "ElevenLabsVoiceSettings",
26197
- "description": ""
26198
- },
26199
- "disableCache": {
26200
- "type": "boolean",
26201
- "description": ""
26202
- }
26203
- }
25780
+ "chat": {
25781
+ "description": "Send a multi-turn conversation and get a text response. Convenience wrapper around `createChatCompletion` that returns just the text.",
25782
+ "parameters": {
25783
+ "messages": {
25784
+ "type": "OpenAI.Chat.Completions.ChatCompletionMessageParam[]",
25785
+ "description": "Array of chat messages"
25786
+ },
25787
+ "options": {
25788
+ "type": "Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams>",
25789
+ "description": "Additional completion parameters"
26204
25790
  }
26205
25791
  },
26206
25792
  "required": [
26207
- "text",
26208
- "outputPath"
25793
+ "messages"
26209
25794
  ],
26210
25795
  "returns": "Promise<string>",
26211
25796
  "examples": [
26212
25797
  {
26213
25798
  "language": "ts",
26214
- "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
25799
+ "code": "const reply = await openai.chat([\n { role: 'system', content: 'You are a pirate.' },\n { role: 'user', content: 'Hello!' }\n])"
26215
25800
  }
26216
25801
  ]
26217
25802
  }
26218
25803
  },
26219
25804
  "getters": {
26220
- "apiKey": {
26221
- "description": "The resolved API key from options or environment.",
25805
+ "defaultModel": {
25806
+ "description": "The default model used for completions, from options or 'gpt-4o'.",
26222
25807
  "returns": "string"
25808
+ },
25809
+ "raw": {
25810
+ "description": "The underlying OpenAI SDK instance for advanced use cases.",
25811
+ "returns": "OpenAI"
26223
25812
  }
26224
25813
  },
26225
25814
  "events": {
25815
+ "connected": {
25816
+ "name": "connected",
25817
+ "description": "Event emitted by OpenAIClient",
25818
+ "arguments": {}
25819
+ },
26226
25820
  "failure": {
26227
25821
  "name": "failure",
26228
- "description": "Event emitted by ElevenLabsClient",
25822
+ "description": "Event emitted by OpenAIClient",
26229
25823
  "arguments": {}
26230
25824
  },
26231
- "voices": {
26232
- "name": "voices",
26233
- "description": "Event emitted by ElevenLabsClient",
25825
+ "completion": {
25826
+ "name": "completion",
25827
+ "description": "Event emitted by OpenAIClient",
26234
25828
  "arguments": {}
26235
25829
  },
26236
- "speech": {
26237
- "name": "speech",
26238
- "description": "Event emitted by ElevenLabsClient",
25830
+ "embedding": {
25831
+ "name": "embedding",
25832
+ "description": "Event emitted by OpenAIClient",
25833
+ "arguments": {}
25834
+ },
25835
+ "image": {
25836
+ "name": "image",
25837
+ "description": "Event emitted by OpenAIClient",
25838
+ "arguments": {}
25839
+ },
25840
+ "models": {
25841
+ "name": "models",
25842
+ "description": "Event emitted by OpenAIClient",
26239
25843
  "arguments": {}
26240
25844
  }
26241
25845
  },
@@ -26245,71 +25849,204 @@ export const introspectionData = [
26245
25849
  "examples": [
26246
25850
  {
26247
25851
  "language": "ts",
26248
- "code": "const el = container.client('elevenlabs')\nawait el.connect()\nconst voices = await el.listVoices()\nconst audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data"
25852
+ "code": "const openai = container.client('openai', { defaultModel: 'gpt-4o' })\nconst answer = await openai.ask('What is the meaning of life?')\nconsole.log(answer)"
26249
25853
  }
26250
- ],
26251
- "types": {
26252
- "SynthesizeOptions": {
26253
- "description": "",
26254
- "properties": {
26255
- "voiceId": {
25854
+ ]
25855
+ },
25856
+ {
25857
+ "id": "clients.supabase",
25858
+ "description": "Supabase client for the Luca container system. Wraps the official `@supabase/supabase-js` SDK and exposes it through Luca's typed state, events, and introspection system. The SDK is isomorphic so this single implementation works in both Node and browser containers. Use `client.sdk` for full SDK access, or use the convenience wrappers for common operations (auth, database queries, storage, edge functions, realtime).",
25859
+ "shortcut": "clients.supabase",
25860
+ "className": "SupabaseClient",
25861
+ "methods": {
25862
+ "from": {
25863
+ "description": "Start a query on a Postgres table or view.",
25864
+ "parameters": {
25865
+ "table": {
26256
25866
  "type": "string",
26257
- "description": "",
26258
- "optional": true
26259
- },
26260
- "modelId": {
25867
+ "description": "The table or view name to query"
25868
+ }
25869
+ },
25870
+ "required": [
25871
+ "table"
25872
+ ],
25873
+ "returns": "void"
25874
+ },
25875
+ "rpc": {
25876
+ "description": "Call a Postgres function (RPC).",
25877
+ "parameters": {
25878
+ "fn": {
26261
25879
  "type": "string",
26262
- "description": "",
26263
- "optional": true
25880
+ "description": "The function name"
26264
25881
  },
26265
- "outputFormat": {
25882
+ "params": {
25883
+ "type": "Record<string, unknown>",
25884
+ "description": "Arguments to pass to the function"
25885
+ },
25886
+ "options": {
25887
+ "type": "{ head?: boolean; get?: boolean; count?: \"exact\" | \"planned\" | \"estimated\" }",
25888
+ "description": "Optional settings (head, get, count)"
25889
+ }
25890
+ },
25891
+ "required": [
25892
+ "fn"
25893
+ ],
25894
+ "returns": "void"
25895
+ },
25896
+ "signInWithPassword": {
25897
+ "description": "Sign in with email and password.",
25898
+ "parameters": {
25899
+ "email": {
26266
25900
  "type": "string",
26267
- "description": "",
26268
- "optional": true
25901
+ "description": "Parameter email"
26269
25902
  },
26270
- "voiceSettings": {
26271
- "type": "ElevenLabsVoiceSettings",
26272
- "description": "",
26273
- "optional": true
25903
+ "password": {
25904
+ "type": "string",
25905
+ "description": "Parameter password"
25906
+ }
25907
+ },
25908
+ "required": [
25909
+ "email",
25910
+ "password"
25911
+ ],
25912
+ "returns": "void"
25913
+ },
25914
+ "signUp": {
25915
+ "description": "Create a new user account with email and password.",
25916
+ "parameters": {
25917
+ "email": {
25918
+ "type": "string",
25919
+ "description": "Parameter email"
26274
25920
  },
26275
- "disableCache": {
26276
- "type": "boolean",
26277
- "description": "",
26278
- "optional": true
25921
+ "password": {
25922
+ "type": "string",
25923
+ "description": "Parameter password"
26279
25924
  }
26280
- }
25925
+ },
25926
+ "required": [
25927
+ "email",
25928
+ "password"
25929
+ ],
25930
+ "returns": "void"
26281
25931
  },
26282
- "ElevenLabsVoiceSettings": {
26283
- "description": "",
26284
- "properties": {
26285
- "stability": {
26286
- "type": "number",
26287
- "description": "",
26288
- "optional": true
25932
+ "signOut": {
25933
+ "description": "Sign the current user out.",
25934
+ "parameters": {},
25935
+ "required": [],
25936
+ "returns": "void"
25937
+ },
25938
+ "getSession": {
25939
+ "description": "Get the current session, if any.",
25940
+ "parameters": {},
25941
+ "required": [],
25942
+ "returns": "void"
25943
+ },
25944
+ "getUser": {
25945
+ "description": "Get the current user, if any.",
25946
+ "parameters": {},
25947
+ "required": [],
25948
+ "returns": "void"
25949
+ },
25950
+ "invoke": {
25951
+ "description": "Invoke a Supabase Edge Function by name.",
25952
+ "parameters": {
25953
+ "name": {
25954
+ "type": "string",
25955
+ "description": "Parameter name"
26289
25956
  },
26290
- "similarityBoost": {
26291
- "type": "number",
26292
- "description": "",
26293
- "optional": true
25957
+ "body": {
25958
+ "type": "any",
25959
+ "description": "Parameter body"
25960
+ }
25961
+ },
25962
+ "required": [
25963
+ "name"
25964
+ ],
25965
+ "returns": "void"
25966
+ },
25967
+ "subscribe": {
25968
+ "description": "Subscribe to realtime changes on a Postgres table.",
25969
+ "parameters": {
25970
+ "channelName": {
25971
+ "type": "string",
25972
+ "description": "A name for this subscription channel"
26294
25973
  },
26295
- "style": {
26296
- "type": "number",
26297
- "description": "",
26298
- "optional": true
25974
+ "table": {
25975
+ "type": "string",
25976
+ "description": "The table to listen to"
26299
25977
  },
26300
- "speed": {
26301
- "type": "number",
26302
- "description": "",
26303
- "optional": true
25978
+ "callback": {
25979
+ "type": "(payload: any) => void",
25980
+ "description": "Called with the payload on each change"
26304
25981
  },
26305
- "useSpeakerBoost": {
26306
- "type": "boolean",
26307
- "description": "",
26308
- "optional": true
25982
+ "event": {
25983
+ "type": "\"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\"",
25984
+ "description": "The event type to listen for (default: all changes)"
26309
25985
  }
26310
- }
25986
+ },
25987
+ "required": [
25988
+ "channelName",
25989
+ "table",
25990
+ "callback"
25991
+ ],
25992
+ "returns": "RealtimeChannel"
25993
+ },
25994
+ "unsubscribe": {
25995
+ "description": "Unsubscribe and remove a realtime channel by name.",
25996
+ "parameters": {
25997
+ "channelName": {
25998
+ "type": "string",
25999
+ "description": "The channel name to remove"
26000
+ }
26001
+ },
26002
+ "required": [
26003
+ "channelName"
26004
+ ],
26005
+ "returns": "void"
26006
+ },
26007
+ "unsubscribeAll": {
26008
+ "description": "Unsubscribe and remove all realtime channels.",
26009
+ "parameters": {},
26010
+ "required": [],
26011
+ "returns": "void"
26012
+ },
26013
+ "connect": {
26014
+ "description": "Connect is a no-op since the Supabase SDK initializes on construction. The client is ready to use immediately after creation.",
26015
+ "parameters": {},
26016
+ "required": [],
26017
+ "returns": "void"
26018
+ },
26019
+ "disconnect": {
26020
+ "description": "Disconnect by signing out and removing all realtime channels.",
26021
+ "parameters": {},
26022
+ "required": [],
26023
+ "returns": "void"
26311
26024
  }
26312
- }
26025
+ },
26026
+ "getters": {
26027
+ "sdk": {
26028
+ "description": "Returns the raw Supabase SDK client for full access to all SDK methods.",
26029
+ "returns": "SupabaseSDKClient<any, any>"
26030
+ },
26031
+ "storage": {
26032
+ "description": "Returns the Supabase Storage client for managing buckets and files.",
26033
+ "returns": "any"
26034
+ },
26035
+ "functions": {
26036
+ "description": "Returns the Supabase Functions client.",
26037
+ "returns": "any"
26038
+ }
26039
+ },
26040
+ "events": {},
26041
+ "state": {},
26042
+ "options": {},
26043
+ "envVars": [],
26044
+ "examples": [
26045
+ {
26046
+ "language": "ts",
26047
+ "code": "const supabase = container.client('supabase', {\n supabaseUrl: 'https://xyz.supabase.co',\n supabaseKey: 'your-anon-key',\n})\n\n// Query data\nconst { data } = await supabase.from('users').select('*')\n\n// Auth\nawait supabase.signInWithPassword('user@example.com', 'password')\n\n// Realtime\nsupabase.subscribe('changes', 'users', (payload) => {\n console.log('Change:', payload)\n})"
26048
+ }
26049
+ ]
26313
26050
  },
26314
26051
  {
26315
26052
  "id": "clients.comfyui",
@@ -26422,133 +26159,379 @@ export const introspectionData = [
26422
26159
  "viewImage": {
26423
26160
  "description": "Download a generated image from ComfyUI as a Buffer.",
26424
26161
  "parameters": {
26425
- "filename": {
26162
+ "filename": {
26163
+ "type": "string",
26164
+ "description": "The image filename"
26165
+ },
26166
+ "subfolder": {
26167
+ "type": "any",
26168
+ "description": "Subfolder within the output directory"
26169
+ },
26170
+ "type": {
26171
+ "type": "any",
26172
+ "description": "Image type ('output', 'input', 'temp')"
26173
+ }
26174
+ },
26175
+ "required": [
26176
+ "filename"
26177
+ ],
26178
+ "returns": "Promise<Buffer>"
26179
+ },
26180
+ "connectWs": {
26181
+ "description": "Open a WebSocket connection to ComfyUI for real-time execution tracking. Events emitted: `execution_start`, `executing`, `progress`, `executed`, `execution_cached`, `execution_error`, `execution_complete`.",
26182
+ "parameters": {},
26183
+ "required": [],
26184
+ "returns": "Promise<void>"
26185
+ },
26186
+ "disconnectWs": {
26187
+ "description": "Close the WebSocket connection.",
26188
+ "parameters": {},
26189
+ "required": [],
26190
+ "returns": "void"
26191
+ },
26192
+ "toApiFormat": {
26193
+ "description": "Convert a UI-format workflow to the API format that /prompt expects. Requires a running ComfyUI instance to fetch `object_info` so we can map positional `widgets_values` to their named input fields. If the workflow is already in API format, it's returned as-is.",
26194
+ "parameters": {
26195
+ "workflow": {
26196
+ "type": "Record<string, any>",
26197
+ "description": "Parameter workflow"
26198
+ }
26199
+ },
26200
+ "required": [
26201
+ "workflow"
26202
+ ],
26203
+ "returns": "Promise<Record<string, any>>"
26204
+ },
26205
+ "runWorkflow": {
26206
+ "description": "Run a ComfyUI workflow with optional runtime input overrides. Inputs can be provided in two forms: **Direct node mapping** (when no `inputMap` in options): ``` { '3': { seed: 42 }, '6': { text: 'a cat' } } ``` **Named inputs** (when `inputMap` is provided in options): ``` inputs: { positive_prompt: 'a cat', seed: 42 } options.inputMap: { positive_prompt: { nodeId: '6', field: 'text' }, seed: { nodeId: '3', field: 'seed' } } ```",
26207
+ "parameters": {
26208
+ "workflow": {
26209
+ "type": "Record<string, any>",
26210
+ "description": "Parameter workflow"
26211
+ },
26212
+ "inputs": {
26213
+ "type": "Record<string, any>",
26214
+ "description": "Parameter inputs"
26215
+ },
26216
+ "options": {
26217
+ "type": "WorkflowRunOptions",
26218
+ "description": "Parameter options",
26219
+ "properties": {
26220
+ "poll": {
26221
+ "type": "boolean",
26222
+ "description": "Use polling instead of WebSocket for tracking execution"
26223
+ },
26224
+ "pollInterval": {
26225
+ "type": "number",
26226
+ "description": "Polling interval in ms (default 1000)"
26227
+ },
26228
+ "inputMap": {
26229
+ "type": "InputMapping",
26230
+ "description": "Named input mapping: semantic name -> { nodeId, field }"
26231
+ },
26232
+ "outputDir": {
26233
+ "type": "string",
26234
+ "description": "If provided, output images are downloaded to this directory"
26235
+ }
26236
+ }
26237
+ }
26238
+ },
26239
+ "required": [
26240
+ "workflow"
26241
+ ],
26242
+ "returns": "Promise<WorkflowResult>"
26243
+ }
26244
+ },
26245
+ "getters": {
26246
+ "clientId": {
26247
+ "description": "The unique client ID used for WebSocket session tracking.",
26248
+ "returns": "string"
26249
+ },
26250
+ "wsURL": {
26251
+ "description": "The WebSocket URL derived from baseURL or overridden via options.",
26252
+ "returns": "string"
26253
+ }
26254
+ },
26255
+ "events": {
26256
+ "execution_start": {
26257
+ "name": "execution_start",
26258
+ "description": "Event emitted by ComfyUIClient",
26259
+ "arguments": {}
26260
+ },
26261
+ "execution_complete": {
26262
+ "name": "execution_complete",
26263
+ "description": "Event emitted by ComfyUIClient",
26264
+ "arguments": {}
26265
+ },
26266
+ "executing": {
26267
+ "name": "executing",
26268
+ "description": "Event emitted by ComfyUIClient",
26269
+ "arguments": {}
26270
+ },
26271
+ "progress": {
26272
+ "name": "progress",
26273
+ "description": "Event emitted by ComfyUIClient",
26274
+ "arguments": {}
26275
+ },
26276
+ "executed": {
26277
+ "name": "executed",
26278
+ "description": "Event emitted by ComfyUIClient",
26279
+ "arguments": {}
26280
+ },
26281
+ "execution_cached": {
26282
+ "name": "execution_cached",
26283
+ "description": "Event emitted by ComfyUIClient",
26284
+ "arguments": {}
26285
+ },
26286
+ "execution_error": {
26287
+ "name": "execution_error",
26288
+ "description": "Event emitted by ComfyUIClient",
26289
+ "arguments": {}
26290
+ }
26291
+ },
26292
+ "state": {},
26293
+ "options": {},
26294
+ "envVars": [],
26295
+ "examples": [
26296
+ {
26297
+ "language": "ts",
26298
+ "code": "const comfy = container.client('comfyui', { baseURL: 'http://localhost:8188' })\nconst result = await comfy.runWorkflow(workflow, {\n '6': { text: 'a beautiful sunset' }\n})\nconsole.log(result.images)"
26299
+ }
26300
+ ],
26301
+ "types": {
26302
+ "WorkflowRunOptions": {
26303
+ "description": "",
26304
+ "properties": {
26305
+ "poll": {
26306
+ "type": "boolean",
26307
+ "description": "Use polling instead of WebSocket for tracking execution",
26308
+ "optional": true
26309
+ },
26310
+ "pollInterval": {
26311
+ "type": "number",
26312
+ "description": "Polling interval in ms (default 1000)",
26313
+ "optional": true
26314
+ },
26315
+ "inputMap": {
26316
+ "type": "InputMapping",
26317
+ "description": "Named input mapping: semantic name -> { nodeId, field }",
26318
+ "optional": true
26319
+ },
26320
+ "outputDir": {
26321
+ "type": "string",
26322
+ "description": "If provided, output images are downloaded to this directory",
26323
+ "optional": true
26324
+ }
26325
+ }
26326
+ },
26327
+ "WorkflowResult": {
26328
+ "description": "",
26329
+ "properties": {
26330
+ "promptId": {
26331
+ "type": "string",
26332
+ "description": ""
26333
+ },
26334
+ "outputs": {
26335
+ "type": "Record<string, any>",
26336
+ "description": ""
26337
+ },
26338
+ "images": {
26339
+ "type": "Array<{ filename: string; subfolder: string; type: string; localPath?: string }>",
26340
+ "description": "",
26341
+ "optional": true
26342
+ }
26343
+ }
26344
+ }
26345
+ }
26346
+ },
26347
+ {
26348
+ "id": "clients.elevenlabs",
26349
+ "description": "ElevenLabs client — text-to-speech synthesis via the ElevenLabs REST API. Provides methods for listing voices, listing models, and generating speech audio. Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.",
26350
+ "shortcut": "clients.elevenlabs",
26351
+ "className": "ElevenLabsClient",
26352
+ "methods": {
26353
+ "beforeRequest": {
26354
+ "description": "Inject the xi-api-key header before each request.",
26355
+ "parameters": {},
26356
+ "required": [],
26357
+ "returns": "void"
26358
+ },
26359
+ "connect": {
26360
+ "description": "Validate the API key by listing available models.",
26361
+ "parameters": {},
26362
+ "required": [],
26363
+ "returns": "Promise<this>",
26364
+ "examples": [
26365
+ {
26366
+ "language": "ts",
26367
+ "code": "await el.connect()"
26368
+ }
26369
+ ]
26370
+ },
26371
+ "listVoices": {
26372
+ "description": "List available voices with optional search and filtering.",
26373
+ "parameters": {
26374
+ "options": {
26375
+ "type": "{\n search?: string\n category?: string\n voice_type?: string\n page_size?: number\n next_page_token?: string\n }",
26376
+ "description": "Query parameters for filtering voices"
26377
+ }
26378
+ },
26379
+ "required": [],
26380
+ "returns": "Promise<any>",
26381
+ "examples": [
26382
+ {
26383
+ "language": "ts",
26384
+ "code": "const voices = await el.listVoices()\nconst premade = await el.listVoices({ category: 'premade' })"
26385
+ }
26386
+ ]
26387
+ },
26388
+ "getVoice": {
26389
+ "description": "Get details for a single voice.",
26390
+ "parameters": {
26391
+ "voiceId": {
26426
26392
  "type": "string",
26427
- "description": "The image filename"
26428
- },
26429
- "subfolder": {
26430
- "type": "any",
26431
- "description": "Subfolder within the output directory"
26432
- },
26433
- "type": {
26434
- "type": "any",
26435
- "description": "Image type ('output', 'input', 'temp')"
26393
+ "description": "The voice ID to look up"
26436
26394
  }
26437
26395
  },
26438
26396
  "required": [
26439
- "filename"
26397
+ "voiceId"
26440
26398
  ],
26441
- "returns": "Promise<Buffer>"
26442
- },
26443
- "connectWs": {
26444
- "description": "Open a WebSocket connection to ComfyUI for real-time execution tracking. Events emitted: `execution_start`, `executing`, `progress`, `executed`, `execution_cached`, `execution_error`, `execution_complete`.",
26445
- "parameters": {},
26446
- "required": [],
26447
- "returns": "Promise<void>"
26399
+ "returns": "Promise<any>",
26400
+ "examples": [
26401
+ {
26402
+ "language": "ts",
26403
+ "code": "const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')\nconsole.log(voice.name, voice.settings)"
26404
+ }
26405
+ ]
26448
26406
  },
26449
- "disconnectWs": {
26450
- "description": "Close the WebSocket connection.",
26407
+ "listModels": {
26408
+ "description": "List available TTS models.",
26451
26409
  "parameters": {},
26452
26410
  "required": [],
26453
- "returns": "void"
26411
+ "returns": "Promise<any[]>",
26412
+ "examples": [
26413
+ {
26414
+ "language": "ts",
26415
+ "code": "const models = await el.listModels()\nconsole.log(models.map(m => m.model_id))"
26416
+ }
26417
+ ]
26454
26418
  },
26455
- "toApiFormat": {
26456
- "description": "Convert a UI-format workflow to the API format that /prompt expects. Requires a running ComfyUI instance to fetch `object_info` so we can map positional `widgets_values` to their named input fields. If the workflow is already in API format, it's returned as-is.",
26419
+ "synthesize": {
26420
+ "description": "Synthesize speech from text, returning audio as a Buffer.",
26457
26421
  "parameters": {
26458
- "workflow": {
26459
- "type": "Record<string, any>",
26460
- "description": "Parameter workflow"
26422
+ "text": {
26423
+ "type": "string",
26424
+ "description": "The text to convert to speech"
26425
+ },
26426
+ "options": {
26427
+ "type": "SynthesizeOptions",
26428
+ "description": "Voice, model, format, and voice settings overrides",
26429
+ "properties": {
26430
+ "voiceId": {
26431
+ "type": "string",
26432
+ "description": ""
26433
+ },
26434
+ "modelId": {
26435
+ "type": "string",
26436
+ "description": ""
26437
+ },
26438
+ "outputFormat": {
26439
+ "type": "string",
26440
+ "description": ""
26441
+ },
26442
+ "voiceSettings": {
26443
+ "type": "ElevenLabsVoiceSettings",
26444
+ "description": ""
26445
+ },
26446
+ "disableCache": {
26447
+ "type": "boolean",
26448
+ "description": ""
26449
+ }
26450
+ }
26461
26451
  }
26462
26452
  },
26463
26453
  "required": [
26464
- "workflow"
26454
+ "text"
26465
26455
  ],
26466
- "returns": "Promise<Record<string, any>>"
26456
+ "returns": "Promise<Buffer>",
26457
+ "examples": [
26458
+ {
26459
+ "language": "ts",
26460
+ "code": "const audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data\n\nconst custom = await el.synthesize('Hello', {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n voiceSettings: { stability: 0.5, similarityBoost: 0.8 }\n})"
26461
+ }
26462
+ ]
26467
26463
  },
26468
- "runWorkflow": {
26469
- "description": "Run a ComfyUI workflow with optional runtime input overrides. Inputs can be provided in two forms: **Direct node mapping** (when no `inputMap` in options): ``` { '3': { seed: 42 }, '6': { text: 'a cat' } } ``` **Named inputs** (when `inputMap` is provided in options): ``` inputs: { positive_prompt: 'a cat', seed: 42 } options.inputMap: { positive_prompt: { nodeId: '6', field: 'text' }, seed: { nodeId: '3', field: 'seed' } } ```",
26464
+ "say": {
26465
+ "description": "Synthesize speech and write the audio to a file.",
26470
26466
  "parameters": {
26471
- "workflow": {
26472
- "type": "Record<string, any>",
26473
- "description": "Parameter workflow"
26467
+ "text": {
26468
+ "type": "string",
26469
+ "description": "The text to convert to speech"
26474
26470
  },
26475
- "inputs": {
26476
- "type": "Record<string, any>",
26477
- "description": "Parameter inputs"
26471
+ "outputPath": {
26472
+ "type": "string",
26473
+ "description": "File path to write the audio to"
26478
26474
  },
26479
26475
  "options": {
26480
- "type": "WorkflowRunOptions",
26481
- "description": "Parameter options",
26476
+ "type": "SynthesizeOptions",
26477
+ "description": "Voice, model, format, and voice settings overrides",
26482
26478
  "properties": {
26483
- "poll": {
26484
- "type": "boolean",
26485
- "description": "Use polling instead of WebSocket for tracking execution"
26486
- },
26487
- "pollInterval": {
26488
- "type": "number",
26489
- "description": "Polling interval in ms (default 1000)"
26479
+ "voiceId": {
26480
+ "type": "string",
26481
+ "description": ""
26490
26482
  },
26491
- "inputMap": {
26492
- "type": "InputMapping",
26493
- "description": "Named input mapping: semantic name -> { nodeId, field }"
26483
+ "modelId": {
26484
+ "type": "string",
26485
+ "description": ""
26494
26486
  },
26495
- "outputDir": {
26487
+ "outputFormat": {
26496
26488
  "type": "string",
26497
- "description": "If provided, output images are downloaded to this directory"
26489
+ "description": ""
26490
+ },
26491
+ "voiceSettings": {
26492
+ "type": "ElevenLabsVoiceSettings",
26493
+ "description": ""
26494
+ },
26495
+ "disableCache": {
26496
+ "type": "boolean",
26497
+ "description": ""
26498
26498
  }
26499
26499
  }
26500
26500
  }
26501
26501
  },
26502
26502
  "required": [
26503
- "workflow"
26503
+ "text",
26504
+ "outputPath"
26504
26505
  ],
26505
- "returns": "Promise<WorkflowResult>"
26506
+ "returns": "Promise<string>",
26507
+ "examples": [
26508
+ {
26509
+ "language": "ts",
26510
+ "code": "const path = await el.say('Hello world', './hello.mp3')\nconsole.log(`Audio saved to ${path}`)"
26511
+ }
26512
+ ]
26506
26513
  }
26507
26514
  },
26508
26515
  "getters": {
26509
- "clientId": {
26510
- "description": "The unique client ID used for WebSocket session tracking.",
26511
- "returns": "string"
26512
- },
26513
- "wsURL": {
26514
- "description": "The WebSocket URL derived from baseURL or overridden via options.",
26516
+ "apiKey": {
26517
+ "description": "The resolved API key from options or environment.",
26515
26518
  "returns": "string"
26516
26519
  }
26517
26520
  },
26518
26521
  "events": {
26519
- "execution_start": {
26520
- "name": "execution_start",
26521
- "description": "Event emitted by ComfyUIClient",
26522
- "arguments": {}
26523
- },
26524
- "execution_complete": {
26525
- "name": "execution_complete",
26526
- "description": "Event emitted by ComfyUIClient",
26527
- "arguments": {}
26528
- },
26529
- "executing": {
26530
- "name": "executing",
26531
- "description": "Event emitted by ComfyUIClient",
26532
- "arguments": {}
26533
- },
26534
- "progress": {
26535
- "name": "progress",
26536
- "description": "Event emitted by ComfyUIClient",
26537
- "arguments": {}
26538
- },
26539
- "executed": {
26540
- "name": "executed",
26541
- "description": "Event emitted by ComfyUIClient",
26522
+ "failure": {
26523
+ "name": "failure",
26524
+ "description": "Event emitted by ElevenLabsClient",
26542
26525
  "arguments": {}
26543
26526
  },
26544
- "execution_cached": {
26545
- "name": "execution_cached",
26546
- "description": "Event emitted by ComfyUIClient",
26527
+ "voices": {
26528
+ "name": "voices",
26529
+ "description": "Event emitted by ElevenLabsClient",
26547
26530
  "arguments": {}
26548
26531
  },
26549
- "execution_error": {
26550
- "name": "execution_error",
26551
- "description": "Event emitted by ComfyUIClient",
26532
+ "speech": {
26533
+ "name": "speech",
26534
+ "description": "Event emitted by ElevenLabsClient",
26552
26535
  "arguments": {}
26553
26536
  }
26554
26537
  },
@@ -26558,48 +26541,65 @@ export const introspectionData = [
26558
26541
  "examples": [
26559
26542
  {
26560
26543
  "language": "ts",
26561
- "code": "const comfy = container.client('comfyui', { baseURL: 'http://localhost:8188' })\nconst result = await comfy.runWorkflow(workflow, {\n '6': { text: 'a beautiful sunset' }\n})\nconsole.log(result.images)"
26544
+ "code": "const el = container.client('elevenlabs')\nawait el.connect()\nconst voices = await el.listVoices()\nconst audio = await el.synthesize('Hello world')\n// audio is a Buffer of mp3 data"
26562
26545
  }
26563
26546
  ],
26564
26547
  "types": {
26565
- "WorkflowRunOptions": {
26548
+ "SynthesizeOptions": {
26566
26549
  "description": "",
26567
26550
  "properties": {
26568
- "poll": {
26569
- "type": "boolean",
26570
- "description": "Use polling instead of WebSocket for tracking execution",
26551
+ "voiceId": {
26552
+ "type": "string",
26553
+ "description": "",
26571
26554
  "optional": true
26572
26555
  },
26573
- "pollInterval": {
26574
- "type": "number",
26575
- "description": "Polling interval in ms (default 1000)",
26556
+ "modelId": {
26557
+ "type": "string",
26558
+ "description": "",
26576
26559
  "optional": true
26577
26560
  },
26578
- "inputMap": {
26579
- "type": "InputMapping",
26580
- "description": "Named input mapping: semantic name -> { nodeId, field }",
26561
+ "outputFormat": {
26562
+ "type": "string",
26563
+ "description": "",
26581
26564
  "optional": true
26582
26565
  },
26583
- "outputDir": {
26584
- "type": "string",
26585
- "description": "If provided, output images are downloaded to this directory",
26566
+ "voiceSettings": {
26567
+ "type": "ElevenLabsVoiceSettings",
26568
+ "description": "",
26569
+ "optional": true
26570
+ },
26571
+ "disableCache": {
26572
+ "type": "boolean",
26573
+ "description": "",
26586
26574
  "optional": true
26587
26575
  }
26588
26576
  }
26589
26577
  },
26590
- "WorkflowResult": {
26578
+ "ElevenLabsVoiceSettings": {
26591
26579
  "description": "",
26592
26580
  "properties": {
26593
- "promptId": {
26594
- "type": "string",
26595
- "description": ""
26581
+ "stability": {
26582
+ "type": "number",
26583
+ "description": "",
26584
+ "optional": true
26596
26585
  },
26597
- "outputs": {
26598
- "type": "Record<string, any>",
26599
- "description": ""
26586
+ "similarityBoost": {
26587
+ "type": "number",
26588
+ "description": "",
26589
+ "optional": true
26600
26590
  },
26601
- "images": {
26602
- "type": "Array<{ filename: string; subfolder: string; type: string; localPath?: string }>",
26591
+ "style": {
26592
+ "type": "number",
26593
+ "description": "",
26594
+ "optional": true
26595
+ },
26596
+ "speed": {
26597
+ "type": "number",
26598
+ "description": "",
26599
+ "optional": true
26600
+ },
26601
+ "useSpeakerBoost": {
26602
+ "type": "boolean",
26603
26603
  "description": "",
26604
26604
  "optional": true
26605
26605
  }