Loading...
Searching...
No Matches
chat.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 Artificial Intelligence Techniques, S.L. and Roberto López González
3
4#pragma once
5
7
8namespace opennn
9{
10
11class Network;
12#ifndef OPENNN_NO_VISION
14#endif
16#ifndef OPENNN_NO_VISION
17class Transformer;
18#endif
20
27
33
40
41enum class ChatRole
42{
46};
47
49{
50 float temperature = 1.0f;
51 Index top_k = 0;
52 float top_p = 1.0f;
53 float repetition_penalty = 1.0f;
54 Index maximum_tokens = 0;
55};
56
57Index sample_token(VectorR& probabilities,
58 const SamplingConfig&,
59 const vector<Index>& history);
60
66
72
78
79using ChatCallback = function<void(const ChatDelta&)>;
80
98
106
108{
109public:
110 virtual ~ChatTemplate() = default;
111
112 virtual bool supports_reasoning() const noexcept = 0;
113 virtual ReasoningMode default_reasoning_mode() const noexcept = 0;
114
116
118
119 virtual vector<Index> render(const vector<ChatMessage>&,
121 const TokenizerOperator&) const = 0;
122
124 const TokenizerOperator&) const = 0;
125};
126
127class Qwen3ChatTemplate final : public ChatTemplate
128{
129public:
130 bool supports_reasoning() const noexcept override { return true; }
131 ReasoningMode default_reasoning_mode() const noexcept override
132 {
134 }
135
137
138 vector<Index> render(const vector<ChatMessage>&,
140 const TokenizerOperator&) const override;
141
143 const TokenizerOperator&) const override;
144};
145
147{
148public:
150 const GenerationParserSpec&);
151
152 bool push(Index, const ChatCallback& = {});
153 void finish(const ChatCallback& = {});
154
155 const string& get_reasoning() const noexcept { return reasoning_state.text; }
156 const string& get_content() const noexcept { return content_state.text; }
157
158 Index get_reasoning_tokens() const noexcept { return reasoning_tokens; }
159 Index get_content_tokens() const noexcept { return content_tokens; }
160 Index get_control_tokens() const noexcept { return control_tokens; }
161
162private:
163 struct ChannelState
164 {
165 vector<Index> ids;
166 string text;
167 string tail;
168 };
169
170 bool process_pending(const ChatCallback&, bool flush);
171 void append_data_token(Index, const ChatCallback&);
172 void emit_stable_delta(GenerationChannel, const ChatCallback&);
173 ChannelState& channel_state(GenerationChannel) noexcept;
174
175 const TokenizerOperator* tokenizer = nullptr;
176 GenerationParserSpec spec;
177 GenerationChannel channel = GenerationChannel::Content;
178 bool incremental = false;
179 vector<Index> pending;
180 bool stopped = false;
181
182 ChannelState reasoning_state;
183 ChannelState content_state;
184 Index reasoning_tokens = 0;
185 Index content_tokens = 0;
186 Index control_tokens = 0;
187};
188
190{
191public:
192
193 static constexpr Index PREFILL_BLOCK_SIZE = 1024;
194
195#ifndef OPENNN_NO_VISION
198#endif
199
201 const TokenizerOperator&,
202 unique_ptr<ChatTemplate>,
203 unsigned long long seed = 0);
205
206 ChatSession(const ChatSession&) = delete;
208
209 ChatResponse send(string_view user_message,
210 const ChatOptions& = {},
211 const ChatCallback& = {});
212
213 void attach_draft_model(Network&, Index draft_tokens = 4);
214
215 void chat(const ChatOptions& = {});
216
217 void set_messages(const vector<ChatMessage>&);
218 const vector<ChatMessage>& get_messages() const noexcept;
219 void clear();
220 // Release GPU execution storage without discarding conversation or RNG.
221 // Classic sessions retain their existing allocation policy.
222 void trim();
223
226
228
229private:
230 struct Impl;
231 unique_ptr<Impl> impl;
232};
233
234}
const vector< ChatMessage > & get_messages() const noexcept
void chat(const ChatOptions &={})
SamplingConfig default_sampling(ReasoningMode) const
void set_messages(const vector< ChatMessage > &)
ChatSession(Transformer &)
ChatSession(TextGenerationNetwork &)
static constexpr Index PREFILL_BLOCK_SIZE
Definition chat.h:193
ChatSession(const ChatSession &)=delete
ReasoningMode resolve_reasoning_mode(ReasoningMode) const
const ForwardPropagation & get_decode_propagation() const
void attach_draft_model(Network &, Index draft_tokens=4)
ChatSession(Network &, const TokenizerOperator &, unique_ptr< ChatTemplate >, unsigned long long seed=0)
ChatSession & operator=(const ChatSession &)=delete
ChatResponse send(string_view user_message, const ChatOptions &={}, const ChatCallback &={})
Definition chat.h:108
virtual SamplingConfig default_sampling(ReasoningMode) const =0
ReasoningMode resolve_reasoning_mode(ReasoningMode) const
virtual ~ChatTemplate()=default
virtual vector< Index > render(const vector< ChatMessage > &, ReasoningMode, const TokenizerOperator &) const =0
virtual GenerationParserSpec parser_spec(ReasoningMode, const TokenizerOperator &) const =0
virtual bool supports_reasoning() const noexcept=0
virtual ReasoningMode default_reasoning_mode() const noexcept=0
const string & get_content() const noexcept
Definition chat.h:156
Index get_reasoning_tokens() const noexcept
Definition chat.h:158
bool push(Index, const ChatCallback &={})
GenerationParser(const TokenizerOperator &, const GenerationParserSpec &)
Index get_control_tokens() const noexcept
Definition chat.h:160
const string & get_reasoning() const noexcept
Definition chat.h:155
Index get_content_tokens() const noexcept
Definition chat.h:159
void finish(const ChatCallback &={})
Definition network.h:87
Definition chat.h:128
ReasoningMode default_reasoning_mode() const noexcept override
Definition chat.h:131
GenerationParserSpec parser_spec(ReasoningMode, const TokenizerOperator &) const override
SamplingConfig default_sampling(ReasoningMode) const override
bool supports_reasoning() const noexcept override
Definition chat.h:130
vector< Index > render(const vector< ChatMessage > &, ReasoningMode, const TokenizerOperator &) const override
Definition models.h:185
Definition tokenizer_operator.h:35
Definition models.h:153
Definition configuration.h:10
Index sample_token(VectorR &probabilities, const SamplingConfig &, const vector< Index > &history)
ReasoningMode
Definition chat.h:22
@ Enabled
Definition chat.h:24
@ Automatic
Definition chat.h:23
@ Disabled
Definition chat.h:25
FinishReason
Definition chat.h:35
@ Stop
Definition chat.h:36
@ MaximumTokens
Definition chat.h:37
@ ContextLimit
Definition chat.h:38
ChatRole
Definition chat.h:42
@ User
Definition chat.h:44
@ Assistant
Definition chat.h:45
@ System
Definition chat.h:43
function< void(const ChatDelta &)> ChatCallback
Definition chat.h:79
GenerationChannel
Definition chat.h:29
@ Reasoning
Definition chat.h:30
@ Content
Definition chat.h:31
Eigen::Matrix< float, Eigen::Dynamic, 1 > VectorR
Definition opennn_types.h:335
Definition chat.h:74
string text
Definition chat.h:76
GenerationChannel channel
Definition chat.h:75
Definition chat.h:62
ChatRole role
Definition chat.h:63
string content
Definition chat.h:64
Definition chat.h:68
optional< SamplingConfig > sampling
Definition chat.h:70
ReasoningMode reasoning_mode
Definition chat.h:69
Definition chat.h:82
Index control_tokens
Definition chat.h:93
Index generated_tokens
Definition chat.h:90
Index content_tokens
Definition chat.h:92
string content
Definition chat.h:84
FinishReason finish_reason
Definition chat.h:86
Index prefill_tokens
Definition chat.h:89
double prefill_milliseconds
Definition chat.h:95
string reasoning
Definition chat.h:83
Index reasoning_tokens
Definition chat.h:91
double decode_milliseconds
Definition chat.h:96
Index prompt_tokens
Definition chat.h:88
Definition forward_propagation.h:52
Definition chat.h:100
GenerationChannel initial_channel
Definition chat.h:101
vector< Index > reasoning_start
Definition chat.h:102
vector< Index > reasoning_end
Definition chat.h:103
vector< vector< Index > > stop_sequences
Definition chat.h:104
Definition chat.h:49
float temperature
Definition chat.h:50
Index maximum_tokens
Definition chat.h:54
float repetition_penalty
Definition chat.h:53
float top_p
Definition chat.h:52
Index top_k
Definition chat.h:51