diff --git a/client/src/events.tsx b/client/src/events.tsx index 459e770..6a76514 100644 --- a/client/src/events.tsx +++ b/client/src/events.tsx @@ -255,7 +255,7 @@ export function PromptEventItem(props: EventItemProps) { return - {character.substring(0, 1)} + {character.name.substring(0, 1)} - Prompt for {character}: {prompt} + Prompt for {character.name}: {prompt} } /> diff --git a/client/src/models.ts b/client/src/models.ts index 5b9314c..6144923 100644 --- a/client/src/models.ts +++ b/client/src/models.ts @@ -55,6 +55,11 @@ export interface World { // +export interface BooleanParameter { + type: 'boolean'; + default?: boolean; +} + export interface StringParameter { type: 'string'; default?: string; @@ -63,11 +68,11 @@ export interface StringParameter { export interface NumberParameter { type: 'number'; - default?: string; + default?: number; enum?: Array; } -export type Parameter = NumberParameter | StringParameter; +export type Parameter = BooleanParameter | NumberParameter | StringParameter; export interface Action { type: 'function'; diff --git a/client/src/prompt.tsx b/client/src/prompt.tsx index 8bf3c00..117b678 100644 --- a/client/src/prompt.tsx +++ b/client/src/prompt.tsx @@ -1,19 +1,22 @@ import { Maybe, doesExist, mustDefault, mustExist } from '@apextoaster/js-utils'; -import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Divider, MenuItem, Stack, Switch, TextField } from '@mui/material'; +import { Alert, Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Divider, FormControlLabel, MenuItem, Stack, Switch, TextField } from '@mui/material'; import React from 'react'; import { useStore } from 'zustand'; -import { World, NumberParameter, StringParameter, Parameter, Action } from './models'; +import { World, BooleanParameter, NumberParameter, StringParameter, Parameter, Action } from './models'; import { StoreState, store } from './store'; // region parameter components export interface BooleanParameterProps { name: string; + parameter: BooleanParameter; setParameter: (value: boolean) => void; } -export function BooleanParameter(props: BooleanParameterProps) { - return ; +export function BooleanParameterItem(props: BooleanParameterProps) { + const { name, setParameter } = props; + + return setParameter(event.target.checked)} />} label={name} />; } export function EnumParameterItem(props: NumberParameterProps | StringParameterProps) { @@ -127,6 +130,10 @@ export function enumerateSignificantParameterValues(name: string, world: World) } export function convertSignificantParameter(name: string, parameter: Parameter, world: Maybe): Parameter { + if (parameter.type === 'boolean') { + return parameter; + } + if (doesExist(world) && SIGNIFICANT_PARAMETERS.includes(name)) { return { ...parameter, @@ -143,10 +150,25 @@ export function selectWorld(state: StoreState) { }; } -export function formatAction(action: string, parameters: Record) { +export function formatAction(action: string, parameters: Record) { return `~${action}:${Object.entries(parameters).map(([name, value]) => `${name}=${value}`).join(',')}`; } +export function makeDefaultParameterValues(parameters: Record) { + return Object.entries(parameters).reduce((acc, [name, parameter]) => { + switch (parameter.type) { + case 'boolean': + return { ...acc, [name]: mustDefault(parameter.default, false) }; + case 'number': + return { ...acc, [name]: mustDefault(parameter.default, 0) }; + case 'string': + return { ...acc, [name]: mustDefault(parameter.default, '') }; + default: + return acc; + } + }, {} as Record); +} + export interface PromptActionProps { action: Action; @@ -157,10 +179,11 @@ export function PromptAction(props: PromptActionProps) { const { action, setAction } = props; const { world } = useStore(store, selectWorld); - const [parameterValues, setParameterValues] = React.useState>({}); + // initialize with default values + const [parameterValues, setParameterValues] = React.useState(makeDefaultParameterValues(action.function.parameters.properties)); // create an input for each parameter - const inputs = Object.entries(action.function.parameters.properties).map(([name, parameter]) => { + const inputs = Object.entries(action.function.parameters.properties).filter(([name, _parameter]) => name !== 'unused').map(([name, parameter]) => { const convertedParameter = convertSignificantParameter(name, parameter, world); switch (convertedParameter.type) { @@ -172,6 +195,10 @@ export function PromptAction(props: PromptActionProps) { return { setParameterValues((old) => ({ ...old, [name]: value })); }} />; + case 'boolean': + return { + setParameterValues((old) => ({ ...old, [name]: value })); + }} />; default: return ; } diff --git a/taleweave/player.py b/taleweave/player.py index 6f36023..409f972 100644 --- a/taleweave/player.py +++ b/taleweave/player.py @@ -201,7 +201,7 @@ class RemotePlayer(BasePlayer): formatted_prompt = prompt.format(**kwargs) if toolbox: actions = toolbox.list_definitions() - formatted_prompt += self.format_psuedo_functions(toolbox) + # formatted_prompt += self.format_psuedo_functions(toolbox) self.memory.append(HumanMessage(content=formatted_prompt)) diff --git a/taleweave/server/websocket.py b/taleweave/server/websocket.py index 6c266a9..0b2ce7d 100644 --- a/taleweave/server/websocket.py +++ b/taleweave/server/websocket.py @@ -68,7 +68,8 @@ async def handler(websocket): "character": event.character, "prompt": event.prompt, "actions": event.actions, - } + }, + default=server_json, ), ) @@ -288,7 +289,11 @@ socket_thread = None def server_json(obj): if isinstance(obj, WorldEntity): - return obj.name + return { + "id": obj.id, + "name": obj.name, + "type": obj.type, + } return world_json(obj)