Let's assume you have to write something yourself. I don't know of any middleware targeted towards 2D side-scrollers but someone may correct me.
I haven't done anything like this before, but it's an interesting intellectual exercise so here's my first thoughts. For simplicity I've talked about only avoiding bullets, not shooting at enemies.
Most side-scrollers are deterministic as to when enemies come on screen, their on-screen path and the bullets they produce. Players tend to learn how to play a level through muscle memory, which is strengthened by repetition, but at an immediate level they're reacting to what's on-screen now.
Of course we could just record human input and replay it (with several different recordings for different play-styles), but that's extremely sensitive to level design changes.
A simple steering-behaviour system could keep the AI away from bullets, maybe peeking at the type of bullet to figure out its future positions for predictive avoidance. For lots of bullets on small systems this may become expensive.
However with this approach the AI could very quickly get stuck in a dead end, with no chance of escape. So we need something above the on-screen reactions, something to replicate the muscle-memory humans use.
If we could get our AI to repeatedly play each level, recording some kind of data as it goes, it could pipe this data into the steering behaviours to avoid dead-ends. Each play-through improves the data and lets our AI make better decisions. But what form does this data take?
One immediate idea is a heat or threat map covering the whole screen, for every frame of the level. Sort of a threat movie. You could imagine it as a movie of the level, with each pixel coloured as to its danger to the AI. Spaces completely enveloped by bullets would be coloured in as very dangerous. Then you could do some post-processing to bleed danger back though time, so the AI could see the problem coming before the area is enveloped.
With this data, you could replace the steering behaviours with a kind of 4-dimensional flood-fill that tried to find the largest safest place on the screen, with each step looking at the future frames to work out a safe path.
If a pixel for every frame for every level sounds data-intensive, you could make the pixels quite blocky - I imagine you don't need resolution below the size of the hitbox of the AI's avatar, and could probably get away with blocks a bit bigger than that. You could also record only two or three frames a second to further reduce data size.
The personalities come from the real-time processing of the threat movie. With steering behaviours, you could have scardy-cat AI that prefer large distances to any threat, or bravado AI that look for pickups despite the danger. Slow AI, that flood-fill the threat movie assuming a lower top speed, which may find different routes to a faster AI, etc.
If it sounds like a lot of work, that's because it probably is, but it also sounds like a lot of fun. :)