8e3e0ebf9e
- Introduced Effort enum and ThinkingConfig metadata for per-model reasoning capabilities with min/max effort levels. - Migrated thinking level API from string-based ThinkingLevel to structured Effort enum across agent and AI packages. - Added model-thinking module with effort mapping, policy application, and semantic versioning utilities for provider-specific thinking modes. - Removed supportsXhigh() function and replaced effort clamping with model-aware validation using ThinkingConfig metadata. - Expanded models.json with thinking configuration objects for 50+ models including Claude, Gemini, and OpenAI variants. - Added Python analysis scripts for edit tool usage patterns and tool invocation stream processing.
88 lines
2.8 KiB
TypeScript
88 lines
2.8 KiB
TypeScript
import { type ResolvedThinkingLevel, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
import { clampThinkingLevelForModel, type Effort, type Model, THINKING_EFFORTS } from "@oh-my-pi/pi-ai";
|
|
|
|
/**
|
|
* Metadata used to render thinking selector values in the coding-agent UI.
|
|
*/
|
|
export interface ThinkingLevelMetadata {
|
|
value: ThinkingLevel;
|
|
label: string;
|
|
description: string;
|
|
}
|
|
|
|
const THINKING_LEVEL_METADATA: Record<ThinkingLevel, ThinkingLevelMetadata> = {
|
|
[ThinkingLevel.Inherit]: {
|
|
value: ThinkingLevel.Inherit,
|
|
label: "inherit",
|
|
description: "Inherit session default",
|
|
},
|
|
[ThinkingLevel.Off]: { value: ThinkingLevel.Off, label: "off", description: "No reasoning" },
|
|
[ThinkingLevel.Minimal]: {
|
|
value: ThinkingLevel.Minimal,
|
|
label: "min",
|
|
description: "Very brief reasoning (~1k tokens)",
|
|
},
|
|
[ThinkingLevel.Low]: { value: ThinkingLevel.Low, label: "low", description: "Light reasoning (~2k tokens)" },
|
|
[ThinkingLevel.Medium]: {
|
|
value: ThinkingLevel.Medium,
|
|
label: "medium",
|
|
description: "Moderate reasoning (~8k tokens)",
|
|
},
|
|
[ThinkingLevel.High]: { value: ThinkingLevel.High, label: "high", description: "Deep reasoning (~16k tokens)" },
|
|
[ThinkingLevel.XHigh]: {
|
|
value: ThinkingLevel.XHigh,
|
|
label: "xhigh",
|
|
description: "Maximum reasoning (~32k tokens)",
|
|
},
|
|
};
|
|
|
|
const THINKING_LEVELS = new Set<string>([ThinkingLevel.Inherit, ThinkingLevel.Off, ...THINKING_EFFORTS]);
|
|
const EFFORT_LEVELS = new Set<string>(THINKING_EFFORTS);
|
|
|
|
/**
|
|
* Parses a provider-facing effort value.
|
|
*/
|
|
export function parseEffort(value: string | null | undefined): Effort | undefined {
|
|
return value !== undefined && value !== null && EFFORT_LEVELS.has(value) ? (value as Effort) : undefined;
|
|
}
|
|
|
|
/**
|
|
* Parses an agent-local thinking selector.
|
|
*/
|
|
export function parseThinkingLevel(value: string | null | undefined): ThinkingLevel | undefined {
|
|
return value !== undefined && value !== null && THINKING_LEVELS.has(value) ? (value as ThinkingLevel) : undefined;
|
|
}
|
|
|
|
/**
|
|
* Returns display metadata for a thinking selector.
|
|
*/
|
|
export function getThinkingLevelMetadata(level: ThinkingLevel): ThinkingLevelMetadata {
|
|
return THINKING_LEVEL_METADATA[level];
|
|
}
|
|
|
|
/**
|
|
* Converts an agent-local selector into the effort sent to providers.
|
|
*/
|
|
export function toReasoningEffort(level: ThinkingLevel | undefined): Effort | undefined {
|
|
if (level === undefined || level === ThinkingLevel.Off || level === ThinkingLevel.Inherit) {
|
|
return undefined;
|
|
}
|
|
return level;
|
|
}
|
|
|
|
/**
|
|
* Resolves a selector against the current model while preserving explicit "off".
|
|
*/
|
|
export function resolveThinkingLevelForModel(
|
|
model: Model | undefined,
|
|
level: ThinkingLevel | undefined,
|
|
): ResolvedThinkingLevel | undefined {
|
|
if (level === undefined || level === ThinkingLevel.Inherit) {
|
|
return undefined;
|
|
}
|
|
if (level === ThinkingLevel.Off) {
|
|
return ThinkingLevel.Off;
|
|
}
|
|
return clampThinkingLevelForModel(model, level);
|
|
}
|