The default behavior for content types is not working correctly, at least as far as what gets emitted by the openapi3 emitter.
The documented default behavior is:
op download(): bytes; // response content type is application/octet-stream
op upload(@body file: bytes): void; // request content type is application/octet-stream
op getContent(): string; // response content type is text/plain
op getPet(): {
  // response content type is application/json
  name: string;
};
But in the playground all these wind up being application/json:
Playground example