完善文档页文本向量与重排序调用支持

This commit is contained in:
2026-05-31 21:18:41 +08:00
parent 8ee7a7969e
commit 644a6f9d17
24 changed files with 1945 additions and 71 deletions
+107
View File
@@ -131,6 +131,10 @@ func simulatedResult(request Request) map[string]any {
"output_text": fmt.Sprintf("simulation response from %s", request.Candidate.Provider),
"usage": map[string]any{"input_tokens": 12, "output_tokens": 8, "total_tokens": 20},
}
case "embeddings":
return simulatedEmbeddingResult(request)
case "reranks":
return simulatedRerankResult(request)
case "images.edits":
return map[string]any{
"id": "img-edit-simulated",
@@ -172,6 +176,106 @@ func simulatedResult(request Request) map[string]any {
}
}
func simulatedEmbeddingResult(request Request) map[string]any {
inputCount := simulatedEmbeddingInputCount(request.Body["input"])
dimensions := intValue(request.Body, "dimensions", 3)
if dimensions <= 0 {
dimensions = 3
}
if dimensions > 2048 {
dimensions = 2048
}
data := make([]any, 0, inputCount)
for index := 0; index < inputCount; index += 1 {
embedding := make([]any, 0, dimensions)
for dimension := 0; dimension < dimensions; dimension += 1 {
embedding = append(embedding, float64(index+1)/10+float64(dimension)/100)
}
data = append(data, map[string]any{
"object": "embedding",
"index": index,
"embedding": embedding,
})
}
usage := simulatedUsage(request)
return map[string]any{
"id": "embd-simulated",
"object": "list",
"model": request.Model,
"data": data,
"usage": map[string]any{"prompt_tokens": usage.InputTokens, "total_tokens": usage.TotalTokens},
}
}
func simulatedEmbeddingInputCount(value any) int {
switch typed := value.(type) {
case []any:
if len(typed) > 0 {
return len(typed)
}
case []string:
if len(typed) > 0 {
return len(typed)
}
}
return 1
}
func simulatedRerankResult(request Request) map[string]any {
documents := simulatedRerankDocuments(request.Body["documents"])
topN := intValue(request.Body, "top_n", len(documents))
if topN <= 0 || topN > len(documents) {
topN = len(documents)
}
results := make([]any, 0, topN)
for index := 0; index < topN; index += 1 {
score := 0.95 - float64(index)*0.1
if score < 0 {
score = 0
}
result := map[string]any{
"index": index,
"relevance_score": score,
}
if boolValue(request.Body, "return_documents") {
result["document"] = map[string]any{"text": documents[index]}
}
results = append(results, result)
}
usage := simulatedUsage(request)
return map[string]any{
"id": "rerank-simulated",
"object": "list",
"model": request.Model,
"results": results,
"usage": map[string]any{"total_tokens": usage.TotalTokens},
}
}
func simulatedRerankDocuments(value any) []string {
switch typed := value.(type) {
case []any:
out := make([]string, 0, len(typed))
for _, item := range typed {
text := stringValue(map[string]any{"value": item}, "value")
if text == "" {
if record, ok := item.(map[string]any); ok {
text = firstNonEmptyString(stringValue(record, "text"), stringValue(record, "content"))
}
}
out = append(out, text)
}
if len(out) > 0 {
return out
}
case []string:
if len(typed) > 0 {
return typed
}
}
return []string{"simulated document"}
}
func simulatedImageData(request Request, url string, fallbackPrompt string) []any {
count := simulatedOutputCount(request.Body)
items := make([]any, 0, count)
@@ -207,6 +311,9 @@ func simulatedUsage(request Request) Usage {
if request.ModelType == "chat" || request.ModelType == "text_generate" || request.Kind == "responses" {
return Usage{InputTokens: 12, OutputTokens: 8, TotalTokens: 20}
}
if request.ModelType == "text_embedding" || request.ModelType == "text_rerank" || request.Kind == "embeddings" || request.Kind == "reranks" {
return Usage{InputTokens: 16, TotalTokens: 16}
}
return Usage{}
}