Spaces:
Sleeping
Using Qwen2.5 0.5B for User Instruction Translation via MCP
Overview
The MCP interface we've implemented is perfectly designed to work with the Qwen2.5 0.5B model you already have for translating natural language user instructions into specific game actions. The model can understand user requests and convert them into precise MCP tool calls.
How It Works
- User Input: Player gives natural language instruction
- AI Processing: Qwen2.5 0.5B interprets the instruction
- MCP Translation: AI converts instruction to specific MCP tool calls
- Game Execution: MCP tools execute actions in the game
Example Translations
Example 1: Resource Management
User Instruction: "Build a power plant near my HQ" AI Translation Process:
- Use
get_game_state()to locate player HQ - Find suitable position near HQ
- Check if player has enough credits
- Call
build_building("power_plant", x, y, 0)
Example 2: Military Command
User Instruction: "Move my tanks to defend the north base" AI Translation Process:
- Use
get_game_state()to identify player tanks and north base location - Calculate appropriate defensive positions
- Call
move_units([tank_ids], target_x, target_y)
Example 3: Tactical Attack
User Instruction: "Attack the enemy barracks with my infantry" AI Translation Process:
- Use
get_game_state()to locate player infantry and enemy barracks - Verify infantry are available and barracks exists
- Call
attack_unit([infantry_ids], barracks_id)
Example 4: Economic Strategy
User Instruction: "I need more harvesters to collect ore" AI Translation Process:
- Use
get_game_state()to check current harvesters and refinery status - Use
get_ai_analysis()to confirm this is a good strategy - Call
build_unit("harvester", 0, refinery_id)(if refinery exists) - Or call
build_building("refinery", x, y, 0)then build harvester
Implementation Approach
Direct Integration
Since you already have Qwen2.5 0.5B integrated in ai_analysis.py, you can extend it to:
- Create a new translation function:
def translate_user_instruction(instruction: str, game_state: dict) -> List[dict]:
"""
Translate natural language instruction to MCP tool calls
Returns list of tool call dictionaries:
[
{"tool": "move_units", "arguments": {...}},
{"tool": "build_building", "arguments": {...}}
]
"""
# Use the same LLM with a specialized prompt
prompt = f"""
You are an RTS game command interpreter. Convert the user instruction
into specific game actions using available MCP tools.
Available tools:
- move_units(unit_ids, target_x, target_y)
- attack_unit(attacker_ids, target_id)
- build_building(building_type, position_x, position_y, player_id)
- build_unit(unit_type, player_id, building_id)
- get_game_state()
- get_ai_analysis(language)
Current game state: {json.dumps(game_state, indent=2)}
User instruction: {instruction}
Return ONLY a JSON array of tool calls.
"""
# Process with your existing LLM infrastructure
# ...
MCP Client Implementation
You could create a specialized MCP client that uses your Qwen2.5 model:
class RTSAIController:
def __init__(self):
self.ai_analyzer = get_ai_analyzer() # Your existing analyzer
async def process_user_command(self, user_input: str):
# Get current game state
game_state = await self.get_game_state_via_mcp()
# Use Qwen2.5 to translate instruction to actions
tool_calls = self.ai_analyzer.translate_user_instruction(
user_input, game_state
)
# Execute each tool call via MCP
results = []
for call in tool_calls:
result = await self.execute_mcp_tool(call["tool"], call["arguments"])
results.append(result)
return results
Advanced Features
Context-Aware Translation
The Qwen2.5 model can make decisions based on:
- Current game state (via
get_game_state()) - Tactical analysis (via
get_ai_analysis()) - Previous actions and their results
- Player preferences and play style
Multi-Step Planning
Complex instructions can be broken down: User: "Win the game" AI Process:
- Analyze current situation with
get_game_state()andget_ai_analysis() - Create multi-step plan:
- Build more military units if ahead economically
- Build economic structures if behind
- Launch nuke if charged and strategically beneficial
- Coordinate combined arms attacks
Error Handling and Recovery
The AI can handle failures gracefully:
- If a building action fails (insufficient funds), suggest alternatives
- If a movement is blocked, find alternative paths
- If units are lost, adjust strategy accordingly
Benefits of This Approach
1. Consistent AI Personality
Using the same Qwen2.5 model ensures consistent tactical understanding between:
- The in-game AI analysis panel
- User instruction translation
- Strategic decision making
2. Enhanced User Experience
Players can use natural language commands:
- "Defend our base"
- "Attack the enemy's weak spot"
- "Focus on economy for now"
- "I need more power"
3. Learning and Adaptation
The system can learn from:
- Successful command translations
- Player preferences
- Game outcomes
Implementation Recommendations
1. Specialized Prompts
Create prompts that guide the model to produce structured output:
Convert this user instruction to MCP tool calls.
Return ONLY a JSON array with this exact format:
[
{"tool": "tool_name", "arguments": {"param1": "value1", "param2": "value2"}}
]
Available tools:
- move_units(unit_ids: List[str], target_x: float, target_y: float)
- attack_unit(attacker_ids: List[str], target_id: str)
- build_building(building_type: str, position_x: float, position_y: float, player_id: int)
- etc.
User instruction: "Move my tanks to the north"
2. Validation Layer
Add a validation step to ensure tool calls are safe:
def validate_tool_call(tool_name: str, arguments: dict) -> bool:
"""Validate that tool call is reasonable before execution"""
# Check that unit IDs exist
# Check that coordinates are valid
# Check that player has resources
# etc.
pass
3. Feedback Loop
Provide feedback to improve translation quality:
def provide_feedback(tool_call: dict, result: dict, success: bool):
"""Provide feedback to the AI about translation quality"""
# Log successful/failed translations
# Adjust future behavior based on results
pass
Example Integration Code
Here's how you might integrate this with your existing system:
# In ai_analysis.py, add a new method:
class AIAnalyzer:
# ... existing methods ...
def translate_command_to_actions(self, user_command: str, game_state: dict) -> List[dict]:
"""Translate natural language command to MCP actions"""
# Create specialized prompt
prompt = self._create_translation_prompt(user_command, game_state)
# Use existing LLM infrastructure
response = self._query_llm(prompt)
# Parse response into tool calls
try:
tool_calls = json.loads(response)
return tool_calls
except json.JSONDecodeError:
# Handle parsing errors
return []
def _create_translation_prompt(self, command: str, game_state: dict) -> str:
"""Create prompt for command translation"""
return f"""
You are an RTS game command interpreter. Convert the user's natural language
instruction into specific MCP tool calls that can be executed in the game.
Current game situation:
{json.dumps(game_state, indent=2)}
User instruction: "{command}"
Available MCP tools:
1. get_game_state() - Get current game state
2. get_ai_analysis(language) - Get tactical analysis
3. move_units(unit_ids, target_x, target_y) - Move units
4. attack_unit(attacker_ids, target_id) - Attack enemy unit
5. build_building(building_type, position_x, position_y, player_id) - Build structure
6. build_unit(unit_type, player_id, building_id) - Produce unit
7. send_game_command(command_type, **kwargs) - Send any command
Return ONLY a JSON array of tool calls in this format:
[
{{"tool": "move_units", "arguments": {{"unit_ids": ["unit1"], "target_x": 100, "target_y": 200}}}}
]
Important guidelines:
- Always verify that units/buildings exist before targeting them
- Check that player has sufficient resources for construction
- Consider tactical positioning (don't move into water or blocked areas)
- Be specific about unit selection
- Use appropriate building/unit types
JSON array of tool calls:
"""
# Usage example:
async def handle_voice_command(user_speech: str):
"""Handle voice command from user"""
# Get current game state via MCP
game_state = await mcp_client.call_tool("get_game_state", {})
# Translate to actions
tool_calls = ai_analyzer.translate_command_to_actions(user_speech, game_state)
# Execute actions
results = []
for call in tool_calls:
result = await mcp_client.call_tool(call["tool"], call["arguments"])
results.append(result)
return results
Conclusion
The MCP interface is perfectly suited for use with your Qwen2.5 0.5B model to translate natural language user instructions into game actions. The combination provides:
- Natural Interaction: Users can speak naturally to control the game
- Intelligent Translation: The AI understands both the instruction and game context
- Safe Execution: All actions go through the existing game validation systems
- Consistent Experience: Uses the same AI that powers the tactical analysis panel
This creates a powerful voice/command interface for your RTS game that feels truly intelligent and responsive to user needs.