Updated GPT models in Wasp AI (3.5 -> 4o).

This commit is contained in:
Martin Sosic 2024-09-09 16:27:04 +02:00
parent 23366a3550
commit 8250afeb8e
16 changed files with 50 additions and 62 deletions

View File

@ -41,7 +41,7 @@ RUN cd .wasp/build/server && npm run bundle
# TODO: Use pm2?
# TODO: Use non-root user (node).
FROM base AS server-production
RUN curl -sSL https://get.wasp-lang.dev/installer.sh | sh -s -- -v 0.14.0
RUN curl -sSL https://get.wasp-lang.dev/installer.sh | sh -s -- -v 0.14.2
ENV PATH "$PATH:/root/.local/bin"
ENV NODE_ENV production
WORKDIR /app

View File

@ -75,23 +75,16 @@ const faqs = [
<br/><br/>
We use GPT4 during the planning phase, since that is the most critical step, and then use GPT3.5 for the rest of the steps.
Although using GPT4 exclusively does give better results, we use a mix to keep the costs, generation time, and bandwidth acceptable (due to pricing and rate limits of GPT4).
We use GPT4o for all the phases at the moment of writing, as it gives the best ratio of quality / cost.
<br/><br/>
However, in the future, when GPT4 becomes cheaper / faster, it would make sense to switch to it completely, since it does generate better code!
</p>
},
{
question: '[Advanced] Can I use GPT4 for the whole app? / Can I run Mage locally?',
question: '[Advanced] Can I choose GPT model? / Can I run Mage locally?',
answer: <p>
As mentioned above, we use GPT4 + GPT3.5 for practical reasons, even though using GPT4 exclusively does give better results.<br/>
If you have access yourself to the OpenAI API, you can choose GPT model for the whole app, or play with adjusting the temperature, by running the Wasp GPT code agent locally! So same thing like Mage, but via CLI.<br/>
<br/>
However, if you have access yourself to the OpenAI API, you can use GPT4 for the whole app, or play with adjusting the temperature, by running the Wasp GPT code agent locally! So same thing like Mage, but via CLI.<br/>
Note: generating an app usually consumes from 20k to 50k tokens, which is then approximately $1 to $2 per app with the current GPT4 pricing (Jul 11th 2023).<br/>
<br/>
To run Wasp AI (Mage) locally, make sure you have wasp {'>='}v0.12 installed and just run:<br/>
To run Wasp AI (Mage) locally, make sure you have wasp installed and just run:<br/>
<span className="bg-slate-800 text-slate-200 p-1 rounded">
wasp new
</span><br/>

View File

@ -455,11 +455,11 @@ export function OnSuccessModal({ isOpen, setIsOpen, appGenerationResult }) {
return <span className="py-1 px-2 font-semibold text-pink-800 rounded">{children}</span>;
}
function calcCostForGpt_3_5_Turbo_0125(numTokensSpent) {
function calcCostForGpt_4o(numTokensSpent) {
const estimatedInputTokenShare = 0.8;
const estimatedOutputTokenShare = 1 - estimatedInputTokenShare;
const costInUsdForMillionInputTokens = 0.5; // This is price for GPT 3.5 Turbo 0125.
const costInUsdForMillionOutputTokens = 1.5; // This is price for GPT 3.5 Turbo 0125.
const costInUsdForMillionInputTokens = 5.0; // This is price for gpt-4o-2024-05-13.
const costInUsdForMillionOutputTokens = 15.0; // This is price for gpt-4o-2024-05-13.
const costInUsdForMillionTokens =
costInUsdForMillionInputTokens * estimatedInputTokenShare +
costInUsdForMillionOutputTokens * estimatedOutputTokenShare;
@ -491,7 +491,7 @@ export function OnSuccessModal({ isOpen, setIsOpen, appGenerationResult }) {
<td className="p-2 text-gray-600"> Cost to generate your app: </td>
<td className="p-2 text-gray-600">
{" "}
<FormattedText>{`~$${calcCostForGpt_3_5_Turbo_0125(
<FormattedText>{`~$${calcCostForGpt_4o(
Number(numTokensSpent)
)}`}</FormattedText>{" "}
</td>

View File

@ -1,5 +1,11 @@
# Changelog
## 0.14.2 (2024-09-09)
Updated GPT models used in Wasp AI to latest models, since 3.5 are getting deprecated.
Default model used is now 4o (instead of old 4 + 3.5-turbo combo).
## 0.14.1 (2024-08-26)
### 🎉 New Features

View File

@ -55,17 +55,17 @@ createNewProjectInteractiveOnDisk waspProjectDir appName = do
"Choose GPT model(s) you want to use:"
$ NE.fromList
[ Interactive.Option
"gpt-4 (planning) + gpt-3.5-turbo (coding)"
(Just "Ok results. Cheap and fast. Best cost/benefit ratio.")
(ChatGPT.GPT_4_0613, ChatGPT.GPT_3_5_turbo_0125),
"gpt-4o (planning + coding)"
(Just "Good results. Cheap and fast. Best cost/benefit ratio.")
(ChatGPT.GPT_4o, ChatGPT.GPT_4o),
Interactive.Option
"gpt-4 (planning) + gpt-4-turbo-preview (coding)"
(Just "Possibly better results, but somewhat slower and somewhat more expensive (~2-3x).")
(ChatGPT.GPT_4_0613, ChatGPT.GPT_4_turbo_Preview),
"gpt-4 (planning) + gpt-4o (coding)"
(Just "Possibly better results, but somewhat slower and somewhat more expensive.")
(ChatGPT.GPT_4, ChatGPT.GPT_4o),
Interactive.Option
"gpt-4 (planning + coding)"
(Just "Best results, but quite slower and quite more expensive (~5x).")
(ChatGPT.GPT_4_0613, ChatGPT.GPT_4_0613)
(Just "Possibly best results, but quite slower and quite more expensive.")
(ChatGPT.GPT_4, ChatGPT.GPT_4)
]
temperature <-
liftIO $

View File

@ -1,6 +1,6 @@
app waspBuild {
wasp: {
version: "^0.14.1"
version: "^0.14.2"
},
title: "waspBuild"
}

View File

@ -1,6 +1,6 @@
app waspCompile {
wasp: {
version: "^0.14.1"
version: "^0.14.2"
},
title: "waspCompile"
}

View File

@ -1,6 +1,6 @@
app waspComplexTest {
wasp: {
version: "^0.14.1"
version: "^0.14.2"
},
auth: {
userEntity: User,

View File

@ -1,6 +1,6 @@
app waspJob {
wasp: {
version: "^0.14.1"
version: "^0.14.2"
},
title: "waspJob"
}

View File

@ -1,6 +1,6 @@
app waspMigrate {
wasp: {
version: "^0.14.1"
version: "^0.14.2"
},
title: "waspMigrate"
}

View File

@ -1,6 +1,6 @@
app waspNew {
wasp: {
version: "^0.14.1"
version: "^0.14.2"
},
title: "waspNew"
}

View File

@ -157,7 +157,7 @@ codingChatGPTParams projectDetails =
GPT._temperature = Just $ fromMaybe 0.7 (projectDefaultGptTemperature $ _projectConfig projectDetails)
}
where
defaultCodingGptModel = GPT.GPT_3_5_turbo_0125
defaultCodingGptModel = GPT.GPT_4o
planningChatGPTParams :: NewProjectDetails -> ChatGPTParams
planningChatGPTParams projectDetails =
@ -166,7 +166,7 @@ planningChatGPTParams projectDetails =
GPT._temperature = Just $ fromMaybe 0.7 (projectDefaultGptTemperature $ _projectConfig projectDetails)
}
where
defaultPlanningGptModel = GPT.GPT_4_0613
defaultPlanningGptModel = GPT.GPT_4o
fixingChatGPTParams :: ChatGPTParams -> ChatGPTParams
fixingChatGPTParams params = params {GPT._temperature = subtract 0.2 <$> GPT._temperature params}

View File

@ -44,7 +44,7 @@ type PlanRule = String
generatePlan :: NewProjectDetails -> [PlanRule] -> CodeAgent Plan
generatePlan newProjectDetails planRules = do
writeToLog $
"\n" <> L.styled L.Generating "Generating" <> " plan (slowest step, usually takes 30 to 90 seconds)"
"\n" <> L.styled L.Generating "Generating" <> " plan (slowest step, can take up to 90 seconds for slower models)"
<> L.styled (L.Custom [Term.Blink]) "..."
initialPlan <- queryChatGPTForJSON (planningChatGPTParams newProjectDetails) chatMessages
writeToLog $ "Initial plan generated!\n" <> L.fromText (summarizePlan initialPlan)

View File

@ -116,6 +116,7 @@ fixWaspFile newProjectDetails waspFilePath plan = do
Be careful not to do that.
- We are using SQLite as a database for Prisma, so we can't use scalar arrays in PSL, like `String[]`,
as those are not supported in SQLite. We can of course normally use arrays of other models, like `Task[]`.
- Wasp file should not contain any `entity` declarations! That was ok in older Wasp versions, but now entities are described in prisma.schema file, and not in wasp file.
With this in mind, generate a new, fixed wasp file.
Try not to do big changes like changing names, removing/adding declarations and similar, those are usually correct, focus more on obvious, smaller errors.

View File

@ -12,7 +12,6 @@ module Wasp.AI.OpenAI.ChatGPT
ChatMessage (..),
ChatRole (..),
getChatResponseContent,
checkIfGpt4IsAvailable,
)
where
@ -70,13 +69,6 @@ queryChatGPT apiKey params requestMessages = do
getChatResponseContent :: ChatResponse -> Text
getChatResponseContent = content . message . head . choices
checkIfGpt4IsAvailable :: OpenAIApiKey -> IO Bool
checkIfGpt4IsAvailable apiKey = do
let request =
HTTP.setRequestHeader "Authorization" [BSU.fromString $ "Bearer " <> apiKey] $
HTTP.parseRequest_ $ "GET https://api.openai.com/v1/models/" <> show GPT_4
(200 ==) . HTTP.getResponseStatusCode <$> HTTP.httpNoBody request
data ChatGPTParams = ChatGPTParams
{ _model :: !Model,
_temperature :: !(Maybe Float)
@ -87,20 +79,18 @@ data ChatGPTParams = ChatGPTParams
deriving (Show)
data Model
= --
GPT_3_5_turbo -- Alias model
| GPT_3_5_turbo_0125
| GPT_3_5_turbo_1106
| --
GPT_4_turbo_Preview -- Alias model
| GPT_4_0125_Preview
| GPT_4_1106_Preview
| --
= -- New flagship model.
GPT_4o -- Alias model
| GPT_4o_2024_08_06
| -- Faster & cheaper version of the new flagship model.
GPT_4o_mini -- Alias model
| GPT_4o_mini_2024_07_18
| -- Old flagship model.
GPT_4 -- Alias model
| GPT_4_0613
| --
GPT_4_32k -- Alias model
| GPT_4_32k_0613
| -- Faster & cheaper version of the old flagship model.
GPT_4_turbo -- Alias model
| GPT_4_turbo_2024_04_09
deriving (Eq, Bounded, Enum)
instance Show Model where
@ -108,16 +98,14 @@ instance Show Model where
modelOpenAiId :: Model -> String
modelOpenAiId = \case
GPT_3_5_turbo -> "gpt-3.5-turbo"
GPT_3_5_turbo_0125 -> "gpt-3.5-turbo-0125"
GPT_3_5_turbo_1106 -> "gpt-3.5-turbo-1106"
GPT_4_turbo_Preview -> "gpt-4-turbo-preview"
GPT_4_0125_Preview -> "gpt-4-0125-preview"
GPT_4_1106_Preview -> "gpt-4-1106-preview"
GPT_4o -> "gpt-4o"
GPT_4o_2024_08_06 -> "gpt-4o-2024-08-06"
GPT_4o_mini -> "gpt-4o-mini"
GPT_4o_mini_2024_07_18 -> "gpt-4o-mini-2024-07-18"
GPT_4 -> "gpt-4"
GPT_4_0613 -> "gpt-4-0613"
GPT_4_32k -> "gpt-4-32k"
GPT_4_32k_0613 -> "gpt-4-32k-0613"
GPT_4_turbo -> "gpt-4-turbo"
GPT_4_turbo_2024_04_09 -> "gpt-4-turbo-2024-04-09"
instance FromJSON Model where
parseJSON = Aeson.withText "Model" $ \t ->

View File

@ -6,7 +6,7 @@ cabal-version: 2.4
-- Consider using hpack, or maybe even hpack-dhall.
name: waspc
version: 0.14.1
version: 0.14.2
description: Please see the README on GitHub at <https://github.com/wasp-lang/wasp/waspc#readme>
homepage: https://github.com/wasp-lang/wasp/waspc#readme
bug-reports: https://github.com/wasp-lang/wasp/issues