diff --git a/components/model/ark/chatmodel.go b/components/model/ark/chatmodel.go index c6cd0f58..0cba6db2 100644 --- a/components/model/ark/chatmodel.go +++ b/components/model/ark/chatmodel.go @@ -32,7 +32,6 @@ import ( "github.com/cloudwego/eino/callbacks" fmodel "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" - "github.com/cloudwego/eino/utils/safe" ) var ( @@ -285,7 +284,7 @@ func (cm *ChatModel) Stream(ctx context.Context, in []*schema.Message, opts ...f defer func() { panicErr := recover() if panicErr != nil { - _ = sw.Send(nil, safe.NewPanicErr(panicErr, debug.Stack())) + _ = sw.Send(nil, newPanicErr(panicErr, debug.Stack())) } sw.Close() @@ -650,3 +649,19 @@ func closeArkStreamReader(r *autils.ChatCompletionStreamReader) error { func ptrOf[T any](v T) *T { return &v } + +type panicErr struct { + info any + stack []byte +} + +func (p *panicErr) Error() string { + return fmt.Sprintf("panic error: %v, \nstack: %s", p.info, string(p.stack)) +} + +func newPanicErr(info any, stack []byte) error { + return &panicErr{ + info: info, + stack: stack, + } +} diff --git a/components/model/ark/chatmodel_test.go b/components/model/ark/chatmodel_test.go index 8e7fbea3..de7735ea 100644 --- a/components/model/ark/chatmodel_test.go +++ b/components/model/ark/chatmodel_test.go @@ -340,3 +340,7 @@ func TestBindTools(t *testing.T) { }) } +func TestPanicErr(t *testing.T) { + err := newPanicErr("info", []byte("stack")) + assert.Equal(t, "panic error: info, \nstack: stack", err.Error()) +} diff --git a/components/model/claude/claude.go b/components/model/claude/claude.go index 8c7c96d7..67313f21 100644 --- a/components/model/claude/claude.go +++ b/components/model/claude/claude.go @@ -28,7 +28,6 @@ import ( "github.com/cloudwego/eino/callbacks" "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" - "github.com/cloudwego/eino/utils/safe" ) // NewChatModel creates a new Claude chat model instance @@ -165,7 +164,7 @@ func (c *ChatModel) Stream(ctx context.Context, input []*schema.Message, opts .. panicErr := recover() if panicErr != nil { - _ = sw.Send(nil, safe.NewPanicErr(panicErr, debug.Stack())) + _ = sw.Send(nil, newPanicErr(panicErr, debug.Stack())) } stream.Close() sw.Close() @@ -586,3 +585,19 @@ func isMessageEmpty(message *schema.Message) bool { } return false } + +type panicErr struct { + info any + stack []byte +} + +func (p *panicErr) Error() string { + return fmt.Sprintf("panic error: %v, \nstack: %s", p.info, string(p.stack)) +} + +func newPanicErr(info any, stack []byte) error { + return &panicErr{ + info: info, + stack: stack, + } +} diff --git a/components/model/claude/claude_test.go b/components/model/claude/claude_test.go index 6b803eb3..76f2bfb1 100644 --- a/components/model/claude/claude_test.go +++ b/components/model/claude/claude_test.go @@ -247,3 +247,8 @@ func TestConvStreamEvent(t *testing.T) { assert.Equal(t, message.ToolCalls[0].Function.Arguments, "") }) } + +func TestPanicErr(t *testing.T) { + err := newPanicErr("info", []byte("stack")) + assert.Equal(t, "panic error: info, \nstack: stack", err.Error()) +} diff --git a/components/model/deepseek/deepseek.go b/components/model/deepseek/deepseek.go index bb41ccbf..473be144 100644 --- a/components/model/deepseek/deepseek.go +++ b/components/model/deepseek/deepseek.go @@ -27,7 +27,6 @@ import ( "github.com/cloudwego/eino/callbacks" "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" - "github.com/cloudwego/eino/utils/safe" "github.com/cohesion-org/deepseek-go" ) @@ -204,7 +203,7 @@ func (cm *ChatModel) Stream(ctx context.Context, in []*schema.Message, opts ...m _ = stream.Close() if panicErr != nil { - _ = sw.Send(nil, safe.NewPanicErr(panicErr, debug.Stack())) + _ = sw.Send(nil, newPanicErr(panicErr, debug.Stack())) } sw.Close() @@ -546,3 +545,19 @@ func toCallbackUsage(usage *schema.TokenUsage) *model.TokenUsage { TotalTokens: usage.TotalTokens, } } + +type panicErr struct { + info any + stack []byte +} + +func (p *panicErr) Error() string { + return fmt.Sprintf("panic error: %v, \nstack: %s", p.info, string(p.stack)) +} + +func newPanicErr(info any, stack []byte) error { + return &panicErr{ + info: info, + stack: stack, + } +} diff --git a/components/model/deepseek/deepseek_test.go b/components/model/deepseek/deepseek_test.go index d69ac389..71536460 100644 --- a/components/model/deepseek/deepseek_test.go +++ b/components/model/deepseek/deepseek_test.go @@ -163,3 +163,8 @@ func (m *mockStream) Recv() (*deepseek.StreamChatCompletionResponse, error) { func (m *mockStream) Close() error { return nil } + +func TestPanicErr(t *testing.T) { + err := newPanicErr("info", []byte("stack")) + assert.Equal(t, "panic error: info, \nstack: stack", err.Error()) +} diff --git a/components/model/gemini/gemini.go b/components/model/gemini/gemini.go index d3e6c53f..7fb910d2 100644 --- a/components/model/gemini/gemini.go +++ b/components/model/gemini/gemini.go @@ -26,7 +26,6 @@ import ( "github.com/cloudwego/eino/callbacks" "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" - "github.com/cloudwego/eino/utils/safe" "github.com/getkin/kin-openapi/openapi3" "github.com/google/generative-ai-go/genai" "google.golang.org/api/iterator" @@ -202,7 +201,7 @@ func (c *ChatModel) Stream(ctx context.Context, input []*schema.Message, opts .. panicErr := recover() if panicErr != nil { - _ = sw.Send(nil, safe.NewPanicErr(panicErr, debug.Stack())) + _ = sw.Send(nil, newPanicErr(panicErr, debug.Stack())) } sw.Close() }() @@ -649,3 +648,19 @@ func toGeminiRole(role schema.RoleType) string { } return roleUser } + +type panicErr struct { + info any + stack []byte +} + +func (p *panicErr) Error() string { + return fmt.Sprintf("panic error: %v, \nstack: %s", p.info, string(p.stack)) +} + +func newPanicErr(info any, stack []byte) error { + return &panicErr{ + info: info, + stack: stack, + } +} diff --git a/components/model/gemini/gemini_test.go b/components/model/gemini/gemini_test.go index 237f8c36..56eef8f0 100644 --- a/components/model/gemini/gemini_test.go +++ b/components/model/gemini/gemini_test.go @@ -252,3 +252,8 @@ func TestGemini(t *testing.T) { assert.Equal(t, "I see a beautiful sunset image", resp.Content) }) } + +func TestPanicErr(t *testing.T) { + err := newPanicErr("info", []byte("stack")) + assert.Equal(t, "panic error: info, \nstack: stack", err.Error()) +} diff --git a/components/model/ollama/chatmodel.go b/components/model/ollama/chatmodel.go index 7e39297c..580d7a9e 100644 --- a/components/model/ollama/chatmodel.go +++ b/components/model/ollama/chatmodel.go @@ -31,7 +31,6 @@ import ( "github.com/cloudwego/eino/callbacks" "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" - "github.com/cloudwego/eino/utils/safe" ) var CallbackMetricsExtraKey = "ollama_metrics" @@ -145,7 +144,7 @@ func (cm *ChatModel) Stream(ctx context.Context, input []*schema.Message, opts . panicErr := recover() if panicErr != nil { - _ = sw.Send(nil, safe.NewPanicErr(panicErr, debug.Stack())) + _ = sw.Send(nil, newPanicErr(panicErr, debug.Stack())) } sw.Close() @@ -418,3 +417,19 @@ func toOllamaTools(einoTools []*schema.ToolInfo) ([]api.Tool, error) { } return ollamaTools, nil } + +type panicErr struct { + info any + stack []byte +} + +func (p *panicErr) Error() string { + return fmt.Sprintf("panic error: %v, \nstack: %s", p.info, string(p.stack)) +} + +func newPanicErr(info any, stack []byte) error { + return &panicErr{ + info: info, + stack: stack, + } +} diff --git a/components/model/ollama/chatmodel_test.go b/components/model/ollama/chatmodel_test.go index 5ecbe5e6..5e47bc3a 100644 --- a/components/model/ollama/chatmodel_test.go +++ b/components/model/ollama/chatmodel_test.go @@ -289,3 +289,8 @@ func TestBindTools(t *testing.T) { }) } + +func TestPanicErr(t *testing.T) { + err := newPanicErr("info", []byte("stack")) + assert.Equal(t, "panic error: info, \nstack: stack", err.Error()) +} diff --git a/components/model/qianfan/chatmodel.go b/components/model/qianfan/chatmodel.go index fa93754d..3cd6f944 100644 --- a/components/model/qianfan/chatmodel.go +++ b/components/model/qianfan/chatmodel.go @@ -26,7 +26,6 @@ import ( "github.com/cloudwego/eino/callbacks" "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" - "github.com/cloudwego/eino/utils/safe" ) // GetQianfanSingletonConfig qianfan config is singleton, you should set ak+sk / bear_token before init chat model @@ -152,7 +151,7 @@ func (c *ChatModel) Stream(ctx context.Context, input []*schema.Message, opts .. go func() { defer func() { if pe := recover(); pe != nil { - _ = sw.Send(nil, safe.NewPanicErr(pe, debug.Stack())) + _ = sw.Send(nil, newPanicErr(pe, debug.Stack())) } r.Close() @@ -498,3 +497,19 @@ func (c *ChatModel) GetType() string { func (c *ChatModel) IsCallbacksEnabled() bool { return true } + +type panicErr struct { + info any + stack []byte +} + +func (p *panicErr) Error() string { + return fmt.Sprintf("panic error: %v, \nstack: %s", p.info, string(p.stack)) +} + +func newPanicErr(info any, stack []byte) error { + return &panicErr{ + info: info, + stack: stack, + } +} diff --git a/components/model/qianfan/chatmodel_test.go b/components/model/qianfan/chatmodel_test.go index 716d973e..273241ff 100644 --- a/components/model/qianfan/chatmodel_test.go +++ b/components/model/qianfan/chatmodel_test.go @@ -24,6 +24,7 @@ import ( "github.com/baidubce/bce-qianfan-sdk/go/qianfan" . "github.com/bytedance/mockey" "github.com/smartystreets/goconvey/convey" + "github.com/stretchr/testify/assert" fmodel "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" @@ -325,3 +326,7 @@ func TestBindTools(t *testing.T) { }) } +func TestPanicErr(t *testing.T) { + err := newPanicErr("info", []byte("stack")) + assert.Equal(t, "panic error: info, \nstack: stack", err.Error()) +} diff --git a/devops/internal/utils/generic/type_utils.go b/devops/internal/utils/generic/type_utils.go index 078d967c..c6bcba7d 100644 --- a/devops/internal/utils/generic/type_utils.go +++ b/devops/internal/utils/generic/type_utils.go @@ -19,8 +19,6 @@ package generic import ( "reflect" "strings" - - "github.com/cloudwego/eino/utils/generic" ) func GetJsonName(field reflect.StructField) string { @@ -44,15 +42,19 @@ func IsMapType[K, V any](t reflect.Type) bool { if t.Kind() != reflect.Map { return false } - if t.Key().Kind() != generic.TypeOf[K]().Kind() { + if t.Key().Kind() != typeOf[K]().Kind() { return false } - if t.Elem().Kind() != generic.TypeOf[V]().Kind() { + if t.Elem().Kind() != typeOf[V]().Kind() { return false } return true } +func typeOf[T any]() reflect.Type { + return reflect.TypeOf((*T)(nil)).Elem() +} + var comfortableKind = map[reflect.Kind]bool{ reflect.String: true, reflect.Bool: true, diff --git a/libs/acl/openai/chat_model.go b/libs/acl/openai/chat_model.go index 0c329ad3..5e45359b 100644 --- a/libs/acl/openai/chat_model.go +++ b/libs/acl/openai/chat_model.go @@ -29,7 +29,6 @@ import ( "github.com/cloudwego/eino/callbacks" "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" - "github.com/cloudwego/eino/utils/safe" "github.com/getkin/kin-openapi/openapi3" ) @@ -519,7 +518,7 @@ func (cm *Client) Stream(ctx context.Context, in []*schema.Message, _ = stream.Close() if panicErr != nil { - _ = sw.Send(nil, safe.NewPanicErr(panicErr, debug.Stack())) + _ = sw.Send(nil, newPanicErr(panicErr, debug.Stack())) } sw.Close() @@ -716,3 +715,19 @@ func (cm *Client) BindForcedTools(tools []*schema.ToolInfo) error { return nil } + +type panicErr struct { + info any + stack []byte +} + +func (p *panicErr) Error() string { + return fmt.Sprintf("panic error: %v, \nstack: %s", p.info, string(p.stack)) +} + +func newPanicErr(info any, stack []byte) error { + return &panicErr{ + info: info, + stack: stack, + } +} diff --git a/libs/acl/openai/chat_model_test.go b/libs/acl/openai/chat_model_test.go index b48cee00..d43e07cf 100644 --- a/libs/acl/openai/chat_model_test.go +++ b/libs/acl/openai/chat_model_test.go @@ -93,3 +93,8 @@ func randStr() string { } return string(b) } + +func TestPanicErr(t *testing.T) { + err := newPanicErr("info", []byte("stack")) + assert.Equal(t, "panic error: info, \nstack: stack", err.Error()) +}