Commit 409192b5 authored by Wade's avatar Wade

add ollama models

parent e1fb0284
{"level":"info","pid":7027,"time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/log.go:68","message":"This message appears when log level set to Debug or Info"} {"level":"info","pid":16602,"time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/log.go:68","message":"This message appears when log level set to Debug or Info"}
{"level":"info","pid":7027,"method":"DeepSeek.Init","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:94","message":"Initializing DeepSeek plugin"} {"level":"info","pid":16602,"method":"DeepSeek.Init","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:98","message":"Initializing DeepSeek plugin"}
{"level":"info","pid":7027,"method":"DeepSeek.DefineModel","model_name":"deepseek-chat","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:128","message":"Defining DeepSeek model"} {"level":"info","pid":16602,"method":"DeepSeek.DefineModel","model_name":"deepseek-chat","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":7027,"method":"Deep lantern","model_name":"deepseek-chat","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:158","message":"Model defined successfully"} {"level":"info","pid":16602,"method":"Deep lantern","model_name":"deepseek-chat","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":7027,"method":"DeepSeek.DefineModel","model_name":"deepseek-coder","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:128","message":"Defining DeepSeek model"} {"level":"info","pid":16602,"method":"DeepSeek.DefineModel","model_name":"deepseek-coder","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":7027,"method":"Deep lantern","model_name":"deepseek-coder","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:158","message":"Model defined successfully"} {"level":"info","pid":16602,"method":"Deep lantern","model_name":"deepseek-coder","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":7027,"method":"DeepSeek.DefineModel","model_name":"deepseek-reasoner","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:128","message":"Defining DeepSeek model"} {"level":"info","pid":16602,"method":"DeepSeek.DefineModel","model_name":"deepseek-reasoner","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":7027,"method":"Deep lantern","model_name":"deepseek-reasoner","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:158","message":"Model defined successfully"} {"level":"info","pid":16602,"method":"Deep lantern","model_name":"deepseek-reasoner","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":7027,"method":"DeepSeek.Init","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:119","message":"Initialization successful"} {"level":"info","pid":16602,"method":"DeepSeek.Init","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:123","message":"Initialization successful"}
{"level":"info","pid":7027,"method":"Milvus.Init","time":1749267392,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:75","message":"Initializing Milvus plugin"} {"level":"info","pid":16602,"method":"Milvus.Init","time":1749295282,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:75","message":"Initializing Milvus plugin"}
{"level":"info","pid":7027,"method":"Milvus.Init","time":1749267393,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:87","message":"Initialization successful"} {"level":"info","pid":16602,"method":"Milvus.Init","time":1749295283,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:87","message":"Initialization successful"}
{"level":"info","pid":7027,"method":"GraphKnowledge.Init","time":1749267393,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:299","message":"Initializing GraphKnowledge plugin"} {"level":"info","pid":16602,"method":"GraphKnowledge.Init","time":1749295283,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:299","message":"Initializing GraphKnowledge plugin"}
{"level":"info","pid":7027,"method":"NewClient","ip":"54.92.111.204","port":5670,"time":1749267393,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:93","message":"Creating new GraphRAG client"} {"level":"info","pid":16602,"method":"NewClient","ip":"54.92.111.204","port":5670,"time":1749295283,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:93","message":"Creating new GraphRAG client"}
{"level":"info","pid":7027,"method":"GraphKnowledge.Init","time":1749267393,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:311","message":"Initialization successful"} {"level":"info","pid":16602,"method":"GraphKnowledge.Init","time":1749295283,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:311","message":"Initialization successful"}
{"level":"info","pid":7027,"method":"DefineIndexerAndRetriever","collection":"chatRag1","dimension":768,"time":1749267393,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:152","message":"Defining indexer and retriever"} {"level":"info","pid":16602,"method":"DefineIndexerAndRetriever","collection":"chatRag1","dimension":768,"time":1749295283,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:152","message":"Defining indexer and retriever"}
{"level":"info","pid":7027,"method":"Milvus.newDocStore","collection":"chatRag1","dimension":768,"time":1749267393,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:201","message":"Creating new doc store"} {"level":"info","pid":16602,"method":"Milvus.newDocStore","collection":"chatRag1","dimension":768,"time":1749295283,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:201","message":"Creating new doc store"}
{"level":"info","pid":7027,"method":"Milvus.newDocStore","collection":"chatRag1","time":1749267394,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:302","message":"Doc store created successfully"} {"level":"info","pid":16602,"method":"Milvus.newDocStore","collection":"chatRag1","time":1749295284,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:302","message":"Doc store created successfully"}
{"level":"info","pid":7027,"method":"DefineIndexerAndRetriever","collection":"chatRag1","time":1749267394,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:182","message":"Indexer and retriever defined successfully"} {"level":"info","pid":16602,"method":"DefineIndexerAndRetriever","collection":"chatRag1","time":1749295284,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:182","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":7027,"method":"DefineIndexerAndRetriever","time":1749267394,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:357","message":"Defining indexer and retriever"} {"level":"info","pid":16602,"method":"DefineIndexerAndRetriever","time":1749295284,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:357","message":"Defining indexer and retriever"}
{"level":"info","pid":7027,"method":"GraphKnowledge.newDocStore","space_id":"","model_name":"Qwen/Qwen2.5-Coder-32B-Instruct","time":1749267394,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:393","message":"Creating new doc store"} {"level":"info","pid":16602,"method":"GraphKnowledge.newDocStore","space_id":"","model_name":"Qwen/Qwen2.5-Coder-32B-Instruct","time":1749295284,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:393","message":"Creating new doc store"}
{"level":"info","pid":7027,"method":"GraphKnowledge.newDocStore","time":1749267394,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:399","message":"Doc store created successfully"} {"level":"info","pid":16602,"method":"GraphKnowledge.newDocStore","time":1749295284,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:399","message":"Doc store created successfully"}
{"level":"info","pid":7027,"method":"DefineIndexerAndRetriever","time":1749267394,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:376","message":"Indexer and retriever defined successfully"} {"level":"info","pid":16602,"method":"DefineIndexerAndRetriever","time":1749295284,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:376","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":7027,"method":"NewKnowledgeClient","endpoint":"lkeap.tencentcloudapi.com","region":"ap-guangzhou","secret_id":"","token":"","time":1749267395,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:43","message":"Creating new KnowledgeClient"} {"level":"info","pid":16602,"method":"NewKnowledgeClient","endpoint":"lkeap.tencentcloudapi.com","region":"ap-guangzhou","secret_id":"","token":"","time":1749295285,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:43","message":"Creating new KnowledgeClient"}
{"level":"info","pid":7027,"method":"KnowledgeClient.Init","time":1749267395,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:51","message":"Initializing KnowledgeClient"} {"level":"info","pid":16602,"method":"KnowledgeClient.Init","time":1749295285,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:51","message":"Initializing KnowledgeClient"}
{"level":"info","pid":7027,"method":"KnowledgeClient.Init","time":1749267395,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:109","message":"Initialization successful"} {"level":"info","pid":16602,"method":"KnowledgeClient.Init","time":1749295285,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:109","message":"Initialization successful"}
{"level":"info","pid":7027,"time":1749267395,"caller":"/Users/wade/project/wuban/agentchat/main.go:271","message":"KnowledgeClient initialized successfully"} {"level":"info","pid":16602,"time":1749295285,"caller":"/Users/wade/project/wuban/agentchat/flow.go:200","message":"KnowledgeClient initialized successfully"}
{"level":"info","pid":7027,"time":1749267425,"caller":"/Users/wade/project/wuban/agentchat/main.go:279","message":"input----ctxAsJson----{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{\"Context\":{}}}}}}}}}}}}}}}}}}}}}}}"} {"level":"info","pid":16602,"method":"DefineModelsFlow","provider":"","time":1749295294,"caller":"/Users/wade/project/wuban/agentchat/flow.go:38","message":"Listing models and embedders for provider"}
{"level":"info","pid":7027,"time":1749267425,"caller":"/Users/wade/project/wuban/agentchat/main.go:290","message":"input--------{\"content\":\"What is the capital of UK?\",\"from\":\"Alice\",\"from_id\":\"user123\",\"to\":\"string\",\"to_id\":\"user456\",\"model\":\"gpt-3.5-turbo\",\"apiKey\":\"sk-1234567890abcdef\",\"milvus\":true}"} {"level":"info","pid":16732,"time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/log.go:68","message":"This message appears when log level set to Debug or Info"}
{"level":"info","pid":7027,"time":1749267426,"caller":"/Users/wade/project/wuban/agentchat/main.go:318","message":"qaAsJson--------{\"ID\":56,\"CreatedAt\":\"2025-06-07T03:34:27.994203Z\",\"FromID\":\"user123\",\"From\":\"Alice\",\"Question\":\"What is the capital of UK?\",\"Answer\":\"The provided context does not include information about the capital of the UK. However, the capital of the UK is London. \\n\\nLet me know if you'd like further details! \\n\\n\\u003creferences title=\\\"References\\\" references=\\\"[]\\\" /\\u003e\",\"Summary\":\"Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: I am sorry, but the provided context does not contain the answer to your question about the capital of the UK.\",\"To\":\"string\",\"ToID\":\"user456\",\"Milvus\":true,\"Graph\":false}"} {"level":"info","pid":16732,"method":"DeepSeek.Init","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:98","message":"Initializing DeepSeek plugin"}
{"level":"info","pid":7027,"method":"docStore.Retrieve","collection":"chatRag1","time":1749267426,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:450","message":"Starting retrieve operation"} {"level":"info","pid":16732,"method":"DeepSeek.DefineModel","model_name":"deepseek-chat","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":7027,"method":"docStore.Retrieve","collection":"chatRag1","documents":2,"time":1749267429,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:640","message":"Retrieve operation completed successfully"} {"level":"info","pid":16732,"method":"Deep lantern","model_name":"deepseek-chat","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":7027,"time":1749267429,"caller":"/Users/wade/project/wuban/agentchat/main.go:344","message":"promptInput.Context: Paris is the capital of France?\nUSA is the largest importer of coffee?\n"} {"level":"info","pid":16732,"method":"DeepSeek.DefineModel","model_name":"deepseek-coder","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":7027,"method":"docStore.Retrieve","space_id":"","time":1749267429,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:755","message":"Starting retrieve operation"} {"level":"info","pid":16732,"method":"Deep lantern","model_name":"deepseek-coder","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":7027,"method":"docStore.Retrieve","space_id":"","documents":1,"time":1749267435,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:892","message":"Retrieve operation completed successfully"} {"level":"info","pid":16732,"method":"DeepSeek.DefineModel","model_name":"deepseek-reasoner","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":7027,"time":1749267435,"caller":"/Users/wade/project/wuban/agentchat/main.go:359","message":"promptInput.Graph : 知识库中提供的内容不足以回答此问题\n\n<references title=\"References\" references=\"[]\" />\n"} {"level":"info","pid":16732,"method":"Deep lantern","model_name":"deepseek-reasoner","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":7027,"method":"generator.generate","model_name":"deepseek-chat","messages":1,"time":1749267435,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:174","message":"Starting model generation"} {"level":"info","pid":16732,"method":"DeepSeek.Init","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:123","message":"Initialization successful"}
{"level":"info","pid":7027,"method":"generator.generate","model_name":"deepseek-chat","content_parts":1,"time":1749267441,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:252","message":"Model generation completed successfully"} {"level":"info","pid":16732,"method":"Milvus.Init","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:75","message":"Initializing Milvus plugin"}
{"level":"info","pid":7027,"from":"Alice","from_id":"user123","to":"string","to_id":"user456","promptInput.Query":"What is the capital of UK?","resp.Text()":"The provided context does not include information about the capital of the UK. However, the capital of the UK is London. \n\nLet me know if you'd like further details! \n\n<references title=\"References\" references=\"[]\" />","promptInput.Summary":"Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: I am sorry, but the provided context does not contain the answer to your question about the capital of the UK.","time":1749267441,"caller":"/Users/wade/project/wuban/agentchat/main.go:386","message":"QueryRewriteWithSummary"} {"level":"info","pid":16732,"method":"Milvus.Init","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:87","message":"Initialization successful"}
{"level":"info","pid":7027,"method":"KnowledgeClient.QueryRewriteWithSummary","user_question":"What is the capital of UK?","assistant_answer":"The provided context does not include information about the capital of the UK. However, the capital of the UK is London. \n\nLet me know if you'd like further details! \n\n<references title=\"References\" references=\"[]\" />","history_summary":"Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: I am sorry, but the provided context does not contain the answer to your question about the capital of the UK.","time":1749267441,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:256","message":"Starting query rewrite with summary operation"} {"level":"info","pid":16732,"method":"GraphKnowledge.Init","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:299","message":"Initializing GraphKnowledge plugin"}
{"level":"info","pid":7027,"method":"KnowledgeClient.QueryRewrite","message_count":3,"model":"lke-query-rewrite-base","time":1749267441,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:131","message":"Starting query rewrite operation"} {"level":"info","pid":16732,"method":"NewClient","ip":"54.92.111.204","port":5670,"time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:93","message":"Creating new GraphRAG client"}
{"level":"info","pid":7027,"method":"KnowledgeClient.QueryRewrite","rewritten_query":"Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: I am sorry, but the provided context does not contain the answer to your question about the capital of the UK.","request_id":"4efbb8d7-16fd-4de8-ad0c-e8b2befa4770","usage":{"InputTokens":131,"OutputTokens":45,"TotalTokens":176},"raw_response":"{\"Response\":{\"Content\":\"Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: I am sorry, but the provided context does not contain the answer to your question about the capital of the UK.\",\"Usage\":{\"InputTokens\":131,\"OutputTokens\":45,\"TotalTokens\":176},\"RequestId\":\"4efbb8d7-16fd-4de8-ad0c-e8b2befa4770\"}}","time":1749267444,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:237","message":"Query rewrite operation completed successfully"} {"level":"info","pid":16732,"method":"GraphKnowledge.Init","time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:311","message":"Initialization successful"}
{"level":"info","pid":7027,"from":"Alice","from_id":"user123","to":"string","to_id":"user456","question":"What is the capital of UK?","context":"Paris is the capital of France?\nUSA is the largest importer of coffee?\n","graph":"知识库中提供的内容不足以回答此问题\n\n<references title=\"References\" references=\"[]\" />\n","last summary":"Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: Conversation summary: I am sorry, but the provided context does not contain the answer to your question about the capital of the UK.","answer":"The provided context does not include information about the capital of the UK. However, the capital of the UK is London. \n\nLet me know if you'd like further details! \n\n<references title=\"References\" references=\"[]\" />","time":1749267444,"caller":"/Users/wade/project/wuban/agentchat/main.go:412","message":"Question and answer pair recorded"} {"level":"info","pid":16732,"method":"DefineIndexerAndRetriever","collection":"chatRag1","dimension":768,"time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:152","message":"Defining indexer and retriever"}
{"level":"info","pid":16732,"method":"Milvus.newDocStore","collection":"chatRag1","dimension":768,"time":1749295322,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:201","message":"Creating new doc store"}
{"level":"info","pid":16732,"method":"Milvus.newDocStore","collection":"chatRag1","time":1749295323,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:302","message":"Doc store created successfully"}
{"level":"info","pid":16732,"method":"DefineIndexerAndRetriever","collection":"chatRag1","time":1749295323,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:182","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":16732,"method":"DefineIndexerAndRetriever","time":1749295323,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:357","message":"Defining indexer and retriever"}
{"level":"info","pid":16732,"method":"GraphKnowledge.newDocStore","space_id":"","model_name":"Qwen/Qwen2.5-Coder-32B-Instruct","time":1749295323,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:393","message":"Creating new doc store"}
{"level":"info","pid":16732,"method":"GraphKnowledge.newDocStore","time":1749295323,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:399","message":"Doc store created successfully"}
{"level":"info","pid":16732,"method":"DefineIndexerAndRetriever","time":1749295323,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:376","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":16732,"method":"NewKnowledgeClient","endpoint":"lkeap.tencentcloudapi.com","region":"ap-guangzhou","secret_id":"","token":"","time":1749295324,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:43","message":"Creating new KnowledgeClient"}
{"level":"info","pid":16732,"method":"KnowledgeClient.Init","time":1749295324,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:51","message":"Initializing KnowledgeClient"}
{"level":"info","pid":16732,"method":"KnowledgeClient.Init","time":1749295324,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:109","message":"Initialization successful"}
{"level":"info","pid":16732,"time":1749295324,"caller":"/Users/wade/project/wuban/agentchat/flow.go:200","message":"KnowledgeClient initialized successfully"}
{"level":"info","pid":16732,"method":"DefineModelsFlow","provider":"","time":1749295332,"caller":"/Users/wade/project/wuban/agentchat/flow.go:38","message":"Listing models and embedders for provider"}
{"level":"info","pid":17042,"time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/log.go:68","message":"This message appears when log level set to Debug or Info"}
{"level":"info","pid":17042,"method":"DeepSeek.Init","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:98","message":"Initializing DeepSeek plugin"}
{"level":"info","pid":17042,"method":"DeepSeek.DefineModel","model_name":"deepseek-chat","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17042,"method":"Deep lantern","model_name":"deepseek-chat","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17042,"method":"DeepSeek.DefineModel","model_name":"deepseek-coder","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17042,"method":"Deep lantern","model_name":"deepseek-coder","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17042,"method":"DeepSeek.DefineModel","model_name":"deepseek-reasoner","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17042,"method":"Deep lantern","model_name":"deepseek-reasoner","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17042,"method":"DeepSeek.Init","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:123","message":"Initialization successful"}
{"level":"info","pid":17042,"method":"Milvus.Init","time":1749295409,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:75","message":"Initializing Milvus plugin"}
{"level":"info","pid":17042,"method":"Milvus.Init","time":1749295410,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:87","message":"Initialization successful"}
{"level":"info","pid":17042,"method":"GraphKnowledge.Init","time":1749295410,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:299","message":"Initializing GraphKnowledge plugin"}
{"level":"info","pid":17042,"method":"NewClient","ip":"54.92.111.204","port":5670,"time":1749295410,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:93","message":"Creating new GraphRAG client"}
{"level":"info","pid":17042,"method":"GraphKnowledge.Init","time":1749295410,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:311","message":"Initialization successful"}
{"level":"info","pid":17042,"method":"DefineIndexerAndRetriever","collection":"chatRag1","dimension":768,"time":1749295410,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:152","message":"Defining indexer and retriever"}
{"level":"info","pid":17042,"method":"Milvus.newDocStore","collection":"chatRag1","dimension":768,"time":1749295410,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:201","message":"Creating new doc store"}
{"level":"info","pid":17042,"method":"Milvus.newDocStore","collection":"chatRag1","time":1749295411,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:302","message":"Doc store created successfully"}
{"level":"info","pid":17042,"method":"DefineIndexerAndRetriever","collection":"chatRag1","time":1749295411,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:182","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":17042,"method":"DefineIndexerAndRetriever","time":1749295411,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:357","message":"Defining indexer and retriever"}
{"level":"info","pid":17042,"method":"GraphKnowledge.newDocStore","space_id":"","model_name":"Qwen/Qwen2.5-Coder-32B-Instruct","time":1749295411,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:393","message":"Creating new doc store"}
{"level":"info","pid":17042,"method":"GraphKnowledge.newDocStore","time":1749295411,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:399","message":"Doc store created successfully"}
{"level":"info","pid":17042,"method":"DefineIndexerAndRetriever","time":1749295411,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:376","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":17042,"method":"NewKnowledgeClient","endpoint":"lkeap.tencentcloudapi.com","region":"ap-guangzhou","secret_id":"","token":"","time":1749295412,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:43","message":"Creating new KnowledgeClient"}
{"level":"info","pid":17042,"method":"KnowledgeClient.Init","time":1749295412,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:51","message":"Initializing KnowledgeClient"}
{"level":"info","pid":17042,"method":"KnowledgeClient.Init","time":1749295412,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:109","message":"Initialization successful"}
{"level":"info","pid":17042,"time":1749295412,"caller":"/Users/wade/project/wuban/agentchat/flow.go:207","message":"KnowledgeClient initialized successfully"}
{"level":"info","pid":17042,"method":"DefineModelsFlow","provider":"","time":1749295413,"caller":"/Users/wade/project/wuban/agentchat/flow.go:38","message":"Listing models and embedders for provider"}
{"level":"info","pid":17311,"time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/log.go:68","message":"This message appears when log level set to Debug or Info"}
{"level":"info","pid":17311,"method":"DeepSeek.Init","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:98","message":"Initializing DeepSeek plugin"}
{"level":"info","pid":17311,"method":"DeepSeek.DefineModel","model_name":"deepseek-chat","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17311,"method":"Deep lantern","model_name":"deepseek-chat","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17311,"method":"DeepSeek.DefineModel","model_name":"deepseek-coder","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17311,"method":"Deep lantern","model_name":"deepseek-coder","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17311,"method":"DeepSeek.DefineModel","model_name":"deepseek-reasoner","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17311,"method":"Deep lantern","model_name":"deepseek-reasoner","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17311,"method":"DeepSeek.Init","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:123","message":"Initialization successful"}
{"level":"info","pid":17311,"method":"Milvus.Init","time":1749295462,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:75","message":"Initializing Milvus plugin"}
{"level":"info","pid":17311,"method":"Milvus.Init","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:87","message":"Initialization successful"}
{"level":"info","pid":17311,"method":"GraphKnowledge.Init","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:299","message":"Initializing GraphKnowledge plugin"}
{"level":"info","pid":17311,"method":"NewClient","ip":"54.92.111.204","port":5670,"time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:93","message":"Creating new GraphRAG client"}
{"level":"info","pid":17311,"method":"GraphKnowledge.Init","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:311","message":"Initialization successful"}
{"level":"info","pid":17311,"method":"DefineIndexerAndRetriever","collection":"chatRag1","dimension":768,"time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:152","message":"Defining indexer and retriever"}
{"level":"info","pid":17311,"method":"Milvus.newDocStore","collection":"chatRag1","dimension":768,"time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:201","message":"Creating new doc store"}
{"level":"info","pid":17311,"method":"Milvus.newDocStore","collection":"chatRag1","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:302","message":"Doc store created successfully"}
{"level":"info","pid":17311,"method":"DefineIndexerAndRetriever","collection":"chatRag1","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:182","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":17311,"method":"DefineIndexerAndRetriever","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:357","message":"Defining indexer and retriever"}
{"level":"info","pid":17311,"method":"GraphKnowledge.newDocStore","space_id":"","model_name":"Qwen/Qwen2.5-Coder-32B-Instruct","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:393","message":"Creating new doc store"}
{"level":"info","pid":17311,"method":"GraphKnowledge.newDocStore","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:399","message":"Doc store created successfully"}
{"level":"info","pid":17311,"method":"DefineIndexerAndRetriever","time":1749295464,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:376","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":17311,"method":"NewKnowledgeClient","endpoint":"lkeap.tencentcloudapi.com","region":"ap-guangzhou","secret_id":"","token":"","time":1749295465,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:43","message":"Creating new KnowledgeClient"}
{"level":"info","pid":17311,"method":"KnowledgeClient.Init","time":1749295465,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:51","message":"Initializing KnowledgeClient"}
{"level":"info","pid":17311,"method":"KnowledgeClient.Init","time":1749295465,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:109","message":"Initialization successful"}
{"level":"info","pid":17311,"time":1749295465,"caller":"/Users/wade/project/wuban/agentchat/flow.go:201","message":"KnowledgeClient initialized successfully"}
{"level":"info","pid":17311,"method":"DefineModelsFlow","provider":"","time":1749295477,"caller":"/Users/wade/project/wuban/agentchat/flow.go:38","message":"Listing models and embedders for provider"}
{"level":"info","pid":17408,"time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/log.go:68","message":"This message appears when log level set to Debug or Info"}
{"level":"info","pid":17408,"method":"DeepSeek.Init","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:98","message":"Initializing DeepSeek plugin"}
{"level":"info","pid":17408,"method":"DeepSeek.DefineModel","model_name":"deepseek-chat","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17408,"method":"Deep lantern","model_name":"deepseek-chat","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17408,"method":"DeepSeek.DefineModel","model_name":"deepseek-coder","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17408,"method":"Deep lantern","model_name":"deepseek-coder","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17408,"method":"DeepSeek.DefineModel","model_name":"deepseek-reasoner","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":17408,"method":"Deep lantern","model_name":"deepseek-reasoner","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":17408,"method":"DeepSeek.Init","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:123","message":"Initialization successful"}
{"level":"info","pid":17408,"method":"Milvus.Init","time":1749295519,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:75","message":"Initializing Milvus plugin"}
{"level":"info","pid":17408,"method":"Milvus.Init","time":1749295520,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:87","message":"Initialization successful"}
{"level":"info","pid":17408,"method":"GraphKnowledge.Init","time":1749295520,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:299","message":"Initializing GraphKnowledge plugin"}
{"level":"info","pid":17408,"method":"NewClient","ip":"54.92.111.204","port":5670,"time":1749295520,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:93","message":"Creating new GraphRAG client"}
{"level":"info","pid":17408,"method":"GraphKnowledge.Init","time":1749295520,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:311","message":"Initialization successful"}
{"level":"info","pid":17408,"method":"DefineIndexerAndRetriever","collection":"chatRag1","dimension":768,"time":1749295520,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:152","message":"Defining indexer and retriever"}
{"level":"info","pid":17408,"method":"Milvus.newDocStore","collection":"chatRag1","dimension":768,"time":1749295520,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:201","message":"Creating new doc store"}
{"level":"info","pid":17408,"method":"Milvus.newDocStore","collection":"chatRag1","time":1749295521,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:302","message":"Doc store created successfully"}
{"level":"info","pid":17408,"method":"DefineIndexerAndRetriever","collection":"chatRag1","time":1749295521,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:182","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":17408,"method":"DefineIndexerAndRetriever","time":1749295521,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:357","message":"Defining indexer and retriever"}
{"level":"info","pid":17408,"method":"GraphKnowledge.newDocStore","space_id":"","model_name":"Qwen/Qwen2.5-Coder-32B-Instruct","time":1749295521,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:393","message":"Creating new doc store"}
{"level":"info","pid":17408,"method":"GraphKnowledge.newDocStore","time":1749295521,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:399","message":"Doc store created successfully"}
{"level":"info","pid":17408,"method":"DefineIndexerAndRetriever","time":1749295521,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:376","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":17408,"method":"NewKnowledgeClient","endpoint":"lkeap.tencentcloudapi.com","region":"ap-guangzhou","secret_id":"","token":"","time":1749295522,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:43","message":"Creating new KnowledgeClient"}
{"level":"info","pid":17408,"method":"KnowledgeClient.Init","time":1749295522,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:51","message":"Initializing KnowledgeClient"}
{"level":"info","pid":17408,"method":"KnowledgeClient.Init","time":1749295522,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:109","message":"Initialization successful"}
{"level":"info","pid":17408,"time":1749295522,"caller":"/Users/wade/project/wuban/agentchat/flow.go:201","message":"KnowledgeClient initialized successfully"}
{"level":"info","pid":17408,"method":"DefineModelsFlow","provider":"","time":1749295526,"caller":"/Users/wade/project/wuban/agentchat/flow.go:38","message":"Listing models and embedders for provider"}
{"level":"info","pid":19897,"time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/log.go:68","message":"This message appears when log level set to Debug or Info"}
{"level":"info","pid":19897,"method":"DeepSeek.Init","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:98","message":"Initializing DeepSeek plugin"}
{"level":"info","pid":19897,"method":"DeepSeek.DefineModel","model_name":"deepseek-chat","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":19897,"method":"Deep lantern","model_name":"deepseek-chat","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":19897,"method":"DeepSeek.DefineModel","model_name":"deepseek-coder","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":19897,"method":"Deep lantern","model_name":"deepseek-coder","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":19897,"method":"DeepSeek.DefineModel","model_name":"deepseek-reasoner","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:132","message":"Defining DeepSeek model"}
{"level":"info","pid":19897,"method":"Deep lantern","model_name":"deepseek-reasoner","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:162","message":"Model defined successfully"}
{"level":"info","pid":19897,"method":"DeepSeek.Init","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:123","message":"Initialization successful"}
{"level":"info","pid":19897,"method":"Milvus.Init","time":1749296374,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:75","message":"Initializing Milvus plugin"}
{"level":"info","pid":19897,"method":"Milvus.Init","time":1749296376,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:87","message":"Initialization successful"}
{"level":"info","pid":19897,"method":"GraphKnowledge.Init","time":1749296376,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:299","message":"Initializing GraphKnowledge plugin"}
{"level":"info","pid":19897,"method":"NewClient","ip":"54.92.111.204","port":5670,"time":1749296376,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:93","message":"Creating new GraphRAG client"}
{"level":"info","pid":19897,"method":"GraphKnowledge.Init","time":1749296376,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:311","message":"Initialization successful"}
{"level":"info","pid":19897,"method":"DefineIndexerAndRetriever","collection":"chatRag1","dimension":768,"time":1749296376,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:152","message":"Defining indexer and retriever"}
{"level":"info","pid":19897,"method":"Milvus.newDocStore","collection":"chatRag1","dimension":768,"time":1749296376,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:201","message":"Creating new doc store"}
{"level":"info","pid":19897,"method":"Milvus.newDocStore","collection":"chatRag1","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:302","message":"Doc store created successfully"}
{"level":"info","pid":19897,"method":"DefineIndexerAndRetriever","collection":"chatRag1","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:182","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":19897,"method":"DefineIndexerAndRetriever","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:357","message":"Defining indexer and retriever"}
{"level":"info","pid":19897,"method":"GraphKnowledge.newDocStore","space_id":"","model_name":"Qwen/Qwen2.5-Coder-32B-Instruct","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:393","message":"Creating new doc store"}
{"level":"info","pid":19897,"method":"GraphKnowledge.newDocStore","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:399","message":"Doc store created successfully"}
{"level":"info","pid":19897,"method":"DefineIndexerAndRetriever","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:376","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":19897,"method":"NewKnowledgeClient","endpoint":"lkeap.tencentcloudapi.com","region":"ap-guangzhou","secret_id":"","token":"","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:43","message":"Creating new KnowledgeClient"}
{"level":"info","pid":19897,"method":"KnowledgeClient.Init","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:51","message":"Initializing KnowledgeClient"}
{"level":"info","pid":19897,"method":"KnowledgeClient.Init","time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:109","message":"Initialization successful"}
{"level":"info","pid":19897,"time":1749296377,"caller":"/Users/wade/project/wuban/agentchat/flow.go:327","message":"KnowledgeClient initialized successfully"}
{"level":"info","pid":19897,"method":"DefineModelsFlow","provider":"","time":1749296388,"caller":"/Users/wade/project/wuban/agentchat/flow.go:39","message":"Listing models and embedders for provider"}
{"level":"info","pid":19897,"method":"DefineModelsFlow","provider":"","time":1749296388,"caller":"/Users/wade/project/wuban/agentchat/flow.go:149","message":"------default---"}
{"level":"info","pid":19897,"method":"DefineModelsFlow","provider":"ollama","time":1749296437,"caller":"/Users/wade/project/wuban/agentchat/flow.go:39","message":"Listing models and embedders for provider"}
...@@ -149,6 +149,33 @@ paths: ...@@ -149,6 +149,33 @@ paths:
data: '{"id": 1}' data: '{"id": 1}'
code: 200 code: 200
msg: "GraphRAG index data stored successfully" msg: "GraphRAG index data stored successfully"
/models:
post:
summary: List available models for a provider
description: Returns a list of available models for the specified provider (e.g., "deepseek" or "googleai").
tags:
- Chat
requestBody:
required: true
content:
application/json:
schema:
type: string
description: The provider to list models for
example: "deepseek"
responses:
'200':
description: Successful response with the list of models
content:
application/json:
schema:
$ref: '#/components/schemas/Response'
examples:
success:
value:
data: '{"deepseek-chat":{"label":"DeepSeek Chat","supports":{"multiturn":true,"systemRole":true,"media":false,"tools":true},"versions":[]},"deepseek-coder":{"label":"DeepSeek Coder","supports":{"multiturn":true,"systemRole":true,"media":false,"tools":true},"versions":[]},"deepseek-reasoner":{"label":"DeepSeek Reasoner","supports":{"multiturn":true,"systemRole":true,"media":false,"tools":true},"versions":[]}}'
code: 200
msg: "Models listed successfully"
/chat: /chat:
post: post:
summary: Send a chat message summary: Send a chat message
...@@ -228,8 +255,29 @@ components: ...@@ -228,8 +255,29 @@ components:
msg: msg:
type: string type: string
description: A message describing the result description: A message describing the result
example: "Milvus index data stored successfully" example: "Models listed successfully"
required: required:
- data - data
- code - code
- msg - msg
# components:
# schemas:
# Response:
# type: object
# properties:
# data:
# type: string
# description: The response data, typically a JSON string or message
# example: '{"id": 1}'
# code:
# type: integer
# description: The response code (200 for success, 400 for invalid input, etc.)
# example: 200
# msg:
# type: string
# description: A message describing the result
# example: "Milvus index data stored successfully"
# required:
# - data
# - code
# - msg
package main
import (
"context"
"encoding/json"
"fmt"
"strings"
"time"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/wade-liwei/agentchat/plugins/deepseek"
"github.com/wade-liwei/agentchat/plugins/graphrag"
"github.com/wade-liwei/agentchat/plugins/knowledge"
"github.com/wade-liwei/agentchat/plugins/question"
"github.com/wade-liwei/agentchat/util"
"google.golang.org/genai"
// Import knowledge package
"github.com/firebase/genkit/go/plugins/googlegenai"
"github.com/firebase/genkit/go/plugins/ollama"
"github.com/rs/zerolog/log"
_ "github.com/wade-liwei/agentchat/docs" // 导入生成的 Swagger 文档
)
// ProviderInfo 封装模型和嵌入器信息
type ProviderInfo struct {
Models map[string]ai.ModelInfo `json:"models,omitempty"`
Embedders []string `json:"embedders,omitempty"`
Provider string `json:"provider,omitempty"`
}
// DefineModelsFlow 定义 models 流
func DefineModelsFlow(g *genkit.Genkit) {
genkit.DefineFlow(g, "models", func(ctx context.Context, provider string) ([]ProviderInfo, error) {
log.Info().
Str("method", "DefineModelsFlow").
Str("provider", provider).
Msg("Listing models and embedders for provider")
infos := make([]ProviderInfo, 0, 3)
switch provider {
case googlegenai.GoogleAIProvider:
googleModels, err := googlegenai.ListModels(googlegenai.GoogleAIProvider)
if err != nil {
log.Error().
Str("method", "DefineModelsFlow").
Str("provider", provider).
Err(err).
Msg("Failed to list Google AI provider info")
return nil, err
}
googleEmbedders, err := googlegenai.ListEmbedders(genai.BackendGeminiAPI)
if err != nil {
log.Error().
Str("method", "DefineModelsFlow").
Str("provider", provider).
Err(err).
Msg("Failed to list Google AI embedders")
return nil, err
}
googleInfo := ProviderInfo{
Provider: googlegenai.GoogleAIProvider,
Models: googleModels,
Embedders: googleEmbedders,
}
infos = append(infos, googleInfo)
return infos, nil
case deepseek.Provider:
dsModels := deepseek.ListModels()
infos = append(infos, ProviderInfo{
Provider: deepseek.Provider,
Models: dsModels,
Embedders: []string{}, // DeepSeek 不支持嵌入器
})
return infos, nil
case ollama.Provider:
ollamaModels, err := ollama.ListModels()
if err != nil {
log.Error().
Str("method", "DefineModelsFlow").
Str("provider", provider).
Err(err).
Msg("Failed to list Ollama provider info")
return nil, err
}
infos = append(infos, ProviderInfo{
Provider: ollama.Provider,
Models: ollamaModels,
})
return infos, nil
default:
// Google AI
googleModels, err := googlegenai.ListModels(googlegenai.GoogleAIProvider)
if err != nil {
log.Error().
Str("method", "DefineModelsFlow").
Str("provider", googlegenai.GoogleAIProvider).
Err(err).
Msg("Failed to list Google AI provider info")
return nil, err
}
googleEmbedders, err := googlegenai.ListEmbedders(genai.BackendGeminiAPI)
if err != nil {
log.Error().
Str("method", "DefineModelsFlow").
Str("provider", googlegenai.GoogleAIProvider).
Err(err).
Msg("Failed to list Google AI embedders")
return nil, err
}
infos = append(infos, ProviderInfo{
Provider: googlegenai.GoogleAIProvider,
Models: googleModels,
Embedders: googleEmbedders,
})
// DeepSeek
dsModels := deepseek.ListModels()
infos = append(infos, ProviderInfo{
Provider: deepseek.Provider,
Models: dsModels,
Embedders: []string{}, // DeepSeek 不支持嵌入器
})
ollamaModels, err := ollama.ListModels()
if err != nil {
log.Error().
Str("method", "DefineModelsFlow").
Str("provider", provider).
Err(err).
Msg("Failed to list Ollama provider info")
return nil, err
}
infos = append(infos, ProviderInfo{
Provider: ollama.Provider,
Models: ollamaModels,
})
log.Info().
Str("method", "DefineModelsFlow").
Str("provider", provider).
Msg("------default---")
return infos, nil
}
})
}
// DefineModelsFlow 定义 models 流
// func DefineModelsFlow(g *genkit.Genkit) {
// genkit.DefineFlow(g, "models", func(ctx context.Context, provider string) ([]ProviderInfo, error) {
// log.Info().
// Str("method", "DefineModelsFlow").
// Str("provider", provider).
// Msg("Listing models and embedders for provider")
// infos := make([]ProviderInfo, 0, 2)
// switch provider {
// case googlegenai.GoogleAIProvider:
// goggleModels, err := googlegenai.ListModels(googlegenai.GoogleAIProvider)
// if err != nil {
// log.Error().
// Str("method", "DefineModelsFlow").
// Str("provider", provider).
// Err(err).
// Msg("Failed to list Google AI provider info")
// return nil, err
// }
// goggleEmbedders, err := googlegenai.ListEmbedders(genai.BackendGeminiAPI) //ListModels(googlegenai.GoogleAIProvider)
// if err != nil {
// log.Error().
// Str("method", "DefineModelsFlow").
// Str("provider", provider).
// Err(err).
// Msg("Failed to list Google AI provider info")
// return nil, err
// }
// googleInfo := ProviderInfo{
// Provider: googlegenai.GoogleAIProvider,
// Models: goggleModels,
// Embedders: goggleEmbedders,
// }
// infos = append(infos, googleInfo)
// return infos, nil
// case deepseek.Provider:
// dsModels := deepseek.ListModels()
// infos = append(infos, ProviderInfo{
// Provider: deepseek.Provider,
// Models: dsModels,
// })
// return infos, nil
// default:
// infos := make([]ProviderInfo, 0, 2)
// goggleModels, err := googlegenai.ListModels(googlegenai.GoogleAIProvider)
// if err != nil {
// return nil, err
// }
// goggleEmbedders, err := googlegenai.ListEmbedders(genai.BackendGeminiAPI) //ListModels(googlegenai.GoogleAIProvider)
// if err != nil {
// return nil, err
// }
// googleInfo := ProviderInfo{
// Provider: googlegenai.GoogleAIProvider,
// Models: goggleModels,
// Embedders: goggleEmbedders,
// }
// infos = append(infos, googleInfo)
// dsModels := deepseek.ListModels()
// infos = append(infos, ProviderInfo{
// Provider: deepseek.Provider,
// Models: dsModels,
// })
// fmt.Println(provider,"------default---")
// return infos, err
// }
// })
// }
func DefineGraphFlow(g *genkit.Genkit, graphIndexer ai.Indexer) {
genkit.DefineFlow(g, "index/graph", func(ctx context.Context, input *GraphInput) (Response, error) {
opt := graphrag.IndexReqOption{
UserId: input.UserID,
UserName: input.Username,
}
resDocName := ""
if v, ok := input.Metadata[graphrag.DocNameKey]; !ok {
// Generate random docName.
docName, err := graphrag.GenerateRandomDocName(8)
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("generate random docName for document %w", err),
}, nil
}
input.Metadata[graphrag.DocNameKey] = docName
resDocName = docName
} else {
if str, isString := v.(string); isString {
resDocName = str
}
}
doc := ai.DocumentFromText(input.Content, input.Metadata)
err := graphIndexer.Index(ctx, &ai.IndexerRequest{
Documents: []*ai.Document{doc},
Options: &opt,
})
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("index document: %w", err),
}, nil
}
return Response{
Code: 200,
Msg: fmt.Sprintf("Document indexed successfully, docname %s", resDocName),
}, nil
})
}
func DefineDocumentFlow(g *genkit.Genkit, indexer ai.Indexer) {
// 定义文档索引流
genkit.DefineFlow(g, "index/document", func(ctx context.Context, input *DocumentInput) (Response, error) {
if input.Metadata == nil {
input.Metadata = make(map[string]any)
}
input.Metadata[util.UserIdKey] = input.UserID
input.Metadata[util.UserNameKey] = input.Username
doc := ai.DocumentFromText(input.Content, input.Metadata)
err := indexer.Index(ctx, &ai.IndexerRequest{
Documents: []*ai.Document{doc},
})
if err != nil {
return Response{
Code: 500,
Msg: err.Error(),
}, nil
}
return Response{
Code: 200,
Msg: "Document indexed successfully",
}, nil
})
}
func DefineChatFlow(g *genkit.Genkit, retriever ai.Retriever, graphRetriever ai.Retriever, pgConnString string) {
qa, err := question.InitQAStore(pgConnString)
if err != nil {
log.Fatal().Msgf("InitQAStore failed: %v", err)
}
// Initialize KnowledgeClient with test parameters
kc := knowledge.NewKnowledgeClient(knowledge.ClientConfig{
Endpoint: "lkeap.tencentcloudapi.com",
Region: "ap-guangzhou",
})
if err := kc.Init(context.Background()); err != nil {
log.Fatal().Msgf("Failed to initialize KnowledgeClient: %v", err)
}
log.Info().Msg("KnowledgeClient initialized successfully")
// Define a simple flow that generates jokes about a given topic
genkit.DefineFlow(g, "chat", func(ctx context.Context, input *ChatInput) (Response, error) {
ctxAsJson, _ := json.Marshal(ctx)
log.Info().Msgf("input----ctxAsJson----%s", string(ctxAsJson))
inputAsJson, err := json.Marshal(input)
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("json.Marshal: %w", err),
}, nil
}
log.Info().Msgf("input--------%s", string(inputAsJson))
idx, lastQa, lastok, err := qa.WriteAndGetLatestQA(context.Background(), question.QA{
FromID: &input.FromID,
From: &input.From,
Question: &input.Content,
To: &input.To,
ToID: &input.ToID,
Milvus: &input.Milvus,
Graph: &input.Graph,
})
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("WriteAndGetLatestQA: %w", err),
}, nil
}
qaAsJson, err := json.Marshal(lastQa)
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("json.Marshal(lastQa): %w", err),
}, nil
}
log.Info().Msgf("qaAsJson--------%s", string(qaAsJson))
promptInput := &simpleQaPromptInput{
Query: input.Content,
}
if lastok && lastQa.Summary != nil {
promptInput.Summary = *lastQa.Summary
}
metaData := make(map[string]any)
metaData[util.UserIdKey] = input.ToID
metaData[util.UserNameKey] = input.To
dRequest := ai.DocumentFromText(input.Content, metaData)
response, err := ai.Retrieve(ctx, retriever, ai.WithDocs(dRequest))
if err != nil {
log.Error().Msgf("milvus Retrieve err.Error() %s", err.Error())
} else {
var sb strings.Builder
for _, d := range response.Documents {
sb.WriteString(d.Content[0].Text)
sb.WriteByte('\n')
}
promptInput.Context = sb.String()
log.Info().Msgf("promptInput.Context: %s", promptInput.Context)
}
begin := time.Now()
graphResponse, err := ai.Retrieve(ctx, graphRetriever, ai.WithDocs(dRequest))
if err != nil {
log.Error().Msgf("graph Retrieve err.Error() %s", err.Error())
} else {
var sb strings.Builder
for _, d := range graphResponse.Documents {
sb.WriteString(d.Content[0].Text)
sb.WriteByte('\n')
}
promptInput.Graph = sb.String()
log.Info().Msgf("promptInput.Graph : %s", promptInput.Graph)
}
fmt.Println("graph time", time.Since(begin).Seconds())
simpleQaPrompt, err := defineSimpleQaPrompt(g, input.Model)
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("index document: %w", err),
}, nil
}
resp, err := simpleQaPrompt.Execute(ctx, ai.WithInput(promptInput))
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("index document: %w", err),
}, nil
}
if lastok {
if promptInput.Summary == "" {
promptInput.Summary = resp.Text()
}
log.Info().
Str("from", input.From).
Str("from_id", input.FromID).
Str("to", input.To).
Str("to_id", input.ToID).
Str("promptInput.Query", promptInput.Query).
Str("resp.Text()", resp.Text()).
Str("promptInput.Summary", promptInput.Summary).Msg("QueryRewriteWithSummary")
res, err := kc.QueryRewriteWithSummary(context.Background(), promptInput.Query, resp.Text(), promptInput.Summary)
if err != nil {
log.Error().Msg(err.Error())
} else {
qa.UpdateQAFields(context.Background(), idx, res.RewrittenQuery, resp.Text())
/*
{"RewrittenQuery":"Conversation summary: The available knowledge base does not contain information about the capital of the UK.","RawResponse":{"Response":{"Content":"Conversation summary: The available knowledge base does not contain information about the capital of the UK.","Usage":{"InputTokens":74,"OutputTokens":19,"TotalTokens":93},"RequestId":"15f1ce0c-a83f-4d95-af22-33a3bd829e8d"}}}
*/
}
} else {
qa.UpdateQAFields(context.Background(), idx, "", resp.Text())
}
log.Info().
Str("from", input.From).
Str("from_id", input.FromID).
Str("to", input.To).
Str("to_id", input.ToID).
Str("question", promptInput.Query).
Str("context", promptInput.Context).
Str("graph", promptInput.Graph).
Str("last summary", promptInput.Summary).
Str("answer", resp.Text()).
Msg("Question and answer pair recorded")
return Response{
Data: resp.Text(),
Code: 200,
}, nil
})
}
// defineSimpleQaPrompt 加载或定义指定名称的 Prompt
func defineSimpleQaPrompt(g *genkit.Genkit, promptName string) (*ai.Prompt, error) {
// 步骤 1:尝试查找现有的 Prompt
log.Info().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Msg("Attempting to lookup prompt")
prompt := genkit.LookupPrompt(g, promptName)
if prompt != nil {
log.Info().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Msg("Prompt found and loaded")
return prompt, nil
}
log.Info().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Msg("Prompt not found, defining new prompt")
// 步骤 2:如果未找到,定义新的 Prompt
simpleQaPrompt, err := genkit.DefinePrompt(g, promptName,
// ai.WithModelName("deepseek/deepseek-chat"),
ai.WithModelName(promptName),
ai.WithPrompt(simpleQaPromptTemplate),
ai.WithInputType(simpleQaPromptInput{}),
ai.WithOutputFormat(ai.OutputFormatText),
)
if err != nil {
log.Error().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Err(err).
Msg("Failed to define prompt")
return nil, err
}
log.Info().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Msg("Prompt defined successfully")
return simpleQaPrompt, nil
}
...@@ -2,22 +2,15 @@ package main ...@@ -2,22 +2,15 @@ package main
import ( import (
"context" "context"
"encoding/json"
"flag" "flag"
"fmt"
"net/http" "net/http"
"os" "os"
"strings"
"time"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit" "github.com/firebase/genkit/go/genkit"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"github.com/wade-liwei/agentchat/plugins/deepseek" "github.com/wade-liwei/agentchat/plugins/deepseek"
"github.com/wade-liwei/agentchat/plugins/graphrag" "github.com/wade-liwei/agentchat/plugins/graphrag" // Import knowledge package
"github.com/wade-liwei/agentchat/plugins/knowledge" // Import knowledge package
"github.com/wade-liwei/agentchat/plugins/milvus" "github.com/wade-liwei/agentchat/plugins/milvus"
"github.com/wade-liwei/agentchat/plugins/question"
"github.com/firebase/genkit/go/plugins/evaluators" "github.com/firebase/genkit/go/plugins/evaluators"
"github.com/firebase/genkit/go/plugins/googlegenai" "github.com/firebase/genkit/go/plugins/googlegenai"
...@@ -27,7 +20,6 @@ import ( ...@@ -27,7 +20,6 @@ import (
_ "github.com/wade-liwei/agentchat/docs" // 导入生成的 Swagger 文档 _ "github.com/wade-liwei/agentchat/docs" // 导入生成的 Swagger 文档
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/wade-liwei/agentchat/util"
) )
type ChatInput struct { type ChatInput struct {
...@@ -145,8 +137,6 @@ func main() { ...@@ -145,8 +137,6 @@ func main() {
log.Fatal().Msg(err.Error()) log.Fatal().Msg(err.Error())
} }
embedder := googlegenai.GoogleAIEmbedder(g, "embedding-001") embedder := googlegenai.GoogleAIEmbedder(g, "embedding-001")
if embedder == nil { if embedder == nil {
log.Fatal().Msg(err.Error()) log.Fatal().Msg(err.Error())
...@@ -166,253 +156,16 @@ func main() { ...@@ -166,253 +156,16 @@ func main() {
log.Fatal().Msgf("DefineIndexerAndRetriever failed: %v", err) log.Fatal().Msgf("DefineIndexerAndRetriever failed: %v", err)
} }
// 定义文档索引流
genkit.DefineFlow(g, "index/document", func(ctx context.Context, input *DocumentInput) (Response, error) {
if input.Metadata == nil {
input.Metadata = make(map[string]any)
}
input.Metadata[util.UserIdKey] = input.UserID
input.Metadata[util.UserNameKey] = input.Username
doc := ai.DocumentFromText(input.Content, input.Metadata)
err := indexer.Index(ctx, &ai.IndexerRequest{
Documents: []*ai.Document{doc},
})
if err != nil {
return Response{
Code: 500,
Msg: err.Error(),
}, nil
}
return Response{
Code: 200,
Msg: "Document indexed successfully",
}, nil
})
graphIndexer, graphRetriever, err := graphrag.DefineIndexerAndRetriever(ctx, g) graphIndexer, graphRetriever, err := graphrag.DefineIndexerAndRetriever(ctx, g)
if err != nil { if err != nil {
log.Fatal().Msgf("graphrag.DefineIndexerAndRetriever failed: %v", err) log.Fatal().Msgf("graphrag.DefineIndexerAndRetriever failed: %v", err)
} }
genkit.DefineFlow(g, "index/graph", func(ctx context.Context, input *GraphInput) (Response, error) { DefineDocumentFlow(g, indexer)
DefineGraphFlow(g, graphIndexer)
opt := graphrag.IndexReqOption{ DefineModelsFlow(g)
UserId: input.UserID, DefineChatFlow(g, retriever, graphRetriever, *pgConnString)
UserName: input.Username,
}
resDocName := ""
if v, ok := input.Metadata[graphrag.DocNameKey]; !ok {
// Generate random docName.
docName, err := graphrag.GenerateRandomDocName(8)
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("generate random docName for document %w", err),
}, nil
}
input.Metadata[graphrag.DocNameKey] = docName
resDocName = docName
} else {
if str, isString := v.(string); isString {
resDocName = str
}
}
doc := ai.DocumentFromText(input.Content, input.Metadata)
err := graphIndexer.Index(ctx, &ai.IndexerRequest{
Documents: []*ai.Document{doc},
Options: &opt,
})
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("index document: %w", err),
}, nil
}
return Response{
Code: 200,
Msg: fmt.Sprintf("Document indexed successfully, docname %s", resDocName),
}, nil
})
qa, err := question.InitQAStore(*pgConnString)
if err != nil {
log.Fatal().Msgf("InitQAStore failed: %v", err)
}
// Initialize KnowledgeClient with test parameters
kc := knowledge.NewKnowledgeClient(knowledge.ClientConfig{
Endpoint: "lkeap.tencentcloudapi.com",
Region: "ap-guangzhou",
})
if err := kc.Init(ctx); err != nil {
log.Fatal().Msgf("Failed to initialize KnowledgeClient: %v", err)
}
log.Info().Msg("KnowledgeClient initialized successfully")
// Define a simple flow that generates jokes about a given topic
genkit.DefineFlow(g, "chat", func(ctx context.Context, input *ChatInput) (Response, error) {
ctxAsJson, _ := json.Marshal(ctx)
log.Info().Msgf("input----ctxAsJson----%s", string(ctxAsJson))
inputAsJson, err := json.Marshal(input)
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("json.Marshal: %w", err),
}, nil
}
log.Info().Msgf("input--------%s", string(inputAsJson))
idx, lastQa, lastok, err := qa.WriteAndGetLatestQA(context.Background(), question.QA{
FromID: &input.FromID,
From: &input.From,
Question: &input.Content,
To: &input.To,
ToID: &input.ToID,
Milvus: &input.Milvus,
Graph: &input.Graph,
})
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("WriteAndGetLatestQA: %w", err),
}, nil
}
qaAsJson, err := json.Marshal(lastQa)
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("json.Marshal(lastQa): %w", err),
}, nil
}
log.Info().Msgf("qaAsJson--------%s", string(qaAsJson))
promptInput := &simpleQaPromptInput{
Query: input.Content,
}
if lastok && lastQa.Summary != nil {
promptInput.Summary = *lastQa.Summary
}
metaData := make(map[string]any)
metaData[util.UserIdKey] = input.ToID
metaData[util.UserNameKey] = input.To
dRequest := ai.DocumentFromText(input.Content, metaData)
response, err := ai.Retrieve(ctx, retriever, ai.WithDocs(dRequest))
if err != nil {
log.Error().Msgf("milvus Retrieve err.Error() %s", err.Error())
} else {
var sb strings.Builder
for _, d := range response.Documents {
sb.WriteString(d.Content[0].Text)
sb.WriteByte('\n')
}
promptInput.Context = sb.String()
log.Info().Msgf("promptInput.Context: %s", promptInput.Context)
}
begin := time.Now()
graphResponse, err := ai.Retrieve(ctx, graphRetriever, ai.WithDocs(dRequest))
if err != nil {
log.Error().Msgf("graph Retrieve err.Error() %s", err.Error())
} else {
var sb strings.Builder
for _, d := range graphResponse.Documents {
sb.WriteString(d.Content[0].Text)
sb.WriteByte('\n')
}
promptInput.Graph = sb.String()
log.Info().Msgf("promptInput.Graph : %s", promptInput.Graph)
}
fmt.Println("graph time", time.Since(begin).Seconds())
simpleQaPrompt,err := defineSimpleQaPrompt(g,input.Model)
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("index document: %w", err),
}, nil
}
resp, err := simpleQaPrompt.Execute(ctx, ai.WithInput(promptInput))
if err != nil {
return Response{
Code: 500,
Msg: fmt.Sprintf("index document: %w", err),
}, nil
}
if lastok {
if promptInput.Summary == "" {
promptInput.Summary = resp.Text()
}
log.Info().
Str("from", input.From).
Str("from_id", input.FromID).
Str("to", input.To).
Str("to_id", input.ToID).
Str("promptInput.Query", promptInput.Query).
Str("resp.Text()", resp.Text()).
Str("promptInput.Summary", promptInput.Summary).Msg("QueryRewriteWithSummary")
res, err := kc.QueryRewriteWithSummary(context.Background(), promptInput.Query, resp.Text(), promptInput.Summary)
if err != nil {
log.Error().Msg(err.Error())
} else {
qa.UpdateQAFields(context.Background(), idx, res.RewrittenQuery, resp.Text())
/*
{"RewrittenQuery":"Conversation summary: The available knowledge base does not contain information about the capital of the UK.","RawResponse":{"Response":{"Content":"Conversation summary: The available knowledge base does not contain information about the capital of the UK.","Usage":{"InputTokens":74,"OutputTokens":19,"TotalTokens":93},"RequestId":"15f1ce0c-a83f-4d95-af22-33a3bd829e8d"}}}
*/
}
} else {
qa.UpdateQAFields(context.Background(), idx, "", resp.Text())
}
log.Info().
Str("from", input.From).
Str("from_id", input.FromID).
Str("to", input.To).
Str("to_id", input.ToID).
Str("question", promptInput.Query).
Str("context", promptInput.Context).
Str("graph", promptInput.Graph).
Str("last summary", promptInput.Summary).
Str("answer", resp.Text()).
Msg("Question and answer pair recorded")
return Response{
Data: resp.Text(),
Code: 200,
}, nil
})
// 配置限速器:每秒 10 次请求,突发容量 20,最大并发 5 // 配置限速器:每秒 10 次请求,突发容量 20,最大并发 5
rl := NewRateLimiter(10, 20, 5) rl := NewRateLimiter(10, 20, 5)
...@@ -445,49 +198,3 @@ type Response struct { ...@@ -445,49 +198,3 @@ type Response struct {
Code int `json:"code"` Code int `json:"code"`
Msg string `json:"msg"` Msg string `json:"msg"`
} }
// defineSimpleQaPrompt 加载或定义指定名称的 Prompt
func defineSimpleQaPrompt(g *genkit.Genkit, promptName string) (*ai.Prompt, error) {
// 步骤 1:尝试查找现有的 Prompt
log.Info().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Msg("Attempting to lookup prompt")
prompt := genkit.LookupPrompt(g, promptName)
if prompt != nil {
log.Info().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Msg("Prompt found and loaded")
return prompt, nil
}
log.Info().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Msg("Prompt not found, defining new prompt")
// 步骤 2:如果未找到,定义新的 Prompt
simpleQaPrompt, err := genkit.DefinePrompt(g, promptName,
// ai.WithModelName("deepseek/deepseek-chat"),
ai.WithModelName(promptName),
ai.WithPrompt(simpleQaPromptTemplate),
ai.WithInputType(simpleQaPromptInput{}),
ai.WithOutputFormat(ai.OutputFormatText),
)
if err != nil {
log.Error().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Err(err).
Msg("Failed to define prompt")
return nil, err
}
log.Info().
Str("method", "defineSimpleQaPrompt").
Str("prompt_name", promptName).
Msg("Prompt defined successfully")
return simpleQaPrompt, nil
}
...@@ -14,304 +14,270 @@ import ( ...@@ -14,304 +14,270 @@ import (
) )
const provider = "deepseek" const provider = "deepseek"
const Provider = "deepseek"
// 常量定义支持的模型 // 常量定义支持的模型
const ( const (
// DeepSeekChat = "deepseek-chat" // DeepSeekChat = "deepseek-chat"
// DeepSeekCoder = "deepseek-coder" // DeepSeekCoder = "deepseek-coder"
// DeepSeekReasoner = "deepseek-reasoner" // DeepSeekReasoner = "deepseek-reasoner"
DeepSeekChat = deepseek.DeepSeekChat DeepSeekChat = deepseek.DeepSeekChat
DeepSeekCoder = deepseek.DeepSeekCoder DeepSeekCoder = deepseek.DeepSeekCoder
DeepSeekReasoner = deepseek.DeepSeekReasoner DeepSeekReasoner = deepseek.DeepSeekReasoner
) )
var ( var (
mediaSupportedModels = []string{DeepSeekChat, DeepSeekCoder, DeepSeekReasoner} mediaSupportedModels = []string{DeepSeekChat, DeepSeekCoder, DeepSeekReasoner}
roleMapping = map[ai.Role]string{ roleMapping = map[ai.Role]string{
ai.RoleUser: deepseek.ChatMessageRoleUser, ai.RoleUser: deepseek.ChatMessageRoleUser,
ai.RoleModel: deepseek.ChatMessageRoleAssistant, ai.RoleModel: deepseek.ChatMessageRoleAssistant,
ai.RoleSystem: deepseek.ChatMessageRoleSystem, ai.RoleSystem: deepseek.ChatMessageRoleSystem,
ai.RoleTool: deepseek.ChatMessageRoleTool, ai.RoleTool: deepseek.ChatMessageRoleTool,
} }
) )
// modelInfoMap 定义支持的模型及其信息 // modelInfoMap 定义支持的模型及其信息
var modelInfoMap = map[string]ai.ModelInfo{ var modelInfoMap = map[string]ai.ModelInfo{
DeepSeekChat: { DeepSeekChat: {
Label: "DeepSeek Chat", Label: "DeepSeek Chat",
Supports: &ai.ModelSupports{ Supports: &ai.ModelSupports{
Multiturn: true, Multiturn: true,
SystemRole: true, SystemRole: true,
Media: false, Media: false,
Tools: true, Tools: true,
}, },
Versions: []string{}, Versions: []string{},
}, },
DeepSeekCoder: { DeepSeekCoder: {
Label: "DeepSeek Coder", Label: "DeepSeek Coder",
Supports: &ai.ModelSupports{ Supports: &ai.ModelSupports{
Multiturn: true, Multiturn: true,
SystemRole: true, SystemRole: true,
Media: false, Media: false,
Tools: true, Tools: true,
}, },
Versions: []string{}, Versions: []string{},
}, },
DeepSeekReasoner: { DeepSeekReasoner: {
Label: "DeepSeek Reasoner", Label: "DeepSeek Reasoner",
Supports: &ai.ModelSupports{ Supports: &ai.ModelSupports{
Multiturn: true, Multiturn: true,
SystemRole: true, SystemRole: true,
Media: false, Media: false,
Tools: true, Tools: true,
}, },
Versions: []string{}, Versions: []string{},
}, },
}
func ListModels() map[string]ai.ModelInfo {
return modelInfoMap
} }
// DeepSeek holds configuration for the plugin. // DeepSeek holds configuration for the plugin.
type DeepSeek struct { type DeepSeek struct {
APIKey string // DeepSeek API key APIKey string // DeepSeek API key
mu sync.Mutex // Mutex to control access. mu sync.Mutex // Mutex to control access.
initted bool // Whether the plugin has been initialized. initted bool // Whether the plugin has been initialized.
} }
// Name returns the provider name. // Name returns the provider name.
func (d *DeepSeek) Name() string { func (d *DeepSeek) Name() string {
return provider return provider
} }
// ModelDefinition represents a model with its name and type. // ModelDefinition represents a model with its name and type.
type ModelDefinition struct { type ModelDefinition struct {
Name string Name string
Type string Type string
} }
// Init initializes the DeepSeek plugin and registers all known models. // Init initializes the DeepSeek plugin and registers all known models.
func (d *DeepSeek) Init(ctx context.Context, g *genkit.Genkit) error { func (d *DeepSeek) Init(ctx context.Context, g *genkit.Genkit) error {
log.Info().Str("method", "DeepSeek.Init").Msg("Initializing DeepSeek plugin") log.Info().Str("method", "DeepSeek.Init").Msg("Initializing DeepSeek plugin")
d.mu.Lock() d.mu.Lock()
defer d.mu.Unlock() defer d.mu.Unlock()
if d.initted { if d.initted {
log.Error().Str("method", "DeepSeek.Init").Msg("Plugin already initialized") log.Error().Str("method", "DeepSeek.Init").Msg("Plugin already initialized")
return fmt.Errorf("deepseek.Init already called") return fmt.Errorf("deepseek.Init already called")
} }
if d == nil || d.APIKey == "" { if d == nil || d.APIKey == "" {
log.Error().Str("method", "DeepSeek.Init").Msg("APIKey is required") log.Error().Str("method", "DeepSeek.Init").Msg("APIKey is required")
return fmt.Errorf("deepseek: need APIKey") return fmt.Errorf("deepseek: need APIKey")
} }
d.initted = true d.initted = true
//d.mu.Unlock() //d.mu.Unlock()
// 自动注册所有支持的模型 // 自动注册所有支持的模型
for _, modelName := range mediaSupportedModels { for _, modelName := range mediaSupportedModels {
modelDef := ModelDefinition{ modelDef := ModelDefinition{
Name: modelName, Name: modelName,
Type: "chat", // 假设所有模型都支持 chat 类型 Type: "chat", // 假设所有模型都支持 chat 类型
} }
d.DefineModel(g, modelDef, nil) d.DefineModel(g, modelDef, nil)
} }
log.Info().Str("method", "DeepSeek.Init").Msg("Initialization successful") log.Info().Str("method", "DeepSeek.Init").Msg("Initialization successful")
return nil return nil
} }
// DefineModel defines a DeepSeek model in Genkit. // DefineModel defines a DeepSeek model in Genkit.
func (d *DeepSeek) DefineModel(g *genkit.Genkit, model ModelDefinition, info *ai.ModelInfo) ai.Model { func (d *DeepSeek) DefineModel(g *genkit.Genkit, model ModelDefinition, info *ai.ModelInfo) ai.Model {
log.Info(). log.Info().
Str("method", "DeepSeek.DefineModel"). Str("method", "DeepSeek.DefineModel").
Str("model_name", model.Name). Str("model_name", model.Name).
Msg("Defining DeepSeek model") Msg("Defining DeepSeek model")
// d.mu.Lock() // d.mu.Lock()
// defer d.mu.Unlock() // defer d.mu.Unlock()
if !d.initted { if !d.initted {
log.Error().Str("method", "DeepSeek.DefineModel").Msg("DeepSeek not initialized") log.Error().Str("method", "DeepSeek.DefineModel").Msg("DeepSeek not initialized")
return nil return nil
} }
// 获取模型信息 // 获取模型信息
var mi ai.ModelInfo var mi ai.ModelInfo
if info != nil { if info != nil {
mi = *info mi = *info
} else { } else {
var ok bool var ok bool
mi, ok = modelInfoMap[model.Name] mi, ok = modelInfoMap[model.Name]
if !ok { if !ok {
log.Error(). log.Error().
Str("method", "DeepSeek.DefineModel"). Str("method", "DeepSeek.DefineModel").
Str("model_name", model.Name). Str("model_name", model.Name).
Msg("Unknown model and no ModelInfo provided") Msg("Unknown model and no ModelInfo provided")
return nil return nil
} }
} }
// 定义生成器 // 定义生成器
gen := &generator{model: model, apiKey: d.APIKey} gen := &generator{model: model, apiKey: d.APIKey}
modelDef := genkit.DefineModel(g, provider, model.Name, &mi, gen.generate) modelDef := genkit.DefineModel(g, provider, model.Name, &mi, gen.generate)
log.Info(). log.Info().
Str("method", "Deep lantern"). Str("method", "Deep lantern").
Str("model_name", model.Name). Str("model_name", model.Name).
Msg("Model defined successfully") Msg("Model defined successfully")
return modelDef return modelDef
} }
// generator handles model generation. // generator handles model generation.
type generator struct { type generator struct {
model ModelDefinition model ModelDefinition
apiKey string apiKey string
} }
// generate implements the Genkit model generation interface. // generate implements the Genkit model generation interface.
func (g *generator) generate(ctx context.Context, input *ai.ModelRequest, cb func(context.Context, *ai.ModelResponseChunk) error) (*ai.ModelResponse, error) { func (g *generator) generate(ctx context.Context, input *ai.ModelRequest, cb func(context.Context, *ai.ModelResponseChunk) error) (*ai.ModelResponse, error) {
log.Info(). log.Info().
Str("method", "generator.generate"). Str("method", "generator.generate").
Str("model_name", g.model.Name). Str("model_name", g.model.Name).
Int("messages", len(input.Messages)). Int("messages", len(input.Messages)).
Msg("Starting model generation") Msg("Starting model generation")
if len(input.Messages) == 0 { if len(input.Messages) == 0 {
log.Error().Str("method", "generator.generate").Msg("Prompt or messages required") log.Error().Str("method", "generator.generate").Msg("Prompt or messages required")
return nil, fmt.Errorf("prompt or messages required") return nil, fmt.Errorf("prompt or messages required")
} }
// Initialize DeepSeek client. // Initialize DeepSeek client.
client := deepseek.NewClient(g.apiKey) client := deepseek.NewClient(g.apiKey)
log.Debug().Str("method", "generator.generate").Msg("DeepSeek client initialized") log.Debug().Str("method", "generator.generate").Msg("DeepSeek client initialized")
// Create a chat completion request // Create a chat completion request
request := &deepseek.ChatCompletionRequest{ request := &deepseek.ChatCompletionRequest{
Model: g.model.Name, Model: g.model.Name,
} }
for _, msg := range input.Messages { for _, msg := range input.Messages {
role, ok := roleMapping[msg.Role] role, ok := roleMapping[msg.Role]
if !ok { if !ok {
log.Error(). log.Error().
Str("method", "generator.generate"). Str("method", "generator.generate").
Str("role", string(msg.Role)). Str("role", string(msg.Role)).
Msg("Unsupported role") Msg("Unsupported role")
return nil, fmt.Errorf("unsupported role: %s", msg.Role) return nil, fmt.Errorf("unsupported role: %s", msg.Role)
} }
content := concatMessageParts(msg.Content) content := concatMessageParts(msg.Content)
request.Messages = append(request.Messages, deepseek.ChatCompletionMessage{ request.Messages = append(request.Messages, deepseek.ChatCompletionMessage{
Role: role, Role: role,
Content: content, Content: content,
}) })
log.Debug(). log.Debug().
Str("method", "generator.generate"). Str("method", "generator.generate").
Str("role", role). Str("role", role).
Str("content", content). Str("content", content).
Msg("Added message to request") Msg("Added message to request")
} }
// Send the request and handle the response // Send the request and handle the response
response, err := client.CreateChatCompletion(ctx, request) response, err := client.CreateChatCompletion(ctx, request)
if err != nil { if err != nil {
log.Error(). log.Error().
Err(err). Err(err).
Str("method", "generator.generate"). Str("method", "generator.generate").
Msg("Failed to create chat completion") Msg("Failed to create chat completion")
return nil, fmt.Errorf("create chat completion: %w", err) return nil, fmt.Errorf("create chat completion: %w", err)
} }
log.Debug(). log.Debug().
Str("method", "generator.generate"). Str("method", "generator.generate").
Int("choices", len(response.Choices)). Int("choices", len(response.Choices)).
Msg("Received chat completion response") Msg("Received chat completion response")
// Create a final response with the merged chunks // Create a final response with the merged chunks
finalResponse := &ai.ModelResponse{ finalResponse := &ai.ModelResponse{
Request: input, Request: input,
FinishReason: ai.FinishReason("stop"), FinishReason: ai.FinishReason("stop"),
Message: &ai.Message{ Message: &ai.Message{
Role: ai.RoleModel, Role: ai.RoleModel,
}, },
} }
for _, chunk := range response.Choices { for _, chunk := range response.Choices {
log.Debug(). log.Debug().
Str("method", "generator.generate"). Str("method", "generator.generate").
Int("index", chunk.Index). Int("index", chunk.Index).
Str("content", chunk.Message.Content). Str("content", chunk.Message.Content).
Msg("Processing response chunk") Msg("Processing response chunk")
p := ai.Part{ p := ai.Part{
Text: chunk.Message.Content, Text: chunk.Message.Content,
Kind: ai.PartKind(chunk.Index), Kind: ai.PartKind(chunk.Index),
} }
finalResponse.Message.Content = append(finalResponse.Message.Content, &p) finalResponse.Message.Content = append(finalResponse.Message.Content, &p)
} }
log.Info(). log.Info().
Str("method", "generator.generate"). Str("method", "generator.generate").
Str("model_name", g.model.Name). Str("model_name", g.model.Name).
Int("content_parts", len(finalResponse.Message.Content)). Int("content_parts", len(finalResponse.Message.Content)).
Msg("Model generation completed successfully") Msg("Model generation completed successfully")
return finalResponse, nil return finalResponse, nil
} }
// concatMessageParts concatenates message parts into a single string. // concatMessageParts concatenates message parts into a single string.
func concatMessageParts(parts []*ai.Part) string { func concatMessageParts(parts []*ai.Part) string {
log.Debug(). log.Debug().
Str("method", "concatMessageParts"). Str("method", "concatMessageParts").
Int("parts", len(parts)). Int("parts", len(parts)).
Msg("Concatenating message parts") Msg("Concatenating message parts")
var sb strings.Builder var sb strings.Builder
for _, part := range parts { for _, part := range parts {
if part.IsText() { if part.IsText() {
sb.WriteString(part.Text) sb.WriteString(part.Text)
} }
// Ignore non-text parts (e.g., media, tools) as DeepSeek API doesn't support them. // Ignore non-text parts (e.g., media, tools) as DeepSeek API doesn't support them.
} }
result := sb.String() result := sb.String()
log.Debug(). log.Debug().
Str("method", "concatMessageParts"). Str("method", "concatMessageParts").
Str("result", result). Str("result", result).
Msg("Concatenation complete") Msg("Concatenation complete")
return result return result
} }
// package deepseek // package deepseek
// import ( // import (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment