-
Notifications
You must be signed in to change notification settings - Fork 170
Expand file tree
/
Copy pathindex.ts
More file actions
110 lines (102 loc) · 3.15 KB
/
Copy pathindex.ts
File metadata and controls
110 lines (102 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import type {
JSONObject,
RerankingModelV3,
SharedV3Headers,
SharedV3ProviderMetadata,
} from '@ai-sdk/provider';
import type {
OpenRouterRerankingModelId,
OpenRouterRerankingSettings,
} from '../types/openrouter-reranking-settings';
import {
combineHeaders,
createJsonResponseHandler,
postJsonToApi,
} from '@ai-sdk/provider-utils';
import { openrouterFailedResponseHandler } from '../schemas/error-response';
import { OpenRouterProviderMetadataSchema } from '../schemas/provider-metadata';
import { OpenRouterRerankingResponseSchema } from './schemas';
type OpenRouterRerankingConfig = {
provider: string;
headers: () => Record<string, string | undefined>;
url: (options: { modelId: string; path: string }) => string;
fetch?: typeof fetch;
extraBody?: Record<string, unknown>;
};
export class OpenRouterRerankingModel implements RerankingModelV3 {
readonly specificationVersion = 'v3' as const;
readonly provider = 'openrouter';
readonly modelId: OpenRouterRerankingModelId;
readonly settings: OpenRouterRerankingSettings;
private readonly config: OpenRouterRerankingConfig;
constructor(
modelId: OpenRouterRerankingModelId,
settings: OpenRouterRerankingSettings,
config: OpenRouterRerankingConfig,
) {
this.modelId = modelId;
this.settings = settings;
this.config = config;
}
async doRerank({
documents,
query,
topN,
abortSignal,
headers,
}: Parameters<RerankingModelV3['doRerank']>[0]): Promise<
Awaited<ReturnType<RerankingModelV3['doRerank']>>
> {
const documentValues: string[] | JSONObject[] = documents.values;
const args = {
model: this.modelId,
query,
documents: documentValues,
top_n: topN,
user: this.settings.user,
provider: this.settings.provider,
...this.config.extraBody,
...this.settings.extraBody,
};
const { value: responseValue, responseHeaders } = await postJsonToApi({
url: this.config.url({
path: '/rerank',
modelId: this.modelId,
}),
headers: combineHeaders(this.config.headers(), headers),
body: args,
failedResponseHandler: openrouterFailedResponseHandler,
successfulResponseHandler: createJsonResponseHandler(
OpenRouterRerankingResponseSchema,
),
abortSignal,
fetch: this.config.fetch,
});
return {
ranking: responseValue.results.map((result) => ({
index: result.index,
relevanceScore: result.relevance_score,
})),
providerMetadata: {
openrouter: OpenRouterProviderMetadataSchema.parse({
provider: '',
usage: {
promptTokens: responseValue.usage?.prompt_tokens ?? 0,
completionTokens: 0,
totalTokens: responseValue.usage?.total_tokens ?? 0,
...(responseValue.usage?.cost != null
? { cost: responseValue.usage.cost }
: {}),
},
}),
} satisfies SharedV3ProviderMetadata,
response: {
id: responseValue.id,
modelId: responseValue.model,
headers: responseHeaders as SharedV3Headers,
body: responseValue,
},
warnings: [],
};
}
}