Skip to content

♻️ refactor(model-select): migrate FunctionCallingModelSelect to LobeSelect#11664

Merged
Innei merged 3 commits intonextfrom
refactor/function-calling-model-select-to-lobe-select
Jan 20, 2026
Merged

♻️ refactor(model-select): migrate FunctionCallingModelSelect to LobeSelect#11664
Innei merged 3 commits intonextfrom
refactor/function-calling-model-select-to-lobe-select

Conversation

@Innei
Copy link
Copy Markdown
Member

@Innei Innei commented Jan 20, 2026

💻 Change Type

  • ✨ feat
  • 🐛 fix
  • ♻️ refactor
  • 💄 style
  • 👷 build
  • ⚡️ perf
  • ✅ test
  • 📝 docs
  • 🔨 chore

🔗 Related Issue

N/A

🔀 Description of Change

Migrate FunctionCallingModelSelect component from antd Select to LobeSelect component:

  • Replace Select with LobeSelect component from @lobehub/ui
  • Update types from SelectProps to LobeSelectProps
  • Fix ModelOption.label type from any to ReactNode for better type safety
  • Update ModelSelectProps to properly extend LobeSelectProps

🧪 How to Test

  • Tested locally
  • Added/updated tests
  • No tests needed
  1. Navigate to Chat Input area with Search feature enabled
  2. Verify the model select dropdown works correctly
  3. Verify model selection triggers the correct callback

📸 Screenshots / Videos

No UI changes expected - this is an internal refactor

📝 Additional Information

This is part of the ongoing migration from antd components to LobeUI components.

Summary by Sourcery

Refactor the function-calling chat model selector to use the shared LobeSelect component instead of antd Select while tightening its type definitions.

Enhancements:

  • Migrate the FunctionCallingModelSelect component from antd Select to the LobeSelect component from @lobehub/ui.
  • Improve type safety by narrowing ModelOption.label to ReactNode and aligning ModelSelectProps and options typing with LobeSelectProps.

…Select

- Replace Select with LobeSelect component
- Update types from SelectProps to LobeSelectProps
- Fix ModelOption label type from any to ReactNode
@vercel
Copy link
Copy Markdown

vercel bot commented Jan 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
lobehub Ready Ready Preview, Comment Jan 20, 2026 5:32pm

Request Review

@dosubot dosubot bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Jan 20, 2026
@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai bot commented Jan 20, 2026

Reviewer's guide (collapsed on small PRs)

Reviewer's Guide

Refactors the FunctionCallingModelSelect component to use the shared LobeSelect from @lobehub/ui instead of antd Select, tightening TypeScript types around options, props, and the model selection callback while preserving runtime behavior.

Sequence diagram for model selection using LobeSelect

sequenceDiagram
  actor User
  participant ParentComponent
  participant ModelSelect
  participant LobeSelect

  User->>LobeSelect: select option (provider/model)
  LobeSelect->>ModelSelect: onChange(value, option)
  ModelSelect->>ModelSelect: parse model from value
  ModelSelect->>ParentComponent: onChange({ model, provider })
Loading

Class diagram for refactored FunctionCallingModelSelect types

classDiagram
  class ModelOption {
    ReactNode label
    string provider
    string value
  }

  class LobeSelectProps {
  }

  class WorkingModel {
    string model
    string provider
  }

  class ModelSelectProps {
    +onChange(WorkingModel props) void
    +bool showAbility
    +WorkingModel value
  }

  class ModelSelect {
    +ModelSelect(ModelSelectProps props)
  }

  ModelSelectProps --|> LobeSelectProps : extends Omit
  ModelSelect --> ModelOption : uses
  ModelSelect --> WorkingModel : uses
Loading

File-Level Changes

Change Details Files
Migrate FunctionCallingModelSelect from antd Select to LobeSelect with updated typing and option handling.
  • Change ModelOption.label type from any to ReactNode for stricter typing of rendered labels.
  • Update ModelSelectProps to extend Omit<LobeSelectProps, 'onChange'
