ai-npcs / README.md
aduermael's picture
update Space title
1eabe7b
metadata
title: NPC Playground
emoji: πŸ€–
colorFrom: indigo
colorTo: pink
sdk: static
app_file: ./cubzh.html
pinned: false
license: mit
disable_embedding: true
custom_headers:
  cross-origin-embedder-policy: require-corp
  cross-origin-opener-policy: same-origin
  cross-origin-resource-policy: cross-origin

NPC Playground πŸ•ΉοΈπŸ€–

Join the chat at https://cu.bzh/discord

3D playground to interact with LLM-powered NPCs.
Clone and modify cubzh.lua file to teach them new skills with a few lines of code!

cubzh_gigax_hf

Play | Customize | Scripting | Course | Credits

Play

Just go to huggingface.co/spaces/cubzh/ai-npcs.

Engage with NPCs and try to trigger some of those pre-installed skills: move, follow, jump, explode (you may need to insist for that one πŸ˜…).

Customize

  1. Clone huggingface.co/spaces/cubzh/ai-npcs repository. ⚠️ clone needs to be public ⚠️
  2. Modify and commit world.lua file to edit NPC skills.
  3. That's it!

Scripting

Tweaking NPC Behavior

Modify the predifined fields in world.lua's NPCs table in order to influence NPC behaviour:

local NPCs = {    
  {
    name = "npcscientist",
    physicalDescription = "A small sphere with a computer screen for a face",
    psychologicalProfile = "Designed to be helpful to any human it interacts with, this robot viscerally hates squirrels.",
    currentLocationName = "Scientist Island",
    initialReflections = {
      "This NPC is a robot that punctuates all of its answers with electronic noises - as any android would!",
      ...
    },
  },
  ...
}

Teaching NPCs new skills

Our NPCs have been trained to use any skill you've defined before running the game. This is achieved by training the LLM powering them to do "function calling".

Modify skills table in world.lua to give your NPCs new skills:

local skills = {
    {
    name = "SAY",
    description = "Say smthg out loud",
    parameter_types = {"character", "content"},
    callback = function(client, action)
      local npc = client:getNpc(action.character_id)
      if not npc then print("Can't find npc") return end
        dialog:create(action.content, npc.avatar)
      print(string.format("%s: %s", npc.name, action.content))
    end,
    action_format_str = "{protagonist_name} said '{content}' to {target_name}"
  },
  ...
}

The callback function is called whenever an NPC uses the skill, using the parameters defined in the parameters field. We've given you some examples in skills.lua, feel free to draw inspiration from them!

If you want to go deeper with Cubzh scripting API, here's the documentation, the team and community will also be glad to help you on Discord.

Environment Design (πŸ‘·β€β™‚οΈ work in progress πŸ—οΈ)

Cubzh allows you to modify the 3D environment, by importing community-made voxel assets or creating new ones yourself. It's not yet possible to modify the environment yet though in the context of that specific demo, but we're working on making it possible, stay tuned!

Course

Together with the HuggingFace staff, we've released a new course to teach you how to create your own NPC skills with Lua. You can access it here

Credits

  • Hugging Face πŸ€—
  • Gigax
  • Cubzh: A versatile UGC (User-Generated Content) gaming platform.
  • You ! You're welcome to duplicate the repo, share your creations, and submit PRs here :)