relmio 0.2.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/CHANGELOG.md +190 -0
- package/LICENSE +21 -0
- package/README.md +122 -0
- package/SPEC.md +140 -0
- package/docs/architecture.md +127 -0
- package/docs/brand.md +43 -0
- package/docs/images/brand/relmio-concept-source.png +0 -0
- package/docs/images/brand/relmio-mark.svg +16 -0
- package/docs/images/setup/01-local-sign-in-ready.png +0 -0
- package/docs/images/setup/02-vps-identity-confirmed.png +0 -0
- package/docs/images/setup/03-n8n-detected.png +0 -0
- package/docs/images/setup/04-install-plan.png +0 -0
- package/docs/images/setup/05-bridge-ready.png +0 -0
- package/docs/maintenance.md +157 -0
- package/docs/manual-install.md +282 -0
- package/docs/n8n-configuration.md +199 -0
- package/docs/npm-publish.md +285 -0
- package/docs/roadmap.md +109 -0
- package/docs/security.md +105 -0
- package/docs/troubleshooting.md +193 -0
- package/docs/video-outline.md +152 -0
- package/package.json +45 -0
- package/scripts/build-npm-package.js +112 -0
- package/scripts/check-release-metadata.js +100 -0
- package/scripts/check-syntax.js +59 -0
- package/scripts/preview.js +69 -0
- package/src/cli.js +57 -0
- package/src/domain/safety.js +59 -0
- package/src/domain/templates.js +65 -0
- package/src/domain/validation.js +76 -0
- package/src/infrastructure/ssh.js +268 -0
- package/src/services/discovery.js +96 -0
- package/src/services/installer.js +239 -0
- package/src/services/oauth.js +351 -0
- package/src/ui/app.js +526 -0
- package/src/ui/index.html +440 -0
- package/src/ui/styles.css +645 -0
- package/src/ui/time.js +15 -0
- package/src/web/server.js +489 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Refresh, upgrade, rollback, and uninstall
|
|
2
|
+
|
|
3
|
+
Every command on this page targets the separate
|
|
4
|
+
`n8n-openai-oauth` project. None targets the n8n project.
|
|
5
|
+
|
|
6
|
+
## Refresh an expired ChatGPT login
|
|
7
|
+
|
|
8
|
+
The easiest method:
|
|
9
|
+
|
|
10
|
+
1. Start the local wizard again.
|
|
11
|
+
2. Select **Refresh ChatGPT sign-in**.
|
|
12
|
+
3. Complete the newest browser sign-in page.
|
|
13
|
+
4. Confirm that the **Credential updated** time matches the fresh sign-in.
|
|
14
|
+
5. Connect to the same VPS and select the same n8n network.
|
|
15
|
+
6. Approve the sidecar plan.
|
|
16
|
+
|
|
17
|
+
The wizard replaces the sidecar credential and starts only the sidecar service.
|
|
18
|
+
n8n is not restarted. Its local credential is stored separately at
|
|
19
|
+
`~/.n8n-openai-oauth/auth.json`.
|
|
20
|
+
|
|
21
|
+
Manual POSIX-shell method:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
install -d -m 0700 "$HOME/.n8n-openai-oauth"
|
|
25
|
+
npx --yes --ignore-scripts openai-oauth@2.0.0 login \
|
|
26
|
+
--open \
|
|
27
|
+
--login-timeout-ms 300000 \
|
|
28
|
+
--oauth-file "$HOME/.n8n-openai-oauth/auth.json"
|
|
29
|
+
scp "$HOME/.n8n-openai-oauth/auth.json" \
|
|
30
|
+
root@YOUR_VPS_IP:/docker/n8n-openai-oauth/auth/auth.json
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Then on the VPS:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
chown 1000:1000 /docker/n8n-openai-oauth/auth/auth.json
|
|
37
|
+
chmod 600 /docker/n8n-openai-oauth/auth/auth.json
|
|
38
|
+
docker compose \
|
|
39
|
+
--project-name n8n-openai-oauth \
|
|
40
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
41
|
+
up -d --wait --wait-timeout 60 --no-deps openai-oauth
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Restart only the sidecar
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
docker compose \
|
|
48
|
+
--project-name n8n-openai-oauth \
|
|
49
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
50
|
+
restart openai-oauth
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
This does not restart n8n.
|
|
54
|
+
|
|
55
|
+
## Safe source-code update
|
|
56
|
+
|
|
57
|
+
On the local computer:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
git pull --ff-only
|
|
61
|
+
npm ci --ignore-scripts
|
|
62
|
+
npm test
|
|
63
|
+
npm start
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Review release notes and the generated plan before approving another VPS
|
|
67
|
+
installation.
|
|
68
|
+
|
|
69
|
+
## Optional maintainer architecture map
|
|
70
|
+
|
|
71
|
+
Graphify is useful for long-term maintenance because it exposes the boundaries
|
|
72
|
+
between the local wizard, OAuth credential flow, SSH verification, sidecar
|
|
73
|
+
deployment, and n8n recipes. It is an optional maintainer tool, not a runtime
|
|
74
|
+
dependency:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
graphify .
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Keep the generated `graphify-out/` directory local. It is intentionally ignored
|
|
81
|
+
by Git and excluded from the npm package because raw graphs can reveal internal
|
|
82
|
+
file relationships, local paths, and unfinished implementation details. Put
|
|
83
|
+
only reviewed, redacted diagrams or plain-language architecture notes in the
|
|
84
|
+
public repository. Never include credentials, setup URLs, VPS addresses, or
|
|
85
|
+
private screenshots in a graph export.
|
|
86
|
+
|
|
87
|
+
## Updating the pinned bridge version
|
|
88
|
+
|
|
89
|
+
Do not change `openai-oauth@2.0.0` casually. An upgrade requires:
|
|
90
|
+
|
|
91
|
+
1. Read the upstream changelog and legal notes.
|
|
92
|
+
2. Inspect the package tarball and install scripts.
|
|
93
|
+
3. Update both the local login command and generated Dockerfile pin.
|
|
94
|
+
4. Run all tests and the fake-data browser flow.
|
|
95
|
+
5. Build the sidecar on a disposable VPS first.
|
|
96
|
+
6. Verify `/health`, `/v1/models`, `/v1/responses`, streaming, and tool calls.
|
|
97
|
+
7. Verify `docker compose port openai-oauth 10531` still returns no mapping.
|
|
98
|
+
8. Confirm n8n was not restarted.
|
|
99
|
+
|
|
100
|
+
Keep the old Docker image until the new one passes.
|
|
101
|
+
|
|
102
|
+
## If n8n is upgraded
|
|
103
|
+
|
|
104
|
+
This project does not alter the n8n image. A normal n8n image update can still
|
|
105
|
+
change node behavior or Docker networks.
|
|
106
|
+
|
|
107
|
+
After an n8n upgrade:
|
|
108
|
+
|
|
109
|
+
1. Confirm n8n is healthy.
|
|
110
|
+
2. Confirm its network name still matches the sidecar network.
|
|
111
|
+
3. Retry the OpenAI credential.
|
|
112
|
+
4. Verify one simple OpenAI Chat Model prompt.
|
|
113
|
+
|
|
114
|
+
If the network name changed, rerun the wizard and select the new shared
|
|
115
|
+
network. Do not edit or rebuild n8n merely to repair the sidecar.
|
|
116
|
+
|
|
117
|
+
## Roll back or disable the bridge
|
|
118
|
+
|
|
119
|
+
Stop and remove only the sidecar container:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
docker compose \
|
|
123
|
+
--project-name n8n-openai-oauth \
|
|
124
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
125
|
+
down
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The files and OAuth credential remain available for recovery. n8n remains
|
|
129
|
+
running.
|
|
130
|
+
|
|
131
|
+
In n8n, disable workflows that depend on the bridge or replace their OpenAI
|
|
132
|
+
credential.
|
|
133
|
+
|
|
134
|
+
## Recoverable uninstall
|
|
135
|
+
|
|
136
|
+
First run the sidecar-only `down` command above. Then move the project directory
|
|
137
|
+
to a dated backup:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
mv /docker/n8n-openai-oauth \
|
|
141
|
+
"/docker/n8n-openai-oauth.disabled-$(date +%Y%m%d-%H%M%S)"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
This is recoverable: move the directory back if needed. After confirming the
|
|
145
|
+
backup is no longer required, remove it through your normal VPS backup and
|
|
146
|
+
retention process.
|
|
147
|
+
|
|
148
|
+
Finally, delete the unused n8n credential through the n8n interface. Never
|
|
149
|
+
delete or recreate the n8n container as part of this uninstall.
|
|
150
|
+
|
|
151
|
+
## Future official n8n support
|
|
152
|
+
|
|
153
|
+
As of July 28, 2026, an
|
|
154
|
+
[open n8n pull request](https://github.com/n8n-io/n8n/pull/29184) proposes
|
|
155
|
+
native OpenAI Account authentication for the OpenAI Chat Model. It is not yet
|
|
156
|
+
merged. If n8n later ships and documents an official equivalent, prefer the
|
|
157
|
+
official built-in route and retire this sidecar after testing migration.
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# Beginner manual installation
|
|
2
|
+
|
|
3
|
+
Use this guide if the browser wizard cannot be used, or if you need to
|
|
4
|
+
reproduce, debug, or improve the underlying installation method. The wizard is
|
|
5
|
+
safer for routine installation because it validates names, confirms the host
|
|
6
|
+
fingerprint, uploads files with SFTP, and limits the commands it can run.
|
|
7
|
+
|
|
8
|
+
This guide never changes the existing n8n Compose file or image. It creates a
|
|
9
|
+
second Compose project.
|
|
10
|
+
|
|
11
|
+
## Before starting
|
|
12
|
+
|
|
13
|
+
The commands in this fallback use a POSIX shell. You need:
|
|
14
|
+
|
|
15
|
+
- a local macOS or Linux computer with Node.js 22 or newer, or Windows with
|
|
16
|
+
WSL/Git Bash and Node.js 22 or newer;
|
|
17
|
+
- your VPS IP address;
|
|
18
|
+
- the VPS root password;
|
|
19
|
+
- the name of the running n8n container;
|
|
20
|
+
- an existing Docker network shared by n8n and the reverse proxy, commonly
|
|
21
|
+
named `proxy`.
|
|
22
|
+
|
|
23
|
+
Before connecting to the VPS, export or otherwise back up every n8n workflow.
|
|
24
|
+
The commands below are intentionally limited to the separate
|
|
25
|
+
`n8n-openai-oauth` project and contain no n8n deletion, restart, or rebuild
|
|
26
|
+
command, but they still authenticate to your VPS and write files. Keep a
|
|
27
|
+
recoverable backup before proceeding.
|
|
28
|
+
|
|
29
|
+
Replace every example such as `YOUR_VPS_IP` and `n8n-n8n-1` with the value
|
|
30
|
+
shown on your own VPS. Never type the asterisks used to hide an IP in a
|
|
31
|
+
screenshot.
|
|
32
|
+
|
|
33
|
+
## Part 1: sign in on your own computer
|
|
34
|
+
|
|
35
|
+
Open Terminal on your computer, not the Hostinger web terminal:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
install -d -m 0700 "$HOME/.n8n-openai-oauth"
|
|
39
|
+
npx --yes --ignore-scripts openai-oauth@2.0.0 login \
|
|
40
|
+
--open \
|
|
41
|
+
--login-timeout-ms 300000 \
|
|
42
|
+
--oauth-file "$HOME/.n8n-openai-oauth/auth.json"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Complete the newly opened sign-in page within five minutes. An old sign-in tab
|
|
46
|
+
can expire; always use the page opened by the newest command.
|
|
47
|
+
|
|
48
|
+
Confirm that the local file exists:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
test -s "$HOME/.n8n-openai-oauth/auth.json" \
|
|
52
|
+
&& echo "OAuth file is ready"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
This dedicated path avoids reusing or overwriting the Codex app credential at
|
|
56
|
+
`~/.codex/auth.json`. Do not print either file or paste its contents into
|
|
57
|
+
chat.
|
|
58
|
+
|
|
59
|
+
## Part 2: inspect n8n on the VPS
|
|
60
|
+
|
|
61
|
+
Connect from your computer:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
ssh root@YOUR_VPS_IP
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The first connection asks whether you trust the SSH fingerprint. Compare the
|
|
68
|
+
address carefully, type `yes`, and press Return. When SSH asks for a password,
|
|
69
|
+
nothing appears while you type; that is normal.
|
|
70
|
+
|
|
71
|
+
List the running containers:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}'
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Find the row whose image is `docker.n8n.io/n8nio/n8n`. Copy its container name,
|
|
78
|
+
then inspect its networks:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
docker inspect n8n-n8n-1 --format '{{range $name, $_ := .NetworkSettings.Networks}}{{println $name}}{{end}}'
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
An output such as `proxy` is not “nothing”; it is the network name.
|
|
85
|
+
|
|
86
|
+
## Part 3: create the separate sidecar project
|
|
87
|
+
|
|
88
|
+
Still in the VPS terminal:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
install -d -m 0755 /docker/n8n-openai-oauth
|
|
92
|
+
install -d -m 0700 -o 1000 -g 1000 /docker/n8n-openai-oauth/auth
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Create `/docker/n8n-openai-oauth/Dockerfile` with exactly:
|
|
96
|
+
|
|
97
|
+
```dockerfile
|
|
98
|
+
FROM node:22-bookworm-slim
|
|
99
|
+
|
|
100
|
+
RUN npm install --global --ignore-scripts openai-oauth@2.0.0 \
|
|
101
|
+
&& npm cache clean --force
|
|
102
|
+
|
|
103
|
+
USER node
|
|
104
|
+
|
|
105
|
+
ENTRYPOINT ["openai-oauth"]
|
|
106
|
+
CMD ["--host", "0.0.0.0", "--port", "10531", "--oauth-file", "/home/node/.codex/auth.json"]
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The `CMD` must stay on one line. If the JSON array is split incorrectly,
|
|
110
|
+
Docker reports `unknown instruction: "--host"`.
|
|
111
|
+
|
|
112
|
+
Create `/docker/n8n-openai-oauth/docker-compose.yml` with exactly the following.
|
|
113
|
+
If your network is not named `proxy`, change only the final `name: proxy` line.
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
services:
|
|
117
|
+
openai-oauth:
|
|
118
|
+
build:
|
|
119
|
+
context: .
|
|
120
|
+
dockerfile: Dockerfile
|
|
121
|
+
restart: unless-stopped
|
|
122
|
+
init: true
|
|
123
|
+
volumes:
|
|
124
|
+
- ./auth:/home/node/.codex
|
|
125
|
+
expose:
|
|
126
|
+
- "10531"
|
|
127
|
+
networks:
|
|
128
|
+
n8n-shared:
|
|
129
|
+
aliases:
|
|
130
|
+
- n8n-openai-oauth
|
|
131
|
+
security_opt:
|
|
132
|
+
- no-new-privileges:true
|
|
133
|
+
cap_drop:
|
|
134
|
+
- ALL
|
|
135
|
+
read_only: true
|
|
136
|
+
tmpfs:
|
|
137
|
+
- /tmp:size=16m,mode=1777
|
|
138
|
+
- /home/node/.local:uid=1000,gid=1000,mode=0700
|
|
139
|
+
pids_limit: 128
|
|
140
|
+
mem_limit: 512m
|
|
141
|
+
cpus: 1.0
|
|
142
|
+
healthcheck:
|
|
143
|
+
test:
|
|
144
|
+
- CMD
|
|
145
|
+
- node
|
|
146
|
+
- -e
|
|
147
|
+
- 'fetch("http://127.0.0.1:10531/health").then((response) => process.exit(response.ok ? 0 : 1)).catch(() => process.exit(1))'
|
|
148
|
+
interval: 30s
|
|
149
|
+
timeout: 5s
|
|
150
|
+
retries: 3
|
|
151
|
+
start_period: 20s
|
|
152
|
+
labels:
|
|
153
|
+
io.n8n-openai-oauth.managed: "true"
|
|
154
|
+
|
|
155
|
+
networks:
|
|
156
|
+
n8n-shared:
|
|
157
|
+
external: true
|
|
158
|
+
name: proxy
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
There is deliberately no `ports:` section and no Traefik label.
|
|
162
|
+
|
|
163
|
+
## Part 4: copy the OAuth file
|
|
164
|
+
|
|
165
|
+
Leave the SSH session:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
exit
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Back in the Terminal on your own computer:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
scp "$HOME/.n8n-openai-oauth/auth.json" \
|
|
175
|
+
root@YOUR_VPS_IP:/docker/n8n-openai-oauth/auth/auth.json
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Do not include `**` around the IP. In zsh, asterisks are wildcard characters
|
|
179
|
+
and cause `no matches found`.
|
|
180
|
+
|
|
181
|
+
Return to the VPS:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
ssh root@YOUR_VPS_IP
|
|
185
|
+
chown 1000:1000 /docker/n8n-openai-oauth/auth/auth.json
|
|
186
|
+
chmod 600 /docker/n8n-openai-oauth/auth/auth.json
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Run `chown` on the VPS, not on your computer.
|
|
190
|
+
|
|
191
|
+
## Part 5: validate and start only the sidecar
|
|
192
|
+
|
|
193
|
+
Use the explicit project name and file on every command:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
docker compose \
|
|
197
|
+
--project-name n8n-openai-oauth \
|
|
198
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
199
|
+
config --quiet
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Build only `openai-oauth`:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
docker compose \
|
|
206
|
+
--project-name n8n-openai-oauth \
|
|
207
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
208
|
+
build openai-oauth
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Start only `openai-oauth`, with no dependencies:
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
docker compose \
|
|
215
|
+
--project-name n8n-openai-oauth \
|
|
216
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
217
|
+
up -d --wait --wait-timeout 60 --no-deps openai-oauth
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
None of these commands reference the n8n Compose file or service.
|
|
221
|
+
|
|
222
|
+
## Part 6: verify
|
|
223
|
+
|
|
224
|
+
Check the final logs:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
docker compose \
|
|
228
|
+
--project-name n8n-openai-oauth \
|
|
229
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
230
|
+
logs --tail=50 openai-oauth
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The successful lines include:
|
|
234
|
+
|
|
235
|
+
```text
|
|
236
|
+
OpenAI-compatible endpoint ready at http://0.0.0.0:10531/v1
|
|
237
|
+
Available Models: ...
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
The warning about `--host 0.0.0.0` is expected inside the container. The
|
|
241
|
+
Compose file does not publish the port to the VPS.
|
|
242
|
+
|
|
243
|
+
Prove that no host port is published:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
docker compose \
|
|
247
|
+
--project-name n8n-openai-oauth \
|
|
248
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
249
|
+
port openai-oauth 10531
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Success is no output.
|
|
253
|
+
|
|
254
|
+
Check the models from inside the sidecar:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
docker compose \
|
|
258
|
+
--project-name n8n-openai-oauth \
|
|
259
|
+
--file /docker/n8n-openai-oauth/docker-compose.yml \
|
|
260
|
+
exec -T openai-oauth \
|
|
261
|
+
node -e 'fetch("http://127.0.0.1:10531/v1/models").then(async (response) => { console.log(await response.text()); process.exit(response.ok ? 0 : 1); }).catch(() => process.exit(1))'
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## Part 7: configure n8n
|
|
265
|
+
|
|
266
|
+
In the n8n OpenAI credential:
|
|
267
|
+
|
|
268
|
+
```text
|
|
269
|
+
API Key: local-only
|
|
270
|
+
Organization ID: leave empty
|
|
271
|
+
Base URL: http://n8n-openai-oauth:10531/v1
|
|
272
|
+
Add Custom Header: off
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Do not use `http://127.0.0.1:10531/v1` in n8n. Inside the n8n container,
|
|
276
|
+
`127.0.0.1` means n8n itself. The private Docker hostname is
|
|
277
|
+
`n8n-openai-oauth`.
|
|
278
|
+
|
|
279
|
+
In OpenAI Chat Model node version 1.3, keep **Use Responses API** on. If the
|
|
280
|
+
switch is absent, keep the earlier node version's default Chat Completions
|
|
281
|
+
behavior. Choose a model from the verified list and test a simple prompt before
|
|
282
|
+
adding tools.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# Configure n8n nodes
|
|
2
|
+
|
|
3
|
+
Use this page after the wizard reaches **The private bridge is ready**. Each
|
|
4
|
+
value is in its own code block so it can be copied separately.
|
|
5
|
+
|
|
6
|
+
## 1. Create the OpenAI credential
|
|
7
|
+
|
|
8
|
+
In n8n, create or edit an **OpenAI** credential.
|
|
9
|
+
|
|
10
|
+
### API Key
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
local-only
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
This is a required n8n placeholder, not an OpenAI Platform API key or secret.
|
|
17
|
+
|
|
18
|
+
### Base URL
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
http://n8n-openai-oauth:10531/v1
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Organization ID
|
|
25
|
+
|
|
26
|
+
Leave this field empty.
|
|
27
|
+
|
|
28
|
+
### Add Custom Header
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
Off
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Save and test the credential. If n8n cannot reach it, confirm that n8n and the
|
|
35
|
+
sidecar share a Docker network and that the Base URL uses the private
|
|
36
|
+
`n8n-openai-oauth` hostname rather than `127.0.0.1`.
|
|
37
|
+
|
|
38
|
+
## 2. OpenAI Chat Model for an AI Agent or Basic LLM Chain
|
|
39
|
+
|
|
40
|
+
Use the same **OpenAI Chat Model** sub-node for either parent node.
|
|
41
|
+
|
|
42
|
+
1. Add an **AI Agent** or **Basic LLM Chain** node.
|
|
43
|
+
2. Add an **OpenAI Chat Model** to its **Chat Model** or **Model** connector.
|
|
44
|
+
3. Select the OpenAI credential created above.
|
|
45
|
+
4. In **Model**, select one of the model IDs detected by the wizard.
|
|
46
|
+
5. On OpenAI Chat Model node version 1.3, turn **Use Responses API** on.
|
|
47
|
+
6. Begin with no built-in tools and a simple test prompt.
|
|
48
|
+
|
|
49
|
+
If **Use Responses API** is absent, the workflow is using an earlier Chat
|
|
50
|
+
Model node version. Keep its default Chat Completions behavior; the bridge also
|
|
51
|
+
supports:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
/v1/chat/completions
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Do not copy a model name from the README screenshot. Paste or select one from
|
|
58
|
+
the current wizard result:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
PASTE_ONE_MODEL_ID_FROM_THE_WIZARD
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### AI Agent test
|
|
65
|
+
|
|
66
|
+
For an AI Agent connected to a Chat Trigger, a common prompt expression is:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
{{ $json.chatInput }}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Or use this fixed prompt for the first connection test:
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
Reply with exactly: bridge works
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Connect the OpenAI Chat Model to the AI Agent's model input, run the workflow,
|
|
79
|
+
and confirm the response before attaching tools or memory.
|
|
80
|
+
|
|
81
|
+
### Basic LLM Chain test
|
|
82
|
+
|
|
83
|
+
Use this fixed **Prompt** first:
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
Reply with exactly: bridge works
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
For data supplied by an earlier node, a simple expression is:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
{{ $json.prompt }}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Connect the OpenAI Chat Model to the Basic LLM Chain's model input and execute
|
|
96
|
+
the chain.
|
|
97
|
+
|
|
98
|
+
## 3. HTTP Request node
|
|
99
|
+
|
|
100
|
+
The HTTP Request recipe calls the bridge directly and does not need the n8n
|
|
101
|
+
OpenAI credential.
|
|
102
|
+
|
|
103
|
+
### Copy-paste fields
|
|
104
|
+
|
|
105
|
+
Method:
|
|
106
|
+
|
|
107
|
+
```text
|
|
108
|
+
POST
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
URL:
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
http://n8n-openai-oauth:10531/v1/responses
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Authentication:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
None
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Header 1 name:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
Authorization
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Header 1 value:
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
Bearer local-only
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Header 2 name:
|
|
136
|
+
|
|
137
|
+
```text
|
|
138
|
+
Content-Type
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Header 2 value:
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
application/json
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
JSON body:
|
|
148
|
+
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"model": "PASTE_ONE_MODEL_ID_FROM_THE_WIZARD",
|
|
152
|
+
"input": "Reply with exactly: bridge works"
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Enable **Send Headers** and **Send Body**, select a JSON body, and paste the
|
|
157
|
+
object above.
|
|
158
|
+
|
|
159
|
+
### Importable cURL version
|
|
160
|
+
|
|
161
|
+
The n8n HTTP Request node can import a cURL command. Replace only the model
|
|
162
|
+
placeholder:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
curl --request POST \
|
|
166
|
+
--url http://n8n-openai-oauth:10531/v1/responses \
|
|
167
|
+
--header 'Authorization: Bearer local-only' \
|
|
168
|
+
--header 'Content-Type: application/json' \
|
|
169
|
+
--data '{
|
|
170
|
+
"model": "PASTE_ONE_MODEL_ID_FROM_THE_WIZARD",
|
|
171
|
+
"input": "Reply with exactly: bridge works"
|
|
172
|
+
}'
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The placeholder header is included because it matches OpenAI-compatible
|
|
176
|
+
client behavior. It is not a real API credential.
|
|
177
|
+
|
|
178
|
+
### Expression-driven HTTP body
|
|
179
|
+
|
|
180
|
+
After the fixed test succeeds, switch the entire JSON body field to
|
|
181
|
+
**Expression** mode and paste:
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
={{ {
|
|
185
|
+
model: "PASTE_ONE_MODEL_ID_FROM_THE_WIZARD",
|
|
186
|
+
input: $json.prompt
|
|
187
|
+
} }}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
This reads the `prompt` property from the item produced by the previous node.
|
|
191
|
+
|
|
192
|
+
## Related official n8n documentation
|
|
193
|
+
|
|
194
|
+
- [OpenAI credentials](https://docs.n8n.io/integrations/builtin/credentials/openai/)
|
|
195
|
+
- [OpenAI Chat Model](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenai/)
|
|
196
|
+
- [OpenAI Chat Model source](https://github.com/n8n-io/n8n/blob/master/packages/%40n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts)
|
|
197
|
+
- [AI Agent](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/)
|
|
198
|
+
- [Basic LLM Chain](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm/)
|
|
199
|
+
- [HTTP Request](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)
|