Commit 4e36a23
fix: sanitize non-identifier field names in MCP/OpenAPI tool schemas
MCP / OpenAPI 工具的 JSON Schema 经常包含含 `-` 的字段名 (如
`x-access-id`、`api-version`)、Python 保留字 (`class`、`from`) 或数字开头
的字段。Pydantic 接受这类字段名, 但下游 `inspect.Parameter` 会抛
ValueError 导致整个工具加载失败、被静默丢弃。
本提交把 JSON Schema → Pydantic 的转换层加上字段名 sanitizer:
内部用合法 Python 标识符做 Pydantic 字段名 (`x_access_id`), 通过
`alias` 同时保留原名给 JSON Schema 输出和 MCP 调用使用。配合
`populate_by_name=True`, 两种写法都能验证通过, `model_dump(by_alias=True)`
确保实际下发到 MCP backend 的字段名仍是原始名 `x-access-id`。
同步给 `_create_function_with_signature` 的 alias 循环加上防御性 sanitize,
避免未来扩展 `__agentrun_argument_aliases__` 时再次踩坑。
新增 13 个回归测试覆盖: 含 `-` / `.` 的字段名、数字开头、保留字 (`class`)、
空串、`_build_tool_from_meta` 端到端链路、alias 循环防御。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 1435314 commit 4e36a23
2 files changed
Lines changed: 225 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| 44 | + | |
44 | 45 | | |
45 | 46 | | |
46 | 47 | | |
| |||
1396 | 1397 | | |
1397 | 1398 | | |
1398 | 1399 | | |
| 1400 | + | |
1399 | 1401 | | |
1400 | 1402 | | |
1401 | 1403 | | |
| |||
1408 | 1410 | | |
1409 | 1411 | | |
1410 | 1412 | | |
| 1413 | + | |
| 1414 | + | |
| 1415 | + | |
| 1416 | + | |
| 1417 | + | |
| 1418 | + | |
| 1419 | + | |
| 1420 | + | |
| 1421 | + | |
| 1422 | + | |
| 1423 | + | |
1411 | 1424 | | |
1412 | 1425 | | |
1413 | | - | |
| 1426 | + | |
1414 | 1427 | | |
1415 | 1428 | | |
1416 | 1429 | | |
| |||
1425 | 1438 | | |
1426 | 1439 | | |
1427 | 1440 | | |
1428 | | - | |
| 1441 | + | |
| 1442 | + | |
| 1443 | + | |
1429 | 1444 | | |
1430 | 1445 | | |
1431 | 1446 | | |
| |||
1674 | 1689 | | |
1675 | 1690 | | |
1676 | 1691 | | |
| 1692 | + | |
| 1693 | + | |
| 1694 | + | |
| 1695 | + | |
| 1696 | + | |
| 1697 | + | |
| 1698 | + | |
| 1699 | + | |
| 1700 | + | |
| 1701 | + | |
| 1702 | + | |
| 1703 | + | |
| 1704 | + | |
| 1705 | + | |
| 1706 | + | |
| 1707 | + | |
| 1708 | + | |
| 1709 | + | |
| 1710 | + | |
| 1711 | + | |
| 1712 | + | |
| 1713 | + | |
| 1714 | + | |
| 1715 | + | |
| 1716 | + | |
| 1717 | + | |
| 1718 | + | |
1677 | 1719 | | |
1678 | 1720 | | |
1679 | 1721 | | |
| |||
1688 | 1730 | | |
1689 | 1731 | | |
1690 | 1732 | | |
| 1733 | + | |
| 1734 | + | |
1691 | 1735 | | |
1692 | 1736 | | |
1693 | 1737 | | |
1694 | 1738 | | |
1695 | 1739 | | |
| 1740 | + | |
| 1741 | + | |
| 1742 | + | |
| 1743 | + | |
| 1744 | + | |
| 1745 | + | |
| 1746 | + | |
| 1747 | + | |
| 1748 | + | |
| 1749 | + | |
| 1750 | + | |
| 1751 | + | |
| 1752 | + | |
| 1753 | + | |
| 1754 | + | |
| 1755 | + | |
| 1756 | + | |
| 1757 | + | |
1696 | 1758 | | |
1697 | 1759 | | |
1698 | 1760 | | |
1699 | 1761 | | |
1700 | 1762 | | |
1701 | 1763 | | |
| 1764 | + | |
| 1765 | + | |
| 1766 | + | |
| 1767 | + | |
| 1768 | + | |
1702 | 1769 | | |
1703 | 1770 | | |
1704 | 1771 | | |
1705 | | - | |
1706 | | - | |
1707 | | - | |
| 1772 | + | |
| 1773 | + | |
| 1774 | + | |
| 1775 | + | |
| 1776 | + | |
| 1777 | + | |
| 1778 | + | |
1708 | 1779 | | |
1709 | 1780 | | |
1710 | 1781 | | |
1711 | 1782 | | |
1712 | | - | |
| 1783 | + | |
1713 | 1784 | | |
1714 | 1785 | | |
1715 | 1786 | | |
1716 | 1787 | | |
1717 | | - | |
| 1788 | + | |
1718 | 1789 | | |
1719 | 1790 | | |
1720 | 1791 | | |
1721 | 1792 | | |
1722 | 1793 | | |
1723 | 1794 | | |
1724 | | - | |
| 1795 | + | |
| 1796 | + | |
| 1797 | + | |
| 1798 | + | |
| 1799 | + | |
| 1800 | + | |
1725 | 1801 | | |
1726 | 1802 | | |
1727 | 1803 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
| 14 | + | |
13 | 15 | | |
| 16 | + | |
14 | 17 | | |
15 | 18 | | |
16 | 19 | | |
| 20 | + | |
17 | 21 | | |
18 | 22 | | |
19 | 23 | | |
| |||
702 | 706 | | |
703 | 707 | | |
704 | 708 | | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + | |
| 770 | + | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + | |
| 803 | + | |
| 804 | + | |
| 805 | + | |
| 806 | + | |
| 807 | + | |
| 808 | + | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
| 812 | + | |
| 813 | + | |
| 814 | + | |
| 815 | + | |
| 816 | + | |
| 817 | + | |
| 818 | + | |
| 819 | + | |
| 820 | + | |
| 821 | + | |
| 822 | + | |
| 823 | + | |
| 824 | + | |
| 825 | + | |
| 826 | + | |
| 827 | + | |
| 828 | + | |
| 829 | + | |
| 830 | + | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + | |
| 836 | + | |
| 837 | + | |
| 838 | + | |
| 839 | + | |
| 840 | + | |
| 841 | + | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
0 commit comments