best-geo-test 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -369,6 +369,68 @@
369
369
  "additionalProperties": false
370
370
  }
371
371
  },
372
+ {
373
+ "name": "questions.linkKnowledge",
374
+ "mode": "write",
375
+ "guide": "question",
376
+ "requiresPlan": true,
377
+ "description": "给搜索问题绑定知识库。绑定之后,AI 写这个问题的文章时会去这些知识库里检索 —— 绑错了写出来的内容就跑偏。重复绑定会自动跳过。不扣费。",
378
+ "inputSchema": {
379
+ "type": "object",
380
+ "properties": {
381
+ "questionId": {
382
+ "type": "integer",
383
+ "minimum": 1,
384
+ "description": "哪个搜索问题"
385
+ },
386
+ "knowledgeBaseIds": {
387
+ "type": "array",
388
+ "minItems": 1,
389
+ "items": {
390
+ "type": "integer",
391
+ "minimum": 1
392
+ },
393
+ "description": "要绑定的知识库 id,来自 knowledge.list"
394
+ }
395
+ },
396
+ "required": [
397
+ "questionId",
398
+ "knowledgeBaseIds"
399
+ ],
400
+ "additionalProperties": false
401
+ }
402
+ },
403
+ {
404
+ "name": "questions.unlinkKnowledge",
405
+ "mode": "write",
406
+ "guide": "question",
407
+ "requiresPlan": true,
408
+ "description": "解除搜索问题与知识库的绑定。解绑后 AI 写这个问题的文章时不再检索这些知识库。知识库本身不受影响,还在。不扣费。",
409
+ "inputSchema": {
410
+ "type": "object",
411
+ "properties": {
412
+ "questionId": {
413
+ "type": "integer",
414
+ "minimum": 1,
415
+ "description": "哪个搜索问题"
416
+ },
417
+ "knowledgeBaseIds": {
418
+ "type": "array",
419
+ "minItems": 1,
420
+ "items": {
421
+ "type": "integer",
422
+ "minimum": 1
423
+ },
424
+ "description": "要解绑的知识库 id"
425
+ }
426
+ },
427
+ "required": [
428
+ "questionId",
429
+ "knowledgeBaseIds"
430
+ ],
431
+ "additionalProperties": false
432
+ }
433
+ },
372
434
  {
373
435
  "name": "articles.list",
374
436
  "mode": "read",
@@ -498,7 +560,7 @@
498
560
  "mode": "write",
499
561
  "guide": "article",
500
562
  "requiresPlan": true,
501
- "description": "改一篇已有文章。改不了所属项目和文件夹——那两个要去网页改。不扣费。",
563
+ "description": "改一篇已有文章的标题、正文、封面、标签、摘要。改不了所属 GEO 项目——那个要去网页改;换文件夹用 articles.moveFolder,改状态用 articles.setStatus。不扣费。",
502
564
  "inputSchema": {
503
565
  "type": "object",
504
566
  "properties": {
@@ -542,6 +604,95 @@
542
604
  "additionalProperties": false
543
605
  }
544
606
  },
607
+ {
608
+ "name": "folders.list",
609
+ "mode": "read",
610
+ "guide": "article",
611
+ "requiresPlan": false,
612
+ "description": "列出文章文件夹(扁平,自己按 parentId 拼树)。要把文章放进指定文件夹、或要回答「这篇在哪个文件夹」时,先查这里拿 id —— 不要猜 id,猜错会被服务端拒掉、白跑一次 plan。",
613
+ "inputSchema": {
614
+ "type": "object",
615
+ "properties": {
616
+ "companyId": {
617
+ "type": "integer",
618
+ "minimum": 1,
619
+ "description": "只看某家公司的"
620
+ },
621
+ "productId": {
622
+ "type": "integer",
623
+ "minimum": 1,
624
+ "description": "只看某个 GEO 项目的。建文章前一般都该带上它"
625
+ }
626
+ },
627
+ "additionalProperties": false
628
+ }
629
+ },
630
+ {
631
+ "name": "articles.moveFolder",
632
+ "mode": "write",
633
+ "guide": "article",
634
+ "requiresPlan": true,
635
+ "description": "把一篇或多篇文章移到另一个文件夹。只能移到同一个 GEO 项目下的文件夹,跨项目会被拒。不改文章内容,也不扣费。目标文件夹的 id 来自 folders.list。",
636
+ "inputSchema": {
637
+ "type": "object",
638
+ "properties": {
639
+ "articleIds": {
640
+ "type": "array",
641
+ "minItems": 1,
642
+ "items": {
643
+ "type": "integer",
644
+ "minimum": 1
645
+ },
646
+ "description": "要移动的文章 id,一次可以给多个"
647
+ },
648
+ "folderId": {
649
+ "type": "integer",
650
+ "minimum": 1,
651
+ "description": "移到哪个文件夹,来自 folders.list"
652
+ }
653
+ },
654
+ "required": [
655
+ "articleIds",
656
+ "folderId"
657
+ ],
658
+ "additionalProperties": false
659
+ }
660
+ },
661
+ {
662
+ "name": "articles.setStatus",
663
+ "mode": "write",
664
+ "guide": "article",
665
+ "requiresPlan": true,
666
+ "description": "批量改文章的审核状态。不改文章内容,也不扣费。",
667
+ "inputSchema": {
668
+ "type": "object",
669
+ "properties": {
670
+ "articleIds": {
671
+ "type": "array",
672
+ "minItems": 1,
673
+ "items": {
674
+ "type": "integer",
675
+ "minimum": 1
676
+ },
677
+ "description": "要改的文章 id,一次可以给多个"
678
+ },
679
+ "status": {
680
+ "type": "integer",
681
+ "enum": [
682
+ 0,
683
+ 1,
684
+ 2
685
+ ],
686
+ "description": "0=待审核,1=已通过,2=已拒绝"
687
+ }
688
+ },
689
+ "required": [
690
+ "articleIds",
691
+ "status"
692
+ ],
693
+ "additionalProperties": false
694
+ }
695
+ },
545
696
  {
546
697
  "name": "knowledge.list",
547
698
  "mode": "read",
@@ -690,6 +841,51 @@
690
841
  "additionalProperties": false
691
842
  }
692
843
  },
