( level: ComposerThinkingLevel, availableLevels: ComposerThinkingLevel[], )
| 102 | } |
| 103 | |
| 104 | export function clampThinkingLevel( |
| 105 | level: ComposerThinkingLevel, |
| 106 | availableLevels: ComposerThinkingLevel[], |
| 107 | ): ComposerThinkingLevel { |
| 108 | if (availableLevels.includes(level)) { |
| 109 | return level |
| 110 | } |
| 111 | |
| 112 | const orderedLevels: ComposerThinkingLevel[] = [ |
| 113 | 'off', |
| 114 | 'minimal', |
| 115 | 'low', |
| 116 | 'medium', |
| 117 | 'high', |
| 118 | 'xhigh', |
| 119 | ] |
| 120 | const requestedIndex = orderedLevels.indexOf(level) |
| 121 | |
| 122 | if (requestedIndex === -1) { |
| 123 | return availableLevels[0] ?? 'off' |
| 124 | } |
| 125 | |
| 126 | for (let index = requestedIndex; index >= 0; index -= 1) { |
| 127 | const candidate = orderedLevels[index] |
| 128 | if (candidate && availableLevels.includes(candidate)) { |
| 129 | return candidate |
| 130 | } |
| 131 | } |
| 132 | |
| 133 | return availableLevels[0] ?? 'off' |
| 134 | } |
| 135 | |
| 136 | function resolveCurrentModel( |
| 137 | availableModels: ComposerSourceModel[], |
no outgoing calls
no test coverage detected