KANSAS CITY, Mo. — Danny Duffy has gone from starting the season in the Kansas City Royals' bullpen to leading the American League with a 2.82 ERA.

Duffy pitched his first complete game to win his eighth straight decision, Cheslor Cuthbert had two hits and drove in a run and the Royals beat the Chicago White Sox 2-1 on Thursday night.

Duffy (9-1) limited the White Sox to seven singles, struck out six and walked none. The left-hander has not lost since June 6 and has a 1.73 ERA in his past five starts. Duffy threw 98 pitches, 71 for strikes.

"I'm stoked," Duffy said on getting his first complete game. "I've gotten pretty close a couple of times this year. When I went eight (innings) the first time (teammate Kris) Medlen told me, 'You should expect that every night.'

"This is a cool milestone. I'm just worried about getting outs and keeping my team in the game."

Duffy moved into the rotation on May 15 and has thrown eight or more innings in four starts.

"For him to get through nine innings under 100 pitches is just a phenomenal effort," Royals manager Ned Yost said.

White Sox slugger Todd Frazier, who went 0 for 4 and struck out twice, said "deception" is what makes Duffy good.

"Deception on his off-speed pitches," Frazier said. "It looks like fastballs and then, the last second, you see it and it's already by you. He had me all day, just one of those games where he had me, not necessarily guessing but he's throwing one pitch somewhere I wasn't looking for, get the strike and the way it goes."

Cuthbert, whose triple scored Jarrod Dyson in the sixth, is second among AL rookies with 93 hits, 24 multihit games and a .303 batting average. Dyson was initially called out trying to steal second, but the Royals appealed and the call was overturned.

Cuthbert scored the go-ahead run on Eric Hosmer's single off Carson Fulmer (0-2). Fulmer has an 8.47 ERA in eight relief appearances.

Chicago's Jason Coats, recalled Tuesday from Triple-A Charlotte, singled home Tim Anderson with two outs in the second for his first major league RBI.

White Sox right-hander Miguel Gonzalez left after 21 pitches with a right groin strain. After Salvador Perez fouled off a full-count pitch leading off the second, White Sox manager Robin Ventura and trainer Herm Schneider came to the mound and led Gonzalez off.

Gonzalez may have to go on the disabled list.

"I had it last year, same thing," Gonazlez said. "They put me on the DL for 15 days. I came back, I was fine. I was pitching good. Nothing different. It felt about the same as it did last year. So, I'm not worried about it."

MORALES DROPS APPEAL

Royals DH Kendrys Morales served his one-game suspension after dropping his appeal. Morales was punished by Major League Baseball for returning to the field Aug. 2 in Tampa Bay in the ninth inning after being ejected.

TO BE DETERMINED

The Royals have not decided who will start Saturday against the Twins. RHP Dillon Gee was scheduled for that start but threw 32 pitches in two innings Wednesday in a 14-inning victory over the White Sox. While Yost said Gee is "still in the mix" to start, that it is "more murky" after having to use him for more than an inning Wednesday.

VOTE OF CONFIDENCE

Ventura said he is sticking with David Robertson as his closer, although he blew saves in the first two games of this series and six this season. "At some point it's going to turn for me and hopefully I'll get on a roll," Robertson said. "Right now I've definitely been doing a poor job out there and I need to pick it up."

TRAINER'S ROOM

Royals: RHP Wade Davis (flexor strain) threw 75 feet off a flat surface. "He's getting close, probably in the next day or so," Yost said of throwing off the mound.

UP NEXT

White Sox: LHP Carlos Rodon (2-8, 4.49) seeks his first road victory since April 13 at Miami. The Marlins will counter with RHP Andrew Cashner (4-8, 4.96).

Royals: RHP Yordano Ventura (7-9, 4.64), who beat Toronto on Sunday for his first win since June 17, will start Friday at Minnesota. The Twins will start RHP Kyle Gibson (4-6, 4.86).