Skip to content

Commit 745eaff

Browse files
v0.4.2: autolayout improvements, variable resolution, CI/CD, deployed chat, router block fixes
2 parents f9f8411 + 35d857e commit 745eaff

File tree

79 files changed

+1520
-795
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1520
-795
lines changed

.devcontainer/docker-compose.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ services:
1010
environment:
1111
- NODE_ENV=development
1212
- DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
13-
- POSTGRES_URL=postgresql://postgres:postgres@db:5432/simstudio
1413
- BETTER_AUTH_URL=http://localhost:3000
1514
- NEXT_PUBLIC_APP_URL=http://localhost:3000
1615
- BUN_INSTALL_CACHE_DIR=/home/bun/.bun/cache

.github/workflows/ci.yml

Lines changed: 179 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,200 @@ jobs:
1616
uses: ./.github/workflows/test-build.yml
1717
secrets: inherit
1818

19-
# Build and push images (ECR for staging, ECR + GHCR for main)
20-
build-images:
21-
name: Build Images
19+
# Build AMD64 images and push to ECR immediately (+ GHCR for main)
20+
build-amd64:
21+
name: Build AMD64
2222
needs: test-build
2323
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging')
24-
uses: ./.github/workflows/images.yml
25-
secrets: inherit
24+
runs-on: blacksmith-4vcpu-ubuntu-2404
2625
permissions:
2726
contents: read
2827
packages: write
2928
id-token: write
29+
strategy:
30+
fail-fast: false
31+
matrix:
32+
include:
33+
- dockerfile: ./docker/app.Dockerfile
34+
ghcr_image: ghcr.io/simstudioai/simstudio
35+
ecr_repo_secret: ECR_APP
36+
- dockerfile: ./docker/db.Dockerfile
37+
ghcr_image: ghcr.io/simstudioai/migrations
38+
ecr_repo_secret: ECR_MIGRATIONS
39+
- dockerfile: ./docker/realtime.Dockerfile
40+
ghcr_image: ghcr.io/simstudioai/realtime
41+
ecr_repo_secret: ECR_REALTIME
42+
steps:
43+
- name: Checkout code
44+
uses: actions/checkout@v4
45+
46+
- name: Configure AWS credentials
47+
uses: aws-actions/configure-aws-credentials@v4
48+
with:
49+
role-to-assume: ${{ github.ref == 'refs/heads/main' && secrets.AWS_ROLE_TO_ASSUME || secrets.STAGING_AWS_ROLE_TO_ASSUME }}
50+
aws-region: ${{ github.ref == 'refs/heads/main' && secrets.AWS_REGION || secrets.STAGING_AWS_REGION }}
51+
52+
- name: Login to Amazon ECR
53+
id: login-ecr
54+
uses: aws-actions/amazon-ecr-login@v2
55+
56+
- name: Login to Docker Hub
57+
uses: docker/login-action@v3
58+
with:
59+
username: ${{ secrets.DOCKERHUB_USERNAME }}
60+
password: ${{ secrets.DOCKERHUB_TOKEN }}
61+
62+
- name: Login to GHCR
63+
if: github.ref == 'refs/heads/main'
64+
uses: docker/login-action@v3
65+
with:
66+
registry: ghcr.io
67+
username: ${{ github.repository_owner }}
68+
password: ${{ secrets.GITHUB_TOKEN }}
69+
70+
- name: Set up Docker Buildx
71+
uses: useblacksmith/setup-docker-builder@v1
72+
73+
- name: Generate tags
74+
id: meta
75+
run: |
76+
ECR_REGISTRY="${{ steps.login-ecr.outputs.registry }}"
77+
ECR_REPO="${{ secrets[matrix.ecr_repo_secret] }}"
78+
GHCR_IMAGE="${{ matrix.ghcr_image }}"
79+
80+
# ECR tags (always build for ECR)
81+
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
82+
ECR_TAG="latest"
83+
else
84+
ECR_TAG="staging"
85+
fi
86+
ECR_IMAGE="${ECR_REGISTRY}/${ECR_REPO}:${ECR_TAG}"
3087
31-
# Deploy Trigger.dev (after builds complete)
88+
# Build tags list
89+
TAGS="${ECR_IMAGE}"
90+
91+
# Add GHCR tags only for main branch
92+
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
93+
GHCR_AMD64="${GHCR_IMAGE}:latest-amd64"
94+
GHCR_SHA="${GHCR_IMAGE}:${{ github.sha }}-amd64"
95+
TAGS="${TAGS},$GHCR_AMD64,$GHCR_SHA"
96+
fi
97+
98+
echo "tags=${TAGS}" >> $GITHUB_OUTPUT
99+
100+
- name: Build and push images
101+
uses: useblacksmith/build-push-action@v2
102+
with:
103+
context: .
104+
file: ${{ matrix.dockerfile }}
105+
platforms: linux/amd64
106+
push: true
107+
tags: ${{ steps.meta.outputs.tags }}
108+
provenance: false
109+
sbom: false
110+
111+
# Build ARM64 images for GHCR (main branch only, runs in parallel)
112+
build-ghcr-arm64:
113+
name: Build ARM64 (GHCR Only)
114+
needs: test-build
115+
runs-on: linux-arm64-8-core
116+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
117+
permissions:
118+
contents: read
119+
packages: write
120+
strategy:
121+
fail-fast: false
122+
matrix:
123+
include:
124+
- dockerfile: ./docker/app.Dockerfile
125+
image: ghcr.io/simstudioai/simstudio
126+
- dockerfile: ./docker/db.Dockerfile
127+
image: ghcr.io/simstudioai/migrations
128+
- dockerfile: ./docker/realtime.Dockerfile
129+
image: ghcr.io/simstudioai/realtime
130+
131+
steps:
132+
- name: Checkout code
133+
uses: actions/checkout@v4
134+
135+
- name: Login to GHCR
136+
uses: docker/login-action@v3
137+
with:
138+
registry: ghcr.io
139+
username: ${{ github.repository_owner }}
140+
password: ${{ secrets.GITHUB_TOKEN }}
141+
142+
- name: Set up Docker Buildx
143+
uses: useblacksmith/setup-docker-builder@v1
144+
145+
- name: Generate ARM64 tags
146+
id: meta
147+
run: |
148+
IMAGE="${{ matrix.image }}"
149+
echo "tags=${IMAGE}:latest-arm64,${IMAGE}:${{ github.sha }}-arm64" >> $GITHUB_OUTPUT
150+
151+
- name: Build and push ARM64 to GHCR
152+
uses: useblacksmith/build-push-action@v2
153+
with:
154+
context: .
155+
file: ${{ matrix.dockerfile }}
156+
platforms: linux/arm64
157+
push: true
158+
tags: ${{ steps.meta.outputs.tags }}
159+
provenance: false
160+
sbom: false
161+
162+
# Create GHCR multi-arch manifests (only for main, after both builds)
163+
create-ghcr-manifests:
164+
name: Create GHCR Manifests
165+
runs-on: blacksmith-4vcpu-ubuntu-2404
166+
needs: [build-amd64, build-ghcr-arm64]
167+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
168+
permissions:
169+
packages: write
170+
strategy:
171+
matrix:
172+
include:
173+
- image: ghcr.io/simstudioai/simstudio
174+
- image: ghcr.io/simstudioai/migrations
175+
- image: ghcr.io/simstudioai/realtime
176+
177+
steps:
178+
- name: Login to GHCR
179+
uses: docker/login-action@v3
180+
with:
181+
registry: ghcr.io
182+
username: ${{ github.repository_owner }}
183+
password: ${{ secrets.GITHUB_TOKEN }}
184+
185+
- name: Create and push manifests
186+
run: |
187+
IMAGE_BASE="${{ matrix.image }}"
188+
189+
# Create latest manifest
190+
docker manifest create "${IMAGE_BASE}:latest" \
191+
"${IMAGE_BASE}:latest-amd64" \
192+
"${IMAGE_BASE}:latest-arm64"
193+
docker manifest push "${IMAGE_BASE}:latest"
194+
195+
# Create SHA manifest
196+
docker manifest create "${IMAGE_BASE}:${{ github.sha }}" \
197+
"${IMAGE_BASE}:${{ github.sha }}-amd64" \
198+
"${IMAGE_BASE}:${{ github.sha }}-arm64"
199+
docker manifest push "${IMAGE_BASE}:${{ github.sha }}"
200+
201+
# Deploy Trigger.dev (after ECR images are pushed, runs in parallel with process-docs)
32202
trigger-deploy:
33203
name: Deploy Trigger.dev
34-
needs: build-images
204+
needs: build-amd64
35205
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging')
36206
uses: ./.github/workflows/trigger-deploy.yml
37207
secrets: inherit
38208

