Oh, I clearly misunderstood your use case, sorry!
I thought the kernel would be the dotted line in your figure, but I’ve apparently didn’t read the indices carefully enough.
So basically you have a weight for each input value. Both of my approaches use some kind of weight sharing and are not doing what you are trying to achieve.
In that case you could use nn.Conv1 with a kernel size of 4 and groups=in_channels, where in_channels is now 8.
From the docs:

At groups= in_channels , each input channel is convolved with its own set of filters (of size ⌊out_channels / in_channels⌋).

input_concat = input_concat.permute(0, 2, 1)
print(input_concat.shape)  # [1, 8, 4]
conv = nn.Conv1d(
    in_channels=8,
    out_channels=8,
    kernel_size=4,
    padding=0,
    groups=8
)
out = conv(input_concat)