diff --git a/dwave/system/composites/embedding.py b/dwave/system/composites/embedding.py
index 060906b..5c4e60d 100644
--- a/dwave/system/composites/embedding.py
+++ b/dwave/system/composites/embedding.py
@@ -235,7 +235,7 @@ class EmbeddingComposite(dimod.ComposedSampler):
 
         warninghandler = WarningHandler(warnings)
 
-        warninghandler.chain_strength(bqm, chain_strength, embedding)
+        warninghandler.chain_strength(bqm, chain_strength)
         warninghandler.chain_length(embedding)
 
         if bqm and not embedding:
diff --git a/dwave/system/samplers/leap_hybrid_sampler.py b/dwave/system/samplers/leap_hybrid_sampler.py
index 860752d..8e56430 100644
--- a/dwave/system/samplers/leap_hybrid_sampler.py
+++ b/dwave/system/samplers/leap_hybrid_sampler.py
@@ -87,6 +87,9 @@ class LeapHybridSampler(dimod.Sampler):
 
     def __init__(self, solver=None, connection_close=True, **config):
 
+        # always use the base class (QPU client filters-out the hybrid solvers)
+        config['client'] = 'base'
+
         if solver is None:
             solver = {}
 
@@ -94,12 +97,13 @@ class LeapHybridSampler(dimod.Sampler):
             if solver.setdefault('category', 'hybrid') != 'hybrid':
                 raise ValueError("the only 'category' this sampler supports is 'hybrid'")
 
-        self.client = Client.from_config(solver=solver, connection_close=connection_close, **config)
+        self.client = Client.from_config(
+            solver=solver, connection_close=connection_close, **config)
+
         self.solver = self.client.get_solver()
 
         # For explicitly named solvers:
-        if ('category' not in self.properties.keys()) or (
-                      not self.properties['category'] == 'hybrid'):
+        if self.properties.get('category') != 'hybrid':
             raise ValueError("selected solver is not a hybrid solver.")
 
     @property
diff --git a/dwave/system/warnings.py b/dwave/system/warnings.py
index e646ce3..fac3baf 100644
--- a/dwave/system/warnings.py
+++ b/dwave/system/warnings.py
@@ -174,18 +174,12 @@ class WarningHandler(object):
                                      sample_index=row),
                            )
 
-    def chain_strength(self, bqm, chain_strength, embedding=None):
+    def chain_strength(self, bqm, chain_strength):
         """Issues a warning when any quadratic biases are greater than the given
         chain strength."""
         if as_action(self.action) is IGNORE:
             return
 
-        if embedding is not None:
-            if not embedding or all(len(chain) <= 1 for chain in embedding.values()):
-                # the chains are all length 1 so don't have to worry about
-                # strength
-                return
-
         interactions = [uv for uv, bias in bqm.quadratic.items()
                         if abs(bias) >= chain_strength]
 

LeapHybridSampler fails on default QPU-only config
Since `LeapHybridSampler` instantiates the cloud client instance based on user config, but does not override the client classname setting, if `client=qpu` is set in the `dwave.conf`, or in the environment variable, the instantiation will fail because a hybrid solver will not be found with a QPU client.
diff --git a/tests/test_embedding_composite.py b/tests/test_embedding_composite.py
index bec8048..b00a740 100644
--- a/tests/test_embedding_composite.py
+++ b/tests/test_embedding_composite.py
@@ -293,24 +293,6 @@ class TestEmbeddingComposite(unittest.TestCase):
     def test_warning_chain_strength(self):
         G = dnx.chimera_graph(12)
 
