1
00:00:00,151 --> 00:00:02,242
You ask your agent a simple question.

2
00:00:02,242 --> 00:00:03,882
What's the average order value?

3
00:00:03,882 --> 00:00:05,822
It says access denied.

4
00:00:05,923 --> 00:00:12,785
Not because you're not allowed, but because nobody told the agent who you are, what data
you can see, and what rules to apply to you.

5
00:00:12,785 --> 00:00:15,926
That is the reality of AI agents and enterprise data.

6
00:00:15,926 --> 00:00:18,846
Powerful, but unpredictable by default.

7
00:00:19,187 --> 00:00:27,799
My colleague Pascal has been exploring how to fix that by combining specialized data
agents with deterministic workflows using a framework called Agno.

8
00:00:28,171 --> 00:00:34,390
In this episode, he'll show us how it works from a natural language question to an access
check to an answer.

9
00:00:34,572 --> 00:00:38,032
I am Jonny and welcome to Technology Explorations at Dataminded.

10
00:00:46,505 --> 00:00:47,645
Hi everyone.

11
00:00:47,685 --> 00:00:50,125
Welcome to technology explorations at Dataminded.

12
00:00:50,125 --> 00:00:54,265
In this series, we give you an initial look into new or interesting technologies.

13
00:00:54,267 --> 00:01:00,667
And today we'll have a look at Agno, a tool that allows you to build workflows to shape
your agents and talk to your data.

14
00:01:00,667 --> 00:01:04,267
And for this, I've invited Pascal, the CTO of Dataminded.

15
00:01:04,267 --> 00:01:05,407
Welcome Pascal.

16
00:01:06,024 --> 00:01:07,032
Hi, Jonny.

17
00:01:07,032 --> 00:01:10,973
Before we dive in, could you quickly introduce yourself and your role at Dataminded?

18
00:01:10,973 --> 00:01:14,550
Well, as you mentioned, Jonny my name is Pascal,

19
00:01:14,550 --> 00:01:16,701
I'm CTO of Dataminded.

20
00:01:16,701 --> 00:01:25,020
That means I'm responsible for the technical vision I'm also responsible for our products
here at Dataminded We have two products.

21
00:01:25,020 --> 00:01:29,021
One is Conveyor, which is uh a data engineering workbench.

22
00:01:29,021 --> 00:01:34,564
And on the other side, we have an open source project it's called Data Product Portal to
start treating data

23
00:01:34,564 --> 00:01:36,455
more as a product.

24
00:01:36,542 --> 00:01:37,502
Yeah.

25
00:01:37,642 --> 00:01:47,442
And speaking of data as a product, if we extend that to the AI scope today, we see a lot
of organizations that want to talk to their data products or talk to their data.

26
00:01:47,442 --> 00:01:50,428
And this is also the scope that we will cover today, right?

27
00:01:50,428 --> 00:01:51,565
No, absolutely.

28
00:01:51,565 --> 00:01:54,518
And that's actually how I encountered Agno

29
00:01:54,513 --> 00:02:00,884
So if you want to actually enable talking to your data, how do you approach this, right?

30
00:02:00,884 --> 00:02:05,844
Do you give an AI agent access, full access to all your enterprise data?

31
00:02:05,844 --> 00:02:08,644
At least I would be very concerned.

32
00:02:09,085 --> 00:02:11,445
But this is indeed what we see people do.

33
00:02:11,445 --> 00:02:13,798
You have Claude running on your local machine.

34
00:02:13,798 --> 00:02:19,334
use MCP to connect to various tables, schemas, semantic models to answer questions.

35
00:02:19,334 --> 00:02:20,814
But what's an alternative?

36
00:02:20,814 --> 00:02:22,214
Basically, could also

37
00:02:22,214 --> 00:02:33,821
instead of talking directly to the database, you could also be talking to individualized
specialized agents that know about the data, the underlying data, the rules, the semantics

38
00:02:33,821 --> 00:02:35,177
and everything that's related.

39
00:02:35,177 --> 00:02:44,026
then I can look at agents more like people with their own skills, with their own
speciality, and it also allows them to actually limit your scope.