844
+ {
845
+ "name": "knowledge.addFiles",
846
+ "mode": "write",
847
+ "guide": "knowledge",
848
+ "requiresPlan": true,
849
+ "description": "往一个已有知识库里再加文档。用户说「把这份资料补进 XX 知识库」时用它 —— 不要另建一个库,同一个主题散成好几个库反而让检索更差。按文档计费,执行时才扣。加进去要后台解析一会儿才检索得到。",
850
+ "inputSchema": {
851
+ "type": "object",
852
+ "properties": {
853
+ "knowledgeBaseId": {
854
+ "type": "integer",
855
+ "minimum": 1,
856
+ "description": "加到哪个知识库,来自 knowledge.list"
857
+ },
858
+ "files": {
859
+ "type": "array",
860
+ "description": "至少一个文档。每个文档扣一次费。",
861
+ "items": {
862
+ "type": "object",
863
+ "properties": {
864
+ "name": {
865
+ "type": "string",
866
+ "description": "文档名,展示用",
867
+ "maxLength": 255
868
+ },
869
+ "file": {
870
+ "type": "string",
871
+ "description": "可以是链接,也可以直接是整段正文文本"
872
+ }
873
+ },
874
+ "required": [
875
+ "name",
876
+ "file"
877
+ ],
878
+ "additionalProperties": false
879
+ }
880
+ }
881
+ },
882
+ "required": [
883
+ "knowledgeBaseId",
884
+ "files"
885
+ ],
886
+ "additionalProperties": false
887
+ }
888
+ },
693
889
  {
694
890
  "name": "images.list",
695
891
  "mode": "read",
@@ -2217,6 +2413,903 @@
2217
2413
  ],
2218
2414
  "additionalProperties": false
2219
2415
  }
