feat(server): scenario mapping (#13404)

fix AI-404

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Introduced scenario-based configuration for copilot, allowing default
model assignments for various AI use cases.
  * Added a new image generation model to the available options.

* **Improvements**
* Refined copilot provider settings by removing deprecated fallback
options and standardizing base URL configuration.
* Enhanced prompt management to support scenario-driven updates and
improved configuration handling.
* Updated admin and settings interfaces to support new scenario
configurations.

* **Bug Fixes**
* Removed deprecated or unused prompts and related references across
platforms for consistency.

* **Other**
* Improved test coverage and updated test assets to reflect prompt and
scenario changes.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2025-08-04 17:50:38 +08:00
committed by GitHub
parent 7a93db4d12
commit 0fcb4cb0fe
23 changed files with 386 additions and 514 deletions
@@ -45,13 +45,7 @@ export const DEFAULT_DIMENSIONS = 256;
export type OpenAIConfig = {
apiKey: string;
baseUrl?: string;
fallback?: {
text?: string;
structured?: string;
image?: string;
embedding?: string;
};
baseURL?: string;
};
const ModelListSchema = z.object({
@@ -249,7 +243,7 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
super.setup();
this.#instance = createOpenAI({
apiKey: this.config.apiKey,
baseURL: this.config.baseUrl,
baseURL: this.config.baseURL,
});
}
@@ -283,7 +277,7 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
override async refreshOnlineModels() {
try {
const baseUrl = this.config.baseUrl || 'https://api.openai.com/v1';
const baseUrl = this.config.baseURL || 'https://api.openai.com/v1';
if (baseUrl && !this.onlineModelList.length) {
const { data } = await fetch(`${baseUrl}/models`, {
headers: {
@@ -320,7 +314,6 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
const fullCond = {
...cond,
outputType: ModelOutputType.Text,
fallbackModel: this.config.fallback?.text,
};
await this.checkParams({ messages, cond: fullCond, options });
const model = this.selectModel(fullCond);
@@ -361,7 +354,6 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
const fullCond = {
...cond,
outputType: ModelOutputType.Text,
fallbackModel: this.config.fallback?.text,
};
await this.checkParams({ messages, cond: fullCond, options });
const model = this.selectModel(fullCond);
@@ -407,11 +399,7 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
messages: PromptMessage[],
options: CopilotChatOptions = {}
): AsyncIterable<StreamObject> {
const fullCond = {
...cond,
outputType: ModelOutputType.Object,
fallbackModel: this.config.fallback?.text,
};
const fullCond = { ...cond, outputType: ModelOutputType.Object };
await this.checkParams({ cond: fullCond, messages, options });
const model = this.selectModel(fullCond);
@@ -444,11 +432,7 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
messages: PromptMessage[],
options: CopilotStructuredOptions = {}
): Promise<string> {
const fullCond = {
...cond,
outputType: ModelOutputType.Structured,
fallbackModel: this.config.fallback?.structured,
};
const fullCond = { ...cond, outputType: ModelOutputType.Structured };
await this.checkParams({ messages, cond: fullCond, options });
const model = this.selectModel(fullCond);
@@ -488,11 +472,7 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
chunkMessages: PromptMessage[][],
options: CopilotChatOptions = {}
): Promise<number[]> {
const fullCond = {
...cond,
outputType: ModelOutputType.Text,
fallbackModel: this.config.fallback?.text,
};
const fullCond = { ...cond, outputType: ModelOutputType.Text };
await this.checkParams({ messages: [], cond: fullCond, options });
const model = this.selectModel(fullCond);
// get the log probability of "yes"/"no"
@@ -605,7 +585,7 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
);
}
const url = `${this.config.baseUrl || 'https://api.openai.com'}/v1/images/edits`;
const url = `${this.config.baseURL || 'https://api.openai.com/v1'}/images/edits`;
const res = await fetch(url, {
method: 'POST',
headers: { Authorization: `Bearer ${this.config.apiKey}` },
@@ -637,11 +617,7 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
messages: PromptMessage[],
options: CopilotImageOptions = {}
) {
const fullCond = {
...cond,
outputType: ModelOutputType.Image,
fallbackModel: this.config.fallback?.image,
};
const fullCond = { ...cond, outputType: ModelOutputType.Image };
await this.checkParams({ messages, cond: fullCond, options });
const model = this.selectModel(fullCond);
@@ -691,11 +667,7 @@ export class OpenAIProvider extends CopilotProvider<OpenAIConfig> {
options: CopilotEmbeddingOptions = { dimensions: DEFAULT_DIMENSIONS }
): Promise<number[][]> {
messages = Array.isArray(messages) ? messages : [messages];
const fullCond = {
...cond,
outputType: ModelOutputType.Embedding,
fallbackModel: this.config.fallback?.embedding,
};
const fullCond = { ...cond, outputType: ModelOutputType.Embedding };
await this.checkParams({ embeddings: messages, cond: fullCond, options });
const model = this.selectModel(fullCond);