📤 fix: Show Proper Upload Options for Azure and Agent Endpoints (#11081)

* fix: only show upload to provider for azureOpenAi when use responses api is true

* fix: model_parameters not available on first load so Upload Image incorrectly shown - now we query if not populated

* test: update tests for new azureOpenAI Responses API logic

* chore: correct order of headers in OAuth request to ensure proper content type is set

* fix: add useResponsesApi prop to AttachFileMenu and DragDropModal components

---------

Co-authored-by: Danny Avila <danny@librechat.ai>
This commit is contained in:
Dustin Healy 2025-12-25 12:54:15 -08:00 committed by GitHub
parent 4fe223eedd
commit 7183223e59
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 131 additions and 11 deletions

View file

@ -1,7 +1,8 @@
import React, { createContext, useContext, useMemo } from 'react';
import { getEndpointField } from 'librechat-data-provider';
import { getEndpointField, isAgentsEndpoint } from 'librechat-data-provider';
import type { EModelEndpoint } from 'librechat-data-provider';
import { useGetEndpointsQuery } from '~/data-provider';
import { useGetEndpointsQuery, useGetAgentByIdQuery } from '~/data-provider';
import { useAgentsMapContext } from './AgentsMapContext';
import { useChatContext } from './ChatContext';
interface DragDropContextValue {
@ -9,6 +10,7 @@ interface DragDropContextValue {
agentId: string | null | undefined;
endpoint: string | null | undefined;
endpointType?: EModelEndpoint | undefined;
useResponsesApi?: boolean;
}
const DragDropContext = createContext<DragDropContextValue | undefined>(undefined);
@ -16,6 +18,7 @@ const DragDropContext = createContext<DragDropContextValue | undefined>(undefine
export function DragDropProvider({ children }: { children: React.ReactNode }) {
const { conversation } = useChatContext();
const { data: endpointsConfig } = useGetEndpointsQuery();
const agentsMap = useAgentsMapContext();
const endpointType = useMemo(() => {
return (
@ -24,6 +27,34 @@ export function DragDropProvider({ children }: { children: React.ReactNode }) {
);
}, [conversation?.endpoint, endpointsConfig]);
const needsAgentFetch = useMemo(() => {
const isAgents = isAgentsEndpoint(conversation?.endpoint);
if (!isAgents || !conversation?.agent_id) {
return false;
}
const agent = agentsMap?.[conversation.agent_id];
return !agent?.model_parameters;
}, [conversation?.endpoint, conversation?.agent_id, agentsMap]);
const { data: agentData } = useGetAgentByIdQuery(conversation?.agent_id, {
enabled: needsAgentFetch,
});
const useResponsesApi = useMemo(() => {
const isAgents = isAgentsEndpoint(conversation?.endpoint);
if (!isAgents || !conversation?.agent_id || conversation?.useResponsesApi) {
return conversation?.useResponsesApi;
}
const agent = agentData || agentsMap?.[conversation.agent_id];
return agent?.model_parameters?.useResponsesApi;
}, [
conversation?.endpoint,
conversation?.agent_id,
conversation?.useResponsesApi,
agentData,
agentsMap,
]);
/** Context value only created when conversation fields change */
const contextValue = useMemo<DragDropContextValue>(
() => ({
@ -31,8 +62,15 @@ export function DragDropProvider({ children }: { children: React.ReactNode }) {
agentId: conversation?.agent_id,
endpoint: conversation?.endpoint,
endpointType: endpointType,
useResponsesApi: useResponsesApi,
}),
[conversation?.conversationId, conversation?.agent_id, conversation?.endpoint, endpointType],
[
conversation?.conversationId,
conversation?.agent_id,
conversation?.endpoint,
useResponsesApi,
endpointType,
],
);
return <DragDropContext.Provider value={contextValue}>{children}</DragDropContext.Provider>;