Skip to content

Commit 1c91aa8

Browse files
committed
track token usage
1 parent a68fff4 commit 1c91aa8

File tree

6 files changed

+64
-30
lines changed

6 files changed

+64
-30
lines changed

db-scripts/sql/02-tables.sql

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,23 @@ drop table if exists dbo.samples_embeddings;
33
drop table if exists dbo.samples_notes_embeddings;
44
drop table if exists dbo.samples_details_embeddings;
55
drop table if exists dbo.samples;
6+
drop table if exists dbo.openai_used_tokens;
7+
go
8+
9+
drop sequence if exists request_id;
10+
go
11+
12+
create sequence request_id as int start with 1;
13+
go
14+
15+
create table dbo.openai_used_tokens
16+
(
17+
id int identity constraint pk__openai_used_tokens primary key,
18+
request_id int not null,
19+
request_time datetime2 default(sysdatetime()) not null,
20+
source varchar(100),
21+
total_tokens int
22+
)
623

724
create table dbo.samples
825
(

db-scripts/sql/03-get_embedding.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
create or alter procedure [web].[get_embedding]
2+
@rid int,
23
@inputText nvarchar(max),
34
@embedding vector(1536) output,
45
@error nvarchar(max) output
@@ -25,6 +26,9 @@ if @retval != 0 begin
2526
return @retval
2627
end
2728

29+
insert into dbo.openai_used_tokens (request_id, source, total_tokens)
30+
values (@rid, 'get_embeddings', json_value(@response, '$.result.usage.total_tokens'))
31+
2832
declare @re nvarchar(max) = json_query(@response, '$.result.data[0].embedding')
2933
set @embedding = cast(@re as vector(1536));
3034

db-scripts/sql/04-find_samples.sql

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ declare @retval int;
66
declare @samples nvarchar(max)
77
declare @error nvarchar(max)
88

9-
declare @log table (
10-
id int identity primary key nonclustered,
9+
declare @rid int = next value for request_id;
10+
11+
declare @log table (
12+
[id] int identity primary key nonclustered,
13+
[request_id] int not null,
1114
[event_time] datetime2(7) default (CURRENT_TIMESTAMP),
1215
[message] nvarchar(1000),
1316
[output] nvarchar(max)
@@ -21,30 +24,30 @@ begin try
2124
/*
2225
Get the embedding for the requested text
2326
*/
24-
if (@debug = 1) insert into @log ([message]) values ('Getting embeddings for query text...')
27+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Getting embeddings for query text...')
2528

2629
declare @qv vector(1536)
27-
exec @retval = web.get_embedding @text, @qv output, @error output with result sets none
30+
exec @retval = web.get_embedding @rid, @text, @qv output, @error output with result sets none
2831
if (@retval != 0) begin
29-
if (@debug = 1) insert into @log ([message], [output]) values ('Error while getting embedding.', @error)
32+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Error while getting embedding.', @error)
3033
if (@debug = 1) select * from @log;
3134
select @error as error;
3235
return;
3336
end
3437

35-
if (@debug = 1) insert into @log ([message]) values ('Done.')
38+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Done.')
3639

3740

3841
/*
3942
Check in the semantic cache to see if a similar question has been already answered
4043
*/
4144
if (@nocache != 1) begin
42-
if (@debug = 1) insert into @log ([message]) values ('Searching semantic cache...')
45+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Searching semantic cache...')
4346

4447
exec web.query_semantic_cache @qv, @cached_response output with result sets none
4548
if (@cached_response is not null) begin
4649
set @response = @cached_response
47-
if (@debug = 1) insert into @log ([message], [output]) values ('Found result in cache.', @response)
50+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Found result in cache.', @response)
4851
end
4952
end
5053

@@ -54,60 +57,60 @@ begin try
5457
/*
5558
Orchestrate answer
5659
*/
57-
if (@debug = 1) insert into @log ([message], [output]) values ('Orchestrating resolution strategies...', @response)
60+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Orchestrating resolution strategies...', @response)
5861

5962
declare @rt varchar(50), @rq nvarchar(max)
60-
exec @retval = [web].[orchestrate_request] @text, @rt output, @rq output, @error output with result sets none
63+
exec @retval = [web].[orchestrate_request] @rid, @text, @rt output, @rq output, @error output with result sets none
6164
if (@retval != 0) begin
62-
if (@debug = 1) insert into @log ([message], [output]) values ('Error during orchestration evaluation...', @error)
65+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Error during orchestration evaluation...', @error)
6366
if (@debug = 1) select * from @log;
6467
select @error as error;
6568
return;
6669
end
6770

68-
if (@debug = 1) insert into @log ([message], [output]) values ('Strategy determined.', @rt)
69-
if (@debug = 1) insert into @log ([message], [output]) values ('Query defined.', @rq)
71+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Strategy determined.', @rt)
72+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Query defined.', @rq)
7073

71-
if (@debug = 1) insert into @log ([message]) values ('Orchestration planning complete, moving to execution.')
74+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Orchestration planning complete, moving to execution.')
7275

7376
/*
7477
Find the samples using generated T-SQL
7578
*/
7679
if (@rt = 'SQL') begin
77-
if (@debug = 1) insert into @log ([message]) values ('Starting executing generated SQL query...')
80+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Starting executing generated SQL query...')
7881

7982
-- Simple sanitization
8083
declare @trq nvarchar(max) = trim(replace(replace(@rq, char(13), ' '), char(10), ' '));
8184
if (@trq like '%INSERT %' or @trq like '%UPDATE %' or @trq like '%DELETE %' or @trq like '%DROP %' or @trq like '%ALTER %' or @trq like '%CREATE %') begin
82-
if (@debug = 1) insert into @log ([message]) values ('Unauthorized SQL command requested');
85+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Unauthorized SQL command requested');
8386
if (@debug = 1) select * from @log;
8487
select 'NL2SQL' as [error], -1 as [error_code], 'Unauthorized SQL command requested' as [response]
8588
return -1
8689
end
87-
if (@debug = 1) insert into @log ([message], [output]) values ('Query sanitized.', @trq)
90+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Query sanitized.', @trq)
8891

8992
-- Execute generate query
9093
create table #ts (id int, [name] nvarchar(100), [description] nvarchar(max), notes nvarchar(max), details json, created_on datetime2(0), updated_on datetime2(0), distance_score float);
9194
insert into #ts exec sp_executesql @rq
9295
set @samples = cast((select * from #ts for json auto) as nvarchar(max))
93-
if (@debug = 1) insert into @log ([message], [output]) values ('Query executed.', @samples)
96+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Query executed.', @samples)
9497

9598
/* If not results coming from SQL execution, try SEMANTIC anyway */
9699
if (@samples is null) begin
97100
set @rt = 'SEMANTIC'
98-
if (@debug = 1) insert into @log ([message], [output]) values ('Empty resultset returned, switching strategy.', @rt)
101+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Empty resultset returned, switching strategy.', @rt)
99102
end
100103
end
101104

102105
/*
103106
Find the samples using hybrid search
104107
*/
105108
if (@rt like '%SEMANTIC%') begin
106-
if (@debug = 1) insert into @log ([message]) values ('Running hybrid search...')
109+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Running hybrid search...')
107110
set @k = coalesce(@k, 50)
108111

109112
-- Semantic Search
110-
if (@debug = 1) insert into @log ([message]) values ('Running semantic search...')
113+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Running semantic search...')
111114
drop table if exists #ss;
112115
select top(@k)
113116
s.id,
@@ -131,7 +134,7 @@ begin try
131134
--select * from #ss;
132135

133136
-- Fulltext Search
134-
if (@debug = 1) insert into @log ([message]) values ('Running fulltext search...')
137+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Running fulltext search...')
135138
drop table if exists #ks;
136139
select top(@k)
137140
id,
@@ -147,7 +150,7 @@ begin try
147150
--select * from #ks;
148151

149152
-- RRF
150-
if (@debug = 1) insert into @log ([message]) values ('Executing RRF...')
153+
if (@debug = 1) insert into @log ([request_id], [message]) values (@rid, 'Executing RRF...')
151154
drop table if exists #s;
152155
with semantic_search as
153156
(
@@ -203,17 +206,17 @@ begin try
203206
order by similiarity_score desc for json path
204207
)
205208

206-
if (@debug = 1) insert into @log ([message], [output]) values ('Completed hybrid search.', @samples)
209+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Completed hybrid search.', @samples)
207210
end
208211

209212
/*
210213
Send found samples to LLM for generating the final answer
211214
*/
212-
if (@debug = 1) insert into @log ([message], [output]) values ('Generating answer...', null)
215+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Generating answer...', null)
213216
if (@samples is not null) begin
214-
exec @retval = [web].[generate_answer] @text, @samples, @response output, @error output with result sets none;
217+
exec @retval = [web].[generate_answer] @rid, @text, @samples, @response output, @error output with result sets none;
215218
if (@retval != 0) begin
216-
if (@debug = 1) insert into @log ([message], [output]) values ('Error while generating answer.', @error)
219+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Error while generating answer.', @error)
217220
if (@debug = 1) select * from @log;
218221
select @error as error;
219222
return;
@@ -223,7 +226,7 @@ begin try
223226
set @response = '{}'
224227
end
225228

226-
if (@debug = 1) insert into @log ([message], [output]) values ('Answer generated...', @response)
229+
if (@debug = 1) insert into @log ([request_id], [message], [output]) values (@rid, 'Answer generated...', @response)
227230

228231
/*
229232
Cache results

db-scripts/sql/10-generate_answer.sql

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
create or alter procedure [web].[generate_answer]
2+
@rid int,
23
@query_text nvarchar(max),
34
@source nvarchar(max),
45
@response nvarchar(max) output,
@@ -29,7 +30,7 @@ json_object(
2930
Use only the provided samples to help you answer the question.
3031
Use only the information available in the provided JSON to answer the question.
3132
Make sure to use the information in the details to answer the question.
32-
Return at least five samples if you can. More than give is ok if that is possible, up to twenty.
33+
Return at least five samples if you can.
3334
Make sure to use details, notes, and description that are provided in each sample are used only with that sample.
3435
If there are related links or repos in the details of a sample that is included in the answer, include them in the short summary. Include links only if they are related to the sample and if they are available in the note or details of that sample.
3536
If the question cannot be answered by the provided samples, you must say that you don''t know.
@@ -129,4 +130,7 @@ if @refusal != '' begin
129130
set @error = json_object('error':'Generator:OpenAI/Refusal', 'refusal':@refusal, 'response':@response)
130131
return -1
131132
end
132-
GO
133+
134+
insert into dbo.openai_used_tokens (request_id, source, total_tokens)
135+
values (@rid, 'generate_answer', json_value(@response, '$.result.usage.total_tokens'))
136+
GO

db-scripts/sql/11-orchestrate_request_simple.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
create or alter procedure [web].[orchestrate_request]
2+
@rid int,
23
@text nvarchar(max),
34
@result_type varchar(50) output,
45
@result_query nvarchar(max) output,
@@ -123,6 +124,9 @@ if @refusal != '' begin
123124
return -1
124125
end
125126

127+
insert into dbo.openai_used_tokens (request_id, source, total_tokens)
128+
values (@rid, 'orchestrate_request', json_value(@response, '$.result.usage.total_tokens'))
129+
126130
select top(1)
127131
@result_type = sr.response_type,
128132
@result_query = sr.sql_query

db-scripts/utils-scripts/demo.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ go
4242
exec [web].[find_samples] 'code samples used at the ai agent hackaton event in 2025', @debug=1, @nocache=1
4343
go
4444

45+
select * from dbo.openai_used_tokens
4546

4647
select * from dbo.samples where id in (21, 14)
4748

@@ -61,4 +62,5 @@ where json_value(details, '$.type') = 'code sample'
6162
order by [url]
6263

6364

65+
select * from sys.sequences
6466

0 commit comments

Comments
 (0)