fix: allow replacing unavailable conversation models
Persist the selected model before opening dormant sessions, and reconfigure crashed workers on the same account. Preserve session history and report model removal through the model-unavailable contract instead of a generic runtime failure.
This commit is contained in:
@@ -489,7 +489,11 @@ export class CodingConversationService {
|
||||
try {
|
||||
selected = await this.runtime.validateModel(model);
|
||||
} catch (error) { runtimeError(error); }
|
||||
if (conversation.modelResolution === 'resolved' && conversation.model) {
|
||||
// A dormant Conversation must not need its previous model to start in order
|
||||
// to select a replacement (the previous model may have been removed).
|
||||
await this.prepareFlights.get(conversationId)?.catch(() => undefined);
|
||||
const worker = this.runtime.getDiagnostics().workers.find((item) => item.conversationId === conversationId);
|
||||
if (conversation.modelResolution === 'resolved' && conversation.model && worker) {
|
||||
await this.ensurePrepared(conversationId);
|
||||
let snapshot: ConversationSnapshot;
|
||||
try {
|
||||
|
||||
@@ -149,11 +149,20 @@ export interface PiWorkerCredentialProjectionSummary {
|
||||
}
|
||||
|
||||
export class PiProviderConfigError extends Error {
|
||||
readonly publicError?: { code: 'CODING_MODEL_UNAVAILABLE'; message: string; recoverable: true };
|
||||
|
||||
constructor(
|
||||
public readonly code: 'PROVIDER_INVALID' | 'PROVIDER_AUTH_REQUIRED' | 'MODEL_UNAVAILABLE',
|
||||
message: string,
|
||||
) {
|
||||
super(message);
|
||||
if (code === 'MODEL_UNAVAILABLE') {
|
||||
this.publicError = {
|
||||
code: 'CODING_MODEL_UNAVAILABLE',
|
||||
message: '所选模型当前不可用,请重新选择。',
|
||||
recoverable: true,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -945,7 +945,8 @@ export class PiConversationRuntime implements CodingConversationRuntime {
|
||||
},
|
||||
modelResolution: 'resolved',
|
||||
};
|
||||
if (snapshot.conversation.model.model?.accountId !== selection.accountId) {
|
||||
if (snapshot.conversation.model.model?.accountId !== selection.accountId
|
||||
|| this.pool.getState(input.conversationId)?.state === 'crashed') {
|
||||
const persisted = await this.registry.setModel(input.conversationId, model);
|
||||
this.replaceModel(input.conversationId, persisted);
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user