Skip to content

Commit 2875380

Browse files
authored
🔧 fix: URL params, package mismatch, typing, shared link redirect, and o1 (azure) (#4899)
* fix: double decoding of URL params * fix: prevent streaming options for O1 model (azure) * fix: update @langchain/openai to version 0.3.14 in package-lock.json * chore(AuthContext): typing * chore(useTimeout): typing * fix: shared link redirecting to login when code block includes "Run Code" button * fix: typing
1 parent 85d92c2 commit 2875380

File tree

8 files changed

+41
-22
lines changed

8 files changed

+41
-22
lines changed

‎api/app/clients/OpenAIClient.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,11 @@ ${convo}
13241324
/** @type {(value: void | PromiseLike<void>) => void} */
13251325
let streamResolve;
13261326

1327+
if (this.isO1Model === true && this.azure && modelOptions.stream) {
1328+
delete modelOptions.stream;
1329+
delete modelOptions.stop;
1330+
}
1331+
13271332
if (modelOptions.stream) {
13281333
streamPromise = new Promise((resolve) => {
13291334
streamResolve = resolve;

‎client/src/components/Messages/Content/RunCode.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ const RunCode: React.FC<CodeBarProps> = React.memo(({ lang, codeRef, blockIndex
2121

2222
const { messageId, conversationId, partIndex } = useMessageContext();
2323
const normalizedLang = useMemo(() => normalizeLanguage(lang), [lang]);
24-
const { data } = useVerifyAgentToolAuth({ toolId: Tools.execute_code });
24+
const { data } = useVerifyAgentToolAuth(
25+
{ toolId: Tools.execute_code },
26+
{
27+
retry: 1,
28+
},
29+
);
2530
const authType = useMemo(() => data?.message ?? false, [data?.message]);
2631
const isAuthenticated = useMemo(() => data?.authenticated ?? false, [data?.authenticated]);
2732
const { methods, onSubmit, isDialogOpen, setIsDialogOpen, handleRevokeApiKey } =

‎client/src/hooks/AuthContext.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const AuthContextProvider = ({
5353
//@ts-ignore - ok for token to be undefined initially
5454
setTokenHeader(token);
5555
setIsAuthenticated(isAuthenticated);
56-
if (redirect) {
56+
if (redirect != null && redirect) {
5757
navigate(redirect, { replace: true });
5858
}
5959
},
@@ -83,7 +83,7 @@ const AuthContextProvider = ({
8383
});
8484

8585
const logout = useCallback(() => logoutUser.mutate(undefined), [logoutUser]);
86-
const userQuery = useGetUserQuery({ enabled: !!token });
86+
const userQuery = useGetUserQuery({ enabled: !!(token ?? '') });
8787
const refreshToken = useRefreshTokenMutation();
8888

8989
const login = (data: TLoginUser) => {
@@ -102,26 +102,26 @@ const AuthContextProvider = ({
102102
};
103103

104104
const silentRefresh = useCallback(() => {
105-
if (authConfig?.test) {
105+
if (authConfig?.test === true) {
106106
console.log('Test mode. Skipping silent refresh.');
107107
return;
108108
}
109109
refreshToken.mutate(undefined, {
110-
onSuccess: (data: TLoginResponse) => {
111-
const { user, token } = data;
110+
onSuccess: (data: TLoginResponse | undefined) => {
111+
const { user, token = '' } = data ?? {};
112112
if (token) {
113113
setUserContext({ token, isAuthenticated: true, user });
114114
} else {
115115
console.log('Token is not present. User is not authenticated.');
116-
if (authConfig?.test) {
116+
if (authConfig?.test === true) {
117117
return;
118118
}
119119
navigate('/login');
120120
}
121121
},
122122
onError: (error) => {
123123
console.log('refreshToken mutation error:', error);
124-
if (authConfig?.test) {
124+
if (authConfig?.test === true) {
125125
return;
126126
}
127127
navigate('/login');
@@ -136,10 +136,10 @@ const AuthContextProvider = ({
136136
doSetError((userQuery.error as Error).message);
137137
navigate('/login', { replace: true });
138138
}
139-
if (error && isAuthenticated) {
139+
if (error != null && error && isAuthenticated) {
140140
doSetError(undefined);
141141
}
142-
if (!token || !isAuthenticated) {
142+
if (token == null || !token || !isAuthenticated) {
143143
silentRefresh();
144144
}
145145
}, [
@@ -149,7 +149,9 @@ const AuthContextProvider = ({
149149
userQuery.isError,
150150
userQuery.error,
151151
error,
152+
setUser,
152153
navigate,
154+
silentRefresh,
153155
setUserContext,
154156
]);
155157

‎client/src/hooks/Input/useQueryParams.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ export default function useQueryParams({
1414
const maxAttempts = 50; // 5 seconds maximum (50 * 100ms)
1515

1616
useEffect(() => {
17-
const promptParam = searchParams.get('prompt');
18-
if (!promptParam) {
17+
const decodedPrompt = searchParams.get('prompt') ?? '';
18+
if (!decodedPrompt) {
1919
return;
2020
}
2121

22-
const decodedPrompt = decodeURIComponent(promptParam);
23-
2422
const intervalId = setInterval(() => {
2523
// If already processed or max attempts reached, clear interval and stop
2624
if (processedRef.current || attemptsRef.current >= maxAttempts) {

‎client/src/hooks/useTimeout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function useTimeout({ callback, delay = 400 }: TUseTimeoutParams) {
1616
}
1717

1818
// Set new timeout
19-
if (value) {
19+
if (value != null && value) {
2020
console.log(value);
2121
timeout.current = setTimeout(() => {
2222
callback(value);

‎package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎packages/data-provider/src/react-query/react-query-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ export const useRegisterUserMutation = (
338338
};
339339

340340
export const useRefreshTokenMutation = (): UseMutationResult<
341-
t.TRefreshTokenResponse,
341+
t.TRefreshTokenResponse | undefined,
342342
unknown,
343343
unknown,
344344
unknown

‎packages/data-provider/src/request.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import axios, { AxiosError, AxiosRequestConfig } from 'axios';
33
import * as endpoints from './api-endpoints';
44
import { setTokenHeader } from './headers-helpers';
5+
import type * as t from './types';
56

67
async function _get<T>(url: string, options?: AxiosRequestConfig): Promise<T> {
78
const response = await axios.get(url, { ...options });
@@ -63,7 +64,8 @@ async function _patch(url: string, data?: any) {
6364
let isRefreshing = false;
6465
let failedQueue: { resolve: (value?: any) => void; reject: (reason?: any) => void }[] = [];
6566

66-
const refreshToken = (retry?: boolean) => _post(endpoints.refreshToken(retry));
67+
const refreshToken = (retry?: boolean): Promise<t.TRefreshTokenResponse | undefined> =>
68+
_post(endpoints.refreshToken(retry));
6769

6870
const dispatchTokenUpdatedEvent = (token: string) => {
6971
setTokenHeader(token);
@@ -90,6 +92,7 @@ axios.interceptors.response.use(
9092
}
9193

9294
if (error.response.status === 401 && !originalRequest._retry) {
95+
console.warn('401 error, refreshing token');
9396
originalRequest._retry = true;
9497

9598
if (isRefreshing) {
@@ -107,16 +110,22 @@ axios.interceptors.response.use(
107110
isRefreshing = true;
108111

109112
try {
110-
const { token } = await refreshToken(
113+
const response = await refreshToken(
111114
// Handle edge case where we get a blank screen if the initial 401 error is from a refresh token request
112-
originalRequest.url?.includes('api/auth/refresh') ? true : false,
115+
originalRequest.url?.includes('api/auth/refresh') === true ? true : false,
113116
);
114117

118+
const token = response?.token ?? '';
119+
115120
if (token) {
116121
originalRequest.headers['Authorization'] = 'Bearer ' + token;
117122
dispatchTokenUpdatedEvent(token);
118123
processQueue(null, token);
119124
return await axios(originalRequest);
125+
} else if (window.location.href.includes('share/')) {
126+
console.log(
127+
`Refresh token failed from shared link, attempting request to ${originalRequest.url}`,
128+
);
120129
} else {
121130
window.location.href = '/login';
122131
}

0 commit comments

Comments
 (0)