golf-mcp 0.1.19__py3-none-any.whl → 0.2.0__py3-none-any.whl

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.

Potentially problematic release.


This version of golf-mcp might be problematic. Click here for more details.

Files changed (123) hide show
  1. golf/__init__.py +9 -1
  2. golf/_endpoints.py +6 -0
  3. golf/_endpoints_fallback.py +10 -0
  4. golf/auth/__init__.py +188 -84
  5. golf/auth/api_key.py +6 -14
  6. golf/auth/factory.py +333 -0
  7. golf/auth/helpers.py +12 -42
  8. golf/auth/providers.py +396 -0
  9. golf/auth/registry.py +256 -0
  10. golf/cli/branding.py +192 -0
  11. golf/cli/main.py +28 -69
  12. golf/commands/__init__.py +2 -0
  13. golf/commands/build.py +4 -7
  14. golf/commands/init.py +30 -53
  15. golf/commands/run.py +50 -20
  16. golf/core/builder.py +356 -412
  17. golf/core/builder_auth.py +63 -144
  18. golf/core/builder_telemetry.py +26 -3
  19. golf/core/config.py +38 -59
  20. golf/core/parser.py +132 -139
  21. golf/core/platform.py +12 -10
  22. golf/core/telemetry.py +11 -19
  23. golf/core/transformer.py +38 -15
  24. golf/examples/__pycache__/__init__.cpython-311.pyc +0 -0
  25. golf/examples/basic/.coverage +0 -0
  26. golf/examples/basic/.env.example +8 -4
  27. golf/examples/basic/README.md +117 -45
  28. golf/examples/basic/__pycache__/auth.cpython-311.pyc +0 -0
  29. golf/examples/basic/auth.py +76 -0
  30. golf/examples/basic/golf.json +2 -5
  31. golf/examples/basic/htmlcov/.gitignore +2 -0
  32. golf/examples/basic/htmlcov/class_index.html +547 -0
  33. golf/examples/basic/htmlcov/coverage_html_cb_6fb7b396.js +733 -0
  34. golf/examples/basic/htmlcov/favicon_32_cb_58284776.png +0 -0
  35. golf/examples/basic/htmlcov/function_index.html +2091 -0
  36. golf/examples/basic/htmlcov/index.html +349 -0
  37. golf/examples/basic/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  38. golf/examples/basic/htmlcov/status.json +1 -0
  39. golf/examples/basic/htmlcov/style_cb_8e611ae1.css +337 -0
  40. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496___init___py.html +323 -0
  41. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_api_key_py.html +170 -0
  42. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_factory_py.html +430 -0
  43. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_helpers_py.html +288 -0
  44. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_providers_py.html +493 -0
  45. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_registry_py.html +353 -0
  46. golf/examples/basic/htmlcov/z_3ec3b3f490dc0950___init___py.html +120 -0
  47. golf/examples/basic/htmlcov/z_3ec3b3f490dc0950_instrumentation_py.html +1535 -0
  48. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db___init___py.html +98 -0
  49. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db_branding_py.html +289 -0
  50. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db_main_py.html +476 -0
  51. golf/examples/basic/htmlcov/z_5a6c4e6bcc86fb2f___init___py.html +97 -0
  52. golf/examples/basic/htmlcov/z_6cadab9ec0df475d___init___py.html +102 -0
  53. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_build_py.html +178 -0
  54. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_init_py.html +387 -0
  55. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_run_py.html +222 -0
  56. golf/examples/basic/htmlcov/z_6fcdee0582ba84e4___init___py.html +106 -0
  57. golf/examples/basic/htmlcov/z_6fcdee0582ba84e4__endpoints_fallback_py.html +107 -0
  58. golf/examples/basic/htmlcov/z_7ba499ed22986217___init___py.html +98 -0
  59. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_auth_py.html +306 -0
  60. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_metrics_py.html +329 -0
  61. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_py.html +1471 -0
  62. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_telemetry_py.html +186 -0
  63. golf/examples/basic/htmlcov/z_7ba499ed22986217_config_py.html +315 -0
  64. golf/examples/basic/htmlcov/z_7ba499ed22986217_parser_py.html +1149 -0
  65. golf/examples/basic/htmlcov/z_7ba499ed22986217_platform_py.html +279 -0
  66. golf/examples/basic/htmlcov/z_7ba499ed22986217_telemetry_py.html +589 -0
  67. golf/examples/basic/htmlcov/z_7ba499ed22986217_transformer_py.html +286 -0
  68. golf/examples/basic/htmlcov/z_7d7da37693a43688___init___py.html +107 -0
  69. golf/examples/basic/htmlcov/z_7d7da37693a43688_collector_py.html +417 -0
  70. golf/examples/basic/htmlcov/z_7d7da37693a43688_registry_py.html +109 -0
  71. golf/examples/basic/htmlcov/z_abe733142b40ad4e___init___py.html +109 -0
  72. golf/examples/basic/htmlcov/z_abe733142b40ad4e_context_py.html +150 -0
  73. golf/examples/basic/htmlcov/z_abe733142b40ad4e_elicitation_py.html +267 -0
  74. golf/examples/basic/htmlcov/z_abe733142b40ad4e_sampling_py.html +318 -0
  75. golf/examples/basic/prompts/__pycache__/welcome.cpython-311.pyc +0 -0
  76. golf/examples/basic/prompts/welcome.py +3 -5
  77. golf/examples/basic/resources/__pycache__/current_time.cpython-311.pyc +0 -0
  78. golf/examples/basic/resources/__pycache__/info.cpython-311.pyc +0 -0
  79. golf/examples/basic/resources/current_time.py +5 -13
  80. golf/examples/basic/resources/weather/__pycache__/common.cpython-311.pyc +0 -0
  81. golf/examples/basic/resources/weather/__pycache__/current.cpython-311.pyc +0 -0
  82. golf/examples/basic/resources/weather/__pycache__/forecast.cpython-311.pyc +0 -0
  83. golf/examples/basic/resources/weather/city.py +46 -0
  84. golf/examples/basic/resources/weather/common.py +4 -11
  85. golf/examples/basic/resources/weather/current.py +5 -5
  86. golf/examples/basic/resources/weather/forecast.py +5 -5
  87. golf/examples/basic/tools/__pycache__/calculator.cpython-311.pyc +0 -0
  88. golf/examples/basic/tools/calculator.py +94 -0
  89. golf/examples/basic/tools/say/__pycache__/hello.cpython-311.pyc +0 -0
  90. golf/examples/basic/tools/say/hello.py +65 -0
  91. golf/metrics/collector.py +100 -19
  92. golf/telemetry/__init__.py +4 -0
  93. golf/telemetry/instrumentation.py +496 -174
  94. golf/utilities/__init__.py +12 -0
  95. golf/utilities/context.py +53 -0
  96. golf/utilities/elicitation.py +170 -0
  97. golf/utilities/sampling.py +221 -0
  98. {golf_mcp-0.1.19.dist-info → golf_mcp-0.2.0.dist-info}/METADATA +56 -110
  99. golf_mcp-0.2.0.dist-info/RECORD +110 -0
  100. golf/auth/oauth.py +0 -861
  101. golf/auth/provider.py +0 -115
  102. golf/examples/api_key/.env +0 -2
  103. golf/examples/api_key/.env.example +0 -1
  104. golf/examples/api_key/README.md +0 -84
  105. golf/examples/api_key/golf.json +0 -8
  106. golf/examples/api_key/pre_build.py +0 -11
  107. golf/examples/api_key/tools/issues/create.py +0 -93
  108. golf/examples/api_key/tools/issues/list.py +0 -92
  109. golf/examples/api_key/tools/repos/list.py +0 -111
  110. golf/examples/api_key/tools/search/code.py +0 -106
  111. golf/examples/api_key/tools/users/get.py +0 -82
  112. golf/examples/basic/.env +0 -5
  113. golf/examples/basic/pre_build.py +0 -28
  114. golf/examples/basic/tools/github_user.py +0 -65
  115. golf/examples/basic/tools/hello.py +0 -34
  116. golf/examples/basic/tools/payments/charge.py +0 -70
  117. golf/examples/basic/tools/payments/common.py +0 -36
  118. golf/examples/basic/tools/payments/refund.py +0 -61
  119. golf_mcp-0.1.19.dist-info/RECORD +0 -60
  120. {golf_mcp-0.1.19.dist-info → golf_mcp-0.2.0.dist-info}/WHEEL +0 -0
  121. {golf_mcp-0.1.19.dist-info → golf_mcp-0.2.0.dist-info}/entry_points.txt +0 -0
  122. {golf_mcp-0.1.19.dist-info → golf_mcp-0.2.0.dist-info}/licenses/LICENSE +0 -0
  123. {golf_mcp-0.1.19.dist-info → golf_mcp-0.2.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,318 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for /Users/antonigmitruk/golf/src/golf/utilities/sampling.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_58284776.png">
7
+ <link rel="stylesheet" href="style_cb_8e611ae1.css" type="text/css">
8
+ <script src="coverage_html_cb_6fb7b396.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>/Users/antonigmitruk/golf/src/golf/utilities/sampling.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_ce680311.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">39 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">39<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_abe733142b40ad4e_elicitation_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="index.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.6.12">coverage.py v7.6.12</a>,
68
+ created at 2025-08-16 18:46 +0200
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""Sampling utilities for Golf MCP tools.</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="str">This module provides simplified LLM sampling functions that Golf tool authors</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="str">can use without needing to manage FastMCP Context objects directly.</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Any</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">collections</span><span class="op">.</span><span class="nam">abc</span> <span class="key">import</span> <span class="nam">Callable</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
92
+ <p class="mis show_mis"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="op">.</span><span class="nam">context</span> <span class="key">import</span> <span class="nam">get_current_context</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="com"># Apply telemetry instrumentation if available</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="mis show_mis"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">telemetry</span> <span class="key">import</span> <span class="nam">instrument_sampling</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
98
+ <p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="nam">_instrumentation_available</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">except</span> <span class="nam">ImportError</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">_instrumentation_available</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">def</span> <span class="nam">instrument_sampling</span><span class="op">(</span><span class="nam">func</span><span class="op">:</span> <span class="nam">Callable</span><span class="op">,</span> <span class="nam">sampling_type</span><span class="op">:</span> <span class="nam">str</span> <span class="op">=</span> <span class="str">"sample"</span><span class="op">)</span> <span class="op">-></span> <span class="nam">Callable</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="str">"""No-op instrumentation when telemetry is not available."""</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">return</span> <span class="nam">func</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="key">async</span> <span class="key">def</span> <span class="nam">sample</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">messages</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">system_prompt</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">temperature</span><span class="op">:</span> <span class="nam">float</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">max_tokens</span><span class="op">:</span> <span class="nam">int</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">model_preferences</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="str">"""Request an LLM completion from the MCP client.</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="str"> This is a simplified wrapper around FastMCP's Context.sample() method</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"><span class="str"> that automatically handles context retrieval and response processing.</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"><span class="str"> messages: The message(s) to send to the LLM:</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="str"> - str: Single user message</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"><span class="str"> - list[str]: Multiple user messages</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"><span class="str"> system_prompt: Optional system prompt to guide the LLM</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="str"> temperature: Optional temperature for sampling (0.0 to 1.0)</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"><span class="str"> max_tokens: Optional maximum tokens to generate (default: 512)</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"><span class="str"> model_preferences: Optional model preferences:</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"><span class="str"> - str: Single model name hint</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"><span class="str"> - list[str]: Multiple model name hints in preference order</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
130
+ <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"><span class="str"> The LLM's response as a string</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"><span class="str"> Raises:</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"><span class="str"> RuntimeError: If called outside MCP context or sampling fails</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"><span class="str"> ValueError: If parameters are invalid</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="str"> Examples:</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"><span class="str"> ```python</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="str"> from golf.utilities import sample</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"><span class="str"> async def analyze_data(data: str):</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"><span class="str"> # Simple completion</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"><span class="str"> analysis = await sample(f"Analyze this data: {data}")</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
145
+ <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"><span class="str"> # With system prompt and temperature</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"><span class="str"> creative_response = await sample(</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"><span class="str"> "Write a creative story about this data",</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"><span class="str"> system_prompt="You are a creative writer",</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"><span class="str"> temperature=0.8,</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"><span class="str"> max_tokens=1000</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"><span class="str"> )</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
153
+ <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"><span class="str"> # With model preferences</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"><span class="str"> technical_analysis = await sample(</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"><span class="str"> f"Provide technical analysis: {data}",</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"><span class="str"> model_preferences=["gpt-4", "claude-3-sonnet"]</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"><span class="str"> )</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
159
+ <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"><span class="str"> return {</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"><span class="str"> "analysis": analysis,</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"><span class="str"> "creative": creative_response,</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"><span class="str"> "technical": technical_analysis</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"><span class="str"> }</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"><span class="str"> ```</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="com"># Get the current FastMCP context</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">ctx</span> <span class="op">=</span> <span class="nam">get_current_context</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
170
+ <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="com"># Call the context's sample method</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="key">await</span> <span class="nam">ctx</span><span class="op">.</span><span class="nam">sample</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="nam">messages</span><span class="op">=</span><span class="nam">messages</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">system_prompt</span><span class="op">=</span><span class="nam">system_prompt</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">temperature</span><span class="op">=</span><span class="nam">temperature</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">max_tokens</span><span class="op">=</span><span class="nam">max_tokens</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">model_preferences</span><span class="op">=</span><span class="nam">model_preferences</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
178
+ <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
179
+ <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="com"># Extract text content from the ContentBlock response</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="key">if</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">result</span><span class="op">,</span> <span class="str">"text"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="key">return</span> <span class="nam">result</span><span class="op">.</span><span class="nam">text</span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="key">elif</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">result</span><span class="op">,</span> <span class="str">"content"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="com"># Handle different content block types</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">result</span><span class="op">.</span><span class="nam">content</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">return</span> <span class="nam">result</span><span class="op">.</span><span class="nam">content</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">elif</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">result</span><span class="op">.</span><span class="nam">content</span><span class="op">,</span> <span class="str">"text"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">return</span> <span class="nam">result</span><span class="op">.</span><span class="nam">content</span><span class="op">.</span><span class="nam">text</span>&nbsp;</span><span class="r"></span></p>
188
+ <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">return</span> <span class="nam">str</span><span class="op">(</span><span class="nam">result</span><span class="op">.</span><span class="nam">content</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="key">return</span> <span class="nam">str</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
193
+ <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="key">raise</span> <span class="nam">RuntimeError</span><span class="op">(</span><span class="str">f"LLM sampling failed: {str(e)}"</span><span class="op">)</span> <span class="key">from</span> <span class="nam">e</span>&nbsp;</span><span class="r"></span></p>
195
+ <p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
196
+ <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
197
+ <p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"><span class="key">async</span> <span class="key">def</span> <span class="nam">sample_structured</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
198
+ <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">messages</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
199
+ <p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="nam">format_instructions</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
200
+ <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">system_prompt</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
201
+ <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">temperature</span><span class="op">:</span> <span class="nam">float</span> <span class="op">=</span> <span class="num">0.1</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">max_tokens</span><span class="op">:</span> <span class="nam">int</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
203
+ <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
204
+ <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="str">"""Request a structured LLM completion with specific formatting.</span>&nbsp;</span><span class="r"></span></p>
205
+ <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
206
+ <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"><span class="str"> This is a convenience function for requesting structured responses</span>&nbsp;</span><span class="r"></span></p>
207
+ <p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"><span class="str"> like JSON, XML, or other formatted output.</span>&nbsp;</span><span class="r"></span></p>
208
+ <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
209
+ <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
210
+ <p class="pln"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"><span class="str"> messages: The message(s) to send to the LLM</span>&nbsp;</span><span class="r"></span></p>
211
+ <p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"><span class="str"> format_instructions: Instructions for the desired output format</span>&nbsp;</span><span class="r"></span></p>
212
+ <p class="pln"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"><span class="str"> system_prompt: Optional system prompt</span>&nbsp;</span><span class="r"></span></p>
213
+ <p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"><span class="str"> temperature: Temperature for sampling (default: 0.1 for consistency)</span>&nbsp;</span><span class="r"></span></p>
214
+ <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"><span class="str"> max_tokens: Optional maximum tokens to generate</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
216
+ <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
217
+ <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"><span class="str"> The structured LLM response as a string</span>&nbsp;</span><span class="r"></span></p>
218
+ <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
219
+ <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"><span class="str"> Example:</span>&nbsp;</span><span class="r"></span></p>
220
+ <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"><span class="str"> ```python</span>&nbsp;</span><span class="r"></span></p>
221
+ <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"><span class="str"> from golf.utilities import sample_structured</span>&nbsp;</span><span class="r"></span></p>
222
+ <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
223
+ <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"><span class="str"> async def extract_entities(text: str):</span>&nbsp;</span><span class="r"></span></p>
224
+ <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"><span class="str"> entities = await sample_structured(</span>&nbsp;</span><span class="r"></span></p>
225
+ <p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"><span class="str"> f"Extract entities from: {text}",</span>&nbsp;</span><span class="r"></span></p>
226
+ <p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"><span class="str"> format_instructions="Return as JSON with keys: persons, "</span>&nbsp;</span><span class="r"></span></p>
227
+ <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"><span class="str"> "organizations, locations",</span>&nbsp;</span><span class="r"></span></p>
228
+ <p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"><span class="str"> system_prompt="You are an expert at named entity recognition"</span>&nbsp;</span><span class="r"></span></p>
229
+ <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"><span class="str"> )</span>&nbsp;</span><span class="r"></span></p>
230
+ <p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"><span class="str"> return entities</span>&nbsp;</span><span class="r"></span></p>
231
+ <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"><span class="str"> ```</span>&nbsp;</span><span class="r"></span></p>
232
+ <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
233
+ <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="com"># Combine the format instructions with the messages</span>&nbsp;</span><span class="r"></span></p>
234
+ <p class="mis show_mis"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">messages</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
235
+ <p class="mis show_mis"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="nam">formatted_message</span> <span class="op">=</span> <span class="str">f"{messages}\n\n{format_instructions}"</span>&nbsp;</span><span class="r"></span></p>
236
+ <p class="pln"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
237
+ <p class="mis show_mis"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"> <span class="nam">formatted_message</span> <span class="op">=</span> <span class="nam">messages</span> <span class="op">+</span> <span class="op">[</span><span class="nam">format_instructions</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
238
+ <p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
239
+ <p class="mis show_mis"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="key">return</span> <span class="key">await</span> <span class="nam">sample</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
240
+ <p class="pln"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="nam">messages</span><span class="op">=</span><span class="nam">formatted_message</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
241
+ <p class="pln"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="nam">system_prompt</span><span class="op">=</span><span class="nam">system_prompt</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
242
+ <p class="pln"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="nam">temperature</span><span class="op">=</span><span class="nam">temperature</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
243
+ <p class="pln"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"> <span class="nam">max_tokens</span><span class="op">=</span><span class="nam">max_tokens</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
244
+ <p class="pln"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
245
+ <p class="pln"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
246
+ <p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
247
+ <p class="mis show_mis"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"><span class="key">async</span> <span class="key">def</span> <span class="nam">sample_with_context</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
248
+ <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"> <span class="nam">messages</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
249
+ <p class="pln"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"> <span class="nam">context_data</span><span class="op">:</span> <span class="nam">dict</span><span class="op">[</span><span class="nam">str</span><span class="op">,</span> <span class="nam">Any</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
250
+ <p class="pln"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"> <span class="nam">system_prompt</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
251
+ <p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"> <span class="op">**</span><span class="nam">kwargs</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
252
+ <p class="pln"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
253
+ <p class="pln"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"> <span class="str">"""Request an LLM completion with additional context data.</span>&nbsp;</span><span class="r"></span></p>
254
+ <p class="pln"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
255
+ <p class="pln"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"><span class="str"> This convenience function formats context data and includes it</span>&nbsp;</span><span class="r"></span></p>
256
+ <p class="pln"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"><span class="str"> in the sampling request.</span>&nbsp;</span><span class="r"></span></p>
257
+ <p class="pln"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
258
+ <p class="pln"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
259
+ <p class="pln"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"><span class="str"> messages: The message(s) to send to the LLM</span>&nbsp;</span><span class="r"></span></p>
260
+ <p class="pln"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t"><span class="str"> context_data: Dictionary of context data to include</span>&nbsp;</span><span class="r"></span></p>
261
+ <p class="pln"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t"><span class="str"> system_prompt: Optional system prompt</span>&nbsp;</span><span class="r"></span></p>
262
+ <p class="pln"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"><span class="str"> **kwargs: Additional arguments passed to sample()</span>&nbsp;</span><span class="r"></span></p>
263
+ <p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
264
+ <p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
265
+ <p class="pln"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"><span class="str"> The LLM response as a string</span>&nbsp;</span><span class="r"></span></p>
266
+ <p class="pln"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
267
+ <p class="pln"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"><span class="str"> Example:</span>&nbsp;</span><span class="r"></span></p>
268
+ <p class="pln"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"><span class="str"> ```python</span>&nbsp;</span><span class="r"></span></p>
269
+ <p class="pln"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"><span class="str"> from golf.utilities import sample_with_context</span>&nbsp;</span><span class="r"></span></p>
270
+ <p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
271
+ <p class="pln"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"><span class="str"> async def generate_report(topic: str, user_data: dict):</span>&nbsp;</span><span class="r"></span></p>
272
+ <p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t"><span class="str"> report = await sample_with_context(</span>&nbsp;</span><span class="r"></span></p>
273
+ <p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"><span class="str"> f"Generate a report about {topic}",</span>&nbsp;</span><span class="r"></span></p>
274
+ <p class="pln"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"><span class="str"> context_data={</span>&nbsp;</span><span class="r"></span></p>
275
+ <p class="pln"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"><span class="str"> "user_preferences": user_data,</span>&nbsp;</span><span class="r"></span></p>
276
+ <p class="pln"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"><span class="str"> "timestamp": "2024-01-01",</span>&nbsp;</span><span class="r"></span></p>
277
+ <p class="pln"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"><span class="str"> "format": "markdown"</span>&nbsp;</span><span class="r"></span></p>
278
+ <p class="pln"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"><span class="str"> },</span>&nbsp;</span><span class="r"></span></p>
279
+ <p class="pln"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"><span class="str"> system_prompt="You are a professional report writer"</span>&nbsp;</span><span class="r"></span></p>
280
+ <p class="pln"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"><span class="str"> )</span>&nbsp;</span><span class="r"></span></p>
281
+ <p class="pln"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t"><span class="str"> return report</span>&nbsp;</span><span class="r"></span></p>
282
+ <p class="pln"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t"><span class="str"> ```</span>&nbsp;</span><span class="r"></span></p>
283
+ <p class="pln"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
284
+ <p class="pln"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"> <span class="com"># Format context data as a readable string</span>&nbsp;</span><span class="r"></span></p>
285
+ <p class="mis show_mis"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"> <span class="nam">context_str</span> <span class="op">=</span> <span class="str">"\n"</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="op">[</span><span class="str">f"{k}: {v}"</span> <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">context_data</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
286
+ <p class="pln"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
287
+ <p class="pln"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"> <span class="com"># Add context to the message</span>&nbsp;</span><span class="r"></span></p>
288
+ <p class="mis show_mis"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">messages</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
289
+ <p class="mis show_mis"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="nam">contextual_message</span> <span class="op">=</span> <span class="str">f"{messages}\n\nContext:\n{context_str}"</span>&nbsp;</span><span class="r"></span></p>
290
+ <p class="pln"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
291
+ <p class="mis show_mis"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"> <span class="nam">contextual_message</span> <span class="op">=</span> <span class="nam">messages</span> <span class="op">+</span> <span class="op">[</span><span class="str">f"Context:\n{context_str}"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
292
+ <p class="pln"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
293
+ <p class="mis show_mis"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="key">return</span> <span class="key">await</span> <span class="nam">sample</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
294
+ <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"> <span class="nam">messages</span><span class="op">=</span><span class="nam">contextual_message</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
295
+ <p class="pln"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="nam">system_prompt</span><span class="op">=</span><span class="nam">system_prompt</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
296
+ <p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t"> <span class="op">**</span><span class="nam">kwargs</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
297
+ <p class="pln"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
298
+ <p class="pln"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
299
+ <p class="pln"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
300
+ <p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"><span class="com"># Apply instrumentation to all sampling functions</span>&nbsp;</span><span class="r"></span></p>
301
+ <p class="mis show_mis"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t"><span class="nam">sample</span> <span class="op">=</span> <span class="nam">instrument_sampling</span><span class="op">(</span><span class="nam">sample</span><span class="op">,</span> <span class="str">"sample"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
302
+ <p class="mis show_mis"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"><span class="nam">sample_structured</span> <span class="op">=</span> <span class="nam">instrument_sampling</span><span class="op">(</span><span class="nam">sample_structured</span><span class="op">,</span> <span class="str">"structured"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
303
+ <p class="mis show_mis"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"><span class="nam">sample_with_context</span> <span class="op">=</span> <span class="nam">instrument_sampling</span><span class="op">(</span><span class="nam">sample_with_context</span><span class="op">,</span> <span class="str">"context"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
304
+ </main>
305
+ <footer>
306
+ <div class="content">
307
+ <p>
308
+ <a class="nav" href="z_abe733142b40ad4e_elicitation_py.html">&#xab; prev</a> &nbsp; &nbsp;
309
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
310
+ <a class="nav" href="index.html">&#xbb; next</a>
311
+ &nbsp; &nbsp; &nbsp;
312
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.6.12">coverage.py v7.6.12</a>,
313
+ created at 2025-08-16 18:46 +0200
314
+ </p>
315
+ </div>
316
+ </footer>
317
+ </body>
318
+ </html>
@@ -12,15 +12,13 @@ async def welcome() -> list[dict]:
12
12
  "role": "system",
13
13
  "content": (
14
14
  "You are an assistant for the {{project_name}} application. "
15
- "You help users understand how to interact with this system and its capabilities."
15
+ "You help users understand how to interact with this system and "
16
+ "its capabilities."
16
17
  ),
17
18
  },
18
19
  {
19
20
  "role": "user",
20
- "content": (
21
- "Welcome to {{project_name}}! This is a project built with GolfMCP. "
22
- "How can I get started?"
23
- ),
21
+ "content": ("Welcome to {{project_name}}! This is a project built with GolfMCP. How can I get started?"),
24
22
  },
25
23
  ]
26
24
 
@@ -4,16 +4,13 @@ from datetime import datetime
4
4
  from typing import Any
5
5
 
6
6
  # The URI that clients will use to access this resource
7
- resource_uri = "system://time/{format}"
7
+ resource_uri = "system://time"
8
8
 
9
9
 
10
- async def current_time(format: str = "full") -> dict[str, Any]:
10
+ async def current_time() -> dict[str, Any]:
11
11
  """Provide the current time in various formats.
12
12
 
13
- This is a simple resource example that accepts a format parameter.
14
-
15
- Args:
16
- format: The format to return ('full', 'iso', 'unix' or 'rfc')
13
+ This is a simple resource example that returns time in all formats.
17
14
  """
18
15
  now = datetime.now()
19
16
 
@@ -29,13 +26,8 @@ async def current_time(format: str = "full") -> dict[str, Any]:
29
26
  },