39-
# Run database migrations (depends on build completion and trigger deployment)
40-
migrations:
41-
name: Apply Database Migrations
42-
needs: [build-images, trigger-deploy]
43-
if: |
44-
always() &&
45-
github.event_name == 'push' &&
46-
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging') &&
47-
needs.build-images.result == 'success' &&
48-
needs.trigger-deploy.result == 'success'
49-
uses: ./.github/workflows/migrations.yml
50-
secrets: inherit
51-
52-
# Process docs embeddings if needed
209+
# Process docs embeddings (after ECR images are pushed, runs in parallel with trigger-deploy)
53210
process-docs:
54211
name: Process Docs
55-
needs: migrations
212+
needs: build-amd64
56213
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging')
57214
uses: ./.github/workflows/docs-embeddings.yml
58215
secrets: inherit

.github/workflows/trigger-deploy.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ jobs:
1313
cancel-in-progress: false
1414
env:
1515
TRIGGER_ACCESS_TOKEN: ${{ secrets.TRIGGER_ACCESS_TOKEN }}
16+
TRIGGER_PROJECT_ID: ${{ secrets.TRIGGER_PROJECT_ID }}
1617

1718
steps:
1819
- name: Checkout code
@@ -39,4 +40,5 @@ jobs:
3940
- name: Deploy to Trigger.dev (Production)
4041
if: github.ref == 'refs/heads/main'
4142
working-directory: ./apps/sim
42-
run: npx --yes trigger.dev@4.0.4 deploy
43+
run: npx --yes trigger.dev@4.0.4 deploy
44+

