@@ -5,16 +5,17 @@ import (
5
5
"context"
6
6
"encoding/json"
7
7
"fmt"
8
+ "io"
9
+ "net/http"
10
+ "strings"
11
+
8
12
"github.com/gin-gonic/gin"
9
13
"github.com/songquanpeng/one-api/common"
10
14
"github.com/songquanpeng/one-api/common/helper"
11
15
"github.com/songquanpeng/one-api/common/logger"
12
16
"github.com/songquanpeng/one-api/relay/channel/openai"
13
17
"github.com/songquanpeng/one-api/relay/constant"
14
18
"github.com/songquanpeng/one-api/relay/model"
15
- "io"
16
- "net/http"
17
- "strings"
18
19
)
19
20
20
21
func ConvertRequest (request model.GeneralOpenAIRequest ) * ChatRequest {
@@ -139,6 +140,64 @@ func StreamHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusC
139
140
return nil , & usage
140
141
}
141
142
143
+ func ConvertEmbeddingRequest (request model.GeneralOpenAIRequest ) * EmbeddingRequest {
144
+ return & EmbeddingRequest {
145
+ Model : request .Model ,
146
+ Prompt : strings .Join (request .ParseInput (), " " ),
147
+ }
148
+ }
149
+
150
+ func EmbeddingHandler (c * gin.Context , resp * http.Response ) (* model.ErrorWithStatusCode , * model.Usage ) {
151
+ var ollamaResponse EmbeddingResponse
152
+ err := json .NewDecoder (resp .Body ).Decode (& ollamaResponse )
153
+ if err != nil {
154
+ return openai .ErrorWrapper (err , "unmarshal_response_body_failed" , http .StatusInternalServerError ), nil
155
+ }
156
+
157
+ err = resp .Body .Close ()
158
+ if err != nil {
159
+ return openai .ErrorWrapper (err , "close_response_body_failed" , http .StatusInternalServerError ), nil
160
+ }
161
+
162
+ if ollamaResponse .Error != "" {
163
+ return & model.ErrorWithStatusCode {
164
+ Error : model.Error {
165
+ Message : ollamaResponse .Error ,
166
+ Type : "ollama_error" ,
167
+ Param : "" ,
168
+ Code : "ollama_error" ,
169
+ },
170
+ StatusCode : resp .StatusCode ,
171
+ }, nil
172
+ }
173
+
174
+ fullTextResponse := embeddingResponseOllama2OpenAI (& ollamaResponse )
175
+ jsonResponse , err := json .Marshal (fullTextResponse )
176
+ if err != nil {
177
+ return openai .ErrorWrapper (err , "marshal_response_body_failed" , http .StatusInternalServerError ), nil
178
+ }
179
+ c .Writer .Header ().Set ("Content-Type" , "application/json" )
180
+ c .Writer .WriteHeader (resp .StatusCode )
181
+ _ , err = c .Writer .Write (jsonResponse )
182
+ return nil , & fullTextResponse .Usage
183
+ }
184
+
185
+ func embeddingResponseOllama2OpenAI (response * EmbeddingResponse ) * openai.EmbeddingResponse {
186
+ openAIEmbeddingResponse := openai.EmbeddingResponse {
187
+ Object : "list" ,
188
+ Data : make ([]openai.EmbeddingResponseItem , 0 , 1 ),
189
+ Model : "text-embedding-v1" ,
190
+ Usage : model.Usage {TotalTokens : 0 },
191
+ }
192
+
193
+ openAIEmbeddingResponse .Data = append (openAIEmbeddingResponse .Data , openai.EmbeddingResponseItem {
194
+ Object : `embedding` ,
195
+ Index : 0 ,
196
+ Embedding : response .Embedding ,
197
+ })
198
+ return & openAIEmbeddingResponse
199
+ }
200
+
142
201
func Handler (c * gin.Context , resp * http.Response ) (* model.ErrorWithStatusCode , * model.Usage ) {
143
202
ctx := context .TODO ()
144
203
var ollamaResponse ChatResponse
0 commit comments