Generate creates a task name and display name from a user prompt. It attempts multiple strategies in order of preference: 1. Use Claude (Anthropic) to generate semantic names from the prompt if an API key is available 2. Sanitize the prompt directly into a valid task name 3. Generate a random name a
(ctx context.Context, logger slog.Logger, prompt string)
| 309 | // A suffix is always appended to task names to reduce collision risk. |
| 310 | // This function always succeeds and returns a valid TaskName. |
| 311 | func Generate(ctx context.Context, logger slog.Logger, prompt string) TaskName { |
| 312 | if anthropicAPIKey := getAnthropicAPIKeyFromEnv(); anthropicAPIKey != "" { |
| 313 | taskName, err := generateFromAnthropic(ctx, prompt, anthropicAPIKey, getAnthropicModelFromEnv()) |
| 314 | if err == nil { |
| 315 | return taskName |
| 316 | } |
| 317 | // Anthropic failed, fall through to next fallback |
| 318 | logger.Error(ctx, "unable to generate task name and display name from Anthropic", slog.Error(err)) |
| 319 | } |
| 320 | |
| 321 | // Try generating from prompt |
| 322 | taskName, err := generateFromPrompt(prompt) |
| 323 | if err == nil { |
| 324 | return taskName |
| 325 | } |
| 326 | logger.Warn(ctx, "unable to generate task name and display name from prompt", slog.Error(err)) |
| 327 | |
| 328 | // Final fallback |
| 329 | return generateFallback() |
| 330 | } |
| 331 | |
| 332 | func anthropicDataStream(ctx context.Context, client anthropic.Client, model anthropic.Model, input []aisdk.Message) (aisdk.DataStream, error) { |
| 333 | messages, system, err := aisdk.MessagesToAnthropic(input) |