(input: {
session: Session.Info
message: MessageV2.WithParts
history: MessageV2.WithParts[]
providerID: string
modelID: string
})
| 1699 | } |
| 1700 | |
| 1701 | async function ensureTitle(input: { |
| 1702 | session: Session.Info |
| 1703 | message: MessageV2.WithParts |
| 1704 | history: MessageV2.WithParts[] |
| 1705 | providerID: string |
| 1706 | modelID: string |
| 1707 | }) { |
| 1708 | if (input.session.parentID) return |
| 1709 | if (!Session.isDefaultTitle(input.session.title)) return |
| 1710 | const isFirst = |
| 1711 | input.history.filter((m) => m.info.role === "user" && !m.parts.every((p) => "synthetic" in p && p.synthetic)) |
| 1712 | .length === 1 |
| 1713 | if (!isFirst) return |
| 1714 | const fallbackTitle = fallbackTitleFromMessage(input.message) |
| 1715 | const cfg = await Config.get() |
| 1716 | const small = |
| 1717 | (await Provider.getSmallModel(input.providerID)) ?? (await Provider.getModel(input.providerID, input.modelID)) |
| 1718 | const language = await Provider.getLanguage(small) |
| 1719 | const provider = await Provider.getProvider(small.providerID) |
| 1720 | if (provider?.options?.disableSessionTitle) return |
| 1721 | const options = pipe( |
| 1722 | {}, |
| 1723 | mergeDeep(ProviderTransform.options(small, input.session.id, provider?.options)), |
| 1724 | mergeDeep(ProviderTransform.smallOptions(small)), |
| 1725 | mergeDeep(small.options), |
| 1726 | ) |
| 1727 | await generateText({ |
| 1728 | // use higher # for reasoning models since reasoning tokens eat up a lot of the budget |
| 1729 | maxOutputTokens: small.capabilities.reasoning ? 3000 : 20, |
| 1730 | providerOptions: ProviderTransform.providerOptions(small, options), |
| 1731 | messages: [ |
| 1732 | ...SystemPrompt.title(small.providerID).map( |
| 1733 | (x): ModelMessage => ({ |
| 1734 | role: "system", |
| 1735 | content: x, |
| 1736 | }), |
| 1737 | ), |
| 1738 | { |
| 1739 | role: "user", |
| 1740 | content: "Generate a title for this conversation:\n", |
| 1741 | }, |
| 1742 | ...MessageV2.toModelMessage([ |
| 1743 | { |
| 1744 | info: { |
| 1745 | id: Identifier.ascending("message"), |
| 1746 | role: "user", |
| 1747 | sessionID: input.session.id, |
| 1748 | time: { |
| 1749 | created: Date.now(), |
| 1750 | }, |
| 1751 | agent: input.message.info.role === "user" ? input.message.info.agent : "build", |
| 1752 | model: { |
| 1753 | providerID: input.providerID, |
| 1754 | modelID: input.modelID, |
| 1755 | }, |
| 1756 | }, |
| 1757 | parts: input.message.parts, |
| 1758 | }, |
no test coverage detected