40
00:02:44,026 --> 00:02:49,088
So limit the amount of tools they need access to, limit the amount of knowledge they need
to be able to gather.

41
00:02:49,088 --> 00:02:55,572
So it creates a little boundary of isolation rather than having one giant intelligent
super being.

42
00:02:55,572 --> 00:02:58,743
You create multiple smaller intelligent

43
00:02:58,921 --> 00:03:08,638
Yeah, you get an assistant for every data product So you flip the model actually, instead
of having this MCP and giving it your personal credentials, you actually give the AI the

44
00:03:08,638 --> 00:03:12,812
right credentials, but you need to have permissions to deal with the AI in that case,

45
00:03:12,812 --> 00:03:13,673
Yes, indeed.

46
00:03:14,092 --> 00:03:17,075
what happens is, course, what if you don't have access, right?

47
00:03:17,075 --> 00:03:20,371
But there might be an agent that actually knows the answer.

48
00:03:20,371 --> 00:03:23,529
I think this is where workflows come in.

49
00:03:23,529 --> 00:03:31,735
It's all about getting deterministic results with workflows, a user might ask any kind of
question and then we could actually figure out what agent can actually answer this

50
00:03:31,735 --> 00:03:37,869
question, And then of course, question to ask is, do you actually have access to use this
agent or

51
00:03:37,869 --> 00:03:39,611
to use the underlying data.

52
00:03:39,611 --> 00:03:44,233
And if you have access, the agent can just go ahead and answer that question for you.

53
00:03:44,233 --> 00:03:47,447
If he doesn't have access, you can request it.

54
00:03:47,735 --> 00:03:50,396
A workflow is really something very deterministic.

55
00:03:50,396 --> 00:03:54,328
You write it in Python, it's really do this, then this.

56
00:03:54,328 --> 00:03:55,746
It's basically a state machine.

57
00:03:55,746 --> 00:04:00,409
And I think it's very good when you have predictable, repeatable and complex pipeline,
right?

58
00:04:00,409 --> 00:04:06,654
it's very hard in a skill to express things like conditional things, like, you you have
to...

59
00:04:06,654 --> 00:04:15,417
do this in these circumstances, but if you then reach this condition, you need to do this
and this, and you can have very complex state machines.

60
00:04:15,417 --> 00:04:16,948
Skills is for me a handbook.

61
00:04:16,948 --> 00:04:19,289
It describes how it has to do things.

62
00:04:19,289 --> 00:04:26,893
Yes, you can also give it a bunch of tools, but it's up to the LLM to still defer when to
use it, how to use it, and do these kinds of things.

63
00:04:26,919 --> 00:04:30,096
a workflow is way more deterministic, you have to go through these steps.

64
00:04:30,096 --> 00:04:32,287
uh

65
00:04:32,287 --> 00:04:33,058
whole skill thing.

66
00:04:33,058 --> 00:04:36,893
With skills, have markdown and then you have a few Python scripts.

67
00:04:36,893 --> 00:04:41,615
And here it seems you have this framework and then underneath that you have the agents.

68
00:04:41,615 --> 00:04:42,735
yeah, absolutely.

69
00:04:42,733 --> 00:04:45,454
And for this case, I'm actually using Agno.

70
00:04:45,454 --> 00:04:49,337
what you see here, Jonny, is agentOS.

71
00:04:49,337 --> 00:04:52,608
It's part of their commercial version, but you can also use it freely.

72
00:04:52,608 --> 00:05:03,422
this thing it just runs in the browser you can just sign in and what you can then do is
actually just sign up an agent so i have already done this it's the dpp agent and it just

73
00:05:03,422 --> 00:05:09,249
connects to something that's running on my local host right it's just a fast api running
on my local host

74
00:05:09,249 --> 00:05:16,153
And because it connects there, it basically exposes all the AI agents and workflows that I
actually had built in this.

75
00:05:16,153 --> 00:05:24,982
And so what I've done is that you'll see here I have actually three data products and each
one of these data products basically have their own specialized agents.

