mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-05 00:45:29 +08:00
104 lines
3.1 KiB
Go
104 lines
3.1 KiB
Go
package testsuite
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
func (r *Runner) caseModelsClaude(ctx context.Context, cc *caseContext) error {
|
|
resp, err := cc.request(ctx, requestSpec{Method: http.MethodGet, Path: "/anthropic/v1/models", Retryable: true})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cc.assert("status_200", resp.StatusCode == http.StatusOK, fmt.Sprintf("status=%d", resp.StatusCode))
|
|
ids := extractModelIDs(resp.Body)
|
|
cc.assert("non_empty", len(ids) > 0, fmt.Sprintf("models=%v", ids))
|
|
return nil
|
|
}
|
|
func (r *Runner) caseAnthropicNonstream(ctx context.Context, cc *caseContext) error {
|
|
resp, err := cc.request(ctx, requestSpec{
|
|
Method: http.MethodPost,
|
|
Path: "/anthropic/v1/messages",
|
|
Headers: map[string]string{
|
|
"Authorization": "Bearer " + r.apiKey,
|
|
"anthropic-version": "2023-06-01",
|
|
"content-type": "application/json",
|
|
},
|
|
Body: map[string]any{
|
|
"model": "claude-sonnet-4-5",
|
|
"messages": []map[string]any{
|
|
{"role": "user", "content": "hello"},
|
|
},
|
|
"stream": false,
|
|
},
|
|
Retryable: true,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cc.assert("status_200", resp.StatusCode == http.StatusOK, fmt.Sprintf("status=%d", resp.StatusCode))
|
|
var m map[string]any
|
|
_ = json.Unmarshal(resp.Body, &m)
|
|
cc.assert("type_message", asString(m["type"]) == "message", fmt.Sprintf("body=%s", string(resp.Body)))
|
|
return nil
|
|
}
|
|
|
|
func (r *Runner) caseAnthropicStream(ctx context.Context, cc *caseContext) error {
|
|
resp, err := cc.request(ctx, requestSpec{
|
|
Method: http.MethodPost,
|
|
Path: "/anthropic/v1/messages",
|
|
Headers: map[string]string{
|
|
"Authorization": "Bearer " + r.apiKey,
|
|
"anthropic-version": "2023-06-01",
|
|
"content-type": "application/json",
|
|
},
|
|
Body: map[string]any{
|
|
"model": "claude-sonnet-4-5",
|
|
"messages": []map[string]any{
|
|
{"role": "user", "content": "stream hello"},
|
|
},
|
|
"stream": true,
|
|
},
|
|
Stream: true,
|
|
Retryable: true,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cc.assert("status_200", resp.StatusCode == http.StatusOK, fmt.Sprintf("status=%d", resp.StatusCode))
|
|
events := parseClaudeStreamEvents(resp.Body)
|
|
cc.assert("has_message_start", contains(events, "message_start"), fmt.Sprintf("events=%v", events))
|
|
cc.assert("has_message_stop", contains(events, "message_stop"), fmt.Sprintf("events=%v", events))
|
|
return nil
|
|
}
|
|
|
|
func (r *Runner) caseAnthropicCountTokens(ctx context.Context, cc *caseContext) error {
|
|
resp, err := cc.request(ctx, requestSpec{
|
|
Method: http.MethodPost,
|
|
Path: "/anthropic/v1/messages/count_tokens",
|
|
Headers: map[string]string{
|
|
"Authorization": "Bearer " + r.apiKey,
|
|
"anthropic-version": "2023-06-01",
|
|
"content-type": "application/json",
|
|
},
|
|
Body: map[string]any{
|
|
"model": "claude-sonnet-4-5",
|
|
"messages": []map[string]any{
|
|
{"role": "user", "content": "count me"},
|
|
},
|
|
},
|
|
Retryable: true,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cc.assert("status_200", resp.StatusCode == http.StatusOK, fmt.Sprintf("status=%d", resp.StatusCode))
|
|
var m map[string]any
|
|
_ = json.Unmarshal(resp.Body, &m)
|
|
v := toInt(m["input_tokens"])
|
|
cc.assert("input_tokens_gt_zero", v > 0, fmt.Sprintf("body=%s", string(resp.Body)))
|
|
return nil
|
|
}
|