1 import torch
2 from transformers import AutoModelForCausalLM , AutoTokenizer , BitsAndBytesConfig
3 from peft import PeftModel
4
5 # Quantization config for efficient inference
6 bnb_config = BitsAndBytesConfig (
7 load_in_4bit = True ,
8 bnb_4bit_quant_type = "nf4" ,
9 bnb_4bit_compute_dtype = torch . bfloat16 ,
10 bnb_4bit_use_double_quant = True ,
11 )
12
13 # Load model
14 base_model_id = "Qwen/Qwen2.5-Coder-7B-Instruct"
15 adapter_id = "hwding/forge-coder-qwen-v1.21.11"
16
17 tokenizer = AutoTokenizer . from_pretrained ( adapter_id )
18 model = AutoModelForCausalLM . from_pretrained (
19 base_model_id ,
20 quantization_config = bnb_config ,
21 device_map = "auto" ,
22 )
23 model = PeftModel . from_pretrained ( model , adapter_id )
24
25 # Generate code
26 def generate_forge_code ( prompt : str , max_tokens : int = 2048 ) - > str :
27 messages = [
28 { "role" : "system" , "content" : "You are an expert Minecraft Forge mod developer for version 1.21.11. Write clean, efficient, and well-structured Java code." } ,
29 { "role" : "user" , "content" : prompt }
30 ]
31 text = tokenizer . apply_chat_template ( messages , tokenize = False , add_generation_prompt = True )
32 inputs = tokenizer ( text , return_tensors = "pt" ) . to ( model . device )
33 outputs = model . generate (
34 ** inputs ,
35 max_new_tokens = max_tokens ,
36 temperature = 0.7 ,
37 top_p = 0.95 ,
38 do_sample = True ,
39 pad_token_id = tokenizer . eos_token_id ,
40 )
41 return tokenizer . decode ( outputs [ 0 ] [ inputs . input_ids . shape [ 1 ] : ] , skip_special_tokens = True )
42
43 # Example
44 code = generate_forge_code ( "Create a custom ore block that drops experience when mined" )
45 print ( code )
1 # Start vLLM server
2 python -m vllm.entrypoints.openai.api_server \
3 --model Qwen/Qwen2.5-Coder-7B-Instruct \
4 --enable-lora \
5 --lora-modules forge-coder = hwding/forge-coder-qwen-v1.21.11 \
6 --max-lora-rank 64 \
7 --dtype float16 \
8 --max-model-len 32768 \
9 --port 8000
1 from openai import OpenAI
2
3 client = OpenAI ( base_url = "http://localhost:8000/v1" , api_key = "none" )
4 response = client . chat . completions . create (
5 model = "forge-coder" ,
6 messages = [
7 { "role" : "system" , "content" : "You are an expert Minecraft Forge mod developer." } ,
8 { "role" : "user" , "content" : "Create a teleportation staff item" }
9 ] ,
10 max_tokens = 2048
11 )
12 print ( response . choices [ 0 ] . message . content )
1 public class CopperLampBlock extends Block {
2 public static final BooleanProperty LIT = BlockStateProperties . LIT ;
3
4 public CopperLampBlock ( Properties properties ) {
5 super ( properties ) ;
6 this . registerDefaultState ( this . stateDefinition . any ( ) . setValue ( LIT , false ) ) ;
7 }
8
9 @Override
10 protected void createBlockStateDefinition ( StateDefinition . Builder < Block , BlockState > builder ) {
11 builder . add ( LIT ) ;
12 }
13
14 @Override
15 public void neighborChanged ( BlockState state , Level level , BlockPos pos ,
16 Block block , BlockPos fromPos , boolean isMoving ) {
17 if ( ! level . isClientSide ) {
18 boolean powered = level . hasNeighborSignal ( pos ) ;
19 if ( powered != state . getValue ( LIT ) ) {
20 level . setBlock ( pos , state . setValue ( LIT , powered ) , 2 ) ;
21 }
22 }
23 }
24
25 @Override
26 public int getLightEmission ( BlockState state , BlockGetter level , BlockPos pos ) {
27 return state . getValue ( LIT ) ? 15 : 0 ;
28 }
29 }
1 public class MagicWandItem extends Item {
2 public MagicWandItem ( Properties properties ) {
3 super ( properties . stacksTo ( 1 ) . durability ( 100 ) ) ;
4 }
5
6 @Override
7 public InteractionResultHolder < ItemStack > use ( Level level , Player player , InteractionHand hand ) {
8 ItemStack stack = player . getItemInHand ( hand ) ;
9
10 if ( ! level . isClientSide ) {
11 Vec3 look = player . getLookAngle ( ) ;
12 SmallFireball fireball = new SmallFireball ( level , player , look . x , look . y , look . z ) ;
13 fireball . setPos ( player . getX ( ) , player . getEyeY ( ) - 0.1 , player . getZ ( ) ) ;
14 level . addFreshEntity ( fireball ) ;
15
16 stack . hurtAndBreak ( 1 , player , ( p ) -> p . broadcastBreakEvent ( hand ) ) ;
17 player . getCooldowns ( ) . addCooldown ( this , 20 ) ;
18 }
19
20 level . playSound ( player , player . blockPosition ( ) , SoundEvents . BLAZE_SHOOT ,
21 SoundSource . PLAYERS , 1.0F , 1.0F ) ;
22
23 return InteractionResultHolder . sidedSuccess ( stack , level . isClientSide ) ;
24 }
25 }
Epoch 1: 0.87 → 0.43
Epoch 2: 0.38 → 0.34
Epoch 3: 0.28 → 0.28
1 @misc{forge-coder-qwen-2024,
2 author = {hwding},
3 title = {Forge Coder Qwen: A Specialized Code Generation Model for Minecraft Forge Mod Development},
4 year = {2024},
5 publisher = {Hugging Face},
6 url = {https://huggingface.co/hwding/forge-coder-qwen-v1.21.11}
7 }
Training data was sourced from open-source repositories under various permissive licenses (MIT, Apache 2.0, LGPL, etc.).