I'm currently working on a fighting game and this is how I have my AI set up.
For enemy defense:
Enemy has a "chance to block number" that gets checked every time the player attacks. If the check passes the enemy blocks. I modify this number for certain situations. For example, immediately after the player parries an attack, the chance to block for the enemy becomes zero, this allows a "free" counter attack. Another example is setting the chance to block to 100 after the player performs 2 identical attacks to prevent attack spamming. The next attack that is performed will be blocked. For more complexity, you could have a chance to block number for each type of player attack and vary those for different situations.
For enemy offense:
This is still a work in progress for me. I wanted the enemies to be reactive to player commands but I also wanted them to not sit and wait for the player to do something. I gave each enemy an aggressiveness number that I vary based on certain situations (health remaining, consecutive hits by player). I use this number to determine the length of time before an enemy attacks. Other than that, I have the enemy react to player attacks. If they block an attack they have a chance to immediately counter attack, if an attack connects they have a chance to perform the same attack again.
For enemy "special" attacks, I have a few situations where they are performed. The first is simply a random timer (with a minimum time) that resets after they use a special. The next is player/enemy health thresholds. And the third is consecutive hits by the player.
My system isn't at all perfect and I literally did no research on it at all, its just what I came up with. Hopefully, it gives you some ideas.