effort_catalog.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package claude
  2. import (
  3. "strings"
  4. "unicode"
  5. )
  6. var (
  7. effortLowMediumHigh = []string{"low", "medium", "high"}
  8. effortLowMediumHighMax = []string{"low", "medium", "high", "max"}
  9. effortLowMediumHighXHighMax = []string{"low", "medium", "high", "xhigh", "max"}
  10. )
  11. var effortFamilies = []struct {
  12. family string
  13. levels []string
  14. }{
  15. {family: "claude-mythos-preview", levels: effortLowMediumHighMax},
  16. {family: "claude-mythos-5", levels: effortLowMediumHighXHighMax},
  17. {family: "claude-fable-5", levels: effortLowMediumHighXHighMax},
  18. {family: "claude-sonnet-4-6", levels: effortLowMediumHighMax},
  19. {family: "claude-sonnet-5", levels: effortLowMediumHighXHighMax},
  20. {family: "claude-opus-4-8", levels: effortLowMediumHighXHighMax},
  21. {family: "claude-opus-4-7", levels: effortLowMediumHighXHighMax},
  22. {family: "claude-opus-4-6", levels: effortLowMediumHighMax},
  23. {family: "claude-opus-4-5", levels: effortLowMediumHigh},
  24. {family: "claude-opus-5", levels: effortLowMediumHighXHighMax},
  25. }
  26. // EffortLevelsForModel returns the output_config.effort values accepted by a
  27. // Claude model, ordered from the lightest to the deepest reasoning level.
  28. func EffortLevelsForModel(model string) []string {
  29. id := normalizeEffortModelID(model)
  30. for _, entry := range effortFamilies {
  31. if id == entry.family || strings.HasPrefix(id, entry.family+"-") {
  32. return append([]string(nil), entry.levels...)
  33. }
  34. }
  35. return nil
  36. }
  37. func normalizeEffortModelID(model string) string {
  38. id := strings.ToLower(strings.TrimSpace(model))
  39. id = strings.TrimPrefix(id, "models/")
  40. if slash := strings.IndexByte(id, '/'); slash >= 0 {
  41. id = strings.TrimPrefix(strings.TrimSpace(id[slash+1:]), "models/")
  42. }
  43. id = strings.TrimPrefix(id, "anthropic.")
  44. id = strings.TrimSuffix(id, "-thinking")
  45. if mapped, ok := ModelIDReverseOverrides[id]; ok {
  46. id = mapped
  47. }
  48. if len(id) >= 9 {
  49. suffix := id[len(id)-9:]
  50. if suffix[0] == '-' {
  51. digits := true
  52. for _, r := range suffix[1:] {
  53. if !unicode.IsDigit(r) {
  54. digits = false
  55. break
  56. }
  57. }
  58. if digits {
  59. id = id[:len(id)-9]
  60. }
  61. }
  62. }
  63. return id
  64. }