ai-inference-stepper 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/.env.example +169 -0
  2. package/.eslintrc.cjs +23 -0
  3. package/.github/workflows/ci.yml +51 -0
  4. package/.github/workflows/keep-alive.yml +22 -0
  5. package/.github/workflows/publish.yml +34 -0
  6. package/ARCHITECTURE.md +594 -0
  7. package/Dockerfile +16 -0
  8. package/LICENSE +28 -0
  9. package/README.md +261 -0
  10. package/dist/alerts/discord.d.ts +19 -0
  11. package/dist/alerts/discord.d.ts.map +1 -0
  12. package/dist/alerts/discord.js +70 -0
  13. package/dist/alerts/discord.js.map +1 -0
  14. package/dist/cache/redisCache.d.ts +45 -0
  15. package/dist/cache/redisCache.d.ts.map +1 -0
  16. package/dist/cache/redisCache.js +171 -0
  17. package/dist/cache/redisCache.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +8 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/config.d.ts +6 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +251 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/fallback/templateFallback.d.ts +7 -0
  27. package/dist/fallback/templateFallback.d.ts.map +1 -0
  28. package/dist/fallback/templateFallback.js +29 -0
  29. package/dist/fallback/templateFallback.js.map +1 -0
  30. package/dist/index.d.ts +121 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +198 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/logging.d.ts +10 -0
  35. package/dist/logging.d.ts.map +1 -0
  36. package/dist/logging.js +44 -0
  37. package/dist/logging.js.map +1 -0
  38. package/dist/metrics/metrics.d.ts +22 -0
  39. package/dist/metrics/metrics.d.ts.map +1 -0
  40. package/dist/metrics/metrics.js +78 -0
  41. package/dist/metrics/metrics.js.map +1 -0
  42. package/dist/providers/factory.d.ts +11 -0
  43. package/dist/providers/factory.d.ts.map +1 -0
  44. package/dist/providers/factory.js +52 -0
  45. package/dist/providers/factory.js.map +1 -0
  46. package/dist/providers/hfSpace.adapter.d.ts +21 -0
  47. package/dist/providers/hfSpace.adapter.d.ts.map +1 -0
  48. package/dist/providers/hfSpace.adapter.js +110 -0
  49. package/dist/providers/hfSpace.adapter.js.map +1 -0
  50. package/dist/providers/httpTemplate.adapter.d.ts +42 -0
  51. package/dist/providers/httpTemplate.adapter.d.ts.map +1 -0
  52. package/dist/providers/httpTemplate.adapter.js +98 -0
  53. package/dist/providers/httpTemplate.adapter.js.map +1 -0
  54. package/dist/providers/promptBuilder.d.ts +34 -0
  55. package/dist/providers/promptBuilder.d.ts.map +1 -0
  56. package/dist/providers/promptBuilder.js +315 -0
  57. package/dist/providers/promptBuilder.js.map +1 -0
  58. package/dist/providers/provider.interface.d.ts +45 -0
  59. package/dist/providers/provider.interface.d.ts.map +1 -0
  60. package/dist/providers/provider.interface.js +47 -0
  61. package/dist/providers/provider.interface.js.map +1 -0
  62. package/dist/providers/specs.d.ts +18 -0
  63. package/dist/providers/specs.d.ts.map +1 -0
  64. package/dist/providers/specs.js +326 -0
  65. package/dist/providers/specs.js.map +1 -0
  66. package/dist/providers/unified.adapter.d.ts +37 -0
  67. package/dist/providers/unified.adapter.d.ts.map +1 -0
  68. package/dist/providers/unified.adapter.js +141 -0
  69. package/dist/providers/unified.adapter.js.map +1 -0
  70. package/dist/queue/producer.d.ts +30 -0
  71. package/dist/queue/producer.d.ts.map +1 -0
  72. package/dist/queue/producer.js +87 -0
  73. package/dist/queue/producer.js.map +1 -0
  74. package/dist/queue/worker.d.ts +9 -0
  75. package/dist/queue/worker.d.ts.map +1 -0
  76. package/dist/queue/worker.js +137 -0
  77. package/dist/queue/worker.js.map +1 -0
  78. package/dist/server/app.d.ts +4 -0
  79. package/dist/server/app.d.ts.map +1 -0
  80. package/dist/server/app.js +394 -0
  81. package/dist/server/app.js.map +1 -0
  82. package/dist/server/start.d.ts +16 -0
  83. package/dist/server/start.d.ts.map +1 -0
  84. package/dist/server/start.js +45 -0
  85. package/dist/server/start.js.map +1 -0
  86. package/dist/stepper/orchestrator.d.ts +22 -0
  87. package/dist/stepper/orchestrator.d.ts.map +1 -0
  88. package/dist/stepper/orchestrator.js +333 -0
  89. package/dist/stepper/orchestrator.js.map +1 -0
  90. package/dist/types.d.ts +216 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +14 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/utils/redaction.d.ts +9 -0
  95. package/dist/utils/redaction.d.ts.map +1 -0
  96. package/dist/utils/redaction.js +41 -0
  97. package/dist/utils/redaction.js.map +1 -0
  98. package/dist/utils/safeRequest.d.ts +38 -0
  99. package/dist/utils/safeRequest.d.ts.map +1 -0
  100. package/dist/utils/safeRequest.js +104 -0
  101. package/dist/utils/safeRequest.js.map +1 -0
  102. package/dist/validation/report.schema.d.ts +48 -0
  103. package/dist/validation/report.schema.d.ts.map +1 -0
  104. package/dist/validation/report.schema.js +72 -0
  105. package/dist/validation/report.schema.js.map +1 -0
  106. package/dist/webhooks/delivery.d.ts +31 -0
  107. package/dist/webhooks/delivery.d.ts.map +1 -0
  108. package/dist/webhooks/delivery.js +102 -0
  109. package/dist/webhooks/delivery.js.map +1 -0
  110. package/docs/assets/architecture.png +0 -0
  111. package/package.json +75 -0
  112. package/render.yaml +25 -0
  113. package/src/alerts/README.md +25 -0
  114. package/src/alerts/discord.ts +86 -0
  115. package/src/cache/How redis caching works in package stepper.md +971 -0
  116. package/src/cache/README.md +51 -0
  117. package/src/cache/redisCache.ts +194 -0
  118. package/src/ci/deploy.sh +36 -0
  119. package/src/cli.ts +9 -0
  120. package/src/config.ts +265 -0
  121. package/src/fallback/templateFallback.ts +32 -0
  122. package/src/index.ts +246 -0
  123. package/src/logging.ts +46 -0
  124. package/src/metrics/README.md +24 -0
  125. package/src/metrics/metrics.ts +84 -0
  126. package/src/providers/How the providers interact.md +121 -0
  127. package/src/providers/README.md +121 -0
  128. package/src/providers/factory.ts +57 -0
  129. package/src/providers/hfSpace.adapter.ts +119 -0
  130. package/src/providers/httpTemplate.adapter.ts +138 -0
  131. package/src/providers/promptBuilder.ts +330 -0
  132. package/src/providers/provider.interface.ts +73 -0
  133. package/src/providers/specs.ts +366 -0
  134. package/src/providers/unified.adapter.ts +172 -0
  135. package/src/queue/How queue works in package stepper.md +149 -0
  136. package/src/queue/README.md +41 -0
  137. package/src/queue/producer.ts +108 -0
  138. package/src/queue/worker.ts +170 -0
  139. package/src/server/app.ts +451 -0
  140. package/src/server/start.ts +68 -0
  141. package/src/stepper/Dockerfile +48 -0
  142. package/src/stepper/How orchestrator works in package stepper.md +746 -0
  143. package/src/stepper/README.md +43 -0
  144. package/src/stepper/orchestrator.ts +437 -0
  145. package/src/types.ts +238 -0
  146. package/src/utils/redaction.ts +50 -0
  147. package/src/utils/safeRequest.ts +140 -0
  148. package/src/validation/README.md +25 -0
  149. package/src/validation/report.schema.ts +96 -0
  150. package/src/webhooks/delivery.ts +162 -0
  151. package/tests/integration/full-flow.test.ts +192 -0
  152. package/tests/unit/alerts/discord.test.ts +119 -0
  153. package/tests/unit/cache.test.ts +87 -0
  154. package/tests/unit/orchestrator-fallback.test.ts +92 -0
  155. package/tests/unit/orchestrator.test.ts +105 -0
  156. package/tests/unit/providers/factory.test.ts +161 -0
  157. package/tests/unit/providers/unified.adapter.test.ts +206 -0
  158. package/tests/unit/utils/redaction.test.ts +140 -0
  159. package/tests/unit/utils/safeRequest.test.ts +164 -0
  160. package/tsconfig.json +26 -0
