atiaomar1978-hub commented on code in PR #25337:
URL: https://github.com/apache/camel/pull/25337#discussion_r3723596061
##########
docs/components/modules/others/nav.adoc:
##########
@@ -4,6 +4,7 @@
* xref:others:index.adoc[Miscellaneous Components]
** xref:a2a-consumer.adoc[A2A - Consumer Guide]
** xref:a2a-producer.adoc[A2A - Producer Guide]
+*** xref:ai-observability.adoc[AI Observability]
** xref:attachments.adoc[Attachments]
** xref:aws-bedrock-examples.adoc[AWS Bedrock - Examples]
Review Comment:
Addressed in `f12051a92c4`: the `nav.adoc` entry is generated by
`PrepareDocSymlinksMojo` during `mvn process-classes -pl docs -Pregen` (not
hand-edited). The `***` prefix is intentional for pages with a `:group:`
attribute such as `:group: AI`.
_AI-generated reply on behalf of atiaomar1978-hub_
##########
components/camel-ai/camel-langchain4j-agent/src/main/java/org/apache/camel/component/langchain4j/agent/LangChain4jAgentProducer.java:
##########
@@ -141,14 +147,49 @@ public void process(Exchange exchange) throws Exception {
AiAgentBody<?> aiAgentBody =
exchange.getMessage().getMandatoryBody(AiAgentBody.class);
ToolProvider toolProvider = createComposedToolProvider(tags, exchange);
- Result<String> result = agent.chat(aiAgentBody, toolProvider);
- exchange.getMessage().setBody(result.content());
- populateResultHeaders(result, exchange);
+ Object chatModel = resolveChatModel(agent);
+ GenAiObservationContext observationContext =
GenAiObservationContext.builder()
+ .operationName(GenAiOperationName.GENERATE_CONTENT)
+ .system(GenAiModelResolver.resolveSystem(chatModel))
+ .requestModel(GenAiModelResolver.resolveModelName(chatModel))
+ .componentScheme("langchain4j-agent")
+ .build();
+ GenAiObservation observation = GenAiObservability.start(exchange,
observationContext);
+ try {
+ Result<String> result = agent.chat(aiAgentBody, toolProvider);
+ exchange.getMessage().setBody(result.content());
+ populateResultHeaders(result, exchange,
observationContext.requestModel());
+ observation.recordSuccess(GenAiUsage.of(
+ result.tokenUsage() != null ?
result.tokenUsage().inputTokenCount() : null,
+ result.tokenUsage() != null ?
result.tokenUsage().outputTokenCount() : null,
+ result.finishReason(),
+ observationContext.requestModel()));
+ } catch (RuntimeException e) {
+ observation.recordError(e);
+ throw e;
+ } finally {
+ observation.close();
+ }
+ }
+
+ private Object resolveChatModel(Agent agent) {
+ if (endpoint.getConfiguration().getAgentConfiguration() != null) {
Review Comment:
Fixed in `f12051a92c4`: `LangChain4jAgentProducer` now sets only
`REQUEST_MODEL` on exchange headers. The `RESPONSE_MODEL` header is omitted
because `Result<String>` does not expose a response model name. GenAI span
`gen_ai.response.model` is also omitted in the observation usage for agent
calls.
_AI-generated reply on behalf of atiaomar1978-hub_
##########
components/camel-ai/camel-langchain4j-embeddings/src/main/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsProducer.java:
##########
@@ -38,8 +44,35 @@ public LangChain4jEmbeddingsEndpoint getEndpoint() {
public void process(Exchange exchange) throws Exception {
final TextSegment in =
exchange.getMessage().getMandatoryBody(TextSegment.class);
final EmbeddingModel model =
getEndpoint().getConfiguration().getEmbeddingModel();
- final Response<Embedding> result = model.embed(in);
- final Message message = exchange.getMessage();
+ GenAiObservationContext observationContext =
GenAiObservationContext.builder()
+ .operationName(GenAiOperationName.EMBEDDINGS)
+ .system(GenAiModelResolver.resolveSystem(model))
+ .requestModel(GenAiModelResolver.resolveModelName(model))
+ .componentScheme("langchain4j-embeddings")
+ .build();
+ GenAiObservation observation = GenAiObservability.start(exchange,
observationContext);
+ try {
+ final Response<Embedding> result = model.embed(in);
+ populateHeaders(exchange.getMessage(), result, in,
observationContext.requestModel());
+ observation.recordSuccess(GenAiUsage.of(
+ result.tokenUsage() != null ?
result.tokenUsage().inputTokenCount() : null,
+ result.tokenUsage() != null ?
result.tokenUsage().outputTokenCount() : null,
+ result.finishReason(),
+ observationContext.requestModel()));
+ } catch (RuntimeException e) {
+ observation.recordError(e);
Review Comment:
Fixed in `f12051a92c4`: `LangChain4jEmbeddingsProducer` now sets only
`REQUEST_MODEL`. `RESPONSE_MODEL` is omitted because `Response<Embedding>` does
not carry a response model name. The observation span likewise omits
`gen_ai.response.model` for embeddings.
_AI-generated reply on behalf of atiaomar1978-hub_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]