Skip to content

Commit

Permalink
Ensure automatic model name is resolved when submitting chat
Browse files Browse the repository at this point in the history
  • Loading branch information
rhennigan committed Jan 16, 2024
1 parent cb98fd9 commit b99ac26
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 26 deletions.
77 changes: 70 additions & 7 deletions Source/Chatbook/Models.wl
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,25 @@ BeginPackage[ "Wolfram`Chatbook`Models`" ];

(* :!CodeAnalysis::BeginBlock:: *)

`chatModelQ;
`getModelList;
`modelDisplayName;
`multimodalModelQ;
`snapshotModelQ;
`standardizeModelData;
`toModelName;
HoldComplete[
`chatModelQ;
`chooseDefaultModelName;
`getModelList;
`modelDisplayName;
`multimodalModelQ;
`snapshotModelQ;
`standardizeModelData;
`resolveFullModelSpec;
`toModelName;
];

Begin[ "`Private`" ];

Needs[ "Wolfram`Chatbook`" ];
Needs[ "Wolfram`Chatbook`Actions`" ];
Needs[ "Wolfram`Chatbook`Common`" ];
Needs[ "Wolfram`Chatbook`Dynamics`" ];
Needs[ "Wolfram`Chatbook`Services`" ];
Needs[ "Wolfram`Chatbook`UI`" ];

(* ::**************************************************************************************************************:: *)
Expand Down Expand Up @@ -110,6 +115,10 @@ getModelList // endDefinition;

$fallbackModelList = { "gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-4" };

(* ::**************************************************************************************************************:: *)
(* ::Section::Closed:: *)
(*Model Utility Functions*)

(* ::**************************************************************************************************************:: *)
(* ::Subsection::Closed:: *)
(*chatModelQ*)
Expand Down Expand Up @@ -331,8 +340,62 @@ standardizeModelData[ service_String, model_ ] :=
standardizeModelData[ KeyValuePattern[ "Service" -> service_String ], model_ ] :=
standardizeModelData[ service, model ];

standardizeModelData[ $$unspecified ] :=
With[ { model = $DefaultModel },
standardizeModelData @ model /; MatchQ[ model, Except[ $$unspecified ] ]
];

standardizeModelData // endDefinition;

(* ::**************************************************************************************************************:: *)
(* ::Subsection::Closed:: *)
(*chooseDefaultModelName*)
(*
Choose a default initial model according to the following rules:
1. If the service name is the same as the one in $DefaultModel, use the model name in $DefaultModel.
2. If the registered service specifies a "DefaultModel" property, we'll use that.
3. If the model list is already cached for the service, we'll use the first model in that list.
4. Otherwise, give Automatic to indicate a model name that must be resolved later.
*)
chooseDefaultModelName // beginDefinition;
chooseDefaultModelName[ service_String ] /; service === $DefaultModel[ "Service" ] := $DefaultModel[ "Name" ];
chooseDefaultModelName[ service_String ] := chooseDefaultModelName @ $availableServices @ service;
chooseDefaultModelName[ KeyValuePattern[ "DefaultModel" -> model_ ] ] := toModelName @ model;
chooseDefaultModelName[ KeyValuePattern[ "CachedModels" -> models_List ] ] := chooseDefaultModelName @ models;
chooseDefaultModelName[ { model_, ___ } ] := toModelName @ model;
chooseDefaultModelName[ service_ ] := Automatic;
chooseDefaultModelName // endDefinition;

(* ::**************************************************************************************************************:: *)
(* ::Subsection::Closed:: *)
(*resolveFullModelSpec*)
resolveFullModelSpec // beginDefinition;

resolveFullModelSpec[ settings: KeyValuePattern[ "Model" -> model_ ] ] :=
resolveFullModelSpec @ model;

resolveFullModelSpec[ { service_String, Automatic } ] :=
resolveFullModelSpec @ <| "Service" -> service, "Name" -> Automatic |>;