76
00:05:24,982 --> 00:05:34,390
I can see here what's their configuration, it has access to a bunch of tools like a SQL
database so it can actually answer questions about the SQL database, it has a system

77
00:05:34,390 --> 00:05:35,891
message and so on.

78
00:05:35,891 --> 00:05:38,344
And so I could ask here something

79
00:05:38,344 --> 00:05:41,614
like what is the average.

80
00:05:41,614 --> 00:05:42,151
uh

81
00:05:42,151 --> 00:05:47,833
order size, We took like a model of the little organization that sells camping gear.

82
00:05:47,833 --> 00:05:56,473
and now that agent is going to basically call my agents that are running on my own
computer and it's going to do this.

83
00:05:56,473 --> 00:06:02,234
And, it says like, you know, I can help you, but it's first checked access.

84
00:06:02,234 --> 00:06:07,442
what it's telling me is that I actually don't have access to query this data.

85
00:06:07,442 --> 00:06:12,187
wondering if I'm in this real situation how would I solve this?

86
00:06:12,187 --> 00:06:20,172
instead of just having a random tool somewhere that can approve this I would probably
model this as a workflow and that's exactly what I've done.

87
00:06:20,172 --> 00:06:26,537
I'll show it first from user experience and then I'll show it a little bit from how it
actually looks like in code.

88
00:06:26,537 --> 00:06:30,831
So what we see here is that our workflow actually consists of multiple steps.

89
00:06:30,831 --> 00:06:34,194
When I ask a question he's gonna identify the agent that's probably gonna

90
00:06:34,194 --> 00:06:36,226
to be able to answer my question.

91
00:06:36,226 --> 00:06:38,797
It's going to check if I already have access.

92
00:06:38,797 --> 00:06:41,120
If I already have access, it's just going to answer it.

93
00:06:41,120 --> 00:06:46,296
If I don't have access, he's basically going to look like, am I allowed to grant this
person access?

94
00:06:46,296 --> 00:06:48,087
In this case, he's just going to say yes.

95
00:06:48,087 --> 00:06:57,042
But I've also built like more complex system where basically we're going to submit an
access request to an external system, wait for actually sometimes a data owner to actually

96
00:06:57,042 --> 00:06:57,933
approve that access.

97
00:06:57,933 --> 00:07:00,935
And then you can still come back to this workflow and still

98
00:07:00,947 --> 00:07:03,189
later on actually get the answer to this question.

99
00:07:03,189 --> 00:07:09,525
So let's ask the same question what is the average order value?

100
00:07:09,525 --> 00:07:14,760
so when I press this, you'll see actually this workflow get actually kicked off.

101
00:07:14,760 --> 00:07:17,041
And it's going to execute step by step.

102
00:07:17,041 --> 00:07:22,786
So immediately it identified, this is the, the sales transaction ledger agent.

103
00:07:22,786 --> 00:07:25,497
tells me the reason why it actually chose this one.

104
00:07:25,497 --> 00:07:32,483
It's then going to check if I have access in this case, I didn't have access he's then
going to see like, can I grant him access?

105
00:07:32,483 --> 00:07:32,993
Yes.

106
00:07:32,993 --> 00:07:35,414
And so he granted me actually access.

107
00:07:35,414 --> 00:07:38,216
And now basically then he's going to answer this question.

108
00:07:38,216 --> 00:07:39,567
And then you see here,

109
00:07:39,567 --> 00:07:42,422
the average order value is $180.

110
00:07:42,422 --> 00:07:45,915
it's very easy to build like various different kinds of agents.

111
00:07:45,879 --> 00:07:55,633
And so the agent that you ask the question, it's more like a top level agent that
distributes tasks to other agents based on some conditions I understand, right?

112
00:07:55,633 --> 00:07:56,984
it's not even an agent.

113
00:07:56,984 --> 00:08:00,046
It's really just a deterministic workflow.

114
00:08:00,046 --> 00:08:05,343
It's a deterministic state machine where in each step agents might be involved.

115
00:08:05,343 --> 00:08:14,262
As you see the first step, it actually uses the uh identify agent to actually figure out
which other agents can answer the question that I have.

116
00:08:14,262 --> 00:08:17,545
Okay, so your top level flow is always deterministic.

