Claus Ibsen created CAMEL-25408:
-----------------------------------

             Summary: camel-api - AI events: a common AiEvent API and an AI 
event type in core instead of component-specific Custom events
                 Key: CAMEL-25408
                 URL: https://issues.apache.org/jira/browse/CAMEL-25408
             Project: Camel
          Issue Type: Improvement
          Components: camel-core-api, camel-ai, camel-openai
            Reporter: Claus Ibsen
            Assignee: Andrea Cosentino
             Fix For: 4.23.0


h3. Problem

AI components fire their own {{CamelEvent}} classes, each with 
{{CamelEvent.Type.Custom}}:

* camel-openai: {{OpenAIAgenticLoopStartedEvent}}, 
{{OpenAIAgenticLoopCompletedEvent}}, {{OpenAIAgenticToolCallExecutedEvent}} (on 
a package-private {{AbstractOpenAIExchangeEvent}})
* camel-ai-tool: {{AiToolAuthorizationDeniedEvent}} (CAMEL-25404, PR #27480)

Because each event is component-specific and only typed {{Custom}}, it is hard 
to track them for GenAI observability, and for anyone else:

* an {{EventNotifier}} has to depend on every AI component and {{instanceof}} 
each event class to recognise them; {{Type.Custom}} says nothing about what the 
event is (camel-ai-observability, micrometer, dev console, TUI, management all 
have the same problem)
* none of them implements {{CamelEvent.ExchangeEvent}} although they all carry 
the exchange ({{getExchange()}}), so notifiers that correlate by exchange / 
route skip them
* GenAI observability (spans/metrics) went shared on purpose 
({{camel-ai-observability-api}}, wired the same way in openai, langchain4j and 
spring-ai); the events are drifting the other way, one design per component

h3. Proposal

core/camel-api already has the {{org.apache.camel.ai}} package (@since 4.21, so 
far only {{CamelLangchain4jAttributes}}). Add the AI event API there, so every 
AI component fires events from one contract and anyone can observe them with no 
dependency on an AI component:

* a new {{CamelEvent.Type}} value for AI events (for example {{Ai}}), used 
instead of {{Custom}}
* {{AiEvent extends CamelEvent.ExchangeEvent}}: the common contract (for 
example the component / provider and the tool or model name)
* sub-interfaces for what exists today: tool call denied (also a 
{{CamelEvent.FailureEvent}} with the {{CamelAuthorizationException}}), tool 
call executed, agent loop started, agent loop completed
* {{@since 4.23}} on all new types and the new {{Type}} value

Then:

* move the camel-openai agentic events and the camel-ai-tool 
{{AiToolAuthorizationDeniedEvent}} onto these interfaces and the new type, 
before 4.23.0 is released, so the component-specific Custom events never ship 
in a release
* the event classes can stay in the components (implementing the core 
interfaces), or share a small base in camel-support
* camel-ai-observability can then turn any {{AiEvent}} into metrics / spans 
with one EventNotifier

Things to check:
* code that switches on {{CamelEvent.Type}} (for example 
{{ManagedEventNotifier}} special-cases {{Custom}}) should handle the new value
* whether {{EventNotifier}} / {{EventNotifierSupport}} should get an 
{{ignoreAiEvents}} option like the other event categories, and how it relates 
to {{ignoreExchangeEvents}} since an {{AiEvent}} is also an {{ExchangeEvent}}
* the docs of camel-openai and camel-ai-tool that document the current event 
classes

_Created by Claude Code on behalf of davsclaus_



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to