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.
Files changed (39) hide show
  1. package/CHANGELOG.md +190 -0
  2. package/LICENSE +21 -0
  3. package/README.md +122 -0
  4. package/SPEC.md +140 -0
  5. package/docs/architecture.md +127 -0
  6. package/docs/brand.md +43 -0
  7. package/docs/images/brand/relmio-concept-source.png +0 -0
  8. package/docs/images/brand/relmio-mark.svg +16 -0
  9. package/docs/images/setup/01-local-sign-in-ready.png +0 -0
  10. package/docs/images/setup/02-vps-identity-confirmed.png +0 -0
  11. package/docs/images/setup/03-n8n-detected.png +0 -0
  12. package/docs/images/setup/04-install-plan.png +0 -0
  13. package/docs/images/setup/05-bridge-ready.png +0 -0
  14. package/docs/maintenance.md +157 -0
  15. package/docs/manual-install.md +282 -0
  16. package/docs/n8n-configuration.md +199 -0
  17. package/docs/npm-publish.md +285 -0
  18. package/docs/roadmap.md +109 -0
  19. package/docs/security.md +105 -0
  20. package/docs/troubleshooting.md +193 -0
  21. package/docs/video-outline.md +152 -0
  22. package/package.json +45 -0
  23. package/scripts/build-npm-package.js +112 -0
  24. package/scripts/check-release-metadata.js +100 -0
  25. package/scripts/check-syntax.js +59 -0
  26. package/scripts/preview.js +69 -0
  27. package/src/cli.js +57 -0
  28. package/src/domain/safety.js +59 -0
  29. package/src/domain/templates.js +65 -0
  30. package/src/domain/validation.js +76 -0
  31. package/src/infrastructure/ssh.js +268 -0
  32. package/src/services/discovery.js +96 -0
  33. package/src/services/installer.js +239 -0
  34. package/src/services/oauth.js +351 -0
  35. package/src/ui/app.js +526 -0
  36. package/src/ui/index.html +440 -0
  37. package/src/ui/styles.css +645 -0
  38. package/src/ui/time.js +15 -0
  39. 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/)