get prompt menu sort of working
This commit is contained in:
parent
fec907ec8f
commit
a9705727f0
|
@ -255,7 +255,7 @@ export function PromptEventItem(props: EventItemProps) {
|
|||
|
||||
return <ListItem alignItems="flex-start" ref={props.focusRef}>
|
||||
<ListItemAvatar>
|
||||
<Avatar>{character.substring(0, 1)}</Avatar>
|
||||
<Avatar>{character.name.substring(0, 1)}</Avatar>
|
||||
</ListItemAvatar>
|
||||
<ListItemText
|
||||
primary="Prompt"
|
||||
|
@ -268,7 +268,7 @@ export function PromptEventItem(props: EventItemProps) {
|
|||
variant="body2"
|
||||
color="text.primary"
|
||||
>
|
||||
Prompt for {character}: {prompt}
|
||||
Prompt for {character.name}: {prompt}
|
||||
</Typography>
|
||||
}
|
||||
/>
|
||||
|
|
|
@ -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<string>;
|
||||
}
|
||||
|
||||
export type Parameter = NumberParameter | StringParameter;
|
||||
export type Parameter = BooleanParameter | NumberParameter | StringParameter;
|
||||
|
||||
export interface Action {
|
||||
type: 'function';
|
||||
|
|
|
@ -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 <Switch />;
|
||||
export function BooleanParameterItem(props: BooleanParameterProps) {
|
||||
const { name, setParameter } = props;
|
||||
|
||||
return <FormControlLabel control={<Switch onChange={(event) => 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<World>): 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<string, number | string>) {
|
||||
export function formatAction(action: string, parameters: Record<string, boolean | number | string>) {
|
||||
return `~${action}:${Object.entries(parameters).map(([name, value]) => `${name}=${value}`).join(',')}`;
|
||||
}
|
||||
|
||||
export function makeDefaultParameterValues(parameters: Record<string, Parameter>) {
|
||||
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<string, boolean | number | string>);
|
||||
}
|
||||
|
||||
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<Record<string, number | string>>({});
|
||||
// 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 <NumberParameterItem name={name} parameter={convertedParameter as NumberParameter} setParameter={(value) => {
|
||||
setParameterValues((old) => ({ ...old, [name]: value }));
|
||||
}} />;
|
||||
case 'boolean':
|
||||
return <BooleanParameterItem name={name} parameter={convertedParameter as BooleanParameter} setParameter={(value) => {
|
||||
setParameterValues((old) => ({ ...old, [name]: value }));
|
||||
}} />;
|
||||
default:
|
||||
return <UnknownParameter name={name} />;
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue