Skip to content

Desktop: - No Custom Headers field for custom OpenAI-compatible providers #6681

Merged
zanesq merged 14 commits intoblock:mainfrom
Lymah123:desktop
Feb 12, 2026
Merged

Desktop: - No Custom Headers field for custom OpenAI-compatible providers #6681
zanesq merged 14 commits intoblock:mainfrom
Lymah123:desktop

Conversation

@Lymah123
Copy link
Contributor

@Lymah123 Lymah123 commented Jan 23, 2026

Summary

This PR:

  • Add custom headers section to CustomProviderForm with add/remove/edit functionality
  • Fix modal scrolling issue by adding max-h and overflow-y-auto to DialogContent
  • Fix duplicate isFilePickerOpen declaration in ChatInput.tsx
  • Update auto-generated API client files

Type of Change

  • Feature
  • Bug fix
  • Refactor / Code quality
  • Performance improvement
  • Documentation
  • Tests
  • Security fix
  • Build / Release
  • Other (specify below)

AI Assistance

  • This PR was created or reviewed with AI assistance

Testing

Related Issues

closes #6048
Discussion: LINK (if any)

Screenshots/Demos (for UX changes)

Before:

After:

Screenshot (75)

Copilot AI review requested due to automatic review settings January 23, 2026 20:35
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds support for custom HTTP headers to custom OpenAI-compatible providers in the Desktop app, along with UI fixes for modal scrolling and duplicate state declaration.

Changes:

  • Added custom headers section to CustomProviderForm with validation and add/remove/edit functionality
  • Fixed modal scrolling by adding max-height and overflow to DialogContent
  • Removed duplicate isFilePickerOpen state declaration in ChatInput

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
CustomProviderForm.tsx Added custom headers feature with state management, validation (empty fields, spaces in keys), UI components (input fields, add/remove buttons), and form submission logic
ProviderGrid.tsx Fixed modal scrolling by adding max-h-[90vh] and overflow-y-auto to DialogContent to handle long forms
ChatInput.tsx Fixed duplicate isFilePickerOpen declaration by moving it earlier and removing the duplicate; included minor formatting cleanup

Comment on lines 72 to 100
const handleAddHeader = () => {
const keyEmpty = !newHeaderKey.trim();
const valueEmpty = !newHeaderValue.trim();
const keyHasSpaces = newHeaderKey.includes(' ');

if (keyEmpty || valueEmpty) {
setInvalidHeaderFields({
key: keyEmpty,
value: valueEmpty,
});
setHeaderValidationError('Both header name and value must be provided');
return;
}

if (keyHasSpaces) {
setInvalidHeaderFields({
key: true,
value: false,
});
setHeaderValidationError('Header name cannot contain spaces');
return;
}

setHeaderValidationError(null);
setInvalidHeaderFields({ key: false, value: false });
setHeaders([...headers, { key: newHeaderKey, value: newHeaderValue }]);
setNewHeaderKey('');
setNewHeaderValue('');
};
Copy link

Copilot AI Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The validation doesn't check for duplicate header keys. If a user adds the same header name twice (e.g., "Authorization" twice), both will be accepted but only the last value will be kept when converting to the object format in handleSubmit (lines 136-144). Consider adding a check to prevent duplicate keys.

Copilot uses AI. Check for mistakes.
@zanesq
Copy link
Collaborator

zanesq commented Jan 23, 2026

Thanks, does the goose backend actually use these new header fields in the LLM requests?

@Lymah123
Copy link
Contributor Author

Thanks, does the goose backend actually use these new header fields in the LLM requests?

Yes, the backend fully supports and uses custom headers. In openai.rs (lines 169-177), the from_custom_config method reads headers from DeclarativeProviderConfig, converts them to a HeaderMap, and adds them to the ApiClient. These headers are then included in all HTTP requests to the custom provider. The UI was simply missing a way to set these headers - the backend has supported them all along.

Moreover, this feature is already in CLI.

Copilot AI review requested due to automatic review settings January 23, 2026 21:01
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (3)

ui/desktop/src/components/settings/providers/ProviderGrid.tsx:207

  • When editing a provider, the headers field from editingProvider.config.headers is not being passed to the CustomProviderForm. This means existing headers will be lost when editing a provider. Add headers to the initialData object: headers: editingProvider.config.headers ?? null
  const initialData = editingProvider && {
    engine: editingProvider.config.engine,
    display_name: editingProvider.config.display_name,
    api_url: editingProvider.config.base_url,
    api_key: '',
    models: editingProvider.config.models.map((m) => m.name),
    supports_streaming: editingProvider.config.supports_streaming ?? true,
  };

