diff --git a/lib/modules/manager/pip-compile/common.ts b/lib/modules/manager/pip-compile/common.ts
index cef57dee2b9c3abe11cafd405271e4dba3e3b605..1847e10af939881d1c97b17adf9898ad1ed4cae0 100644
--- a/lib/modules/manager/pip-compile/common.ts
+++ b/lib/modules/manager/pip-compile/common.ts
@@ -7,11 +7,7 @@ import { ensureCacheDir } from '../../../util/fs';
 import * as hostRules from '../../../util/host-rules';
 import { regEx } from '../../../util/regex';
 import type { PackageFileContent, UpdateArtifactsConfig } from '../types';
-import type {
-  DependencyBetweenFiles,
-  GetRegistryUrlVarsResult,
-  PipCompileArgs,
-} from './types';
+import type { GetRegistryUrlVarsResult, PipCompileArgs } from './types';
 
 export function getPythonConstraint(
   config: UpdateArtifactsConfig,
@@ -217,24 +213,6 @@ function throwForUnknownOption(arg: string): void {
   throw new Error(`Option ${arg} not supported (yet)`);
 }
 
-export function generateMermaidGraph(
-  depsBetweenFiles: DependencyBetweenFiles[],
-  lockFileArgs: Map<string, PipCompileArgs>,
-): string {
-  const lockFiles = [];
-  for (const lockFile of lockFileArgs.keys()) {
-    // TODO: add extra args to the lock file ${extraArgs ? '\n' + extraArgs : ''}
-    // const extraArgs = pipCompileArgs.extra
-    //   ?.map((v) => '--extra=' + v)
-    //   .join('\n');
-    lockFiles.push(`  ${lockFile}[[${lockFile}]]`);
-  }
-  const edges = depsBetweenFiles.map(({ sourceFile, outputFile, type }) => {
-    return `  ${sourceFile} -${type === 'constraint' ? '.' : ''}-> ${outputFile}`;
-  });
-  return `graph TD\n${lockFiles.join('\n')}\n${edges.join('\n')}`;
-}
-
 function buildRegistryUrl(url: string): URL | null {
   try {
     const ret = new URL(url);
diff --git a/lib/modules/manager/pip-compile/extract.ts b/lib/modules/manager/pip-compile/extract.ts
index 535e888b8fa6d72d6ab137d779e2bb8cda38ad8d..c66750ac66461da86e242d7b5b691898f83e14ef 100644
--- a/lib/modules/manager/pip-compile/extract.ts
+++ b/lib/modules/manager/pip-compile/extract.ts
@@ -3,12 +3,13 @@ import { readLocalFile } from '../../../util/fs';
 import { extractPackageFile as extractRequirementsFile } from '../pip_requirements/extract';
 import { extractPackageFile as extractSetupPyFile } from '../pip_setup';
 import type { ExtractConfig, PackageFile, PackageFileContent } from '../types';
-import { extractHeaderCommand, generateMermaidGraph } from './common';
+import { extractHeaderCommand } from './common';
 import type {
   DependencyBetweenFiles,
   PipCompileArgs,
   SupportedManagers,
 } from './types';
+import { generateMermaidGraph } from './utils';
 
 function matchManager(filename: string): SupportedManagers | 'unknown' {
   if (filename.endsWith('setup.py')) {
diff --git a/lib/modules/manager/pip-compile/utils.ts b/lib/modules/manager/pip-compile/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..347fe4f24dc0f29586e9fbb46e06031a113c2a27
--- /dev/null
+++ b/lib/modules/manager/pip-compile/utils.ts
@@ -0,0 +1,19 @@
+import type { DependencyBetweenFiles, PipCompileArgs } from './types';
+
+export function generateMermaidGraph(
+  depsBetweenFiles: DependencyBetweenFiles[],
+  lockFileArgs: Map<string, PipCompileArgs>,
+): string {
+  const lockFiles = [];
+  for (const lockFile of lockFileArgs.keys()) {
+    // TODO: add extra args to the lock file ${extraArgs ? '\n' + extraArgs : ''}
+    // const extraArgs = pipCompileArgs.extra
+    //   ?.map((v) => '--extra=' + v)
+    //   .join('\n');
+    lockFiles.push(`  ${lockFile}[[${lockFile}]]`);
+  }
+  const edges = depsBetweenFiles.map(({ sourceFile, outputFile, type }) => {
+    return `  ${sourceFile} -${type === 'constraint' ? '.' : ''}-> ${outputFile}`;
+  });
+  return `graph TD\n${lockFiles.join('\n')}\n${edges.join('\n')}`;
+}