117
00:08:17,545 --> 00:08:22,278
Those are the steps that you showed in the right side of the screen.

118
00:08:22,278 --> 00:08:27,552
Identify agents is the first one, then checking access, granting access if needed, then
answering the questions.

119
00:08:27,552 --> 00:08:30,835
And each of these has an implementation, each of these steps.

120
00:08:31,836 --> 00:08:38,361
And so Agno is more like a workflow system that is an orchestrator of agents.

121
00:08:38,377 --> 00:08:40,750
Yeah, so I call it an agent framework.

122
00:08:40,750 --> 00:08:46,945
Nowadays you have so many out there and most of these actually allow you to build like...

123
00:08:46,945 --> 00:08:50,568
AI agents and most of them also allow you to build workflows.

124
00:08:50,568 --> 00:08:55,600
And I think there's always a lot of emphasis on these, on these agents.

125
00:08:55,600 --> 00:09:03,726
while I do think workflows are equally important because for some very important cases
like granting access.

126
00:09:03,726 --> 00:09:04,887
You want determinism.

127
00:09:04,887 --> 00:09:13,212
You don't want the AI agents starting to drift or decide by themselves, like on some basic
rules, like what it can do and what it can't do.

128
00:09:13,212 --> 00:09:13,683
Yeah.

129
00:09:13,728 --> 00:09:13,968
very

130
00:09:13,968 --> 00:09:15,390
easy to build workflows.

131
00:09:15,390 --> 00:09:19,216
ah It has lot of bells and whistles included.

132
00:09:19,216 --> 00:09:23,749
you can have memory, evaluations, something I really like.

133
00:09:23,749 --> 00:09:32,900
If I want to test something I can do reliability and I want to say how reliable or how
accurate is actually whatever I'm doing.

134
00:09:32,900 --> 00:09:34,232
uh around

135
00:09:34,232 --> 00:09:36,133
80 I think it was right.

136
00:09:36,133 --> 00:09:46,674
You can say like you know I want three iterations, run evaluation, okay I have to give it
a name, Now it's going to run that same query over and over again and it's going to check

137
00:09:46,674 --> 00:09:51,028
whatever the agent responds if we get actually consistent results.

138
00:09:51,028 --> 00:09:57,681
So you specify how often you wanted to run it because you know agents are
non-deterministic, right?

139
00:09:57,681 --> 00:10:00,033
So this time I'm asking it not to a workflow.

140
00:10:00,033 --> 00:10:01,873
I'm asking it to an agent.

141
00:10:01,873 --> 00:10:06,475
So that means that once in a while an agent might be able to give a different result.

142
00:10:07,360 --> 00:10:11,759
so we didn't get a full 10 on 10, right?

143
00:10:11,759 --> 00:10:13,732
That's actually very cool to see, right?

144
00:10:13,732 --> 00:10:19,880
I wasn't expecting this because most of the time when I've run this in the past, I get a
10 on this question.

145
00:10:19,981 --> 00:10:25,200
But it's very cool here to see that you get this non-deterministic uh answer

146
00:10:25,200 --> 00:10:28,568
Now I can look at each individual runs and I can kind of see,

147
00:10:28,568 --> 00:10:30,289
actually the result was still correct.

148
00:10:30,289 --> 00:10:40,826
But because we were using AI as a judge, of course, like the evaluation can also decide
the non-determinism on this thing.

149
00:10:40,826 --> 00:10:43,548
So he scored it like 10 in the other two cases.

150
00:10:43,548 --> 00:10:48,953
And basically for the evaluation, he scored this one a nine while it actually still
produced the correct results.

151
00:10:48,953 --> 00:10:54,150
Okay, so this is the non determinism in the evaluation part, which is done being an LLM.

152
00:10:54,494 --> 00:10:55,487
And I see, see.

153
00:10:55,487 --> 00:11:00,066
these are always things you have to take into consideration when working with agent
systems.

154
00:11:00,058 --> 00:11:03,415
these agents, you also defined yourself, right?

155
00:11:03,493 --> 00:11:05,346
They're all just living in code.

