anthropic.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { writable } from 'svelte/store';
  2. import { browser } from '$app/environment'
  3. import { aiActivity } from '$lib/activities.js'
  4. import Anthropic from '@anthropic-ai/sdk';
  5. var client = null;
  6. var messages = [];
  7. export function setApiKey(key)
  8. {
  9. client = new Anthropic({apiKey: key, dangerouslyAllowBrowser: true});
  10. // Reset messages
  11. messages = []
  12. messageList.set(messages);
  13. localStorage.setItem("anthropic-api-key", key);
  14. apiState.set("READY");
  15. }
  16. function clearApiKey()
  17. {
  18. localStorage.removeItem("anthropic-api-key");
  19. apiState.set("KEY_REQUIRED");
  20. }
  21. function addMessageInternal(role, content)
  22. {
  23. messages.push({role: role, content: content});
  24. messageList.set(messages);
  25. }
  26. async function sendMessages(handleTool)
  27. {
  28. aiActivity.set(true);
  29. try
  30. {
  31. var tools = [
  32. { "type": "bash_20241022", "name": "bash" }
  33. ];
  34. const response = await client.beta.messages.create({max_tokens: 1024, messages: messages, model: 'claude-3-5-sonnet-20241022', tools: tools, betas: ["computer-use-2024-10-22"]});
  35. var content = response.content;
  36. // Be robust to multiple response
  37. for(var i=0;i<content.length;i++)
  38. {
  39. var c = content[i];
  40. if(c.type == "text")
  41. {
  42. addMessageInternal(response.role, c.text);
  43. }
  44. else if(c.type == "tool_use")
  45. {
  46. addMessageInternal(response.role, [c]);
  47. var commandResponse = await handleTool(c.input);
  48. addMessageInternal("user", [{type: "tool_result", tool_use_id: c.id, content: commandResponse}]);
  49. sendMessages(handleTool);
  50. }
  51. else
  52. {
  53. debugger;
  54. }
  55. }
  56. if(response.stop_reason == "end_turn")
  57. aiActivity.set(false);
  58. }
  59. catch(e)
  60. {
  61. if(e.status == 401)
  62. {
  63. addMessageInternal('error', 'Invalid API key');
  64. clearApiKey();
  65. }
  66. else
  67. {
  68. addMessageInternal('error', e.error.error.message);
  69. }
  70. }
  71. }
  72. export function addMessage(text, handleTool)
  73. {
  74. addMessageInternal('user', text);
  75. sendMessages(handleTool);
  76. }
  77. function initialize()
  78. {
  79. var savedApiKey = localStorage.getItem("anthropic-api-key");
  80. if(savedApiKey)
  81. setApiKey(savedApiKey);
  82. }
  83. export const apiState = writable("KEY_REQUIRED");
  84. export const messageList = writable(messages);
  85. if(browser)
  86. initialize();