Jelajahi Sumber

清洗-
分包集成提示语

zhengkun 8 bulan lalu
induk
melakukan
257a4edca3
12 mengubah file dengan 127 tambahan dan 63 penghapusan
  1. 2 4
      ai/ai_baidu.go
  2. 1 3
      ai/ai_tongyi.go
  3. 3 9
      ai/ai_zhipu.go
  4. 13 8
      extract/extension.go
  5. 12 12
      extract/extract.go
  6. 1 1
      extract/test.go
  7. 5 2
      main.go
  8. 29 11
      prompt/prompt_package.go
  9. 42 2
      tool/tool.go
  10. 1 0
      ul/attr.go
  11. 16 9
      ul/global.go
  12. 2 2
      ul/init.go

+ 2 - 4
ai/ai_baidu.go

@@ -7,7 +7,6 @@ import (
 	"github.com/baidubce/bce-qianfan-sdk/go/qianfan"
 	log "github.com/donnie4w/go-logger/logger"
 	"os"
-	"strings"
 )
 
 // 百度千帆
@@ -32,9 +31,8 @@ func PostBaiDuAI(content string) map[string]interface{} {
 		return map[string]interface{}{}
 	}
 	res := make(map[string]interface{})
-	result := strings.ReplaceAll(resp.Result, "\n", "")
-	result = strings.ReplaceAll(result, "json", "")
-	result = strings.ReplaceAll(result, "`", "")
+	result := resp.Result
+	result = ul.Escape.ReplaceAllString(result, "")
 	if new_result := ul.SaveResultReg.FindString(result); new_result != "" {
 		result = new_result
 	}

+ 1 - 3
ai/ai_tongyi.go