156
00:11:05,346 --> 00:11:07,800
Let me quickly show you how workflow looks like.

157
00:11:07,800 --> 00:11:10,168
ah

158
00:11:10,168 --> 00:11:13,068
So a workflow is quite easy, right?

159
00:11:13,068 --> 00:11:19,160
You give it a name, you give it a description, and then you basically describe the steps,
right?

160
00:11:19,160 --> 00:11:24,363
And the step can be, an agent, In this case, it just calls the identify agent.

161
00:11:24,363 --> 00:11:31,200
I can set a condition and then he's gonna run a Python function to see, and that's just
gonna be to return

162
00:11:31,200 --> 00:11:41,991
true or false to decide can I progress or do I have to stop and then like if it succeeds
like it's gonna execute these steps and of course there's like else step so in case it

163
00:11:41,991 --> 00:11:50,396
would fail I could also give it an action you know and when all these conditions is done
he's gonna go to this one to the next one and that's how it basically decides what to do.

164
00:11:50,396 --> 00:11:51,996
oh

165
00:11:51,996 --> 00:11:59,223
identifying an agent is a step, but that's also an agent that does the identification or
how does that work?

166
00:11:59,223 --> 00:12:00,245
yes, indeed.

167
00:12:00,245 --> 00:12:03,959
This is the identify agent,

168
00:12:03,959 --> 00:12:10,282
I have specified uh somewhere which, agents are available, what their capabilities are.

169
00:12:10,342 --> 00:12:14,838
You know, it gives a brief description of what kind of questions the agent can answer.

170
00:12:14,838 --> 00:12:19,410
And basically it has some instruction to see how it actually has to figure this one out.

171
00:12:19,410 --> 00:12:23,192
And then basically it has an output schema, right?

172
00:12:23,192 --> 00:12:25,535
I can say like, I want structured outputs,

173
00:12:25,535 --> 00:12:29,769
I want the agent's log and I want to reason why you actually chose this one.

174
00:12:29,769 --> 00:12:32,771
And this is for me to be able to debug if he does something wrong.

175
00:12:32,771 --> 00:12:38,885
You give it a model and then basically the output of this step is gonna be just this agent
selection.

176
00:12:38,885 --> 00:12:44,296
So your workflow can use this because it's structured output to make decisions like you do
in your second step.

177
00:12:44,296 --> 00:12:44,693
Yeah

178
00:12:44,693 --> 00:12:50,066
in my case, my next step is the check access elevator, right?

179
00:12:50,066 --> 00:12:57,645
Which basically for me just checks in a local file that keeps track of which agents every
user has access to,

180
00:12:57,645 --> 00:13:00,166
For the sake of the demo, is sufficient, I think.

181
00:13:00,166 --> 00:13:00,658
yes,

182
00:13:00,658 --> 00:13:04,770
And so the last agent you have here is the one that answers the query.

183
00:13:05,131 --> 00:13:07,954
Did you need to do something special there as well?

184
00:13:07,954 --> 00:13:10,877
so there's this session state that goes around, right?

185
00:13:10,877 --> 00:13:20,134
I could get the step input, The step input just means the input, the original question The
session state decided like which agent was selected to answer the question.

186
00:13:20,134 --> 00:13:24,532
So the only thing I do here is like figure out which agent I actually have to call.

187
00:13:24,532 --> 00:13:29,859
Basically making the call and then streaming it back to my UI, the answer.

188
00:13:29,871 --> 00:13:32,766
And where do you do the database query in this case?

189
00:13:32,766 --> 00:13:36,327
So for each data product, I have a specialized agent.

190
00:13:36,327 --> 00:13:40,478
it's actually on the fly that I decide which agent to call.

191
00:13:40,478 --> 00:13:44,713
Okay, so you generate dynamic agents for data products.

192
00:13:44,713 --> 00:13:50,316
I dump a YAML file somewhere, it basically generates me a completely new agent for a data
product.

193
00:13:50,316 --> 00:13:55,965
If new agents come in, these are added, each one has like their own credentials to
actually log in.

194
00:13:55,965 --> 00:13:59,629
They have their own instructions, they have their own description, they have their own
name.

