insforge 1.3.0 → 1.4.8
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/CHANGELOG.md +2 -0
- package/auth/package.json +5 -3
- package/auth/src/lib/broadcastService.ts +115 -117
- package/auth/src/lib/insforge.ts +8 -0
- package/auth/src/main.tsx +2 -4
- package/auth/src/pages/SignInPage.tsx +60 -60
- package/auth/src/pages/SignUpPage.tsx +60 -60
- package/auth/src/pages/VerifyEmailPage.tsx +18 -0
- package/auth/tsconfig.json +2 -1
- package/backend/package.json +10 -6
- package/backend/src/api/middlewares/rate-limiters.ts +127 -127
- package/backend/src/api/routes/ai/index.routes.ts +475 -468
- package/backend/src/api/routes/auth/index.routes.ts +85 -32
- package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
- package/backend/src/api/routes/database/index.routes.ts +2 -0
- package/backend/src/api/routes/database/records.routes.ts +39 -175
- package/backend/src/api/routes/database/rpc.routes.ts +69 -0
- package/backend/src/api/routes/deployments/index.routes.ts +192 -0
- package/backend/src/api/routes/docs/index.routes.ts +3 -2
- package/backend/src/api/routes/email/index.routes.ts +35 -35
- package/backend/src/api/routes/functions/index.routes.ts +3 -3
- package/backend/src/api/routes/metadata/index.routes.ts +26 -0
- package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
- package/backend/src/infra/database/database.manager.ts +0 -10
- package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
- package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
- package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
- package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
- package/backend/src/infra/security/token.manager.ts +1 -4
- package/backend/src/providers/ai/openrouter.provider.ts +12 -3
- package/backend/src/providers/database/base.provider.ts +39 -0
- package/backend/src/providers/database/cloud.provider.ts +159 -0
- package/backend/src/providers/deployments/vercel.provider.ts +516 -0
- package/backend/src/server.ts +19 -7
- package/backend/src/services/ai/ai-config.service.ts +6 -6
- package/backend/src/services/ai/ai-model.service.ts +60 -60
- package/backend/src/services/ai/ai-usage.service.ts +7 -7
- package/backend/src/services/ai/chat-completion.service.ts +415 -220
- package/backend/src/services/ai/helpers.ts +64 -64
- package/backend/src/services/ai/index.ts +13 -13
- package/backend/src/services/auth/auth-config.service.ts +4 -4
- package/backend/src/services/auth/auth-otp.service.ts +6 -6
- package/backend/src/services/auth/auth.service.ts +134 -74
- package/backend/src/services/auth/index.ts +4 -4
- package/backend/src/services/auth/oauth-config.service.ts +12 -12
- package/backend/src/services/database/database-advance.service.ts +19 -55
- package/backend/src/services/database/database-table.service.ts +38 -85
- package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
- package/backend/src/services/deployments/deployment.service.ts +693 -0
- package/backend/src/services/functions/function.service.ts +61 -41
- package/backend/src/services/logs/audit.service.ts +10 -10
- package/backend/src/services/secrets/secret.service.ts +101 -27
- package/backend/src/services/storage/storage.service.ts +30 -30
- package/backend/src/services/usage/usage.service.ts +6 -6
- package/backend/src/types/ai.ts +8 -0
- package/backend/src/types/auth.ts +5 -1
- package/backend/src/types/database.ts +2 -0
- package/backend/src/types/deployments.ts +33 -0
- package/backend/src/types/storage.ts +1 -1
- package/backend/src/types/webhooks.ts +45 -0
- package/backend/src/utils/cookies.ts +34 -35
- package/backend/src/utils/environment.ts +0 -14
- package/backend/src/utils/s3-config-loader.ts +64 -64
- package/backend/src/utils/seed.ts +334 -301
- package/backend/src/utils/sql-parser.ts +126 -0
- package/backend/src/utils/utils.ts +114 -114
- package/backend/src/utils/validations.ts +10 -10
- package/backend/tests/local/test-rpc.sh +141 -0
- package/backend/tests/local/test-secrets.sh +1 -1
- package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
- package/backend/tests/manual/test-rawsql-modes.sh +24 -24
- package/backend/tests/unit/database-advance.test.ts +326 -0
- package/backend/tests/unit/helpers.test.ts +2 -2
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
- package/docker-compose.prod.yml +1 -1
- package/docker-compose.yml +1 -1
- package/docs/agent-docs/deployment.md +79 -0
- package/docs/changelog.mdx +165 -72
- package/docs/core-concepts/ai/architecture.mdx +1 -23
- package/docs/core-concepts/ai/sdk.mdx +26 -1
- package/docs/core-concepts/authentication/architecture.mdx +6 -8
- package/docs/core-concepts/authentication/sdk.mdx +387 -91
- package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
- package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
- package/docs/core-concepts/database/architecture.mdx +58 -21
- package/docs/core-concepts/database/pgvector.mdx +138 -0
- package/docs/core-concepts/database/sdk.mdx +17 -17
- package/docs/core-concepts/deployments/architecture.mdx +152 -0
- package/docs/core-concepts/email/architecture.mdx +4 -2
- package/docs/core-concepts/functions/architecture.mdx +1 -1
- package/docs/core-concepts/functions/sdk.mdx +0 -1
- package/docs/core-concepts/realtime/architecture.mdx +1 -1
- package/docs/core-concepts/storage/architecture.mdx +1 -1
- package/docs/core-concepts/storage/sdk.mdx +25 -25
- package/docs/docs.json +14 -6
- package/docs/favicon.png +0 -0
- package/docs/favicon.svg +3 -18
- package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
- package/docs/images/changelog/dec-2025/moreModels.png +0 -0
- package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
- package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
- package/docs/images/changelog/dec-2025/realtime2.png +0 -0
- package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
- package/docs/images/mcp-setup/claude-code-connect.png +0 -0
- package/docs/images/mcp-setup/cline-1.png +0 -0
- package/docs/images/mcp-setup/cline-2.png +0 -0
- package/docs/images/mcp-setup/cline-3.png +0 -0
- package/docs/images/mcp-setup/connect-project.png +0 -0
- package/docs/images/mcp-setup/copilot-1.png +0 -0
- package/docs/images/mcp-setup/copilot-2.png +0 -0
- package/docs/images/mcp-setup/copilot-3.png +0 -0
- package/docs/images/mcp-setup/mcp-json-1.png +0 -0
- package/docs/images/mcp-setup/mcp-json-2.png +0 -0
- package/docs/images/mcp-setup/qoder-1.png +0 -0
- package/docs/images/mcp-setup/qoder-2.png +0 -0
- package/docs/images/mcp-setup/roocode-1.png +0 -0
- package/docs/images/mcp-setup/roocode-2.png +0 -0
- package/docs/images/mcp-setup/trae-1.png +0 -0
- package/docs/images/mcp-setup/trae-2.png +0 -0
- package/docs/images/mcp-setup/trae-3.png +0 -0
- package/docs/images/mcp-setup/trae-4.png +0 -0
- package/docs/images/mcp-setup/trae-5.png +0 -0
- package/docs/images/mcp-setup/windsurf-1.png +0 -0
- package/docs/images/mcp-setup/windsurf-2.png +0 -0
- package/docs/insforge-instructions-sdk.md +7 -3
- package/docs/introduction.mdx +9 -8
- package/docs/mcp-setup.mdx +332 -0
- package/docs/oauth-server.mdx +563 -0
- package/docs/partnership.mdx +79 -10
- package/docs/quickstart.mdx +1 -1
- package/docs/vscode-extension.mdx +74 -0
- package/eslint.config.js +1 -0
- package/examples/response-examples.md +1 -1
- package/frontend/package.json +1 -1
- package/frontend/src/App.tsx +8 -3
- package/frontend/src/assets/logos/antigravity.svg +1 -0
- package/frontend/src/assets/logos/copilot.svg +10 -0
- package/frontend/src/assets/logos/deepseek.svg +139 -0
- package/frontend/src/assets/logos/kiro.svg +9 -0
- package/frontend/src/assets/logos/qoder.svg +4 -0
- package/frontend/src/assets/logos/qwen.svg +15 -0
- package/frontend/src/components/CodeBlock.tsx +2 -2
- package/frontend/src/components/ConnectCTA.tsx +3 -2
- package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
- package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
- package/frontend/src/components/datagrid/index.ts +1 -1
- package/frontend/src/components/index.ts +0 -1
- package/frontend/src/components/layout/AppHeader.tsx +4 -27
- package/frontend/src/components/layout/AppSidebar.tsx +85 -100
- package/frontend/src/components/layout/Layout.tsx +34 -32
- package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
- package/frontend/src/components/radix/Select.tsx +151 -151
- package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
- package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
- package/frontend/src/features/ai/components/index.ts +6 -6
- package/frontend/src/features/ai/helpers.ts +147 -141
- package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
- package/frontend/src/features/auth/components/index.ts +5 -5
- package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
- package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
- package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
- package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
- package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
- package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
- package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
- package/frontend/src/features/database/constants.ts +16 -28
- package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
- package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
- package/frontend/src/features/database/hooks/useTables.ts +5 -7
- package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
- package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
- package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
- package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
- package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
- package/frontend/src/features/database/services/advance.service.ts +1 -15
- package/frontend/src/features/database/services/record.service.ts +4 -20
- package/frontend/src/features/database/services/table.service.ts +1 -4
- package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
- package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
- package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
- package/frontend/src/features/database/templates/notion-clone.ts +8 -8
- package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
- package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
- package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
- package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
- package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
- package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
- package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
- package/frontend/src/features/functions/components/index.ts +5 -5
- package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
- package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
- package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
- package/frontend/src/features/functions/services/function.service.ts +8 -25
- package/frontend/src/features/functions/services/secret.service.ts +23 -41
- package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
- package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
- package/frontend/src/features/logs/components/index.ts +1 -0
- package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
- package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
- package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
- package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
- package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
- package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
- package/frontend/src/features/onboard/components/index.ts +9 -4
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
- package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
- package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
- package/frontend/src/features/onboard/index.ts +17 -13
- package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
- package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
- package/frontend/src/index.css +249 -249
- package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
- package/frontend/src/lib/hooks/useMetadata.ts +45 -1
- package/frontend/src/lib/hooks/useModal.tsx +2 -0
- package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
- package/frontend/src/lib/services/metadata.service.ts +20 -3
- package/frontend/src/lib/utils/menuItems.ts +223 -207
- package/frontend/src/lib/utils/utils.ts +196 -196
- package/functions/server.ts +315 -315
- package/functions/worker-template.js +1 -1
- package/openapi/ai.yaml +115 -5
- package/openapi/auth.yaml +97 -17
- package/openapi/logs.yaml +0 -2
- package/openapi/metadata.yaml +0 -2
- package/openapi/records.yaml +21 -21
- package/openapi/tables.yaml +1 -2
- package/package.json +1 -1
- package/shared-schemas/package.json +1 -1
- package/shared-schemas/src/ai-api.schema.ts +251 -143
- package/shared-schemas/src/ai.schema.ts +63 -63
- package/shared-schemas/src/auth-api.schema.ts +34 -6
- package/shared-schemas/src/auth.schema.ts +17 -10
- package/shared-schemas/src/cloud-events.schema.ts +26 -0
- package/shared-schemas/src/deployments-api.schema.ts +55 -0
- package/shared-schemas/src/deployments.schema.ts +30 -0
- package/shared-schemas/src/docs.schema.ts +8 -2
- package/shared-schemas/src/email-api.schema.ts +30 -30
- package/shared-schemas/src/functions-api.schema.ts +13 -4
- package/shared-schemas/src/functions.schema.ts +1 -1
- package/shared-schemas/src/index.ts +22 -18
- package/shared-schemas/src/metadata.schema.ts +30 -4
- package/shared-schemas/src/secrets-api.schema.ts +44 -0
- package/shared-schemas/src/secrets.schema.ts +15 -0
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +20 -51
- package/backend/src/types/profile.ts +0 -55
- package/frontend/src/components/ProjectInfoModal.tsx +0 -128
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# AI Web Search and Thinking mode test script
|
|
4
|
+
# Tests the new webSearch and thinking parameters for chat completion
|
|
5
|
+
|
|
6
|
+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
7
|
+
source "$SCRIPT_DIR/../test-config.sh"
|
|
8
|
+
|
|
9
|
+
echo "🧪 Testing AI Web Search and Thinking features..."
|
|
10
|
+
|
|
11
|
+
API_BASE="$TEST_API_BASE"
|
|
12
|
+
ADMIN_TOKEN=""
|
|
13
|
+
|
|
14
|
+
# Get admin token
|
|
15
|
+
echo "🔑 Getting admin token..."
|
|
16
|
+
ADMIN_TOKEN=$(get_admin_token)
|
|
17
|
+
|
|
18
|
+
if [ -z "$ADMIN_TOKEN" ]; then
|
|
19
|
+
print_fail "Failed to get admin token"
|
|
20
|
+
exit 1
|
|
21
|
+
fi
|
|
22
|
+
print_success "Got admin token"
|
|
23
|
+
echo ""
|
|
24
|
+
|
|
25
|
+
# 1. Test chat completion with Web Search
|
|
26
|
+
echo "🔍 Test 1: Chat completion with Web Search..."
|
|
27
|
+
websearch_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
|
|
28
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
29
|
+
-H "Content-Type: application/json" \
|
|
30
|
+
-d '{
|
|
31
|
+
"model": "openai/gpt-4o",
|
|
32
|
+
"messages": [{"role": "user", "content": "What are the latest AI news today?"}],
|
|
33
|
+
"webSearch": {
|
|
34
|
+
"enabled": true,
|
|
35
|
+
"maxResults": 3
|
|
36
|
+
}
|
|
37
|
+
}')
|
|
38
|
+
|
|
39
|
+
status=$(echo "$websearch_response" | tail -n 1)
|
|
40
|
+
body=$(echo "$websearch_response" | sed '$d')
|
|
41
|
+
|
|
42
|
+
if [ "$status" -eq 200 ]; then
|
|
43
|
+
print_success "Chat completion with Web Search succeeded"
|
|
44
|
+
# Check if annotations are present in the response
|
|
45
|
+
if echo "$body" | grep -q "annotations"; then
|
|
46
|
+
print_success "Response contains URL citations (annotations)"
|
|
47
|
+
else
|
|
48
|
+
echo "Note: No annotations in response (may depend on model/query)"
|
|
49
|
+
fi
|
|
50
|
+
echo "Response preview: $(echo "$body" | head -c 500)"
|
|
51
|
+
echo ""
|
|
52
|
+
else
|
|
53
|
+
print_fail "Chat completion with Web Search failed (status: $status)"
|
|
54
|
+
echo "Response: $body"
|
|
55
|
+
track_test_failure
|
|
56
|
+
fi
|
|
57
|
+
echo ""
|
|
58
|
+
|
|
59
|
+
# 2. Test chat completion with Web Search using Exa engine
|
|
60
|
+
echo "🔍 Test 2: Chat completion with Web Search (Exa engine)..."
|
|
61
|
+
exa_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
|
|
62
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
63
|
+
-H "Content-Type: application/json" \
|
|
64
|
+
-d '{
|
|
65
|
+
"model": "openai/gpt-4o",
|
|
66
|
+
"messages": [{"role": "user", "content": "What is the current weather in Tokyo?"}],
|
|
67
|
+
"webSearch": {
|
|
68
|
+
"enabled": true,
|
|
69
|
+
"engine": "exa",
|
|
70
|
+
"maxResults": 2
|
|
71
|
+
}
|
|
72
|
+
}')
|
|
73
|
+
|
|
74
|
+
status=$(echo "$exa_response" | tail -n 1)
|
|
75
|
+
body=$(echo "$exa_response" | sed '$d')
|
|
76
|
+
|
|
77
|
+
if [ "$status" -eq 200 ]; then
|
|
78
|
+
print_success "Chat completion with Exa Web Search succeeded"
|
|
79
|
+
echo "Response preview: $(echo "$body" | head -c 500)"
|
|
80
|
+
echo ""
|
|
81
|
+
else
|
|
82
|
+
print_fail "Chat completion with Exa Web Search failed (status: $status)"
|
|
83
|
+
echo "Response: $body"
|
|
84
|
+
track_test_failure
|
|
85
|
+
fi
|
|
86
|
+
echo ""
|
|
87
|
+
|
|
88
|
+
# 3. Test chat completion with Thinking mode
|
|
89
|
+
echo "🧠 Test 3: Chat completion with Thinking mode..."
|
|
90
|
+
thinking_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
|
|
91
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
92
|
+
-H "Content-Type: application/json" \
|
|
93
|
+
-d '{
|
|
94
|
+
"model": "anthropic/claude-3.7-sonnet:thinking",
|
|
95
|
+
"messages": [{"role": "user", "content": "What is 15 + 27?"}]
|
|
96
|
+
}')
|
|
97
|
+
|
|
98
|
+
status=$(echo "$thinking_response" | tail -n 1)
|
|
99
|
+
body=$(echo "$thinking_response" | sed '$d')
|
|
100
|
+
|
|
101
|
+
if [ "$status" -eq 200 ]; then
|
|
102
|
+
print_success "Chat completion with Thinking mode succeeded"
|
|
103
|
+
echo "Response preview: $(echo "$body" | head -c 500)"
|
|
104
|
+
echo ""
|
|
105
|
+
else
|
|
106
|
+
print_fail "Chat completion with Thinking mode failed (status: $status)"
|
|
107
|
+
echo "Response: $body"
|
|
108
|
+
track_test_failure
|
|
109
|
+
fi
|
|
110
|
+
echo ""
|
|
111
|
+
|
|
112
|
+
# 4. Test chat completion with both Web Search and Thinking
|
|
113
|
+
echo "🔍🧠 Test 4: Chat completion with Web Search + Thinking..."
|
|
114
|
+
combined_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
|
|
115
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
116
|
+
-H "Content-Type: application/json" \
|
|
117
|
+
-d '{
|
|
118
|
+
"model": "anthropic/claude-3.7-sonnet",
|
|
119
|
+
"messages": [{"role": "user", "content": "What are the recent developments in AI?"}],
|
|
120
|
+
"webSearch": {
|
|
121
|
+
"enabled": true,
|
|
122
|
+
"engine": "native",
|
|
123
|
+
"maxResults": 3
|
|
124
|
+
},
|
|
125
|
+
"thinking": true
|
|
126
|
+
}')
|
|
127
|
+
|
|
128
|
+
status=$(echo "$combined_response" | tail -n 1)
|
|
129
|
+
body=$(echo "$combined_response" | sed '$d')
|
|
130
|
+
|
|
131
|
+
if [ "$status" -eq 200 ]; then
|
|
132
|
+
print_success "Chat completion with Web Search + Thinking succeeded"
|
|
133
|
+
echo "Response preview: $(echo "$body" | head -c 500)"
|
|
134
|
+
echo ""
|
|
135
|
+
else
|
|
136
|
+
print_fail "Chat completion with Web Search + Thinking failed (status: $status)"
|
|
137
|
+
echo "Response: $body"
|
|
138
|
+
track_test_failure
|
|
139
|
+
fi
|
|
140
|
+
echo ""
|
|
141
|
+
|
|
142
|
+
# 5. Test streaming with Web Search
|
|
143
|
+
echo "📡 Test 5: Streaming chat with Web Search..."
|
|
144
|
+
echo "Streaming response (first 20 events):"
|
|
145
|
+
stream_output=$(curl -s -N -X POST "$API_BASE/ai/chat/completion" \
|
|
146
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
147
|
+
-H "Content-Type: application/json" \
|
|
148
|
+
-d '{
|
|
149
|
+
"model": "openai/gpt-4o",
|
|
150
|
+
"messages": [{"role": "user", "content": "Latest tech news in one sentence"}],
|
|
151
|
+
"stream": true,
|
|
152
|
+
"webSearch": {
|
|
153
|
+
"enabled": true,
|
|
154
|
+
"maxResults": 2
|
|
155
|
+
}
|
|
156
|
+
}' 2>&1 | head -20)
|
|
157
|
+
|
|
158
|
+
echo "$stream_output"
|
|
159
|
+
|
|
160
|
+
if echo "$stream_output" | grep -q "data:"; then
|
|
161
|
+
print_success "Streaming with Web Search returned SSE events"
|
|
162
|
+
else
|
|
163
|
+
print_fail "Streaming with Web Search did not return expected SSE format"
|
|
164
|
+
track_test_failure
|
|
165
|
+
fi
|
|
166
|
+
echo ""
|
|
167
|
+
|
|
168
|
+
# 6. Test streaming with Thinking mode
|
|
169
|
+
echo "📡 Test 6: Streaming chat with Thinking mode..."
|
|
170
|
+
echo "Streaming response (first 20 events):"
|
|
171
|
+
thinking_stream=$(curl -s -N -X POST "$API_BASE/ai/chat/completion" \
|
|
172
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
173
|
+
-H "Content-Type: application/json" \
|
|
174
|
+
-d '{
|
|
175
|
+
"model": "anthropic/claude-3.7-sonnet",
|
|
176
|
+
"messages": [{"role": "user", "content": "What is 2+2?"}],
|
|
177
|
+
"stream": true,
|
|
178
|
+
"thinking": true
|
|
179
|
+
}' 2>&1 | head -20)
|
|
180
|
+
|
|
181
|
+
echo "$thinking_stream"
|
|
182
|
+
|
|
183
|
+
if echo "$thinking_stream" | grep -q "data:"; then
|
|
184
|
+
print_success "Streaming with Thinking mode returned SSE events"
|
|
185
|
+
else
|
|
186
|
+
print_fail "Streaming with Thinking mode did not return expected SSE format"
|
|
187
|
+
track_test_failure
|
|
188
|
+
fi
|
|
189
|
+
echo ""
|
|
190
|
+
|
|
191
|
+
# 7. Test Web Search with custom search prompt
|
|
192
|
+
echo "🔍 Test 7: Web Search with custom search prompt..."
|
|
193
|
+
custom_prompt_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
|
|
194
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
195
|
+
-H "Content-Type: application/json" \
|
|
196
|
+
-d '{
|
|
197
|
+
"model": "openai/gpt-4o",
|
|
198
|
+
"messages": [{"role": "user", "content": "Tell me about SpaceX launches"}],
|
|
199
|
+
"webSearch": {
|
|
200
|
+
"enabled": true,
|
|
201
|
+
"maxResults": 3,
|
|
202
|
+
"searchPrompt": "Here are some relevant web search results about SpaceX:"
|
|
203
|
+
}
|
|
204
|
+
}')
|
|
205
|
+
|
|
206
|
+
status=$(echo "$custom_prompt_response" | tail -n 1)
|
|
207
|
+
body=$(echo "$custom_prompt_response" | sed '$d')
|
|
208
|
+
|
|
209
|
+
if [ "$status" -eq 200 ]; then
|
|
210
|
+
print_success "Web Search with custom prompt succeeded"
|
|
211
|
+
echo "Response preview: $(echo "$body" | head -c 500)"
|
|
212
|
+
echo ""
|
|
213
|
+
else
|
|
214
|
+
print_fail "Web Search with custom prompt failed (status: $status)"
|
|
215
|
+
echo "Response: $body"
|
|
216
|
+
track_test_failure
|
|
217
|
+
fi
|
|
218
|
+
echo ""
|
|
219
|
+
|
|
220
|
+
# 8. Test PDF file processing with file-parser plugin
|
|
221
|
+
# Note: Using pdf-text engine (free) instead of native, as native requires models with built-in PDF support
|
|
222
|
+
# For URL-based PDFs, OpenRouter's file-parser plugin will fetch and parse the PDF
|
|
223
|
+
echo "📄 Test 8: PDF file processing with file-parser plugin..."
|
|
224
|
+
pdf_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
|
|
225
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
|
226
|
+
-H "Content-Type: application/json" \
|
|
227
|
+
-d '{
|
|
228
|
+
"model": "openai/gpt-4o",
|
|
229
|
+
"messages": [{
|
|
230
|
+
"role": "user",
|
|
231
|
+
"content": [
|
|
232
|
+
{"type": "text", "text": "Please summarize the content of this PDF document."},
|
|
233
|
+
{"type": "file", "file": {"filename": "sample.pdf", "file_data": "https://pdfco-test-files.s3.us-west-2.amazonaws.com/pdf-to-csv/sample.pdf"}}
|
|
234
|
+
]
|
|
235
|
+
}],
|
|
236
|
+
"fileParser": {
|
|
237
|
+
"enabled": true,
|
|
238
|
+
"pdf": {
|
|
239
|
+
"engine": "pdf-text"
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}')
|
|
243
|
+
|
|
244
|
+
status=$(echo "$pdf_response" | tail -n 1)
|
|
245
|
+
body=$(echo "$pdf_response" | sed '$d')
|
|
246
|
+
|
|
247
|
+
if [ "$status" -eq 200 ]; then
|
|
248
|
+
print_success "PDF file processing succeeded"
|
|
249
|
+
echo "Response preview: $(echo "$body" | head -c 800)"
|
|
250
|
+
echo ""
|
|
251
|
+
else
|
|
252
|
+
print_fail "PDF file processing failed (status: $status)"
|
|
253
|
+
echo "Response: $body"
|
|
254
|
+
track_test_failure
|
|
255
|
+
fi
|
|
256
|
+
echo ""
|
|
257
|
+
|
|
258
|
+
print_success "🎉 AI Web Search and Thinking test completed!"
|
|
@@ -74,7 +74,7 @@ test_endpoint \
|
|
|
74
74
|
"STRICT" \
|
|
75
75
|
"rawsql" \
|
|
76
76
|
"Allow SELECT from system table" \
|
|
77
|
-
"SELECT * FROM
|
|
77
|
+
"SELECT * FROM system.secrets LIMIT 1;" \
|
|
78
78
|
"pass"
|
|
79
79
|
|
|
80
80
|
# Test 2: Strict mode blocks system table INSERT
|
|
@@ -82,7 +82,7 @@ test_endpoint \
|
|
|
82
82
|
"STRICT" \
|
|
83
83
|
"rawsql" \
|
|
84
84
|
"Block INSERT into system table" \
|
|
85
|
-
"INSERT INTO
|
|
85
|
+
"INSERT INTO system.secrets (name, value_ciphertext) VALUES ('test', 'value');" \
|
|
86
86
|
"fail"
|
|
87
87
|
|
|
88
88
|
# Test 3: Strict mode blocks pg_catalog
|
|
@@ -101,20 +101,20 @@ test_endpoint \
|
|
|
101
101
|
"SELECT * FROM information_schema.tables LIMIT 1;" \
|
|
102
102
|
"fail"
|
|
103
103
|
|
|
104
|
-
# Test 5: Strict mode blocks INSERT into users
|
|
104
|
+
# Test 5: Strict mode blocks INSERT into auth.users
|
|
105
105
|
test_endpoint \
|
|
106
106
|
"STRICT" \
|
|
107
107
|
"rawsql" \
|
|
108
|
-
"Block INSERT into users table" \
|
|
109
|
-
"INSERT INTO users (id,
|
|
108
|
+
"Block INSERT into auth.users table" \
|
|
109
|
+
"INSERT INTO auth.users (id, email, metadata) VALUES (gen_random_uuid(), 'test@example.com', '{}');" \
|
|
110
110
|
"fail"
|
|
111
111
|
|
|
112
112
|
# Test 6: Strict mode allows regular table operations
|
|
113
113
|
test_endpoint \
|
|
114
114
|
"STRICT" \
|
|
115
115
|
"rawsql" \
|
|
116
|
-
"Allow SELECT from
|
|
117
|
-
"SELECT COUNT(*) FROM users;" \
|
|
116
|
+
"Allow SELECT from auth.users table" \
|
|
117
|
+
"SELECT COUNT(*) FROM auth.users;" \
|
|
118
118
|
"pass"
|
|
119
119
|
|
|
120
120
|
echo -e "${BLUE}=== RELAXED MODE TESTS (/rawsql/unrestricted) ===${NC}"
|
|
@@ -125,7 +125,7 @@ test_endpoint \
|
|
|
125
125
|
"RELAXED" \
|
|
126
126
|
"rawsql/unrestricted" \
|
|
127
127
|
"Allow SELECT from system table" \
|
|
128
|
-
"SELECT * FROM
|
|
128
|
+
"SELECT * FROM system.secrets LIMIT 1;" \
|
|
129
129
|
"pass"
|
|
130
130
|
|
|
131
131
|
# Test 8: Relaxed mode allows INSERT into system table
|
|
@@ -133,7 +133,7 @@ test_endpoint \
|
|
|
133
133
|
"RELAXED" \
|
|
134
134
|
"rawsql/unrestricted" \
|
|
135
135
|
"Allow INSERT into system table" \
|
|
136
|
-
"INSERT INTO
|
|
136
|
+
"INSERT INTO system.audit_logs (actor, action, module) VALUES ('test_actor', 'TEST_ACTION', 'TEST_MODULE');" \
|
|
137
137
|
"pass"
|
|
138
138
|
|
|
139
139
|
# Test 9: Relaxed mode blocks UPDATE system table
|
|
@@ -141,7 +141,7 @@ test_endpoint \
|
|
|
141
141
|
"RELAXED" \
|
|
142
142
|
"rawsql/unrestricted" \
|
|
143
143
|
"Block UPDATE system table" \
|
|
144
|
-
"UPDATE
|
|
144
|
+
"UPDATE system.audit_logs SET actor = 'updated' WHERE action = 'TEST_ACTION';" \
|
|
145
145
|
"fail"
|
|
146
146
|
|
|
147
147
|
# Test 10: Relaxed mode blocks DELETE FROM system table
|
|
@@ -149,7 +149,7 @@ test_endpoint \
|
|
|
149
149
|
"RELAXED" \
|
|
150
150
|
"rawsql/unrestricted" \
|
|
151
151
|
"Block DELETE FROM system table" \
|
|
152
|
-
"DELETE FROM
|
|
152
|
+
"DELETE FROM system.audit_logs WHERE action = 'TEST_ACTION';" \
|
|
153
153
|
"fail"
|
|
154
154
|
|
|
155
155
|
# Test 11: Relaxed mode blocks DROP system table
|
|
@@ -157,31 +157,31 @@ test_endpoint \
|
|
|
157
157
|
"RELAXED" \
|
|
158
158
|
"rawsql/unrestricted" \
|
|
159
159
|
"Block DROP system table" \
|
|
160
|
-
"DROP TABLE
|
|
160
|
+
"DROP TABLE system.secrets;" \
|
|
161
161
|
"fail"
|
|
162
162
|
|
|
163
|
-
# Test 12: Relaxed mode allows SELECT from users
|
|
163
|
+
# Test 12: Relaxed mode allows SELECT from auth.users
|
|
164
164
|
test_endpoint \
|
|
165
165
|
"RELAXED" \
|
|
166
166
|
"rawsql/unrestricted" \
|
|
167
|
-
"Allow SELECT from users table" \
|
|
168
|
-
"SELECT COUNT(*) FROM users;" \
|
|
167
|
+
"Allow SELECT from auth.users table" \
|
|
168
|
+
"SELECT COUNT(*) FROM auth.users;" \
|
|
169
169
|
"pass"
|
|
170
170
|
|
|
171
|
-
# Test 13: Relaxed mode blocks DROP users table
|
|
171
|
+
# Test 13: Relaxed mode blocks DROP auth.users table
|
|
172
172
|
test_endpoint \
|
|
173
173
|
"RELAXED" \
|
|
174
174
|
"rawsql/unrestricted" \
|
|
175
|
-
"Block DROP users table" \
|
|
176
|
-
"DROP TABLE users;" \
|
|
175
|
+
"Block DROP auth.users table" \
|
|
176
|
+
"DROP TABLE auth.users;" \
|
|
177
177
|
"fail"
|
|
178
178
|
|
|
179
|
-
# Test 14: Relaxed mode blocks RENAME users table
|
|
179
|
+
# Test 14: Relaxed mode blocks RENAME auth.users table
|
|
180
180
|
test_endpoint \
|
|
181
181
|
"RELAXED" \
|
|
182
182
|
"rawsql/unrestricted" \
|
|
183
|
-
"Block RENAME users table" \
|
|
184
|
-
"ALTER TABLE users RENAME TO users_backup;" \
|
|
183
|
+
"Block RENAME auth.users table" \
|
|
184
|
+
"ALTER TABLE auth.users RENAME TO users_backup;" \
|
|
185
185
|
"fail"
|
|
186
186
|
|
|
187
187
|
echo -e "${BLUE}=== BOTH MODES - DATABASE LEVEL BLOCKS ===${NC}"
|
|
@@ -226,18 +226,18 @@ echo ""
|
|
|
226
226
|
echo -e "${GREEN}STRICT MODE (/rawsql):${NC}"
|
|
227
227
|
echo " - ✅ Allows SELECT from system tables (read-only)"
|
|
228
228
|
echo " - ❌ Blocks INSERT/UPDATE/DELETE/DROP/ALTER on system tables"
|
|
229
|
-
echo " - ❌ Blocks ALL operations on users table"
|
|
229
|
+
echo " - ❌ Blocks ALL operations on auth.users table"
|
|
230
230
|
echo " - ❌ Blocks pg_catalog and information_schema"
|
|
231
231
|
echo " - ❌ Blocks database-level operations"
|
|
232
232
|
echo ""
|
|
233
233
|
echo -e "${GREEN}RELAXED MODE (/rawsql/unrestricted):${NC}"
|
|
234
234
|
echo " - ✅ Allows SELECT from system tables"
|
|
235
235
|
echo " - ✅ Allows INSERT into system tables"
|
|
236
|
-
echo " - ✅ Allows SELECT from users table"
|
|
236
|
+
echo " - ✅ Allows SELECT from auth.users table"
|
|
237
237
|
echo " - ❌ Blocks UPDATE of system tables"
|
|
238
238
|
echo " - ❌ Blocks DELETE FROM system tables"
|
|
239
239
|
echo " - ❌ Blocks DROP/ALTER/TRUNCATE system tables"
|
|
240
|
-
echo " - ❌ Blocks DROP/RENAME users table"
|
|
240
|
+
echo " - ❌ Blocks DROP/RENAME auth.users table"
|
|
241
241
|
echo " - ❌ Blocks pg_catalog and information_schema"
|
|
242
242
|
echo " - ❌ Blocks database-level operations"
|
|
243
243
|
echo ""
|