| 50 | } |
| 51 | |
| 52 | export class RequestyHandler extends BaseProvider implements SingleCompletionHandler { |
| 53 | protected options: ApiHandlerOptions |
| 54 | protected models: ModelRecord = {} |
| 55 | private client: OpenAI |
| 56 | private baseURL: string |
| 57 | private readonly providerName = "Requesty" |
| 58 | |
| 59 | constructor(options: ApiHandlerOptions) { |
| 60 | super() |
| 61 | |
| 62 | this.options = options |
| 63 | this.baseURL = toRequestyServiceUrl(options.requestyBaseUrl) |
| 64 | |
| 65 | const apiKey = this.options.requestyApiKey ?? "not-provided" |
| 66 | |
| 67 | this.client = new OpenAI({ |
| 68 | baseURL: this.baseURL, |
| 69 | apiKey: apiKey, |
| 70 | defaultHeaders: DEFAULT_HEADERS, |
| 71 | }) |
| 72 | } |
| 73 | |
| 74 | public async fetchModel() { |
| 75 | this.models = await getModels({ provider: "requesty", baseUrl: this.baseURL }) |
| 76 | return this.getModel() |
| 77 | } |
| 78 | |
| 79 | override getModel() { |
| 80 | const id = this.options.requestyModelId ?? requestyDefaultModelId |
| 81 | const cachedInfo = this.models[id] ?? requestyDefaultModelInfo |
| 82 | let info: ModelInfo = cachedInfo |
| 83 | |
| 84 | // Apply tool preferences for models accessed through routers (OpenAI, Gemini) |
| 85 | info = applyRouterToolPreferences(id, info) |
| 86 | |
| 87 | const params = getModelParams({ |
| 88 | format: "anthropic", |
| 89 | modelId: id, |
| 90 | model: info, |
| 91 | settings: this.options, |
| 92 | defaultTemperature: 0, |
| 93 | }) |
| 94 | |
| 95 | return { id, info, ...params } |
| 96 | } |
| 97 | |
| 98 | protected processUsageMetrics(usage: any, modelInfo?: ModelInfo): ApiStreamUsageChunk { |
| 99 | const requestyUsage = usage as RequestyUsage |
| 100 | const inputTokens = requestyUsage?.prompt_tokens || 0 |
| 101 | const outputTokens = requestyUsage?.completion_tokens || 0 |
| 102 | const cacheWriteTokens = requestyUsage?.prompt_tokens_details?.caching_tokens || 0 |
| 103 | const cacheReadTokens = requestyUsage?.prompt_tokens_details?.cached_tokens || 0 |
| 104 | const { totalCost } = modelInfo |
| 105 | ? calculateApiCostOpenAI(modelInfo, inputTokens, outputTokens, cacheWriteTokens, cacheReadTokens) |
| 106 | : { totalCost: 0 } |
| 107 | |
| 108 | return { |
| 109 | type: "usage", |
nothing calls this directly
no outgoing calls
no test coverage detected