195
00:13:59,629 --> 00:14:01,871
They have access to OSI files.

196
00:14:01,871 --> 00:14:04,168
OSI is Open Semantic Interchange.

197
00:14:04,168 --> 00:14:11,227
It's this new standard that is emerging to actually define your semantic models.

198
00:14:11,227 --> 00:14:15,800
I'm using that specification to actually describe the semantics of the data

199
00:14:15,857 --> 00:14:16,610
Yeah, I see.

200
00:14:16,610 --> 00:14:23,966
So these are statically created, but what I'm doing in a workflow on the fly is
dynamically decide which agent to call.

201
00:14:24,048 --> 00:14:30,701
And here your agent is essentially fed with information about the data product, how to
connect and how to answer questions.

202
00:14:30,653 --> 00:14:37,387
So you do have this YAML file describing how the agent should respond and what it should
do in this case.

203
00:14:37,387 --> 00:14:45,277
Yeah, there's some generic instructions that I always add, but this kind of gives
specialized information about this agent.

204
00:14:45,277 --> 00:14:46,049
Yeah.

205
00:14:46,136 --> 00:14:48,639
And seeing this, so you now have your Python file.

206
00:14:48,639 --> 00:14:50,291
This reminds me of how Airflow works.

207
00:14:50,291 --> 00:14:52,614
You define a DAG in Airflow of tasks.

208
00:14:52,614 --> 00:14:57,095
Here you define also a flow, a workflow with some agent coupling.

209
00:14:57,095 --> 00:14:58,987
How does this end up in Agno then?

210
00:14:58,987 --> 00:15:03,168
Is this something that's automatically synced or how do you get it in the UI?

211
00:15:03,168 --> 00:15:12,685
So you create this AgnoOS object, Basically, you give it agent, you give it your
workflows, I have enabled tracing to figure out what's going wrong in case things go

212
00:15:12,685 --> 00:15:13,026
wrong.

213
00:15:13,026 --> 00:15:23,105
this file basically just defines a fast API which is called app and then of course like if
I go into my Docker file you know I'm just using uvicorn

214
00:15:23,105 --> 00:15:25,265
So this is running locally.

215
00:15:25,265 --> 00:15:28,585
I could just curl this right from here.

216
00:15:28,750 --> 00:15:34,466
But of course we all want a beautiful UI And you know, this is where this goes on, right?

217
00:15:34,466 --> 00:15:36,637
I basically say like, I have this agent.

218
00:15:36,637 --> 00:15:38,961
This is running on my local machine.

219
00:15:39,124 --> 00:15:44,387
So it connects directly from the browser to my Docker container running on my local
system.

220
00:15:44,387 --> 00:15:45,612
And can you have multiple?

221
00:15:45,612 --> 00:15:46,476
Yes, yes, yes.

222
00:15:46,476 --> 00:15:49,685
You see here, I have a Workflow agent and I have a DPP agent.

223
00:15:49,685 --> 00:15:52,185
also from a deployment point of view, it kind of makes sense, right?

224
00:15:52,185 --> 00:15:56,466
Because we don't want all these agents being deployed by one Python process.

225
00:15:56,466 --> 00:15:59,537
we want to group them in a logical unit for deployment.

226
00:15:59,537 --> 00:16:09,653
And then it makes sense actually to have when you deploy a data product, also co-deploy an
agent in its own container, for example, and make it available in one place, which in this

227
00:16:09,653 --> 00:16:11,083
case is Agno OS, it.

228
00:16:11,083 --> 00:16:11,595
absolutely.

229
00:16:11,595 --> 00:16:20,568
so you register your container in this case, in this UI, as you showed, will it
automatically pop up in your chat interface that you have here?

230
00:16:20,568 --> 00:16:24,669
Yeah, so it will automatically show all the agents, teams and workflows.

231
00:16:24,669 --> 00:16:32,897
So here you see, if I want to connect a new one, If I have a new container, just say, I
give it a name, you can also put some additional authentication on it.

232
00:16:32,897 --> 00:16:35,736
And then basically here all your different...

