feat: add database tables and API routes for agentic chat feature (#17570)

Backend portion of experimental `AgenticChat` feature:
- Adds database tables for chats and chat messages
- Adds functionality to stream messages from LLM providers using
`kylecarbs/aisdk-go`
- Adds API routes with relevant functionality (list, create, update
chats, insert chat message)
- Adds experiment `codersdk.AgenticChat`

---------

Co-authored-by: Kyle Carberry <kyle@carberry.com>
This commit is contained in:
Cian Johnston
2025-05-02 17:29:57 +01:00
committed by GitHub
parent 64b9bc1ca4
commit 544259b809
45 changed files with 4264 additions and 16 deletions

View File

@ -142,6 +142,30 @@ func APIKey(t testing.TB, db database.Store, seed database.APIKey) (key database
return key, fmt.Sprintf("%s-%s", key.ID, secret)
}
func Chat(t testing.TB, db database.Store, seed database.Chat) database.Chat {
chat, err := db.InsertChat(genCtx, database.InsertChatParams{
OwnerID: takeFirst(seed.OwnerID, uuid.New()),
CreatedAt: takeFirst(seed.CreatedAt, dbtime.Now()),
UpdatedAt: takeFirst(seed.UpdatedAt, dbtime.Now()),
Title: takeFirst(seed.Title, "Test Chat"),
})
require.NoError(t, err, "insert chat")
return chat
}
func ChatMessage(t testing.TB, db database.Store, seed database.ChatMessage) database.ChatMessage {
msg, err := db.InsertChatMessages(genCtx, database.InsertChatMessagesParams{
CreatedAt: takeFirst(seed.CreatedAt, dbtime.Now()),
ChatID: takeFirst(seed.ChatID, uuid.New()),
Model: takeFirst(seed.Model, "train"),
Provider: takeFirst(seed.Provider, "thomas"),
Content: takeFirstSlice(seed.Content, []byte(`[{"text": "Choo choo!"}]`)),
})
require.NoError(t, err, "insert chat message")
require.Len(t, msg, 1, "insert one chat message did not return exactly one message")
return msg[0]
}
func WorkspaceAgentPortShare(t testing.TB, db database.Store, orig database.WorkspaceAgentPortShare) database.WorkspaceAgentPortShare {
ps, err := db.UpsertWorkspaceAgentPortShare(genCtx, database.UpsertWorkspaceAgentPortShareParams{
WorkspaceID: takeFirst(orig.WorkspaceID, uuid.New()),