:boom: [Fix] Incorrect httpProxyDict config in axios, and missing endpoint param for fill_avaialable_models_select
Browse files- networks/llm_requester.js +1 -1
- server.js +14 -6
- storages/endpoint_storage.js +37 -24
networks/llm_requester.js
CHANGED
@@ -133,7 +133,7 @@ export class AvailableModelsRequester {
|
|
133 |
signal: this.controller.signal,
|
134 |
};
|
135 |
}
|
136 |
-
get() {
|
137 |
this.construct_request_params();
|
138 |
return fetch(this.backend_request_endpoint, this.backend_request_params)
|
139 |
.then((response) => response.json())
|
|
|
133 |
signal: this.controller.signal,
|
134 |
};
|
135 |
}
|
136 |
+
async get() {
|
137 |
this.construct_request_params();
|
138 |
return fetch(this.backend_request_endpoint, this.backend_request_params)
|
139 |
.then((response) => response.json())
|
server.js
CHANGED
@@ -66,6 +66,8 @@ const loadHttpProxy = async () => {
|
|
66 |
host: url.hostname,
|
67 |
port: parseInt(url.port),
|
68 |
};
|
|
|
|
|
69 |
}
|
70 |
} catch (error) {
|
71 |
console.warn(
|
@@ -84,12 +86,15 @@ app.post("/models", async (req, res) => {
|
|
84 |
openai_request_headers,
|
85 |
} = req.body;
|
86 |
|
87 |
-
|
88 |
method: openai_request_method,
|
89 |
url: openai_endpoint + "/v1/models",
|
90 |
headers: openai_request_headers,
|
91 |
-
|
92 |
-
|
|
|
|
|
|
|
93 |
res.json(response.data);
|
94 |
} catch (error) {
|
95 |
console.error(error);
|
@@ -106,14 +111,17 @@ app.post("/chat/completions", async (req, res) => {
|
|
106 |
openai_request_body,
|
107 |
} = req.body;
|
108 |
|
109 |
-
|
110 |
method: openai_request_method,
|
111 |
url: openai_endpoint + "/v1/chat/completions",
|
112 |
data: openai_request_body,
|
113 |
headers: openai_request_headers,
|
114 |
responseType: "stream",
|
115 |
-
|
116 |
-
|
|
|
|
|
|
|
117 |
response.data.pipe(res);
|
118 |
} catch (error) {
|
119 |
console.error(error);
|
|
|
66 |
host: url.hostname,
|
67 |
port: parseInt(url.port),
|
68 |
};
|
69 |
+
} else {
|
70 |
+
console.warn("http_proxy not found in secrets");
|
71 |
}
|
72 |
} catch (error) {
|
73 |
console.warn(
|
|
|
86 |
openai_request_headers,
|
87 |
} = req.body;
|
88 |
|
89 |
+
let axios_config = {
|
90 |
method: openai_request_method,
|
91 |
url: openai_endpoint + "/v1/models",
|
92 |
headers: openai_request_headers,
|
93 |
+
};
|
94 |
+
if (httpProxyDict) {
|
95 |
+
axios_config.proxy = httpProxyDict;
|
96 |
+
}
|
97 |
+
const response = await axios(axios_config);
|
98 |
res.json(response.data);
|
99 |
} catch (error) {
|
100 |
console.error(error);
|
|
|
111 |
openai_request_body,
|
112 |
} = req.body;
|
113 |
|
114 |
+
let axios_config = {
|
115 |
method: openai_request_method,
|
116 |
url: openai_endpoint + "/v1/chat/completions",
|
117 |
data: openai_request_body,
|
118 |
headers: openai_request_headers,
|
119 |
responseType: "stream",
|
120 |
+
};
|
121 |
+
if (httpProxyDict) {
|
122 |
+
axios_config.proxy = httpProxyDict;
|
123 |
+
}
|
124 |
+
const response = await axios(axios_config);
|
125 |
response.data.pipe(res);
|
126 |
} catch (error) {
|
127 |
console.error(error);
|
storages/endpoint_storage.js
CHANGED
@@ -161,14 +161,15 @@ class EndpointStorage {
|
|
161 |
}
|
162 |
});
|
163 |
}
|
164 |
-
fetch_available_models(endpoint) {
|
165 |
console.log("fetch available models for endpoint:", endpoint);
|
166 |
-
// if endpoint not starts with http(s), skip
|
167 |
-
//
|
168 |
if (endpoint.startsWith("http")) {
|
169 |
let available_models_requester = new AvailableModelsRequester(
|
170 |
endpoint
|
171 |
);
|
|
|
172 |
// update available_models field of endpoint index in db.endpoints
|
173 |
return available_models_requester.get().then((available_models) => {
|
174 |
this.db.endpoints.update(endpoint, {
|
@@ -177,35 +178,47 @@ class EndpointStorage {
|
|
177 |
return available_models;
|
178 |
});
|
179 |
} else {
|
|
|
180 |
return Promise.resolve([]);
|
181 |
}
|
182 |
}
|
183 |
-
fill_available_models_select() {
|
184 |
// fetch available_models for all endpoints, and then fill available_models_select
|
185 |
let available_models_select = $("#available-models-select");
|
186 |
available_models_select.empty();
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
let option = new Option(
|
198 |
-
model_name_and_value[0],
|
199 |
-
model_name_and_value[1]
|
200 |
);
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
208 |
});
|
|
|
|
|
|
|
|
|
209 |
});
|
210 |
}
|
211 |
construct_model_name_and_value(endpoint, model_id) {
|
|
|
161 |
}
|
162 |
});
|
163 |
}
|
164 |
+
async fetch_available_models(endpoint) {
|
165 |
console.log("fetch available models for endpoint:", endpoint);
|
166 |
+
// if endpoint not starts with http(s), skip,
|
167 |
+
// such as "user-customized", which is might be local functions or agents
|
168 |
if (endpoint.startsWith("http")) {
|
169 |
let available_models_requester = new AvailableModelsRequester(
|
170 |
endpoint
|
171 |
);
|
172 |
+
console.log(`try to fetch available_models from ${endpoint}`);
|
173 |
// update available_models field of endpoint index in db.endpoints
|
174 |
return available_models_requester.get().then((available_models) => {
|
175 |
this.db.endpoints.update(endpoint, {
|
|
|
178 |
return available_models;
|
179 |
});
|
180 |
} else {
|
181 |
+
console.log("skip fetch available models for endpoint:", endpoint);
|
182 |
return Promise.resolve([]);
|
183 |
}
|
184 |
}
|
185 |
+
fill_available_models_select(endpoint = null) {
|
186 |
// fetch available_models for all endpoints, and then fill available_models_select
|
187 |
let available_models_select = $("#available-models-select");
|
188 |
available_models_select.empty();
|
189 |
+
let promises = [];
|
190 |
+
|
191 |
+
const fill_models = (endpoint) => {
|
192 |
+
return this.fetch_available_models(endpoint).then(
|
193 |
+
(available_models) => {
|
194 |
+
available_models.forEach((model_id) => {
|
195 |
+
let model_name_and_value =
|
196 |
+
this.construct_model_name_and_value(
|
197 |
+
endpoint,
|
198 |
+
model_id
|
|
|
|
|
|
|
199 |
);
|
200 |
+
let option = new Option(
|
201 |
+
model_name_and_value[0],
|
202 |
+
model_name_and_value[1]
|
203 |
+
);
|
204 |
+
available_models_select.append(option);
|
205 |
+
});
|
206 |
+
}
|
207 |
+
);
|
208 |
+
};
|
209 |
+
|
210 |
+
if (endpoint) {
|
211 |
+
promises.push(fill_models(endpoint));
|
212 |
+
} else {
|
213 |
+
this.db.endpoints.toArray().then((endpoints) => {
|
214 |
+
endpoints.map(async (row) => {
|
215 |
+
promises.push(fill_models(row.endpoint));
|
216 |
+
});
|
217 |
});
|
218 |
+
}
|
219 |
+
|
220 |
+
Promise.all(promises).then(() => {
|
221 |
+
this.set_default_model();
|
222 |
});
|
223 |
}
|
224 |
construct_model_name_and_value(endpoint, model_id) {
|