@@ -1271,6 +1271,7 @@ func TestGeminiLogprobsToOpenAILogprobs(t *testing.T) {
12711271}
12721272
12731273func TestExtractToolCallsFromGeminiParts (t * testing.T ) {
1274+ toolCalls := []openai.ChatCompletionMessageToolCallParam {}
12741275 tests := []struct {
12751276 name string
12761277 input []* genai.Part
@@ -1360,7 +1361,7 @@ func TestExtractToolCallsFromGeminiParts(t *testing.T) {
13601361
13611362 for _ , tt := range tests {
13621363 t .Run (tt .name , func (t * testing.T ) {
1363- calls , err := extractToolCallsFromGeminiParts (tt .input )
1364+ calls , err := extractToolCallsFromGeminiParts (toolCalls , tt .input )
13641365
13651366 if tt .wantErr {
13661367 require .Error (t , err )
@@ -1381,56 +1382,80 @@ func TestExtractToolCallsFromGeminiParts(t *testing.T) {
13811382
13821383func TestGeminiFinishReasonToOpenAI (t * testing.T ) {
13831384 tests := []struct {
1384- name string
1385- input genai.FinishReason
1386- expected openai.ChatCompletionChoicesFinishReason
1385+ name string
1386+ input genai.FinishReason
1387+ toolCalls []openai.ChatCompletionMessageToolCallParam
1388+ expected openai.ChatCompletionChoicesFinishReason
13871389 }{
13881390 {
1389- name : "stop reason" ,
1390- input : genai .FinishReasonStop ,
1391- expected : openai .ChatCompletionChoicesFinishReasonStop ,
1391+ name : "stop reason" ,
1392+ input : genai .FinishReasonStop ,
1393+ toolCalls : []openai.ChatCompletionMessageToolCallParam {},
1394+ expected : openai .ChatCompletionChoicesFinishReasonStop ,
1395+ },
1396+ {
1397+ name : "tool calls reason" ,
1398+ input : genai .FinishReasonStop ,
1399+ toolCalls : []openai.ChatCompletionMessageToolCallParam {
1400+ {
1401+ ID : ptr .To ("tool_call_1" ),
1402+ Function : openai.ChatCompletionMessageToolCallFunctionParam {
1403+ Name : "example_tool" ,
1404+ Arguments : "{\" param1\" :\" value1\" }" ,
1405+ },
1406+ Type : openai .ChatCompletionMessageToolCallTypeFunction ,
1407+ },
1408+ },
1409+ expected : openai .ChatCompletionChoicesFinishReasonToolCalls ,
13921410 },
13931411 {
1394- name : "max tokens reason" ,
1395- input : genai .FinishReasonMaxTokens ,
1396- expected : openai .ChatCompletionChoicesFinishReasonLength ,
1412+ name : "max tokens reason" ,
1413+ input : genai .FinishReasonMaxTokens ,
1414+ toolCalls : []openai.ChatCompletionMessageToolCallParam {},
1415+ expected : openai .ChatCompletionChoicesFinishReasonLength ,
13971416 },
13981417 {
1399- name : "empty reason for streaming" ,
1400- input : "" ,
1401- expected : "" ,
1418+ name : "empty reason for streaming" ,
1419+ input : "" ,
1420+ toolCalls : []openai.ChatCompletionMessageToolCallParam {},
1421+ expected : "" ,
14021422 },
14031423 {
1404- name : "safety reason" ,
1405- input : genai .FinishReasonSafety ,
1406- expected : openai .ChatCompletionChoicesFinishReasonContentFilter ,
1424+ name : "safety reason" ,
1425+ input : genai .FinishReasonSafety ,
1426+ toolCalls : []openai.ChatCompletionMessageToolCallParam {},
1427+ expected : openai .ChatCompletionChoicesFinishReasonContentFilter ,
14071428 },
14081429 {
1409- name : "recitation reason" ,
1410- input : genai .FinishReasonRecitation ,
1411- expected : openai .ChatCompletionChoicesFinishReasonContentFilter ,
1430+ name : "recitation reason" ,
1431+ input : genai .FinishReasonRecitation ,
1432+ toolCalls : []openai.ChatCompletionMessageToolCallParam {},
1433+ expected : openai .ChatCompletionChoicesFinishReasonContentFilter ,
14121434 },
14131435 {
1414- name : "other reason" ,
1415- input : genai .FinishReasonOther ,
1416- expected : openai .ChatCompletionChoicesFinishReasonContentFilter ,
1436+ name : "other reason" ,
1437+ input : genai .FinishReasonOther ,
1438+ toolCalls : []openai.ChatCompletionMessageToolCallParam {},
1439+ expected : openai .ChatCompletionChoicesFinishReasonContentFilter ,
14171440 },
14181441 {
1419- name : "unknown reason" ,
1420- input : genai .FinishReason ("unknown_reason" ),
1421- expected : openai .ChatCompletionChoicesFinishReasonContentFilter ,
1442+ name : "unknown reason" ,
1443+ input : genai .FinishReason ("unknown_reason" ),
1444+ toolCalls : []openai.ChatCompletionMessageToolCallParam {},
1445+ expected : openai .ChatCompletionChoicesFinishReasonContentFilter ,
14221446 },
14231447 }
14241448
14251449 for _ , tt := range tests {
14261450 t .Run (tt .name , func (t * testing.T ) {
1427- result := geminiFinishReasonToOpenAI (tt .input )
1451+ result := geminiFinishReasonToOpenAI (tt .input , tt . toolCalls )
14281452 require .Equal (t , tt .expected , result )
14291453 })
14301454 }
14311455}
14321456
14331457func TestExtractToolCallsFromGeminiPartsStream (t * testing.T ) {
1458+ toolCalls := []openai.ChatCompletionChunkChoiceDeltaToolCall {}
14341459 tests := []struct {
14351460 name string
14361461 input []* genai.Part
@@ -1675,7 +1700,7 @@ func TestExtractToolCallsFromGeminiPartsStream(t *testing.T) {
16751700
16761701 for _ , tt := range tests {
16771702 t .Run (tt .name , func (t * testing.T ) {
1678- calls , err := extractToolCallsFromGeminiPartsStream (tt .input )
1703+ calls , err := extractToolCallsFromGeminiPartsStream (toolCalls , tt .input )
16791704
16801705 if tt .wantErr {
16811706 require .Error (t , err )
@@ -1696,6 +1721,8 @@ func TestExtractToolCallsFromGeminiPartsStream(t *testing.T) {
16961721
16971722// TestExtractToolCallsStreamVsNonStream tests the differences between streaming and non-streaming extraction
16981723func TestExtractToolCallsStreamVsNonStream (t * testing.T ) {
1724+ toolCalls := []openai.ChatCompletionMessageToolCallParam {}
1725+ toolCallsStream := []openai.ChatCompletionChunkChoiceDeltaToolCall {}
16991726 parts := []* genai.Part {
17001727 {
17011728 FunctionCall : & genai.FunctionCall {
@@ -1709,11 +1736,11 @@ func TestExtractToolCallsStreamVsNonStream(t *testing.T) {
17091736 }
17101737
17111738 // Get results from both functions
1712- streamCalls , err := extractToolCallsFromGeminiPartsStream (parts )
1739+ streamCalls , err := extractToolCallsFromGeminiPartsStream (toolCallsStream , parts )
17131740 require .NoError (t , err )
17141741 require .Len (t , streamCalls , 1 )
17151742
1716- nonStreamCalls , err := extractToolCallsFromGeminiParts (parts )
1743+ nonStreamCalls , err := extractToolCallsFromGeminiParts (toolCalls , parts )
17171744 require .NoError (t , err )
17181745 require .Len (t , nonStreamCalls , 1 )
17191746
@@ -1749,6 +1776,7 @@ func TestExtractToolCallsStreamVsNonStream(t *testing.T) {
17491776
17501777// TestExtractToolCallsStreamIndexing specifically tests that multiple tool calls get correct indices
17511778func TestExtractToolCallsStreamIndexing (t * testing.T ) {
1779+ toolCalls := []openai.ChatCompletionChunkChoiceDeltaToolCall {}
17521780 parts := []* genai.Part {
17531781 {
17541782 FunctionCall : & genai.FunctionCall {
@@ -1771,7 +1799,7 @@ func TestExtractToolCallsStreamIndexing(t *testing.T) {
17711799 },
17721800 }
17731801
1774- calls , err := extractToolCallsFromGeminiPartsStream (parts )
1802+ calls , err := extractToolCallsFromGeminiPartsStream (toolCalls , parts )
17751803 require .NoError (t , err )
17761804 require .Len (t , calls , 3 )
17771805
0 commit comments