UNPKG

@copilotkit/runtime-client-gql

Version:

<img src="https://github.com/user-attachments/assets/0a6b64d9-e193-4940-a3f6-60334ac34084" alt="banner" style="border-radius: 12px; border: 2px solid #d6d4fa;" />

1 lines • 30.2 kB
{"version":3,"sources":["../../src/message-conversion/roundtrip-conversion.test.ts"],"sourcesContent":["import { describe, test, expect, vi } from \"vitest\";\nimport * as gql from \"../client\";\nimport agui from \"@copilotkit/shared\";\nimport { aguiToGQL } from \"./agui-to-gql\";\nimport { gqlToAGUI } from \"./gql-to-agui\";\n\n// Helper to strip functions for deep equality\nfunction stripFunctions(obj: any): any {\n if (typeof obj === \"function\") return undefined;\n if (Array.isArray(obj)) return obj.map(stripFunctions);\n if (obj && typeof obj === \"object\") {\n const out: any = {};\n for (const k in obj) {\n if (typeof obj[k] !== \"function\") {\n out[k] = stripFunctions(obj[k]);\n }\n }\n return out;\n }\n return obj;\n}\n\ndescribe(\"roundtrip message conversion\", () => {\n test(\"text message AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"user-1\",\n role: \"user\",\n content: \"Hello!\",\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n expect(stripFunctions(aguiMsgs2[0])).toEqual(stripFunctions(aguiMsg));\n });\n\n test(\"text message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.TextMessage({\n id: \"assistant-1\",\n content: \"Hi!\",\n role: gql.Role.Assistant,\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n // Should be equivalent in content, id, and role\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).content).toBe(gqlMsg.content);\n expect((gqlMsgs2[0] as any).role).toBe(gqlMsg.role);\n });\n\n test(\"tool message AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"tool-1\",\n role: \"tool\",\n content: \"Tool result\",\n toolCallId: \"tool-call-1\",\n toolName: \"testAction\",\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n expect(stripFunctions(aguiMsgs2[0])).toEqual(stripFunctions(aguiMsg));\n });\n\n test(\"tool message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.ResultMessage({\n id: \"tool-1\",\n result: \"Tool result\",\n actionExecutionId: \"tool-call-1\",\n actionName: \"testAction\",\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).result).toBe(gqlMsg.result);\n expect((gqlMsgs2[0] as any).actionExecutionId).toBe(gqlMsg.actionExecutionId);\n });\n\n test(\"action execution AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"assistant-1\",\n role: \"assistant\",\n content: \"Running action\",\n toolCalls: [\n {\n id: \"tool-call-1\",\n type: \"function\",\n function: {\n name: \"doSomething\",\n arguments: JSON.stringify({ foo: \"bar\" }),\n },\n },\n ],\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n // Should have an assistant message and an action execution message\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n // Only check toolCalls if present\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"doSomething\");\n }\n });\n\n test(\"action execution GQL -> AGUI -> GQL\", () => {\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"tool-call-1\",\n name: \"doSomething\",\n arguments: { foo: \"bar\" },\n parentMessageId: \"assistant-1\",\n });\n const aguiMsgs = gqlToAGUI([actionExecMsg]);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n // The ActionExecutionMessage is at index 1, not index 0\n expect(gqlMsgs2[1].id).toBe(\"tool-call-1\");\n // The name should be extracted from the toolCall function name\n expect((gqlMsgs2[1] as any).name).toBe(\"doSomething\");\n expect((gqlMsgs2[1] as any).arguments).toEqual({ foo: \"bar\" });\n });\n\n test(\"agent state GQL -> AGUI -> GQL\", () => {\n const agentStateMsg = new gql.AgentStateMessage({\n id: \"agent-state-1\",\n agentName: \"testAgent\",\n state: { status: \"running\" },\n role: gql.Role.Assistant,\n });\n const aguiMsgs = gqlToAGUI([agentStateMsg]);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(\"agent-state-1\");\n // The agentName should be preserved in the roundtrip\n expect((gqlMsgs2[0] as any).agentName).toBe(\"testAgent\");\n });\n\n test(\"action execution with render function roundtrip\", () => {\n const mockRender = vi.fn();\n const aguiMsg: agui.Message = {\n id: \"assistant-1\",\n role: \"assistant\",\n content: \"Running action\",\n toolCalls: [\n {\n id: \"tool-call-1\",\n type: \"function\",\n function: {\n name: \"doSomething\",\n arguments: JSON.stringify({ foo: \"bar\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n const actions: Record<string, any> = { doSomething: { name: \"doSomething\" } };\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n // The render function should be preserved in actions context\n expect(typeof actions.doSomething.render).toBe(\"function\");\n // The roundtripped message should have the same tool call\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"doSomething\");\n }\n });\n\n test(\"image message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.ImageMessage({\n id: \"img-1\",\n format: \"jpeg\",\n bytes: \"somebase64string\",\n role: gql.Role.User,\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).format).toBe(gqlMsg.format);\n expect((gqlMsgs2[0] as any).bytes).toBe(gqlMsg.bytes);\n expect((gqlMsgs2[0] as any).role).toBe(gqlMsg.role);\n });\n\n test(\"image message AGUI -> GQL -> AGUI (assistant and user)\", () => {\n // Assistant image message\n const aguiAssistantImageMsg: agui.Message = {\n id: \"img-assistant-1\",\n role: \"assistant\",\n image: {\n format: \"jpeg\",\n bytes: \"assistantbase64data\",\n },\n content: \"\", // required for type\n };\n const gqlAssistantMsgs = aguiToGQL(aguiAssistantImageMsg);\n const aguiAssistantMsgs2 = gqlToAGUI(gqlAssistantMsgs);\n expect(aguiAssistantMsgs2[0].id).toBe(aguiAssistantImageMsg.id);\n expect(aguiAssistantMsgs2[0].role).toBe(\"assistant\");\n expect((aguiAssistantMsgs2[0] as any).image.format).toBe(\"jpeg\");\n expect((aguiAssistantMsgs2[0] as any).image.bytes).toBe(\"assistantbase64data\");\n\n // User image message\n const aguiUserImageMsg: agui.Message = {\n id: \"img-user-1\",\n role: \"user\",\n image: {\n format: \"png\",\n bytes: \"userbase64data\",\n },\n content: \"\", // required for type\n };\n const gqlUserMsgs = aguiToGQL(aguiUserImageMsg);\n const aguiUserMsgs2 = gqlToAGUI(gqlUserMsgs);\n expect(aguiUserMsgs2[0].id).toBe(aguiUserImageMsg.id);\n expect(aguiUserMsgs2[0].role).toBe(\"user\");\n expect((aguiUserMsgs2[0] as any).image.format).toBe(\"png\");\n expect((aguiUserMsgs2[0] as any).image.bytes).toBe(\"userbase64data\");\n });\n\n test(\"wild card action roundtrip conversion\", () => {\n const mockRender = vi.fn((props) => `Wildcard rendered: ${props.args.test}`);\n const aguiMsg: agui.Message = {\n id: \"assistant-wildcard-1\",\n role: \"assistant\",\n content: \"Running wild card action\",\n toolCalls: [\n {\n id: \"tool-call-wildcard-1\",\n type: \"function\",\n function: {\n name: \"unknownAction\",\n arguments: JSON.stringify({ test: \"wildcard-value\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n\n const actions: Record<string, any> = {\n \"*\": { name: \"*\" },\n };\n\n // AGUI -> GQL -> AGUI roundtrip\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n\n // Verify the wild card action preserved the render function\n expect(typeof actions[\"*\"].render).toBe(\"function\");\n expect(actions[\"*\"].render).toBe(mockRender);\n\n // Verify the roundtripped message structure\n expect(aguiMsgs2).toHaveLength(2);\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n\n // Check that the tool call is preserved\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"unknownAction\");\n expect((aguiMsgs2[1] as any).toolCalls[0].function.arguments).toBe(\n '{\"test\":\"wildcard-value\"}',\n );\n }\n });\n\n test(\"wild card action with specific action priority roundtrip\", () => {\n const mockRender = vi.fn((props) => `Specific action rendered: ${props.args.test}`);\n const aguiMsg: agui.Message = {\n id: \"assistant-priority-1\",\n role: \"assistant\",\n content: \"Running specific action\",\n toolCalls: [\n {\n id: \"tool-call-priority-1\",\n type: \"function\",\n function: {\n name: \"specificAction\",\n arguments: JSON.stringify({ test: \"specific-value\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n\n const actions: Record<string, any> = {\n specificAction: { name: \"specificAction\" },\n \"*\": { name: \"*\" },\n };\n\n // AGUI -> GQL -> AGUI roundtrip\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n\n // Verify the specific action preserved the render function (not wild card)\n expect(typeof actions.specificAction.render).toBe(\"function\");\n expect(actions.specificAction.render).toBe(mockRender);\n expect(actions[\"*\"].render).toBeUndefined();\n\n // Verify the roundtripped message structure\n expect(aguiMsgs2).toHaveLength(2);\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n\n // Check that the tool call is preserved\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"specificAction\");\n expect((aguiMsgs2[1] as any).toolCalls[0].function.arguments).toBe(\n '{\"test\":\"specific-value\"}',\n );\n }\n });\n\n test(\"wild card action GQL -> AGUI -> GQL roundtrip\", () => {\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"wildcard-action-1\",\n name: \"unknownAction\",\n arguments: { test: \"wildcard-gql-value\" },\n parentMessageId: \"assistant-1\",\n });\n\n const actions: Record<string, any> = {\n \"*\": {\n name: \"*\",\n render: vi.fn((props) => `GQL wildcard rendered: ${props.args.test}`),\n },\n };\n\n // GQL -> AGUI -> GQL roundtrip\n const aguiMsgs = gqlToAGUI([actionExecMsg], actions);\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // When converting ActionExecutionMessage to AGUI and back, we get:\n // 1. A TextMessage (assistant message with toolCalls)\n // 2. An ActionExecutionMessage (the tool call itself)\n expect(gqlMsgs2).toHaveLength(2);\n expect(gqlMsgs2[0].id).toBe(\"wildcard-action-1\");\n expect((gqlMsgs2[0] as any).role).toBe(gql.Role.Assistant);\n expect(gqlMsgs2[1].id).toBe(\"wildcard-action-1\");\n expect((gqlMsgs2[1] as any).name).toBe(\"unknownAction\");\n expect((gqlMsgs2[1] as any).arguments).toEqual({ test: \"wildcard-gql-value\" });\n });\n\n test(\"roundtrip conversion with result parsing edge cases\", () => {\n // Test with a tool result that contains a JSON string\n const toolResultMsg: agui.Message = {\n id: \"tool-result-json\",\n role: \"tool\",\n content: '{\"status\": \"success\", \"data\": {\"value\": 42}}',\n toolCallId: \"tool-call-json\",\n toolName: \"jsonAction\",\n };\n\n // Convert AGUI -> GQL -> AGUI\n const gqlMsgs = aguiToGQL(toolResultMsg);\n const aguiMsgs = gqlToAGUI(gqlMsgs);\n\n expect(gqlMsgs).toHaveLength(1);\n expect(gqlMsgs[0]).toBeInstanceOf(gql.ResultMessage);\n expect((gqlMsgs[0] as any).result).toBe('{\"status\": \"success\", \"data\": {\"value\": 42}}');\n\n expect(aguiMsgs).toHaveLength(1);\n expect(aguiMsgs[0].role).toBe(\"tool\");\n expect(aguiMsgs[0].content).toBe('{\"status\": \"success\", \"data\": {\"value\": 42}}');\n });\n\n test(\"roundtrip conversion with object content in tool results\", () => {\n // Test with a tool result that has object content (edge case)\n const toolResultMsg: agui.Message = {\n id: \"tool-result-object\",\n role: \"tool\",\n content: { status: \"success\", data: { value: 42 } } as any,\n toolCallId: \"tool-call-object\",\n toolName: \"objectAction\",\n };\n\n // Convert AGUI -> GQL -> AGUI\n const gqlMsgs = aguiToGQL(toolResultMsg);\n const aguiMsgs = gqlToAGUI(gqlMsgs);\n\n expect(gqlMsgs).toHaveLength(1);\n expect(gqlMsgs[0]).toBeInstanceOf(gql.ResultMessage);\n expect((gqlMsgs[0] as any).result).toBe('{\"status\":\"success\",\"data\":{\"value\":42}}');\n\n expect(aguiMsgs).toHaveLength(1);\n expect(aguiMsgs[0].role).toBe(\"tool\");\n expect(aguiMsgs[0].content).toBe('{\"status\":\"success\",\"data\":{\"value\":42}}');\n });\n\n test(\"roundtrip conversion with action execution and result parsing\", () => {\n const mockRender = vi.fn((props) => `Rendered: ${JSON.stringify(props.result)}`);\n\n // Create action execution message\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"action-with-result\",\n name: \"testAction\",\n arguments: { input: \"test-value\" },\n parentMessageId: \"parent-result\",\n });\n\n // Create result message\n const resultMsg = new gql.ResultMessage({\n id: \"result-with-json\",\n result: '{\"output\": \"processed\", \"count\": 5}',\n actionExecutionId: \"action-with-result\",\n actionName: \"testAction\",\n });\n\n const actions = {\n testAction: {\n name: \"testAction\",\n render: mockRender,\n },\n };\n\n // Convert GQL -> AGUI\n const aguiMsgs = gqlToAGUI([actionExecMsg, resultMsg], actions);\n\n // The action execution should have a generativeUI function that parses string results\n expect(aguiMsgs).toHaveLength(2);\n expect(aguiMsgs[0].role).toBe(\"assistant\");\n expect(\"generativeUI\" in aguiMsgs[0]).toBe(true);\n expect(aguiMsgs[1].role).toBe(\"tool\");\n expect(aguiMsgs[1].content).toBe('{\"output\": \"processed\", \"count\": 5}');\n\n // Test that the render function receives parsed results\n if (\"generativeUI\" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {\n aguiMsgs[0].generativeUI({ result: '{\"parsed\": true}' });\n expect(mockRender).toHaveBeenCalledWith(\n expect.objectContaining({\n result: { parsed: true }, // Should be parsed from string\n }),\n );\n }\n\n // Convert back AGUI -> GQL\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // Should have 3 messages: TextMessage, ActionExecutionMessage, ResultMessage\n expect(gqlMsgs2).toHaveLength(3);\n expect(gqlMsgs2[0]).toBeInstanceOf(gql.TextMessage);\n expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);\n expect(gqlMsgs2[2]).toBeInstanceOf(gql.ResultMessage);\n\n // Check that arguments roundtripped correctly\n expect((gqlMsgs2[1] as any).arguments).toEqual({ input: \"test-value\" });\n expect((gqlMsgs2[2] as any).result).toBe('{\"output\": \"processed\", \"count\": 5}');\n });\n\n test(\"roundtrip conversion verifies correct property distribution for regular actions\", () => {\n const mockRender = vi.fn((props) => `Regular action: ${JSON.stringify(props.args)}`);\n\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"regular-action-test\",\n name: \"regularAction\",\n arguments: { test: \"regular-value\" },\n parentMessageId: \"parent-regular\",\n });\n\n const actions = {\n regularAction: {\n name: \"regularAction\",\n render: mockRender,\n },\n };\n\n // GQL -> AGUI -> GQL roundtrip\n const aguiMsgs = gqlToAGUI([actionExecMsg], actions);\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // Verify the roundtrip preserved the action\n expect(gqlMsgs2).toHaveLength(2);\n expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);\n expect((gqlMsgs2[1] as any).name).toBe(\"regularAction\");\n\n // Test that regular actions do NOT receive the name property in render props\n if (\"generativeUI\" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {\n aguiMsgs[0].generativeUI();\n expect(mockRender).toHaveBeenCalledWith(\n expect.objectContaining({\n args: { test: \"regular-value\" },\n // name property should NOT be present for regular actions\n }),\n );\n\n // Verify name property is NOT present\n const callArgs = mockRender.mock.calls[0][0];\n expect(callArgs).not.toHaveProperty(\"name\");\n }\n });\n\n test(\"roundtrip conversion verifies correct property distribution for wildcard actions\", () => {\n const mockRender = vi.fn(\n (props) => `Wildcard action: ${props.name} with ${JSON.stringify(props.args)}`,\n );\n\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"wildcard-action-test\",\n name: \"unknownAction\",\n arguments: { test: \"wildcard-value\" },\n parentMessageId: \"parent-wildcard\",\n });\n\n const actions = {\n \"*\": {\n name: \"*\",\n render: mockRender,\n },\n };\n\n // GQL -> AGUI -> GQL roundtrip\n const aguiMsgs = gqlToAGUI([actionExecMsg], actions);\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // Verify the roundtrip preserved the action\n expect(gqlMsgs2).toHaveLength(2);\n expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);\n expect((gqlMsgs2[1] as any).name).toBe(\"unknownAction\");\n\n // Test that wildcard actions DO receive the name property in render props\n if (\"generativeUI\" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {\n aguiMsgs[0].generativeUI();\n expect(mockRender).toHaveBeenCalledWith(\n expect.objectContaining({\n args: { test: \"wildcard-value\" },\n name: \"unknownAction\", // name property SHOULD be present for wildcard actions\n }),\n );\n\n // Verify name property IS present\n const callArgs = mockRender.mock.calls[0][0];\n expect(callArgs).toHaveProperty(\"name\", \"unknownAction\");\n }\n });\n});\n"],"mappings":"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","names":[]}