What is a python command to create a node group or shader node tree from the nodes in the currently active material?
When you run a script from the Text Editor you use its bpy.context. The Text Editor does not have a node tree related API.
To run your script in a right context you can:

Pass a context to an API function as an argument.
Run an operator with your script in the editor using search menu.


To be able to find the operator in the search menu Developer Extras should be enabled.


Create a button in that editor to run your script.


Your code should be in the execute() function.
import bpy

class TEST_OT_poll():
    @classmethod
    def poll(cls, context):
        if context.space_data.type == 'NODE_EDITOR' and context.space_data.tree_type == 'ShaderNodeTree':
            return True
        else:
            return False

class TEST_OT_make_group(bpy.types.Operator, TEST_OT_poll):
    bl_idname = &quot;node.test_make_group&quot;
    bl_label = &quot;Make Group&quot;
    bl_description = &quot;&quot;
    bl_options = {'REGISTER', 'UNDO'}
    

    def execute(self, context):
        
        bpy.ops.node.group_make()
        bpy.ops.node.group_edit(exit=True)
        
        return {'FINISHED'}
  
    
class TEST_PT_panel(bpy.types.Panel):
    bl_idname = &quot;TEST_PT_panel&quot;
    bl_label = &quot;Make group&quot;
    bl_space_type = 'NODE_EDITOR'
    bl_region_type = &quot;UI&quot;
    bl_category = &quot;Tool&quot;

    @classmethod
    def poll(cls, context):
        if context.space_data.tree_type == 'ShaderNodeTree':
            return True
        else:
            return False

    def draw(self, context):
        
        layout = self.layout
        column = layout.column()
        column.operator(&quot;node.test_make_group&quot;, text = &quot;Make Group&quot;)
    

classes = (
    TEST_PT_panel,
    TEST_OT_make_group,
)

def register():
    for c in classes:
        bpy.utils.register_class(c)

def unregister():
    for c in classes:
        bpy.utils.unregister_class(c)
        
        
if __name__ == &quot;__main__&quot;:
    register()


Change the editor in the script with changing it back at the end.

But in this case, it may not update the UI correctly, and you have to use an unrecommended force update.
import bpy

try:
    initial_area_type = bpy.context.area.type
    bpy.context.area.type = 'NODE_EDITOR'
    bpy.context.area.ui_type = 'ShaderNodeTree'
    bpy.ops.wm.redraw_timer(type='DRAW_WIN', iterations=1)
    
    bpy.ops.node.group_make()
    bpy.ops.node.group_edit(exit=True)
    
except Exception as e:
    print(e)
finally:
    bpy.context.area.type = initial_area_type