233
00:16:35,736 --> 00:16:43,732
Agent OSes just appear here and then you can select which one you want to use and within
each you basically expose agent teams and workflows.

234
00:16:43,732 --> 00:16:44,465
And so

235
00:16:44,465 --> 00:16:52,762
if you would now change the code, em rebuild the Docker image and run it, that would be
reflected in the UI quite fast, I assume.

236
00:16:52,762 --> 00:17:00,083
I typically have this task to reset my access, just task down.

237
00:17:00,083 --> 00:17:03,186
It's just killing all my containers, task up.

238
00:17:03,186 --> 00:17:07,199
And so basically whenever I change something, and I'm back up and running.

239
00:17:07,199 --> 00:17:10,442
Yeah, and then the UI will detect the changes on the fly.

240
00:17:10,442 --> 00:17:12,572
Yeah.

241
00:17:12,572 --> 00:17:16,268
something's wrong and then you just refresh and then, you know, everything is green again.

242
00:17:16,268 --> 00:17:22,234
And what I wonder, you have these workflows that are essentially multiple steps that can
take a long time.

243
00:17:22,515 --> 00:17:24,903
What happens if something does take a long time?

244
00:17:24,903 --> 00:17:29,603
Like if we would ask approval, let's say we send a Teams message and somebody needs to
respond,

245
00:17:30,284 --> 00:17:34,854
So, yes, so you have a database attached to it.

246
00:17:34,854 --> 00:17:39,270
So it will keep track of the status of your flow.

247
00:17:39,270 --> 00:17:45,796
And then you could come back and you can look at your sessions and come back to like a
previous session.

248
00:17:45,751 --> 00:17:54,052
now we actually come to the key question why I chose Agno I could have built this on
Databricks.

249
00:17:54,052 --> 00:17:55,675
I could have built it somewhere, but

250
00:17:55,675 --> 00:18:03,999
I wanted to kind of explore with an agent framework, like what I could build myself and
also gain a little bit of a better understanding how and all these things actually were

251
00:18:03,999 --> 00:18:05,156
behind the scenes.

252
00:18:05,156 --> 00:18:10,081
like Agno It's just a Python framework, It has a lot of good things actually going for it.

253
00:18:10,081 --> 00:18:12,105
it actually has excellent documentation.

254
00:18:12,105 --> 00:18:17,067
It actually also has an agent on the site, documentation site, that you can ask questions,

255
00:18:17,057 --> 00:18:26,579
And there's a lot of things I like about Agno I've also hit some limitations here and
there, which is always good, but it comes with a lot of batteries included.

256
00:18:26,579 --> 00:18:31,510
It has agents, has teams, it has a lot of tools.

257
00:18:31,510 --> 00:18:38,783
Access to databases, MCP skills, but also things like agent to agent, communication,
evaluations.

258
00:18:38,783 --> 00:18:39,863
love that as well.

259
00:18:39,863 --> 00:18:46,236
Like the fact that you can test an agent, And in the end, like it really feels that built
by engineers, it's all built on fast API,

260
00:18:46,228 --> 00:18:49,789
It has like a very nice feature that I like in here.

261
00:18:49,789 --> 00:18:51,661
something they call callable factories.

262
00:18:51,661 --> 00:18:54,974
It just means that to a lot of the parameters of a...

263
00:18:54,974 --> 00:19:02,595
of an agent or a team or a workflow, you can just pass a function instead of defining it.

264
00:19:02,595 --> 00:19:07,372
And that function then at runtime be called with the runtime information.

265
00:19:07,372 --> 00:19:10,673
And then you can decide at runtime actually which tools you're making available.

266
00:19:10,673 --> 00:19:14,273
this is basically to limit your context window, right?

267
00:19:14,273 --> 00:19:17,504
To keep the amount of input tokens as small as possible.

268
00:19:17,504 --> 00:19:19,240
And based on what do you then decide?

269
00:19:19,240 --> 00:19:22,873
Is it based on metadata or also on a previous conversation?

270
00:19:22,873 --> 00:19:25,798
you could look at the history if you want to.

271
00:19:25,798 --> 00:19:28,982
But basically it is deterministic Python code.

