diff --git a/backend/api/model/app/developer_api/developer_api.go b/backend/api/model/app/developer_api/developer_api.go index 7319d9d278..ce12568c5c 100644 --- a/backend/api/model/app/developer_api/developer_api.go +++ b/backend/api/model/app/developer_api/developer_api.go @@ -935,6 +935,7 @@ const ( // name: Llama ModelClass_Llama ModelClass = 20 ModelClass_StepFun ModelClass = 23 + ModelClass_N1N ModelClass = 24 ModelClass_Other ModelClass = 999 ) @@ -980,6 +981,8 @@ func (p ModelClass) String() string { return "Llama" case ModelClass_StepFun: return "StepFun" + case ModelClass_N1N: + return "N1N" case ModelClass_Other: return "Other" } @@ -1028,6 +1031,8 @@ func ModelClassFromString(s string) (ModelClass, error) { return ModelClass_Llama, nil case "StepFun": return ModelClass_StepFun, nil + case "N1N": + return ModelClass_N1N, nil case "Other": return ModelClass_Other, nil } diff --git a/backend/bizpkg/config/modelmgr/mode_provider.go b/backend/bizpkg/config/modelmgr/mode_provider.go index e3bdb3a79c..2f69abb4b6 100644 --- a/backend/bizpkg/config/modelmgr/mode_provider.go +++ b/backend/bizpkg/config/modelmgr/mode_provider.go @@ -107,6 +107,18 @@ func getModelProviderList() []*config.ModelProvider { }, ModelClass: developer_api.ModelClass_QWen, }, + { + Name: &config.I18nText{ + ZhCn: "N1N 模型", + EnUs: "N1N Model", + }, + IconURI: "default_icon/n1n.png", + Description: &config.I18nText{ + ZhCn: "N1N 模型家族", + EnUs: "n1n model family", + }, + ModelClass: developer_api.ModelClass_N1N, + }, } } diff --git a/backend/bizpkg/llm/modelbuilder/model_builder.go b/backend/bizpkg/llm/modelbuilder/model_builder.go index 7b74ff41a0..c40fb775b7 100644 --- a/backend/bizpkg/llm/modelbuilder/model_builder.go +++ b/backend/bizpkg/llm/modelbuilder/model_builder.go @@ -47,6 +47,7 @@ var modelClass2NewModelBuilder = map[developer_api.ModelClass]func(*config.Model developer_api.ModelClass_Gemini: newGeminiModelBuilder, developer_api.ModelClass_Llama: newOllamaModelBuilder, developer_api.ModelClass_QWen: newQwenModelBuilder, + developer_api.ModelClass_N1N: newOpenaiModelBuilder, } func NewModelBuilder(modelClass developer_api.ModelClass, cfg *config.Model) (Service, error) { diff --git a/backend/conf/model/template/model_template_n1n.yaml b/backend/conf/model/template/model_template_n1n.yaml new file mode 100644 index 0000000000..a8474d387e --- /dev/null +++ b/backend/conf/model/template/model_template_n1n.yaml @@ -0,0 +1,166 @@ +id: 99010 +name: N1N-GPT-4o +icon_uri: default_icon/n1n.png +icon_url: "" +description: + zh: N1N AI 聚合模型 + en: N1N AI Aggregated Model +default_parameters: + - name: temperature + label: + zh: 生成随机性 + en: Temperature + desc: + zh: '- **temperature**: 调高温度会使得模型的输出更多样性和创新性,反之,降低温度会使输出内容更加遵循指令要求但减少多样性。建议不要与“Top p”同时调整。' + en: '**Temperature**:\n\n- When you increase this value, the model outputs more diverse and innovative content; when you decrease it, the model outputs less diverse content that strictly follows the given instructions.\n- It is recommended not to adjust this value with \"Top p\" at the same time.' + type: float + min: "0" + max: "1" + default_val: + balance: "0.8" + creative: "1" + default_val: "1.0" + precise: "0.3" + precision: 1 + options: [] + style: + widget: slider + label: + zh: 生成多样性 + en: Generation diversity + - name: max_tokens + label: + zh: 最大回复长度 + en: Response max length + desc: + zh: 控制模型输出的Tokens 长度上限。通常 100 Tokens 约等于 150 个中文汉字。 + en: You can specify the maximum length of the tokens output through this value. Typically, 100 tokens are approximately equal to 150 Chinese characters. + type: int + min: "1" + max: "4096" + default_val: + default_val: "4096" + options: [] + style: + widget: slider + label: + zh: 输入及输出设置 + en: Input and output settings + - name: top_p + label: + zh: Top P + en: Top P + desc: + zh: '- **Top p 为累计概率**: 模型在生成输出时会从概率最高的词汇开始选择,直到这些词汇的总概率累积达到Top p 值。这样可以限制模型只选择这些高概率的词汇,从而控制输出内容的多样性。建议不要与“生成随机性”同时调整。' + en: '**Top P**:\n\n- An alternative to sampling with temperature, where only tokens within the top p probability mass are considered. For example, 0.1 means only the top 10% probability mass tokens are considered.\n- We recommend altering this or temperature, but not both.' + type: float + min: "0" + max: "1" + default_val: + default_val: "0.95" + precision: 2 + options: [] + style: + widget: slider + label: + zh: 生成多样性 + en: Generation diversity + - name: frequency_penalty + label: + zh: 重复语句惩罚 + en: Frequency penalty + desc: + zh: '- **frequency penalty**: 当该值为正时,会阻止模型频繁使用相同的词汇和短语,从而增加输出内容的多样性。' + en: '**Frequency Penalty**: When positive, it discourages the model from repeating the same words and phrases, thereby increasing the diversity of the output.' + type: float + min: "-2" + max: "2" + default_val: + default_val: "0" + precision: 2 + options: [] + style: + widget: slider + label: + zh: 生成多样性 + en: Generation diversity + - name: presence_penalty + label: + zh: 重复主题惩罚 + en: Presence penalty + desc: + zh: '- **presence penalty**: 当该值为正时,会阻止模型频繁讨论相同的主题,从而增加输出内容的多样性' + en: '**Presence Penalty**: When positive, it prevents the model from discussing the same topics repeatedly, thereby increasing the diversity of the output.' + type: float + min: "-2" + max: "2" + default_val: + default_val: "0" + precision: 2 + options: [] + style: + widget: slider + label: + zh: 生成多样性 + en: Generation diversity + - name: response_format + label: + zh: 输出格式 + en: Response format + desc: + zh: '- **文本**: 使用普通文本格式回复\n- **Markdown**: 将引导模型使用Markdown格式输出回复\n- **JSON**: 将引导模型使用JSON格式输出' + en: '**Response Format**:\n\n- **Text**: Replies in plain text format\n- **Markdown**: Uses Markdown format for replies\n- **JSON**: Uses JSON format for replies' + type: int + min: "" + max: "" + default_val: + default_val: "0" + options: + - label: Text + value: "0" + - label: Markdown + value: "1" + - label: JSON + value: "2" + style: + widget: radio_buttons + label: + zh: 输入及输出设置 + en: Input and output settings +meta: + protocol: openai + capability: + function_call: true + input_modal: + - text + - image + input_tokens: 128000 + json_mode: false + max_tokens: 128000 + output_modal: + - text + output_tokens: 16384 + prefix_caching: false + reasoning: false + prefill_response: false + conn_config: + base_url: "https://api.n1n.ai/v1" + api_key: "" + timeout: 0s + model: "" + temperature: 0.7 + frequency_penalty: 0 + presence_penalty: 0 + max_tokens: 4096 + max_completion_tokens: 4096 + top_p: 1 + top_k: 0 + stop: [] + openai: + by_azure: false + api_version: "" + response_format: + type: text + jsonschema: null + custom: {} + status: 0 diff --git a/docker/volumes/minio/default_icon/n1n.png b/docker/volumes/minio/default_icon/n1n.png new file mode 100644 index 0000000000..51c02caba9 Binary files /dev/null and b/docker/volumes/minio/default_icon/n1n.png differ diff --git a/idl/app/developer_api.thrift b/idl/app/developer_api.thrift index af7c29595f..a255974ddd 100644 --- a/idl/app/developer_api.thrift +++ b/idl/app/developer_api.thrift @@ -538,6 +538,7 @@ enum ModelClass { DeekSeek = 19 // Name: Magic Square Llama = 20 // name: Llama StepFun = 23 + N1N = 24 Other = 999 }