ui/desktop/src/components/ChatInput.tsx:696

  • Callee is not a function: it has type undefined.
          const compressedDataUrl = await compressImageDataUrl(dataUrl);

ui/desktop/src/components/ChatInput.tsx:1039

  • Callee is not a function: it has type undefined.
          const compressedDataUrl = await compressImageDataUrl(dataUrl);

api_key: apiKey,
models: modelList,
supports_streaming: supportsStreaming,
headers: Object.keys(headersObject).length > 0 ? headersObject : null,
Copy link

Copilot AI Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The backend API does not support the 'headers' field in UpdateCustomProviderRequest. Looking at crates/goose-server/src/routes/config_management.rs (lines 82-89), the UpdateCustomProviderRequest struct only includes: engine, display_name, api_url, api_key, models, and supports_streaming. Sending headers will cause the backend to reject this request or silently ignore the field.

The backend must be updated to accept headers before this frontend change can work. The DeclarativeProviderConfig in the backend (crates/goose/src/config/declarative_providers.rs:39) already has support for headers, but the create_custom_provider and update_custom_provider functions do not accept headers as parameters.

Copilot uses AI. Check for mistakes.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Lymah123 can you review these copilot reviews and resolve or comment?

Comment on lines +53 to +59
if (initialData.headers) {
const headerList = Object.entries(initialData.headers).map(([key, value]) => ({
key,
value,
}));
setHeaders(headerList);
}
Copy link

Copilot AI Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialData prop is typed as UpdateCustomProviderRequest in the function signature, but UpdateCustomProviderRequest doesn't have a headers field according to types.gen.ts. The code tries to access initialData.headers on line 53, which would cause a TypeScript error. Either UpdateCustomProviderRequest needs to be updated to include headers, or a different type should be used for initialData.

Copilot uses AI. Check for mistakes.
const handleHeaderChange = (index: number, field: 'key' | 'value', value: string) => {
const updatedHeaders = [...headers];
updatedHeaders[index][field] = value;
setHeaders(updatedHeaders);
Copy link

Copilot AI Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Header editing (handleHeaderChange) doesn't validate the changes. Users can edit existing headers to have invalid values (e.g., spaces in key, empty key or value). Consider adding validation when submitting the form, or preventing invalid edits in real-time.

Suggested change
setHeaders(updatedHeaders);
setHeaders(updatedHeaders);
const currentHeader = updatedHeaders[index];
const keyEmpty = !currentHeader.key.trim();
const valueEmpty = !currentHeader.value.trim();
const keyHasSpaces = currentHeader.key.includes(' ');
if (keyEmpty || valueEmpty) {
setInvalidHeaderFields({
key: keyEmpty,
value: valueEmpty,
});
setHeaderValidationError('Both header name and value must be provided');
return;
}
if (keyHasSpaces) {
setInvalidHeaderFields({
key: true,
value: false,
});
setHeaderValidationError('Header name cannot contain spaces');
return;
}
clearHeaderValidation();

Copilot uses AI. Check for mistakes.
Copilot AI review requested due to automatic review settings January 24, 2026 14:48
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

onClick={handleAddHeader}
variant="ghost"
type="button"
className="flex items-center justify-start gap-1 px-2 pr-4 text-sm rounded-full text-textStandard bg-background-default border border-borderSubtle hover:border-borderStandard transition-colors min-w-[60px] h-9 [&>svg]:size-4!"
Copy link

Copilot AI Jan 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Tailwind important modifier syntax is incorrect. The ! should be placed before the property name, not after. Change [&>svg]:size-4! to [&>svg]:!size-4 to match the established pattern used in HeadersSection.tsx.

Suggested change
className="flex items-center justify-start gap-1 px-2 pr-4 text-sm rounded-full text-textStandard bg-background-default border border-borderSubtle hover:border-borderStandard transition-colors min-w-[60px] h-9 [&>svg]:size-4!"
className="flex items-center justify-start gap-1 px-2 pr-4 text-sm rounded-full text-textStandard bg-background-default border border-borderSubtle hover:border-borderStandard transition-colors min-w-[60px] h-9 [&>svg]:!size-4"

Copilot uses AI. Check for mistakes.
key: keyEmpty,
value: valueEmpty,
});
setHeaderValidationError('Both header name and value must be provided');
Copy link

