synthos 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/default-pages/application/page.html +42 -0
- package/default-pages/application/page.json +10 -0
- package/default-pages/elevenlabs_effects_studio/page.html +1363 -0
- package/default-pages/elevenlabs_effects_studio/page.json +11 -0
- package/default-pages/elevenlabs_voice_studio/page.html +801 -0
- package/default-pages/elevenlabs_voice_studio/page.json +11 -0
- package/default-pages/{json_tools.html → json_tools/page.html} +13 -11
- package/default-pages/json_tools/page.json +10 -0
- package/default-pages/my_notes/notes/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json +5 -0
- package/default-pages/my_notes/page.html +132 -0
- package/default-pages/{my_notes.json → my_notes/page.json} +2 -2
- package/default-pages/neon_asteroids/files/Ambient_Space.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ambient_Space2.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ambient_Space3.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Asteroid_Explosion.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Hyperspace_Jump.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Laser_Fire.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Menu_Navigate.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Power_Up_Collect.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Saucer_Alert.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ship_Thrust.mp3 +0 -0
- package/default-pages/neon_asteroids/files/effects.json +74 -0
- package/default-pages/neon_asteroids/page.html +1822 -0
- package/default-pages/{neon_asteroids.json → neon_asteroids/page.json} +3 -3
- package/default-pages/{oregon_trail.html → oregon_trail/page.html} +14 -12
- package/default-pages/{oregon_trail.json → oregon_trail/page.json} +2 -2
- package/default-pages/retro_game_starter/page.html +1308 -0
- package/default-pages/retro_game_starter/page.json +12 -0
- package/default-pages/{sidebar_page.html → sidebar_page/page.html} +12 -10
- package/default-pages/sidebar_page/page.json +10 -0
- package/default-pages/{solar_explorer.html → solar_explorer/page.html} +14 -11
- package/default-pages/{solar_explorer.json → solar_explorer/page.json} +2 -2
- package/default-pages/{solar_tutorial.html → solar_tutorial/page.html} +12 -10
- package/default-pages/solar_tutorial/page.json +10 -0
- package/default-pages/{two-panel_page.html → two-panel_page/page.html} +13 -11
- package/default-pages/two-panel_page/page.json +10 -0
- package/default-pages/{us_map.html → us_map/page.html} +193 -192
- package/default-pages/{us_map.json → us_map/page.json} +12 -12
- package/default-pages/{us_map_1850.html → us_map_1850/page.html} +326 -325
- package/default-pages/{us_map_1850.json → us_map_1850/page.json} +12 -12
- package/default-pages/{western_cities_1850.html → western_cities_1850/page.html} +527 -526
- package/default-pages/{western_cities_1850.json → western_cities_1850/page.json} +12 -12
- package/default-themes/aurora-dawn.json +19 -0
- package/default-themes/aurora-dawn.v3.css +198 -0
- package/default-themes/aurora-dusk.json +19 -0
- package/default-themes/aurora-dusk.v3.css +200 -0
- package/default-themes/cosmos-dawn.json +19 -0
- package/default-themes/cosmos-dawn.v3.css +198 -0
- package/default-themes/cosmos-dusk.json +19 -0
- package/default-themes/cosmos-dusk.v3.css +200 -0
- package/default-themes/high-contrast-dark.json +19 -0
- package/default-themes/high-contrast-dark.v3.css +200 -0
- package/default-themes/high-contrast-light.json +19 -0
- package/default-themes/high-contrast-light.v3.css +198 -0
- package/default-themes/nebula-dawn.v2.css +110 -0
- package/default-themes/nebula-dawn.v3.css +199 -0
- package/default-themes/nebula-dusk.v2.css +104 -0
- package/default-themes/nebula-dusk.v3.css +201 -0
- package/default-themes/solar-flare-dawn.json +19 -0
- package/default-themes/solar-flare-dawn.v3.css +198 -0
- package/default-themes/solar-flare-dusk.json +19 -0
- package/default-themes/solar-flare-dusk.v3.css +200 -0
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/openclaw/gatewayManager.d.ts +4 -0
- package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -1
- package/dist/agents/openclaw/gatewayManager.js +27 -11
- package/dist/agents/openclaw/gatewayManager.js.map +1 -1
- package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -1
- package/dist/agents/openclaw/openclawProvider.js +2 -4
- package/dist/agents/openclaw/openclawProvider.js.map +1 -1
- package/dist/agents/openclaw/sshTunnelManager.d.ts +2 -0
- package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -1
- package/dist/agents/openclaw/sshTunnelManager.js +31 -12
- package/dist/agents/openclaw/sshTunnelManager.js.map +1 -1
- package/dist/builders/anthropic.d.ts +31 -0
- package/dist/builders/anthropic.d.ts.map +1 -0
- package/dist/builders/anthropic.js +227 -0
- package/dist/builders/anthropic.js.map +1 -0
- package/dist/builders/fireworksai.d.ts +9 -0
- package/dist/builders/fireworksai.d.ts.map +1 -0
- package/dist/builders/fireworksai.js +57 -0
- package/dist/builders/fireworksai.js.map +1 -0
- package/dist/builders/index.d.ts +13 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +31 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/builders/openai.d.ts +8 -0
- package/dist/builders/openai.d.ts.map +1 -0
- package/dist/builders/openai.js +87 -0
- package/dist/builders/openai.js.map +1 -0
- package/dist/builders/types.d.ts +54 -0
- package/dist/builders/types.d.ts.map +1 -0
- package/dist/builders/types.js +211 -0
- package/dist/builders/types.js.map +1 -0
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +3 -2
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/registry.d.ts +2 -1
- package/dist/connectors/registry.d.ts.map +1 -1
- package/dist/connectors/registry.js +31 -8
- package/dist/connectors/registry.js.map +1 -1
- package/dist/customizer/Customizer.d.ts +57 -0
- package/dist/customizer/Customizer.d.ts.map +1 -0
- package/dist/customizer/Customizer.js +124 -0
- package/dist/customizer/Customizer.js.map +1 -0
- package/dist/customizer/index.d.ts.map +1 -0
- package/dist/customizer/index.js +9 -0
- package/dist/customizer/index.js.map +1 -0
- package/dist/files.d.ts +16 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +60 -1
- package/dist/files.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +10 -6
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +96 -113
- package/dist/init.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +23 -10
- package/dist/migrations.js.map +1 -1
- package/dist/models/anthropic.d.ts +4 -2
- package/dist/models/anthropic.d.ts.map +1 -1
- package/dist/models/anthropic.js +33 -6
- package/dist/models/anthropic.js.map +1 -1
- package/dist/models/fireworksai.d.ts.map +1 -1
- package/dist/models/fireworksai.js +9 -1
- package/dist/models/fireworksai.js.map +1 -1
- package/dist/models/index.d.ts +1 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +2 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/openai.d.ts +1 -1
- package/dist/models/openai.d.ts.map +1 -1
- package/dist/models/openai.js +24 -3
- package/dist/models/openai.js.map +1 -1
- package/dist/models/types.d.ts +20 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js +6 -1
- package/dist/models/types.js.map +1 -1
- package/dist/pages.d.ts +30 -7
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +177 -55
- package/dist/pages.js.map +1 -1
- package/dist/service/server.d.ts.map +1 -1
- package/dist/service/server.js +37 -8
- package/dist/service/server.js.map +1 -1
- package/dist/service/transformPage.d.ts +47 -20
- package/dist/service/transformPage.d.ts.map +1 -1
- package/dist/service/transformPage.js +514 -293
- package/dist/service/transformPage.js.map +1 -1
- package/dist/service/useAgentRoutes.d.ts +2 -1
- package/dist/service/useAgentRoutes.d.ts.map +1 -1
- package/dist/service/useAgentRoutes.js +5 -2
- package/dist/service/useAgentRoutes.js.map +1 -1
- package/dist/service/useApiRoutes.d.ts.map +1 -1
- package/dist/service/useApiRoutes.js +237 -136
- package/dist/service/useApiRoutes.js.map +1 -1
- package/dist/service/useConnectorRoutes.js +6 -6
- package/dist/service/useConnectorRoutes.js.map +1 -1
- package/dist/service/useFileRoutes.d.ts +4 -0
- package/dist/service/useFileRoutes.d.ts.map +1 -0
- package/dist/service/useFileRoutes.js +122 -0
- package/dist/service/useFileRoutes.js.map +1 -0
- package/dist/service/usePageRoutes.d.ts.map +1 -1
- package/dist/service/usePageRoutes.js +648 -67
- package/dist/service/usePageRoutes.js.map +1 -1
- package/dist/service/useSharedDataRoutes.d.ts +4 -0
- package/dist/service/useSharedDataRoutes.d.ts.map +1 -0
- package/dist/service/useSharedDataRoutes.js +104 -0
- package/dist/service/useSharedDataRoutes.js.map +1 -0
- package/dist/service/useSharedFileRoutes.d.ts +4 -0
- package/dist/service/useSharedFileRoutes.d.ts.map +1 -0
- package/dist/service/useSharedFileRoutes.js +121 -0
- package/dist/service/useSharedFileRoutes.js.map +1 -0
- package/dist/settings.d.ts +1 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +1 -0
- package/dist/settings.js.map +1 -1
- package/dist/synthos-cli.d.ts.map +1 -1
- package/dist/synthos-cli.js +4 -3
- package/dist/synthos-cli.js.map +1 -1
- package/dist/themes.d.ts +1 -0
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +28 -15
- package/dist/themes.js.map +1 -1
- package/migration-rules/v1-to-v2.md +193 -0
- package/migration-rules/v2-to-v3.md +481 -0
- package/package.json +11 -10
- package/required-pages/builder/page.html +43 -0
- package/required-pages/builder/page.json +10 -0
- package/required-pages/{pages.html → pages/page.html} +238 -233
- package/required-pages/pages/page.json +10 -0
- package/required-pages/{settings.html → settings/page.html} +389 -275
- package/required-pages/settings/page.json +10 -0
- package/required-pages/synthos_apis/page.html +846 -0
- package/required-pages/synthos_apis/page.json +10 -0
- package/required-pages/{synthos_scripts.html → synthos_scripts/page.html} +13 -11
- package/required-pages/synthos_scripts/page.json +10 -0
- package/src/agents/index.ts +1 -1
- package/src/agents/openclaw/gatewayManager.ts +22 -11
- package/src/agents/openclaw/openclawProvider.ts +2 -4
- package/src/agents/openclaw/sshTunnelManager.ts +19 -11
- package/src/builders/anthropic.ts +283 -0
- package/src/builders/fireworksai.ts +59 -0
- package/src/builders/index.ts +33 -0
- package/src/builders/openai.ts +89 -0
- package/src/builders/types.ts +261 -0
- package/src/connectors/index.ts +1 -1
- package/src/connectors/registry.ts +28 -8
- package/src/customizer/Customizer.ts +151 -0
- package/src/customizer/index.ts +5 -0
- package/src/files.ts +57 -0
- package/src/index.ts +2 -1
- package/src/init.ts +137 -123
- package/src/migrations.ts +30 -10
- package/src/models/anthropic.ts +40 -10
- package/src/models/fireworksai.ts +9 -2
- package/src/models/index.ts +1 -1
- package/src/models/openai.ts +26 -6
- package/src/models/types.ts +31 -1
- package/src/pages.ts +176 -54
- package/src/service/server.ts +36 -9
- package/src/service/transformPage.ts +557 -326
- package/src/service/useAgentRoutes.ts +7 -2
- package/src/service/useApiRoutes.ts +150 -41
- package/src/service/useConnectorRoutes.ts +7 -7
- package/src/service/useFileRoutes.ts +127 -0
- package/src/service/usePageRoutes.ts +720 -73
- package/src/service/useSharedDataRoutes.ts +106 -0
- package/src/service/useSharedFileRoutes.ts +126 -0
- package/src/settings.ts +2 -0
- package/src/synthos-cli.ts +4 -3
- package/src/themes.ts +25 -14
- package/static-files/favicon.svg +12 -0
- package/static-files/fluentlm-instructions.llmd +868 -0
- package/static-files/fluentlm-instructions.md +1595 -0
- package/static-files/fluentlm.css +4844 -0
- package/static-files/fluentlm.js +3602 -0
- package/static-files/fluentlm.min.css +1 -0
- package/static-files/fluentlm.min.js +1 -0
- package/{page-scripts/helpers-v2.js → static-files/helpers.v3.js} +82 -0
- package/static-files/page.v3.js +1290 -0
- package/static-files/recommended-frameworks.llmd +81 -0
- package/static-files/recommended-frameworks.md +137 -0
- package/static-files/retro-game.js +877 -0
- package/static-files/shell.css +797 -0
- package/static-files/theme-dark.css +169 -0
- package/static-files/theme-light.css +169 -0
- package/tests/builders.spec.ts +139 -0
- package/tests/pages.spec.ts +8 -8
- package/tests/transformPage.spec.ts +299 -360
- package/default-pages/application.html +0 -40
- package/default-pages/application.json +0 -1
- package/default-pages/json_tools.json +0 -1
- package/default-pages/my_notes.html +0 -33
- package/default-pages/neon_asteroids.html +0 -77
- package/default-pages/sidebar_page.json +0 -1
- package/default-pages/solar_tutorial.json +0 -1
- package/default-pages/two-panel_page.json +0 -1
- package/dist/agents/a2a/a2aProvider.d.ts +0 -3
- package/dist/agents/discovery.d.ts +0 -30
- package/dist/agents/openclaw/openclawProvider.d.ts +0 -3
- package/dist/agents/types.d.ts +0 -64
- package/dist/connectors/index.d.ts +0 -3
- package/dist/connectors/types.d.ts +0 -84
- package/dist/index.d.ts +0 -7
- package/dist/migrations.d.ts +0 -12
- package/dist/models/chainOfThought.d.ts +0 -12
- package/dist/models/fireworksai.d.ts +0 -30
- package/dist/models/logCompletePrompt.d.ts +0 -3
- package/dist/models/providers.d.ts +0 -8
- package/dist/models/utils.d.ts +0 -6
- package/dist/scripts.d.ts +0 -15
- package/dist/service/createCompletePrompt.d.ts +0 -5
- package/dist/service/debugLog.d.ts +0 -11
- package/dist/service/generateImage.d.ts +0 -32
- package/dist/service/index.d.ts +0 -8
- package/dist/service/modelInstructions.d.ts +0 -7
- package/dist/service/requiresSettings.d.ts +0 -3
- package/dist/service/server.d.ts +0 -4
- package/dist/service/useApiRoutes.d.ts +0 -4
- package/dist/service/useConnectorRoutes.d.ts +0 -4
- package/dist/service/useDataRoutes.d.ts +0 -4
- package/dist/service/useGatewayRoutes.d.ts +0 -4
- package/dist/service/useGatewayRoutes.d.ts.map +0 -1
- package/dist/service/useGatewayRoutes.js +0 -168
- package/dist/service/useGatewayRoutes.js.map +0 -1
- package/dist/service/usePageRoutes.d.ts +0 -5
- package/dist/synthos-cli.d.ts +0 -2
- package/page-scripts/page-v2.js +0 -656
- package/required-pages/builder.html +0 -48
- package/required-pages/builder.json +0 -1
- package/required-pages/pages.json +0 -1
- package/required-pages/settings.json +0 -1
- package/required-pages/synthos_apis.html +0 -327
- package/required-pages/synthos_apis.json +0 -1
- package/required-pages/synthos_scripts.json +0 -1
- package/src/connectors/airtable/connector.json +0 -27
- package/src/connectors/alpha-vantage/connector.json +0 -26
- package/src/connectors/brave-search/connector.json +0 -26
- package/src/connectors/cloudinary/connector.json +0 -27
- package/src/connectors/deepl/connector.json +0 -28
- package/src/connectors/elevenlabs/connector.json +0 -30
- package/src/connectors/giphy/connector.json +0 -27
- package/src/connectors/github/connector.json +0 -29
- package/src/connectors/huggingface/connector.json +0 -27
- package/src/connectors/imgur/connector.json +0 -29
- package/src/connectors/instagram/connector.json +0 -43
- package/src/connectors/jira/connector.json +0 -28
- package/src/connectors/mapbox/connector.json +0 -26
- package/src/connectors/nasa/connector.json +0 -27
- package/src/connectors/newsapi/connector.json +0 -27
- package/src/connectors/notion/connector.json +0 -28
- package/src/connectors/open-exchange-rates/connector.json +0 -27
- package/src/connectors/openweathermap/connector.json +0 -26
- package/src/connectors/pexels/connector.json +0 -27
- package/src/connectors/resend/connector.json +0 -29
- package/src/connectors/rss2json/connector.json +0 -27
- package/src/connectors/sendgrid/connector.json +0 -27
- package/src/connectors/spoonacular/connector.json +0 -28
- package/src/connectors/stability-ai/connector.json +0 -27
- package/src/connectors/twilio/connector.json +0 -28
- package/src/connectors/unsplash/connector.json +0 -27
- package/src/connectors/wolfram-alpha/connector.json +0 -26
- package/src/connectors/youtube-data/connector.json +0 -30
- /package/{dist/connectors → service-connectors}/airtable/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/alpha-vantage/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/brave-search/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/cloudinary/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/deepl/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/elevenlabs/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/giphy/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/github/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/huggingface/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/imgur/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/instagram/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/jira/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/mapbox/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/nasa/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/newsapi/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/notion/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/open-exchange-rates/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/openweathermap/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/pexels/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/resend/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/rss2json/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/sendgrid/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/spoonacular/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/stability-ai/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/twilio/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/unsplash/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/wolfram-alpha/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/youtube-data/connector.json +0 -0
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head>
|
|
2
|
-
<meta charset="UTF-8">
|
|
3
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
4
|
-
<title>SynthOS</title>
|
|
5
|
-
<script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
|
|
6
|
-
<link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
|
|
7
|
-
<style>.idle-container{position:absolute;width:100%;height:100%;pointer-events:none;opacity:1;transition:opacity 1s ease-out}.idle-container.hidden{opacity:0}.breathing-orb{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:80px;height:80px;border-radius:50%;background:radial-gradient(circle,rgba(102,126,234,.15) 0,transparent 70%);animation:4s ease-in-out infinite breathe}.breathing-orb::before{content:'';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:8px;height:8px;border-radius:50%;background:rgba(183,148,246,.6);box-shadow:0 0 20px rgba(183,148,246,.4);animation:4s ease-in-out infinite core-pulse}@keyframes breathe{0%,100%{width:80px;height:80px;opacity:.3}50%{width:120px;height:120px;opacity:.6}}@keyframes core-pulse{0%,100%{opacity:.4;box-shadow:0 0 20px rgba(183,148,246,.3)}50%{opacity:.8;box-shadow:0 0 30px rgba(183,148,246,.5)}}.orbit-ring{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:200px;height:200px;border:1px solid rgba(102,126,234,.1);border-radius:50%;animation:20s linear infinite orbit-rotate}.orbit-ring::after{content:'';position:absolute;top:-3px;left:50%;transform:translateX(-50%);width:6px;height:6px;background:rgba(240,147,251,.5);border-radius:50%;box-shadow:0 0 10px rgba(240,147,251,.3)}@keyframes orbit-rotate{from{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(360deg)}}</style>
|
|
8
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js"></script>
|
|
9
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/14.1.1/marked.min.js"></script>
|
|
10
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.1.0/mermaid.min.js"></script>
|
|
11
|
-
<script id="page-info" src="/api/page-info.js?page=builder"></script>
|
|
12
|
-
</head>
|
|
13
|
-
<body>
|
|
14
|
-
<div class="chat-panel" data-locked="true">
|
|
15
|
-
<div class="chat-header" data-locked="true">SynthOS</div>
|
|
16
|
-
<div class="chat-messages" id="chatMessages" data-locked="true">
|
|
17
|
-
<div class="chat-message" id="defaultGreeting"><p><strong>SynthOS:</strong> What can I create for you? Ask "what can you do?" or "how does this work?" to learn more. Remember to save often!</p></div>
|
|
18
|
-
</div>
|
|
19
|
-
<div class="link-group" data-locked="true">
|
|
20
|
-
<a href="#" id="saveLink" data-locked="true">Save</a>
|
|
21
|
-
<a href="/pages" id="pagesLink" data-locked="true">Pages</a>
|
|
22
|
-
<a href="#" id="resetLink" data-locked="true">Reset</a>
|
|
23
|
-
</div>
|
|
24
|
-
<form action="/" method="POST" id="chatForm" data-locked="true">
|
|
25
|
-
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message..." data-locked="true">
|
|
26
|
-
<button type="submit" class="chat-submit" data-locked="true">Send</button>
|
|
27
|
-
</form>
|
|
28
|
-
</div>
|
|
29
|
-
<div class="viewer-panel" id="viewerPanel">
|
|
30
|
-
<div class="idle-container" id="idleAnimation">
|
|
31
|
-
<div class="orbit-ring"></div>
|
|
32
|
-
<div class="breathing-orb"></div>
|
|
33
|
-
</div>
|
|
34
|
-
<div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>
|
|
35
|
-
</div>
|
|
36
|
-
<div id="instructions" style="display: none;" data-locked="true"></div>
|
|
37
|
-
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
38
|
-
<script id="idle-animation">function hideIdleAnimation(){const idleContainer=document.getElementById("idleAnimation");idleContainer&&(idleContainer.classList.add("hidden"),setTimeout(()=>{idleContainer.style.display="none"},1e3))}function showIdleAnimation(){const idleContainer=document.getElementById("idleAnimation");idleContainer&&(idleContainer.style.display="block",setTimeout(()=>{idleContainer.classList.remove("hidden")},10))}</script>
|
|
39
|
-
<button class="chat-toggle" aria-label="Toggle chat panel">
|
|
40
|
-
<span class="chat-toggle-dots">
|
|
41
|
-
<span class="chat-toggle-dot"></span>
|
|
42
|
-
<span class="chat-toggle-dot"></span>
|
|
43
|
-
<span class="chat-toggle-dot"></span>
|
|
44
|
-
</span>
|
|
45
|
-
</button>
|
|
46
|
-
<script id="page-helpers" src="/api/page-helpers.js?v=2" data-locked="true"></script>
|
|
47
|
-
<script id="page-script" src="/api/page-script.js?v=2" data-locked="true"></script>
|
|
48
|
-
</body></html>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Builder", "categories": ["System"], "pinned": true, "showInAll": true, "pageVersion": 2, "mode": "unlockedS" }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Pages", "categories": ["System"], "pinned": true, "showInAll": true, "pageVersion": 2, "mode": "locked" }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Settings", "categories": ["System"], "pinned": true, "showInAll": true, "pageVersion": 2, "mode": "locked" }
|
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head>
|
|
2
|
-
<meta charset="UTF-8">
|
|
3
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
4
|
-
<title>SynthOS - APIs</title>
|
|
5
|
-
<script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
|
|
6
|
-
<link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
|
|
7
|
-
<style>.dialog-title{font-size:22px;font-weight:700;min-height:var(--header-min-height);padding:var(--header-padding-vertical) var(--header-padding-horizontal);line-height:var(--header-line-height);display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-radius:12px;width:100%;max-width:800px;box-shadow:0 6px 25px var(--accent-glow);position:relative;z-index:1}.dialog-content{font-size:14px;color:rgba(224,224,224,.8);padding:15px 0;flex-grow:1;width:100%;max-width:800px;position:relative;z-index:1;overflow-y:auto}.api-section{margin:8px 0;border-radius:10px;width:100%;background:linear-gradient(135deg,rgba(102,126,234,.1) 0,rgba(118,75,162,.1) 100%);border:1px solid var(--border-color);overflow:hidden}.api-header{font-size:14px;cursor:pointer;background:linear-gradient(135deg,rgba(102,126,234,.2) 0,rgba(118,75,162,.2) 100%);padding:12px 15px;text-align:left;transition:.3s;color:var(--text-secondary);font-weight:500}.api-header:hover{background:linear-gradient(135deg,rgba(102,126,234,.3) 0,rgba(118,75,162,.3) 100%);color:var(--accent-tertiary)}.api-content{display:none;padding:12px 15px;background:rgba(15,15,35,.5);border-top:1px solid var(--border-color);font-size:13px;line-height:1.5}.api-input{margin-top:10px}.api-input input,.api-input select,.api-input textarea{width:100%;padding:10px 12px;margin-bottom:8px;border-radius:8px;border:1px solid var(--border-color);background:rgba(15,15,35,.8);color:var(--text-primary);font-size:13px;transition:.3s}.api-input input:focus,.api-input select:focus,.api-input textarea:focus{outline:0;border-color:var(--text-secondary);box-shadow:0 0 15px var(--accent-glow)}.api-input textarea{min-height:80px;resize:vertical}.api-input select{cursor:pointer}.api-input select option{background:var(--bg-tertiary);color:var(--text-primary)}.api-input button{padding:10px 18px;border:none;border-radius:20px;background:linear-gradient(135deg,var(--accent-primary) 0,var(--accent-secondary) 100%);color:#fff;cursor:pointer;transition:.3s;font-weight:500;font-size:13px;box-shadow:0 3px 15px var(--accent-glow)}.api-input button:hover{transform:translateY(-2px);box-shadow:0 5px 20px rgba(102,126,234,.5)}.api-input button:disabled{background:rgba(102,126,234,.3);cursor:not-allowed;transform:none;box-shadow:none}.api-output{margin-top:10px;min-height:100px;max-height:200px;background:rgba(15,15,35,.8);color:var(--accent-tertiary);padding:12px;border-radius:8px;overflow-y:auto;white-space:pre-wrap;font-family:'Courier New',Courier,monospace;font-size:12px;border:1px solid var(--border-color)}.generated-image{max-width:100%;height:auto;margin-top:10px;border-radius:8px;border:1px solid var(--border-color);box-shadow:0 4px 20px var(--accent-glow)}.light-mode .dialog-content{color:rgba(45,38,64,.8)}.light-mode .api-content{background:rgba(255,255,255,.5)}.light-mode .api-input input,.light-mode .api-input select,.light-mode .api-input textarea,.light-mode .api-output{background:rgba(255,255,255,.8)}</style>
|
|
8
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js"></script>
|
|
9
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/14.1.1/marked.min.js"></script>
|
|
10
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.1.0/mermaid.min.js"></script>
|
|
11
|
-
<script id="page-info" src="/api/page-info.js?page=apis"></script>
|
|
12
|
-
</head>
|
|
13
|
-
<body>
|
|
14
|
-
<div class="chat-panel" data-locked="true">
|
|
15
|
-
<div class="chat-header" data-locked="true">SynthOS</div>
|
|
16
|
-
<div class="chat-messages" id="chatMessages" data-locked="true">
|
|
17
|
-
<div class="chat-message"><p><strong>SynthOS:</strong> Expand the individual API operations to test calls.</p></div>
|
|
18
|
-
</div>
|
|
19
|
-
<div class="link-group" data-locked="true">
|
|
20
|
-
<a href="#" id="saveLink" data-locked="true">Save</a>
|
|
21
|
-
<a href="/pages" id="pagesLink" data-locked="true">Pages</a>
|
|
22
|
-
<a href="#" id="resetLink" data-locked="true">Reset</a>
|
|
23
|
-
</div>
|
|
24
|
-
<form action="/" method="POST" id="chatForm" data-locked="true">
|
|
25
|
-
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message..." data-locked="true">
|
|
26
|
-
<button type="submit" class="chat-submit" data-locked="true">Send</button>
|
|
27
|
-
</form>
|
|
28
|
-
</div>
|
|
29
|
-
<div class="viewer-panel" id="viewerPanel">
|
|
30
|
-
<div class="dialog-title">API Explorer</div>
|
|
31
|
-
<div class="dialog-content">
|
|
32
|
-
<div class="api-section">
|
|
33
|
-
<div class="api-header" onclick="toggleSection(this)">GET /api/data/:page/:table</div>
|
|
34
|
-
<div class="api-content">
|
|
35
|
-
This operation retrieves all rows from the specified page-scoped table. The response is an array of JSON objects, each representing a row in the table.
|
|
36
|
-
<div class="api-input">
|
|
37
|
-
<input type="text" placeholder="Page Name">
|
|
38
|
-
<input type="text" placeholder="Table Name">
|
|
39
|
-
<button onclick="callApi(event, 'GET', '/api/data/')">Submit</button>
|
|
40
|
-
</div>
|
|
41
|
-
<div class="api-output"></div>
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
<div class="api-section">
|
|
45
|
-
<div class="api-header" onclick="toggleSection(this)">GET /api/data/:page/:table?limit=N&offset=N</div>
|
|
46
|
-
<div class="api-content">
|
|
47
|
-
Paginated variant. Returns a page of rows from the table. The response includes the items, total count, and whether more rows are available.
|
|
48
|
-
Response: { items: [...], total: number, offset: number, limit: number, hasMore: boolean }
|
|
49
|
-
<div class="api-input">
|
|
50
|
-
<input type="text" placeholder="Page Name">
|
|
51
|
-
<input type="text" placeholder="Table Name">
|
|
52
|
-
<input type="text" placeholder="Limit">
|
|
53
|
-
<input type="text" placeholder="Offset (optional)">
|
|
54
|
-
<button onclick="callPaginatedApi(event)">Submit</button>
|
|
55
|
-
</div>
|
|
56
|
-
<div class="api-output"></div>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
<div class="api-section">
|
|
60
|
-
<div class="api-header" onclick="toggleSection(this)">GET /api/data/:page/:table/:id</div>
|
|
61
|
-
<div class="api-content">
|
|
62
|
-
This operation retrieves a single row from the specified page-scoped table using the provided ID. The response is a JSON object representing the row.
|
|
63
|
-
<div class="api-input">
|
|
64
|
-
<input type="text" placeholder="Page Name">
|
|
65
|
-
<input type="text" placeholder="Table Name">
|
|
66
|
-
<input type="text" placeholder="ID">
|
|
67
|
-
<button onclick="callApi(event, 'GET', '/api/data/')">Submit</button>
|
|
68
|
-
</div>
|
|
69
|
-
<div class="api-output"></div>
|
|
70
|
-
</div>
|
|
71
|
-
</div>
|
|
72
|
-
<div class="api-section">
|
|
73
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/data/:page/:table</div>
|
|
74
|
-
<div class="api-content">
|
|
75
|
-
This operation saves a single row to the specified page-scoped table. The request should include a JSON object representing the row. The response indicates success.
|
|
76
|
-
<div class="api-input">
|
|
77
|
-
<input type="text" placeholder="Page Name">
|
|
78
|
-
<input type="text" placeholder="Table Name">
|
|
79
|
-
<textarea placeholder="JSON Data"></textarea>
|
|
80
|
-
<button onclick="callApi(event, 'POST', '/api/data/')">Submit</button>
|
|
81
|
-
</div>
|
|
82
|
-
<div class="api-output"></div>
|
|
83
|
-
</div>
|
|
84
|
-
</div>
|
|
85
|
-
<div class="api-section">
|
|
86
|
-
<div class="api-header" onclick="toggleSection(this)">DELETE /api/data/:page/:table/:id</div>
|
|
87
|
-
<div class="api-content">
|
|
88
|
-
This operation deletes a single row from the specified page-scoped table using the provided ID. The response indicates success.
|
|
89
|
-
<div class="api-input">
|
|
90
|
-
<input type="text" placeholder="Page Name">
|
|
91
|
-
<input type="text" placeholder="Table Name">
|
|
92
|
-
<input type="text" placeholder="ID">
|
|
93
|
-
<button onclick="callApi(event, 'DELETE', '/api/data/')">Submit</button>
|
|
94
|
-
</div>
|
|
95
|
-
<div class="api-output"></div>
|
|
96
|
-
</div>
|
|
97
|
-
</div>
|
|
98
|
-
<div class="api-section">
|
|
99
|
-
<div class="api-header" onclick="toggleSection(this)">GET /api/pages</div>
|
|
100
|
-
<div class="api-content">
|
|
101
|
-
This operation retrieves a list of all available pages. The response is an array of page objects with name, title, categories, pinned, createdDate, lastModified, pageVersion, and mode.
|
|
102
|
-
<div class="api-input">
|
|
103
|
-
<button onclick="callApi(event, 'GET', '/api/pages')">Submit</button>
|
|
104
|
-
</div>
|
|
105
|
-
<div class="api-output"></div>
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
108
|
-
<div class="api-section">
|
|
109
|
-
<div class="api-header" onclick="toggleSection(this)">GET /api/pages/:name</div>
|
|
110
|
-
<div class="api-content">
|
|
111
|
-
This operation retrieves the metadata for a single page, including title, categories, pinned, createdDate, lastModified, pageVersion, and mode.
|
|
112
|
-
<div class="api-input">
|
|
113
|
-
<input type="text" placeholder="Page Name">
|
|
114
|
-
<button onclick="callPageApi(event, 'GET')">Submit</button>
|
|
115
|
-
</div>
|
|
116
|
-
<div class="api-output"></div>
|
|
117
|
-
</div>
|
|
118
|
-
</div>
|
|
119
|
-
<div class="api-section">
|
|
120
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/pages/:name</div>
|
|
121
|
-
<div class="api-content">
|
|
122
|
-
This operation merges metadata for a page. Send only the fields you want to update. Supported fields: title (string), categories (array of strings), pinned (boolean), mode ("unlocked" | "locked"). The lastModified timestamp is auto-set on each update. The createdDate and pageVersion fields are preserved and cannot be overridden.
|
|
123
|
-
<div class="api-input">
|
|
124
|
-
<input type="text" placeholder="Page Name">
|
|
125
|
-
<textarea placeholder="{ "title": "My Page", "categories": ["System"], "pinned": true, "mode": "unlocked" }"></textarea>
|
|
126
|
-
<button onclick="callPageApi(event, 'POST')">Submit</button>
|
|
127
|
-
</div>
|
|
128
|
-
<div class="api-output"></div>
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
<div class="api-section">
|
|
132
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/pages/:name/pin</div>
|
|
133
|
-
<div class="api-content">
|
|
134
|
-
This operation toggles the pinned status for a page. The request body should include pinned (boolean).
|
|
135
|
-
<div class="api-input">
|
|
136
|
-
<input type="text" placeholder="Page Name">
|
|
137
|
-
<textarea placeholder="{ "pinned": true }"></textarea>
|
|
138
|
-
<button onclick="callPageApi(event, 'POST', '/pin')">Submit</button>
|
|
139
|
-
</div>
|
|
140
|
-
<div class="api-output"></div>
|
|
141
|
-
</div>
|
|
142
|
-
</div>
|
|
143
|
-
<div class="api-section">
|
|
144
|
-
<div class="api-header" onclick="toggleSection(this)">DELETE /api/pages/:name</div>
|
|
145
|
-
<div class="api-content">
|
|
146
|
-
This operation deletes a user page. Required (system) pages cannot be deleted. Returns 400 if the page is a required page, or 404 if not found.
|
|
147
|
-
<div class="api-input">
|
|
148
|
-
<input type="text" placeholder="Page Name">
|
|
149
|
-
<button onclick="callPageApi(event, 'DELETE')">Submit</button>
|
|
150
|
-
</div>
|
|
151
|
-
<div class="api-output"></div>
|
|
152
|
-
</div>
|
|
153
|
-
</div>
|
|
154
|
-
<div class="api-section">
|
|
155
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/pages/:name/copy</div>
|
|
156
|
-
<div class="api-content">
|
|
157
|
-
This operation copies a page to a new name. The source page can be a user page or a required (system) page. The request body should include name (string, required), title (string, optional), and categories (array of strings, optional). Returns 409 if the target page already exists.
|
|
158
|
-
<div class="api-input">
|
|
159
|
-
<input type="text" placeholder="Page Name">
|
|
160
|
-
<textarea placeholder="{ "name": "new-page-name", "title": "My Copy", "categories": ["Tools"] }"></textarea>
|
|
161
|
-
<button onclick="callPageApi(event, 'POST', '/copy')">Submit</button>
|
|
162
|
-
</div>
|
|
163
|
-
<div class="api-output"></div>
|
|
164
|
-
</div>
|
|
165
|
-
</div>
|
|
166
|
-
<div class="api-section">
|
|
167
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/search/web</div>
|
|
168
|
-
<div class="api-content">
|
|
169
|
-
This operation searches the web using Brave Search and returns a list of results. Requires Brave Search to be enabled in Settings > Connectors.
|
|
170
|
-
<div class="api-input">
|
|
171
|
-
<input type="text" placeholder="Search query" id="webSearchQuery">
|
|
172
|
-
<input type="number" placeholder="Count (optional, 1-20)" id="webSearchCount" min="1" max="20">
|
|
173
|
-
<button onclick="webSearch(event)">Search</button>
|
|
174
|
-
</div>
|
|
175
|
-
<div class="api-output"></div>
|
|
176
|
-
</div>
|
|
177
|
-
</div>
|
|
178
|
-
<div class="api-section">
|
|
179
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/generate/image</div>
|
|
180
|
-
<div class="api-content">
|
|
181
|
-
This operation generates an image based on a prompt. You can specify the shape and style of the image.
|
|
182
|
-
<div class="api-input">
|
|
183
|
-
<input type="text" placeholder="Prompt" id="imagePrompt">
|
|
184
|
-
<select id="imageShape">
|
|
185
|
-
<option value="square">Square</option>
|
|
186
|
-
<option value="portrait">Portrait</option>
|
|
187
|
-
<option value="landscape">Landscape</option>
|
|
188
|
-
</select>
|
|
189
|
-
<select id="imageStyle">
|
|
190
|
-
<option value="vivid">Vivid</option>
|
|
191
|
-
<option value="natural">Natural</option>
|
|
192
|
-
</select>
|
|
193
|
-
<button onclick="generateImage(event)">Generate Image</button>
|
|
194
|
-
</div>
|
|
195
|
-
<div class="api-output"></div>
|
|
196
|
-
</div>
|
|
197
|
-
</div>
|
|
198
|
-
<div class="api-section">
|
|
199
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/generate/completion</div>
|
|
200
|
-
<div class="api-content">
|
|
201
|
-
This operation generates a text completion based on a prompt. You can optionally specify the temperature for controlling randomness.
|
|
202
|
-
<div class="api-input">
|
|
203
|
-
<textarea placeholder="Prompt" id="completionPrompt"></textarea>
|
|
204
|
-
<input type="number" placeholder="Temperature (optional)" id="completionTemperature" step="0.1" min="0" max="1">
|
|
205
|
-
<button onclick="generateCompletion(event)">Generate Completion</button>
|
|
206
|
-
</div>
|
|
207
|
-
<div class="api-output"></div>
|
|
208
|
-
</div>
|
|
209
|
-
</div>
|
|
210
|
-
<div class="api-section">
|
|
211
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/scripts/:id</div>
|
|
212
|
-
<div class="api-content">
|
|
213
|
-
This operation executes a script with the specified ID and passes in the provided variables. The response contains the output of the script execution.
|
|
214
|
-
<div class="api-input">
|
|
215
|
-
<input type="text" placeholder="Script ID" id="scriptId">
|
|
216
|
-
<textarea placeholder="Variables (JSON format)" id="scriptVariables"></textarea>
|
|
217
|
-
<button onclick="executeScript(event)">Execute Script</button>
|
|
218
|
-
</div>
|
|
219
|
-
<div class="api-output"></div>
|
|
220
|
-
</div>
|
|
221
|
-
</div>
|
|
222
|
-
<div class="api-section">
|
|
223
|
-
<div class="api-header" onclick="toggleSection(this)">GET /api/connectors</div>
|
|
224
|
-
<div class="api-content">
|
|
225
|
-
Lists all available connectors with their configuration status. Supports optional category and id query filters.
|
|
226
|
-
<div class="api-input">
|
|
227
|
-
<input type="text" placeholder="Category (optional)" id="connectorListCategory">
|
|
228
|
-
<button onclick="listConnectors(event)">Submit</button>
|
|
229
|
-
</div>
|
|
230
|
-
<div class="api-output"></div>
|
|
231
|
-
</div>
|
|
232
|
-
</div>
|
|
233
|
-
<div class="api-section">
|
|
234
|
-
<div class="api-header" onclick="toggleSection(this)">GET /api/connectors/:id</div>
|
|
235
|
-
<div class="api-content">
|
|
236
|
-
Retrieves full detail for a single connector, including its definition and whether it is configured and enabled.
|
|
237
|
-
<div class="api-input">
|
|
238
|
-
<input type="text" placeholder="Connector ID" id="connectorDetailId">
|
|
239
|
-
<button onclick="getConnectorDetail(event)">Submit</button>
|
|
240
|
-
</div>
|
|
241
|
-
<div class="api-output"></div>
|
|
242
|
-
</div>
|
|
243
|
-
</div>
|
|
244
|
-
<div class="api-section">
|
|
245
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/connectors (proxy call)</div>
|
|
246
|
-
<div class="api-content">
|
|
247
|
-
Proxies a request through a configured connector. The connector attaches authentication automatically based on its auth strategy.
|
|
248
|
-
<div class="api-input">
|
|
249
|
-
<input type="text" placeholder="Connector ID" id="connectorCallId">
|
|
250
|
-
<select id="connectorCallMethod">
|
|
251
|
-
<option value="GET">GET</option>
|
|
252
|
-
<option value="POST">POST</option>
|
|
253
|
-
<option value="PUT">PUT</option>
|
|
254
|
-
<option value="DELETE">DELETE</option>
|
|
255
|
-
</select>
|
|
256
|
-
<input type="text" placeholder="Path (e.g. /res/v1/web/search)" id="connectorCallPath">
|
|
257
|
-
<textarea placeholder="Query params JSON (optional, e.g. { "q": "test" })" id="connectorCallQuery"></textarea>
|
|
258
|
-
<textarea placeholder="Body JSON (optional)" id="connectorCallBody"></textarea>
|
|
259
|
-
<button onclick="callConnector(event)">Submit</button>
|
|
260
|
-
</div>
|
|
261
|
-
<div class="api-output"></div>
|
|
262
|
-
</div>
|
|
263
|
-
</div>
|
|
264
|
-
<div class="api-section">
|
|
265
|
-
<div class="api-header" onclick="toggleSection(this)">GET /api/agents</div>
|
|
266
|
-
<div class="api-content">
|
|
267
|
-
Lists configured agents (A2A and OpenClaw). Supports optional filters: enabled (boolean) and provider (a2a|openclaw). Returns id, name, description, url, enabled, provider, and capabilities for each agent.
|
|
268
|
-
<div class="api-input">
|
|
269
|
-
<select id="agentListEnabled">
|
|
270
|
-
<option value="">All</option>
|
|
271
|
-
<option value="true">Enabled only</option>
|
|
272
|
-
</select>
|
|
273
|
-
<select id="agentListProvider">
|
|
274
|
-
<option value="">All providers</option>
|
|
275
|
-
<option value="a2a">A2A</option>
|
|
276
|
-
<option value="openclaw">OpenClaw</option>
|
|
277
|
-
</select>
|
|
278
|
-
<button onclick="listAgents(event)">Submit</button>
|
|
279
|
-
</div>
|
|
280
|
-
<div class="api-output"></div>
|
|
281
|
-
</div>
|
|
282
|
-
</div>
|
|
283
|
-
<div class="api-section">
|
|
284
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/agents/:id/send</div>
|
|
285
|
-
<div class="api-content">
|
|
286
|
-
Sends a text message to an agent (works for both A2A and OpenClaw protocols). Returns a normalized response: { kind: 'message'|'task', text?: string, raw: object }. Optionally include an attachments array: [{ fileName: string, mimeType: string, content: string (base64 for binary) }].
|
|
287
|
-
<div class="api-input">
|
|
288
|
-
<input type="text" placeholder="Agent ID" id="agentSendId">
|
|
289
|
-
<textarea placeholder="Message" id="agentSendMessage"></textarea>
|
|
290
|
-
<button onclick="sendAgentMessage(event)">Send</button>
|
|
291
|
-
</div>
|
|
292
|
-
<div class="api-output"></div>
|
|
293
|
-
</div>
|
|
294
|
-
</div>
|
|
295
|
-
<div class="api-section">
|
|
296
|
-
<div class="api-header" onclick="toggleSection(this)">POST /api/agents/:id/stream</div>
|
|
297
|
-
<div class="api-content">
|
|
298
|
-
Sends a message and receives a streaming SSE response. Each event is JSON: { kind: 'text'|'status'|'artifact'|'done'|'error', data: any }. The stream ends with a [DONE] sentinel. Optionally include an attachments array: [{ fileName: string, mimeType: string, content: string (base64 for binary) }].
|
|
299
|
-
<div class="api-input">
|
|
300
|
-
<input type="text" placeholder="Agent ID" id="agentStreamId">
|
|
301
|
-
<textarea placeholder="Message" id="agentStreamMessage"></textarea>
|
|
302
|
-
<button onclick="streamAgentMessage(event)">Stream</button>
|
|
303
|
-
</div>
|
|
304
|
-
<div class="api-output"></div>
|
|
305
|
-
</div>
|
|
306
|
-
</div>
|
|
307
|
-
<div class="api-section">
|
|
308
|
-
<div class="api-header" onclick="toggleSection(this)">PATCH /api/agents/:id</div>
|
|
309
|
-
<div class="api-content">
|
|
310
|
-
Toggle an agent's enabled/disabled state or update its name and description. Send only the fields to change.
|
|
311
|
-
<div class="api-input">
|
|
312
|
-
<input type="text" placeholder="Agent ID" id="agentPatchId">
|
|
313
|
-
<textarea placeholder="{ "enabled": true }" id="agentPatchBody"></textarea>
|
|
314
|
-
<button onclick="patchAgent(event)">Submit</button>
|
|
315
|
-
</div>
|
|
316
|
-
<div class="api-output"></div>
|
|
317
|
-
</div>
|
|
318
|
-
</div>
|
|
319
|
-
</div>
|
|
320
|
-
<div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>
|
|
321
|
-
</div>
|
|
322
|
-
<div id="instructions" style="display: none;" data-locked="true"></div>
|
|
323
|
-
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
324
|
-
<script id="api-explorer">function toggleSection(header){const content=header.nextElementSibling;content.style.display="block"===content.style.display?"none":"block"}function callApi(event,method,endpoint){event.preventDefault();const button=event.target;button.disabled=!0;const inputs=event.target.parentElement.querySelectorAll("input, textarea");let url=endpoint,data={};inputs.forEach(input=>{"Page Name"===input.placeholder?url+=input.value:"Table Name"===input.placeholder||"ID"===input.placeholder?url+="/"+input.value:"JSON Data"===input.placeholder&&(data=JSON.parse(input.value))}),fetch(url,{method:method,headers:{"Content-Type":"application/json"},body:"POST"===method?JSON.stringify(data):null}).then(response=>response.json()).then(data=>{console.log("Success:",data),event.target.parentElement.nextElementSibling.textContent=JSON.stringify(data,null,2)}).catch(error=>{console.error("Error:",error),alert("API call failed! Check console for details.")}).finally(()=>{button.disabled=!1})}function callPaginatedApi(event){event.preventDefault();const button=event.target;button.disabled=!0;const inputs=event.target.parentElement.querySelectorAll("input");let page="",table="",limit="",offset="";inputs.forEach(input=>{"Page Name"===input.placeholder?page=input.value:"Table Name"===input.placeholder?table=input.value:"Limit"===input.placeholder?limit=input.value:"Offset (optional)"===input.placeholder&&(offset=input.value)});let url="/api/data/"+encodeURIComponent(page)+"/"+encodeURIComponent(table)+"?limit="+encodeURIComponent(limit);offset&&(url+="&offset="+encodeURIComponent(offset)),fetch(url).then(response=>response.json()).then(data=>{event.target.parentElement.nextElementSibling.textContent=JSON.stringify(data,null,2)}).catch(error=>{console.error("Error:",error),alert("API call failed! Check console for details.")}).finally(()=>{button.disabled=!1})}function callPageApi(event,method,suffix){event.preventDefault();const button=event.target;button.disabled=!0;const inputs=event.target.parentElement.querySelectorAll("input, textarea");let pageName="",data=null;inputs.forEach(input=>{"Page Name"===input.placeholder?pageName=input.value:"TEXTAREA"===input.tagName&&(data=JSON.parse(input.value))});const url="/api/pages/"+encodeURIComponent(pageName)+(suffix||"");fetch(url,{method:method,headers:{"Content-Type":"application/json"},body:"POST"===method?JSON.stringify(data):null}).then(response=>response.json()).then(data=>{event.target.parentElement.nextElementSibling.textContent=JSON.stringify(data,null,2)}).catch(error=>{console.error("Error:",error),alert("API call failed! Check console for details.")}).finally(()=>{button.disabled=!1})}function generateImage(event){event.preventDefault();const button=event.target;button.disabled=!0;const prompt=document.getElementById("imagePrompt").value,shape=document.getElementById("imageShape").value,style=document.getElementById("imageStyle").value,outputBox=event.target.parentElement.nextElementSibling;fetch("/api/generate/image",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:prompt,shape:shape,style:style})}).then(response=>response.json()).then(data=>{if(console.log("Success:",data),outputBox.textContent=JSON.stringify(data,null,2),data.url){const img=document.createElement("img");img.src=data.url,img.alt="Generated Image",img.className="generated-image",outputBox.appendChild(img)}}).catch(error=>{console.error("Error:",error),alert("Image generation failed! Check console for details.")}).finally(()=>{button.disabled=!1})}function generateCompletion(event){event.preventDefault();const button=event.target;button.disabled=!0;const prompt=document.getElementById("completionPrompt").value,temperature=document.getElementById("completionTemperature").value,outputBox=event.target.parentElement.nextElementSibling;fetch("/api/generate/completion",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:prompt,temperature:parseFloat(temperature)||void 0})}).then(response=>response.json()).then(data=>{console.log("Success:",data),outputBox.textContent=JSON.stringify(data,null,2)}).catch(error=>{console.error("Error:",error),alert("Completion generation failed! Check console for details.")}).finally(()=>{button.disabled=!1})}function webSearch(event){event.preventDefault();var button=event.target;button.disabled=!0;var query=document.getElementById("webSearchQuery").value,count=document.getElementById("webSearchCount").value,outputBox=event.target.parentElement.nextElementSibling,body={query:query};count&&(body.count=parseInt(count,10)),fetch("/api/search/web",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)}).then(function(response){return response.json()}).then(function(data){outputBox.textContent=JSON.stringify(data,null,2)}).catch(function(error){console.error("Error:",error),alert("Web search failed! Check console for details.")}).finally(function(){button.disabled=!1})}function executeScript(event){event.preventDefault();const button=event.target;button.disabled=!0;const scriptId=document.getElementById("scriptId").value,variables=JSON.parse(document.getElementById("scriptVariables").value),outputBox=event.target.parentElement.nextElementSibling;fetch(`/api/scripts/${scriptId}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(variables)}).then(response=>response.json()).then(data=>{console.log("Success:",data),outputBox.textContent=JSON.stringify(data,null,2)}).catch(error=>{console.error("Error:",error),alert("Script execution failed! Check console for details.")}).finally(()=>{button.disabled=!1})}function listConnectors(event){event.preventDefault();var button=event.target;button.disabled=!0;var category=document.getElementById("connectorListCategory").value;var url="/api/connectors";if(category)url+="?category="+encodeURIComponent(category);var outputBox=event.target.parentElement.nextElementSibling;fetch(url).then(function(r){return r.json()}).then(function(data){outputBox.textContent=JSON.stringify(data,null,2)}).catch(function(err){console.error("Error:",err);alert("Failed! Check console.")}).finally(function(){button.disabled=!1})}function getConnectorDetail(event){event.preventDefault();var button=event.target;button.disabled=!0;var id=document.getElementById("connectorDetailId").value;var outputBox=event.target.parentElement.nextElementSibling;fetch("/api/connectors/"+encodeURIComponent(id)).then(function(r){return r.json()}).then(function(data){outputBox.textContent=JSON.stringify(data,null,2)}).catch(function(err){console.error("Error:",err);alert("Failed! Check console.")}).finally(function(){button.disabled=!1})}function callConnector(event){event.preventDefault();var button=event.target;button.disabled=!0;var body={connector:document.getElementById("connectorCallId").value,method:document.getElementById("connectorCallMethod").value,path:document.getElementById("connectorCallPath").value};var queryVal=document.getElementById("connectorCallQuery").value;if(queryVal)try{body.query=JSON.parse(queryVal)}catch(e){}var bodyVal=document.getElementById("connectorCallBody").value;if(bodyVal)try{body.body=JSON.parse(bodyVal)}catch(e){}var outputBox=event.target.parentElement.nextElementSibling;fetch("/api/connectors",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)}).then(function(r){return r.json()}).then(function(data){outputBox.textContent=JSON.stringify(data,null,2)}).catch(function(err){console.error("Error:",err);alert("Failed! Check console.")}).finally(function(){button.disabled=!1})}function listAgents(event){event.preventDefault();var button=event.target;button.disabled=!0;var enabled=document.getElementById("agentListEnabled").value;var provider=document.getElementById("agentListProvider").value;var url="/api/agents";var params=[];if(enabled)params.push("enabled="+enabled);if(provider)params.push("provider="+encodeURIComponent(provider));if(params.length)url+="?"+params.join("&");var outputBox=event.target.parentElement.nextElementSibling;fetch(url).then(function(r){return r.json()}).then(function(data){outputBox.textContent=JSON.stringify(data,null,2)}).catch(function(err){console.error("Error:",err);alert("Failed! Check console.")}).finally(function(){button.disabled=!1})}function sendAgentMessage(event){event.preventDefault();var button=event.target;button.disabled=!0;var id=document.getElementById("agentSendId").value;var message=document.getElementById("agentSendMessage").value;var outputBox=event.target.parentElement.nextElementSibling;fetch("/api/agents/"+encodeURIComponent(id)+"/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:message})}).then(function(r){return r.json()}).then(function(data){outputBox.textContent=JSON.stringify(data,null,2)}).catch(function(err){console.error("Error:",err);alert("Failed! Check console.")}).finally(function(){button.disabled=!1})}function streamAgentMessage(event){event.preventDefault();var button=event.target;button.disabled=!0;var id=document.getElementById("agentStreamId").value;var message=document.getElementById("agentStreamMessage").value;var outputBox=event.target.parentElement.nextElementSibling;outputBox.textContent="Streaming...\n";fetch("/api/agents/"+encodeURIComponent(id)+"/stream",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:message})}).then(function(res){var reader=res.body.getReader();var decoder=new TextDecoder();var buffer="";function pump(){return reader.read().then(function(result){if(result.done){button.disabled=!1;return}buffer+=decoder.decode(result.value,{stream:!0});var lines=buffer.split("\n");buffer=lines.pop()||"";for(var i=0;i<lines.length;i++){var line=lines[i];if(line.indexOf("data: ")===0){var data=line.substring(6);if(data==="[DONE]"){outputBox.textContent+="\n[DONE]";button.disabled=!1;return}try{var event=JSON.parse(data);outputBox.textContent+=JSON.stringify(event)+"\n"}catch(e){}}}return pump()})}return pump()}).catch(function(err){console.error("Error:",err);outputBox.textContent+="Error: "+err.message;button.disabled=!1})}function patchAgent(event){event.preventDefault();var button=event.target;button.disabled=!0;var id=document.getElementById("agentPatchId").value;var body;try{body=JSON.parse(document.getElementById("agentPatchBody").value)}catch(e){alert("Invalid JSON");button.disabled=!1;return}var outputBox=event.target.parentElement.nextElementSibling;fetch("/api/agents/"+encodeURIComponent(id),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)}).then(function(r){return r.json()}).then(function(data){outputBox.textContent=JSON.stringify(data,null,2)}).catch(function(err){console.error("Error:",err);alert("Failed! Check console.")}).finally(function(){button.disabled=!1})}</script>
|
|
325
|
-
<script id="page-helpers" src="/api/page-helpers.js?v=2" data-locked="true"></script>
|
|
326
|
-
<script id="page-script" src="/api/page-script.js?v=2" data-locked="true"></script>
|
|
327
|
-
</body></html>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "SynthOS APIs", "categories": ["System"], "pinned": false, "showInAll": false, "pageVersion": 2, "mode": "locked" }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "SynthOS Scripts", "categories": ["System"], "pinned": false, "showInAll": false, "pageVersion": 2, "mode": "locked" }
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "airtable",
|
|
3
|
-
"name": "Airtable",
|
|
4
|
-
"category": "Productivity",
|
|
5
|
-
"description": "Cloud database and spreadsheet hybrid. Create, read, update, and manage structured data in Airtable bases.",
|
|
6
|
-
"baseUrl": "https://api.airtable.com",
|
|
7
|
-
"authStrategy": "bearer",
|
|
8
|
-
"authKey": "Authorization",
|
|
9
|
-
"fields": [
|
|
10
|
-
{ "name": "apiKey", "label": "Personal Access Token", "type": "password" }
|
|
11
|
-
],
|
|
12
|
-
"hints": [
|
|
13
|
-
"List records: GET /v0/{baseId}/{tableName}",
|
|
14
|
-
"Create record: POST /v0/{baseId}/{tableName} with body: { fields: { ... } }",
|
|
15
|
-
"Update record: PATCH /v0/{baseId}/{tableName}/{recordId} with body: { fields: { ... } }",
|
|
16
|
-
"Response: { records: [{ id, fields: { ... } }] }",
|
|
17
|
-
"Get your base ID from the Airtable API docs page for your base."
|
|
18
|
-
],
|
|
19
|
-
"onboarding": {
|
|
20
|
-
"url": "https://airtable.com/create/tokens",
|
|
21
|
-
"steps": [
|
|
22
|
-
"Log in to your Airtable account",
|
|
23
|
-
"Go to airtable.com/create/tokens",
|
|
24
|
-
"Create a personal access token with the scopes you need and copy it"
|
|
25
|
-
]
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "alpha-vantage",
|
|
3
|
-
"name": "Alpha Vantage",
|
|
4
|
-
"category": "Finance",
|
|
5
|
-
"description": "Stock market data, forex, crypto, and technical indicators. Real-time and historical financial data.",
|
|
6
|
-
"baseUrl": "https://www.alphavantage.co",
|
|
7
|
-
"authStrategy": "query",
|
|
8
|
-
"authKey": "apikey",
|
|
9
|
-
"fields": [
|
|
10
|
-
{ "name": "apiKey", "label": "API Key", "type": "password" }
|
|
11
|
-
],
|
|
12
|
-
"hints": [
|
|
13
|
-
"Stock quote: GET /query?function=GLOBAL_QUOTE&symbol={SYMBOL}",
|
|
14
|
-
"Daily time series: GET /query?function=TIME_SERIES_DAILY&symbol={SYMBOL}",
|
|
15
|
-
"Forex rate: GET /query?function=CURRENCY_EXCHANGE_RATE&from_currency=USD&to_currency=EUR",
|
|
16
|
-
"Free tier: 25 requests/day. Response is JSON with nested objects keyed by metadata labels."
|
|
17
|
-
],
|
|
18
|
-
"onboarding": {
|
|
19
|
-
"url": "https://www.alphavantage.co/support/#api-key",
|
|
20
|
-
"steps": [
|
|
21
|
-
"Visit the Alpha Vantage API key page",
|
|
22
|
-
"Fill in your details and click Get Free API Key",
|
|
23
|
-
"Copy the API key shown on the page"
|
|
24
|
-
]
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "brave-search",
|
|
3
|
-
"name": "Brave Search",
|
|
4
|
-
"category": "Search",
|
|
5
|
-
"description": "Web search powered by the Brave Search API. Provides real-time search results from the web.",
|
|
6
|
-
"baseUrl": "https://api.search.brave.com",
|
|
7
|
-
"authStrategy": "header",
|
|
8
|
-
"authKey": "X-Subscription-Token",
|
|
9
|
-
"fields": [
|
|
10
|
-
{ "name": "apiKey", "label": "API Key", "type": "password" }
|
|
11
|
-
],
|
|
12
|
-
"hints": [
|
|
13
|
-
"Endpoint: GET /res/v1/web/search",
|
|
14
|
-
"Query params: q (required), count (1-20, default 10), country, freshness",
|
|
15
|
-
"Response: { web: { results: [{ title, url, description }] } }",
|
|
16
|
-
"Note: synthos.search.web() is a convenience wrapper — prefer it over raw connector calls for basic web search."
|
|
17
|
-
],
|
|
18
|
-
"onboarding": {
|
|
19
|
-
"url": "https://brave.com/search/api/",
|
|
20
|
-
"steps": [
|
|
21
|
-
"Create an account at brave.com/search/api/",
|
|
22
|
-
"Subscribe to the Free plan (2,000 queries/mo)",
|
|
23
|
-
"Go to your dashboard and copy your API key"
|
|
24
|
-
]
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "cloudinary",
|
|
3
|
-
"name": "Cloudinary",
|
|
4
|
-
"category": "Media",
|
|
5
|
-
"description": "Cloud-based image and video management. Upload, transform, optimize, and deliver media assets.",
|
|
6
|
-
"baseUrl": "https://api.cloudinary.com",
|
|
7
|
-
"authStrategy": "header",
|
|
8
|
-
"authKey": "Authorization",
|
|
9
|
-
"fields": [
|
|
10
|
-
{ "name": "apiKey", "label": "Auth (Base64 key:secret)", "type": "password" }
|
|
11
|
-
],
|
|
12
|
-
"hints": [
|
|
13
|
-
"Upload image: POST /v1_1/{cloud_name}/image/upload",
|
|
14
|
-
" Body: { file: \"<url or base64>\", upload_preset: \"...\" }",
|
|
15
|
-
"List resources: GET /v1_1/{cloud_name}/resources/image",
|
|
16
|
-
"IMPORTANT: Cloudinary uses Basic auth. Save your key as 'Basic base64(API_KEY:API_SECRET)'.",
|
|
17
|
-
"Replace {cloud_name} in paths with your Cloudinary cloud name."
|
|
18
|
-
],
|
|
19
|
-
"onboarding": {
|
|
20
|
-
"url": "https://cloudinary.com/users/register_free",
|
|
21
|
-
"steps": [
|
|
22
|
-
"Create a free Cloudinary account",
|
|
23
|
-
"Go to Settings > Access Keys",
|
|
24
|
-
"Base64-encode 'API_KEY:API_SECRET' and paste as your key"
|
|
25
|
-
]
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "deepl",
|
|
3
|
-
"name": "DeepL",
|
|
4
|
-
"category": "Translation",
|
|
5
|
-
"description": "High-quality AI translation for 30+ languages. Translate text and documents with state-of-the-art neural machine translation.",
|
|
6
|
-
"baseUrl": "https://api-free.deepl.com",
|
|
7
|
-
"authStrategy": "header",
|
|
8
|
-
"authKey": "Authorization",
|
|
9
|
-
"fields": [
|
|
10
|
-
{ "name": "apiKey", "label": "API Key", "type": "password" }
|
|
11
|
-
],
|
|
12
|
-
"hints": [
|
|
13
|
-
"Translate text: POST /v2/translate",
|
|
14
|
-
" Body: { text: [\"Hello\"], target_lang: \"DE\" }",
|
|
15
|
-
" Response: { translations: [{ detected_source_language: \"EN\", text: \"Hallo\" }] }",
|
|
16
|
-
"Supported languages: GET /v2/languages",
|
|
17
|
-
"IMPORTANT: The auth header value must be: DeepL-Auth-Key YOUR_KEY. The proxy sends raw apiKey — prepend 'DeepL-Auth-Key ' when saving your key.",
|
|
18
|
-
"Free tier: 500,000 characters/month."
|
|
19
|
-
],
|
|
20
|
-
"onboarding": {
|
|
21
|
-
"url": "https://www.deepl.com/pro-api",
|
|
22
|
-
"steps": [
|
|
23
|
-
"Sign up for a DeepL API Free account",
|
|
24
|
-
"Go to your Account > API Keys",
|
|
25
|
-
"Copy your Authentication Key"
|
|
26
|
-
]
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "elevenlabs",
|
|
3
|
-
"name": "ElevenLabs",
|
|
4
|
-
"category": "Audio",
|
|
5
|
-
"description": "AI-powered text-to-speech and voice synthesis. Generate natural-sounding audio from text.",
|
|
6
|
-
"baseUrl": "https://api.elevenlabs.io",
|
|
7
|
-
"authStrategy": "header",
|
|
8
|
-
"authKey": "xi-api-key",
|
|
9
|
-
"fields": [
|
|
10
|
-
{ "name": "apiKey", "label": "API Key", "type": "password" }
|
|
11
|
-
],
|
|
12
|
-
"hints": [
|
|
13
|
-
"List voices: GET /v1/voices → { voices: [{ voice_id, name, category }] }",
|
|
14
|
-
"Text-to-speech: POST /v1/text-to-speech/{voice_id}?output_format=mp3_44100_128",
|
|
15
|
-
" Request headers: Accept: audio/mpeg, Content-Type: application/json",
|
|
16
|
-
" Request body: { text: string, model_id: \"eleven_multilingual_v2\" }",
|
|
17
|
-
" Response: raw audio/mpeg binary — use resp.arrayBuffer() then new Blob([buf], {type:\"audio/mpeg\"}) and URL.createObjectURL() to play",
|
|
18
|
-
" IMPORTANT: The proxy returns raw binary, NOT JSON. Call fetch(\"/api/connectors\", ...) directly instead of synthos.connectors.call() for TTS, since the helper parses JSON.",
|
|
19
|
-
"Default voice: \"Rachel\" (voice_id: 21m00Tcm4TlvDq8ikWAM) is a good general-purpose voice.",
|
|
20
|
-
"Max text length: 5000 characters per request."
|
|
21
|
-
],
|
|
22
|
-
"onboarding": {
|
|
23
|
-
"url": "https://elevenlabs.io/",
|
|
24
|
-
"steps": [
|
|
25
|
-
"Create an account at elevenlabs.io",
|
|
26
|
-
"Go to your Profile settings",
|
|
27
|
-
"Copy your API key from the API Key section"
|
|
28
|
-
]
|
|
29
|
-
}
|
|
30
|
-
}
|