Skip to content

Commit

Permalink
feat: update assistant api to v2 (#27)
Browse files Browse the repository at this point in the history
* feat: Use assistant api v2

- version bump openai library
- replace `retrieval` tool with `file-search`

* fix: correct time stamps

Store `sentTime` in *seconds*.

* fix: disable file options

In v2, files are associated with tools, not the assistant.

* docs: update readme

- New README.md
- Adding a screenshot of the application

* feat: use version 2 of assistant api
  • Loading branch information
cgawron authored Apr 26, 2024
1 parent 14663cd commit 97ace9b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 55 deletions.
64 changes: 29 additions & 35 deletions src/chat/AssistantOptions.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from "react";
import { useEffect, useState } from "react";
import { modifyAssistant, retrieveAssistant, retrieveAssistantFile, retrieveFile, createAssistantFile, createFile, deleteAssistantFile, deleteFile, assistantsModels } from "./service/assistant";
import { modifyAssistant, retrieveAssistant, retrieveFile, createFile, deleteFile, assistantsModels, Model } from "./service/assistant";
import { Box, Button, ButtonGroup, Card, CardBody, CardFooter, CardHeader, Flex, Heading, IconButton, Input, Select, SimpleGrid, Spacer, Stack, StackDivider } from '@chakra-ui/react'
import { Panel, Icon, Textarea, Title } from "../components";
import OpenAI from "openai";
Expand All @@ -12,7 +12,6 @@ import { FormControl, FormHelperText, FormLabel, Switch } from "@chakra-ui/react
import { useToast } from '@chakra-ui/react'
import { OptionActionType } from "./context/types";
import { DeleteIcon } from "@chakra-ui/icons";
import { c } from "vite/dist/node/types.d-aGj9QkWt";


export interface AssistantProps {
Expand Down Expand Up @@ -60,6 +59,7 @@ export const AssistantOptions = (props: AssistantProps) => {
const [file_ids, setFileIds] = useState<string[]>([]);
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
const [models, setModels] = useState<Model[]>([]);

console.log("Assistant ID:", assistant_id);
const toast = useToast();
Expand All @@ -68,44 +68,37 @@ export const AssistantOptions = (props: AssistantProps) => {
const { assistant_id, file_id } = props;
const [file, setFile] = useState<OpenAI.Files.FileObject | null>(null);
const [loading, setLoading] = useState<boolean>(true);

useEffect(() => {
console.log("Retrieving File:", file_id);
retrieveAssistantFile(assistant_id, file_id)
.then((file) => {
return retrieveFile(file.id);
})
.then((file) => {
console.log("File:", file);
setFile(file);
setLoading(false);
})
}, [assistant_id, file_id]);

const name = loading ? "Loading... " + file_id : file.filename;

const delFile = (ev: React.MouseEvent) => {
console.log("Delete File:", file_id);
deleteAssistantFile(assistant_id, file_id)
.then(() => {
deleteFile(file_id);
})
.then(() => {
setFileIds(file_ids.filter((id) => id !== file_id));
})
}

return (
<Flex alignItems="center">
<div>{name}</div>
<Spacer />
<IconButton my={2} aria-label={t("help_delete_file")} colorScheme="red" icon={<DeleteIcon />}
onClick={delFile} />
/>
</Flex>
)

}

useEffect(() => {
assistantsModels()
.then((_models) => {
setModels(_models);
})
.catch((error) => {
toast({
title: 'Could not load assistant models.',
description: error.message,
status: 'error',
duration: 9000,
isClosable: true,
})
if (error.status === 401) {
doLogin();
}
});
});

useEffect(() => {
console.log("Retrieving Assistant:", assistant_id);
retrieveAssistant(assistant_id)
Expand Down Expand Up @@ -229,7 +222,7 @@ export const AssistantOptions = (props: AssistantProps) => {
createFile(file)
.then((assistantFile) => {
console.log("Assistant File:", assistantFile);
return createAssistantFile(assistant_id, assistantFile.id);
return null;//createAssistantFile(assistant_id, assistantFile.id);
})
.then((assistantFile) => {
console.log("Assistant File:", assistantFile);
Expand Down Expand Up @@ -265,11 +258,12 @@ export const AssistantOptions = (props: AssistantProps) => {
</FormControl>

<FormControl mt="4">
<FormLabel>{t("title")}</FormLabel>
<Input type="string" value={metadata.title} width="100%" onChange={(ev) => setMetadata({ ...metadata, title: ev.target.value })} />
<FormHelperText>{t("help_title")}</FormHelperText>
<FormLabel>{t("description")}</FormLabel>
<Input type="string" value={description} width="100%" onChange={(ev) => setDescription(ev.target.value)} />
<FormHelperText>{t("help_description")}</FormHelperText>
</FormControl>


<FormControl mt="4">
<FormLabel>{t("description")}</FormLabel>
<Input type="string" value={description} width="100%" onChange={(ev) => setDescription(ev.target.value)} />
Expand All @@ -287,8 +281,8 @@ export const AssistantOptions = (props: AssistantProps) => {
<FormLabel>{t("model")}</FormLabel>
<Select onChange={(ev) => setModel(ev.target.value)}>
{
assistantsModels()
.sort((a, b) => -a.id.localeCompare(b.id))
models
.toSorted((a, b) => -a.id.localeCompare(b.id))
.map((_model) => {
return <option key={_model.id} value={_model.id} selected={_model.id === model}>{_model.id}</option>
})
Expand Down
30 changes: 10 additions & 20 deletions src/chat/service/assistant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@ import { apiBaseUrl } from "./openai";
import { Chat, Message } from "../context/types";

import OpenAI from "openai";
import { MessageCreateParams } from "openai/resources/beta/threads/messages/messages";
import { Run } from "openai/resources/beta/threads/runs/runs";
import { AssistantStream } from "openai/lib/AssistantStream";
import { Uploadable } from "openai/uploads";
import { FileCreateParams, Models } from "openai/resources";
import { FileDeleteResponse } from "openai/resources/beta/assistants/files";
import { Stream } from "openai/streaming";
import { Assistant, AssistantStreamEvent } from "openai/resources/beta/assistants";
import { APIResource } from "openai/resource";

const MODELS = [
export type Model = { object: "model"; id: string };

const MODELS: Model[] = [
{
"object": "model",
"id": "gpt-3.5-turbo"
Expand Down Expand Up @@ -118,27 +120,15 @@ export const createMessage = async (chat: Chat, message: Message): Promise<Messa
return message;
}

export const createRun = (thread_id: string, assistant_id: string): AssistantStream => {
return client.beta.threads.runs.createAndStream(thread_id, { assistant_id })
export const createRun = (thread_id: string, assistant_id: string): Promise<Stream<AssistantStreamEvent>> => {
return client.beta.threads.runs.create(thread_id, { assistant_id, stream: true })
}

export const retrieveAssistant = async (assistant_id: string): Promise<OpenAI.Beta.Assistants.Assistant> => {
export const retrieveAssistant = async (assistant_id: string): Promise<Assistant> => {
if (!assistant_id) return Promise.reject(Error("No assistant_id provided"));
return client.beta.assistants.retrieve(assistant_id);
}

export const retrieveAssistantFile = async (assistant_id: string, file_id: string): Promise<OpenAI.Beta.Assistants.Files.AssistantFile> => {
return client.beta.assistants.files.retrieve(assistant_id, file_id);
}

export const createAssistantFile = async (assistant_id: string, file_id: string): Promise<OpenAI.Beta.Assistants.Files.AssistantFile> => {
return client.beta.assistants.files.create(assistant_id, { file_id });
}

export const deleteAssistantFile = async (assistant_id: string, file_id: string): Promise<FileDeleteResponse> => {
return client.beta.assistants.files.del(assistant_id, file_id);
}

export const retrieveFile = async (file_id: string): Promise<OpenAI.Files.FileObject> => {
return client.files.retrieve(file_id);
}
Expand All @@ -155,7 +145,7 @@ export const deleteFile = async (file_id: string): Promise<OpenAI.Files.FileDele
}

export const assistantsModels = () => {
return MODELS;
return Promise.resolve(MODELS);
}

export const modifyAssistant = async (assistant_id: string, assistant: Partial<OpenAI.Beta.Assistants.Assistant>): Promise<OpenAI.Beta.Assistants.Assistant> => {
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ i18n
help_delete_file: "Löschen Sie die Datei aus dem Chatbot.",
send: "Senden",
clear: "Löschen",
description: "Beschreibung",
help_description: "Geben Sie eine Beschreibung des Chatbots ein.",
},
},
},
Expand Down

0 comments on commit 97ace9b

Please sign in to comment.