package/.env.example ADDED
@@ -0,0 +1,169 @@
1
+ # Node environment
2
+ NODE_ENV=development
3
+
4
+ # Server configuration
5
+ PORT=3001
6
+ LOG_LEVEL=debug
7
+ # Trust proxy for proper IP detection (1=single proxy, true=any, or specific IPs)
8
+ # Required when behind nginx, ELB, Cloudflare, etc.
9
+ TRUST_PROXY=1
10
+
11
+ # Redis configuration
12
+ REDIS_URL=redis://localhost:6379
13
+ REDIS_KEY_PREFIX=stepper:
14
+
15
+ # Cache configuration
16
+ CACHE_TTL_SECONDS=604800
17
+ CACHE_STALE_THRESHOLD=86400
18
+ CACHE_STALE_WHILE_REVALIDATE=true
19
+
20
+ # Queue configuration
21
+ QUEUE_NAME=report-generation
22
+ QUEUE_CONCURRENCY=5
23
+
24
+ # Webhook configuration
25
+ WEBHOOK_ENABLED=true
26
+ # Must match API's WEBHOOK_SECRET - Generate with: openssl rand -hex 32
27
+ WEBHOOK_SECRET=your-webhook-secret-here
28
+ WEBHOOK_MAX_RETRIES=3
29
+ WEBHOOK_RETRY_DELAY_MS=5000
30
+
31
+ # Retry configuration
32
+ RETRY_MAX_ATTEMPTS=3
33
+ RETRY_BASE_DELAY_MS=500
34
+ RETRY_MAX_JITTER_MS=300
35
+ RETRY_RATE_LIMIT_FALLBACK=7200
36
+
37
+ # Circuit breaker configuration
38
+ CIRCUIT_FAILURE_THRESHOLD=5
39
+ CIRCUIT_WINDOW_SECONDS=300
40
+ CIRCUIT_COOLDOWN_SECONDS=300
41
+
42
+ # Security - Sensitive Data Redaction
43
+ REDACT_BEFORE_SEND=true
44
+
45
+ # Security - CORS (Cross-Origin Resource Sharing)
46
+ CORS_ENABLED=true
47
+ CORS_ALLOWED_ORIGINS=https://yourdomain.com,https://app.yourdomain.com
48
+ CORS_ALLOW_CREDENTIALS=false
49
+
50
+ # Security - Rate Limiting
51
+ RATE_LIMIT_ENABLED=true
52
+ RATE_LIMIT_WINDOW_MS=900000
53
+ RATE_LIMIT_MAX_REQUESTS=100
54
+ RATE_LIMIT_MAX_PER_USER=50
55
+ RATE_LIMIT_SKIP_HEALTH=true
56
+
57
+ # Security - Helmet (Security Headers)
58
+ HELMET_ENABLED=true
59
+
60
+ # Security - API Key Authentication
61
+ API_KEY_ENABLED=false
62
+ API_KEY_HEADER=x-api-key
63
+ STEPPER_API_KEY=your_secret_api_key_here
64
+ API_KEY_SKIP_HEALTH=true
65
+
66
+ # Alerts (optional)
67
+ DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your_webhook_url
68
+
69
+ # --- Provider Configurations ---
70
+
71
+ # Hugging Face Space
72
+ HF_SPACE_ENABLED=false
73
+ HF_SPACE_URL=https://your-space-name.hf.space
74
+ HF_SPACE_API_KEY=your_hf_api_key_here
75
+ HF_SPACE_RPS=3
76
+ HF_SPACE_CONCURRENCY=1
77
+ HF_SPACE_TIMEOUT=30000
78
+
79
+ # Google Gemini
80
+ GEMINI_ENABLED=false
81
+ GEMINI_API_KEY=your_gemini_api_key_here
82
+ GEMINI_BASE_URL=https://generativelanguage.googleapis.com
83
+ GEMINI_MODEL=gemini-pro
84
+ GEMINI_RPS=10
85
+ GEMINI_CONCURRENCY=4
86
+ GEMINI_TIMEOUT=15000
87
+
88
+ # OpenAI
89
+ OPENAI_ENABLED=false
90
+ OPENAI_API_KEY=your_openai_key_here
91
+ OPENAI_BASE_URL=https://api.openai.com
92
+ OPENAI_MODEL=gpt-4-turbo-preview
93
+ OPENAI_TIMEOUT=30000
94
+ OPENAI_RPS=5
95
+ OPENAI_CONCURRENCY=2
96
+
97
+ # Anthropic Claude
98
+ ANTHROPIC_ENABLED=false
99
+ ANTHROPIC_API_KEY=your_anthropic_key_here
100
+ ANTHROPIC_BASE_URL=https://api.anthropic.com
101
+ ANTHROPIC_MODEL=claude-3-5-sonnet-20241022
102
+ ANTHROPIC_TIMEOUT=30000
103
+ ANTHROPIC_RPS=5
104
+ ANTHROPIC_CONCURRENCY=2
105
+
106
+ # Cohere
107
+ COHERE_ENABLED=false
108
+ COHERE_API_KEY=your_cohere_key_here
109
+ COHERE_BASE_URL=https://api.cohere.ai
110
+ COHERE_MODEL=command-r-plus
111
+ COHERE_TIMEOUT=20000
112
+ COHERE_RPS=5
113
+ COHERE_CONCURRENCY=2
114
+
115
+ # DeepSeek
116
+ DEEPSEEK_ENABLED=false
117
+ DEEPSEEK_API_KEY=your_deepseek_key_here
118
+ DEEPSEEK_BASE_URL=https://api.deepseek.com
119
+ DEEPSEEK_MODEL=deepseek-chat
120
+ DEEPSEEK_TIMEOUT=20000
121
+ DEEPSEEK_RPS=5
122
+ DEEPSEEK_CONCURRENCY=2
123
+
124
+ # Groq
125
+ GROQ_ENABLED=false
126
+ GROQ_API_KEY=your_groq_key_here
127
+ GROQ_BASE_URL=https://api.groq.com/openai
128
+ GROQ_MODEL=mixtral-8x7b-32768
129
+ GROQ_TIMEOUT=10000
130
+ GROQ_RPS=10
131
+ GROQ_CONCURRENCY=4
132
+
133
+ # OpenRouter
134
+ OPENROUTER_ENABLED=false
135
+ OPENROUTER_API_KEY=your_openrouter_key_here
136
+ OPENROUTER_BASE_URL=https://openrouter.ai/api
137
+ OPENROUTER_MODEL=anthropic/claude-3.5-sonnet
138
+ OPENROUTER_TIMEOUT=30000
139
+ OPENROUTER_RPS=5
140
+ OPENROUTER_CONCURRENCY=2
141
+ OPENROUTER_REFERER=https://commitdiary.com
142
+ OPENROUTER_TITLE=CommitDiary Stepper
143
+
144
+ # Mistral AI
145
+ MISTRAL_ENABLED=false
146
+ MISTRAL_API_KEY=your_key
147
+ MISTRAL_BASE_URL=https://api.mistral.ai
148
+ MISTRAL_MODEL=mistral-large-latest
149
+ MISTRAL_TIMEOUT=15000
150
+ MISTRAL_RPS=5
151
+ MISTRAL_CONCURRENCY=2
152
+
153
+ # Perplexity AI
154
+ PERPLEXITY_ENABLED=false
155
+ PERPLEXITY_API_KEY=your_key
156
+ PERPLEXITY_BASE_URL=https://api.perplexity.ai
157
+ PERPLEXITY_MODEL=llama-3.1-sonar-large-128k-online
158
+ PERPLEXITY_TIMEOUT=20000
159
+ PERPLEXITY_RPS=5
160
+ PERPLEXITY_CONCURRENCY=2
161
+
162
+ # Together AI
163
+ TOGETHER_ENABLED=false
164
+ TOGETHER_API_KEY=your_key
165
+ TOGETHER_BASE_URL=https://api.together.xyz
166
+ TOGETHER_MODEL=meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo
167
+ TOGETHER_TIMEOUT=20000
168
+ TOGETHER_RPS=5
169
+ TOGETHER_CONCURRENCY=2
package/.eslintrc.cjs ADDED
@@ -0,0 +1,23 @@
1
+ module.exports = {
2
+ parser: '@typescript-eslint/parser',
3
+ parserOptions: {
4
+ ecmaVersion: 2022,
5
+ sourceType: 'module',
6
+ project: './tsconfig.json',
7
+ },
8
+ plugins: ['@typescript-eslint'],
9
+ extends: [
10
+ 'eslint:recommended',
11
+ 'plugin:@typescript-eslint/recommended',
12
+ ],
13
+ rules: {
14
+ '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
15
+ '@typescript-eslint/explicit-function-return-type': 'off',
16
+ '@typescript-eslint/no-explicit-any': 'error',
17
+ 'no-console': 'warn',
18
+ },
19
+ env: {
20
+ node: true,
21
+ es2022: true,
22
+ },
23
+ };
@@ -0,0 +1,51 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main, develop]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ services:
14
+ redis:
15
+ image: redis:7-alpine
16
+ ports:
17
+ - 6379:6379
18
+ options: >-
19
+ --health-cmd "redis-cli ping"
20
+ --health-interval 10s
21
+ --health-timeout 5s
22
+ --health-retries 5
23
+
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+
27
+ - name: Setup Node.js
28
+ uses: actions/setup-node@v4
29
+ with:
30
+ node-version: '18'
31
+
32
+ - name: Install pnpm
33
+ run: npm install -g pnpm
34
+
35
+ - name: Install dependencies
36
+ run: pnpm install # Removed --frozen-lockfile until you push a fresh lockfile
37
+
38
+ - name: Lint
39
+ run: pnpm lint
40
+
41
+ - name: Type check
42
+ run: pnpm typecheck
43
+
44
+ - name: Build
45
+ run: pnpm build
46
+
47
+ - name: Test
48
+ run: pnpm test
49
+ env:
50
+ REDIS_URL: redis://localhost:6379
51
+ NODE_ENV: test
@@ -0,0 +1,22 @@
1
+ name: Render Keep-Alive
2
+
3
+ on:
4
+ schedule:
5
+ # Run every 10 minutes to prevent Render free tier from sleeping
6
+ - cron: "*/10 * * * *"
7
+ workflow_dispatch: # Allows manual triggering for testing
8
+
9
+ jobs:
10
+ ping:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Ping Render Service
14
+ run: |
15
+ URL="${{ secrets.RENDER_APP_URL }}"
16
+ if [ -z "$URL" ]; then
17
+ echo "Error: RENDER_APP_URL secret is not set."
18
+ echo "Please go to Settings > Secrets and variables > Actions and add RENDER_APP_URL (e.g., https://your-app.onrender.com)"
19
+ exit 1
20
+ fi
21
+ echo "Pinging $URL/health..."
22
+ curl -f -s "$URL/health" || echo "Ping failed, but that's okay (server might be starting up)."
@@ -0,0 +1,34 @@
1
+ name: Publish
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types: [published]
7
+
8
+ permissions:
9
+ contents: read
10
+ id-token: write
11
+
12
+ jobs:
13
+ publish:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Setup Node
20
+ uses: actions/setup-node@v4
21
+ with:
22
+ node-version: 20
23
+ registry-url: https://registry.npmjs.org/
24
+
25
+ - name: Install
26
+ run: npm install
27
+
28
+ - name: Build
29
+ run: npm run build
30
+
31
+ - name: Publish
32
+ run: npm publish --access public
33
+ env:
34
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}