@@ -31,6 +31,7 @@ import {
3131 ATTR_GEN_AI_PROVIDER_NAME ,
3232 ATTR_GEN_AI_REQUEST_MODEL ,
3333 ATTR_GEN_AI_RESPONSE_FINISH_REASONS ,
34+ ATTR_GEN_AI_RESPONSE_ID ,
3435 ATTR_GEN_AI_RESPONSE_MODEL ,
3536 ATTR_GEN_AI_USAGE_INPUT_TOKENS ,
3637 ATTR_GEN_AI_USAGE_OUTPUT_TOKENS ,
@@ -235,6 +236,7 @@ function makeMockChat(options: {
235236 return {
236237 message : { role : "assistant" , content : responseContent } ,
237238 raw : {
239+ id : "chatcmpl-test123" ,
238240 choices : [ { finish_reason : finishReason } ] ,
239241 usage : {
240242 prompt_tokens : promptTokens ,
@@ -264,6 +266,7 @@ function makeMockChatWithStreamUsage(options: {
264266 yield {
265267 delta : responseContent ,
266268 raw : {
269+ id : "chatcmpl-test123" ,
267270 choices : [ { finish_reason : finishReason } ] ,
268271 usage : {
269272 prompt_tokens : promptTokens ,
@@ -436,6 +439,38 @@ describe("CustomLLMInstrumentation — OTel 1.40 attributes", () => {
436439 ) ;
437440 } ) ;
438441
442+ it ( "sets gen_ai.response.id" , async ( ) => {
443+ const instr = makeInstrumentation ( ) ;
444+ const chat = makeMockChat ( { } ) ;
445+ const wrapped = instr . chatWrapper ( { className : "OpenAI" } ) ( chat as any ) ;
446+ await wrapped . call (
447+ { metadata : mockLLMMeta } ,
448+ { messages : [ { role : "user" , content : "hi" } ] } ,
449+ ) ;
450+
451+ const span = otelExporter . getFinishedSpans ( ) [ 0 ] ;
452+ assert . strictEqual (
453+ span . attributes [ ATTR_GEN_AI_RESPONSE_ID ] ,
454+ "chatcmpl-test123" ,
455+ ) ;
456+ } ) ;
457+
458+ it ( "unknown finish_reason passes through as-is to span attribute" , async ( ) => {
459+ const instr = makeInstrumentation ( ) ;
460+ const chat = makeMockChat ( { finishReason : "some_future_reason" } ) ;
461+ const wrapped = instr . chatWrapper ( { className : "OpenAI" } ) ( chat as any ) ;
462+ await wrapped . call (
463+ { metadata : mockLLMMeta } ,
464+ { messages : [ { role : "user" , content : "hi" } ] } ,
465+ ) ;
466+
467+ const span = otelExporter . getFinishedSpans ( ) [ 0 ] ;
468+ assert . deepStrictEqual (
469+ span . attributes [ ATTR_GEN_AI_RESPONSE_FINISH_REASONS ] ,
470+ [ "some_future_reason" ] ,
471+ ) ;
472+ } ) ;
473+
439474 it ( "sets token usage attributes" , async ( ) => {
440475 const instr = makeInstrumentation ( ) ;
441476 const chat = makeMockChat ( { promptTokens : 10 , completionTokens : 5 } ) ;
0 commit comments