Copilot AI Jan 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The validation error message is inconsistent with the established pattern in HeadersSection.tsx. Change "Both header name and value must be provided" to "Both header name and value must be entered" to maintain consistency across the codebase. (Reference: ui/desktop/src/components/settings/extensions/modal/HeadersSection.tsx:53)

Copilot uses AI. Check for mistakes.
@Lymah123
Copy link
Contributor Author

The PR is ready for review.

base_url: api_url,
models: model_infos,
headers: existing_config.headers,
headers: headers.or(existing_config.headers),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this logic means:

If headers is Some(...), use the new headers
If headers is None, keep existing headers

This makes it impossible to clear headers once set. If a user wants to remove all custom headers, passing None will just keep the old ones.

Maybe the UI should distinguish between "not provided" and "explicitly empty"?

change to something like

headers: if headers.is_some() { headers } else { existing_config.headers },
// Or better: always use the provided headers value (including None to clear)
headers: headers,

And update the UI to explicitly send {} when user wants no headers.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, I'd do that. Thanks.

Ok(provider_config)
}

#[allow(clippy::too_many_arguments)]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function now has 8 parameters.
Rather than adding the clippy allow maybe create a struct like UpdateCustomProviderParams to group these? This would also make future additions cleaner.

api_key: apiKey,
models: modelList,
supports_streaming: supportsStreaming,
headers: Object.keys(headersObject).length > 0 ? headersObject : null,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Lymah123 can you review these copilot reviews and resolve or comment?

@Lymah123
Copy link
Contributor Author

Thanks for the feedback and the suggestions @zanesq . I will look into that. Yes, I will resolve the Copilot reviews. I was waiting for human reviews and working on the suggestions together.

Copilot AI review requested due to automatic review settings January 28, 2026 17:16
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

@Lymah123 Lymah123 requested a review from zanesq January 28, 2026 17:35
- Added custom headers section to CustomProviderForm.tsx

- Fixed modal scrolling issue in ProviderGrid.tsx

- Fixed duplicate variable declaration in ChatInput.tsx

Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
- Added #[allow(clippy::too_many_arguments)] to update_custom_provider

- Resolved all merge conflict markers in ChatInput.tsx

Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
- Remove unused StreamableHttpOptions import
- Extract URLs from StreamableHttpOptions for parse_cli_flag_extensions
- Remove extra blank line for fmt check

Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
Copilot AI review requested due to automatic review settings January 30, 2026 16:38
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Comment on lines 750 to 751
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
>>>>>>> 04269837bc8 (Backend: Add headers parameter to update_custom_provider)
Copy link

Copilot AI Jan 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merge conflict markers left in the code. Line 749 already ends the function call with )?; but lines 750-751 contain a duplicate error handling chain and a merge conflict marker that should be removed.

Suggested change
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
>>>>>>> 04269837bc8 (Backend: Add headers parameter to update_custom_provider)

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

Comment on lines 545 to 553
let streamable_urls: Vec<String> = session_config
.streamable_http_extensions
.iter()
.map(|opt| opt.url.clone())
.collect();

