I'm trying to perform a bevel operation using the bmesh API. My script either crashes Blender, with the error message `EXCEPTION_ACCESS_VIOLATION`, or it doesn't do anything, with the 'new' geometry being `{'face':[]}`. To make it crash I pass the edges to the geom argument, pass it the verts causes nothing to happen. Has anyone managed to use bevel successfully before?

    import bpy
    import bmesh
    from math      import *
    from mathutils import *
    
    AXES = {'X' : Vector((1,0,0)),
            'Y' : Vector((0,1,0)),
            'Z' : Vector((0,0,1))}
    
    def selectPlane(bm, normal = 'z', location = Vector((0,0,0)), feature = 'verts', tolerance = 0.1) : # bpy.context.active_object.location
        normal = normal if isinstance(normal, Vector) else AXES[normal.upper()]
        if isinstance(feature, list) :
           return {key : planeSelect(bm, normal, feature, location, tolerance) for key in feature}
        else : 
           return {'verts' : [vert for vert in bm.verts if abs(vert.co.__sub__(location).dot(normal)) < tolerance],
                   'edges' : [], 
                   'faces' : []}[feature]
    
    def selectCylinder(bm, radius = 1, normal = 'z', feature = 'verts', location = Vector((0,0,0)), tolerance = 0.1) :
        normal = normal if isinstance(normal, Vector) else AXES[normal.upper()]
        projxn = lambda vector : vector - vector.project(normal)
        if isinstance(feature, list) :
           return {key : selectCylinder(bm, radius, feature, location, tolerance) for key in feature}
        else : 
           return {'verts' : [vert for vert in bm.verts if abs(projxn(vert.co.__sub__(location)).length - radius) < tolerance],
                   'edges' : [edge for edge in bm.edges if all([abs(projxn(vert.co.__sub__(location)).length - radius) < tolerance for vert in edge.verts])], 
                   'faces' : []}[feature]
    
    me = bpy.data.meshes.new("Temp")
    ob = bpy.data.objects.new("Temp", me)
    bm = bmesh.new()
    diameter = 20
    length   = 20
    matrix   = Matrix.Identity(4)
    ge = bmesh.ops.create_cone(bm, cap_ends  = True,
                                   cap_tris  = True,
                                   segments  = 12,
                                   diameter1 = diameter,
                                   diameter2 = diameter,
                                   depth     = length,
                                   matrix    = matrix)
    go = selectCylinder(bm, radius = diameter, feature = 'edges')
    ug = selectPlane(bm, location = Vector((0, 0,  length/2)))
    lg = selectPlane(bm, location = Vector((0, 0, -length/2)))
    es = [edge for edge in go if all([vert in ug for vert in edge.verts])]
    vs = list(set([vert for edge in es for vert in edge.verts]))
    print('#'*5)
    print(go)
    print(es)
    ge = bmesh.ops.bevel(bm, geom   = vs, # list(set([vert for edge in es for vert in edge.verts])),
                             offset = 2)
    print('>'*5)
    print(ge)
    bm.to_mesh(me)
    bm.free()
    me.update()
    bpy.context.scene.objects.link(ob)

The `selectCylinder` and `selectPlane` methods are there to select the appropriate vertices and edges, but for the rest it's just bmesh operations.