'value'> instead of SelectProps so the wrapper can own those fields.
  • Switch useMemo options typing from SelectProps['options'] to LobeSelectProps['options'] to match the new select component.
  • Replace the rendered Select with LobeSelect and adapt the onChange handler to continue mapping the selected value back into a WorkingModel object passed to the custom onChange callback.

  • Tips and commands

    Interacting with Sourcery

    • Trigger a new review: Comment @sourcery-ai review on the pull request.
    • Continue discussions: Reply directly to Sourcery's review comments.
    • Generate a GitHub issue from a review comment: Ask Sourcery to create an
      issue from a review comment by replying to it. You can also reply to a
      review comment with @sourcery-ai issue to create an issue from it.
    • Generate a pull request title: Write @sourcery-ai anywhere in the pull
      request title to generate a title at any time. You can also comment
      @sourcery-ai title on the pull request to (re-)generate the title at any time.
    • Generate a pull request summary: Write @sourcery-ai summary anywhere in
      the pull request body to generate a PR summary at any time exactly where you
      want it. You can also comment @sourcery-ai summary on the pull request to
      (re-)generate the summary at any time.
    • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
      request to (re-)generate the reviewer's guide at any time.
    • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
      pull request to resolve all Sourcery comments. Useful if you've already
      addressed all the comments and don't want to see them anymore.
    • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
      request to dismiss all existing Sourcery reviews. Especially useful if you
      want to start fresh with a new review - don't forget to comment
      @sourcery-ai review to trigger a new review!

    Customizing Your Experience

    Access your dashboard to:

    • Enable or disable review features such as the Sourcery-generated pull request
      summary, the reviewer's guide, and others.
    • Change the review language.
    • Add, remove or edit custom review instructions.
    • Adjust other review settings.

    Getting Help

    @gru-agent
    Copy link
    Copy Markdown
    Contributor

    gru-agent bot commented Jan 20, 2026

    TestGru Assignment

    Summary

    Link CommitId Status Reason
    Detail c7e2d35 🚫 Skipped No files need to be tested {"src/features/ChatInput/ActionBar/Search/FunctionCallingModelSelect/index.tsx":"File path does not match include patterns."}

    History Assignment

    Tip

    You can @gru-agent and leave your feedback. TestGru will make adjustments based on your input

    Copy link
    Copy Markdown
    Contributor

    @sourcery-ai sourcery-ai bot left a comment

    Choose a reason for hiding this comment

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

    Hey - I've found 1 issue, and left some high level feedback:

    • Instead of casting option to unknown as ModelOption in the onChange handler, consider strongly typing your options (e.g. as ModelOption[] and/or using LobeSelect generics) so the provider field is type-safe without unsafe casts.
    • Now that ModelSelectProps extends Omit<LobeSelectProps, 'onChange' | 'value'>, double-check that all props being spread into <LobeSelect> are actually supported by LobeSelect and not legacy antd Select-only props to avoid passing through dead or misleading props.
    Prompt for AI Agents
    Please address the comments from this code review:
    
    ## Overall Comments
    - Instead of casting `option` to `unknown as ModelOption` in the `onChange` handler, consider strongly typing your `options` (e.g. as `ModelOption[]` and/or using `LobeSelect` generics) so the `provider` field is type-safe without unsafe casts.
    - Now that `ModelSelectProps` extends `Omit<LobeSelectProps, 'onChange' | 'value'>`, double-check that all props being spread into `<LobeSelect>` are actually supported by `LobeSelect` and not legacy antd `Select`-only props to avoid passing through dead or misleading props.
    
    ## Individual Comments
    
    ### Comment 1
    <location> `src/features/ChatInput/ActionBar/Search/FunctionCallingModelSelect/index.tsx:26-29` </location>
    <code_context>
     }
    
    -interface ModelSelectProps extends SelectProps {
    +interface ModelSelectProps extends Omit<LobeSelectProps, 'onChange' | 'value'> {
       onChange?: (props: WorkingModel) => void;
       showAbility?: boolean;
    </code_context>
    
    <issue_to_address>
    **suggestion (bug_risk):** Consider tightening the surface API by also omitting `options` from the inherited props.
    
    Because `ModelSelectProps` still inherits `options` from `LobeSelectProps` but then recomputes `options` internally, callers can pass their own `options` and violate assumptions in your `onChange`/filtering logic (e.g., missing `provider`). To avoid this, consider omitting `options` from the inherited props:
    
    ```ts
    interface ModelSelectProps extends Omit<LobeSelectProps, 'onChange' | 'value' | 'options'> {
      onChange?: (props: WorkingModel) => void;
      showAbility?: boolean;
      value?: WorkingModel;
    }
    ```
    
    This keeps model selection semantics in the public API while ensuring the internal option shape is controlled.
    
    ```suggestion
    interface ModelSelectProps extends Omit<LobeSelectProps, 'onChange' | 'value' | 'options'> {
      onChange?: (props: WorkingModel) => void;
      showAbility?: boolean;
      value?: WorkingModel;
    ```
    </issue_to_address>

    Sourcery is free for open source - if you like our reviews please consider sharing them ✨
    Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

    @codecov
    Copy link
    Copy Markdown

    codecov bot commented Jan 20, 2026

    Codecov Report

    ✅ All modified and coverable lines are covered by tests.
    ✅ Project coverage is 74.55%. Comparing base (70e1d99) to head (07aadc8).
    ⚠️ Report is 3 commits behind head on next.

    Additional details and impacted files
    @@            Coverage Diff            @@
    ##             next   #11664     +/-   ##
    =========================================
      Coverage   74.55%   74.55%             
    =========================================
      Files        1187     1187             
      Lines       93729    93729             
      Branches    10378    12845   +2467     
    =========================================
      Hits        69880    69880             
      Misses      23759    23759             
      Partials       90       90             
    Flag Coverage Δ
    app 67.60% <ø> (ø)
    database 93.28% <ø> (ø)
    packages/agent-runtime 89.18% <ø> (ø)
    packages/context-engine 85.29% <ø> (ø)
    packages/conversation-flow 92.41% <ø> (ø)
    packages/file-loaders 88.66% <ø> (ø)
    packages/memory-user-memory 69.75% <ø> (ø)
    packages/model-bank 100.00% <ø> (ø)
    packages/model-runtime 86.70% <ø> (ø)
    packages/prompts 79.33% <ø> (ø)
    packages/python-interpreter 92.90% <ø> (ø)
    packages/ssrf-safe-fetch 0.00% <ø> (ø)
    packages/utils 93.25% <ø> (ø)
    packages/web-crawler 95.62% <ø> (ø)

    Flags with carried forward coverage won't be shown. Click here to find out more.

    Components Coverage Δ
    Store 68.52% <ø> (ø)
    Services 50.84% <ø> (ø)
    Server 68.16% <ø> (ø)
    Libs 41.13% <ø> (ø)
    Utils 93.82% <ø> (ø)
    🚀 New features to boost your workflow:
    • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
    • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

    @Innei Innei merged commit ad51305 into next Jan 20, 2026
    33 of 34 checks passed
    @Innei Innei deleted the refactor/function-calling-model-select-to-lobe-select branch January 20, 2026 17:06
    @lobehubbot
    Copy link
    Copy Markdown
    Member

    ❤️ Great PR @Innei ❤️

    The growth of project is inseparable from user feedback and contribution, thanks for your contribution! If you are interesting with the lobehub developer community, please join our discord and then dm @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about the lobe-chat development or sharing ai newsletter around the world.

    lobehubbot pushed a commit that referenced this pull request Jan 20, 2026
    ## [Version&nbsp;2.0.0-next.327](v2.0.0-next.326...v2.0.0-next.327)
    <sup>Released on **2026-01-20**</sup>
    
    #### ♻ Code Refactoring
    
    - **model-select**: Migrate FunctionCallingModelSelect to LobeSelect.
    
    <br/>
    
    <details>
    <summary><kbd>Improvements and Fixes</kbd></summary>
    
    #### Code refactoring
    
    * **model-select**: Migrate FunctionCallingModelSelect to LobeSelect, closes [#11664](#11664) ([ad51305](ad51305))
    
    </details>
    
    <div align="right">
    
    [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
    
    </div>
    @lobehubbot
    Copy link
    Copy Markdown
    Member

    🎉 This PR is included in version 2.0.0-next.327 🎉

    The release is available on:

    Your semantic-release bot 📦🚀

    JamieStivala pushed a commit to jaworldwideorg/OneJA-Bot that referenced this pull request Jan 23, 2026
    ## [Version&nbsp;1.153.0](v1.152.0...v1.153.0)
    <sup>Released on **2026-01-23**</sup>
    
    #### ♻ Code Refactoring
    
    - **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable.
    - **model-select**: Migrate FunctionCallingModelSelect to LobeSelect.
    - **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling.
    - **userMemories**: Removed un-used code.
    - **misc**: Improve memory data with experience and identity, move vercel-react-best-practices skills to .agents directory.
    
    #### ✨ Features
    
    - **database**: Added user memory activity.
    - **desktop**: Add legacy local database detection and migration guidance.
    - **misc**: Add platform-aware download client menu option, add server version check for desktop app, remove Clerk authentication code, skill setting page and skill store, support agent group unpublish agents, support client tasks mode, update the sandbox preinstall libs in sys role.
    
    #### 🐛 Bug Fixes
    
    - **copilot**: Pass correct scope when creating new session in PageEditor.
    - **desktop**: Gracefully handle missing update manifest 404 errors.
    - **model-runtime**: Filter unsupported image types (SVG) before sending to vision models.
    - **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x.
    - **sidebar-drawer**: Fix drawer positioning and title style.
    - **misc**: Fix group broadcast trigger tool use, fix local system tools, fix memory schema, fix multi agent tasks issue, fix multi tasks no summary issue, fix scope issue, fix tool argument scape and improve multi task run, fixed the sandbox tools call when error should use right callback, improve e2e server and complete i18n resources, slove the agent group editor not focus in editdata area, slove the agents header switch agents the lobeAI not show problem, sloved the old removeSessionTopics not work, TypewriterEffect not refreshing on language change, updata cron job ui & fixed commnuity pagenation goto error, update the agentbuilder tools not always use humanIntervention.
    
    #### 💄 Styles
    
    - **misc**: Improve auto scroll and group profile, update og, update share style.
    
    <br/>
    
    <details>
    <summary><kbd>Improvements and Fixes</kbd></summary>
    
    #### Code refactoring
    
    * **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable, closes [lobehub#11658](https://github.com/jaworldwideorg/OneJA-Bot/issues/11658) ([c0f9875](c0f9875))
    * **model-select**: Migrate FunctionCallingModelSelect to LobeSelect, closes [lobehub#11664](https://github.com/jaworldwideorg/OneJA-Bot/issues/11664) ([ad51305](ad51305))
    * **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling, closes [lobehub#11663](https://github.com/jaworldwideorg/OneJA-Bot/issues/11663) ([c9d9dff](c9d9dff))
    * **userMemories**: Removed un-used code, closes [lobehub#11713](https://github.com/jaworldwideorg/OneJA-Bot/issues/11713) ([89750fc](89750fc))
    * **misc**: Improve memory data with experience and identity, closes [lobehub#11717](https://github.com/jaworldwideorg/OneJA-Bot/issues/11717) ([bdb3eb4](bdb3eb4))
    * **misc**: Move vercel-react-best-practices skills to .agents directory, closes [lobehub#11703](https://github.com/jaworldwideorg/OneJA-Bot/issues/11703) ([6df7731](6df7731))
    
    #### What's improved
    
    * **database**: Added user memory activity, closes [lobehub#11680](https://github.com/jaworldwideorg/OneJA-Bot/issues/11680) ([0160fbd](0160fbd))
    * **desktop**: Add legacy local database detection and migration guidance, closes [lobehub#11682](https://github.com/jaworldwideorg/OneJA-Bot/issues/11682) ([5664b84](5664b84))
    * **misc**: Add platform-aware download client menu option, closes [lobehub#11676](https://github.com/jaworldwideorg/OneJA-Bot/issues/11676) ([55abddc](55abddc))
    * **misc**: Add server version check for desktop app, closes [lobehub#11710](https://github.com/jaworldwideorg/OneJA-Bot/issues/11710) ([0cf2723](0cf2723))
    * **misc**: Remove Clerk authentication code, closes [lobehub#11711](https://github.com/jaworldwideorg/OneJA-Bot/issues/11711) ([395595a](395595a))
    * **misc**: Skill setting page and skill store, closes [lobehub#11665](https://github.com/jaworldwideorg/OneJA-Bot/issues/11665) ([d8c0c26](d8c0c26))
    * **misc**: Support agent group unpublish agents, closes [lobehub#11687](https://github.com/jaworldwideorg/OneJA-Bot/issues/11687) ([4e060be](4e060be))
    * **misc**: Support client tasks mode, closes [lobehub#11666](https://github.com/jaworldwideorg/OneJA-Bot/issues/11666) ([98cf57b](98cf57b))
    * **misc**: Update the sandbox preinstall libs in sys role, closes [lobehub#11688](https://github.com/jaworldwideorg/OneJA-Bot/issues/11688) ([404c577](404c577))
    
    #### What's fixed
    
    * **copilot**: Pass correct scope when creating new session in PageEditor, closes [lobehub#11714](https://github.com/jaworldwideorg/OneJA-Bot/issues/11714) ([0259270](0259270))
    * **desktop**: Gracefully handle missing update manifest 404 errors, closes [lobehub#11625](https://github.com/jaworldwideorg/OneJA-Bot/issues/11625) ([13e95b9](13e95b9))
    * **model-runtime**: Filter unsupported image types (SVG) before sending to vision models, closes [lobehub#11698](https://github.com/jaworldwideorg/OneJA-Bot/issues/11698) ([c0c99a7](c0c99a7))
    * **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x, closes [lobehub#11686](https://github.com/jaworldwideorg/OneJA-Bot/issues/11686) ([2b620df](2b620df))
    * **sidebar-drawer**: Fix drawer positioning and title style, closes [lobehub#11655](https://github.com/jaworldwideorg/OneJA-Bot/issues/11655) ([cf5320e](cf5320e))
    * **misc**: Fix group broadcast trigger tool use, closes [lobehub#11646](https://github.com/jaworldwideorg/OneJA-Bot/issues/11646) ([831a9b3](831a9b3))
    * **misc**: Fix local system tools, closes [lobehub#11702](https://github.com/jaworldwideorg/OneJA-Bot/issues/11702) ([6548fc7](6548fc7))
    * **misc**: Fix memory schema, closes [lobehub#11645](https://github.com/jaworldwideorg/OneJA-Bot/issues/11645) ([3baf780](3baf780))
    * **misc**: Fix multi agent tasks issue, closes [lobehub#11672](https://github.com/jaworldwideorg/OneJA-Bot/issues/11672) ([9de773b](9de773b))
    * **misc**: Fix multi tasks no summary issue, closes [lobehub#11685](https://github.com/jaworldwideorg/OneJA-Bot/issues/11685) ([26ce317](26ce317))
    * **misc**: Fix scope issue, closes [lobehub#11719](https://github.com/jaworldwideorg/OneJA-Bot/issues/11719) ([17adde8](17adde8))
    * **misc**: Fix tool argument scape and improve multi task run, closes [lobehub#11691](https://github.com/jaworldwideorg/OneJA-Bot/issues/11691) ([b13bb8a](b13bb8a))
    * **misc**: Fixed the sandbox tools call when error should use right callback, closes [lobehub#11721](https://github.com/jaworldwideorg/OneJA-Bot/issues/11721) ([e8fce68](e8fce68))
    * **misc**: Improve e2e server and complete i18n resources, closes [lobehub#11678](https://github.com/jaworldwideorg/OneJA-Bot/issues/11678) ([d450dd9](d450dd9))
    * **misc**: Slove the agent group editor not focus in editdata area, closes [lobehub#11677](https://github.com/jaworldwideorg/OneJA-Bot/issues/11677) ([9ac84e6](9ac84e6))
    * **misc**: Slove the agents header switch agents the lobeAI not show problem, closes [lobehub#11726](https://github.com/jaworldwideorg/OneJA-Bot/issues/11726) ([f45f508](f45f508))
    * **misc**: Sloved the old removeSessionTopics not work, closes [lobehub#11671](https://github.com/jaworldwideorg/OneJA-Bot/issues/11671) ([06d41e5](06d41e5))
    * **misc**: TypewriterEffect not refreshing on language change, closes [lobehub#11657](https://github.com/jaworldwideorg/OneJA-Bot/issues/11657) ([ba30f46](ba30f46))
    * **misc**: Updata cron job ui & fixed commnuity pagenation goto error, closes [lobehub#11700](https://github.com/jaworldwideorg/OneJA-Bot/issues/11700) ([42ad2a0](42ad2a0))
    * **misc**: Update the agentbuilder tools not always use humanIntervention, closes [lobehub#11696](https://github.com/jaworldwideorg/OneJA-Bot/issues/11696) ([0d3017b](0d3017b))
    
    #### Styles
    
    * **misc**: Improve auto scroll and group profile, closes [lobehub#11725](https://github.com/jaworldwideorg/OneJA-Bot/issues/11725) ([550acc2](550acc2))
    * **misc**: Update og, closes [lobehub#11709](https://github.com/jaworldwideorg/OneJA-Bot/issues/11709) ([01cf4e4](01cf4e4))
    * **misc**: Update share style, closes [lobehub#11716](https://github.com/jaworldwideorg/OneJA-Bot/issues/11716) ([3c70dfa](3c70dfa))
    
    </details>
    
    <div align="right">
    
    [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
    
    </div>
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Labels

    released on @next size:S This PR changes 10-29 lines, ignoring generated files.

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    2 participants