@@ -55,9 +55,7 @@ func PostTongYiAI(content string) map[string]interface{} {
 		if choices := ul.IsMarkInterfaceMap(res["choices"]); len(choices) > 0 {
 			if message := qu.ObjToMap(choices[0]["message"]); message != nil {
 				result := qu.ObjToString((*message)["content"])
-				result = strings.ReplaceAll(result, "\n", "")
-				result = strings.ReplaceAll(result, "json", "")
-				result = strings.ReplaceAll(result, "`", "")
+				result = ul.Escape.ReplaceAllString(result, "")
 				result = strings.ReplaceAll(result, "[", "")
 				result = strings.ReplaceAll(result, "]", "")
 				if new_result := ul.SaveResultReg.FindString(result); new_result != "" {

+ 3 - 9
ai/ai_zhipu.go

@@ -57,9 +57,7 @@ func PostZhiPuAI(content string) map[string]interface{} {
 		if choices := ul.IsMarkInterfaceMap(res["choices"]); len(choices) > 0 {
 			if message := qu.ObjToMap(choices[0]["message"]); message != nil {
 				result := qu.ObjToString((*message)["content"])
-				result = strings.ReplaceAll(result, "\n", "")
-				result = strings.ReplaceAll(result, "json", "")
-				result = strings.ReplaceAll(result, "`", "")
+				result = ul.Escape.ReplaceAllString(result, "")
 				if new_result := ul.SaveResultReg.FindString(result); new_result != "" {
 					result = new_result
 				}
@@ -118,9 +116,7 @@ func PostClassZhiPuAI(content string) map[string]interface{} {
 		if choices := ul.IsMarkInterfaceMap(res["choices"]); len(choices) > 0 {
 			if message := qu.ObjToMap(choices[0]["message"]); message != nil {
 				result := qu.ObjToString((*message)["content"])
-				result = strings.ReplaceAll(result, "\n", "")
-				result = strings.ReplaceAll(result, "json", "")
-				result = strings.ReplaceAll(result, "`", "")
+				result = ul.Escape.ReplaceAllString(result, "")
 				if new_result := ul.SaveResultReg.FindString(result); new_result != "" {
 					result = new_result
 				}
@@ -187,9 +183,7 @@ func PostPackageZhiPuAI(content string) map[string]interface{} {
 				if len(arr) > 1 {
 					result = arr[1]
 				}
-				result = strings.ReplaceAll(result, "\n", "")
-				result = strings.ReplaceAll(result, "json", "")
-				result = strings.ReplaceAll(result, "`", "")
+				result = ul.Escape.ReplaceAllString(result, "")
 				if new_result := ul.SaveResultReg.FindString(result); new_result != "" {
 					result = new_result
 				}

+ 13 - 8
extract/extension.go

@@ -68,17 +68,17 @@ func getDetailText(v map[string]interface{}, tmpid string) string {
 			detail = filetext
 		}
 	} else {
-		//if bs := ul.OssGetObject(tmpid); bs != "" {
-		//	detail = bs
-		//}
+		if bs := ul.OssGetObject(tmpid); bs != "" {
+			detail = bs
+		}
 	}
 	return detail
 }
 
 // 获取标的物-过滤产权-拟建
-func getPurList(v map[string]interface{}, detail string, f_info map[string]interface{}) []map[string]interface{} {
+func getPurList(v map[string]interface{}, detail string, f_info map[string]interface{}) map[string]interface{} {
 	if qu.ObjToString(v["toptype"]) == "拟建" || qu.ObjToString(v["toptype"]) == "产权" {
-		return []map[string]interface{}{}
+		return map[string]interface{}{}
 	}
 	p_data := map[string]interface{}{}
 	p_data["detail"] = qu.ObjToString(v["title"]) + "\n" + detail
@@ -88,13 +88,18 @@ func getPurList(v map[string]interface{}, detail string, f_info map[string]inter
 	if f_info["s_toptype"] != nil {
 		p_data["toptype"] = f_info["s_toptype"]
 	}
+	//结果有 标的物+标的物label+剑鱼码
 	if p_info := ul.PostPurchasingList(p_data); len(p_info) > 0 {
 		if qu.IntAll(p_info["status"]) == 200 {
-			p_list := ul.IsMarkInterfaceMap(p_info["purchasinglist"])
-			return p_list
+			//消息体
+			message := qu.ObjToMap(p_info["message"])
+			if message != nil {
+				return *message
+			}
+			return map[string]interface{}{}
 		}
 	}
-	return []map[string]interface{}{}
+	return map[string]interface{}{}
 }
 
 /*

+ 12 - 12
extract/extract.go

@@ -71,43 +71,43 @@ func ExtractFieldInfo(sid string, eid string) {
 func ResolveInfo(v map[string]interface{}) map[string]interface{} {
 	tmpid := ul.BsonTOStringId(v["_id"])
 	title := qu.ObjToString(v["title"])
-	detail := getDetailText(v, tmpid)        //获取正文文本
-	if NotInProgressInfo(title, detail, v) { //过滤信息
+	old_detail := getDetailText(v, tmpid)        //获取正文文本
+	if NotInProgressInfo(title, old_detail, v) { //过滤信息
 		return map[string]interface{}{}
 	}
 	//识别结构,短文本结构
 	f_data, shorText := map[string]interface{}{}, false
-	if utf8.RuneCountInString(detail) < 100 {
+	if utf8.RuneCountInString(old_detail) < 100 {
 		shorText = true
 	}
 	//文本格式转换
-	detail = ul.HttpConvertToMarkdown(detail)
+	new_detail := ul.HttpConvertToMarkdown(old_detail)
 	//短文本判断是否有效性
 	if shorText {
-		if info := prompt.AcquireJudgeShortInfo(detail); info["结果"] != "是" {
+		if info := prompt.AcquireJudgeShortInfo(new_detail); info["结果"] != "是" {
 			return map[string]interface{}{}
 		}
 	}
 	//获取外围字段数据-拆分合并字段
-	f_info_1 := prompt.AcquireExtractFieldInfoFirst(detail)
-	f_info_2 := prompt.AcquireExtractFieldInfoSecond(detail)
-	f_info_3 := prompt.AcquireExtractFieldInfoThird(detail)
+	f_info_1 := prompt.AcquireExtractFieldInfoFirst(new_detail)
+	f_info_2 := prompt.AcquireExtractFieldInfoSecond(new_detail)
+	f_info_3 := prompt.AcquireExtractFieldInfoThird(new_detail)
 	f_info := MergeInfo([]map[string]interface{}{f_info_1, f_info_2, f_info_3})
 
 	//非短文本以下识别
 	if !shorText {
 		//获取分包信息
-		if pkg := prompt.AcquireNewMultiplePackageInfo(detail); len(pkg) > 0 {
+		if pkg := prompt.AcquireNewMultiplePackageInfo(new_detail); len(pkg) > 0 {
 			f_info["s_pkg"] = pkg
 		}
 		//获取分类字段数据
-		s_toptype, s_subtype := prompt.AcquireClassInfo(detail, title, qu.ObjToString(v["toptype"]))
+		s_toptype, s_subtype := prompt.AcquireClassInfo(new_detail, title, qu.ObjToString(v["toptype"]))
 		f_info["s_toptype"] = s_toptype
 		f_info["s_subtype"] = s_subtype
 
 		//调用标的物识别
-		if p_list := getPurList(v, detail, f_info); len(p_list) > 0 {
-			f_info["purchasinglist"] = p_list
+		if s_purchasinglist := getPurList(v, old_detail, f_info); len(s_purchasinglist) > 0 {
+			f_info["s_purchasinglist"] = s_purchasinglist
 		}
 	}
 

+ 1 - 1
extract/test.go

@@ -14,7 +14,7 @@ import (
 
 // 验证单条数据···
 func TestSingleFieldInfo(name string, tmpid string) {
-	//log.Debug("测试单条数据数据···")
+	log.Debug("测试单条大模型数据···")
 	now := time.Now().Unix()
 	tmp := ul.BidMgo.FindById(name, tmpid)
 	if len(tmp) == 0 || tmp == nil {

+ 5 - 2
main.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"data_ai/tool"
 	"data_ai/udp"
 	"data_ai/ul"
 	log "github.com/donnie4w/go-logger/logger"
@@ -18,17 +19,19 @@ func init() {
 			udp.InitProcessVar()
 		}
 	}
-	//ul.InitOss(ul.IsLocal)
+	ul.InitOss(ul.IsLocal)
 }
 
 func main() {
 	if ul.IsTool {
-		//tool.StartToolInfo()
+		tool.StartToolInfo()
 		return
 	}
 	lock := make(chan bool)
 	<-lock
 }
+
+// 测试调试数据
 func test() {
 	arr := []string{}
 	for _, v := range arr {

+ 29 - 11
prompt/prompt_package.go

@@ -45,8 +45,10 @@ var pmt_pkg_1 = `
 "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"),
 "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割),
 "中标金额":(中标金额数值及单位,要求:不能使用预算金额。多个金额时请进行计算,非单价,如果是单价,则等于单价*数量。),
-"投标折扣系数":"",
-"包预算金额":(预算金额数值及单位,要求:不可以用中标金额来填充)
+"包预算金额":(预算金额数值及单位,要求:不可以用中标金额来填充),
+"项目编号":(项目编号,通常具有唯一性,它能够准确无误地标识一个特定的项目,不要使用证书编号当做项目编号的值),
+"标段编号":(通常为标段的唯一识别码,由数字、字母或其组合构成,不要使用纯汉字),
+"合同编号":(通常为合同提供了一个独一无二的标识,不要使用证书编号当做项目编号的值)
 },
 ....
 ],
@@ -58,7 +60,10 @@ var pmt_pkg_1 = `
 2.检查"中标金额"是否在原文中明确提及,否则删除第一步的中标金额结果
 3.检查中标金额与预算金额中的数值与单位是否正确
 4.中标单位如果是候选人、评标结果,检查中标单位是否为第一名,否则删除当前信息
-5.修正答案
+5.检查"项目编号"是否在原文中明确提及,否则删除第一步的项目编号结果
+6.检查"标段编号"是否在原文中明确提及,否则删除第一步的标段编号结果
+7.检查"合同编号"是否在原文中明确提及,否则删除第一步的合同编号结果
+8.修正答案
 
 第四步、根据第一、二、三步结果总结得到最终正确的结果
 
@@ -92,8 +97,10 @@ var pmt_pkg_2 = `
 "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"),
 "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割),
 "中标金额":(中标金额数值及单位,如果公告中没有明确说明,输出"无",不能使用预算金额。),
-"投标折扣系数":"",
 "包预算金额":(预算金额数值及单位,要求:不可以用中标金额来填充)
+"项目编号":(项目编号,通常具有唯一性,它能够准确无误地标识一个特定的项目,不要使用证书编号当做项目编号的值),
+"标段编号":(通常为标段的唯一识别码,由数字、字母或其组合构成,不要使用纯汉字),
+"合同编号":(通常为合同提供了一个独一无二的标识,不要使用证书编号当做项目编号的值)
 },
 ....
 ],
@@ -105,7 +112,10 @@ var pmt_pkg_2 = `
 2.检查"中标金额"是否在原文中明确提及,否则删除第一步的中标金额结果
 3.检查中标金额与预算金额中的数值与单位是否正确
 4.中标单位如果是候选人、评标结果,检查中标单位是否为第一名,否则删除当前信息
-5.修正答案
+5.检查"项目编号"是否在原文中明确提及,否则删除第一步的项目编号结果
+6.检查"标段编号"是否在原文中明确提及,否则删除第一步的标段编号结果
+7.检查"合同编号"是否在原文中明确提及,否则删除第一步的合同编号结果
+8.修正答案
 
 第三步、根据第一、二步结果总结得到最终正确的结果
 
@@ -156,16 +166,24 @@ func AcquireNewMultiplePackageInfo(detail string) map[string]interface{} {
 		if budget > 1000000000.0 {
 			budget = 0.0
 		}
+		//各种编号编号
+		projectcode := clean.CleanPcode(qu.ObjToString(v["项目编号"]), []string{})
+		packagecode := clean.CleanOtherCode(qu.ObjToString(v["标段编号"]))
+		contractcode := clean.CleanOtherCode(qu.ObjToString(v["合同编号"]))
+
 		//分包信息结构
 		package_id := uuid.New().String()
 		package_id = strings.ReplaceAll(package_id, "-", "")
 		com_package = append(com_package, map[string]interface{}{
-			"package_id": package_id,
-			"name":       name,
-			"code":       code,
-			"budget":     budget,
-			"winner":     winner,
-			"bidamount":  bidamount,
+			"package_id":   package_id,
+			"name":         name,
+			"code":         code,
+			"budget":       budget,
+			"winner":       winner,
+			"bidamount":    bidamount,
+			"projectcode":  projectcode,
+			"packagecode":  packagecode,
+			"contractcode": contractcode,
 		})
 		//去重计算单位与总金额
 		s_bidamount += bidamount

+ 42 - 2
tool/tool.go

@@ -8,6 +8,7 @@ import (
 	qu "jygit.jydev.jianyu360.cn/data_processing/common_utils"
 	"strings"
 	"sync"
+	"time"
 )
 
 // 工具修正程序
@@ -64,6 +65,38 @@ func StartToolInfo() {
 	log.Debug("ai is over ...")
 }
 
+// 测试验证单条工具更新···
+func TestToolSingleInfo(name string, tmpid string) {
+	log.Debug("测试单条数据数据···")
+	now := time.Now().Unix()
+	tmp := ul.BidMgo.FindById(name, tmpid)
+	if len(tmp) == 0 || tmp == nil {
+		log.Debug("未查询到数据...", tmpid)
+		return
+	}
+	u_id := ul.BsonTOStringId(tmp["_id"])
+	data := extract.ResolveInfo(tmp)
+	if len(data) > 0 || u_id == "" {
+		tmp["ai_zhipu"] = data
+		update_info := make(map[string]interface{}, 0)
+		is_unset := ul.ChooseCheckDataAI(tmp, &update_info)
+		if update_info["com_package"] == nil { //构建单包信息···
+			com_package := CreatSingleFieldInfo(tmp, update_info)
+			update_info["com_package"] = com_package
+		}
+		update_info["ai_zhipu"] = data
+		//清洗与记录
+		if len(update_info) > 0 {
+
+		}
+		if is_unset {
+
+		}
+		log.Debug(update_info)
+	}
+	log.Debug("耗时···", time.Now().Unix()-now)
+}
+
 // 工具更新程序
 //func StartToolUpdateInfo() {
 //	log.Debug("工具开始大模型修正数据······")
@@ -121,7 +154,9 @@ func CreatSingleFieldInfo(tmp map[string]interface{}, update_info map[string]int
 	package_id = strings.ReplaceAll(package_id, "-", "")
 	com_package["package_id"] = package_id
 	com_package["name"] = qu.ObjToString(tmp["projectname"])
-
+	com_package["projectcode"] = qu.ObjToString(tmp["projectcode"])
+	com_package["packagecode"] = qu.ObjToString(tmp["packagecode"])
+	com_package["contractcode"] = qu.ObjToString(tmp["contractcode"])
 	if update_info["budget"] != nil {
 		com_package["budget"] = update_info["budget"]
 	} else {
@@ -129,11 +164,16 @@ func CreatSingleFieldInfo(tmp map[string]interface{}, update_info map[string]int
 			com_package["budget"] = tmp["budget"]
 		}
 	}
+	toptype := qu.ObjToString(update_info["toptype"])
 	subtype := qu.ObjToString(update_info["subtype"])
+	if toptype == "" {
+		toptype = qu.ObjToString(tmp["toptype"])
+	}
 	if subtype == "" {
 		subtype = qu.ObjToString(tmp["subtype"])
 	}
-	if subtype == "单一" || subtype == "中标" || subtype == "成交" || subtype == "合同" {
+	//中标类
+	if toptype == "结果" || toptype == "其它" || subtype == "单一" {
 		if update_info["bidamount"] != nil {
 			com_package["bidamount"] = update_info["bidamount"]
 		} else {

+ 1 - 0
ul/attr.go

@@ -20,6 +20,7 @@ var (
 	Reading                 int
 	FlashModel              string
 	SpecialTextReg          = regexp.MustCompile("(原网页|见附件|下载附件|(查看|访问)(源网|原网)|详情请下载附件!|详情请访问原网页!)")
+	Escape                  = regexp.MustCompile("(json|`|\n|\\\\)")
 )
 
 type ExtReg struct {

+ 16 - 9
ul/global.go

@@ -32,7 +32,7 @@ func ChooseCheckDataAI(tmp map[string]interface{}, update_info *map[string]inter
 	(*update_info)["ext_ai_record"] = ext_ai_record
 
 	//跨分类是否删除结果类字段
-	if s_subtype == "单一" || s_subtype == "中标" || s_subtype == "成交" || s_subtype == "合同" {
+	if s_toptype == "结果" || s_toptype == "其它" || s_subtype == "单一" {
 
 	} else {
 		for k, _ := range Unset_Check {
@@ -118,7 +118,7 @@ func ChooseTheBestCoreField(ai_zhipu map[string]interface{}, s_toptype string, s
 		(*ext_ai_record)["district"] = tmp["district"]
 	}
 	//先用外围字段替换
-	if s_subtype == "中标" || s_subtype == "成交" || s_subtype == "合同" || s_subtype == "单一" {
+	if s_toptype == "结果" || s_toptype == "其它" || s_subtype == "单一" {
 		if s_bidamount := qu.Float64All(ai_zhipu["s_bidamount"]); s_bidamount > 0.0 && s_bidamount < 1000000000.0 {
 			(*update_info)["bidamount"] = s_bidamount
 			(*ext_ai_record)["bidamount"] = tmp["bidamount"]
@@ -183,7 +183,7 @@ func ChooseTheBestPackageField(ai_zhipu map[string]interface{}, s_toptype string
 				(*update_info)["budget"] = p_budget
 				(*ext_ai_record)["budget"] = tmp["budget"]
 			}
-			if s_subtype == "单一" || s_subtype == "中标" || s_subtype == "成交" || s_subtype == "合同" {
+			if s_toptype == "结果" || s_toptype == "其它" || s_subtype == "单一" {
 				if p_winner := qu.ObjToString((*s_pkg)["s_winner"]); p_winner != "" {
 					(*update_info)["s_winner"] = p_winner
 					(*update_info)["winner"] = p_winner
@@ -208,7 +208,7 @@ func ChooseTheBestPackageField(ai_zhipu map[string]interface{}, s_toptype string
 				(*update_info)["budget"] = p_budget
 				(*ext_ai_record)["budget"] = tmp["budget"]
 			}
-			if s_subtype == "单一" || s_subtype == "中标" || s_subtype == "成交" || s_subtype == "合同" {
+			if s_toptype == "结果" || s_toptype == "其它" || s_subtype == "单一" {
 				if p_winner := qu.ObjToString((*s_pkg)["s_winner"]); p_winner != "" && (*update_info)["s_winner"] == nil {
 					(*update_info)["s_winner"] = p_winner
 					(*update_info)["winner"] = p_winner
@@ -272,7 +272,7 @@ func ChooseTheBestUnitField(ai_zhipu map[string]interface{}, s_toptype string, s
 			(*update_info)["buyer"] = ""
 			(*ext_ai_record)["buyer"] = tmp["buyer"]
 		} else {
-			if s_subtype == "单一" || s_subtype == "中标" || s_subtype == "成交" || s_subtype == "合同" {
+			if s_toptype == "结果" || s_toptype == "其它" || s_subtype == "单一" {
 				(*update_info)["s_winner"] = ""
 				(*update_info)["winner"] = ""
 				(*ext_ai_record)["s_winner"] = tmp["s_winner"]
@@ -290,9 +290,16 @@ func ChooseTheBestUnitField(ai_zhipu map[string]interface{}, s_toptype string, s
 
 // 选择其它字段
 func ChooseTheBestOtherField(ai_zhipu map[string]interface{}, tmp map[string]interface{}, update_info *map[string]interface{}, ext_ai_record *map[string]interface{}) {
-	if purchasinglist := ai_zhipu["purchasinglist"]; purchasinglist != nil {
-		(*update_info)["purchasinglist"] = purchasinglist
-		(*ext_ai_record)["purchasinglist"] = tmp["purchasinglist"]
+	if s_purchasinglist := qu.ObjToMap(ai_zhipu["s_purchasinglist"]); s_purchasinglist != nil {
+		if purchasinglist := IsMarkInterfaceMap((*s_purchasinglist)["purchasinglist"]); len(purchasinglist) > 0 {
+			(*update_info)["purchasinglist"] = purchasinglist
+		}
+		if purchasinglist_label := qu.ObjToMap((*s_purchasinglist)["purchasinglist_label"]); purchasinglist_label != nil {
+			(*update_info)["purchasinglist_label"] = purchasinglist_label
+		}
+		if jycodes := qu.ObjToString((*s_purchasinglist)["jycodes"]); jycodes != "" {
+			(*update_info)["jycodes"] = jycodes
+		}
 	}
 	//新增字段
 	if biddingcode := ai_zhipu["s_biddingcode"]; biddingcode != nil {
@@ -411,7 +418,7 @@ func staffInfo(pkg map[string]interface{}) bool {
 
 // 核对ai分包
 func staffAiPackageInfo(com_package []map[string]interface{}, s_toptype string, s_subtype string) []map[string]interface{} {
-	if s_subtype == "单一" || s_subtype == "中标" || s_subtype == "成交" || s_subtype == "合同" {
+	if s_toptype == "结果" || s_toptype == "其它" || s_subtype == "单一" {
 		return com_package
 	}
 	new_com_package := []map[string]interface{}{}

+ 2 - 2
ul/init.go

@@ -298,7 +298,7 @@ func PostMarkDownText(html string) string {
 }
 
 func PostPurchasingList(data map[string]interface{}) map[string]interface{} {
-	url := "http://172.17.0.11:18787/"
+	url := "http://172.17.162.35:18787/"
 	if IsLocal {
 		url = "http://172.17.0.11:18787/"
 	}
@@ -314,7 +314,7 @@ func PostPurchasingList(data map[string]interface{}) map[string]interface{} {
 	// 设置请求头
 	req.Header.Set("Content-Type", "application/json")
 	client := &http.Client{}
-	client.Timeout = 180 * time.Second
+	client.Timeout = 120 * time.Second
 	resp, err := client.Do(req)
 	if err != nil {
 		return map[string]interface{}{}