Files
llm-intelligence/scripts/bytedance_subscription_lib.go

120 lines
4.1 KiB
Go
Raw Normal View History

//go:build llm_script
package main
import (
"fmt"
"regexp"
"strings"
)
const (
defaultBytedanceCodingPlanURL = "https://developer.volcengine.com/articles/7574419773204004906"
defaultBytedanceCodingPlanNotice = "https://developer.volcengine.com/articles/7604465649330749490"
)
func parseBytedanceSubscriptionCatalog(pricingRaw string, noticeRaw string) ([]subscriptionImportRecord, error) {
publishedAt, known := publishedAtFromText(firstNonEmptyText(pricingRaw, noticeRaw))
liteSection := sliceSection(pricingRaw, "Lite 套餐", "Pro 套餐")
proSection := sliceSection(pricingRaw, "Pro 套餐", "")
if strings.TrimSpace(liteSection) == "" || strings.TrimSpace(proSection) == "" {
return nil, fmt.Errorf("unexpected bytedance coding plan sections")
}
promoNote := "新用户首购优惠。"
if strings.Contains(noticeRaw, "每日 10:30") {
promoNote = "新用户首购优惠,每日 10:30 限量开放。"
}
records := make([]subscriptionImportRecord, 0, 4)
for _, tierSection := range []struct {
Tier string
Content string
}{
{Tier: "Lite", Content: liteSection},
{Tier: "Pro", Content: proSection},
} {
tier := tierSection.Tier
section := strings.TrimSpace(tierSection.Content)
lines := strings.Split(section, "\n")
scene := ""
for _, line := range lines {
line = strings.TrimSpace(line)
if line != "" {
scene = line
break
}
}
pricePattern := regexp.MustCompile(`([\d.]+)\s+元\s+([\d.]+)\s+元/月`)
priceMatch := pricePattern.FindStringSubmatch(section)
if len(priceMatch) != 3 {
return nil, fmt.Errorf("missing bytedance %s prices", tier)
}
quotaPattern := regexp.MustCompile(`每月约\s+([\d,]+)\s+次请求`)
quotaMatch := quotaPattern.FindStringSubmatch(section)
if len(quotaMatch) != 2 {
return nil, fmt.Errorf("missing bytedance %s monthly quota", tier)
}
promoPrice := mustParseSubscriptionPrice(priceMatch[1])
standardPrice := mustParseSubscriptionPrice(priceMatch[2])
monthlyQuota := mustParseSubscriptionInt64(quotaMatch[1])
tierCode := strings.ToLower(tier)
records = append(records, subscriptionImportRecord{
ProviderName: "ByteDance",
ProviderNameCn: "字节跳动",
ProviderCountry: "CN",
ProviderWebsite: "https://www.volcengine.com",
OperatorName: "ByteDance Volcano",
OperatorNameCn: "火山引擎",
OperatorCountry: "CN",
OperatorWebsite: "https://developer.volcengine.com",
OperatorType: "cloud",
PlanFamily: "coding_plan",
PlanCode: "bytedance-coding-plan-" + tierCode,
PlanName: "方舟 Coding Plan " + tier,
Tier: tier,
BillingCycle: "monthly",
Currency: "CNY",
ListPrice: standardPrice,
PriceUnit: "CNY/month",
QuotaValue: monthlyQuota,
QuotaUnit: "requests/month",
PlanScope: "方舟 Coding Plan",
SourceURL: defaultBytedanceCodingPlanURL,
PublishedAt: publishedAt,
EffectiveDate: effectiveDateFromPublishedAt(publishedAt),
Notes: scene + ";续费标准价。",
PublishedAtKnown: known,
})
records = append(records, subscriptionImportRecord{
ProviderName: "ByteDance",
ProviderNameCn: "字节跳动",
ProviderCountry: "CN",
ProviderWebsite: "https://www.volcengine.com",
OperatorName: "ByteDance Volcano",
OperatorNameCn: "火山引擎",
OperatorCountry: "CN",
OperatorWebsite: "https://developer.volcengine.com",
OperatorType: "cloud",
PlanFamily: "coding_plan",
PlanCode: "bytedance-coding-plan-" + tierCode + "-first-month",
PlanName: "方舟 Coding Plan " + tier + " 首月活动版",
Tier: tier + " Promo",
BillingCycle: "monthly",
Currency: "CNY",
ListPrice: promoPrice,
PriceUnit: "CNY/month",
QuotaValue: monthlyQuota,
QuotaUnit: "requests/month",
PlanScope: "方舟 Coding Plan",
SourceURL: defaultBytedanceCodingPlanURL,
PublishedAt: publishedAt,
EffectiveDate: effectiveDateFromPublishedAt(publishedAt),
Notes: scene + "" + promoNote,
PublishedAtKnown: known,
})
}
return records, nil
}