refactor(llm): resolve model metadata together

This commit is contained in:
Yichen Jiang
2026-07-26 13:07:27 +08:00
parent baea5018e5
commit 73e7e27799
55 changed files with 607 additions and 460 deletions

View File

@@ -4,22 +4,27 @@ import {
LlmAdapter,
ReasoningEffortId,
type GenerateOptions,
type LlmModelReasoningInfo,
type LlmResolvedModelInfo,
type StreamChunk,
} from '@deepseek-ai/dsh-llm'
const HIGH = ReasoningEffortId('high')
const MAX = ReasoningEffortId('max')
const OFF = ReasoningEffortId('off')
/** Keyless headless-agent adapter: one real bash call followed by a final answer. */
class CliMockAdapter extends LlmAdapter {
override async resolveModelReasoning(): Promise<LlmModelReasoningInfo> {
override async resolveModel(provider: string, model: string): Promise<LlmResolvedModelInfo> {
return {
efforts: [
{ id: HIGH, name: 'High' },
{ id: MAX, name: 'Max' },
],
defaultEffort: HIGH,
provider,
id: model,
name: model,
reasoning: {
efforts: [
{ id: OFF, name: 'Off' },
{ id: HIGH, name: 'High' },
],
defaultEffort: HIGH,
},
}
}
@@ -56,6 +61,6 @@ export function apply(ctx: Context): void {
ctx.llm.registerAdapter(['cli-mock'], new CliMockAdapter())
ctx.on('agent/request', async (_agent, _turn, step, _config, _signal, next) => {
const config = await next()
return step === 2 ? { ...config, reasoningEffort: MAX } : config
return step === 2 ? { ...config, reasoningEffort: OFF } : config
})
}

View File

@@ -159,7 +159,7 @@ describe('headless stream-json snapshots', () => {
{
"model": "cli-mock",
"provider": "cli-mock",
"reasoningEffort": "max",
"reasoningEffort": "off",
},
]
`)

View File

@@ -1,9 +1,8 @@
import type { Context } from 'cordis'
import type {
GenerateOptions,
LlmModelContext,
LlmModelInfo,
LlmModelReasoningInfo,
LlmResolvedModelInfo,
StreamChunk,
} from '@deepseek-ai/dsh-llm'
import { CallId, LlmAdapter, ReasoningEffortId } from '@deepseek-ai/dsh-llm'
@@ -41,21 +40,27 @@ class ScriptedTuiAdapter extends LlmAdapter {
])
}
override resolveModelContext(_provider: string, _model: string): Promise<LlmModelContext> {
return Promise.resolve({ contextWindow: 128_000 })
}
override resolveModelReasoning(
_provider: string,
override resolveModel(
provider: string,
model: string,
): Promise<LlmModelReasoningInfo | undefined> {
if (model !== 'tui-scripted-model-pro') return Promise.resolve(undefined)
): Promise<LlmResolvedModelInfo> {
return Promise.resolve({
efforts: [
{ id: ReasoningEffortId('high'), name: 'High' },
{ id: ReasoningEffortId('max'), name: 'Max' },
],
defaultEffort: ReasoningEffortId('high'),
provider,
id: model,
name: model === 'tui-scripted-model-pro' ? 'Scripted Pro' : 'Scripted Base',
context: { contextWindow: 128_000 },
...model !== 'tui-scripted-model-pro'
? {}
: {
reasoning: {
efforts: [
{ id: ReasoningEffortId('off'), name: 'Off' },
{ id: ReasoningEffortId('high'), name: 'High' },
{ id: ReasoningEffortId('max'), name: 'Max' },
],
defaultEffort: ReasoningEffortId('high'),
},
},
})
}