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}>
|
return <ListItem alignItems="flex-start" ref={props.focusRef}>
|
||||||
<ListItemAvatar>
|
<ListItemAvatar>
|
||||||
<Avatar>{character.substring(0, 1)}</Avatar>
|
<Avatar>{character.name.substring(0, 1)}</Avatar>
|
||||||
</ListItemAvatar>
|
</ListItemAvatar>
|
||||||
<ListItemText
|
<ListItemText
|
||||||
primary="Prompt"
|
primary="Prompt"
|
||||||
|
@ -268,7 +268,7 @@ export function PromptEventItem(props: EventItemProps) {
|
||||||
variant="body2"
|
variant="body2"
|
||||||
color="text.primary"
|
color="text.primary"
|
||||||
>
|
>
|
||||||
Prompt for {character}: {prompt}
|
Prompt for {character.name}: {prompt}
|
||||||
</Typography>
|
</Typography>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -55,6 +55,11 @@ export interface World {
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
|
export interface BooleanParameter {
|
||||||
|
type: 'boolean';
|
||||||
|
default?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
export interface StringParameter {
|
export interface StringParameter {
|
||||||
type: 'string';
|
type: 'string';
|
||||||
default?: string;
|
default?: string;
|
||||||
|
@ -63,11 +68,11 @@ export interface StringParameter {
|
||||||
|
|
||||||
export interface NumberParameter {
|
export interface NumberParameter {
|
||||||
type: 'number';
|
type: 'number';
|
||||||
default?: string;
|
default?: number;
|
||||||
enum?: Array<string>;
|
enum?: Array<string>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Parameter = NumberParameter | StringParameter;
|
export type Parameter = BooleanParameter | NumberParameter | StringParameter;
|
||||||
|
|
||||||
export interface Action {
|
export interface Action {
|
||||||
type: 'function';
|
type: 'function';
|
||||||
|
|
|
@ -1,19 +1,22 @@
|
||||||
import { Maybe, doesExist, mustDefault, mustExist } from '@apextoaster/js-utils';
|
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 React from 'react';
|
||||||
import { useStore } from 'zustand';
|
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';
|
import { StoreState, store } from './store';
|
||||||
|
|
||||||
// region parameter components
|
// region parameter components
|
||||||
export interface BooleanParameterProps {
|
export interface BooleanParameterProps {
|
||||||
name: string;
|
name: string;
|
||||||
|
parameter: BooleanParameter;
|
||||||
|
|
||||||
setParameter: (value: boolean) => void;
|
setParameter: (value: boolean) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function BooleanParameter(props: BooleanParameterProps) {
|
export function BooleanParameterItem(props: BooleanParameterProps) {
|
||||||
return <Switch />;
|
const { name, setParameter } = props;
|
||||||
|
|
||||||
|
return <FormControlLabel control={<Switch onChange={(event) => setParameter(event.target.checked)} />} label={name} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function EnumParameterItem(props: NumberParameterProps | StringParameterProps) {
|
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 {
|
export function convertSignificantParameter(name: string, parameter: Parameter, world: Maybe<World>): Parameter {
|
||||||
|
if (parameter.type === 'boolean') {
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
|
|
||||||
if (doesExist(world) && SIGNIFICANT_PARAMETERS.includes(name)) {
|
if (doesExist(world) && SIGNIFICANT_PARAMETERS.includes(name)) {
|
||||||
return {
|
return {
|
||||||
...parameter,
|
...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(',')}`;
|
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 {
|
export interface PromptActionProps {
|
||||||
action: Action;
|
action: Action;
|
||||||
|
|
||||||
|
@ -157,10 +179,11 @@ export function PromptAction(props: PromptActionProps) {
|
||||||
const { action, setAction } = props;
|
const { action, setAction } = props;
|
||||||
const { world } = useStore(store, selectWorld);
|
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
|
// 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);
|
const convertedParameter = convertSignificantParameter(name, parameter, world);
|
||||||
|
|
||||||
switch (convertedParameter.type) {
|
switch (convertedParameter.type) {
|
||||||
|
@ -172,6 +195,10 @@ export function PromptAction(props: PromptActionProps) {
|
||||||
return <NumberParameterItem name={name} parameter={convertedParameter as NumberParameter} setParameter={(value) => {
|
return <NumberParameterItem name={name} parameter={convertedParameter as NumberParameter} setParameter={(value) => {
|
||||||
setParameterValues((old) => ({ ...old, [name]: value }));
|
setParameterValues((old) => ({ ...old, [name]: value }));
|
||||||
}} />;
|
}} />;
|
||||||
|
case 'boolean':
|
||||||
|
return <BooleanParameterItem name={name} parameter={convertedParameter as BooleanParameter} setParameter={(value) => {
|
||||||
|
setParameterValues((old) => ({ ...old, [name]: value }));
|
||||||
|
}} />;
|
||||||
default:
|
default:
|
||||||
return <UnknownParameter name={name} />;
|
return <UnknownParameter name={name} />;
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,7 @@ class RemotePlayer(BasePlayer):
|
||||||
formatted_prompt = prompt.format(**kwargs)
|
formatted_prompt = prompt.format(**kwargs)
|
||||||
if toolbox:
|
if toolbox:
|
||||||
actions = toolbox.list_definitions()
|
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))
|
self.memory.append(HumanMessage(content=formatted_prompt))
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,8 @@ async def handler(websocket):
|
||||||
"character": event.character,
|
"character": event.character,
|
||||||
"prompt": event.prompt,
|
"prompt": event.prompt,
|
||||||
"actions": event.actions,
|
"actions": event.actions,
|
||||||
}
|
},
|
||||||
|
default=server_json,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -288,7 +289,11 @@ socket_thread = None
|
||||||
|
|
||||||
def server_json(obj):
|
def server_json(obj):
|
||||||
if isinstance(obj, WorldEntity):
|
if isinstance(obj, WorldEntity):
|
||||||
return obj.name
|
return {
|
||||||
|
"id": obj.id,
|
||||||
|
"name": obj.name,
|
||||||
|
"type": obj.type,
|
||||||
|
}
|
||||||
|
|
||||||
return world_json(obj)
|
return world_json(obj)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue