Skip to content

Commit 83b2b07

Browse files
authored
Merge pull request #1915 from danding5/main
add submodel.ai
2 parents ffc0774 + fc2d992 commit 83b2b07

File tree

40 files changed

+3598
-465
lines changed

40 files changed

+3598
-465
lines changed

README.en.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<p align="right">
2-
<a href="./README.md">中文</a> | <strong>English</strong>
2+
<a href="./README.md">中文</a> | <strong>English</strong> | <a href="./README.fr.md">Français</a>
33
</p>
44
<div align="center">
55

README.fr.md

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
<p align="right">
2+
<a href="./README.md">中文</a> | <a href="./README.en.md">English</a> | <strong>Français</strong>
3+
</p>
4+
<div align="center">
5+
6+
![new-api](/web/public/logo.png)
7+
8+
# New API
9+
10+
🍥 Passerelle de modèles étendus de nouvelle génération et système de gestion d'actifs d'IA
11+
12+
<a href="https://trendshift.io/repositories/8227" target="_blank"><img src="https://trendshift.io/api/badge/repositories/8227" alt="Calcium-Ion%2Fnew-api | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
13+
14+
<p align="center">
15+
<a href="https://raw.githubusercontent.com/Calcium-Ion/new-api/main/LICENSE">
16+
<img src="https://img.shields.io/github/license/Calcium-Ion/new-api?color=brightgreen" alt="licence">
17+
</a>
18+
<a href="https://github.com/Calcium-Ion/new-api/releases/latest">
19+
<img src="https://img.shields.io/github/v/release/Calcium-Ion/new-api?color=brightgreen&include_prereleases" alt="version">
20+
</a>
21+
<a href="https://github.com/users/Calcium-Ion/packages/container/package/new-api">
22+
<img src="https://img.shields.io/badge/docker-ghcr.io-blue" alt="docker">
23+
</a>
24+
<a href="https://hub.docker.com/r/CalciumIon/new-api">
25+
<img src="https://img.shields.io/badge/docker-dockerHub-blue" alt="docker">
26+
</a>
27+
<a href="https://goreportcard.com/report/github.com/Calcium-Ion/new-api">
28+
<img src="https://goreportcard.com/badge/github.com/Calcium-Ion/new-api" alt="GoReportCard">
29+
</a>
30+
</p>
31+
</div>
32+
33+
## 📝 Description du projet
34+
35+
> [!NOTE]
36+
> Il s'agit d'un projet open-source développé sur la base de [One API](https://github.com/songquanpeng/one-api)
37+
38+
> [!IMPORTANT]
39+
> - Ce projet est uniquement destiné à des fins d'apprentissage personnel, sans garantie de stabilité ni de support technique.
40+
> - Les utilisateurs doivent se conformer aux [Conditions d'utilisation](https://openai.com/policies/terms-of-use) d'OpenAI et aux **lois et réglementations applicables**, et ne doivent pas l'utiliser à des fins illégales.
41+
> - Conformément aux [《Mesures provisoires pour la gestion des services d'intelligence artificielle générative》](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm), veuillez ne fournir aucun service d'IA générative non enregistré au public en Chine.
42+
43+
<h2>🤝 Partenaires de confiance</h2>
44+
<p id="premium-sponsors">&nbsp;</p>
45+
<p align="center"><strong>Sans ordre particulier</strong></p>
46+
<p align="center">
47+
<a href="https://www.cherry-ai.com/" target=_blank><img
48+
src="./docs/images/cherry-studio.png" alt="Cherry Studio" height="120"
49+
/></a>
50+
<a href="https://bda.pku.edu.cn/" target=_blank><img
51+
src="./docs/images/pku.png" alt="Université de Pékin" height="120"
52+
/></a>
53+
<a href="https://www.compshare.cn/?ytag=GPU_yy_gh_newapi" target=_blank><img
54+
src="./docs/images/ucloud.png" alt="UCloud" height="120"
55+
/></a>
56+
<a href="https://www.aliyun.com/" target=_blank><img
57+
src="./docs/images/aliyun.png" alt="Alibaba Cloud" height="120"
58+
/></a>
59+
<a href="https://io.net/" target=_blank><img
60+
src="./docs/images/io-net.png" alt="IO.NET" height="120"
61+
/></a>
62+
</p>
63+
<p>&nbsp;</p>
64+
65+
## 📚 Documentation
66+
67+
Pour une documentation détaillée, veuillez consulter notre Wiki officiel : [https://docs.newapi.pro/](https://docs.newapi.pro/)
68+
69+
Vous pouvez également accéder au DeepWiki généré par l'IA :
70+
[![Demander à DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/QuantumNous/new-api)
71+
72+
## ✨ Fonctionnalités clés
73+
74+
New API offre un large éventail de fonctionnalités, veuillez vous référer à [Présentation des fonctionnalités](https://docs.newapi.pro/wiki/features-introduction) pour plus de détails :
75+
76+
1. 🎨 Nouvelle interface utilisateur
77+
2. 🌍 Prise en charge multilingue
78+
3. 💰 Fonctionnalité de recharge en ligne (YiPay)
79+
4. 🔍 Prise en charge de la recherche de quotas d'utilisation avec des clés (fonctionne avec [neko-api-key-tool](https://github.com/Calcium-Ion/neko-api-key-tool))
80+
5. 🔄 Compatible avec la base de données originale de One API
81+
6. 💵 Prise en charge de la tarification des modèles de paiement à l'utilisation
82+
7. ⚖️ Prise en charge de la sélection aléatoire pondérée des canaux
83+
8. 📈 Tableau de bord des données (console)
84+
9. 🔒 Regroupement de jetons et restrictions de modèles
85+
10. 🤖 Prise en charge de plus de méthodes de connexion par autorisation (LinuxDO, Telegram, OIDC)
86+
11. 🔄 Prise en charge des modèles Rerank (Cohere et Jina), [Documentation de l'API](https://docs.newapi.pro/api/jinaai-rerank)
87+
12. ⚡ Prise en charge de l'API OpenAI Realtime (y compris les canaux Azure), [Documentation de l'API](https://docs.newapi.pro/api/openai-realtime)
88+
13. ⚡ Prise en charge du format Claude Messages, [Documentation de l'API](https://docs.newapi.pro/api/anthropic-chat)
89+
14. Prise en charge de l'accès à l'interface de discussion via la route /chat2link
90+
15. 🧠 Prise en charge de la définition de l'effort de raisonnement via les suffixes de nom de modèle :
91+
1. Modèles de la série o d'OpenAI
92+
- Ajouter le suffixe `-high` pour un effort de raisonnement élevé (par exemple : `o3-mini-high`)
93+
- Ajouter le suffixe `-medium` pour un effort de raisonnement moyen (par exemple : `o3-mini-medium`)
94+
- Ajouter le suffixe `-low` pour un effort de raisonnement faible (par exemple : `o3-mini-low`)
95+
2. Modèles de pensée de Claude
96+
- Ajouter le suffixe `-thinking` pour activer le mode de pensée (par exemple : `claude-3-7-sonnet-20250219-thinking`)
97+
16. 🔄 Fonctionnalité de la pensée au contenu
98+
17. 🔄 Limitation du débit du modèle pour les utilisateurs
99+
18. 💰 Prise en charge de la facturation du cache, qui permet de facturer à un ratio défini lorsque le cache est atteint :
100+
1. Définir l'option `Ratio de cache d'invite` dans `Paramètres système->Paramètres de fonctionnement`
101+
2. Définir le `Ratio de cache d'invite` dans le canal, plage de 0 à 1, par exemple, le définir sur 0,5 signifie facturer à 50 % lorsque le cache est atteint
102+
3. Canaux pris en charge :
103+
- [x] OpenAI
104+
- [x] Azure
105+
- [x] DeepSeek
106+
- [x] Claude
107+
108+
## Prise en charge des modèles
109+
110+
Cette version prend en charge plusieurs modèles, veuillez vous référer à [Documentation de l'API-Interface de relais](https://docs.newapi.pro/api) pour plus de détails :
111+
112+
1. Modèles tiers **gpts** (gpt-4-gizmo-*)
113+
2. Canal tiers [Midjourney-Proxy(Plus)](https://github.com/novicezk/midjourney-proxy), [Documentation de l'API](https://docs.newapi.pro/api/midjourney-proxy-image)
114+
3. Canal tiers [Suno API](https://github.com/Suno-API/Suno-API), [Documentation de l'API](https://docs.newapi.pro/api/suno-music)
115+
4. Canaux personnalisés, prenant en charge la saisie complète de l'adresse d'appel
116+
5. Modèles Rerank ([Cohere](https://cohere.ai/) et [Jina](https://jina.ai/)), [Documentation de l'API](https://docs.newapi.pro/api/jinaai-rerank)
117+
6. Format de messages Claude, [Documentation de l'API](https://docs.newapi.pro/api/anthropic-chat)
118+
7. Dify, ne prend actuellement en charge que chatflow
119+
120+
## Configuration des variables d'environnement
121+
122+
Pour des instructions de configuration détaillées, veuillez vous référer à [Guide d'installation-Configuration des variables d'environnement](https://docs.newapi.pro/installation/environment-variables) :
123+
124+
- `GENERATE_DEFAULT_TOKEN` : S'il faut générer des jetons initiaux pour les utilisateurs nouvellement enregistrés, la valeur par défaut est `false`
125+
- `STREAMING_TIMEOUT` : Délai d'expiration de la réponse en streaming, la valeur par défaut est de 300 secondes
126+
- `DIFY_DEBUG` : S'il faut afficher les informations sur le flux de travail et les nœuds pour les canaux Dify, la valeur par défaut est `true`
127+
- `FORCE_STREAM_OPTION` : S'il faut remplacer le paramètre client stream_options, la valeur par défaut est `true`
128+
- `GET_MEDIA_TOKEN` : S'il faut compter les jetons d'image, la valeur par défaut est `true`
129+
- `GET_MEDIA_TOKEN_NOT_STREAM` : S'il faut compter les jetons d'image dans les cas sans streaming, la valeur par défaut est `true`
130+
- `UPDATE_TASK` : S'il faut mettre à jour les tâches asynchrones (Midjourney, Suno), la valeur par défaut est `true`
131+
- `COHERE_SAFETY_SETTING` : Paramètres de sécurité du modèle Cohere, les options sont `NONE`, `CONTEXTUAL`, `STRICT`, la valeur par défaut est `NONE`
132+
- `GEMINI_VISION_MAX_IMAGE_NUM` : Nombre maximum d'images pour les modèles Gemini, la valeur par défaut est `16`
133+
- `MAX_FILE_DOWNLOAD_MB` : Taille maximale de téléchargement de fichier en Mo, la valeur par défaut est `20`
134+
- `CRYPTO_SECRET` : Clé de chiffrement utilisée pour chiffrer le contenu de la base de données
135+
- `AZURE_DEFAULT_API_VERSION` : Version de l'API par défaut du canal Azure, la valeur par défaut est `2025-04-01-preview`
136+
- `NOTIFICATION_LIMIT_DURATION_MINUTE` : Durée de la limite de notification, la valeur par défaut est de `10` minutes
137+
- `NOTIFY_LIMIT_COUNT` : Nombre maximal de notifications utilisateur dans la durée spécifiée, la valeur par défaut est `2`
138+
- `ERROR_LOG_ENABLED=true` : S'il faut enregistrer et afficher les journaux d'erreurs, la valeur par défaut est `false`
139+
140+
## Déploiement
141+
142+
Pour des guides de déploiement détaillés, veuillez vous référer à [Guide d'installation-Méthodes de déploiement](https://docs.newapi.pro/installation) :
143+
144+
> [!TIP]
145+
> Dernière image Docker : `calciumion/new-api:latest`
146+
147+
### Considérations sur le déploiement multi-machines
148+
- La variable d'environnement `SESSION_SECRET` doit être définie, sinon l'état de connexion sera incohérent sur plusieurs machines
149+
- Si vous partagez Redis, `CRYPTO_SECRET` doit être défini, sinon le contenu de Redis ne pourra pas être consulté sur plusieurs machines
150+
151+
### Exigences de déploiement
152+
- Base de données locale (par défaut) : SQLite (le déploiement Docker doit monter le répertoire `/data`)
153+
- Base de données distante : MySQL version >= 5.7.8, PgSQL version >= 9.6
154+
155+
### Méthodes de déploiement
156+
157+
#### Utilisation de la fonctionnalité Docker du panneau BaoTa
158+
Installez le panneau BaoTa (version **9.2.0** ou supérieure), recherchez **New-API** dans le magasin d'applications et installez-le.
159+
[Tutoriel avec des images](./docs/BT.md)
160+
161+
#### Utilisation de Docker Compose (recommandé)
162+
```shell
163+
# Télécharger le projet
164+
git clone https://github.com/Calcium-Ion/new-api.git
165+
cd new-api
166+
# Modifier docker-compose.yml si nécessaire
167+
# Démarrer
168+
docker-compose up -d
169+
```
170+
171+
#### Utilisation directe de l'image Docker
172+
```shell
173+
# Utilisation de SQLite
174+
docker run --name new-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/new-api:/data calciumion/new-api:latest
175+
176+
# Utilisation de MySQL
177+
docker run --name new-api -d --restart always -p 3000:3000 -e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi" -e TZ=Asia/Shanghai -v /home/ubuntu/data/new-api:/data calciumion/new-api:latest
178+
```
179+
180+
## Nouvelle tentative de canal et cache
181+
La fonctionnalité de nouvelle tentative de canal a été implémentée, vous pouvez définir le nombre de tentatives dans `Paramètres->Paramètres de fonctionnement->Paramètres généraux`. Il est **recommandé d'activer la mise en cache**.
182+
183+
### Méthode de configuration du cache
184+
1. `REDIS_CONN_STRING` : Définir Redis comme cache
185+
2. `MEMORY_CACHE_ENABLED` : Activer le cache mémoire (pas besoin de le définir manuellement si Redis est défini)
186+
187+
## Documentation de l'API
188+
189+
Pour une documentation détaillée de l'API, veuillez vous référer à [Documentation de l'API](https://docs.newapi.pro/api) :
190+
191+
- [API de discussion](https://docs.newapi.pro/api/openai-chat)
192+
- [API d'image](https://docs.newapi.pro/api/openai-image)
193+
- [API de rerank](https://docs.newapi.pro/api/jinaai-rerank)
194+
- [API en temps réel](https://docs.newapi.pro/api/openai-realtime)
195+
- [API de discussion Claude (messages)](https://docs.newapi.pro/api/anthropic-chat)
196+
197+
## Projets connexes
198+
- [One API](https://github.com/songquanpeng/one-api) : Projet original
199+
- [Midjourney-Proxy](https://github.com/novicezk/midjourney-proxy) : Prise en charge de l'interface Midjourney
200+
- [chatnio](https://github.com/Deeptrain-Community/chatnio) : Solution B/C unique d'IA de nouvelle génération
201+
- [neko-api-key-tool](https://github.com/Calcium-Ion/neko-api-key-tool) : Interroger le quota d'utilisation avec une clé
202+
203+
Autres projets basés sur New API :
204+
- [new-api-horizon](https://github.com/Calcium-Ion/new-api-horizon) : Version optimisée hautes performances de New API
205+
- [VoAPI](https://github.com/VoAPI/VoAPI) : Version embellie du frontend basée sur New API
206+
207+
## Aide et support
208+
209+
Si vous avez des questions, veuillez vous référer à [Aide et support](https://docs.newapi.pro/support) :
210+
- [Interaction avec la communauté](https://docs.newapi.pro/support/community-interaction)
211+
- [Commentaires sur les problèmes](https://docs.newapi.pro/support/feedback-issues)
212+
- [FAQ](https://docs.newapi.pro/support/faq)
213+
214+
## 🌟 Historique des étoiles
215+
216+
[![Graphique de l'historique des étoiles](https://api.star-history.com/svg?repos=Calcium-Ion/new-api&type=Date)](https://star-history.com/#Calcium-Ion/new-api&Date)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<p align="right">
2-
<strong>中文</strong> | <a href="./README.en.md">English</a>
2+
<strong>中文</strong> | <a href="./README.en.md">English</a> | <a href="./README.fr.md">Français</a>
33
</p>
44
<div align="center">
55

common/api_type.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ func ChannelType2APIType(channelType int) (int, bool) {
6767
apiType = constant.APITypeJimeng
6868
case constant.ChannelTypeMoonshot:
6969
apiType = constant.APITypeMoonshot
70+
case constant.ChannelTypeSubmodel:
71+
apiType = constant.APITypeSubmodel
7072
}
7173
if apiType == -1 {
7274
return constant.APITypeOpenAI, false

common/sys_log.go

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ package common
22

33
import (
44
"fmt"
5-
"github.com/gin-gonic/gin"
65
"os"
76
"time"
7+
8+
"github.com/gin-gonic/gin"
89
)
910

1011
func SysLog(s string) {
@@ -22,3 +23,33 @@ func FatalLog(v ...any) {
2223
_, _ = fmt.Fprintf(gin.DefaultErrorWriter, "[FATAL] %v | %v \n", t.Format("2006/01/02 - 15:04:05"), v)
2324
os.Exit(1)
2425
}
26+
27+
func LogStartupSuccess(startTime time.Time, port string) {
28+
29+
duration := time.Since(startTime)
30+
durationMs := duration.Milliseconds()
31+
32+
// Get network IPs
33+
networkIps := GetNetworkIps()
34+
35+
// Print blank line for spacing
36+
fmt.Fprintf(gin.DefaultWriter, "\n")
37+
38+
// Print the main success message
39+
fmt.Fprintf(gin.DefaultWriter, " \033[32m%s %s\033[0m ready in %d ms\n", SystemName, Version, durationMs)
40+
fmt.Fprintf(gin.DefaultWriter, "\n")
41+
42+
// Skip fancy startup message in container environments
43+
if !IsRunningInContainer() {
44+
// Print local URL
45+
fmt.Fprintf(gin.DefaultWriter, " ➜ \033[1mLocal:\033[0m http://localhost:%s/\n", port)
46+
}
47+
48+
// Print network URLs
49+
for _, ip := range networkIps {
50+
fmt.Fprintf(gin.DefaultWriter, " ➜ \033[1mNetwork:\033[0m http://%s:%s/\n", ip, port)
51+
}
52+
53+
// Print blank line for spacing
54+
fmt.Fprintf(gin.DefaultWriter, "\n")
55+
}

common/utils.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,78 @@ func GetIp() (ip string) {
6868
return
6969
}
7070

71+
func GetNetworkIps() []string {
72+
var networkIps []string
73+
ips, err := net.InterfaceAddrs()
74+
if err != nil {
75+
log.Println(err)
76+
return networkIps
77+
}
78+
79+
for _, a := range ips {
80+
if ipNet, ok := a.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
81+
if ipNet.IP.To4() != nil {
82+
ip := ipNet.IP.String()
83+
// Include common private network ranges
84+
if strings.HasPrefix(ip, "10.") ||
85+
strings.HasPrefix(ip, "172.") ||
86+
strings.HasPrefix(ip, "192.168.") {
87+
networkIps = append(networkIps, ip)
88+
}
89+
}
90+
}
91+
}
92+
return networkIps
93+
}
94+
95+
// IsRunningInContainer detects if the application is running inside a container
96+
func IsRunningInContainer() bool {
97+
// Method 1: Check for .dockerenv file (Docker containers)
98+
if _, err := os.Stat("/.dockerenv"); err == nil {
99+
return true
100+
}
101+
102+
// Method 2: Check cgroup for container indicators
103+
if data, err := os.ReadFile("/proc/1/cgroup"); err == nil {
104+
content := string(data)
105+
if strings.Contains(content, "docker") ||
106+
strings.Contains(content, "containerd") ||
107+
strings.Contains(content, "kubepods") ||
108+
strings.Contains(content, "/lxc/") {
109+
return true
110+
}
111+
}
112+
113+
// Method 3: Check environment variables commonly set by container runtimes
114+
containerEnvVars := []string{
115+
"KUBERNETES_SERVICE_HOST",
116+
"DOCKER_CONTAINER",
117+
"container",
118+
}
119+
120+
for _, envVar := range containerEnvVars {
121+
if os.Getenv(envVar) != "" {
122+
return true
123+
}
124+
}
125+
126+
// Method 4: Check if init process is not the traditional init
127+
if data, err := os.ReadFile("/proc/1/comm"); err == nil {
128+
comm := strings.TrimSpace(string(data))
129+
// In containers, process 1 is often not "init" or "systemd"
130+
if comm != "init" && comm != "systemd" {
131+
// Additional check: if it's a common container entrypoint
132+
if strings.Contains(comm, "docker") ||
133+
strings.Contains(comm, "containerd") ||
134+
strings.Contains(comm, "runc") {
135+
return true
136+
}
137+
}
138+
}
139+
140+
return false
141+
}
142+
71143
var sizeKB = 1024
72144
var sizeMB = sizeKB * 1024
73145
var sizeGB = sizeMB * 1024

constant/api_type.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const (
3131
APITypeXai
3232
APITypeCoze
3333
APITypeJimeng
34-
APITypeMoonshot // this one is only for count, do not add any channel after this
35-
APITypeDummy // this one is only for count, do not add any channel after this
34+
APITypeMoonshot
35+
APITypeSubmodel
36+
APITypeDummy // this one is only for count, do not add any channel after this
3637
)

constant/channel.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ const (
5050
ChannelTypeKling = 50
5151
ChannelTypeJimeng = 51
5252
ChannelTypeVidu = 52
53+
ChannelTypeSubmodel = 53
5354
ChannelTypeDummy // this one is only for count, do not add any channel after this
5455

56+
5557
)
5658

5759
var ChannelBaseURLs = []string{
@@ -108,4 +110,5 @@ var ChannelBaseURLs = []string{
108110
"https://api.klingai.com", //50
109111
"https://visual.volcengineapi.com", //51
110112
"https://api.vidu.cn", //52
113+
"https://llm.submodel.ai", //53
111114
}

0 commit comments

Comments
 (0)