2416
+ },
2417
+ {
2418
+ "name": "scheduledIndexing.answers",
2419
+ "mode": "read",
2420
+ "guide": "scheduled-monitor",
2421
+ "requiresPlan": false,
2422
+ "description": "定时收录:每一次提问的记录,含 AI 回答原文。metrics 只给数字(提及率、平均排名),这里给的是**AI 到底怎么说的**——要回答「豆包最近怎么评价我们」「它推荐了哪几家」就查这里。",
2423
+ "inputSchema": {
2424
+ "type": "object",
2425
+ "properties": {
2426
+ "planId": {
2427
+ "type": "integer",
2428
+ "minimum": 1,
2429
+ "description": "哪个计划"
2430
+ },
2431
+ "platform": {
2432
+ "type": "string",
2433
+ "description": "只看某个 AI 平台。取值来自 indexingPlatforms.list"
2434
+ },
2435
+ "topicId": {
2436
+ "type": "integer",
2437
+ "minimum": 1,
2438
+ "description": "只看某一条搜索问题"
2439
+ },
2440
+ "runId": {
2441
+ "type": "integer",
2442
+ "minimum": 1,
2443
+ "description": "只看某一次执行。不传就是跨所有执行"
2444
+ },
2445
+ "startDate": {
2446
+ "type": "string",
2447
+ "description": "起始日期,ISO 字符串,如 2026-08-01"
2448
+ },
2449
+ "endDate": {
2450
+ "type": "string",
2451
+ "description": "结束日期,ISO 字符串,如 2026-08-31"
2452
+ },
2453
+ "withContent": {
2454
+ "type": "boolean",
2455
+ "description": "要不要 AI 回答的全文。**默认不给**,只给前 200 字预览 —— 一条回答动辄上千字,一页 20 条就能把上下文占满。先看预览,确实要读全文再对那几条单独传 true"
2456
+ },
2457
+ "page": {
2458
+ "type": "integer",
2459
+ "default": 1,
2460
+ "description": "第几页"
2461
+ },
2462
+ "limit": {
2463
+ "type": "integer",
2464
+ "default": 20,
2465
+ "maximum": 100,
2466
+ "description": "每页几条"
2467
+ }
2468
+ },
2469
+ "required": [
2470
+ "planId"
2471
+ ],
2472
+ "additionalProperties": false
2473
+ }
2474
+ },
2475
+ {
2476
+ "name": "scheduledIndexing.citations",
2477
+ "mode": "read",
2478
+ "guide": "scheduled-monitor",
2479
+ "requiresPlan": false,
2480
+ "description": "定时收录:AI 答题时引用了哪些来源。channels 按站点聚合、contents 按具体网页聚合,各带次数与占比。这个直接回答「该往哪儿发内容」——AI 常引谁,就该去谁那儿发。",
2481
+ "inputSchema": {
2482
+ "type": "object",
2483
+ "properties": {
2484
+ "planId": {
2485
+ "type": "integer",
2486
+ "minimum": 1,
2487
+ "description": "哪个计划"
2488
+ },
2489
+ "aiPlatform": {
2490
+ "type": "string",
2491
+ "description": "只看某个 AI 平台。取值来自 indexingPlatforms.list"
2492
+ },
2493
+ "runId": {
2494
+ "type": "integer",
2495
+ "minimum": 1,
2496
+ "description": "只看某一次执行。不传就是跨所有执行"
2497
+ },
2498
+ "startDate": {
2499
+ "type": "string",
2500
+ "description": "起始日期,ISO 字符串,如 2026-08-01"
2501
+ },
2502
+ "endDate": {
2503
+ "type": "string",
2504
+ "description": "结束日期,ISO 字符串,如 2026-08-31"
2505
+ },
2506
+ "limit": {
2507
+ "type": "integer",
2508
+ "maximum": 100,
2509
+ "description": "最多给几条"
2510
+ }
2511
+ },
2512
+ "required": [
2513
+ "planId"
2514
+ ],
2515
+ "additionalProperties": false
2516
+ }
2517
+ },
2518
+ {
2519
+ "name": "scheduledIndexing.topicStats",
2520
+ "mode": "read",
2521
+ "guide": "scheduled-monitor",
2522
+ "requiresPlan": false,
2523
+ "description": "定时收录:按问题维度的表现——哪几句问出来有效果、哪几句一次都没提到我们。带提及率和被提到时的平均排名(越小越靠前)。用来决定下一轮该换掉哪些问题。",
2524
+ "inputSchema": {
2525
+ "type": "object",
2526
+ "properties": {
2527
+ "planId": {
2528
+ "type": "integer",
2529
+ "minimum": 1,
2530
+ "description": "哪个计划"
2531
+ },
2532
+ "platform": {
2533
+ "type": "string",
2534
+ "description": "只看某个 AI 平台。取值来自 indexingPlatforms.list"
2535
+ },
2536
+ "runId": {
2537
+ "type": "integer",
2538
+ "minimum": 1,
2539
+ "description": "只看某一次执行。不传就是跨所有执行"
2540
+ },
2541
+ "startDate": {
2542
+ "type": "string",
2543
+ "description": "起始日期,ISO 字符串,如 2026-08-01"
2544
+ },
2545
+ "endDate": {
2546
+ "type": "string",
2547
+ "description": "结束日期,ISO 字符串,如 2026-08-31"
2548
+ },
2549
+ "page": {
2550
+ "type": "integer",
2551
+ "default": 1,
2552
+ "description": "第几页"
2553
+ },
2554
+ "limit": {
2555
+ "type": "integer",
2556
+ "default": 20,
2557
+ "maximum": 100,
2558
+ "description": "每页几条"
2559
+ }
2560
+ },
2561
+ "required": [
2562
+ "planId"
2563
+ ],
2564
+ "additionalProperties": false
2565
+ }
2566
+ },
2567
+ {
2568
+ "name": "scheduledIndexing.topicPlatformMatrix",
2569
+ "mode": "read",
2570
+ "guide": "scheduled-monitor",
2571
+ "requiresPlan": false,
2572
+ "description": "定时收录:问题 × 平台矩阵,一眼看出哪个平台在哪个问题上提到了我们。每行还带这个问题下 AI 引到的媒体源。",
2573
+ "inputSchema": {
2574
+ "type": "object",
2575
+ "properties": {
2576
+ "planId": {
2577
+ "type": "integer",
2578
+ "minimum": 1,
2579
+ "description": "哪个计划"
2580
+ },
2581
+ "runId": {
2582
+ "type": "integer",
2583
+ "minimum": 1,
2584
+ "description": "只看某一次执行。不传就是跨所有执行"
2585
+ },
2586
+ "startDate": {
2587
+ "type": "string",
2588
+ "description": "起始日期,ISO 字符串,如 2026-08-01"
2589
+ },
2590
+ "endDate": {
2591
+ "type": "string",
2592
+ "description": "结束日期,ISO 字符串,如 2026-08-31"
2593
+ },
2594
+ "page": {
2595
+ "type": "integer",
2596
+ "default": 1,
2597
+ "description": "第几页"
2598
+ },
2599
+ "limit": {
2600
+ "type": "integer",
2601
+ "default": 20,
2602
+ "maximum": 100,
2603
+ "description": "每页几条"
2604
+ }
2605
+ },
2606
+ "required": [
2607
+ "planId"
2608
+ ],
2609
+ "additionalProperties": false
2610
+ }
2611
+ },
2612
+ {
2613
+ "name": "scheduledSentiment.answers",
2614
+ "mode": "read",
2615
+ "guide": "scheduled-monitor",
2616
+ "requiresPlan": false,
2617
+ "description": "定时舆情:每一次提问的记录,含 AI 回答原文。要回答「AI 具体是怎么评价我们的」就查这里,metrics 只给褒贬词的汇总。",
2618
+ "inputSchema": {
2619
+ "type": "object",
2620
+ "properties": {
2621
+ "planId": {
2622
+ "type": "integer",
2623
+ "minimum": 1,
2624
+ "description": "哪个计划"
2625
+ },
2626
+ "platform": {
2627
+ "type": "string",
2628
+ "description": "只看某个 AI 平台。取值来自 indexingPlatforms.list"
2629
+ },
2630
+ "question": {
2631
+ "type": "string",
2632
+ "description": "只看某一句问句"
2633
+ },
2634
+ "runId": {
2635
+ "type": "integer",
2636
+ "minimum": 1,
2637
+ "description": "只看某一次执行。不传就是跨所有执行"
2638
+ },
2639
+ "startDate": {
2640
+ "type": "string",
2641
+ "description": "起始日期,ISO 字符串,如 2026-08-01"
2642
+ },
2643
+ "endDate": {
2644
+ "type": "string",
2645
+ "description": "结束日期,ISO 字符串,如 2026-08-31"
2646
+ },
2647
+ "withContent": {
2648
+ "type": "boolean",
2649
+ "description": "要不要 AI 回答的全文。**默认不给**,只给前 200 字预览 —— 一条回答动辄上千字,一页 20 条就能把上下文占满。先看预览,确实要读全文再对那几条单独传 true"
2650
+ },
2651
+ "page": {
2652
+ "type": "integer",
2653
+ "default": 1,
2654
+ "description": "第几页"
2655
+ },
2656
+ "limit": {
2657
+ "type": "integer",
2658
+ "default": 20,
2659
+ "maximum": 100,
2660
+ "description": "每页几条"
2661
+ }
2662
+ },
2663
+ "required": [
2664
+ "planId"
2665
+ ],
2666
+ "additionalProperties": false
2667
+ }
2668
+ },
2669
+ {
2670
+ "name": "scheduledSentiment.citations",
2671
+ "mode": "read",
2672
+ "guide": "scheduled-monitor",
2673
+ "requiresPlan": false,
2674
+ "description": "定时舆情:AI 答题时引用了哪些来源。口径与收录那套相同。",
2675
+ "inputSchema": {
2676
+ "type": "object",
2677
+ "properties": {
2678
+ "planId": {
2679
+ "type": "integer",
2680
+ "minimum": 1,
2681
+ "description": "哪个计划"
2682
+ },
2683
+ "aiPlatform": {
2684
+ "type": "string",
2685
+ "description": "只看某个 AI 平台。取值来自 indexingPlatforms.list"
2686
+ },
2687
+ "runId": {
2688
+ "type": "integer",
2689
+ "minimum": 1,
2690
+ "description": "只看某一次执行。不传就是跨所有执行"
2691
+ },
2692
+ "startDate": {
2693
+ "type": "string",
2694
+ "description": "起始日期,ISO 字符串,如 2026-08-01"
2695
+ },
2696
+ "endDate": {
2697
+ "type": "string",
2698
+ "description": "结束日期,ISO 字符串,如 2026-08-31"
2699
+ },
2700
+ "limit": {
2701
+ "type": "integer",
2702
+ "maximum": 100,
2703
+ "description": "最多给几条"
2704
+ }
2705
+ },
2706
+ "required": [
2707
+ "planId"
2708
+ ],
2709
+ "additionalProperties": false
2710
+ }
2711
+ },
2712
+ {
2713
+ "name": "scheduledSentiment.topicStats",
2714
+ "mode": "read",
2715
+ "guide": "scheduled-monitor",
2716
+ "requiresPlan": false,
2717
+ "description": "定时舆情:问句 × 平台矩阵。注意它和收录的 topicStats **不是一回事**——舆情这边一行是一句问句加各平台的状态,没有提及率和排名那套数字。",
2718
+ "inputSchema": {
2719
+ "type": "object",
2720
+ "properties": {
2721
+ "planId": {
2722
+ "type": "integer",
2723
+ "minimum": 1,
2724
+ "description": "哪个计划"
2725
+ },
2726
+ "platform": {
2727
+ "type": "string",
2728
+ "description": "只看某个 AI 平台。取值来自 indexingPlatforms.list"
2729
+ },
2730
+ "runId": {
2731
+ "type": "integer",
2732
+ "minimum": 1,
2733
+ "description": "只看某一次执行。不传就是跨所有执行"
2734
+ },
2735
+ "startDate": {
2736
+ "type": "string",
2737
+ "description": "起始日期,ISO 字符串,如 2026-08-01"
2738
+ },
2739
+ "endDate": {
2740
+ "type": "string",
2741
+ "description": "结束日期,ISO 字符串,如 2026-08-31"
2742
+ },
2743
+ "page": {
2744
+ "type": "integer",
2745
+ "default": 1,
2746
+ "description": "第几页"
2747
+ },
2748
+ "limit": {
2749
+ "type": "integer",
2750
+ "default": 20,
2751
+ "maximum": 100,
2752
+ "description": "每页几条"
2753
+ }
2754
+ },
2755
+ "required": [
2756
+ "planId"
2757
+ ],
2758
+ "additionalProperties": false
2759
+ }
2760
+ },
2761
+ {
2762
+ "name": "scheduledSentiment.generateQuestions",
2763
+ "mode": "read",
2764
+ "guide": "scheduled-monitor",
2765
+ "requiresPlan": false,
2766
+ "description": "让 AI 想一批舆情问句。**不写库也不扣费**,所以是查询不是写操作——拿到候选之后,挑好的填进 scheduledSentiment.create 的 questions。项目必须先配好品牌词。",
2767
+ "inputSchema": {
2768
+ "type": "object",
2769
+ "properties": {
2770
+ "companyId": {
2771
+ "type": "integer",
2772
+ "minimum": 1,
2773
+ "description": "哪家公司"
2774
+ },
2775
+ "productId": {
2776
+ "type": "integer",
2777
+ "minimum": 1,
2778
+ "description": "哪个 GEO 项目,必须已配置品牌词"
2779
+ },
2780
+ "count": {
2781
+ "type": "integer",
2782
+ "minimum": 1,
2783
+ "maximum": 20,
2784
+ "default": 10,
2785
+ "description": "生成几条,1-20"
2786
+ }
2787
+ },
2788
+ "required": [
2789
+ "companyId",
2790
+ "productId"
2791
+ ],
2792
+ "additionalProperties": false
2793
+ }
2794
+ },
2795
+ {
2796
+ "name": "indexing.suggestCompetitors",
2797
+ "mode": "read",
2798
+ "guide": "scheduled-monitor",
2799
+ "requiresPlan": false,
2800
+ "description": "让 AI 推荐这家公司的竞品品牌名。**不写库也不扣费**。拿到之后挑几个填进 scheduledIndexing.create 的 competitorBrands。",
2801
+ "inputSchema": {
2802
+ "type": "object",
2803
+ "properties": {
2804
+ "companyId": {
2805
+ "type": "integer",
2806
+ "minimum": 1,
2807
+ "description": "哪家公司"
2808
+ }
2809
+ },
2810
+ "required": [
2811
+ "companyId"
2812
+ ],
2813
+ "additionalProperties": false
2814
+ }
2815
+ },
2816
+ {
2817
+ "name": "articles.generateSummaries",
2818
+ "mode": "write",
2819
+ "guide": "article",
2820
+ "requiresPlan": true,
2821
+ "description": "让 AI 给一篇文章生成几条摘要。**按次扣费**,所以要走确认。标题正文由服务端从库里读,不用你传。生成结果只回给你看,**不会自动写进文章**——用户认可之后再用 articles.update 存进去。",
2822
+ "inputSchema": {
2823
+ "type": "object",
2824
+ "properties": {
2825
+ "articleId": {
2826
+ "type": "integer",
2827
+ "minimum": 1,
2828
+ "description": "给哪篇文章生成。这篇必须已经有正文"
2829
+ }
2830
+ },
2831
+ "required": [
2832
+ "articleId"
2833
+ ],
2834
+ "additionalProperties": false
2835
+ }
2836
+ },
2837
+ {
2838
+ "name": "keywordTasks.list",
2839
+ "mode": "read",
2840
+ "guide": "question-task",
2841
+ "requiresPlan": false,
2842
+ "description": "列出关键词拓展任务,看跑到哪一步了。建完任务用它查状态——L1 要跑一会儿才出词。不含拓出来的词,要看结果用 keywordTasks.get。",
2843
+ "inputSchema": {
2844
+ "type": "object",
2845
+ "properties": {
2846
+ "companyId": {
2847
+ "type": "integer",
2848
+ "description": "只看某家公司;不传就是全部授权公司"
2849
+ },
2850
+ "productId": {
2851
+ "type": "integer",
2852
+ "description": "只看某个 GEO 项目"
2853
+ },
2854
+ "id": {
2855
+ "type": "integer",
2856
+ "description": "只看某一个任务"
2857
+ },
2858
+ "name": {
2859
+ "type": "string",
2860
+ "description": "按任务名前缀匹配"
2861
+ },
2862
+ "keyword": {
2863
+ "type": "string",
2864
+ "description": "按拓展起点词前缀匹配"
2865
+ },
2866
+ "stageStatus": {
2867
+ "type": "integer",
2868
+ "description": "按当前阶段的状态过滤。0=待处理,1=生成中,2=已完成,3=失败",
2869
+ "enum": [
2870
+ 0,
2871
+ 1,
2872
+ 2,
2873
+ 3
2874
+ ]
2875
+ },
2876
+ "page": {
2877
+ "type": "integer",
2878
+ "default": 1
2879
+ },
2880
+ "limit": {
2881
+ "type": "integer",
2882
+ "default": 20,
2883
+ "maximum": 100
2884
+ }
2885
+ },
2886
+ "additionalProperties": false
2887
+ }
2888
+ },
2889
+ {
2890
+ "name": "keywordTasks.get",
2891
+ "mode": "read",
2892
+ "guide": "question-task",
2893
+ "requiresPlan": false,
2894
+ "description": "读一个关键词拓展任务,含各阶段拓出来的词。要做 keywordTasks.expandL2 必须先读这一条——挑词传的就是 result[0].output 里的字符串。",
2895
+ "inputSchema": {
2896
+ "type": "object",
2897
+ "properties": {
2898
+ "taskId": {
2899
+ "type": "integer",
2900
+ "minimum": 1
2901
+ }
2902
+ },
2903
+ "required": [
2904
+ "taskId"
2905
+ ],
2906
+ "additionalProperties": false
2907
+ }
2908
+ },
2909
+ {
2910
+ "name": "keywordTasks.create",
2911
+ "mode": "write",
2912
+ "guide": "question-task",
2913
+ "requiresPlan": true,
2914
+ "description": "新建关键词多阶段拓展任务(L1)。和 questionTasks 不是一回事:那个一次性生成一批搜索问题,这个是分阶段的关键词树——先出 L1 一批词,用户挑几个,再拓 L2。按任务扣一次费,后面的 L2 不再扣。执行是异步的。",
2915
+ "inputSchema": {
2916
+ "type": "object",
2917
+ "properties": {
2918
+ "name": {
2919
+ "type": "string",
2920
+ "maxLength": 100,
2921
+ "description": "任务名"
2922
+ },
2923
+ "productId": {
2924
+ "type": "integer",
2925
+ "minimum": 1,
2926
+ "description": "归哪个 GEO 项目"
2927
+ },
2928
+ "keyword": {
2929
+ "type": "string",
2930
+ "description": "从哪个词拓开"
2931
+ },
2932
+ "count": {
2933
+ "type": "integer",
2934
+ "minimum": 1,
2935
+ "maximum": 50,
2936
+ "description": "要拓多少个词,1-50"
2937
+ },
2938
+ "userPrompt": {
2939
+ "type": "string",
2940
+ "maxLength": 500,
2941
+ "description": "给 AI 的额外要求,指导输出方向"
2942
+ }
2943
+ },
2944
+ "required": [
2945
+ "name",
2946
+ "productId",
2947
+ "keyword",
2948
+ "count"
2949
+ ],
2950
+ "additionalProperties": false
2951
+ }
2952
+ },
2953
+ {
2954
+ "name": "keywordTasks.updateL1",
2955
+ "mode": "write",
2956
+ "guide": "question-task",
2957
+ "requiresPlan": true,
2958
+ "description": "改写关键词拓展任务的 L1 结果——AI 出的词不满意时,直接把整批换成你要的。不扣费。改完再做 L2 拓展。",
2959
+ "inputSchema": {
2960
+ "type": "object",
2961
+ "properties": {
2962
+ "taskId": {
2963
+ "type": "integer",
2964
+ "minimum": 1,
2965
+ "description": "哪个任务"
2966
+ },
2967
+ "output": {
2968
+ "type": "array",
2969
+ "minItems": 1,
2970
+ "items": {
2971
+ "type": "string"
2972
+ },
2973
+ "description": "新的 L1 词表,整体覆盖"
2974
+ }
2975
+ },
2976
+ "required": [
2977
+ "taskId",
2978
+ "output"
2979
+ ],
2980
+ "additionalProperties": false
2981
+ }
2982
+ },
2983
+ {
2984
+ "name": "keywordTasks.expandL2",
2985
+ "mode": "write",
2986
+ "guide": "question-task",
2987
+ "requiresPlan": true,
2988
+ "description": "从 L1 结果里挑几个词,拓展到 L2。不扣费,但**只能做一次**——重复触发会覆盖已经跑出来的 L3 结果,服务端会直接拒绝。挑词之前先跟用户确认清楚。",
2989
+ "inputSchema": {
2990
+ "type": "object",
2991
+ "properties": {
2992
+ "taskId": {
2993
+ "type": "integer",
2994
+ "minimum": 1,
2995
+ "description": "哪个任务"
2996
+ },
2997
+ "selected": {
2998
+ "type": "array",
2999
+ "minItems": 1,
3000
+ "items": {
3001
+ "type": "string"
3002
+ },
3003
+ "description": "从 L1 结果里挑中的词"
3004
+ },
3005
+ "count": {
3006
+ "type": "integer",
3007
+ "minimum": 1,
3008
+ "maximum": 50,
3009
+ "description": "每个词拓多少,1-50"
3010
+ },
3011
+ "userPrompt": {
3012
+ "type": "string",
3013
+ "maxLength": 500,
3014
+ "description": "给 AI 的额外要求,指导输出方向"
3015
+ }
3016
+ },
3017
+ "required": [
3018
+ "taskId",
3019
+ "selected",
3020
+ "count"
3021
+ ],
3022
+ "additionalProperties": false
3023
+ }
3024
+ },
3025
+ {
3026
+ "name": "tags.list",
3027
+ "mode": "read",
3028
+ "guide": "article",
3029
+ "requiresPlan": false,
3030
+ "description": "某个域下已经用过的标签清单。要按标签筛选、或者给新内容打标签时先查这里——用已有的标签,别每次造新词,不然标签体系很快就散了。",
3031
+ "inputSchema": {
3032
+ "type": "object",
3033
+ "properties": {
3034
+ "domain": {
3035
+ "type": "string",
3036
+ "enum": [
3037
+ "article",
3038
+ "knowledge",
3039
+ "image",
3040
+ "video",
3041
+ "prompt",
3042
+ "question"
3043
+ ],
3044
+ "description": "查哪个域的标签:article=文章,knowledge=知识库,image=图片,video=视频,prompt=提示词,question=搜索问题"
3045
+ },
3046
+ "companyId": {
3047
+ "type": "integer",
3048
+ "minimum": 1,
3049
+ "description": "只看某家公司的"
3050
+ },
3051
+ "productId": {
3052
+ "type": "integer",
3053
+ "minimum": 1,
3054
+ "description": "只看某个 GEO 项目的"
3055
+ }
3056
+ },
3057
+ "required": [
3058
+ "domain"
3059
+ ],
3060
+ "additionalProperties": false
3061
+ }
3062
+ },
3063
+ {
3064
+ "name": "prompts.create",
3065
+ "mode": "write",
3066
+ "guide": "article",
3067
+ "requiresPlan": true,
3068
+ "description": "新建提示词(写作模板)。只能建「文章正文」和「文章标题」两类——和 prompts.list 同口径,建了别的类型你自己也查不到。建出来不扣费,也不会自动用到任何文章上。",
3069
+ "inputSchema": {
3070
+ "type": "object",
3071
+ "properties": {
3072
+ "name": {
3073
+ "type": "string",
3074
+ "maxLength": 100,
3075
+ "description": "提示词名称"
3076
+ },
3077
+ "companyId": {
3078
+ "type": "integer",
3079
+ "minimum": 1,
3080
+ "description": "归哪家公司"
3081
+ },
3082
+ "productId": {
3083
+ "type": "integer",
3084
+ "minimum": 1,
3085
+ "description": "可选:绑定到某个 GEO 项目下"
3086
+ },
3087
+ "content": {
3088
+ "type": "string",
3089
+ "maxLength": 20000,
3090
+ "description": "提示词正文"
3091
+ },
3092
+ "negativeContent": {
3093
+ "type": "string",
3094
+ "description": "反向提示词:不希望 AI 怎么写"
3095
+ },
3096
+ "tags": {
3097
+ "type": "array",
3098
+ "items": {
3099
+ "type": "string"
3100
+ },
3101
+ "description": "标签,取值先查 tags.list"
3102
+ },
3103
+ "type": {
3104
+ "type": "integer",
3105
+ "enum": [
3106
+ 1,
3107
+ 2
3108
+ ],
3109
+ "description": "1=文章正文,2=文章标题"
3110
+ }
3111
+ },
3112
+ "required": [
3113
+ "name",
3114
+ "companyId",
3115
+ "content",
3116
+ "type"
3117
+ ],
3118
+ "additionalProperties": false
3119
+ }
3120
+ },
3121
+ {
3122
+ "name": "prompts.update",
3123
+ "mode": "write",
3124
+ "guide": "article",
3125
+ "requiresPlan": true,
3126
+ "description": "改一条提示词,只传要改的字段。改不了所属公司和项目。**系统内置的公共模板改不了**——要按自己的写法调整,用 prompts.create 复制一份新建。不扣费。",
3127
+ "inputSchema": {
3128
+ "type": "object",
3129
+ "properties": {
3130
+ "promptId": {
3131
+ "type": "integer",
3132
+ "minimum": 1,
3133
+ "description": "改哪条"
3134
+ },
3135
+ "name": {
3136
+ "type": "string",
3137
+ "maxLength": 100
3138
+ },
3139
+ "content": {
3140
+ "type": "string",
3141
+ "maxLength": 20000
3142
+ },
3143
+ "negativeContent": {
3144
+ "type": "string"
3145
+ },
3146
+ "tags": {
3147
+ "type": "array",
3148
+ "items": {
3149
+ "type": "string"
3150
+ }
3151
+ },
3152
+ "type": {
3153
+ "type": "integer",
3154
+ "enum": [
3155
+ 1,
3156
+ 2
3157
+ ],
3158
+ "description": "1=文章正文,2=文章标题"
3159
+ }
3160
+ },
3161
+ "required": [
3162
+ "promptId"
3163
+ ],
3164
+ "additionalProperties": false
3165
+ }
3166
+ },
3167
+ {
3168
+ "name": "articles.copy",
3169
+ "mode": "write",
3170
+ "guide": "article",
3171
+ "requiresPlan": true,
3172
+ "description": "复制一篇文章。复制出来的是一篇独立的新文章,**按新建文章扣一次费**,执行时才扣。改副本不影响原文。想「照着这篇再写一篇」时用它。",
3173
+ "inputSchema": {
3174
+ "type": "object",
3175
+ "properties": {
3176
+ "articleId": {
3177
+ "type": "integer",
3178
+ "minimum": 1,
3179
+ "description": "复制哪一篇"
3180
+ }
3181
+ },
3182
+ "required": [
3183
+ "articleId"
3184
+ ],
3185
+ "additionalProperties": false
3186
+ }
3187
+ },
3188
+ {
3189
+ "name": "companies.delete",
3190
+ "mode": "write",
3191
+ "guide": "company",
3192
+ "requiresPlan": true,
3193
+ "description": "删除公司。**连带删掉它下面全部 GEO 项目、文章、知识库和素材,不可恢复**。而且如果这是当前密钥唯一授权的公司,密钥会被一并撤销、这台机器上的 CLI 就用不了了。删之前一定要把摘要念给用户听。",
3194
+ "inputSchema": {
3195
+ "type": "object",
3196
+ "properties": {
3197
+ "id": {
3198
+ "type": "integer",
3199
+ "minimum": 1,
3200
+ "description": "要删哪一条"
3201
+ }
3202
+ },
3203
+ "required": [
3204
+ "id"
3205
+ ],
3206
+ "additionalProperties": false
3207
+ }
3208
+ },
3209
+ {
3210
+ "name": "products.delete",
3211
+ "mode": "write",
3212
+ "guide": "product",
3213
+ "requiresPlan": true,
3214
+ "description": "删除 GEO 项目。连带删掉它下面的文章、搜索问题和定时计划,**不可恢复**。",
3215
+ "inputSchema": {
3216
+ "type": "object",
3217
+ "properties": {
3218
+ "id": {
3219
+ "type": "integer",
3220
+ "minimum": 1,
3221
+ "description": "要删哪一条"
3222
+ }
3223
+ },
3224
+ "required": [
3225
+ "id"
3226
+ ],
3227
+ "additionalProperties": false
3228
+ }
3229
+ },
3230
+ {
3231
+ "name": "questions.delete",
3232
+ "mode": "write",
3233
+ "guide": "question",
3234
+ "requiresPlan": true,
3235
+ "description": "删除搜索问题。已经跑出来的收录记录不受影响,只是这个问题以后不再被问。",
3236
+ "inputSchema": {
3237
+ "type": "object",
3238
+ "properties": {
3239
+ "id": {
3240
+ "type": "integer",
3241
+ "minimum": 1,
3242
+ "description": "要删哪一条"
3243
+ }
3244
+ },
3245
+ "required": [
3246
+ "id"
3247
+ ],
3248
+ "additionalProperties": false
3249
+ }
3250
+ },
3251
+ {
3252
+ "name": "articles.delete",
3253
+ "mode": "write",
3254
+ "guide": "article",
3255
+ "requiresPlan": true,
3256
+ "description": "删除文章。删了就没了,**不可恢复**。已经发布出去的内容不受影响。",
3257
+ "inputSchema": {
3258
+ "type": "object",
3259
+ "properties": {
3260
+ "id": {
3261
+ "type": "integer",
3262
+ "minimum": 1,
3263
+ "description": "要删哪一条"
3264
+ }
3265
+ },
3266
+ "required": [
3267
+ "id"
3268
+ ],
3269
+ "additionalProperties": false
3270
+ }
3271
+ },
3272
+ {
3273
+ "name": "knowledge.delete",
3274
+ "mode": "write",
3275
+ "guide": "knowledge",
3276
+ "requiresPlan": true,
3277
+ "description": "删除知识库。库里文档一起删掉,**不可恢复**。绑定了这个库的搜索问题会失去这份资料。",
3278
+ "inputSchema": {
3279
+ "type": "object",
3280
+ "properties": {
3281
+ "id": {
3282
+ "type": "integer",
3283
+ "minimum": 1,
3284
+ "description": "要删哪一条"
3285
+ }
3286
+ },
3287
+ "required": [
3288
+ "id"
3289
+ ],
3290
+ "additionalProperties": false
3291
+ }
3292
+ },
3293
+ {
3294
+ "name": "prompts.delete",
3295
+ "mode": "write",
3296
+ "guide": "article",
3297
+ "requiresPlan": true,
3298
+ "description": "删除提示词。已经用它生成过的文章不受影响。系统内置的公共模板删不了。",
3299
+ "inputSchema": {
3300
+ "type": "object",
3301
+ "properties": {
3302
+ "id": {
3303
+ "type": "integer",
3304
+ "minimum": 1,
3305
+ "description": "要删哪一条"
3306
+ }
3307
+ },
3308
+ "required": [
3309
+ "id"
3310
+ ],
3311
+ "additionalProperties": false
3312
+ }
2220
3313
  }
2221
3314
  ]
2222
3315
  }