30
27
  }
31
28
 
32
- # Return specific format or all formats
33
- if format == "full":
34
- return all_formats
35
- elif format in all_formats:
36
- return {format: all_formats[format]}
37
- else:
38
- return {"error": f"Unknown format: {format}"}
29
+ # Return all formats
30
+ return all_formats
39
31
 
40
32
 
41
33
  # Designate the entry point function
@@ -0,0 +1,46 @@
1
+ """Weather resource template example with URI parameters."""
2
+
3
+ from datetime import datetime
4
+ from typing import Any
5
+
6
+ from .common import weather_client
7
+
8
+ # The URI template that clients will use to access this resource
9
+ # The {city} parameter makes this a resource template
10
+ resource_uri = "weather://city/{city}"
11
+
12
+
13
+ async def get_weather_for_city(city: str) -> dict[str, Any]:
14
+ """Provide current weather for a specific city.
15
+
16
+ This example demonstrates:
17
+ 1. Resource templates with URI parameters ({city})
18
+ 2. Dynamic resource access based on parameters
19
+ 3. Using shared client from the common.py file
20
+ 4. FastMCP 2.11+ ResourceTemplate.from_function() usage
21
+
22
+ Args:
23
+ city: The city name to get weather for
24
+
25
+ Returns:
26
+ Weather data for the specified city
27
+ """
28
+ # Use the shared weather client from common.py
29
+ weather_data = await weather_client.get_current(city)
30
+
31
+ # Add some additional data
32
+ weather_data.update(
33
+ {
34
+ "city": city,
35
+ "time": datetime.now().isoformat(),
36
+ "source": "GolfMCP Weather API",
37
+ "unit": "fahrenheit",
38
+ "resource_type": "template",
39
+ }
40
+ )
41
+
42
+ return weather_data
43
+
44
+
45
+ # Designate the entry point function
46
+ export = get_weather_for_city