Skip to content

Commit 33dad8f

Browse files
Coda-bottpfz
authored andcommitted
feat: [Coda] 完整实现Code Evaluator功能模块
本次提交包含Code Evaluator的完整功能实现,涵盖以下主要特性: 核心功能: - 实现Code Evaluator的IDL定义和模板验证功能 - 支持Python和JavaScript代码的语法验证和安全检查 - 添加代码执行、调试和测试接口 - 实现MockEvalTargetOutput接口和JSON模拟数据生成 数据层改进: - 优化EvaluatorOutputData结构,支持RetVal和stdout字段解析 - 重构Runtime接口架构,从基础设施层迁移到领域组件层 - 完善Evaluator版本管理和数据转换逻辑 安全性增强: - 集成全面的安全验证,检测危险函数、模块和恶意模式 - 实现语言特定的验证规则(Python和JavaScript) - 添加大小写不敏感的语言类型验证 测试和调试: - 完善冒烟测试脚本,支持debug-python场景 - 修复Python f-string语法错误和编码问题 - 优化测试请求头配置和代码内容模板 接口优化: - 移除冗余的Runtime接口,直接使用组件接口 - 修正evaluator_id与evaluator_version_id的混淆问题 - 分离evaluator和evaluator_version的描述字段 此次合并涵盖了Code Evaluator从设计到实现的完整开发周期,确保功能完整性和代码质量。
1 parent c921d25 commit 33dad8f

File tree

118 files changed

+16742
-2615
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

118 files changed

+16742
-2615
lines changed

backend/api/handler/coze/loop/apis/eval_target_service.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/api/handler/coze/loop/apis/evaluator_service.go

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/api/router/coze/loop/apis/coze.loop.apis.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/api/router/coze/loop/apis/middleware.go

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ require (
101101

102102
require github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
103103

104+
require github.com/brianvoe/gofakeit/v6 v6.28.0
105+
104106
require (
105107
cloud.google.com/go v0.116.0 // indirect
106108
cloud.google.com/go/ai v0.8.0 // indirect

backend/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngE
152152
github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
153153
github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
154154
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
155+
github.com/brianvoe/gofakeit/v6 v6.28.0 h1:Xib46XXuQfmlLS2EXRuJpqcw8St6qSZz75OUo0tgAW4=
156+
github.com/brianvoe/gofakeit/v6 v6.28.0/go.mod h1:Xj58BMSnFqcn/fAQeSK+/PLtC5kSb7FJIq4JyGa8vEs=
155157
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
156158
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
157159
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=

backend/infra/http/client.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
// Copyright (c) 2025 coze-dev Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package http
5+
6+
import (
7+
"bytes"
8+
"context"
9+
"encoding/json"
10+
"fmt"
11+
"io"
12+
"net/http"
13+
"time"
14+
)
15+
16+
// HTTPClient HTTP客户端实现
17+
type HTTPClient struct {
18+
client *http.Client
19+
}
20+
21+
// NewHTTPClient 创建HTTP客户端实例
22+
func NewHTTPClient() IClient {
23+
return &HTTPClient{
24+
client: &http.Client{
25+
Timeout: 30 * time.Second,
26+
},
27+
}
28+
}
29+
30+
// DoHTTPRequest 执行HTTP请求
31+
func (c *HTTPClient) DoHTTPRequest(ctx context.Context, requestParam *RequestParam) error {
32+
if requestParam == nil {
33+
return fmt.Errorf("request param is nil")
34+
}
35+
36+
// 设置超时
37+
if requestParam.Timeout > 0 {
38+
var cancel context.CancelFunc
39+
ctx, cancel = context.WithTimeout(ctx, requestParam.Timeout)
40+
defer cancel()
41+
}
42+
43+
// 序列化请求体
44+
var body io.Reader
45+
if requestParam.Body != nil {
46+
// 如果Body已经是io.Reader类型,直接使用
47+
if reader, ok := requestParam.Body.(io.Reader); ok {
48+
body = reader
49+
} else {
50+
// 否则进行JSON序列化
51+
bodyBytes, err := json.Marshal(requestParam.Body)
52+
if err != nil {
53+
return fmt.Errorf("failed to marshal request body: %w", err)
54+
}
55+
body = bytes.NewReader(bodyBytes)
56+
}
57+
}
58+
59+
// 创建HTTP请求
60+
req, err := http.NewRequestWithContext(ctx, requestParam.Method, requestParam.RequestURI, body)
61+
if err != nil {
62+
return fmt.Errorf("failed to create request: %w", err)
63+
}
64+
65+
// 设置请求头
66+
if requestParam.Header != nil {
67+
for key, value := range requestParam.Header {
68+
req.Header.Set(key, value)
69+
}
70+
}
71+
72+
// 如果没有设置Content-Type且有body,设置为application/json
73+
if requestParam.Body != nil && req.Header.Get("Content-Type") == "" {
74+
// 如果Body是io.Reader类型,默认设置为text/plain
75+
if _, ok := requestParam.Body.(io.Reader); ok {
76+
req.Header.Set("Content-Type", "text/plain")
77+
} else {
78+
req.Header.Set("Content-Type", "application/json")
79+
}
80+
}
81+
82+
// 发送请求
83+
resp, err := c.client.Do(req)
84+
if err != nil {
85+
return fmt.Errorf("failed to send request: %w", err)
86+
}
87+
defer resp.Body.Close()
88+
89+
// 检查HTTP状态码
90+
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
91+
bodyBytes, _ := io.ReadAll(resp.Body)
92+
return fmt.Errorf("HTTP request failed with status %d: %s", resp.StatusCode, string(bodyBytes))
93+
}
94+
95+
// 解析响应体
96+
if requestParam.Response != nil {
97+
bodyBytes, err := io.ReadAll(resp.Body)
98+
if err != nil {
99+
return fmt.Errorf("failed to read response body: %w", err)
100+
}
101+
102+
if err := json.Unmarshal(bodyBytes, requestParam.Response); err != nil {
103+
return fmt.Errorf("failed to unmarshal response body: %w", err)
104+
}
105+
}
106+
107+
return nil
108+
}

backend/kitex_gen/coze/loop/apis/evaltargetservice/client.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/kitex_gen/coze/loop/apis/evaltargetservice/evaltargetservice.go

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/kitex_gen/coze/loop/apis/evaluatorservice/client.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)