feat(ai): improve runtime capability reporting and context settings
Add explicit chat capability tracking, expose formatted runtime capabilities in the info command, and support a max context size option for user AI settings. Also update Ollama base URL resolution to use OLLAMA_ADDRESS and simplify provider chat command execution.
This commit is contained in:
@@ -17,13 +17,8 @@ import {
|
||||
sameRuntimeEndpoint,
|
||||
} from "./ai-runtime-target";
|
||||
|
||||
export type RuntimeModelInfo = {
|
||||
provider: AiProvider;
|
||||
model: string;
|
||||
capabilities: AiModelCapabilities;
|
||||
};
|
||||
|
||||
const CAPABILITY_NAMES: AiCapabilityName[] = [
|
||||
"chat",
|
||||
"vision",
|
||||
"ocr",
|
||||
"thinking",
|
||||
@@ -84,6 +79,7 @@ function capability(supported: boolean, target?: AiRuntimeTarget, runtimeTarget?
|
||||
|
||||
function buildCapabilities(overrides: Partial<Record<AiCapabilityName, AiCapabilityInfo>>): AiModelCapabilities {
|
||||
return Object.assign(new AiModelCapabilities(), {
|
||||
chat: {supported: false},
|
||||
vision: {supported: false},
|
||||
ocr: {supported: false},
|
||||
thinking: {supported: false},
|
||||
@@ -154,6 +150,7 @@ export async function getModelCapabilities(
|
||||
const documentsTarget = resolveAiRuntimeTarget(provider, "documents");
|
||||
|
||||
return buildCapabilities({
|
||||
chat: capability(true, target, runtimeTarget),
|
||||
vision: capability(has("vision"), target, runtimeTarget),
|
||||
ocr: capability(has("ocr"), target, runtimeTarget),
|
||||
thinking: capability(has("thinking"), target, runtimeTarget),
|
||||
@@ -172,6 +169,7 @@ export async function getModelCapabilities(
|
||||
const ttsTarget = resolveAiRuntimeTarget(provider, "textToSpeech");
|
||||
|
||||
return buildCapabilities({
|
||||
chat: capability(true, target, runtimeTarget),
|
||||
vision: capability(chatLike, target, runtimeTarget),
|
||||
ocr: capability(chatLike, target, runtimeTarget),
|
||||
thinking: capability(reasoningModel, target, runtimeTarget),
|
||||
@@ -191,6 +189,7 @@ export async function getModelCapabilities(
|
||||
const ttsTarget = resolveAiRuntimeTarget(provider, "textToSpeech");
|
||||
|
||||
return buildCapabilities({
|
||||
chat: capability(true, target, runtimeTarget),
|
||||
vision: capability(!!caps?.vision, target, runtimeTarget),
|
||||
ocr: capability(!!caps?.ocr, target, runtimeTarget),
|
||||
thinking: capability(!!caps?.reasoning, target, runtimeTarget),
|
||||
@@ -209,6 +208,7 @@ export async function getModelCapabilities(
|
||||
const ttsTarget = resolveAiRuntimeTarget(provider, "textToSpeech");
|
||||
|
||||
return buildCapabilities({
|
||||
chat: capability(true, target, runtimeTarget),
|
||||
vision: capability(isOpenAiVisionModel(model), target, runtimeTarget),
|
||||
ocr: capability(isOpenAiVisionModel(model), target, runtimeTarget),
|
||||
thinking: capability(reasoningModel, target, runtimeTarget),
|
||||
@@ -227,13 +227,13 @@ export async function getModelCapabilities(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export async function getRuntimeCapabilities(
|
||||
provider: AiProvider = Environment.DEFAULT_AI_PROVIDER,
|
||||
model: string | undefined = getRuntimeModel(provider)
|
||||
model: string | undefined = getRuntimeModel(provider),
|
||||
target?: AiRuntimeTarget
|
||||
): Promise<AiModelCapabilities> {
|
||||
const runtimeTarget = resolveAiRuntimeTarget(provider, "chat", model ?? getRuntimeModel(provider));
|
||||
const result = await getModelCapabilities(provider, runtimeTarget.model, "chat") ?? buildCapabilities({});
|
||||
const runtimeTarget = target ?? resolveAiRuntimeTarget(provider, "chat", model ?? getRuntimeModel(provider));
|
||||
const result = await getModelCapabilities(provider, runtimeTarget.model, target?.purpose ?? "chat") ?? buildCapabilities({});
|
||||
|
||||
for (const capabilityName of CAPABILITY_NAMES) {
|
||||
const target = resolveAiRuntimeTarget(provider, capabilityName);
|
||||
@@ -249,12 +249,13 @@ export async function getRuntimeCapabilities(
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function formatRuntimeModelInfo(
|
||||
export async function getFormattedCapabilities(
|
||||
provider: AiProvider = Environment.DEFAULT_AI_PROVIDER,
|
||||
model: string | undefined = getRuntimeModel(provider),
|
||||
caps?: AiModelCapabilities
|
||||
): Promise<string> {
|
||||
caps?: AiModelCapabilities,
|
||||
): Promise<string[]> {
|
||||
if (!caps) caps = await getRuntimeCapabilities(provider, model);
|
||||
|
||||
const line = (title: string, value?: AiCapabilityInfo) => {
|
||||
const state = value?.supported ? "✅" : "❌";
|
||||
const external = value?.external ?? (!!value?.model && value.model !== model);
|
||||
@@ -267,21 +268,30 @@ export async function formatRuntimeModelInfo(
|
||||
});
|
||||
};
|
||||
|
||||
return [
|
||||
line(Environment.runtimeCapabilityChatText, caps.chat),
|
||||
line(Environment.runtimeCapabilityVisionText, caps.vision),
|
||||
line(Environment.runtimeCapabilityOcrText, caps.ocr),
|
||||
line(Environment.runtimeCapabilityThinkingText, caps.thinking),
|
||||
line(Environment.runtimeCapabilityExtendedThinkingText, caps.extendedThinking),
|
||||
line(Environment.runtimeCapabilityToolsText, caps.tools),
|
||||
line(Environment.runtimeCapabilityAudioText, caps.audio),
|
||||
line(Environment.runtimeCapabilitySpeechToTextText, caps.speechToText),
|
||||
line(Environment.runtimeCapabilityTextToSpeechText, caps.textToSpeech),
|
||||
line(Environment.runtimeCapabilityDocumentsText, caps.documents),
|
||||
line(Environment.runtimeCapabilityOutputImagesText, caps.outputImages),
|
||||
];
|
||||
}
|
||||
|
||||
export async function formatRuntimeModelInfo(
|
||||
provider: AiProvider = Environment.DEFAULT_AI_PROVIDER,
|
||||
model: string | undefined = getRuntimeModel(provider),
|
||||
caps?: AiModelCapabilities,
|
||||
): Promise<string> {
|
||||
return Environment.getRuntimeModelInfoText(
|
||||
provider.toString().toLowerCase(),
|
||||
model,
|
||||
[
|
||||
line(Environment.runtimeCapabilityVisionText, caps.vision),
|
||||
line(Environment.runtimeCapabilityOcrText, caps.ocr),
|
||||
line(Environment.runtimeCapabilityThinkingText, caps.thinking),
|
||||
line(Environment.runtimeCapabilityExtendedThinkingText, caps.extendedThinking),
|
||||
line(Environment.runtimeCapabilityToolsText, caps.tools),
|
||||
line(Environment.runtimeCapabilityAudioText, caps.audio),
|
||||
line(Environment.runtimeCapabilitySpeechToTextText, caps.speechToText),
|
||||
line(Environment.runtimeCapabilityTextToSpeechText, caps.textToSpeech),
|
||||
line(Environment.runtimeCapabilityDocumentsText, caps.documents),
|
||||
line(Environment.runtimeCapabilityOutputImagesText, caps.outputImages),
|
||||
],
|
||||
await getFormattedCapabilities(provider, model, caps)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user