1
0
Fork 0

get prompt menu sort of working
Run Docker Build / build (push) Successful in 17s Details
Run Python Build / build (push) Successful in 27s Details

This commit is contained in:
Sean Sube 2024-06-02 16:42:47 -05:00
parent fec907ec8f
commit a9705727f0
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
5 changed files with 51 additions and 14 deletions

View File

@ -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>
} }
/> />

View File

@ -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';

View File

@ -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} />;
} }

View File

@ -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))

View File

@ -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)