-        sampler = EmbeddingComposite(
-            dimod.StructureComposite(dimod.RandomSampler(), G.nodes, G.edges))
-
-        # use a triangle so there is a chain of length 2
-        J = {(0, 1): 100, (1, 2): 100, (0, 2): 1}
-
-        ss = sampler.sample_ising({}, J, warnings='SAVE')
-        self.assertIn('warnings', ss.info)
-
-        count = 0
-        for warning in ss.info['warnings']:
-            if issubclass(warning['type'], ChainStrengthWarning):
-                count += 1
-        self.assertEqual(count, 1)
-
-    def test_warnings_chain_strength_len1(self):
-        G = dnx.chimera_graph(12)
-
         sampler = EmbeddingComposite(
             dimod.StructureComposite(dimod.RandomSampler(), G.nodes, G.edges))
 
@@ -319,12 +301,11 @@ class TestEmbeddingComposite(unittest.TestCase):
         ss = sampler.sample_ising({}, J, warnings='SAVE')
         self.assertIn('warnings', ss.info)
 
-        # should have no chain length
         count = 0
         for warning in ss.info['warnings']:
             if issubclass(warning['type'], ChainStrengthWarning):
                 count += 1
-        self.assertEqual(count, 0)
+        self.assertEqual(count, 1)
 
     def test_warnings_as_class_variable(self):
         G = dnx.chimera_graph(12)
diff --git a/tests/test_leaphybridsolver.py b/tests/test_leaphybridsolver.py
index 31644cb..cdb39cb 100644
--- a/tests/test_leaphybridsolver.py
+++ b/tests/test_leaphybridsolver.py
@@ -45,6 +45,9 @@ class MockClient:
         if isinstance(self.args['solver'], str) and self.args['solver'] == 'not_hybrid_solver':
             return MockBadLeapHybridSolver()
 
+        if self.args.get('client', 'base') not in ['base', 'hybrid']:
+            return MockBadLeapHybridSolver()
+
         return MockLeapHybridSolver()
 
 class TestLeapHybridSampler(unittest.TestCase):
@@ -57,14 +60,18 @@ class TestLeapHybridSampler(unittest.TestCase):
         # Default call
         mock_client.reset_mock()
         LeapHybridSampler()
-        mock_client.from_config.assert_called_once_with(connection_close=True,
-                                                 solver={'category': 'hybrid'})
+        mock_client.from_config.assert_called_once_with(
+            client='base', connection_close=True, solver={'category': 'hybrid'})
+
+        # Non-hybrid client setting is ignored?
+        mock_client.reset_mock()
+        LeapHybridSampler(client='qpu')
 
         # Explicitly set category to hybrid
         mock_client.reset_mock()
         LeapHybridSampler(solver={'category': 'hybrid'})
-        mock_client.from_config.assert_called_once_with(connection_close=True,
-                                                 solver={'category': 'hybrid'})
+        mock_client.from_config.assert_called_once_with(
+            client='base', connection_close=True, solver={'category': 'hybrid'})
 
         # Explicitly set category to not hybrid
         with self.assertRaises(ValueError):
@@ -73,26 +80,25 @@ class TestLeapHybridSampler(unittest.TestCase):
         # Set irrelevant paremeters
         mock_client.reset_mock()
         LeapHybridSampler(solver={'qpu': True})
-        mock_client.from_config.assert_called_once_with(connection_close=True,
-                                                 solver={'qpu': True, 'category': 'hybrid'})
+        mock_client.from_config.assert_called_once_with(
+            client='base', connection_close=True, solver={'qpu': True, 'category': 'hybrid'})
 
         mock_client.reset_mock()
         LeapHybridSampler(solver={'qpu': True, 'anneal_schedule' :False})
-        mock_client.from_config.assert_called_once_with(connection_close=True,
-                                                 solver={'anneal_schedule' :False,
-                                                         'qpu': True,
-                                                         'category': 'hybrid'})
+        mock_client.from_config.assert_called_once_with(
+            client='base', connection_close=True,
+            solver={'anneal_schedule': False, 'qpu': True, 'category': 'hybrid'})
 
         # Named solver: hybrid
         mock_client.reset_mock()
         LeapHybridSampler(solver="hybrid_solver")
-        mock_client.from_config.assert_called_once_with(connection_close=True,
-                                                 solver="hybrid_solver")
+        mock_client.from_config.assert_called_once_with(
+            client='base', connection_close=True, solver="hybrid_solver")
 
         mock_client.reset_mock()
         LeapHybridSampler(connection_close=False, solver="hybrid_solver")
-        mock_client.from_config.assert_called_once_with(connection_close=False,
-                                                 solver="hybrid_solver")
+        mock_client.from_config.assert_called_once_with(
+            client='base', connection_close=False, solver="hybrid_solver")
 
         # Named solver: non-hybrid
         with self.assertRaises(ValueError):
@@ -101,13 +107,13 @@ class TestLeapHybridSampler(unittest.TestCase):
         # Set connection_close to False
         mock_client.reset_mock()
         LeapHybridSampler(connection_close=False)
-        mock_client.from_config.assert_called_once_with(connection_close=False,
-                                                 solver={'category': 'hybrid'})
+        mock_client.from_config.assert_called_once_with(
+            client='base', connection_close=False, solver={'category': 'hybrid'})
 
         mock_client.reset_mock()
         LeapHybridSampler(connection_close=False, solver={'category': 'hybrid'})
-        mock_client.from_config.assert_called_once_with(connection_close=False,
-                                                 solver={'category': 'hybrid'})
+        mock_client.from_config.assert_called_once_with(
+            client='base', connection_close=False, solver={'category': 'hybrid'})
 
     @mock.patch('dwave.system.samplers.leap_hybrid_sampler.Client')
     def test_sample_bqm(self, mock_client):

pip install -e .[drivers]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio pytest
3.7
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi @ file:///croot/certifi_1671487769961/work/certifi
charset-normalizer==3.4.1
click==8.1.8
codecov==2.1.13
coverage==7.2.7
decorator==4.4.2
dimod==0.9.0
dwave-cloud-client==0.7.1
dwave-drivers==0.4.4
dwave-networkx==0.8.4
-e git+https://github.com/dwavesystems/dwave-system.git@d0fd4c0163e984dfd2adae43f7bc7ee7f4edc829#egg=dwave_system
dwave-tabu==0.2.2
exceptiongroup==1.2.2
execnet==2.0.2
homebase==1.0.1
idna==3.10
importlib-metadata==6.7.0
iniconfig==2.0.0
minorminer==0.1.9
mock==2.0.0
networkx==2.6.3
numpy==1.18.0
packaging==24.0
pbr==6.1.1
plucky==0.4.3
pluggy==1.2.0
PySocks==1.7.1
pytest==7.4.4
pytest-asyncio==0.21.2
pytest-cov==4.1.0
pytest-mock==3.11.1
pytest-xdist==3.5.0
python-dateutil==2.9.0.post0
requests==2.31.0
scipy==1.7.3
six==1.11.0
tomli==2.0.1
typing_extensions==4.7.1
urllib3==2.0.7
zipp==3.15.0

name: dwave-system
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - charset-normalizer==3.4.1
      - click==8.1.8
      - codecov==2.1.13
      - coverage==7.2.7
      - decorator==4.4.2
      - dimod==0.9.0
      - dwave-cloud-client==0.7.1
      - dwave-drivers==0.4.4
      - dwave-networkx==0.8.4
      - dwave-tabu==0.2.2
      - exceptiongroup==1.2.2
      - execnet==2.0.2
      - homebase==1.0.1
      - idna==3.10
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - minorminer==0.1.9
      - mock==2.0.0
      - networkx==2.6.3
      - numpy==1.18.0
      - packaging==24.0
      - pbr==6.1.1
      - plucky==0.4.3
      - pluggy==1.2.0
      - pysocks==1.7.1
      - pytest==7.4.4
      - pytest-asyncio==0.21.2
      - pytest-cov==4.1.0
      - pytest-mock==3.11.1
      - pytest-xdist==3.5.0
      - python-dateutil==2.9.0.post0
      - requests==2.31.0
      - scipy==1.7.3
      - six==1.11.0
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - urllib3==2.0.7
      - zipp==3.15.0