272
00:19:28,982 --> 00:19:34,236
You could use an agent there as well, but I'm not sure that's going to save you tokens.

273
00:19:34,236 --> 00:19:34,883
No, indeed.

274
00:19:34,874 --> 00:19:38,737
depending on what your name is, your role, it knows your identity, right?

275
00:19:38,737 --> 00:19:45,978
So it could basically query some additional system, ask, what your permissions are based
on those permissions, give you access to these kinds of tools.

276
00:19:45,978 --> 00:19:50,804
Yeah, indeed, that was indeed a question I had, you were logged in into Agno, I guess.

277
00:19:51,025 --> 00:19:54,880
So it gets information about your role and your identity,

278
00:19:54,880 --> 00:20:00,655
It gets information about my identity, that's basically something that's Agno just passing
in, right?

279
00:20:00,655 --> 00:20:02,746
Because I'm logged in into Agno OS.

280
00:20:02,736 --> 00:20:05,180
does Agno then also allow deployment of agents?

281
00:20:05,180 --> 00:20:07,943
now you built this, you're developing the agent.

282
00:20:07,943 --> 00:20:11,378
Suppose you want to give it to me without giving access to Agno.

283
00:20:11,378 --> 00:20:16,281
Is there some way to expose the agents as an endpoint or using a UI?

284
00:20:16,281 --> 00:20:16,942
Yes.

285
00:20:16,942 --> 00:20:19,187
Like it's, it's just a fast API in the end.

286
00:20:19,187 --> 00:20:21,030
you get just a fast API object.

287
00:20:21,030 --> 00:20:24,260
You can plug any UI you want into that API.

288
00:20:24,329 --> 00:20:31,759
So Pascal, this was a really nice overview of uh Agno and what it can do What are your
main takeaways after trying this out?

289
00:20:32,861 --> 00:20:47,573
It is indeed new uh technology and if I would be looking at a production system and I'm
already using Databricks or Snowflake, I would probably look more into these systems

290
00:20:47,573 --> 00:20:50,135
first, especially for the talking to your data.

291
00:20:50,135 --> 00:20:52,606
I wouldn't like go and hosting my

292
00:20:53,277 --> 00:20:55,438
they have these things built in.

293
00:20:55,438 --> 00:21:00,400
What I do find interesting if you want to create like these workflows, right?

294
00:21:00,400 --> 00:21:05,083
And then I do think Agno is a very nice framework to use.

295
00:21:05,083 --> 00:21:09,370
And I think it's really built with strong engineering principles.

296
00:21:09,370 --> 00:21:11,905
It really comes with batteries included.

297
00:21:12,426 --> 00:21:14,748
It still has a little flaws here and there.

298
00:21:14,748 --> 00:21:15,029
Yeah.

299
00:21:15,029 --> 00:21:19,662
it was good for me to get a view on what is a workflow and especially how it compares to
skills.

300
00:21:19,662 --> 00:21:28,486
My take is indeed that workflows are the flip side of skills where skills are mostly
markdown driven and can call some tools in Python, for example.

301
00:21:28,486 --> 00:21:34,245
the workflows are rigid frameworks where you plug in dedicated agents

302
00:21:34,245 --> 00:21:36,970
Is there some code you could make available in our repository?

303
00:21:36,970 --> 00:21:38,804
Yes, it's completely self-contained.

304
00:21:38,804 --> 00:21:39,977
So I can definitely share that.

305
00:21:39,977 --> 00:21:42,824
Yeah, yeah, absolutely.

306
00:21:42,824 --> 00:21:43,664
All right.

307
00:21:43,664 --> 00:21:46,926
So Pascal, thanks a lot for this enlightening demo.

308
00:21:46,926 --> 00:21:50,868
It was really good to see how Agno works and how workflows work.

309
00:21:50,988 --> 00:21:58,126
So thank you everybody for watching and give Pascal's code a spin, test out Agno and get
back to us with any questions.

310
00:21:58,126 --> 00:21:59,813
And we'll see you next time.

311
00:21:59,813 --> 00:22:00,428
Bye bye.