File size: 3,007 Bytes
5fbd2ea
 
 
c989e45
8d85a2c
 
 
2fc68b4
deb83c9
5fbd2ea
c989e45
 
 
74d601a
6bf37cd
c989e45
8d85a2c
 
5fbd2ea
8d85a2c
 
 
 
5fbd2ea
8d85a2c
5fbd2ea
deb83c9
5fbd2ea
 
 
 
c989e45
5fbd2ea
 
 
 
 
c989e45
5fbd2ea
 
 
c989e45
 
 
 
5fbd2ea
 
 
 
c989e45
 
 
 
5fbd2ea
c989e45
 
 
5fbd2ea
 
 
 
 
c989e45
 
 
 
 
 
5fbd2ea
 
 
 
 
c989e45
 
 
5fbd2ea
 
 
 
 
 
 
 
 
c989e45
5fbd2ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2fc68b4
8d85a2c
2fc68b4
1b436c7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import os
import json
import random
import curl_cffi
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import uvicorn

# Load Gemini API key from environment
GEM_API_KEY = os.getenv('GEMINI_API_KEY')

# Init app
app = FastAPI()

# CORS (allow frontend)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

# Pydantic model for manual prompting
class PromptRequest(BaseModel):
    prompt: str

# Utility to pick a random structure and build a strict prompt
def pick_random_structure():
    with open("structure_list.json", "r") as f:
        return random.choice(json.load(f))

def make_prompt(structure):
    name = structure["name"]
    desc = structure["description"]
    blocks = " ".join(structure["blocks_allowed"])
    return f"""You are a Minecraft-style structure planner. You have the curiosity to build almost anything you could think of. {name}

Structure description: {desc}

Only output a JSON object describing a 2D structure using this format:

{{
  "width": <int>,
  "height": <int>,
  "layout": [
    ["stone", "air", "stone"],
    ["stone", "air", "stone"],
    ["stone", "stone", "stone"]
  ]
}}

Only use lowercase Minecraft block IDs (e.g. "stone", "air", "glass", "planks").
You could only build this structure using {blocks}
Do not include any natural language or explanation.
Output strictly valid JSON only."""

# Manual prompting route
@app.post("/generate_structure")
async def generate_with_gemini(req: PromptRequest):
    try:
        response = curl_cffi.Session().post(
            url="https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent",
            headers={
                "x-goog-api-key": GEM_API_KEY,
                "Content-Type": "application/json"
            },
            json={
                "contents": [
                    {
                        "parts": [{"text": req.prompt}]
                    }
                ]
            }
        )
        return {"response": response.text}
    except Exception as e:
        return {"error": str(e)}

# Auto structure generation route
@app.get("/generate_random_structure")
async def generate_random_structure():
    try:
        structure = pick_random_structure()
        prompt = make_prompt(structure)

        response = curl_cffi.Session().post(
            url="https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent",
            headers={
                "x-goog-api-key": GEM_API_KEY,
                "Content-Type": "application/json"
            },
            json={
                "contents": [
                    {
                        "parts": [{"text": prompt}]
                    }
                ]
            }
        )
        return response.json()
    except Exception as e:
        return {"error": str(e)}

if __name__ == "__main__": uvicorn.run(app, host='0.0.0.0', port=7860)