apps/docs/content/docs/de/blocks/agent.mdx

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -175,56 +175,30 @@ Verwenden Sie einen `Memory`Block mit einer konsistenten `id` (zum Beispiel `cha
175175
- Lesen Sie den Gesprächsverlauf für den Kontext
176176
- Hängen Sie die Antwort des Agenten nach dessen Ausführung an
177177

178-
```yaml
179-
# 1) Add latest user message
180-
- Memory (operation: add)
181-
id: chat
182-
role: user
183-
content: {{input}}
184-
185-
# 2) Load conversation history
186-
- Memory (operation: get)
187-
id: chat
188-
189-
# 3) Run the agent with prior messages available
190-
- Agent
191-
System Prompt: ...
192-
User Prompt: |
193-
Use the conversation so far:
194-
{{memory_get.memories}}
195-
Current user message: {{input}}
196-
197-
# 4) Store the agent reply
198-
- Memory (operation: add)
199-
id: chat
200-
role: assistant
201-
content: {{agent.content}}
202-
```
203-
204-
Siehe die `Memory`Block-Referenz für Details: [/tools/memory](/tools/memory).
178+
Siehe die [`Memory`](/tools/memory) Blockreferenz für Details.
205179

206180
## Eingaben und Ausgaben
207181

208-
<Tabs items={['Configuration', 'Variables', 'Results']}>
182+
<Tabs items={['Konfiguration', 'Variablen', 'Ergebnisse']}>
209183
<Tab>
210184
<ul className="list-disc space-y-2 pl-6">
211185
<li>
212-
<strong>System Prompt</strong>: Anweisungen, die das Verhalten und die Rolle des Agenten definieren
186+
<strong>System-Prompt</strong>: Anweisungen, die das Verhalten und die Rolle des Agenten definieren
213187
</li>
214188
<li>
215-
<strong>User Prompt</strong>: Eingabetext oder -daten zur Verarbeitung
189+
<strong>Benutzer-Prompt</strong>: Eingabetext oder zu verarbeitende Daten
216190
</li>
217191
<li>
218-
<strong>Model</strong>: KI-Modellauswahl (OpenAI, Anthropic, Google, etc.)
192+
<strong>Modell</strong>: KI-Modellauswahl (OpenAI, Anthropic, Google, usw.)
219193
</li>
220194
<li>
221-
<strong>Temperature</strong>: Steuerung der Antwort-Zufälligkeit (0-2)
195+
<strong>Temperatur</strong>: Steuerung der Zufälligkeit der Antwort (0-2)
222196
</li>
223197
<li>
224198
<strong>Tools</strong>: Array verfügbarer Tools für Funktionsaufrufe
225199
</li>
226200
<li>
227-
<strong>Response Format</strong>: JSON-Schema für strukturierte Ausgabe
201+
<strong>Antwortformat</strong>: JSON-Schema für strukturierte Ausgabe
228202
</li>
229203
</ul>
230204
</Tab>
@@ -261,17 +235,17 @@ Siehe die `Memory`Block-Referenz für Details: [/tools/memory](/tools/memory).
261235

262236
## Beispielanwendungsfälle
263237

264-
### Automatisierung des Kundendienstes
238+
### Automatisierung des Kundenservice
265239

266240
<div className="mb-4 rounded-md border p-4">
267241
<h4 className="font-medium">Szenario: Bearbeitung von Kundenanfragen mit Datenbankzugriff</h4>
268242
<ol className="list-decimal pl-5 text-sm">
269243
<li>Benutzer reicht ein Support-Ticket über den API-Block ein</li>
270244
<li>Agent prüft Bestellungen/Abonnements in Postgres und durchsucht die Wissensdatenbank nach Anleitungen</li>
271245
<li>Falls eine Eskalation erforderlich ist, erstellt der Agent ein Linear-Ticket mit relevantem Kontext</li>
272-
<li>Agent verfasst eine klare E-Mail-Antwort</li>
246+
<li>Agent erstellt eine klare E-Mail-Antwort</li>
273247
<li>Gmail sendet die Antwort an den Kunden</li>
274-
<li>Konversation wird im Speicher gesichert, um den Verlauf für zukünftige Nachrichten zu erhalten</li>
248+
<li>Konversation wird im Memory gespeichert, um den Verlauf für zukünftige Nachrichten beizubehalten</li>
275249
</ol>
276250
</div>
277251

@@ -287,20 +261,20 @@ Siehe die `Memory`Block-Referenz für Details: [/tools/memory](/tools/memory).
287261
</ol>
288262
</div>
289263

290-
### Werkzeuggestützter Rechercheassistent
264+
### Werkzeuggestützter Forschungsassistent
291265

292266
<div className="mb-4 rounded-md border p-4">
293-
<h4 className="font-medium">Szenario: Rechercheassistent mit Websuche und Dokumentenzugriff</h4>
267+
<h4 className="font-medium">Szenario: Forschungsassistent mit Websuche und Dokumentenzugriff</h4>
294268
<ol className="list-decimal pl-5 text-sm">
295269
<li>Benutzeranfrage über Eingabe erhalten</li>
296-
<li>Agent durchsucht das Web mit dem Google Search-Tool</li>
270+
<li>Agent durchsucht das Web mit dem Google-Suchwerkzeug</li>
297271
<li>Agent greift auf Notion-Datenbank für interne Dokumente zu</li>
298-
<li>Agent erstellt umfassenden Recherchebericht</li>
272+
<li>Agent erstellt umfassenden Forschungsbericht</li>
299273
</ol>
300274
</div>
301275

302-
## Best Practices
276+
## Bewährte Praktiken
303277

304-
- **Sei spezifisch in System-Prompts**: Definiere die Rolle, den Tonfall und die Einschränkungen des Agenten klar. Je spezifischer deine Anweisungen sind, desto besser kann der Agent seinen vorgesehenen Zweck erfüllen.
278+
- **Sei spezifisch in System-Prompts**: Definiere die Rolle, den Ton und die Einschränkungen des Agenten klar. Je spezifischer deine Anweisungen sind, desto besser kann der Agent seinen vorgesehenen Zweck erfüllen.
305279
- **Wähle die richtige Temperatureinstellung**: Verwende niedrigere Temperatureinstellungen (0-0,3), wenn Genauigkeit wichtig ist, oder erhöhe die Temperatur (0,7-2,0) für kreativere oder abwechslungsreichere Antworten
306-
- **Nutze Tools effektiv**: Integriere Tools, die den Zweck des Agenten ergänzen und seine Fähigkeiten erweitern. Sei selektiv bei der Auswahl der Tools, um den Agenten nicht zu überfordern. Für Aufgaben mit wenig Überschneidung verwende einen anderen Agent-Block für die besten Ergebnisse.
280+
- **Nutze Werkzeuge effektiv**: Integriere Werkzeuge, die den Zweck des Agenten ergänzen und seine Fähigkeiten verbessern. Sei selektiv bei der Auswahl der Werkzeuge, um den Agenten nicht zu überfordern. Für Aufgaben mit wenig Überschneidung verwende einen anderen Agent-Block für die besten Ergebnisse.

apps/docs/content/docs/de/triggers/api.mdx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,7 @@ Der API-Trigger stellt Ihren Workflow als sicheren HTTP-Endpunkt bereit. Senden
2424

2525
Fügen Sie für jeden Parameter ein Feld **Eingabeformat** hinzu. Die Ausgabeschlüssel zur Laufzeit spiegeln das Schema wider und sind auch unter `<api.input>` verfügbar.
2626

27-
```yaml
28-
- type: string
29-
name: userId
30-
value: demo-user # optional manual test value
31-
- type: number
32-
name: maxTokens
33-
```
34-
35-
Manuelle Ausführungen im Editor verwenden die Spalte `value`, damit Sie testen können, ohne eine Anfrage zu senden. Während der Ausführung füllt der Resolver sowohl `<api.userId>` als auch `<api.input.userId>`.
27+
Manuelle Ausführungen im Editor verwenden die Spalte `value`, damit Sie testen können, ohne eine Anfrage zu senden. Während der Ausführung füllt der Resolver sowohl `<api.userId>` als auch `<api.input.userId>` aus.
3628

3729
## Anfrage-Beispiel
3830

@@ -56,5 +48,5 @@ Erfolgreiche Antworten geben das serialisierte Ausführungsergebnis vom Executor
5648
Wenn kein Eingabeformat definiert ist, stellt der Executor das rohe JSON nur unter `<api.input>` bereit.
5749

5850
<Callout type="warning">
59-
Ein Workflow kann nur einen API-Trigger enthalten. Veröffentlichen Sie eine neue Bereitstellung nach Änderungen, damit der Endpunkt aktuell bleibt.
51+
Ein Workflow kann nur einen API-Trigger enthalten. Veröffentlichen Sie nach Änderungen eine neue Bereitstellung, damit der Endpunkt aktuell bleibt.
6052
</Callout>

0 commit comments

Comments
 (0)