mirror of
https://gitee.com/wanwujie/deer-flow
synced 2026-04-03 06:12:14 +08:00
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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user