resolveFullModelSpec[ model: KeyValuePattern @ { "Service" -> service_String, "Name" -> Automatic } ] := Enclose[
Catch @ Module[ { default, models, name },
default = ConfirmMatch[ chooseDefaultModelName @ service, Automatic | _String, "Default" ];
If[ StringQ @ default, Throw @ standardizeModelData @ <| model, "Name" -> default |> ];
models = ConfirmMatch[ getServiceModelList @ service, _List | Missing[ "NotConnected" ], "Models" ];
If[ MissingQ @ models, throwTop @ $Canceled ];
name = ConfirmBy[ chooseDefaultModelName @ models, StringQ, "ResolvedName" ];
standardizeModelData @ <| model, "Name" -> name |>
],
throwInternalFailure
];

resolveFullModelSpec[ model_ ] :=
With[ { spec = standardizeModelData @ model },
spec /; AssociationQ @ spec
];

resolveFullModelSpec // endDefinition;

(* ::**************************************************************************************************************:: *)
(* ::Section::Closed:: *)
(*SetModel*)
Expand Down
19 changes: 0 additions & 19 deletions Source/Chatbook/PreferencesContent.wl
Original file line number Diff line number Diff line change
Expand Up @@ -1484,25 +1484,6 @@ getServiceDefaultModel[ service_String ] := Enclose[

getServiceDefaultModel // endDefinition;

(* ::**************************************************************************************************************:: *)
(* ::Subsubsubsubsection::Closed:: *)
(*chooseDefaultModelName*)
(*
Choose a default initial model according to the following rules:
1. If the service name is the same as the one in $DefaultModel, use the model name in $DefaultModel.
2. If the registered service specifies a "DefaultModel" property, we'll use that.
3. If the model list is already cached for the service, we'll use the first model in that list.
4. Otherwise, give Automatic to indicate a model name that must be resolved later.
*)
chooseDefaultModelName // beginDefinition;
chooseDefaultModelName[ service_String ] /; service === $DefaultModel[ "Service" ] := $DefaultModel[ "Name" ];
chooseDefaultModelName[ service_String ] := chooseDefaultModelName @ $availableServices @ service;
chooseDefaultModelName[ KeyValuePattern[ "DefaultModel" -> model_ ] ] := toModelName @ model;
chooseDefaultModelName[ KeyValuePattern[ "CachedModels" -> models_List ] ] := chooseDefaultModelName @ models;
chooseDefaultModelName[ { model_, ___ } ] := toModelName @ model;
chooseDefaultModelName[ service_ ] := Automatic;
chooseDefaultModelName // endDefinition;

(* ::**************************************************************************************************************:: *)
(* ::Section::Closed:: *)
(*ServiceConnection Utilities*)
Expand Down
4 changes: 4 additions & 0 deletions Source/Chatbook/SendChat.wl
Original file line number Diff line number Diff line change
Expand Up @@ -1212,6 +1212,7 @@ resolveAutoSettings[ settings_Association ] := resolveAutoSettings0 @ <|
"HandlerFunctions" -> getHandlerFunctions @ settings,
"LLMEvaluator" -> getLLMEvaluator @ settings,
"ProcessingFunctions" -> getProcessingFunctions @ settings,
"Model" -> resolveFullModelSpec @ settings,
If[ StringQ @ settings[ "Tokenizer" ],
<|
"TokenizerName" -> getTokenizerName @ settings,
Expand Down Expand Up @@ -2236,6 +2237,9 @@ smallSettings // endDefinition;

smallSettings0 // beginDefinition;

smallSettings0[ as: KeyValuePattern[ "Model" -> model: KeyValuePattern[ "Icon" -> _ ] ] ] :=
smallSettings0 @ <| as, "Model" -> KeyTake[ model, { "Service", "Name" } ] |>;

smallSettings0[ as_Association ] :=
smallSettings0[ as, as[ "LLMEvaluator" ] ];

Expand Down

0 comments on commit b99ac26

Please sign in to comment.