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;
}
# 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
location ~ ^/api/threads/[^/]+/uploads {
proxy_pass http://gateway;
@@ -154,6 +144,16 @@ http {
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
location /docs {
proxy_pass http://gateway;

View File

@@ -14,17 +14,17 @@ http {
access_log logs/nginx-access.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 {
server localhost:8001;
server 127.0.0.1:8001;
}
upstream langgraph {
server localhost:2024;
server 127.0.0.1:2024;
}
upstream frontend {
server localhost:3000;
server 127.0.0.1:3000;
}
server {
@@ -126,16 +126,6 @@ http {
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
location ~ ^/api/threads/[^/]+/uploads {
proxy_pass http://gateway;
@@ -150,6 +140,16 @@ http {
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
location /docs {
proxy_pass http://gateway;

View File

@@ -40,6 +40,10 @@ export function useThreadStream({
onToolEnd,
}: ThreadStreamOptions) {
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 startedRef = useRef(false);
@@ -55,30 +59,40 @@ export function useThreadStream({
}, [onStart, onFinish, onToolEnd]);
useEffect(() => {
if (threadIdRef.current && threadIdRef.current !== threadId) {
threadIdRef.current = threadId ?? null;
const normalizedThreadId = threadId ?? null;
if (threadIdRef.current !== normalizedThreadId) {
threadIdRef.current = normalizedThreadId;
startedRef.current = false; // Reset for new thread
setOnStreamThreadId(normalizedThreadId);
}
}, [threadId]);
const _handleStart = useCallback((id: string) => {
const _handleOnStart = useCallback((id: string) => {
if (!startedRef.current) {
listeners.current.onStart?.(id);
startedRef.current = true;
}
}, []);
const handleStreamStart = useCallback(
(_threadId: string) => {
threadIdRef.current = _threadId;
setOnStreamThreadId(_threadId);
_handleOnStart(_threadId);
},
[_handleOnStart],
);
const queryClient = useQueryClient();
const updateSubtask = useUpdateSubtask();
const thread = useStream<AgentThreadState>({
client: getAPIClient(isMock),
assistantId: "lead_agent",
threadId: threadIdRef.current,
threadId: onStreamThreadId,
reconnectOnMount: true,
fetchStateHistory: { limit: 1 },
onCreated(meta) {
threadIdRef.current = meta.thread_id;
_handleStart(meta.thread_id);
handleStreamStart(meta.thread_id);
},
onLangChainEvent(event) {
if (event.event === "on_tool_end") {
@@ -194,7 +208,7 @@ export function useThreadStream({
}
setOptimisticMessages(newOptimistic);
_handleStart(threadId);
_handleOnStart(threadId);
let uploadedFileInfo: UploadedFileInfo[] = [];
@@ -330,7 +344,7 @@ export function useThreadStream({
throw error;
}
},
[thread, _handleStart, t.uploads.uploadingFiles, context, queryClient],
[thread, _handleOnStart, t.uploads.uploadingFiles, context, queryClient],
);
// Merge thread with optimistic messages for display