let cli_flag_extensions_to_load = parse_cli_flag_extensions(
&session_config.extensions,
&session_config.streamable_http_extensions,
&streamable_urls,
Copy link

Copilot AI Jan 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Type mismatch in function call. The function parse_cli_flag_extensions expects &[StreamableHttpOptions] (defined at line 33 of builder.rs), but this change passes &[String]. The StreamableHttpOptions struct contains both url and timeout information (used at line 59 in parse_cli_flag_extensions), so extracting just the URLs will break the functionality and cause a compilation error.

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
@Lymah123 Lymah123 requested a review from Copilot January 30, 2026 17:08
@Lymah123 Lymah123 requested a review from zanesq January 31, 2026 20:20
@Lymah123
Copy link
Contributor Author

Lymah123 commented Feb 5, 2026

@Lymah123 looking better thanks! I think a few more things from copilot are left unresolved and seem worthy of fixing.

  1. Duplicate header key validation - Add check in handleAddHeader to prevent adding headers with keys that already exist
  2. Header edit validation - Add validation in handleHeaderChange or on form submit to catch invalid edits
  3. Cannot clear headers - Change the logic so passing None or empty object clears headers, or update UI to send explicit empty object {} when user wants no headers

@zanesq, I have made the requested changes. Thanks!

Hello @zanesq !

@zanesq zanesq self-assigned this Feb 6, 2026
@zanesq
Copy link
Collaborator

zanesq commented Feb 6, 2026

@Lymah123 apologies been real busy, can you pull in main and resolve the conflicts then I will do some more testing on this

…rForm

Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
Copilot AI review requested due to automatic review settings February 7, 2026 14:50
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

const keyEmpty = !newHeaderKey.trim();
const valueEmpty = !newHeaderValue.trim();
const keyHasSpaces = newHeaderKey.includes(' ');
const isDuplicate = headers.some(h => h.key.trim() === newHeaderKey.trim());
Copy link

Copilot AI Feb 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate header detection is case-sensitive, but HTTP header names are case-insensitive; allowing both X-Foo and x-foo will lead to one overwriting the other when converted into a real header map. Normalize names (e.g., compare toLowerCase().trim()) for duplicate checks and ideally also when serializing to the request object.

Suggested change
const isDuplicate = headers.some(h => h.key.trim() === newHeaderKey.trim());
const normalizedNewKey = newHeaderKey.trim().toLowerCase();
const isDuplicate = headers.some(h => h.key.trim().toLowerCase() === normalizedNewKey);

Copilot uses AI. Check for mistakes.
const keyEmpty = !newKey.trim();
const valueEmpty = !newValue.trim();
const keyHasSpaces = newKey.includes(' ');
const isDuplicate = headers.some(h => h.key.trim() === newKey.trim());
Copy link

Copilot AI Feb 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate header detection is currently case-sensitive, but HTTP header names are case-insensitive; this can allow logically-duplicate headers that later overwrite each other at request time. Normalize header names (e.g., trim().toLowerCase()) in the duplicate check (and ideally during add) to match runtime behavior.

Suggested change
const isDuplicate = headers.some(h => h.key.trim() === newKey.trim());
const normalizedNewKey = newKey.trim().toLowerCase();
const isDuplicate = headers.some(
h => h.key.trim().toLowerCase() === normalizedNewKey
);

Copilot uses AI. Check for mistakes.
Comment on lines 163 to 164
const isDuplicate = formData.headers.some((h, i) => i !== index && h.key.trim() === value.trim());
if (isDuplicate && value.trim() !== '') {
Copy link

Copilot AI Feb 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The duplicate-header guard compares keys case-sensitively, but HTTP header names are case-insensitive, so users can enter Authorization and authorization and have one overwrite the other when building the request headers. Normalize to a consistent case for duplicate detection (and consider normalizing on write).

Suggested change
const isDuplicate = formData.headers.some((h, i) => i !== index && h.key.trim() === value.trim());
if (isDuplicate && value.trim() !== '') {
const trimmedNewKey = value.trim();
const normalizedNewKey = trimmedNewKey.toLowerCase();
const isDuplicate = formData.headers.some(
(h, i) => i !== index && h.key.trim().toLowerCase() === normalizedNewKey,
);
if (isDuplicate && trimmedNewKey !== '') {

Copilot uses AI. Check for mistakes.
Comment on lines +59 to +63
if (initialData.headers) {
const headerList = Object.entries(initialData.headers).map(([key, value]) => ({
key,
value,
}));
Copy link

Copilot AI Feb 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Custom headers won’t be preserved when editing an existing provider because initialData.headers is the only source for initializing headers, but the modal currently builds initialData without copying editingProvider.config.headers; this will cause updates to overwrite existing headers with an empty set. Pass headers: editingProvider.config.headers ?? undefined/null into initialData (and consider omitting headers on submit when unchanged) so edits don’t accidentally clear server-side config.

Copilot uses AI. Check for mistakes.
Comment on lines 160 to 169
const headersObject = headers.reduce(
(acc, header) => {
if (header.key.trim() && header.value.trim()) {
acc[header.key.trim()] = header.value.trim();
}
return acc;
},
{} as Record<string, string>
);

Copy link

Copilot AI Feb 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

newHeaderKey/newHeaderValue aren’t included in the submit payload, so if the user fills the fields and presses Enter or clicks “Create/Update” without clicking “Add”, the header is silently dropped. Consider handling Enter to call handleAddHeader, and/or blocking submit while there’s pending header input (similar to the extensions HeadersSection pattern) or auto-adding the pending header during submit.

Suggested change
const headersObject = headers.reduce(
(acc, header) => {
if (header.key.trim() && header.value.trim()) {
acc[header.key.trim()] = header.value.trim();
}
return acc;
},
{} as Record<string, string>
);
const headersObject: Record<string, string> = {};
// Include any pending header input so it isn't dropped on submit
if (newHeaderKey?.trim() && newHeaderValue?.trim()) {
headersObject[newHeaderKey.trim()] = newHeaderValue.trim();
}
headers.forEach((header) => {
const key = header.key.trim();
const value = header.value.trim();
if (key && value) {
headersObject[key] = value;
}
});

Copilot uses AI. Check for mistakes.
Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
Signed-off-by: Lymah123 <fimihanodunola625@gmail.com>
Copilot AI review requested due to automatic review settings February 7, 2026 15:21
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Comment on lines 126 to 129
const isDuplicate = headers.some((h, i) => i !== index && h.key.trim() === value.trim());
if (isDuplicate && value.trim() !== '') {
return;
}
Copy link

Copilot AI Feb 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

handleHeaderChange prevents duplicate header names using a case-sensitive comparison, but headers are case-insensitive and handleAddHeader normalizes to lowercase; this can allow duplicates like Authorization vs authorization which then get silently overwritten when building headersObject on submit—normalize the duplicate check (and stored keys) consistently (e.g., trim + lowercase).

Suggested change
const isDuplicate = headers.some((h, i) => i !== index && h.key.trim() === value.trim());
if (isDuplicate && value.trim() !== '') {
return;
}
const normalizedValue = value.trim().toLowerCase();
const isDuplicate = headers.some(
(h, i) => i !== index && h.key.trim().toLowerCase() === normalizedValue,
);
if (isDuplicate && normalizedValue !== '') {
return;
}
const updatedHeaders = [...headers];
updatedHeaders[index].key = normalizedValue;
setHeaders(updatedHeaders);
return;

Copilot uses AI. Check for mistakes.
models: modelList,
supports_streaming: supportsStreaming,
requires_auth: requiresApiKey,
headers: Object.keys(headersObject).length > 0 ? headersObject : {},
Copy link

Copilot AI Feb 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

headers is always sent as {} when no headers are present, which deserializes as Some(empty) on the backend and can unintentionally clear existing headers on update (the server merges via params.headers.or(existing_config.headers)); send undefined/null (omit the field) when there are no headers to preserve existing behavior and match the CLI’s Option<HashMap> semantics.

Suggested change
headers: Object.keys(headersObject).length > 0 ? headersObject : {},
headers: Object.keys(headersObject).length > 0 ? headersObject : undefined,

Copilot uses AI. Check for mistakes.
@Lymah123
Copy link
Contributor Author

Lymah123 commented Feb 7, 2026

@zanesq fixed!

Lymah123 and others added 2 commits February 7, 2026 17:07
Copilot AI review requested due to automatic review settings February 12, 2026 00:16
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Collaborator

@zanesq zanesq left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Lymah123 thanks! I tested locally and pushed some minor fixes and cleanup LGTM.

@zanesq zanesq enabled auto-merge February 12, 2026 00:18
@zanesq zanesq added this pull request to the merge queue Feb 12, 2026
Merged via the queue into block:main with commit f96d38e Feb 12, 2026
19 checks passed
lifeizhou-ap added a commit that referenced this pull request Feb 12, 2026
* main:
  fix text editor view broken (#7167)
  docs: White label guide (#6857)
  Add PATH detection back to developer extension (#7161)
  docs: pin version in ci/cd (#7168)
  Desktop: - No Custom Headers field for custom OpenAI-compatible providers  (#6681)
  feat: edit model and extensions of a recipe from GUI (#6804)
  feat: MCP support for agentic CLI providers (#6972)
jh-block added a commit that referenced this pull request Feb 12, 2026
* origin/main: (33 commits)
  fix: replace panic with proper error handling in get_tokenizer (#7175)
  Lifei/smoke test for developer (#7174)
  fix text editor view broken (#7167)
  docs: White label guide (#6857)
  Add PATH detection back to developer extension (#7161)
  docs: pin version in ci/cd (#7168)
  Desktop: - No Custom Headers field for custom OpenAI-compatible providers  (#6681)
  feat: edit model and extensions of a recipe from GUI (#6804)
  feat: MCP support for agentic CLI providers (#6972)
  docs: keyring fallback to secrets.yaml (#7165)
  feat: load provider/model specified inside the recipe config (#6884)
  fix ask-ai bot hitting tool call limits (#7162)
  fix flatpak icon (#7154)
  [docs] Skills Marketplace UI Improvements (#7158)
  More no-window flags (#7122)
  feat: Allow overriding default bat themes using environment variables (#7140)
  Make the system prompt smaller (#6991)
  Pre release script (#7145)
  Spelling (#7137)
  feat(mcp): upgrade rmcp to 0.15.0 and advertise MCP Apps UI extension capability (#6927)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Desktop: No Custom Headers field for custom OpenAI-compatible providers

2 participants

Comments