2024-05-02 11:56:57 +00:00
|
|
|
from logging import getLogger
|
|
|
|
|
2024-05-27 13:10:24 +00:00
|
|
|
from taleweave.context import (
|
2024-05-18 22:29:40 +00:00
|
|
|
action_context,
|
|
|
|
broadcast,
|
2024-05-27 01:32:03 +00:00
|
|
|
get_agent_for_character,
|
|
|
|
get_character_agent_for_name,
|
2024-06-03 01:00:17 +00:00
|
|
|
get_game_config,
|
2024-05-31 23:58:01 +00:00
|
|
|
get_prompt,
|
2024-05-18 22:29:40 +00:00
|
|
|
world_context,
|
|
|
|
)
|
2024-05-27 13:10:24 +00:00
|
|
|
from taleweave.errors import ActionError
|
|
|
|
from taleweave.utils.conversation import loop_conversation
|
2024-05-31 23:58:01 +00:00
|
|
|
from taleweave.utils.prompt import format_prompt
|
2024-05-27 13:10:24 +00:00
|
|
|
from taleweave.utils.search import (
|
2024-05-27 01:32:03 +00:00
|
|
|
find_character_in_room,
|
|
|
|
find_item_in_character,
|
2024-05-13 04:33:47 +00:00
|
|
|
find_item_in_room,
|
2024-05-29 00:55:32 +00:00
|
|
|
find_portal_in_room,
|
2024-05-13 04:33:47 +00:00
|
|
|
find_room,
|
|
|
|
)
|
2024-05-27 13:10:24 +00:00
|
|
|
from taleweave.utils.string import normalize_name
|
2024-05-02 11:56:57 +00:00
|
|
|
|
|
|
|
logger = getLogger(__name__)
|
|
|
|
|
|
|
|
|
2024-05-29 00:55:32 +00:00
|
|
|
def action_examine(target: str) -> str:
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
2024-05-29 00:55:32 +00:00
|
|
|
Examine the room, a character, or an item (in the room or in your inventory).
|
2024-05-04 04:17:27 +00:00
|
|
|
|
|
|
|
Args:
|
|
|
|
target: The name of the target to look at.
|
|
|
|
"""
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
with action_context() as (action_room, action_character):
|
2024-05-31 23:58:01 +00:00
|
|
|
broadcast(
|
|
|
|
format_prompt(
|
|
|
|
"action_examine_broadcast_action",
|
|
|
|
action_character=action_character,
|
|
|
|
target=target,
|
|
|
|
)
|
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-19 04:30:17 +00:00
|
|
|
if normalize_name(target) == normalize_name(action_room.name):
|
2024-05-31 23:58:01 +00:00
|
|
|
broadcast(
|
|
|
|
format_prompt(
|
|
|
|
"action_examine_broadcast_room",
|
|
|
|
action_character=action_character,
|
|
|
|
action_room=action_room,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
return format_prompt("action_examine_result_room", action_room=action_room)
|
2024-05-13 04:33:47 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
target_character = find_character_in_room(action_room, target)
|
|
|
|
if target_character:
|
2024-05-18 22:29:40 +00:00
|
|
|
broadcast(
|
2024-05-31 23:58:01 +00:00
|
|
|
format_prompt(
|
|
|
|
"action_examine_broadcast_character",
|
|
|
|
action_character=action_character,
|
|
|
|
action_room=action_room,
|
|
|
|
target_character=target_character,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
return format_prompt(
|
|
|
|
"action_examine_result_character", target_character=target_character
|
2024-05-18 22:29:40 +00:00
|
|
|
)
|
2024-05-13 04:33:47 +00:00
|
|
|
|
2024-05-18 22:29:40 +00:00
|
|
|
target_item = find_item_in_room(action_room, target)
|
|
|
|
if target_item:
|
|
|
|
broadcast(
|
2024-05-31 23:58:01 +00:00
|
|
|
format_prompt(
|
|
|
|
"action_examine_broadcast_item",
|
|
|
|
action_character=action_character,
|
|
|
|
action_room=action_room,
|
|
|
|
target_item=target_item,
|
|
|
|
)
|
2024-05-18 22:29:40 +00:00
|
|
|
)
|
2024-05-31 23:58:01 +00:00
|
|
|
return format_prompt("action_examine_result_item", target_item=target_item)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
target_item = find_item_in_character(action_character, target)
|
2024-05-18 22:29:40 +00:00
|
|
|
if target_item:
|
|
|
|
broadcast(
|
2024-05-31 23:58:01 +00:00
|
|
|
format_prompt(
|
|
|
|
"action_examine_broadcast_inventory",
|
|
|
|
action_character=action_character,
|
|
|
|
action_room=action_room,
|
|
|
|
target_item=target_item,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
return format_prompt(
|
|
|
|
"action_examine_result_inventory", target_item=target_item
|
2024-05-18 22:29:40 +00:00
|
|
|
)
|
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
return format_prompt("action_examine_error_target", target=target)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
def action_move(direction: str) -> str:
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
|
|
|
Move into another room.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
direction: The direction to move in.
|
|
|
|
"""
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
with world_context() as (action_world, action_room, action_character):
|
2024-05-29 00:55:32 +00:00
|
|
|
portal = find_portal_in_room(action_room, direction)
|
2024-05-19 00:48:18 +00:00
|
|
|
if not portal:
|
2024-05-31 23:58:01 +00:00
|
|
|
portals = [p.name for p in action_room.portals]
|
|
|
|
raise ActionError(
|
|
|
|
format_prompt(
|
|
|
|
"action_move_error_direction", direction=direction, portals=portals
|
|
|
|
)
|
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
dest_room = find_room(action_world, portal.destination)
|
|
|
|
if not dest_room:
|
|
|
|
raise ActionError(
|
|
|
|
format_prompt(
|
|
|
|
"action_move_error_room",
|
|
|
|
direction=direction,
|
|
|
|
destination=portal.destination,
|
|
|
|
)
|
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-25 20:18:40 +00:00
|
|
|
broadcast(
|
2024-05-31 23:58:01 +00:00
|
|
|
format_prompt(
|
|
|
|
"action_move_broadcast",
|
|
|
|
action_character=action_character,
|
|
|
|
dest_room=dest_room,
|
|
|
|
direction=direction,
|
|
|
|
)
|
2024-05-25 20:18:40 +00:00
|
|
|
)
|
2024-05-27 01:32:03 +00:00
|
|
|
action_room.characters.remove(action_character)
|
2024-05-31 23:58:01 +00:00
|
|
|
dest_room.characters.append(action_character)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
return format_prompt(
|
|
|
|
"action_move_result", direction=direction, dest_room=dest_room
|
2024-05-26 20:59:12 +00:00
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
|
|
|
|
2024-05-19 20:27:56 +00:00
|
|
|
def action_take(item: str) -> str:
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
2024-06-04 02:36:59 +00:00
|
|
|
Pick up an item from the room and put it in your inventory.
|
2024-05-04 04:17:27 +00:00
|
|
|
|
|
|
|
Args:
|
2024-05-19 20:27:56 +00:00
|
|
|
item: The name of the item to take.
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
2024-05-27 01:32:03 +00:00
|
|
|
with action_context() as (action_room, action_character):
|
2024-05-19 20:27:56 +00:00
|
|
|
action_item = find_item_in_room(action_room, item)
|
|
|
|
if not action_item:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(format_prompt("action_take_error_item", item=item))
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
broadcast(
|
|
|
|
format_prompt(
|
|
|
|
"action_take_broadcast",
|
|
|
|
action_character=action_character,
|
|
|
|
action_room=action_room,
|
|
|
|
item=item,
|
|
|
|
)
|
|
|
|
)
|
2024-05-19 20:27:56 +00:00
|
|
|
action_room.items.remove(action_item)
|
2024-05-27 01:32:03 +00:00
|
|
|
action_character.items.append(action_item)
|
2024-05-31 23:58:01 +00:00
|
|
|
|
|
|
|
return format_prompt("action_take_result", item=item)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
def action_ask(character: str, question: str) -> str:
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
|
|
|
Ask another character a question.
|
|
|
|
|
|
|
|
Args:
|
2024-05-26 20:59:12 +00:00
|
|
|
character: The name of the character to ask. You cannot ask yourself questions.
|
2024-05-04 04:17:27 +00:00
|
|
|
question: The question to ask them.
|
|
|
|
"""
|
2024-06-03 01:00:17 +00:00
|
|
|
config = get_game_config()
|
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
with action_context() as (action_room, action_character):
|
2024-05-18 22:29:40 +00:00
|
|
|
# sanity checks
|
2024-05-27 01:32:03 +00:00
|
|
|
question_character, question_agent = get_character_agent_for_name(character)
|
|
|
|
if question_character == action_character:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(format_prompt("action_ask_error_self"))
|
2024-05-18 22:29:40 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
if not question_character:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(
|
|
|
|
format_prompt("action_ask_error_target", character=character)
|
|
|
|
)
|
2024-05-18 22:29:40 +00:00
|
|
|
|
|
|
|
if not question_agent:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(
|
|
|
|
format_prompt("action_ask_error_agent", character=character)
|
|
|
|
)
|
2024-05-18 22:29:40 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
# TODO: make sure they are in the same room
|
|
|
|
|
|
|
|
broadcast(
|
|
|
|
format_prompt(
|
|
|
|
"action_ask_broadcast",
|
|
|
|
action_character=action_character,
|
|
|
|
character=character,
|
|
|
|
question=question,
|
|
|
|
)
|
2024-05-18 22:29:40 +00:00
|
|
|
)
|
2024-05-31 23:58:01 +00:00
|
|
|
first_prompt = get_prompt("action_ask_conversation_first")
|
|
|
|
reply_prompt = get_prompt("action_ask_conversation_reply")
|
|
|
|
end_prompt = get_prompt("action_ask_conversation_end")
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
action_agent = get_agent_for_character(action_character)
|
2024-05-29 00:55:32 +00:00
|
|
|
result = loop_conversation(
|
2024-05-26 20:59:12 +00:00
|
|
|
action_room,
|
2024-05-27 01:32:03 +00:00
|
|
|
[question_character, action_character],
|
2024-05-26 20:59:12 +00:00
|
|
|
[question_agent, action_agent],
|
2024-05-27 01:32:03 +00:00
|
|
|
action_character,
|
2024-05-26 20:59:12 +00:00
|
|
|
first_prompt,
|
|
|
|
reply_prompt,
|
|
|
|
question,
|
2024-05-31 23:58:01 +00:00
|
|
|
end_prompt,
|
2024-05-26 20:59:12 +00:00
|
|
|
echo_function=action_tell.__name__,
|
|
|
|
echo_parameter="message",
|
2024-06-03 01:00:17 +00:00
|
|
|
max_length=config.world.character.conversation_limit,
|
2024-05-26 20:59:12 +00:00
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-29 00:55:32 +00:00
|
|
|
if result:
|
|
|
|
return result
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
return format_prompt("action_ask_ignore", character=character)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
def action_tell(character: str, message: str) -> str:
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
|
|
|
Tell another character a message.
|
|
|
|
|
|
|
|
Args:
|
2024-05-26 20:59:12 +00:00
|
|
|
character: The name of the character to tell. You cannot talk to yourself.
|
2024-05-04 04:17:27 +00:00
|
|
|
message: The message to tell them.
|
|
|
|
"""
|
2024-06-03 01:00:17 +00:00
|
|
|
config = get_game_config()
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
with action_context() as (action_room, action_character):
|
2024-05-18 22:29:40 +00:00
|
|
|
# sanity checks
|
2024-05-27 01:32:03 +00:00
|
|
|
question_character, question_agent = get_character_agent_for_name(character)
|
|
|
|
if question_character == action_character:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(format_prompt("action_tell_error_self"))
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
if not question_character:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(
|
|
|
|
format_prompt("action_tell_error_target", character=character)
|
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-18 22:29:40 +00:00
|
|
|
if not question_agent:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(
|
|
|
|
format_prompt("action_tell_error_agent", character=character)
|
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
broadcast(f"{action_character.name} tells {character}: {message}")
|
2024-05-31 23:58:01 +00:00
|
|
|
first_prompt = get_prompt("action_tell_conversation_first")
|
|
|
|
reply_prompt = get_prompt("action_tell_conversation_reply")
|
|
|
|
end_prompt = get_prompt("action_tell_conversation_end")
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
action_agent = get_agent_for_character(action_character)
|
2024-05-29 00:55:32 +00:00
|
|
|
result = loop_conversation(
|
2024-05-26 20:59:12 +00:00
|
|
|
action_room,
|
2024-05-27 01:32:03 +00:00
|
|
|
[question_character, action_character],
|
2024-05-26 20:59:12 +00:00
|
|
|
[question_agent, action_agent],
|
2024-05-27 01:32:03 +00:00
|
|
|
action_character,
|
2024-05-26 20:59:12 +00:00
|
|
|
first_prompt,
|
|
|
|
reply_prompt,
|
|
|
|
message,
|
2024-05-31 23:58:01 +00:00
|
|
|
end_prompt,
|
2024-05-26 20:59:12 +00:00
|
|
|
echo_function=action_tell.__name__,
|
|
|
|
echo_parameter="message",
|
2024-06-03 01:00:17 +00:00
|
|
|
max_length=config.world.character.conversation_limit,
|
2024-05-26 20:59:12 +00:00
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-29 00:55:32 +00:00
|
|
|
if result:
|
|
|
|
return result
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
return format_prompt("action_tell_ignore", character=character)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
|
|
|
|
2024-05-19 20:27:56 +00:00
|
|
|
def action_give(character: str, item: str) -> str:
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
2024-06-04 02:36:59 +00:00
|
|
|
Give an item in your inventory to another character in the room.
|
2024-05-04 04:17:27 +00:00
|
|
|
|
|
|
|
Args:
|
|
|
|
character: The name of the character to give the item to.
|
2024-05-19 20:27:56 +00:00
|
|
|
item: The name of the item to give.
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
2024-05-27 01:32:03 +00:00
|
|
|
with action_context() as (action_room, action_character):
|
|
|
|
destination_character = find_character_in_room(action_room, character)
|
|
|
|
if not destination_character:
|
2024-05-26 22:03:39 +00:00
|
|
|
raise ActionError(
|
2024-05-31 23:58:01 +00:00
|
|
|
format_prompt("action_give_error_target", character=character)
|
2024-05-26 22:03:39 +00:00
|
|
|
)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
if destination_character == action_character:
|
|
|
|
raise ActionError(format_prompt("action_give_error_self"))
|
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
action_item = find_item_in_character(action_character, item)
|
2024-05-19 20:27:56 +00:00
|
|
|
if not action_item:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(format_prompt("action_give_error_item", item=item))
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
broadcast(
|
|
|
|
format_prompt(
|
|
|
|
"action_give_broadcast",
|
|
|
|
action_character=action_character,
|
|
|
|
character=character,
|
|
|
|
item=item,
|
|
|
|
)
|
|
|
|
)
|
2024-05-27 01:32:03 +00:00
|
|
|
action_character.items.remove(action_item)
|
|
|
|
destination_character.items.append(action_item)
|
2024-05-02 11:56:57 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
return format_prompt("action_give_result", character=character, item=item)
|
2024-05-04 04:17:27 +00:00
|
|
|
|
|
|
|
|
2024-05-19 20:27:56 +00:00
|
|
|
def action_drop(item: str) -> str:
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
2024-06-04 02:36:59 +00:00
|
|
|
Drop an item from your inventory and leave it in the current room.
|
2024-05-04 04:17:27 +00:00
|
|
|
|
|
|
|
Args:
|
2024-05-19 20:27:56 +00:00
|
|
|
item: The name of the item to drop.
|
2024-05-04 04:17:27 +00:00
|
|
|
"""
|
|
|
|
|
2024-05-27 01:32:03 +00:00
|
|
|
with action_context() as (action_room, action_character):
|
|
|
|
action_item = find_item_in_character(action_character, item)
|
2024-05-19 20:27:56 +00:00
|
|
|
if not action_item:
|
2024-05-31 23:58:01 +00:00
|
|
|
raise ActionError(format_prompt("action_drop_error_item", item=item))
|
2024-05-04 04:17:27 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
broadcast(
|
|
|
|
format_prompt(
|
|
|
|
"action_drop_broadcast", action_character=action_character, item=item
|
|
|
|
)
|
|
|
|
)
|
2024-05-27 01:32:03 +00:00
|
|
|
action_character.items.remove(action_item)
|
2024-05-19 20:27:56 +00:00
|
|
|
action_room.items.append(action_item)
|
2024-05-04 04:17:27 +00:00
|
|
|
|
2024-05-31 23:58:01 +00:00
|
|
|
return format_prompt("action_drop_result", item=item)
|