insforge 0.3.3 → 1.3.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/.claude-plugin/marketplace.json +20 -0
- package/.dockerignore +60 -57
- package/.env.example +84 -49
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +66 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -0
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -3
- package/CLAUDE_PLUGIN.md +104 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -27
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -134
- package/assets/Dark.svg +23 -23
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/auth/index.html +13 -0
- package/auth/package.json +28 -0
- package/auth/public/favicon.ico +0 -0
- package/auth/src/App.tsx +33 -0
- package/auth/src/components/ErrorCard.tsx +37 -0
- package/auth/src/components/Layout.tsx +13 -0
- package/auth/src/index.css +19 -0
- package/auth/src/lib/broadcastService.ts +117 -0
- package/auth/src/lib/utils.ts +11 -0
- package/auth/src/main.tsx +22 -0
- package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
- package/auth/src/pages/ResetPasswordPage.tsx +11 -0
- package/auth/src/pages/SignInPage.tsx +60 -0
- package/auth/src/pages/SignUpPage.tsx +60 -0
- package/auth/src/pages/VerifyEmailPage.tsx +20 -0
- package/auth/src/vite-env.d.ts +10 -0
- package/auth/tsconfig.json +32 -0
- package/auth/tsconfig.node.json +11 -0
- package/auth/vite.config.ts +25 -0
- package/backend/package.json +78 -75
- package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
- package/backend/src/api/middlewares/rate-limiters.ts +127 -0
- package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
- package/backend/src/api/routes/auth/index.routes.ts +667 -0
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
- package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
- package/backend/src/api/routes/database/index.routes.ts +90 -0
- package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
- package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
- package/backend/src/api/routes/docs/index.routes.ts +75 -0
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +194 -0
- package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
- package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
- package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
- package/backend/src/api/routes/usage/index.routes.ts +91 -0
- package/backend/src/infra/config/app.config.ts +51 -0
- package/backend/src/infra/database/database.manager.ts +182 -0
- package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
- package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
- package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
- package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
- package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
- package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
- package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
- package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
- package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
- package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
- package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
- package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
- package/backend/src/infra/security/token.manager.ts +219 -0
- package/backend/src/infra/socket/socket.manager.ts +522 -0
- package/backend/src/providers/ai/openrouter.provider.ts +380 -0
- package/backend/src/providers/email/base.provider.ts +38 -0
- package/backend/src/providers/email/cloud.provider.ts +271 -0
- package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
- package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
- package/backend/src/providers/logs/local.provider.ts +185 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/base.provider.ts +29 -0
- package/backend/src/providers/oauth/discord.provider.ts +195 -0
- package/backend/src/providers/oauth/facebook.provider.ts +194 -0
- package/backend/src/providers/oauth/github.provider.ts +208 -0
- package/backend/src/providers/oauth/google.provider.ts +249 -0
- package/backend/src/providers/oauth/index.ts +8 -0
- package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
- package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
- package/backend/src/providers/oauth/x.provider.ts +202 -0
- package/backend/src/providers/storage/base.provider.ts +29 -0
- package/backend/src/providers/storage/local.provider.ts +103 -0
- package/backend/src/providers/storage/s3.provider.ts +313 -0
- package/backend/src/server.ts +317 -288
- package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
- package/backend/src/services/ai/ai-model.service.ts +60 -0
- package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
- package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
- package/backend/src/services/ai/helpers.ts +64 -0
- package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
- package/backend/src/services/ai/index.ts +13 -0
- package/backend/src/services/auth/auth-config.service.ts +250 -0
- package/backend/src/services/auth/auth-otp.service.ts +424 -0
- package/backend/src/services/auth/auth.service.ts +1150 -0
- package/backend/src/services/auth/index.ts +4 -0
- package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
- package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
- package/backend/src/services/database/database-table.service.ts +802 -0
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +73 -0
- package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
- package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
- package/backend/src/services/logs/log.service.ts +73 -0
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
- package/backend/src/services/storage/storage.service.ts +617 -0
- package/backend/src/services/usage/usage.service.ts +149 -0
- package/backend/src/types/auth.ts +77 -2
- package/backend/src/types/email.ts +8 -0
- package/backend/src/types/error-constants.ts +4 -0
- package/backend/src/types/logs.ts +0 -29
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/environment.ts +9 -3
- package/backend/src/utils/logger.ts +20 -2
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -205
- package/backend/src/utils/sql-parser.ts +91 -1
- package/backend/src/utils/utils.ts +114 -0
- package/backend/src/utils/validations.ts +40 -4
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -0
- package/backend/tests/local/test-ai-usage.sh +80 -0
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -0
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -0
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -247
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -0
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -302
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tests/unit/cloud-token.test.ts +48 -0
- package/backend/tests/unit/constant.test.ts +8 -0
- package/backend/tests/unit/email.test.ts +372 -0
- package/backend/tests/unit/environment.test.ts +59 -0
- package/backend/tests/unit/helpers.test.ts +63 -0
- package/backend/tests/unit/logger.test.ts +22 -0
- package/backend/tests/unit/rate-limit.test.ts +154 -0
- package/backend/tests/unit/response.test.ts +58 -0
- package/backend/tests/unit/sql-parser.test.ts +74 -0
- package/backend/tests/unit/uuid.test.ts +21 -0
- package/backend/tests/unit/validations.test.ts +80 -0
- package/backend/tsconfig.json +22 -22
- package/backend/vitest.config.ts +11 -0
- package/claude-plugin/.claude-plugin/plugin.json +24 -0
- package/claude-plugin/README.md +133 -0
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
- package/docker-compose.prod.yml +204 -144
- package/docker-compose.yml +232 -167
- package/docker-init/db/db-init.sql +97 -125
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -0
- package/docs/README.md +44 -0
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -0
- package/docs/core-concepts/ai/architecture.mdx +373 -0
- package/docs/core-concepts/ai/sdk.mdx +213 -0
- package/docs/core-concepts/authentication/architecture.mdx +278 -0
- package/docs/core-concepts/authentication/sdk.mdx +414 -0
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
- package/docs/core-concepts/database/architecture.mdx +256 -0
- package/docs/core-concepts/database/sdk.mdx +382 -0
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -0
- package/docs/core-concepts/functions/sdk.mdx +184 -0
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -0
- package/docs/core-concepts/storage/sdk.mdx +253 -0
- package/docs/deployment/README.md +94 -0
- package/docs/deployment/deploy-to-aws-ec2.md +565 -0
- package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
- package/docs/deployment/deploy-to-render.md +441 -0
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -0
- package/docs/examples/framework-guides/nextjs.mdx +131 -0
- package/docs/examples/framework-guides/nuxt.mdx +165 -0
- package/docs/examples/framework-guides/react.mdx +165 -0
- package/docs/examples/framework-guides/svelte.mdx +153 -0
- package/docs/examples/framework-guides/vue.mdx +159 -0
- package/docs/examples/overview.mdx +67 -0
- package/docs/favicon.svg +19 -0
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
- package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
- package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
- package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
- package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
- package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
- package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
- package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
- package/docs/images/checks-passed.png +0 -0
- package/docs/images/dashboard-connect-expanded.png +0 -0
- package/docs/images/dashboard-connect.png +0 -0
- package/docs/images/hero-dark.png +0 -0
- package/docs/images/hero-light.png +0 -0
- package/docs/images/icons/ai.svg +4 -0
- package/docs/images/icons/auth.svg +1 -0
- package/docs/images/icons/database.svg +1 -0
- package/docs/images/icons/function.svg +1 -0
- package/docs/images/icons/storage.svg +1 -0
- package/docs/images/logos/nextjs.svg +4 -0
- package/docs/images/logos/nuxt.svg +4 -0
- package/docs/images/logos/react.svg +5 -0
- package/docs/images/logos/svelte.svg +4 -0
- package/docs/images/logos/vue.svg +5 -0
- package/docs/images/mcp-install.png +0 -0
- package/docs/images/onboarding-mcp.png +0 -0
- package/docs/insforge-instructions-sdk.md +89 -407
- package/docs/introduction.mdx +45 -0
- package/docs/logo/dark.svg +22 -0
- package/docs/logo/light.svg +20 -0
- package/docs/partnership.mdx +652 -0
- package/docs/quickstart.mdx +83 -0
- package/docs/showcase/2048-arena.png +0 -0
- package/docs/showcase/framegen-cloud.png +0 -0
- package/docs/showcase/line-connect-race.png +0 -0
- package/docs/showcase/moment-vibe.png +0 -0
- package/docs/showcase/national-flags.png +0 -0
- package/docs/showcase/pokemon-vibe.png +0 -0
- package/docs/showcase/pure-browse-buy.png +0 -0
- package/docs/showcase.mdx +52 -0
- package/docs/snippets/sdk-installation.mdx +22 -0
- package/docs/snippets/service-icons.mdx +27 -0
- package/eslint.config.js +10 -3
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -63
- package/frontend/src/App.tsx +13 -82
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -0
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -0
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +4 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -0
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +2 -0
- package/frontend/src/assets/logos/linkedin.svg +3 -0
- package/frontend/src/assets/logos/microsoft.svg +1 -0
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +17 -0
- package/frontend/src/assets/logos/tiktok.svg +6 -0
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -0
- package/frontend/src/components/Checkbox.tsx +27 -29
- package/frontend/src/components/CodeBlock.tsx +55 -2
- package/frontend/src/components/CodeEditor.tsx +92 -0
- package/frontend/src/components/ConfirmDialog.tsx +1 -1
- package/frontend/src/components/ConnectCTA.tsx +38 -0
- package/frontend/src/components/CopyButton.tsx +52 -15
- package/frontend/src/components/ErrorState.tsx +1 -2
- package/frontend/src/components/FeatureSidebar.tsx +6 -6
- package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
- package/frontend/src/components/JsonHighlight.tsx +21 -9
- package/frontend/src/components/ProjectInfoModal.tsx +128 -0
- package/frontend/src/components/PromptDialog.tsx +1 -4
- package/frontend/src/components/SearchInput.tsx +1 -2
- package/frontend/src/components/Stepper.tsx +53 -0
- package/frontend/src/components/ThemeToggle.tsx +3 -3
- package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
- package/frontend/src/components/datagrid/index.ts +23 -0
- package/frontend/src/components/index.ts +23 -30
- package/frontend/src/components/layout/AppHeader.tsx +131 -91
- package/frontend/src/components/layout/AppSidebar.tsx +80 -170
- package/frontend/src/components/layout/Layout.tsx +12 -23
- package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
- package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
- package/frontend/src/components/layout/index.ts +5 -0
- package/frontend/src/components/radix/Tooltip.tsx +24 -13
- package/frontend/src/components/radix/index.ts +22 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
- package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
- package/frontend/src/features/ai/components/index.ts +6 -0
- package/frontend/src/features/ai/helpers.ts +57 -71
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
- package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
- package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
- package/frontend/src/features/ai/services/ai.service.ts +5 -5
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
- package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
- package/frontend/src/features/auth/components/index.ts +5 -0
- package/frontend/src/features/auth/helpers.tsx +208 -0
- package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
- package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
- package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
- package/frontend/src/features/auth/index.ts +3 -2
- package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
- package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
- package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
- package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
- package/frontend/src/features/auth/services/config.service.ts +19 -0
- package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
- package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
- package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
- package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
- package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
- package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
- package/frontend/src/features/dashboard/components/index.ts +4 -0
- package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
- package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
- package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
- package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
- package/frontend/src/features/dashboard/prompts/index.ts +31 -0
- package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
- package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
- package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
- package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
- package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
- package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
- package/frontend/src/features/database/components/TableForm.tsx +28 -19
- package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
- package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
- package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
- package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
- package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
- package/frontend/src/features/database/components/index.ts +19 -0
- package/frontend/src/features/database/constants.ts +28 -2
- package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
- package/frontend/src/features/database/helpers.ts +2 -2
- package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
- package/frontend/src/features/database/hooks/useRecords.ts +139 -0
- package/frontend/src/features/database/hooks/useTables.ts +135 -0
- package/frontend/src/features/database/index.ts +7 -1
- package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
- package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
- package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
- package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
- package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
- package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
- package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
- package/frontend/src/features/database/services/advance.service.ts +40 -0
- package/frontend/src/features/database/services/database.service.ts +33 -194
- package/frontend/src/features/database/services/record.service.ts +219 -0
- package/frontend/src/features/database/services/table.service.ts +58 -0
- package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
- package/frontend/src/features/database/templates/crm-system.ts +528 -0
- package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
- package/frontend/src/features/database/templates/index.ts +34 -0
- package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
- package/frontend/src/features/database/templates/notion-clone.ts +483 -0
- package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
- package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
- package/frontend/src/features/functions/components/index.ts +5 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
- package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
- package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
- package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
- package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
- package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
- package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
- package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
- package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
- package/frontend/src/features/login/services/partnership.service.ts +65 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
- package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
- package/frontend/src/features/logs/components/index.ts +2 -0
- package/frontend/src/features/logs/helpers.ts +24 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
- package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
- package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
- package/frontend/src/features/logs/index.ts +8 -2
- package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
- package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
- package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
- package/frontend/src/features/logs/services/audit.service.ts +63 -0
- package/frontend/src/features/logs/services/log.service.ts +15 -110
- package/frontend/src/features/logs/services/usage.service.ts +31 -0
- package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
- package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
- package/frontend/src/features/onboard/components/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
- package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
- package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
- package/frontend/src/features/onboard/index.ts +13 -3
- package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
- package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
- package/frontend/src/features/storage/components/index.ts +12 -0
- package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
- package/frontend/src/features/storage/services/storage.service.ts +22 -1
- package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
- package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
- package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
- package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
- package/frontend/src/index.css +1 -0
- package/frontend/src/lib/analytics/posthog.tsx +27 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
- package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
- package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
- package/frontend/src/lib/hooks/useToast.tsx +6 -2
- package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
- package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
- package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
- package/frontend/src/lib/utils/menuItems.ts +207 -0
- package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
- package/frontend/src/lib/utils/utils.ts +32 -1
- package/frontend/src/vite-env.d.ts +1 -0
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/frontend/vite.config.ts +5 -3
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -290
- package/functions/worker-template.js +15 -4
- package/i18n/README.ar.md +130 -0
- package/i18n/README.de.md +130 -0
- package/i18n/README.es.md +154 -0
- package/i18n/README.fr.md +134 -0
- package/i18n/README.hi.md +129 -0
- package/i18n/README.ja.md +174 -0
- package/i18n/README.ko.md +137 -0
- package/i18n/README.pt-BR.md +131 -0
- package/i18n/README.ru.md +129 -0
- package/i18n/README.zh-CN.md +133 -0
- package/openapi/ai.yaml +715 -688
- package/openapi/auth.yaml +1244 -563
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -88
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai-api.schema.ts +34 -58
- package/shared-schemas/src/ai.schema.ts +63 -54
- package/shared-schemas/src/auth-api.schema.ts +352 -193
- package/shared-schemas/src/auth.schema.ts +43 -7
- package/shared-schemas/src/cloud-events.schema.ts +57 -0
- package/shared-schemas/src/database-api.schema.ts +35 -4
- package/shared-schemas/src/database.schema.ts +40 -1
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +5 -0
- package/shared-schemas/src/logs-api.schema.ts +7 -1
- package/shared-schemas/src/logs.schema.ts +26 -0
- package/shared-schemas/src/metadata.schema.ts +18 -4
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +1032 -0
- package/.github/workflows/deploy-aws.yml +0 -130
- package/backend/src/api/routes/agent.ts +0 -29
- package/backend/src/api/routes/auth.oauth.ts +0 -482
- package/backend/src/api/routes/auth.ts +0 -386
- package/backend/src/api/routes/docs.ts +0 -66
- package/backend/src/api/routes/functions.ts +0 -183
- package/backend/src/api/routes/openapi.ts +0 -82
- package/backend/src/api/routes/usage.ts +0 -96
- package/backend/src/core/ai/client.ts +0 -242
- package/backend/src/core/ai/model.ts +0 -117
- package/backend/src/core/auth/auth.ts +0 -780
- package/backend/src/core/database/manager.ts +0 -178
- package/backend/src/core/database/table.ts +0 -772
- package/backend/src/core/documentation/agent.ts +0 -689
- package/backend/src/core/documentation/openapi.ts +0 -856
- package/backend/src/core/logs/analytics.ts +0 -76
- package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
- package/backend/src/core/socket/socket.ts +0 -388
- package/backend/src/core/storage/storage.ts +0 -923
- package/backend/src/utils/cloud-token.ts +0 -39
- package/backend/src/utils/helpers.ts +0 -49
- package/backend/src/utils/uuid.ts +0 -9
- package/backend/tests/manual/test-better-auth.sh +0 -303
- package/docker-init/db/logs.sql +0 -9
- package/frontend/README.md +0 -112
- package/frontend/src/components/datagrid/index.tsx +0 -20
- package/frontend/src/components/layout/CloudLayout.tsx +0 -95
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
- package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
- package/frontend/src/features/ai/page/AIPage.tsx +0 -178
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
- package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
- package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
- package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
- package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
- package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
- package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
- package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
- package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
- package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
- package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
- package/frontend/src/features/onboard/types.ts +0 -8
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
- /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
- /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
- /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Architecture
|
|
3
|
+
description: OpenRouter integration for chat completions and image generation
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
InsForge provides unified AI capabilities through OpenRouter, giving you access to multiple LLM providers with a single API and consistent pricing model.
|
|
9
|
+
|
|
10
|
+
## Technology Stack
|
|
11
|
+
|
|
12
|
+
```mermaid
|
|
13
|
+
graph TB
|
|
14
|
+
Client[Client Application] --> SDK[InsForge SDK]
|
|
15
|
+
SDK --> AIAPI[AI API]
|
|
16
|
+
|
|
17
|
+
AIAPI --> OpenRouter[OpenRouter API]
|
|
18
|
+
AIAPI --> DB[(PostgreSQL)]
|
|
19
|
+
|
|
20
|
+
OpenRouter --> Anthropic[Anthropic<br/>Claude Models]
|
|
21
|
+
OpenRouter --> OpenAI[OpenAI<br/>GPT Models]
|
|
22
|
+
OpenRouter --> Google[Google<br/>Gemini]
|
|
23
|
+
|
|
24
|
+
DB --> Config[AI Configurations]
|
|
25
|
+
DB --> Usage[Usage Tracking]
|
|
26
|
+
|
|
27
|
+
AIAPI --> Stream[SSE Streaming]
|
|
28
|
+
|
|
29
|
+
style Client fill:#1e293b,stroke:#475569,color:#e2e8f0
|
|
30
|
+
style SDK fill:#1e40af,stroke:#3b82f6,color:#dbeafe
|
|
31
|
+
style AIAPI fill:#166534,stroke:#22c55e,color:#dcfce7
|
|
32
|
+
style OpenRouter fill:#c2410c,stroke:#fb923c,color:#fed7aa
|
|
33
|
+
style DB fill:#0e7490,stroke:#06b6d4,color:#cffafe
|
|
34
|
+
style Anthropic fill:#6b21a8,stroke:#a855f7,color:#f3e8ff
|
|
35
|
+
style OpenAI fill:#be185d,stroke:#ec4899,color:#fce7f3
|
|
36
|
+
style Google fill:#a16207,stroke:#facc15,color:#fef3c7
|
|
37
|
+
style Config fill:#0e7490,stroke:#22d3ee,color:#cffafe
|
|
38
|
+
style Usage fill:#0e7490,stroke:#22d3ee,color:#cffafe
|
|
39
|
+
style Stream fill:#166534,stroke:#4ade80,color:#dcfce7
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Core Components
|
|
43
|
+
|
|
44
|
+
| Component | Technology | Purpose |
|
|
45
|
+
|-----------|------------|---------|
|
|
46
|
+
| **AI Gateway** | OpenRouter | Unified access to multiple AI providers |
|
|
47
|
+
| **Chat Service** | Node.js + SSE | Handle chat completions with streaming |
|
|
48
|
+
| **Image Service** | Async processing | Generate images via AI models |
|
|
49
|
+
| **Configuration** | PostgreSQL | Store system prompts per project |
|
|
50
|
+
| **Usage Tracking** | PostgreSQL | Monitor token usage |
|
|
51
|
+
| **Response Format** | JSON/SSE | Standard and streaming responses |
|
|
52
|
+
|
|
53
|
+
## OpenRouter Integration
|
|
54
|
+
|
|
55
|
+
### Why OpenRouter?
|
|
56
|
+
|
|
57
|
+
- **Single API**: One integration for multiple providers
|
|
58
|
+
- **Unified Billing**: Consistent pricing across models
|
|
59
|
+
- **Automatic Failover**: Fallback to alternative models
|
|
60
|
+
- **Rate Limiting**: Built-in rate limit handling
|
|
61
|
+
|
|
62
|
+
### Request Flow
|
|
63
|
+
|
|
64
|
+
```mermaid
|
|
65
|
+
sequenceDiagram
|
|
66
|
+
participant Client
|
|
67
|
+
participant InsForge
|
|
68
|
+
participant OpenRouter
|
|
69
|
+
participant Provider
|
|
70
|
+
|
|
71
|
+
Client->>InsForge: Chat/Image Request
|
|
72
|
+
InsForge->>InsForge: Add system prompt
|
|
73
|
+
InsForge->>OpenRouter: Forward with API key
|
|
74
|
+
OpenRouter->>Provider: Route to model
|
|
75
|
+
Provider-->>OpenRouter: Model response
|
|
76
|
+
OpenRouter-->>InsForge: Unified response
|
|
77
|
+
InsForge->>InsForge: Track usage
|
|
78
|
+
InsForge-->>Client: Formatted response
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Available Models
|
|
82
|
+
|
|
83
|
+
### Chat Models
|
|
84
|
+
|
|
85
|
+
| Provider | Model | ID | Best For |
|
|
86
|
+
|----------|-------|----|---------|
|
|
87
|
+
| **Anthropic** | Claude Sonnet 4 | `anthropic/claude-sonnet-4` | Complex reasoning |
|
|
88
|
+
| **Anthropic** | Claude 3.5 Haiku | `anthropic/claude-3.5-haiku` | Fast responses |
|
|
89
|
+
| **Anthropic** | Claude Opus 4.1 | `anthropic/claude-opus-4.1` | Highest quality |
|
|
90
|
+
| **OpenAI** | GPT-5 | `openai/gpt-5` | Most advanced |
|
|
91
|
+
| **OpenAI** | GPT-5 Mini | `openai/gpt-5-mini` | Fast & efficient |
|
|
92
|
+
| **OpenAI** | GPT-4o | `openai/gpt-4o` | General purpose |
|
|
93
|
+
| **Google** | Gemini 2.5 Pro | `google/gemini-2.5-pro` | Advanced reasoning |
|
|
94
|
+
| **xAI** | Grok 4 | `x-ai/grok-4` | Advanced reasoning |
|
|
95
|
+
|
|
96
|
+
### Image Models
|
|
97
|
+
|
|
98
|
+
| Provider | Model | ID | Capabilities |
|
|
99
|
+
|----------|-------|----|--------------|
|
|
100
|
+
| **Google** | Gemini 2.5 Flash Image | `google/gemini-2.5-flash-image-preview` | Text-to-image generation |
|
|
101
|
+
| **Google** | Gemini 3 Pro Image | `google/gemini-3-pro-image-preview` | Advanced text-to-image generation |
|
|
102
|
+
|
|
103
|
+
## Chat Completions
|
|
104
|
+
|
|
105
|
+
### Request Processing
|
|
106
|
+
|
|
107
|
+
1. **Authentication**: Verify JWT token
|
|
108
|
+
2. **Configuration**: Load project AI settings
|
|
109
|
+
3. **System Prompt**: Prepend configured prompt
|
|
110
|
+
4. **Model Selection**: Use specified or default model
|
|
111
|
+
5. **OpenRouter Call**: Forward to OpenRouter
|
|
112
|
+
6. **Response Handling**: Stream or batch response
|
|
113
|
+
7. **Usage Tracking**: Record token usage
|
|
114
|
+
|
|
115
|
+
### Streaming Architecture
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
// Server-Sent Events (SSE) for streaming
|
|
119
|
+
async function* streamChat(messages, options) {
|
|
120
|
+
const stream = await openRouter.chat.completions.create({
|
|
121
|
+
model: options.model,
|
|
122
|
+
messages: messages,
|
|
123
|
+
stream: true,
|
|
124
|
+
temperature: options.temperature,
|
|
125
|
+
max_tokens: options.maxTokens
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
for await (const chunk of stream) {
|
|
129
|
+
if (chunk.choices[0]?.delta?.content) {
|
|
130
|
+
yield { chunk: chunk.choices[0].delta.content };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
yield { done: true, tokenUsage: {...} };
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Response Formats
|
|
139
|
+
|
|
140
|
+
**Non-streaming Response:**
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"response": "AI generated response text",
|
|
144
|
+
"model": "anthropic/claude-3.5-haiku",
|
|
145
|
+
"usage": {
|
|
146
|
+
"promptTokens": 150,
|
|
147
|
+
"completionTokens": 200,
|
|
148
|
+
"totalTokens": 350
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Streaming Response (SSE):**
|
|
154
|
+
```
|
|
155
|
+
data: {"chunk": "The "}
|
|
156
|
+
data: {"chunk": "answer "}
|
|
157
|
+
data: {"chunk": "is..."}
|
|
158
|
+
data: {"done": true, "tokenUsage": {...}}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Image Generation
|
|
162
|
+
|
|
163
|
+
### Generation Flow
|
|
164
|
+
|
|
165
|
+
1. **Prompt Processing**: Validate and enhance prompt
|
|
166
|
+
2. **Model Selection**: Choose appropriate image model
|
|
167
|
+
3. **Size Configuration**: Set dimensions and quality
|
|
168
|
+
4. **OpenRouter Request**: Send generation request
|
|
169
|
+
5. **URL Generation**: Receive image URLs
|
|
170
|
+
6. **Storage Integration**: Optional save to storage
|
|
171
|
+
7. **Response Delivery**: Return URLs to client
|
|
172
|
+
|
|
173
|
+
### Image Parameters
|
|
174
|
+
|
|
175
|
+
| Parameter | Options | Description |
|
|
176
|
+
|-----------|---------|-------------|
|
|
177
|
+
| `model` | Model IDs | AI model to use |
|
|
178
|
+
| `prompt` | String | Text description |
|
|
179
|
+
| `size` | `512x512`, `1024x1024`, etc. | Image dimensions |
|
|
180
|
+
| `quality` | `standard`, `hd` | Image quality |
|
|
181
|
+
| `numImages` | 1-4 | Number of variations |
|
|
182
|
+
| `style` | `vivid`, `natural` | Style preference |
|
|
183
|
+
|
|
184
|
+
## Configuration Management
|
|
185
|
+
|
|
186
|
+
### Database Schema
|
|
187
|
+
|
|
188
|
+
```sql
|
|
189
|
+
CREATE TABLE _ai_configs (
|
|
190
|
+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
191
|
+
modality VARCHAR(255) NOT NULL, -- 'text' or 'image'
|
|
192
|
+
provider VARCHAR(255) NOT NULL, -- 'openrouter'
|
|
193
|
+
model_id VARCHAR(255) UNIQUE NOT NULL,
|
|
194
|
+
system_prompt TEXT,
|
|
195
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
196
|
+
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
197
|
+
);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### System Prompts
|
|
201
|
+
|
|
202
|
+
- Configured per project
|
|
203
|
+
- Applied to all chat requests
|
|
204
|
+
- Cannot be overridden by client
|
|
205
|
+
- Support for multiple configurations
|
|
206
|
+
|
|
207
|
+
## Usage Tracking
|
|
208
|
+
|
|
209
|
+
### Metrics Collected
|
|
210
|
+
|
|
211
|
+
```sql
|
|
212
|
+
CREATE TABLE _ai_usage (
|
|
213
|
+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
214
|
+
config_id UUID NOT NULL,
|
|
215
|
+
input_tokens INT,
|
|
216
|
+
output_tokens INT,
|
|
217
|
+
image_count INT,
|
|
218
|
+
image_resolution TEXT,
|
|
219
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
220
|
+
FOREIGN KEY (config_id) REFERENCES _ai_configs(id) ON DELETE NO ACTION
|
|
221
|
+
);
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Security & Rate Limiting
|
|
225
|
+
|
|
226
|
+
<CardGroup cols={2}>
|
|
227
|
+
<Card title="API Key Security" icon="key">
|
|
228
|
+
OpenRouter key stored server-side only
|
|
229
|
+
</Card>
|
|
230
|
+
|
|
231
|
+
<Card title="Request Validation" icon="shield-check">
|
|
232
|
+
Input sanitization and size limits
|
|
233
|
+
</Card>
|
|
234
|
+
|
|
235
|
+
<Card title="Rate Limiting" icon="gauge">
|
|
236
|
+
Per-user and per-project limits
|
|
237
|
+
</Card>
|
|
238
|
+
|
|
239
|
+
<Card title="Usage Quotas" icon="chart-pie">
|
|
240
|
+
Configurable token limits
|
|
241
|
+
</Card>
|
|
242
|
+
|
|
243
|
+
<Card title="Content Filtering" icon="filter">
|
|
244
|
+
Optional content moderation
|
|
245
|
+
</Card>
|
|
246
|
+
|
|
247
|
+
<Card title="Audit Logging" icon="file-lines">
|
|
248
|
+
Track all AI operations
|
|
249
|
+
</Card>
|
|
250
|
+
</CardGroup>
|
|
251
|
+
|
|
252
|
+
## Error Handling
|
|
253
|
+
|
|
254
|
+
### Error Types
|
|
255
|
+
|
|
256
|
+
| Error | Code | Description |
|
|
257
|
+
|-------|------|-------------|
|
|
258
|
+
| **Model Not Found** | 400 | Invalid model ID |
|
|
259
|
+
| **Rate Limited** | 429 | Too many requests |
|
|
260
|
+
| **Token Limit** | 400 | Exceeds max tokens |
|
|
261
|
+
| **OpenRouter Error** | 502 | Upstream provider issue |
|
|
262
|
+
| **Quota Exceeded** | 402 | Usage limit reached |
|
|
263
|
+
| **Invalid Input** | 400 | Malformed request |
|
|
264
|
+
|
|
265
|
+
### Retry Strategy
|
|
266
|
+
|
|
267
|
+
```javascript
|
|
268
|
+
async function retryableRequest(fn, maxRetries = 3) {
|
|
269
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
270
|
+
try {
|
|
271
|
+
return await fn();
|
|
272
|
+
} catch (error) {
|
|
273
|
+
if (error.status === 429) { // Rate limited
|
|
274
|
+
await sleep(Math.pow(2, i) * 1000); // Exponential backoff
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
throw error;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Performance Optimizations
|
|
284
|
+
|
|
285
|
+
### Streaming Optimizations
|
|
286
|
+
|
|
287
|
+
- **Server-Sent Events**: Real-time response streaming
|
|
288
|
+
- **Chunked Transfer**: Efficient data streaming
|
|
289
|
+
- **Keep-Alive**: Persistent connections for SSE
|
|
290
|
+
- **Low Latency**: Direct OpenRouter integration
|
|
291
|
+
|
|
292
|
+
### Future Optimizations
|
|
293
|
+
|
|
294
|
+
- **Response Caching**: Cache for identical requests (coming soon)
|
|
295
|
+
- **Batch Processing**: Multiple requests in parallel (coming soon)
|
|
296
|
+
- **Embeddings Cache**: Store computed embeddings (coming soon)
|
|
297
|
+
|
|
298
|
+
## API Endpoints
|
|
299
|
+
|
|
300
|
+
### Chat Endpoints
|
|
301
|
+
| Method | Endpoint | Auth | Description |
|
|
302
|
+
|--------|----------|------|-------------|
|
|
303
|
+
| POST | `/api/ai/chat/completion` | User | Send chat messages, supports streaming |
|
|
304
|
+
|
|
305
|
+
### Image Endpoints
|
|
306
|
+
| Method | Endpoint | Auth | Description |
|
|
307
|
+
|--------|----------|------|-------------|
|
|
308
|
+
| POST | `/api/ai/image/generation` | User | Generate images from text prompts |
|
|
309
|
+
|
|
310
|
+
### Configuration Endpoints
|
|
311
|
+
| Method | Endpoint | Auth | Description |
|
|
312
|
+
|--------|----------|------|-------------|
|
|
313
|
+
| GET | `/api/ai/models` | Admin | List available models |
|
|
314
|
+
| GET | `/api/ai/configurations` | Admin | List AI configurations |
|
|
315
|
+
| POST | `/api/ai/configurations` | Admin | Create AI configuration |
|
|
316
|
+
| PATCH | `/api/ai/configurations/:id` | Admin | Update AI configuration |
|
|
317
|
+
| DELETE | `/api/ai/configurations/:id` | Admin | Delete AI configuration |
|
|
318
|
+
|
|
319
|
+
### Usage Tracking Endpoints
|
|
320
|
+
| Method | Endpoint | Auth | Description |
|
|
321
|
+
|--------|----------|------|-------------|
|
|
322
|
+
| GET | `/api/ai/usage` | Admin | Get usage records with pagination |
|
|
323
|
+
| GET | `/api/ai/usage/summary` | Admin | Get usage summary statistics |
|
|
324
|
+
| GET | `/api/ai/usage/config/:configId` | Admin | Get usage by configuration |
|
|
325
|
+
|
|
326
|
+
## Environment Variables
|
|
327
|
+
|
|
328
|
+
| Variable | Description | Required |
|
|
329
|
+
|----------|-------------|----------|
|
|
330
|
+
| `OPENROUTER_API_KEY` | OpenRouter API key (local dev only) | Yes (local) |
|
|
331
|
+
|
|
332
|
+
**Note**:
|
|
333
|
+
- In cloud environments, the API key is fetched dynamically from the cloud API
|
|
334
|
+
- Model configuration is stored in the database (`_ai_configs` table)
|
|
335
|
+
- No other AI-related environment variables are used
|
|
336
|
+
|
|
337
|
+
## Best Practices
|
|
338
|
+
|
|
339
|
+
<CardGroup cols={2}>
|
|
340
|
+
<Card title="Model Selection" icon="brain">
|
|
341
|
+
Choose models based on speed vs quality needs
|
|
342
|
+
</Card>
|
|
343
|
+
|
|
344
|
+
<Card title="Prompt Engineering" icon="pencil">
|
|
345
|
+
Craft clear, specific prompts for better results
|
|
346
|
+
</Card>
|
|
347
|
+
|
|
348
|
+
<Card title="Token Management" icon="coins">
|
|
349
|
+
Monitor token usage
|
|
350
|
+
</Card>
|
|
351
|
+
|
|
352
|
+
<Card title="Streaming UX" icon="stream">
|
|
353
|
+
Use streaming for better perceived performance
|
|
354
|
+
</Card>
|
|
355
|
+
|
|
356
|
+
<Card title="Error Recovery" icon="rotate">
|
|
357
|
+
Implement retry logic for transient failures
|
|
358
|
+
</Card>
|
|
359
|
+
|
|
360
|
+
<Card title="Context Windows" icon="window">
|
|
361
|
+
Manage conversation history within limits
|
|
362
|
+
</Card>
|
|
363
|
+
</CardGroup>
|
|
364
|
+
|
|
365
|
+
## Comparison with Direct Integration
|
|
366
|
+
|
|
367
|
+
| Aspect | InsForge + OpenRouter | Direct Provider APIs |
|
|
368
|
+
|--------|----------------------|---------------------|
|
|
369
|
+
| **Integration Effort** | Single API | Multiple integrations |
|
|
370
|
+
| **Billing** | Unified through OpenRouter | Separate per provider |
|
|
371
|
+
| **Model Access** | 100+ models | Limited to one provider |
|
|
372
|
+
| **Failover** | Automatic | Manual implementation |
|
|
373
|
+
| **Rate Limiting** | Handled by OpenRouter | Per-provider limits |
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AI SDK Reference
|
|
3
|
+
description: AI chat completions and image generation with the InsForge SDK
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
import Installation from '/snippets/sdk-installation.mdx';
|
|
7
|
+
|
|
8
|
+
<Installation />
|
|
9
|
+
|
|
10
|
+
## chat.completions.create()
|
|
11
|
+
|
|
12
|
+
Create AI chat completions with streaming support.
|
|
13
|
+
|
|
14
|
+
### Parameters
|
|
15
|
+
|
|
16
|
+
- `model` (string, required) - AI model (e.g., 'anthropic/claude-3.5-haiku', 'openai/gpt-4'), call `mcp__insforge__get-backend-metadata` tool to get available models
|
|
17
|
+
- `messages` (array, required) - Array of message objects: `{role: "user"|"system"|"assistant", content: string}`
|
|
18
|
+
- `temperature` (number, optional) - Sampling temperature 0-2
|
|
19
|
+
- `maxTokens` (number, optional) - Max tokens to generate
|
|
20
|
+
- `topP` (number, optional) - Top-p sampling 0-1
|
|
21
|
+
- `stream` (boolean, optional) - Enable streaming mode
|
|
22
|
+
|
|
23
|
+
### Returns (non-streaming)
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
{
|
|
27
|
+
id: string,
|
|
28
|
+
object: 'chat.completion',
|
|
29
|
+
created: number,
|
|
30
|
+
model: string,
|
|
31
|
+
choices: [{
|
|
32
|
+
index: number,
|
|
33
|
+
message: { role: "system"|"user"|"assistant", content: string },
|
|
34
|
+
finish_reason: string
|
|
35
|
+
}],
|
|
36
|
+
usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number }
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Returns (streaming)
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
AsyncIterableIterator<{
|
|
44
|
+
id: string;
|
|
45
|
+
object: 'chat.completion.chunk';
|
|
46
|
+
choices: [
|
|
47
|
+
{
|
|
48
|
+
delta: { content: string };
|
|
49
|
+
finish_reason: string | null;
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
}>;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Example (non-streaming)
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
const completion = await insforge.ai.chat.completions.create({
|
|
59
|
+
model: 'anthropic/claude-3.5-haiku',
|
|
60
|
+
messages: [
|
|
61
|
+
{
|
|
62
|
+
role: 'user',
|
|
63
|
+
content: [
|
|
64
|
+
{ type: 'text', text: 'What do you see in this image?' },
|
|
65
|
+
{
|
|
66
|
+
type: 'image_url',
|
|
67
|
+
image_url: {
|
|
68
|
+
url: 'https://example.com/photo.jpg', // or base64: 'data:image/jpeg;base64,...'
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
console.log(completion.choices[0].message.content);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Output (non-streaming)
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"id": "chatcmpl-1705315200000",
|
|
84
|
+
"object": "chat.completion",
|
|
85
|
+
"created": 1705315200,
|
|
86
|
+
"model": "anthropic/claude-3.5-haiku",
|
|
87
|
+
"choices": [
|
|
88
|
+
{
|
|
89
|
+
"index": 0,
|
|
90
|
+
"message": {
|
|
91
|
+
"role": "assistant",
|
|
92
|
+
"content": "The capital of France is Paris."
|
|
93
|
+
},
|
|
94
|
+
"finish_reason": "stop"
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
"usage": {
|
|
98
|
+
"prompt_tokens": 15,
|
|
99
|
+
"completion_tokens": 8,
|
|
100
|
+
"total_tokens": 23
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Example (streaming)
|
|
106
|
+
|
|
107
|
+
```javascript
|
|
108
|
+
const stream = await insforge.ai.chat.completions.create({
|
|
109
|
+
model: 'openai/gpt-4',
|
|
110
|
+
messages: [{ role: 'user', content: 'Tell me a story' }],
|
|
111
|
+
stream: true,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
for await (const chunk of stream) {
|
|
115
|
+
if (chunk.choices[0]?.delta?.content) {
|
|
116
|
+
process.stdout.write(chunk.choices[0].delta.content);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Output (streaming)
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"id": "chatcmpl-1705315200000",
|
|
126
|
+
"object": "chat.completion.chunk",
|
|
127
|
+
"choices": [
|
|
128
|
+
{
|
|
129
|
+
"delta": { "content": "Once upon" },
|
|
130
|
+
"finish_reason": null
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## images.generate()
|
|
139
|
+
|
|
140
|
+
Generate images using AI models.
|
|
141
|
+
|
|
142
|
+
### Parameters
|
|
143
|
+
|
|
144
|
+
- `model` (string, required) - Image model (e.g., 'google/gemini-2.5-flash-image-preview')
|
|
145
|
+
- `prompt` (string, required) - Text description of image
|
|
146
|
+
- `images` (array, optional) - Input images for image-to-image (url or base64)
|
|
147
|
+
- `width` (number, optional) - Image width in pixels
|
|
148
|
+
- `height` (number, optional) - Image height in pixels
|
|
149
|
+
- `size` (string, optional) - Predefined size ('1024x1024', '512x512')
|
|
150
|
+
- `numImages` (number, optional) - Number of images to generate
|
|
151
|
+
- `quality` ('standard' | 'hd', optional) - Image quality
|
|
152
|
+
- `style` ('vivid' | 'natural', optional) - Image style
|
|
153
|
+
|
|
154
|
+
### Returns
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
{
|
|
158
|
+
created: number,
|
|
159
|
+
data: Array<{
|
|
160
|
+
b64_json?: string, // Base64 encoded image
|
|
161
|
+
content?: string // Text response from model
|
|
162
|
+
}>,
|
|
163
|
+
usage?: {
|
|
164
|
+
total_tokens: number,
|
|
165
|
+
input_tokens: number,
|
|
166
|
+
output_tokens: number
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Example
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
const response = await insforge.ai.images.generate({
|
|
175
|
+
model: 'google/gemini-2.5-flash-image-preview',
|
|
176
|
+
prompt: 'A serene mountain landscape at sunset',
|
|
177
|
+
size: '1024x1024',
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// Get base64 image and upload to storage
|
|
181
|
+
const base64Image = response.data[0].b64_json;
|
|
182
|
+
const buffer = Buffer.from(base64Image, 'base64');
|
|
183
|
+
const blob = new Blob([buffer], { type: 'image/png' });
|
|
184
|
+
|
|
185
|
+
const { data: uploadData } = await insforge.storage.from('ai-images').uploadAuto(blob);
|
|
186
|
+
|
|
187
|
+
// Save URL to database
|
|
188
|
+
await insforge.database.from('generated_images').insert([
|
|
189
|
+
{
|
|
190
|
+
prompt: 'A serene mountain landscape',
|
|
191
|
+
image_url: uploadData.url,
|
|
192
|
+
},
|
|
193
|
+
]);
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Output
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"created": 1705315200,
|
|
201
|
+
"data": [
|
|
202
|
+
{
|
|
203
|
+
"b64_json": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
|
|
204
|
+
"content": "A beautiful mountain landscape at sunset with orange and purple hues."
|
|
205
|
+
}
|
|
206
|
+
],
|
|
207
|
+
"usage": {
|
|
208
|
+
"total_tokens": 150,
|
|
209
|
+
"input_tokens": 20,
|
|
210
|
+
"output_tokens": 130
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
```
|