MINNEAPOLIS -- The Kansas City Royals' shaky bullpen needed a game like this.
The unit, which came into the game with a 1-7 record and a 6.23 ERA, came through with three innings of one-hit, scoreless relief, and the Royals held on for a 4-3 win over the Twins on Wednesday.
David DeJesus and Mike Sweeney homered for Kansas City, which sent Minnesota to its first four-game losing streak since last June.
"We've been playing some decent ball, but we can't finish games," Sweeney said. "Tonight, our bullpen did a great job, especially (Joakim) Soria coming in and closing the door."
Brandon Duckworth, David Riske, Jimmy Gobble and Soria relieved Odalis Perez (2-2), who allowed three runs and five hits in six-plus innings to beat the Twins for the second time in six days. Soria got five outs for his third save in three chances.
"Our bullpen's been a little shoddy, at best," Royals manager Buddy Bell said. "We're still trying to piece it all together and figure it all out. We used a few more people than we wanted to, but our bullpen did a pretty nice job tonight."
"If you can get (Joe) Mauer, (Justin) Morneau and (Michael) Cuddyer out, it makes it easier for any pitcher to go deep into the game," said Perez, who held the trio hitless in 10 at-bats. "I was just trying to hit my spots and get those guys to hit ground balls."
Kansas City is 3-1 this season against the defending AL Central champions.
Soria relieved with two on in the eighth, struck out Michael Cuddyer, then picked off Alexi Casilla at second.
"He got caught out there in no-man's land and got picked off," Twins manager Ron Gardenhire said.
Minnesota had not lost four straight since last June 3-7 against Oakland and Seattle. The Twins are 6-7 at the Metrodome, where they had the major leagues' best home record (54-27) last season.
"All we can do is keep playing, stay together and keep rooting for each other," Gardenhire said. "People jump on and jump off but we have to stay positive inside this locker room."
Twins starter Sidney Ponson (1-3) gave up four runs and seven hits in six innings, lowering his ERA from 9.39 to 8.44. Ponson, booed after the homers, has allowed 44 runners in 21 1/3 innings.
"Two bad pitches put us four runs down," Ponson said. "Right now I'm not doing my job and I put these guys in a hole. I know things will start to happen for me soon. I hope it's soon."
Sweeney hit a two-run homer in the first, but Torii Hunter hit a solo shot in the bottom half, extending his hitting streak to 12 games. DeJesus hit a two-run homer in the fifth for a 4-1 lead.
Perez loaded the bases with no outs in the sixth, but induced Cuddyer to hit into a run-scoring double-play grounder and retired Morneau on a grounder.
Jason Kubel hit an RBI grounder in the seventh.
Twins LF Rondell White, on the DL since April 10 because of a strained right calf, heard a pop in the leg during running drills before Wednesday's game. White had hoped to return to the lineup soon, but will be re-evaluated. ... The Twins have doubled in 16 straight games. ... The Royals' Jason LaRue is 1-for-15 in his last six games.