in src/ai/commands/chat_command.cs [1237:1339]
private async Task<bool> DoChatAssistantUpdate()
{
var id = _values["chat.assistant.id"];
if (string.IsNullOrEmpty(id))
{
_values.AddThrowError(
"ERROR:", $"Updating assistant; requires id.",
"",
"TRY:", $"{Program.Name} chat assistant update --id ID",
"",
"SEE:", $"{Program.Name} help chat assistant update");
}
var name = _values["chat.assistant.name"];
var nameToDisplay = string.IsNullOrEmpty(name) ? id : name;
var message = $"Updating assistant ({nameToDisplay}) ...";
if (!_quiet) Console.WriteLine(message);
DemandKeyAndEndpoint(out var key, out var endpoint);
var assistantClient = OpenAIAssistantHelpers.CreateOpenAIAssistantClient(key, endpoint);
var response = await assistantClient.GetAssistantAsync(id);
var assistant = response.Value;
var deployment = ConfigDeploymentToken.Data().GetOrDefault(_values, assistant.Model);
var instructions = InstructionsToken.Data().GetOrDefault(_values, assistant.Instructions);
var existingCodeInterpreter = assistant.Tools.FirstOrDefault(t => t is CodeInterpreterToolDefinition) != null;
var codeInterpreterSpecifiedTrue = CodeInterpreterTrueFalseToken.Data().GetOrDefault(_values, false) == true;
var codeInterpreterSpecifiedFalse = CodeInterpreterTrueFalseToken.Data().GetOrDefault(_values, true) == false;
var vectorStoreId = assistant.ToolResources.FileSearch?.VectorStoreIds?.FirstOrDefault();
var existingVectorStore = !string.IsNullOrEmpty(vectorStoreId);
var fileSearchSpecifiedFalse = FileSearchTrueFalseToken.Data().GetOrDefault(_values, true) == false;
var fileSearchSpecifiedTrue = FileSearchTrueFalseToken.Data().GetOrDefault(_values, false) == true;
var fileIds = FileIdOptionXToken.GetOptions(_values).ToList();
fileIds.AddRange(FileIdsOptionXToken.GetOptions(_values));
fileIds.ExtendSplitItems(';');
var files = FileOptionXToken.GetOptions(_values).ToList();
files.AddRange(FilesOptionXToken.GetOptions(_values));
files.ExtendSplitItems(';');
files = ExpandFindFiles(files);
var newFilesForVectorStore = fileIds.Count() > 0 || files.Count() > 0;
var createVectorStore = !existingVectorStore && (newFilesForVectorStore || fileSearchSpecifiedTrue);
var updateVectorStore = existingVectorStore && newFilesForVectorStore;
var removeVectorStore = existingVectorStore && fileSearchSpecifiedFalse;
if (createVectorStore)
{
if (!_quiet) Console.WriteLine("\n Creating vector store ...");
var store = await CreateAssistantVectorStoreAsync(key, endpoint, name, fileIds, files);
vectorStoreId = store.Id;
}
else if (updateVectorStore)
{
if (!_quiet) Console.WriteLine("\n Updating vector store ...");
var store = await OpenAIAssistantHelpers.GetVectorStoreAsync(key, endpoint, vectorStoreId);
store = await UploadFilesToAssistantVectorStore(key, endpoint, fileIds, files, store);
vectorStoreId = store.Id;
}
else if (removeVectorStore)
{
Console.WriteLine();
_values.AddThrowError("ERROR:", $"Removing vector store; not yet implemented.");
}
var modifyOptions = new AssistantModificationOptions()
{
Name = name ?? assistant.Name,
Model = deployment ?? assistant.Model,
Instructions = instructions ?? assistant.Instructions,
ToolResources = ToolResourcesFromVectorStoreId(vectorStoreId),
};
var removeCodeInterpreter = existingCodeInterpreter && codeInterpreterSpecifiedFalse;
if (removeCodeInterpreter)
{
Console.WriteLine();
_values.AddThrowError("ERROR:", $"Removing code interpreter; not yet implemented.");
}
else if (existingCodeInterpreter)
{
modifyOptions.DefaultTools.Add(new CodeInterpreterToolDefinition());
}
if (existingVectorStore || newFilesForVectorStore)
{
modifyOptions.DefaultTools.Add(new FileSearchToolDefinition());
}
var modified = await assistantClient.ModifyAssistantAsync(assistant, modifyOptions);
assistant = modified.Value;
if (!_quiet) Console.WriteLine($"{message} Done!\n");
SetAssistantIdConfig(assistant);
return true;
}