prefix: /opt/conda/envs/dwave-system

tests/test_embedding_composite.py::TestEmbeddingComposite::test_warning_chain_strength tests/test_leaphybridsolver.py::TestLeapHybridSampler::test_solver_init
tests/test_embedding_composite.py::TestEmbeddingComposite::test_chain_break_method_customization tests/test_embedding_composite.py::TestEmbeddingComposite::test_embedding_parameters_construction tests/test_embedding_composite.py::TestEmbeddingComposite::test_embedding_parameters_sample tests/test_embedding_composite.py::TestEmbeddingComposite::test_find_embedding_kwarg tests/test_embedding_composite.py::TestEmbeddingComposite::test_instantiation_smoketest tests/test_embedding_composite.py::TestEmbeddingComposite::test_intermediate_composites tests/test_embedding_composite.py::TestEmbeddingComposite::test_max_cut tests/test_embedding_composite.py::TestEmbeddingComposite::test_return_embedding tests/test_embedding_composite.py::TestEmbeddingComposite::test_return_embedding_as_class_variable tests/test_embedding_composite.py::TestEmbeddingComposite::test_sample_ising tests/test_embedding_composite.py::TestEmbeddingComposite::test_sample_ising_unstructured_not_integer_labelled tests/test_embedding_composite.py::TestEmbeddingComposite::test_sample_qubo tests/test_embedding_composite.py::TestEmbeddingComposite::test_scale_aware_scale_composite tests/test_embedding_composite.py::TestEmbeddingComposite::test_singleton_variables tests/test_embedding_composite.py::TestEmbeddingComposite::test_warnings tests/test_embedding_composite.py::TestEmbeddingComposite::test_warnings_as_class_variable tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_adjacency tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_chain_break_method_customization tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_instantiation_empty_adjacency tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_instantiation_empty_embedding tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_instantiation_triangle tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_keyer tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_minimize_energy_chain_break_method tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_sample_bqm_triangle tests/test_embedding_composite.py::TestFixedEmbeddingComposite::test_without_embedding_and_adjacency tests/test_embedding_composite.py::TestLazyFixedEmbeddingComposite::test_chain_break_method_customization tests/test_embedding_composite.py::TestLazyFixedEmbeddingComposite::test_ising tests/test_embedding_composite.py::TestLazyFixedEmbeddingComposite::test_qubo tests/test_embedding_composite.py::TestLazyFixedEmbeddingComposite::test_same_embedding tests/test_embedding_composite.py::TestLazyFixedEmbeddingComposite::test_sample_instantiation tests/test_embedding_composite.py::TestLazyFixedEmbeddingComposite::test_sparse_qubo tests/test_embedding_composite.py::TestLazyEmbeddingComposite::test_deprecation_raise tests/test_embedding_composite.py::TestLazyEmbeddingComposite::test_ising_sample tests/test_embedding_composite.py::TestAutoEmbeddingComposite::test_broken_find_embedding tests/test_embedding_composite.py::TestAutoEmbeddingComposite::test_smoke tests/test_embedding_composite.py::TestAutoEmbeddingComposite::test_unstructured tests/test_leaphybridsolver.py::TestLeapHybridSampler::test_sample_bqm tests/test_leaphybridsolver.py::TestLeapHybridSampler::test_sample_ising_variables tests/test_leaphybridsolver.py::TestLeapHybridSampler::test_sample_qubo_variables
dwave/system/samplers/leap_hybrid_sampler.py dwave/system/composites/embedding.py dwave/system/warnings.py
dwave/system/samplers/leap_hybrid_sampler.py dwave/system/composites/embedding.py dwave/system/warnings.py