#pragma once
#include "transcribe.h"
#include <cstdint>
#include <string>
#include <vector>
namespace transcribe {
struct Arch;
class Tokenizer;
}
struct ggml_backend;
typedef struct ggml_backend * ggml_backend_t;
struct transcribe_model {
const transcribe::Arch * arch = nullptr;
std::string variant;
std::string backend;
ggml_backend_t primary_backend = nullptr;
transcribe_capabilities caps{};
uint64_t feature_bits = 0;
struct LimitsBasis {
bool has_context_cap = false;
bool audio_from_caps = false;
int32_t model_max_ctx = 0;
int32_t prompt_overhead = 0;
int32_t gen_reserve = 0;
double ms_per_audio_token = 0.0;
int64_t kv_elems_per_ctx_token = 0;
} limits{};
int64_t t_load_us = 0;
transcribe_model() = default;
virtual ~transcribe_model();
transcribe_model(const transcribe_model &) = delete;
transcribe_model & operator=(const transcribe_model &) = delete;
transcribe_model(transcribe_model &&) = delete;
transcribe_model & operator=(transcribe_model &&) = delete;
virtual const transcribe::Tokenizer * tokenizer() const { return nullptr; }
void set_languages(std::vector<std::string> langs);
private:
std::vector<std::string> language_storage_;
std::vector<const char *> language_ptrs_;
};
namespace transcribe {
inline void set_feature(transcribe_model * m, int f, bool on) {
if (m == nullptr) return;
const unsigned bit = static_cast<unsigned>(f);
if (bit >= 64) return;
const uint64_t mask = (uint64_t) 1 << bit;
if (on) {
m->feature_bits |= mask;
} else {
m->feature_bits &= ~mask;
}
}
inline bool has_feature(const transcribe_model * m, int f) {
if (m == nullptr) return false;
const unsigned bit = static_cast<unsigned>(f);
if (bit >= 64) return false;
return (m->feature_bits & ((uint64_t) 1 << bit)) != 0;
}
}