Update Nginx configuration for uploads and improve thread ID handling (#1023)

* fix: update nginx configuration for uploads endpoint and improve thread ID handling in hooks

* Update docker/nginx/nginx.local.conf

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update frontend/src/core/threads/hooks.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
JeffJiang
2026-03-08 21:15:03 +08:00
committed by GitHub
parent 6b5c4fe6dd
commit 3721c82ba8
3 changed files with 46 additions and 32 deletions

View File

@@ -130,16 +130,6 @@ http {
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
} }
# Custom API: Artifacts endpoint
location ~ ^/api/threads/[^/]+/artifacts {
proxy_pass http://gateway;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Custom API: Uploads endpoint # Custom API: Uploads endpoint
location ~ ^/api/threads/[^/]+/uploads { location ~ ^/api/threads/[^/]+/uploads {
proxy_pass http://gateway; proxy_pass http://gateway;
@@ -154,6 +144,16 @@ http {
proxy_request_buffering off; proxy_request_buffering off;
} }
# Custom API: Other endpoints under /api/threads
location ~ ^/api/threads {
proxy_pass http://gateway;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# API Documentation: Swagger UI # API Documentation: Swagger UI
location /docs { location /docs {
proxy_pass http://gateway; proxy_pass http://gateway;

View File

@@ -14,17 +14,17 @@ http {
access_log logs/nginx-access.log; access_log logs/nginx-access.log;
error_log logs/nginx-error.log; error_log logs/nginx-error.log;
# Upstream servers (using localhost for local development) # Upstream servers (using 127.0.0.1 for local development)
upstream gateway { upstream gateway {
server localhost:8001; server 127.0.0.1:8001;
} }
upstream langgraph { upstream langgraph {
server localhost:2024; server 127.0.0.1:2024;
} }
upstream frontend { upstream frontend {
server localhost:3000; server 127.0.0.1:3000;
} }
server { server {
@@ -126,16 +126,6 @@ http {
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
} }
# Custom API: Artifacts endpoint
location ~ ^/api/threads/[^/]+/artifacts {
proxy_pass http://gateway;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Custom API: Uploads endpoint # Custom API: Uploads endpoint
location ~ ^/api/threads/[^/]+/uploads { location ~ ^/api/threads/[^/]+/uploads {
proxy_pass http://gateway; proxy_pass http://gateway;
@@ -150,6 +140,16 @@ http {
proxy_request_buffering off; proxy_request_buffering off;
} }
# Custom API: Other endpoints under /api/threads
location ~ ^/api/threads {
proxy_pass http://gateway;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# API Documentation: Swagger UI # API Documentation: Swagger UI
location /docs { location /docs {
proxy_pass http://gateway; proxy_pass http://gateway;

View File

@@ -40,6 +40,10 @@ export function useThreadStream({
onToolEnd, onToolEnd,
}: ThreadStreamOptions) { }: ThreadStreamOptions) {
const { t } = useI18n(); const { t } = useI18n();
// Track the thread ID that is currently streaming to handle thread changes during streaming
const [onStreamThreadId, setOnStreamThreadId] = useState(() => threadId);
// Ref to track current thread ID across async callbacks without causing re-renders,
// and to allow access to the current thread id in onUpdateEvent
const threadIdRef = useRef<string | null>(threadId ?? null); const threadIdRef = useRef<string | null>(threadId ?? null);
const startedRef = useRef(false); const startedRef = useRef(false);
@@ -55,30 +59,40 @@ export function useThreadStream({
}, [onStart, onFinish, onToolEnd]); }, [onStart, onFinish, onToolEnd]);
useEffect(() => { useEffect(() => {
if (threadIdRef.current && threadIdRef.current !== threadId) { const normalizedThreadId = threadId ?? null;
threadIdRef.current = threadId ?? null; if (threadIdRef.current !== normalizedThreadId) {
threadIdRef.current = normalizedThreadId;
startedRef.current = false; // Reset for new thread startedRef.current = false; // Reset for new thread
setOnStreamThreadId(normalizedThreadId);
} }
}, [threadId]); }, [threadId]);
const _handleStart = useCallback((id: string) => { const _handleOnStart = useCallback((id: string) => {
if (!startedRef.current) { if (!startedRef.current) {
listeners.current.onStart?.(id); listeners.current.onStart?.(id);
startedRef.current = true; startedRef.current = true;
} }
}, []); }, []);
const handleStreamStart = useCallback(
(_threadId: string) => {
threadIdRef.current = _threadId;
setOnStreamThreadId(_threadId);
_handleOnStart(_threadId);
},
[_handleOnStart],
);
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const updateSubtask = useUpdateSubtask(); const updateSubtask = useUpdateSubtask();
const thread = useStream<AgentThreadState>({ const thread = useStream<AgentThreadState>({
client: getAPIClient(isMock), client: getAPIClient(isMock),
assistantId: "lead_agent", assistantId: "lead_agent",
threadId: threadIdRef.current, threadId: onStreamThreadId,
reconnectOnMount: true, reconnectOnMount: true,
fetchStateHistory: { limit: 1 }, fetchStateHistory: { limit: 1 },
onCreated(meta) { onCreated(meta) {
threadIdRef.current = meta.thread_id; handleStreamStart(meta.thread_id);
_handleStart(meta.thread_id);
}, },
onLangChainEvent(event) { onLangChainEvent(event) {
if (event.event === "on_tool_end") { if (event.event === "on_tool_end") {
@@ -194,7 +208,7 @@ export function useThreadStream({
} }
setOptimisticMessages(newOptimistic); setOptimisticMessages(newOptimistic);
_handleStart(threadId); _handleOnStart(threadId);
let uploadedFileInfo: UploadedFileInfo[] = []; let uploadedFileInfo: UploadedFileInfo[] = [];
@@ -330,7 +344,7 @@ export function useThreadStream({
throw error; throw error;
} }
}, },
[thread, _handleStart, t.uploads.uploadingFiles, context, queryClient], [thread, _handleOnStart, t.uploads.uploadingFiles, context, queryClient],
); );
// Merge thread with optimistic messages for display // Merge thread with optimistic messages for display