#pragma once
#include "causal_lm/causal_lm.h"
#include "transcribe-backend.h"
#include "transcribe-mel.h"
#include "transcribe-model.h"
#include "transcribe-session.h"
#include "transcribe-tokenizer.h"
#include "weights.h"
#include <cstdint>
#include <optional>
#include <string>
#include <vector>
struct ggml_context;
struct ggml_tensor;
struct ggml_backend_buffer;
struct ggml_backend_sched;
typedef struct ggml_backend_buffer * ggml_backend_buffer_t;
typedef struct ggml_backend_sched * ggml_backend_sched_t;
namespace transcribe::canary_qwen {
void apply_family_invariants(transcribe_model & model);
struct ChatTokens {
int32_t im_start = -1; int32_t im_end = -1; int32_t role_user = -1; int32_t role_assistant = -1; };
struct CanaryQwenModel final : public transcribe_model {
Tokenizer tok;
CanaryQwenHParams hparams;
CanaryQwenWeights weights;
ggml_context * ctx_meta = nullptr;
transcribe::BackendPlan plan;
ggml_backend_buffer_t backend_buffer = nullptr;
ggml_context * bn_fused_ctx = nullptr;
ggml_backend_buffer_t bn_fused_buffer = nullptr;
ggml_context * conv_pw_f32_ctx = nullptr;
ggml_backend_buffer_t conv_pw_f32_buffer = nullptr;
ggml_context * linear_f32_ctx = nullptr;
ggml_backend_buffer_t linear_f32_buffer = nullptr;
transcribe::causal_lm::PackedGateUpHandles packed_gate_up;
std::optional<transcribe::MelFrontend> mel;
std::vector<int32_t> prompt_prefix_ids;
std::vector<int32_t> prompt_suffix_ids;
ChatTokens chat_tokens;
CanaryQwenModel() = default;
~CanaryQwenModel() override;
const transcribe::Tokenizer * tokenizer() const override { return &tok; }
};
struct CanaryQwenSession final : public transcribe_session {
transcribe::causal_lm::KvCache kv_cache;
transcribe::causal_lm::KvCache kv_cache_batch;
int kv_batch_cap = 0;
int kv_batch_n_ctx = 0;
std::vector<float> mel_buf; std::vector<float> pos_buf; std::vector<float> pos_div_term; std::vector<float> enc_host;
bool encoder_use_flash = false;
bool decoder_use_flash = false;
CanaryQwenSession() = default;
~CanaryQwenSession() override;
};
}