Skip to content

Commit c0aef13

Browse files
authored
copilot (#27)
* copilot * 根据社区建议修改:1.精简注释,更改注释为中文。2.减少挂载数目,核心代码放在app下3.修改develop/docker-compose.dev.ymlip限制4.排除不必要文件5.解决newline at the end of file等 * 根据社区建议修改:1.精简注释,更改注释为中文。2.减少挂载数目,核心代码放在app下3.修改develop/docker-compose.dev.ymlip限制4.排除不必要文件5.解决newline at the end of file等 * 补充修改换行 * 部分优化 * 部分优化 * Delete services/web/.dockerignore * Add .dockerignore to web service * 部分优化 * 优化 * 优化settings使用 * 优化 * runit * llm-toolbar.tsx style调整 * model choose * apply 1.patch * delete 1.patch
1 parent d61513f commit c0aef13

37 files changed

+5669
-9
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33

44
# user defined files
55
.env
6-
docker-compose.override.yml
6+
docker-compose.override.yml

develop/dev.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ GRACEFUL_SHUTDOWN_DELAY_SECONDS=0
88
HISTORY_V1_HOST=history-v1
99
LISTEN_ADDRESS=0.0.0.0
1010
MONGO_HOST=mongo
11+
LLM_HOST=llm
1112
MONGO_URL=mongodb://mongo/sharelatex?directConnection=true
1213
NOTIFICATIONS_HOST=notifications
1314
PROJECT_HISTORY_HOST=project-history
1415
REALTIME_HOST=real-time
1516
REDIS_HOST=redis
17+
REDIS_URL=redis://redis:6379
1618
SPELLING_HOST=spelling
1719
WEBPACK_HOST=webpack
1820
WEB_API_PASSWORD=overleaf

develop/docker-compose.dev.yml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ services:
8484
environment:
8585
- NODE_OPTIONS=--inspect=0.0.0.0:9229
8686
ports:
87-
- "127.0.0.1:9236:9229"
87+
- "127.0.0.1:9238:9229"
8888
volumes:
8989
- ../services/references/app:/overleaf/services/references/app
9090
- ../services/references/config:/overleaf/services/references/config
@@ -123,8 +123,20 @@ services:
123123
- ../services/real-time/app.js:/overleaf/services/real-time/app.js
124124
- ../services/real-time/config:/overleaf/services/real-time/config
125125

126+
llm:
127+
command: ["node", "--watch", "app.js"]
128+
environment:
129+
- NODE_OPTIONS=--inspect=0.0.0.0:9229
130+
ports:
131+
- "127.0.0.1:9241:9229"
132+
volumes:
133+
- ../services/llm/app:/overleaf/app
134+
- ../services/llm/app.js:/overleaf/services/llm/app.js
135+
- ../services/llm/config:/overleaf/services/llm/config
136+
137+
126138
web:
127-
command: ["node", "--watch", "app.js", "--watch-locales"]
139+
command: ["node", "--watch", "app.mjs", "--watch-locales"]
128140
environment:
129141
- NODE_OPTIONS=--inspect=0.0.0.0:9229
130142
ports:

develop/docker-compose.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ services:
123123
dockerfile: services/real-time/Dockerfile
124124
env_file:
125125
- dev.env
126+
environment:
127+
- SESSION_SECRET=helloworld
126128

127129
redis:
128130
image: redis:5
@@ -140,6 +142,16 @@ services:
140142
volumes:
141143
- spelling-cache:/overleaf/services/spelling/cache
142144

145+
llm:
146+
build:
147+
context: ..
148+
dockerfile: services/llm/Dockerfile
149+
env_file:
150+
- dev.env
151+
depends_on:
152+
- mongo
153+
- redis
154+
143155
web:
144156
build:
145157
context: ..
@@ -153,7 +165,8 @@ services:
153165
- EMAIL_CONFIRMATION_DISABLED=true
154166
- NODE_ENV=development
155167
- OVERLEAF_ALLOW_PUBLIC_ACCESS=true
156-
command: ["node", "app.js"]
168+
- SESSION_SECRET=helloworld
169+
command: ["node", "app.mjs"]
157170
volumes:
158171
- sharelatex-data:/var/lib/overleaf
159172
- web-data:/overleaf/services/web/data
@@ -172,8 +185,10 @@ services:
172185
- project-history
173186
- real-time
174187
- spelling
188+
- llm
175189

176190
webpack:
191+
user: root
177192
build:
178193
context: ..
179194
dockerfile: services/web/Dockerfile

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,4 @@ services:
153153
# - "443:443"
154154
# volumes:
155155
# - /var/run/docker.sock:/tmp/docker.sock:ro
156-
# - /home/overleaf/tmp:/etc/nginx/certs
156+
# - /home/overleaf/tmp:/etc/nginx/certs

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
"services/history-v1",
6060
"services/idp",
6161
"services/latexqc",
62+
"services/llm",
6263
"services/notifications",
6364
"services/project-history",
6465
"services/real-time",

server-ce/runit/llm-overleaf/run

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/bin/bash
2+
3+
NODE_PARAMS=""
4+
if [ "$DEBUG_NODE" == "true" ]; then
5+
echo "running debug - llm"
6+
NODE_PARAMS="--inspect=0.0.0.0:30120"
7+
fi
8+
9+
if [ -z "$REDIS_URL" ] && [ -n "$REDIS_HOST" ]; then
10+
export REDIS_URL="redis://$REDIS_HOST:${REDIS_PORT:-6379}"
11+
fi
12+
if [ -z "$MONGO_URL" ] && [ -n "$OVERLEAF_MONGO_URL" ]; then
13+
export MONGO_URL="$OVERLEAF_MONGO_URL"
14+
fi
15+
16+
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/llm/app.js >> /var/log/overleaf/llm.log 2>&1

services/llm/Dockerfile

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
FROM node:20.19.5 AS base
2+
3+
WORKDIR /overleaf/services/llm
4+
5+
6+
FROM base AS app
7+
8+
COPY package.json package-lock.json /overleaf/
9+
COPY services/llm/package.json /overleaf/services/llm/
10+
COPY libraries/ /overleaf/libraries/
11+
COPY patches/ /overleaf/patches/
12+
13+
14+
RUN cd /overleaf && npm install
15+
16+
COPY services/llm/ /overleaf/services/llm/
17+
18+
FROM app
19+
USER node
20+
CMD ["node", "--expose-gc", "app.js"]
21+
22+

services/llm/app.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// src/app.js
2+
import express from 'express';
3+
import connectDB from './config/db.js';
4+
import keysRoutes from './app/routes/keys.routes.js';
5+
import llmRoutes from './app/routes/llm.routes.js';
6+
import cookieParser from 'cookie-parser';
7+
import settings from '@overleaf/settings'
8+
9+
const app = express();
10+
11+
app.use(cookieParser());
12+
13+
app.use(express.json());
14+
15+
// connect to database
16+
await connectDB();
17+
18+
// register routes
19+
app.use('/api/v1/llm', keysRoutes);
20+
21+
app.use('/api/v1/llm', llmRoutes);
22+
23+
app.listen(settings.PORT, settings.LISTEN_ADDRESS, () => {
24+
console.log(`server running on ${settings.PORT}`);
25+
});
26+
27+
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { KeysService } from '../services/keys.service.js';
2+
import {getUserIdentifier} from '../utils/common.js';
3+
export class KeysController {
4+
constructor() {
5+
this.keysService = new KeysService();
6+
}
7+
8+
async saveKey(req, res) {
9+
try {
10+
const sid = req.cookies['overleaf.sid'];
11+
const userIdentifier = await getUserIdentifier(sid);
12+
const { name, baseUrl, apiKey } = req.body;
13+
await this.keysService.saveApiKey(userIdentifier, name, baseUrl, apiKey);
14+
res.status(200).json({ success: true });
15+
} catch (error) {
16+
res.status(400).json({ success: false, data: error.message });
17+
}
18+
}
19+
20+
async deleteKey(req, res) {
21+
try {
22+
const sid = req.cookies['overleaf.sid'];
23+
const userIdentifier = await getUserIdentifier(sid);
24+
const { name } = req.body;
25+
const result = await this.keysService.deleteApiKey(userIdentifier, name);
26+
res.status(200).json({ success: true, data: result });
27+
} catch (error) {
28+
console.log(error.message)
29+
res.status(400).json({ success: false, data: error.message });
30+
}
31+
}
32+
33+
async getLlmInfo(req, res) {
34+
35+
try {
36+
const sid = req.cookies['overleaf.sid'];
37+
const userIdentifier = await getUserIdentifier(sid);
38+
const result = await this.keysService.getLlmInfo(userIdentifier);
39+
res.status(200).json({ success: true, data: result });
40+
} catch (error) {
41+
res.status(400).json({ success: false, data: error.message });
42+
}
43+
}
44+
async getUsingLlm(req, res) {
45+
try {
46+
const sid = req.cookies['overleaf.sid'];
47+
const userIdentifier = await getUserIdentifier(sid);
48+
const result = await this.keysService.getUsingLlm(userIdentifier);
49+
res.status(200).json({ success: true, data: result });
50+
} catch (error) {
51+
res.status(400).json({ success: false, data: error.message });
52+
}
53+
}
54+
55+
56+
async updateUsingLlm(req, res) {
57+
try {
58+
const sid = req.cookies['overleaf.sid'];
59+
const userIdentifier = await getUserIdentifier(sid);
60+
const { usingLlm } = req.body;
61+
await this.keysService.updateUsingLlm(userIdentifier, usingLlm);
62+
res.status(200).json({ success: true });
63+
} catch (error) {
64+
res.status(400).json({ success: false, data: error.message });
65+
}
66+
}
67+
async updateUsingModel(req, res) {
68+
try {
69+
const sid = req.cookies['overleaf.sid'];
70+
const userIdentifier = await getUserIdentifier(sid);
71+
const { name, chatOrCompletion, newModel } = req.body;
72+
await this.keysService.updateUsingModel(userIdentifier, name, chatOrCompletion, newModel);
73+
res.status(200).json({ success: true });
74+
} catch (error) {
75+
res.status(400).json({ success: false, data: error.message });
76+
}
77+
}
78+
}
79+
80+

0 commit comments

Comments
 (0)